@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
package/dist/utils/markdown.js
CHANGED
|
@@ -4,6 +4,213 @@ import chalk from "chalk";
|
|
|
4
4
|
import { EOL } from "os";
|
|
5
5
|
import { highlight, supportsLanguage } from "cli-highlight";
|
|
6
6
|
import { logError } from "./log.js";
|
|
7
|
+
import stringWidth from "string-width";
|
|
8
|
+
const ANSI_REGEX = /\x1b\[[0-9;]*[a-zA-Z]/g;
|
|
9
|
+
const EA_AMBIGUOUS_RANGES = [
|
|
10
|
+
[161, 161],
|
|
11
|
+
[164, 164],
|
|
12
|
+
[167, 168],
|
|
13
|
+
[170, 170],
|
|
14
|
+
[173, 174],
|
|
15
|
+
[176, 180],
|
|
16
|
+
[182, 186],
|
|
17
|
+
[188, 191],
|
|
18
|
+
[198, 198],
|
|
19
|
+
[208, 208],
|
|
20
|
+
[215, 216],
|
|
21
|
+
[222, 225],
|
|
22
|
+
[230, 230],
|
|
23
|
+
[232, 234],
|
|
24
|
+
[236, 237],
|
|
25
|
+
[240, 240],
|
|
26
|
+
[242, 243],
|
|
27
|
+
[247, 250],
|
|
28
|
+
[252, 252],
|
|
29
|
+
[254, 254],
|
|
30
|
+
[257, 257],
|
|
31
|
+
[273, 273],
|
|
32
|
+
[275, 275],
|
|
33
|
+
[283, 283],
|
|
34
|
+
[294, 295],
|
|
35
|
+
[299, 299],
|
|
36
|
+
[305, 307],
|
|
37
|
+
[312, 312],
|
|
38
|
+
[319, 322],
|
|
39
|
+
[324, 324],
|
|
40
|
+
[328, 331],
|
|
41
|
+
[333, 333],
|
|
42
|
+
[338, 339],
|
|
43
|
+
[358, 359],
|
|
44
|
+
[363, 363],
|
|
45
|
+
[462, 462],
|
|
46
|
+
[464, 464],
|
|
47
|
+
[466, 466],
|
|
48
|
+
[468, 468],
|
|
49
|
+
[470, 470],
|
|
50
|
+
[472, 472],
|
|
51
|
+
[474, 474],
|
|
52
|
+
[476, 476],
|
|
53
|
+
[593, 593],
|
|
54
|
+
[609, 609],
|
|
55
|
+
[708, 708],
|
|
56
|
+
[711, 711],
|
|
57
|
+
[713, 715],
|
|
58
|
+
[717, 717],
|
|
59
|
+
[720, 720],
|
|
60
|
+
[728, 731],
|
|
61
|
+
[733, 733],
|
|
62
|
+
[735, 735],
|
|
63
|
+
[913, 929],
|
|
64
|
+
[931, 937],
|
|
65
|
+
[945, 961],
|
|
66
|
+
[963, 969],
|
|
67
|
+
[1025, 1025],
|
|
68
|
+
[1040, 1103],
|
|
69
|
+
[1105, 1105],
|
|
70
|
+
[8208, 8208],
|
|
71
|
+
[8211, 8214],
|
|
72
|
+
[8216, 8217],
|
|
73
|
+
[8220, 8221],
|
|
74
|
+
[8224, 8226],
|
|
75
|
+
[8228, 8231],
|
|
76
|
+
[8240, 8240],
|
|
77
|
+
[8242, 8243],
|
|
78
|
+
[8245, 8245],
|
|
79
|
+
[8251, 8251],
|
|
80
|
+
[8254, 8254],
|
|
81
|
+
[8308, 8308],
|
|
82
|
+
[8319, 8319],
|
|
83
|
+
[8321, 8324],
|
|
84
|
+
[8364, 8364],
|
|
85
|
+
[8451, 8451],
|
|
86
|
+
[8453, 8453],
|
|
87
|
+
[8457, 8457],
|
|
88
|
+
[8467, 8467],
|
|
89
|
+
[8470, 8470],
|
|
90
|
+
[8481, 8482],
|
|
91
|
+
[8486, 8486],
|
|
92
|
+
[8491, 8491],
|
|
93
|
+
[8531, 8532],
|
|
94
|
+
[8539, 8542],
|
|
95
|
+
[8544, 8555],
|
|
96
|
+
[8560, 8569],
|
|
97
|
+
[8585, 8585],
|
|
98
|
+
[8592, 8601],
|
|
99
|
+
[8632, 8633],
|
|
100
|
+
[8658, 8658],
|
|
101
|
+
[8660, 8660],
|
|
102
|
+
[8679, 8679],
|
|
103
|
+
[8704, 8704],
|
|
104
|
+
[8706, 8707],
|
|
105
|
+
[8711, 8712],
|
|
106
|
+
[8715, 8715],
|
|
107
|
+
[8719, 8719],
|
|
108
|
+
[8721, 8721],
|
|
109
|
+
[8725, 8725],
|
|
110
|
+
[8730, 8730],
|
|
111
|
+
[8733, 8736],
|
|
112
|
+
[8739, 8739],
|
|
113
|
+
[8741, 8741],
|
|
114
|
+
[8743, 8748],
|
|
115
|
+
[8750, 8750],
|
|
116
|
+
[8756, 8759],
|
|
117
|
+
[8764, 8765],
|
|
118
|
+
[8776, 8776],
|
|
119
|
+
[8780, 8780],
|
|
120
|
+
[8786, 8786],
|
|
121
|
+
[8800, 8801],
|
|
122
|
+
[8804, 8807],
|
|
123
|
+
[8810, 8811],
|
|
124
|
+
[8814, 8815],
|
|
125
|
+
[8834, 8835],
|
|
126
|
+
[8838, 8839],
|
|
127
|
+
[8853, 8853],
|
|
128
|
+
[8857, 8857],
|
|
129
|
+
[8869, 8869],
|
|
130
|
+
[8895, 8895],
|
|
131
|
+
[8978, 8978],
|
|
132
|
+
[9312, 9449],
|
|
133
|
+
[9451, 9547],
|
|
134
|
+
[9552, 9587],
|
|
135
|
+
[9600, 9615],
|
|
136
|
+
[9618, 9621],
|
|
137
|
+
[9632, 9633],
|
|
138
|
+
[9635, 9641],
|
|
139
|
+
[9650, 9651],
|
|
140
|
+
[9654, 9655],
|
|
141
|
+
[9660, 9661],
|
|
142
|
+
[9664, 9665],
|
|
143
|
+
[9670, 9672],
|
|
144
|
+
[9675, 9675],
|
|
145
|
+
[9678, 9681],
|
|
146
|
+
[9698, 9701],
|
|
147
|
+
[9711, 9711],
|
|
148
|
+
[9733, 9734],
|
|
149
|
+
[9737, 9737],
|
|
150
|
+
[9742, 9743],
|
|
151
|
+
[9756, 9756],
|
|
152
|
+
[9758, 9758],
|
|
153
|
+
[9792, 9792],
|
|
154
|
+
[9794, 9794],
|
|
155
|
+
[9824, 9825],
|
|
156
|
+
[9827, 9829],
|
|
157
|
+
[9831, 9834],
|
|
158
|
+
[9836, 9837],
|
|
159
|
+
[9839, 9839],
|
|
160
|
+
[9886, 9887],
|
|
161
|
+
[9919, 9919],
|
|
162
|
+
[9926, 9933],
|
|
163
|
+
[9935, 9939],
|
|
164
|
+
[9941, 9953],
|
|
165
|
+
[9955, 9955],
|
|
166
|
+
[9960, 9961],
|
|
167
|
+
[9963, 9969],
|
|
168
|
+
[9972, 9972],
|
|
169
|
+
[9974, 9977],
|
|
170
|
+
[9979, 9980],
|
|
171
|
+
[9982, 9983],
|
|
172
|
+
[10102, 10131],
|
|
173
|
+
[65533, 65533]
|
|
174
|
+
];
|
|
175
|
+
function isEastAsianAmbiguous(cp) {
|
|
176
|
+
for (const [start, end] of EA_AMBIGUOUS_RANGES) {
|
|
177
|
+
if (cp < start) return false;
|
|
178
|
+
if (cp <= end) return true;
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
let _ambiguousIsWide = null;
|
|
183
|
+
function shouldTreatAmbiguousAsWide() {
|
|
184
|
+
if (_ambiguousIsWide !== null) return _ambiguousIsWide;
|
|
185
|
+
const cjkWidth = process.env.MINTO_CJK_WIDTH ?? process.env.VTE_CJK_WIDTH;
|
|
186
|
+
if (cjkWidth === "1" || cjkWidth === "wide") {
|
|
187
|
+
_ambiguousIsWide = true;
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
if (cjkWidth === "0" || cjkWidth === "narrow") {
|
|
191
|
+
_ambiguousIsWide = false;
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
const locale = process.env.LC_ALL || process.env.LC_CTYPE || process.env.LANG || "";
|
|
195
|
+
_ambiguousIsWide = /^(zh|ja|ko)/i.test(locale);
|
|
196
|
+
return _ambiguousIsWide;
|
|
197
|
+
}
|
|
198
|
+
function terminalStringWidth(text) {
|
|
199
|
+
let width = stringWidth(text);
|
|
200
|
+
if (!shouldTreatAmbiguousAsWide()) return width;
|
|
201
|
+
const stripped = text.replace(ANSI_REGEX, "");
|
|
202
|
+
const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
203
|
+
for (const { segment } of segmenter.segment(stripped)) {
|
|
204
|
+
const codePoints = [...segment];
|
|
205
|
+
if (codePoints.length === 1) {
|
|
206
|
+
const cp = codePoints[0].codePointAt(0);
|
|
207
|
+
if (isEastAsianAmbiguous(cp)) {
|
|
208
|
+
width += 1;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return width;
|
|
213
|
+
}
|
|
7
214
|
function stripMarkdownCodeBlockWrapper(content) {
|
|
8
215
|
const trimmed = content.trim();
|
|
9
216
|
const codeBlockRegex = /^```(?:markdown|md)?\s*\n([\s\S]*?)\n```$/;
|
|
@@ -91,36 +298,47 @@ function format(token, listDepth = 0, orderedListNumber = null, parent = null) {
|
|
|
91
298
|
const colCount = headerTexts.length;
|
|
92
299
|
const colWidths = [];
|
|
93
300
|
for (let c = 0; c < colCount; c++) {
|
|
94
|
-
let maxWidth =
|
|
301
|
+
let maxWidth = terminalStringWidth(headerTexts[c] ?? "");
|
|
95
302
|
for (const row of rowTexts) {
|
|
96
|
-
maxWidth = Math.max(maxWidth,
|
|
303
|
+
maxWidth = Math.max(maxWidth, terminalStringWidth(row[c] ?? ""));
|
|
97
304
|
}
|
|
98
305
|
colWidths.push(Math.max(maxWidth, 3));
|
|
99
306
|
}
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
307
|
+
const B = {
|
|
308
|
+
tl: "\u250C",
|
|
309
|
+
t: "\u2500",
|
|
310
|
+
tc: "\u252C",
|
|
311
|
+
tr: "\u2510",
|
|
312
|
+
v: "\u2502",
|
|
313
|
+
ml: "\u251C",
|
|
314
|
+
mc: "\u253C",
|
|
315
|
+
mr: "\u2524",
|
|
316
|
+
bl: "\u2514",
|
|
317
|
+
bc: "\u2534",
|
|
318
|
+
br: "\u2518"
|
|
319
|
+
};
|
|
320
|
+
const horizontalLine = (left, mid, right) => left + colWidths.map((w) => B.t.repeat(w + 2)).join(mid) + right;
|
|
321
|
+
const topBorder = chalk.dim(horizontalLine(B.tl, B.tc, B.tr));
|
|
322
|
+
const headerRow = chalk.dim(B.v) + headerTexts.map(
|
|
323
|
+
(text, i) => " " + chalk.bold(padCell(text, colWidths[i], token.align[i])) + " "
|
|
324
|
+
).join(chalk.dim(B.v)) + chalk.dim(B.v);
|
|
325
|
+
const midSeparator = chalk.dim(horizontalLine(B.ml, B.mc, B.mr));
|
|
110
326
|
const dataRows = rowTexts.map(
|
|
111
|
-
(row) =>
|
|
327
|
+
(row) => chalk.dim(B.v) + row.map(
|
|
328
|
+
(text, i) => " " + padCell(text, colWidths[i], token.align[i]) + " "
|
|
329
|
+
).join(chalk.dim(B.v)) + chalk.dim(B.v)
|
|
112
330
|
);
|
|
113
|
-
|
|
331
|
+
const bottomBorder = chalk.dim(horizontalLine(B.bl, B.bc, B.br));
|
|
332
|
+
return [topBorder, headerRow, midSeparator, ...dataRows, bottomBorder].join(
|
|
333
|
+
EOL
|
|
334
|
+
) + EOL;
|
|
114
335
|
}
|
|
115
336
|
}
|
|
116
337
|
return "";
|
|
117
338
|
}
|
|
118
|
-
function stripAnsi(str) {
|
|
119
|
-
return str.replace(/\x1B\[[0-9;]*m/g, "");
|
|
120
|
-
}
|
|
121
339
|
function padCell(text, width, align) {
|
|
122
|
-
const
|
|
123
|
-
const padding = Math.max(0, width -
|
|
340
|
+
const visibleWidth = terminalStringWidth(text);
|
|
341
|
+
const padding = Math.max(0, width - visibleWidth);
|
|
124
342
|
if (align === "right") return " ".repeat(padding) + text;
|
|
125
343
|
if (align === "center") {
|
|
126
344
|
const left = Math.floor(padding / 2);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/markdown.ts"],
|
|
4
|
-
"sourcesContent": ["import { marked, Token } from 'marked'\nimport { stripSystemMessages } from './messages'\nimport chalk from 'chalk'\nimport { EOL } from 'os'\nimport { highlight, supportsLanguage } from 'cli-highlight'\nimport { logError } from './log'\n\n/**\n * Strip outer markdown code block wrapper if present.\n * AI models sometimes wrap their response in ```markdown ... ``` which\n * causes the content to be parsed as a code block instead of actual markdown.\n */\nfunction stripMarkdownCodeBlockWrapper(content: string): string {\n const trimmed = content.trim()\n // Match ```markdown or ```md at the start and ``` at the end\n const codeBlockRegex = /^```(?:markdown|md)?\\s*\\n([\\s\\S]*?)\\n```$/\n const match = trimmed.match(codeBlockRegex)\n if (match) {\n return match[1] ?? trimmed\n }\n return content\n}\n\nexport function applyMarkdown(content: string): string {\n // Pre-process: remove outer markdown code block wrapper if present\n const preprocessed = stripMarkdownCodeBlockWrapper(\n stripSystemMessages(content),\n )\n return marked\n .lexer(preprocessed)\n .map(_ => format(_))\n .join('')\n .trim()\n}\n\nfunction format(\n token: Token,\n listDepth = 0,\n orderedListNumber: number | null = null,\n parent: Token | null = null,\n): string {\n switch (token.type) {\n case 'blockquote':\n return chalk.dim.italic((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'code':\n if (token.lang && supportsLanguage(token.lang)) {\n return highlight(token.text, { language: token.lang }) + EOL\n } else {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${token.lang}`,\n )\n return highlight(token.text, { language: 'markdown' }) + EOL\n }\n case 'codespan':\n // inline code\n return chalk.blue(token.text)\n case 'em':\n return chalk.italic((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'strong':\n return chalk.bold((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'heading':\n switch (token.depth) {\n case 1: // h1\n return (\n chalk.bold.italic.underline(\n (token.tokens ?? []).map(_ => format(_)).join(''),\n ) +\n EOL +\n EOL\n )\n case 2: // h2\n return (\n chalk.bold((token.tokens ?? []).map(_ => format(_)).join('')) +\n EOL +\n EOL\n )\n default: // h3+\n return (\n chalk.bold.dim((token.tokens ?? []).map(_ => format(_)).join('')) +\n EOL +\n EOL\n )\n }\n case 'hr':\n return '---'\n case 'image':\n return `[Image: ${token.title}: ${token.href}]`\n case 'link':\n return chalk.blue(token.href)\n case 'list': {\n return token.items\n .map((_: Token, index: number) =>\n format(\n _,\n listDepth,\n token.ordered ? token.start + index : null,\n token,\n ),\n )\n .join('')\n }\n case 'list_item':\n return (token.tokens ?? [])\n .map(\n _ =>\n `${' '.repeat(listDepth)}${format(_, listDepth + 1, orderedListNumber, token)}`,\n )\n .join('')\n case 'paragraph':\n return (token.tokens ?? []).map(_ => format(_)).join('') + EOL\n case 'space':\n return EOL\n case 'text':\n if (parent?.type === 'list_item') {\n return `${orderedListNumber === null ? '-' : getListNumber(listDepth, orderedListNumber) + '.'} ${token.tokens ? token.tokens.map(_ => format(_, listDepth, orderedListNumber, token)).join('') : token.text}${EOL}`\n } else {\n return token.text\n }\n case 'table': {\n // Render each cell's inline tokens to get display text\n const headerTexts = (token.header as any[]).map((cell: any) =>\n (cell.tokens ?? []).map((_: Token) => format(_)).join(''),\n )\n const rowTexts = (token.rows as any[][]).map((row: any[]) =>\n row.map((cell: any) =>\n (cell.tokens ?? []).map((_: Token) => format(_)).join(''),\n ),\n )\n\n // Calculate column widths (max of header and all rows)\n const colCount = headerTexts.length\n const colWidths: number[] = []\n for (let c = 0; c < colCount; c++) {\n let maxWidth = stripAnsi(headerTexts[c] ?? '').length\n for (const row of rowTexts) {\n maxWidth = Math.max(maxWidth, stripAnsi(row[c] ?? '').length)\n }\n colWidths.push(Math.max(maxWidth, 3)) // minimum 3 chars\n }\n\n // Build header row\n const headerRow = headerTexts\n .map((text, i) =>\n chalk.bold(padCell(text, colWidths[i]!, token.align[i])),\n )\n .join(' | ')\n\n // Build separator\n const separator = colWidths\n .map((w, i) => {\n const align = token.align[i]\n if (align === 'center') return ':' + '-'.repeat(w - 2) + ':'\n if (align === 'right') return '-'.repeat(w - 1) + ':'\n if (align === 'left') return ':' + '-'.repeat(w - 1)\n return '-'.repeat(w)\n })\n .join(' | ')\n\n // Build data rows\n const dataRows = rowTexts.map(row =>\n row\n .map((text, i) => padCell(text, colWidths[i]!, token.align[i]))\n .join(' | '),\n )\n\n return [headerRow, separator, ...dataRows].join(EOL) + EOL\n }\n }\n return ''\n}\n\n/**\n * Strip ANSI escape codes for accurate width calculation\n */\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1B\\[[0-9;]*m/g, '')\n}\n\n/**\n * Pad a cell to a target width, respecting alignment and ANSI codes\n */\nfunction padCell(\n text: string,\n width: number,\n align: 'center' | 'left' | 'right' | null,\n): string {\n const visibleLength = stripAnsi(text).length\n const padding = Math.max(0, width - visibleLength)\n if (align === 'right') return ' '.repeat(padding) + text\n if (align === 'center') {\n const left = Math.floor(padding / 2)\n const right = padding - left\n return ' '.repeat(left) + text + ' '.repeat(right)\n }\n // left or null (default left)\n return text + ' '.repeat(padding)\n}\n\nconst DEPTH_1_LIST_NUMBERS = [\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'f',\n 'g',\n 'h',\n 'i',\n 'j',\n 'k',\n 'l',\n 'm',\n 'n',\n 'o',\n 'p',\n 'q',\n 'r',\n 's',\n 't',\n 'u',\n 'v',\n 'w',\n 'x',\n 'y',\n 'z',\n 'aa',\n 'ab',\n 'ac',\n 'ad',\n 'ae',\n 'af',\n 'ag',\n 'ah',\n 'ai',\n 'aj',\n 'ak',\n 'al',\n 'am',\n 'an',\n 'ao',\n 'ap',\n 'aq',\n 'ar',\n 'as',\n 'at',\n 'au',\n 'av',\n 'aw',\n 'ax',\n 'ay',\n 'az',\n]\nconst DEPTH_2_LIST_NUMBERS = [\n 'i',\n 'ii',\n 'iii',\n 'iv',\n 'v',\n 'vi',\n 'vii',\n 'viii',\n 'ix',\n 'x',\n 'xi',\n 'xii',\n 'xiii',\n 'xiv',\n 'xv',\n 'xvi',\n 'xvii',\n 'xviii',\n 'xix',\n 'xx',\n 'xxi',\n 'xxii',\n 'xxiii',\n 'xxiv',\n 'xxv',\n 'xxvi',\n 'xxvii',\n 'xxviii',\n 'xxix',\n 'xxx',\n 'xxxi',\n 'xxxii',\n 'xxxiii',\n 'xxxiv',\n 'xxxv',\n 'xxxvi',\n 'xxxvii',\n 'xxxviii',\n 'xxxix',\n 'xl',\n]\n\nfunction getListNumber(listDepth: number, orderedListNumber: number): string {\n switch (listDepth) {\n case 0:\n case 1:\n return orderedListNumber.toString()\n case 2:\n return DEPTH_1_LIST_NUMBERS[orderedListNumber - 1]! // TODO: don't hard code the list\n case 3:\n return DEPTH_2_LIST_NUMBERS[orderedListNumber - 1]! // TODO: don't hard code the list\n default:\n return orderedListNumber.toString()\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { marked, Token } from 'marked'\nimport { stripSystemMessages } from './messages'\nimport chalk from 'chalk'\nimport { EOL } from 'os'\nimport { highlight, supportsLanguage } from 'cli-highlight'\nimport { logError } from './log'\nimport stringWidth from 'string-width'\n\n// ANSI escape code regex (covers SGR sequences produced by chalk)\nconst ANSI_REGEX = /\\x1b\\[[0-9;]*[a-zA-Z]/g\n\n/**\n * East Asian Ambiguous character ranges (Unicode 15.0 subset).\n * These characters render as 2 columns in CJK terminals with\n * \"treat ambiguous-width characters as double-width\" enabled.\n * Sorted by start code point for binary search.\n */\nconst EA_AMBIGUOUS_RANGES: [number, number][] = [\n [0x00a1, 0x00a1],\n [0x00a4, 0x00a4],\n [0x00a7, 0x00a8],\n [0x00aa, 0x00aa],\n [0x00ad, 0x00ae],\n [0x00b0, 0x00b4],\n [0x00b6, 0x00ba],\n [0x00bc, 0x00bf],\n [0x00c6, 0x00c6],\n [0x00d0, 0x00d0],\n [0x00d7, 0x00d8],\n [0x00de, 0x00e1],\n [0x00e6, 0x00e6],\n [0x00e8, 0x00ea],\n [0x00ec, 0x00ed],\n [0x00f0, 0x00f0],\n [0x00f2, 0x00f3],\n [0x00f7, 0x00fa],\n [0x00fc, 0x00fc],\n [0x00fe, 0x00fe],\n [0x0101, 0x0101],\n [0x0111, 0x0111],\n [0x0113, 0x0113],\n [0x011b, 0x011b],\n [0x0126, 0x0127],\n [0x012b, 0x012b],\n [0x0131, 0x0133],\n [0x0138, 0x0138],\n [0x013f, 0x0142],\n [0x0144, 0x0144],\n [0x0148, 0x014b],\n [0x014d, 0x014d],\n [0x0152, 0x0153],\n [0x0166, 0x0167],\n [0x016b, 0x016b],\n [0x01ce, 0x01ce],\n [0x01d0, 0x01d0],\n [0x01d2, 0x01d2],\n [0x01d4, 0x01d4],\n [0x01d6, 0x01d6],\n [0x01d8, 0x01d8],\n [0x01da, 0x01da],\n [0x01dc, 0x01dc],\n [0x0251, 0x0251],\n [0x0261, 0x0261],\n [0x02c4, 0x02c4],\n [0x02c7, 0x02c7],\n [0x02c9, 0x02cb],\n [0x02cd, 0x02cd],\n [0x02d0, 0x02d0],\n [0x02d8, 0x02db],\n [0x02dd, 0x02dd],\n [0x02df, 0x02df],\n [0x0391, 0x03a1],\n [0x03a3, 0x03a9],\n [0x03b1, 0x03c1],\n [0x03c3, 0x03c9],\n [0x0401, 0x0401],\n [0x0410, 0x044f],\n [0x0451, 0x0451],\n [0x2010, 0x2010],\n [0x2013, 0x2016],\n [0x2018, 0x2019],\n [0x201c, 0x201d],\n [0x2020, 0x2022],\n [0x2024, 0x2027],\n [0x2030, 0x2030],\n [0x2032, 0x2033],\n [0x2035, 0x2035],\n [0x203b, 0x203b],\n [0x203e, 0x203e],\n [0x2074, 0x2074],\n [0x207f, 0x207f],\n [0x2081, 0x2084],\n [0x20ac, 0x20ac],\n [0x2103, 0x2103],\n [0x2105, 0x2105],\n [0x2109, 0x2109],\n [0x2113, 0x2113],\n [0x2116, 0x2116],\n [0x2121, 0x2122],\n [0x2126, 0x2126],\n [0x212b, 0x212b],\n [0x2153, 0x2154],\n [0x215b, 0x215e],\n [0x2160, 0x216b],\n [0x2170, 0x2179],\n [0x2189, 0x2189],\n [0x2190, 0x2199],\n [0x21b8, 0x21b9],\n [0x21d2, 0x21d2],\n [0x21d4, 0x21d4],\n [0x21e7, 0x21e7],\n [0x2200, 0x2200],\n [0x2202, 0x2203],\n [0x2207, 0x2208],\n [0x220b, 0x220b],\n [0x220f, 0x220f],\n [0x2211, 0x2211],\n [0x2215, 0x2215],\n [0x221a, 0x221a],\n [0x221d, 0x2220],\n [0x2223, 0x2223],\n [0x2225, 0x2225],\n [0x2227, 0x222c],\n [0x222e, 0x222e],\n [0x2234, 0x2237],\n [0x223c, 0x223d],\n [0x2248, 0x2248],\n [0x224c, 0x224c],\n [0x2252, 0x2252],\n [0x2260, 0x2261],\n [0x2264, 0x2267],\n [0x226a, 0x226b],\n [0x226e, 0x226f],\n [0x2282, 0x2283],\n [0x2286, 0x2287],\n [0x2295, 0x2295],\n [0x2299, 0x2299],\n [0x22a5, 0x22a5],\n [0x22bf, 0x22bf],\n [0x2312, 0x2312],\n [0x2460, 0x24e9],\n [0x24eb, 0x254b],\n [0x2550, 0x2573],\n [0x2580, 0x258f],\n [0x2592, 0x2595],\n [0x25a0, 0x25a1],\n [0x25a3, 0x25a9],\n [0x25b2, 0x25b3],\n [0x25b6, 0x25b7],\n [0x25bc, 0x25bd],\n [0x25c0, 0x25c1],\n [0x25c6, 0x25c8],\n [0x25cb, 0x25cb],\n [0x25ce, 0x25d1],\n [0x25e2, 0x25e5],\n [0x25ef, 0x25ef],\n [0x2605, 0x2606],\n [0x2609, 0x2609],\n [0x260e, 0x260f],\n [0x261c, 0x261c],\n [0x261e, 0x261e],\n [0x2640, 0x2640],\n [0x2642, 0x2642],\n [0x2660, 0x2661],\n [0x2663, 0x2665],\n [0x2667, 0x266a],\n [0x266c, 0x266d],\n [0x266f, 0x266f],\n [0x269e, 0x269f],\n [0x26bf, 0x26bf],\n [0x26c6, 0x26cd],\n [0x26cf, 0x26d3],\n [0x26d5, 0x26e1],\n [0x26e3, 0x26e3],\n [0x26e8, 0x26e9],\n [0x26eb, 0x26f1],\n [0x26f4, 0x26f4],\n [0x26f6, 0x26f9],\n [0x26fb, 0x26fc],\n [0x26fe, 0x26ff],\n [0x2776, 0x2793],\n [0xfffd, 0xfffd],\n]\n\nfunction isEastAsianAmbiguous(cp: number): boolean {\n for (const [start, end] of EA_AMBIGUOUS_RANGES) {\n if (cp < start) return false // ranges are sorted\n if (cp <= end) return true\n }\n return false\n}\n\n// Cached locale detection result\nlet _ambiguousIsWide: boolean | null = null\n\n/**\n * Detect whether the terminal treats EA Ambiguous characters as double-width.\n * Common in CJK terminal configurations (iTerm2, Terminal.app with CJK settings).\n */\nfunction shouldTreatAmbiguousAsWide(): boolean {\n if (_ambiguousIsWide !== null) return _ambiguousIsWide\n\n // Explicit override via env var\n const cjkWidth = process.env.MINTO_CJK_WIDTH ?? process.env.VTE_CJK_WIDTH\n if (cjkWidth === '1' || cjkWidth === 'wide') {\n _ambiguousIsWide = true\n return true\n }\n if (cjkWidth === '0' || cjkWidth === 'narrow') {\n _ambiguousIsWide = false\n return false\n }\n\n // Auto-detect from locale\n const locale =\n process.env.LC_ALL || process.env.LC_CTYPE || process.env.LANG || ''\n _ambiguousIsWide = /^(zh|ja|ko)/i.test(locale)\n return _ambiguousIsWide\n}\n\n/**\n * Calculate terminal-accurate string width for table rendering.\n *\n * Fixes known issues with string-width v4:\n * - Uses Intl.Segmenter for proper grapheme cluster handling (emoji+VS16 = 1 cluster)\n * - Adjusts for EA Ambiguous characters in CJK terminal contexts (e.g. \u2103 = width 2)\n *\n * Only single-codepoint graphemes get the EA Ambiguous adjustment;\n * multi-codepoint graphemes (emoji sequences) are already width 2 via string-width's emoji-regex.\n */\nfunction terminalStringWidth(text: string): number {\n let width = stringWidth(text)\n\n if (!shouldTreatAmbiguousAsWide()) return width\n\n // Adjust for EA Ambiguous characters rendered as double-width in CJK terminals.\n // Use grapheme segmentation to avoid double-counting emoji sequences\n // (e.g., \u2600\uFE0F = U+2600+U+FE0F is one grapheme, already width 2 from emoji-regex).\n const stripped = text.replace(ANSI_REGEX, '')\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' })\n\n for (const { segment } of segmenter.segment(stripped)) {\n const codePoints = [...segment]\n // Only adjust single-codepoint graphemes; multi-codepoint = emoji, already handled\n if (codePoints.length === 1) {\n const cp = codePoints[0]!.codePointAt(0)!\n if (isEastAsianAmbiguous(cp)) {\n width += 1 // string-width counted 1, terminal renders 2\n }\n }\n }\n\n return width\n}\n\n/**\n * Strip outer markdown code block wrapper if present.\n * AI models sometimes wrap their response in ```markdown ... ``` which\n * causes the content to be parsed as a code block instead of actual markdown.\n */\nfunction stripMarkdownCodeBlockWrapper(content: string): string {\n const trimmed = content.trim()\n // Match ```markdown or ```md at the start and ``` at the end\n const codeBlockRegex = /^```(?:markdown|md)?\\s*\\n([\\s\\S]*?)\\n```$/\n const match = trimmed.match(codeBlockRegex)\n if (match) {\n return match[1] ?? trimmed\n }\n return content\n}\n\nexport function applyMarkdown(content: string): string {\n // Pre-process: remove outer markdown code block wrapper if present\n const preprocessed = stripMarkdownCodeBlockWrapper(\n stripSystemMessages(content),\n )\n return marked\n .lexer(preprocessed)\n .map(_ => format(_))\n .join('')\n .trim()\n}\n\nfunction format(\n token: Token,\n listDepth = 0,\n orderedListNumber: number | null = null,\n parent: Token | null = null,\n): string {\n switch (token.type) {\n case 'blockquote':\n return chalk.dim.italic((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'code':\n if (token.lang && supportsLanguage(token.lang)) {\n return highlight(token.text, { language: token.lang }) + EOL\n } else {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${token.lang}`,\n )\n return highlight(token.text, { language: 'markdown' }) + EOL\n }\n case 'codespan':\n // inline code\n return chalk.blue(token.text)\n case 'em':\n return chalk.italic((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'strong':\n return chalk.bold((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'heading':\n switch (token.depth) {\n case 1: // h1\n return (\n chalk.bold.italic.underline(\n (token.tokens ?? []).map(_ => format(_)).join(''),\n ) +\n EOL +\n EOL\n )\n case 2: // h2\n return (\n chalk.bold((token.tokens ?? []).map(_ => format(_)).join('')) +\n EOL +\n EOL\n )\n default: // h3+\n return (\n chalk.bold.dim((token.tokens ?? []).map(_ => format(_)).join('')) +\n EOL +\n EOL\n )\n }\n case 'hr':\n return '---'\n case 'image':\n return `[Image: ${token.title}: ${token.href}]`\n case 'link':\n return chalk.blue(token.href)\n case 'list': {\n return token.items\n .map((_: Token, index: number) =>\n format(\n _,\n listDepth,\n token.ordered ? token.start + index : null,\n token,\n ),\n )\n .join('')\n }\n case 'list_item':\n return (token.tokens ?? [])\n .map(\n _ =>\n `${' '.repeat(listDepth)}${format(_, listDepth + 1, orderedListNumber, token)}`,\n )\n .join('')\n case 'paragraph':\n return (token.tokens ?? []).map(_ => format(_)).join('') + EOL\n case 'space':\n return EOL\n case 'text':\n if (parent?.type === 'list_item') {\n return `${orderedListNumber === null ? '-' : getListNumber(listDepth, orderedListNumber) + '.'} ${token.tokens ? token.tokens.map(_ => format(_, listDepth, orderedListNumber, token)).join('') : token.text}${EOL}`\n } else {\n return token.text\n }\n case 'table': {\n // Render each cell's inline tokens to get display text\n const headerTexts = (token.header as any[]).map((cell: any) =>\n (cell.tokens ?? []).map((_: Token) => format(_)).join(''),\n )\n const rowTexts = (token.rows as any[][]).map((row: any[]) =>\n row.map((cell: any) =>\n (cell.tokens ?? []).map((_: Token) => format(_)).join(''),\n ),\n )\n\n // Calculate column widths using terminal-aware width calculation\n // (handles CJK full-width chars, emoji, EA Ambiguous, ANSI codes)\n const colCount = headerTexts.length\n const colWidths: number[] = []\n for (let c = 0; c < colCount; c++) {\n let maxWidth = terminalStringWidth(headerTexts[c] ?? '')\n for (const row of rowTexts) {\n maxWidth = Math.max(maxWidth, terminalStringWidth(row[c] ?? ''))\n }\n colWidths.push(Math.max(maxWidth, 3)) // minimum 3 columns\n }\n\n // Box-drawing characters\n const B = {\n tl: '\u250C',\n t: '\u2500',\n tc: '\u252C',\n tr: '\u2510',\n v: '\u2502',\n ml: '\u251C',\n mc: '\u253C',\n mr: '\u2524',\n bl: '\u2514',\n bc: '\u2534',\n br: '\u2518',\n }\n\n const horizontalLine = (left: string, mid: string, right: string) =>\n left + colWidths.map(w => B.t.repeat(w + 2)).join(mid) + right\n\n // Build top border\n const topBorder = chalk.dim(horizontalLine(B.tl, B.tc, B.tr))\n\n // Build header row\n const headerRow =\n chalk.dim(B.v) +\n headerTexts\n .map(\n (text, i) =>\n ' ' +\n chalk.bold(padCell(text, colWidths[i]!, token.align[i])) +\n ' ',\n )\n .join(chalk.dim(B.v)) +\n chalk.dim(B.v)\n\n // Build middle separator\n const midSeparator = chalk.dim(horizontalLine(B.ml, B.mc, B.mr))\n\n // Build data rows\n const dataRows = rowTexts.map(\n row =>\n chalk.dim(B.v) +\n row\n .map(\n (text, i) =>\n ' ' + padCell(text, colWidths[i]!, token.align[i]) + ' ',\n )\n .join(chalk.dim(B.v)) +\n chalk.dim(B.v),\n )\n\n // Build bottom border\n const bottomBorder = chalk.dim(horizontalLine(B.bl, B.bc, B.br))\n\n return (\n [topBorder, headerRow, midSeparator, ...dataRows, bottomBorder].join(\n EOL,\n ) + EOL\n )\n }\n }\n return ''\n}\n\n/**\n * Pad a cell to a target width, respecting alignment, ANSI codes,\n * full-width characters (CJK, emoji), and EA Ambiguous characters\n */\nfunction padCell(\n text: string,\n width: number,\n align: 'center' | 'left' | 'right' | null,\n): string {\n const visibleWidth = terminalStringWidth(text)\n const padding = Math.max(0, width - visibleWidth)\n if (align === 'right') return ' '.repeat(padding) + text\n if (align === 'center') {\n const left = Math.floor(padding / 2)\n const right = padding - left\n return ' '.repeat(left) + text + ' '.repeat(right)\n }\n // left or null (default left)\n return text + ' '.repeat(padding)\n}\n\nconst DEPTH_1_LIST_NUMBERS = [\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'f',\n 'g',\n 'h',\n 'i',\n 'j',\n 'k',\n 'l',\n 'm',\n 'n',\n 'o',\n 'p',\n 'q',\n 'r',\n 's',\n 't',\n 'u',\n 'v',\n 'w',\n 'x',\n 'y',\n 'z',\n 'aa',\n 'ab',\n 'ac',\n 'ad',\n 'ae',\n 'af',\n 'ag',\n 'ah',\n 'ai',\n 'aj',\n 'ak',\n 'al',\n 'am',\n 'an',\n 'ao',\n 'ap',\n 'aq',\n 'ar',\n 'as',\n 'at',\n 'au',\n 'av',\n 'aw',\n 'ax',\n 'ay',\n 'az',\n]\nconst DEPTH_2_LIST_NUMBERS = [\n 'i',\n 'ii',\n 'iii',\n 'iv',\n 'v',\n 'vi',\n 'vii',\n 'viii',\n 'ix',\n 'x',\n 'xi',\n 'xii',\n 'xiii',\n 'xiv',\n 'xv',\n 'xvi',\n 'xvii',\n 'xviii',\n 'xix',\n 'xx',\n 'xxi',\n 'xxii',\n 'xxiii',\n 'xxiv',\n 'xxv',\n 'xxvi',\n 'xxvii',\n 'xxviii',\n 'xxix',\n 'xxx',\n 'xxxi',\n 'xxxii',\n 'xxxiii',\n 'xxxiv',\n 'xxxv',\n 'xxxvi',\n 'xxxvii',\n 'xxxviii',\n 'xxxix',\n 'xl',\n]\n\nfunction getListNumber(listDepth: number, orderedListNumber: number): string {\n switch (listDepth) {\n case 0:\n case 1:\n return orderedListNumber.toString()\n case 2:\n return DEPTH_1_LIST_NUMBERS[orderedListNumber - 1]! // TODO: don't hard code the list\n case 3:\n return DEPTH_2_LIST_NUMBERS[orderedListNumber - 1]! // TODO: don't hard code the list\n default:\n return orderedListNumber.toString()\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,cAAqB;AAC9B,SAAS,2BAA2B;AACpC,OAAO,WAAW;AAClB,SAAS,WAAW;AACpB,SAAS,WAAW,wBAAwB;AAC5C,SAAS,gBAAgB;AACzB,OAAO,iBAAiB;AAGxB,MAAM,aAAa;AAQnB,MAAM,sBAA0C;AAAA,EAC9C,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,KAAQ,GAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA,EACf,CAAC,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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -53,9 +53,13 @@ class MessageContextManager {
|
|
|
53
53
|
(msg) => !importantMessages.some((imp) => this.messagesEqual(imp, msg))
|
|
54
54
|
)
|
|
55
55
|
];
|
|
56
|
+
const indexMap = /* @__PURE__ */ new Map();
|
|
57
|
+
for (let i = 0; i < messages.length; i++) {
|
|
58
|
+
indexMap.set(messages[i], i);
|
|
59
|
+
}
|
|
56
60
|
const truncatedMessages = combinedMessages.sort((a, b) => {
|
|
57
|
-
const aIndex =
|
|
58
|
-
const bIndex =
|
|
61
|
+
const aIndex = indexMap.get(a) ?? 0;
|
|
62
|
+
const bIndex = indexMap.get(b) ?? 0;
|
|
59
63
|
return aIndex - bIndex;
|
|
60
64
|
});
|
|
61
65
|
const removedCount = messages.length - truncatedMessages.length;
|
|
@@ -82,7 +86,7 @@ class MessageContextManager {
|
|
|
82
86
|
content: [
|
|
83
87
|
{
|
|
84
88
|
type: "text",
|
|
85
|
-
text: `[CONVERSATION SUMMARY - ${olderMessages.length} messages compressed]
|
|
89
|
+
text: `[SYNTHETIC CONVERSATION SUMMARY - ${olderMessages.length} messages compressed by context manager, not a real assistant response]
|
|
86
90
|
|
|
87
91
|
${summary}
|
|
88
92
|
|
|
@@ -92,7 +96,8 @@ ${summary}
|
|
|
92
96
|
},
|
|
93
97
|
costUSD: 0,
|
|
94
98
|
durationMs: 0,
|
|
95
|
-
uuid: crypto.randomUUID()
|
|
99
|
+
uuid: crypto.randomUUID(),
|
|
100
|
+
isSynthetic: true
|
|
96
101
|
};
|
|
97
102
|
const truncatedMessages = [summaryMessage, ...recentMessages];
|
|
98
103
|
return {
|
|
@@ -104,9 +109,16 @@ ${summary}
|
|
|
104
109
|
};
|
|
105
110
|
}
|
|
106
111
|
/**
|
|
107
|
-
* Strategy 4:
|
|
112
|
+
* Strategy 4: auto_compact — not yet implemented.
|
|
113
|
+
* Falls back to preserve_recent with a warning.
|
|
114
|
+
* @deprecated Use 'preserve_recent' or 'smart_compression' instead.
|
|
108
115
|
*/
|
|
109
116
|
async autoCompactStrategy(messages, strategy) {
|
|
117
|
+
if (typeof process !== "undefined" && process.env.DEBUG) {
|
|
118
|
+
console.warn(
|
|
119
|
+
"[MessageContextManager] auto_compact strategy is not implemented, falling back to preserve_recent"
|
|
120
|
+
);
|
|
121
|
+
}
|
|
110
122
|
return this.preserveRecentMessages(messages, strategy);
|
|
111
123
|
}
|
|
112
124
|
/**
|
|
@@ -134,6 +146,7 @@ ${summary}
|
|
|
134
146
|
* Helper: Check if two messages are equal
|
|
135
147
|
*/
|
|
136
148
|
messagesEqual(a, b) {
|
|
149
|
+
if ("uuid" in a && "uuid" in b && a.uuid && b.uuid) return a.uuid === b.uuid;
|
|
137
150
|
return JSON.stringify(a) === JSON.stringify(b);
|
|
138
151
|
}
|
|
139
152
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/messageContextManager.ts"],
|
|
4
|
-
"sourcesContent": ["import { Message } from '@query'\nimport type { UUID } from '@minto-types/common'\nimport { countTokens } from './tokens'\nimport crypto from 'crypto'\n\nexport interface MessageRetentionStrategy {\n type:\n | 'preserve_recent'\n | 'preserve_important'\n | 'smart_compression'\n | 'auto_compact'\n maxTokens: number\n preserveCount?: number\n importanceThreshold?: number\n}\n\nexport interface MessageTruncationResult {\n truncatedMessages: Message[]\n removedCount: number\n preservedTokens: number\n strategy: string\n summary?: string\n}\n\n/**\n * Smart message truncation for context-limited models\n * Implements multiple strategies for preserving important conversation content\n */\nexport class MessageContextManager {\n /**\n * Truncate messages intelligently based on strategy and token limit\n */\n async truncateMessages(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): Promise<MessageTruncationResult> {\n switch (strategy.type) {\n case 'preserve_recent':\n return this.preserveRecentMessages(messages, strategy)\n case 'preserve_important':\n return this.preserveImportantMessages(messages, strategy)\n case 'smart_compression':\n return this.smartCompressionStrategy(messages, strategy)\n case 'auto_compact':\n return this.autoCompactStrategy(messages, strategy)\n default:\n return this.preserveRecentMessages(messages, strategy)\n }\n }\n\n /**\n * Strategy 1: Preserve most recent messages\n */\n private preserveRecentMessages(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): MessageTruncationResult {\n const preserveCount =\n strategy.preserveCount || this.estimateMessageCount(strategy.maxTokens)\n const truncatedMessages = messages.slice(-preserveCount)\n const removedCount = messages.length - truncatedMessages.length\n\n return {\n truncatedMessages,\n removedCount,\n preservedTokens: countTokens(truncatedMessages),\n strategy: `Preserved last ${preserveCount} messages`,\n summary:\n removedCount > 0\n ? `Removed ${removedCount} older messages to fit context window`\n : 'No messages removed',\n }\n }\n\n /**\n * Strategy 2: Preserve important messages (errors, user queries, recent context)\n */\n private preserveImportantMessages(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): MessageTruncationResult {\n const importantMessages: Message[] = []\n const recentMessages: Message[] = []\n\n // Always preserve the last few messages for context continuity\n const recentCount = Math.min(5, messages.length)\n recentMessages.push(...messages.slice(-recentCount))\n\n // Identify important messages (errors, tool failures, user decisions)\n for (let i = 0; i < messages.length - recentCount; i++) {\n const message = messages[i]\n if (this.isImportantMessage(message)) {\n importantMessages.push(message)\n }\n }\n\n // Combine and deduplicate\n const combinedMessages = [\n ...importantMessages,\n ...recentMessages.filter(\n msg => !importantMessages.some(imp => this.messagesEqual(imp, msg)),\n ),\n ]\n\n // Sort by original order\n const truncatedMessages = combinedMessages.sort((a, b) => {\n const aIndex = messages.indexOf(a)\n const bIndex = messages.indexOf(b)\n return aIndex - bIndex\n })\n\n const removedCount = messages.length - truncatedMessages.length\n\n return {\n truncatedMessages,\n removedCount,\n preservedTokens: countTokens(truncatedMessages),\n strategy: `Preserved ${importantMessages.length} important + ${recentMessages.length} recent messages`,\n summary: `Kept critical errors, user decisions, and recent context (${removedCount} messages archived)`,\n }\n }\n\n /**\n * Strategy 3: Smart compression with summary\n */\n private async smartCompressionStrategy(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): Promise<MessageTruncationResult> {\n const recentCount = Math.min(10, Math.floor(messages.length * 0.3))\n const recentMessages = messages.slice(-recentCount)\n const olderMessages = messages.slice(0, -recentCount)\n\n // Create a summary of older messages\n const summary = this.createMessagesSummary(olderMessages)\n\n // Create a summary message\n const summaryMessage: Message = {\n type: 'assistant',\n message: {\n role: 'assistant',\n content: [\n {\n type: 'text',\n text: `[CONVERSATION SUMMARY - ${olderMessages.length} messages compressed]\\n\\n${summary}\\n\\n[END SUMMARY - Recent context follows...]`,\n },\n ],\n },\n costUSD: 0,\n durationMs: 0,\n uuid: crypto.randomUUID() as UUID,\n }\n\n const truncatedMessages = [summaryMessage, ...recentMessages]\n\n return {\n truncatedMessages,\n removedCount: olderMessages.length,\n preservedTokens: countTokens(truncatedMessages),\n strategy: `Compressed ${olderMessages.length} messages + preserved ${recentCount} recent`,\n summary: `Created intelligent summary of conversation history`,\n }\n }\n\n /**\n * Strategy 4: Use existing auto-compact mechanism\n */\n private async autoCompactStrategy(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): Promise<MessageTruncationResult> {\n // This would integrate with the existing autoCompactCore.ts\n // For now, fallback to preserve_recent\n return this.preserveRecentMessages(messages, strategy)\n }\n\n /**\n * Helper: Estimate how many messages fit in token budget\n */\n private estimateMessageCount(maxTokens: number): number {\n const avgTokensPerMessage = 150 // Conservative estimate\n return Math.max(3, Math.floor(maxTokens / avgTokensPerMessage))\n }\n\n /**\n * Helper: Determine if a message is important\n */\n private isImportantMessage(message: Message): boolean {\n if (message.type === 'user') return true // User messages are always important\n\n if (message.type === 'assistant') {\n const content = message.message.content\n if (Array.isArray(content)) {\n const textContent = content\n .filter(c => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n .toLowerCase()\n\n // Mark as important if contains error keywords\n return (\n textContent.includes('error') ||\n textContent.includes('failed') ||\n textContent.includes('warning') ||\n textContent.includes('critical') ||\n textContent.includes('issue')\n )\n }\n }\n\n return false\n }\n\n /**\n * Helper: Check if two messages are equal\n */\n private messagesEqual(a: Message, b: Message): boolean {\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n /**\n * Helper: Create summary of message sequence\n */\n private createMessagesSummary(messages: Message[]): string {\n const userMessages = messages.filter(m => m.type === 'user').length\n const assistantMessages = messages.filter(\n m => m.type === 'assistant',\n ).length\n const toolUses = messages.filter(\n m =>\n m.type === 'assistant' &&\n Array.isArray(m.message.content) &&\n m.message.content.some(c => c.type === 'tool_use'),\n ).length\n\n const topics: string[] = []\n\n // Extract key topics from user messages\n messages.forEach(msg => {\n if (msg.type === 'user' && Array.isArray(msg.message.content)) {\n const text = msg.message.content\n .filter(c => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n\n // Simple keyword extraction (could be enhanced with NLP)\n if (text.includes('error') || text.includes('bug'))\n topics.push('debugging')\n if (text.includes('implement') || text.includes('create'))\n topics.push('implementation')\n if (text.includes('explain') || text.includes('understand'))\n topics.push('explanation')\n if (text.includes('fix') || text.includes('solve'))\n topics.push('problem-solving')\n }\n })\n\n const uniqueTopics = [...new Set(topics)]\n\n return `Previous conversation included ${userMessages} user messages and ${assistantMessages} assistant responses, with ${toolUses} tool invocations. Key topics: ${uniqueTopics.join(', ') || 'general discussion'}.`\n }\n}\n\n/**\n * Factory function to create appropriate retention strategy\n */\nexport function createRetentionStrategy(\n targetContextLength: number,\n currentTokens: number,\n userPreference: 'aggressive' | 'balanced' | 'conservative' = 'balanced',\n): MessageRetentionStrategy {\n const maxTokens = Math.floor(targetContextLength * 0.7) // Leave room for new conversation\n\n switch (userPreference) {\n case 'aggressive':\n return {\n type: 'preserve_recent',\n maxTokens,\n preserveCount: Math.max(3, Math.floor(maxTokens / 200)),\n }\n case 'conservative':\n return {\n type: 'smart_compression',\n maxTokens,\n }\n case 'balanced':\n default:\n return {\n type: 'preserve_important',\n maxTokens,\n preserveCount: Math.max(5, Math.floor(maxTokens / 150)),\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "AAEA,SAAS,mBAAmB;AAC5B,OAAO,YAAY;AAyBZ,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAIjC,MAAM,iBACJ,UACA,UACkC;AAClC,YAAQ,SAAS,MAAM;AAAA,MACrB,KAAK;AACH,eAAO,KAAK,uBAAuB,UAAU,QAAQ;AAAA,MACvD,KAAK;AACH,eAAO,KAAK,0BAA0B,UAAU,QAAQ;AAAA,MAC1D,KAAK;AACH,eAAO,KAAK,yBAAyB,UAAU,QAAQ;AAAA,MACzD,KAAK;AACH,eAAO,KAAK,oBAAoB,UAAU,QAAQ;AAAA,MACpD;AACE,eAAO,KAAK,uBAAuB,UAAU,QAAQ;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBACN,UACA,UACyB;AACzB,UAAM,gBACJ,SAAS,iBAAiB,KAAK,qBAAqB,SAAS,SAAS;AACxE,UAAM,oBAAoB,SAAS,MAAM,CAAC,aAAa;AACvD,UAAM,eAAe,SAAS,SAAS,kBAAkB;AAEzD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,iBAAiB,YAAY,iBAAiB;AAAA,MAC9C,UAAU,kBAAkB,aAAa;AAAA,MACzC,SACE,eAAe,IACX,WAAW,YAAY,0CACvB;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,0BACN,UACA,UACyB;AACzB,UAAM,oBAA+B,CAAC;AACtC,UAAM,iBAA4B,CAAC;AAGnC,UAAM,cAAc,KAAK,IAAI,GAAG,SAAS,MAAM;AAC/C,mBAAe,KAAK,GAAG,SAAS,MAAM,CAAC,WAAW,CAAC;AAGnD,aAAS,IAAI,GAAG,IAAI,SAAS,SAAS,aAAa,KAAK;AACtD,YAAM,UAAU,SAAS,CAAC;AAC1B,UAAI,KAAK,mBAAmB,OAAO,GAAG;AACpC,0BAAkB,KAAK,OAAO;AAAA,MAChC;AAAA,IACF;AAGA,UAAM,mBAAmB;AAAA,MACvB,GAAG;AAAA,MACH,GAAG,eAAe;AAAA,QAChB,SAAO,CAAC,kBAAkB,KAAK,SAAO,KAAK,cAAc,KAAK,GAAG,CAAC;AAAA,MACpE;AAAA,IACF;
|
|
4
|
+
"sourcesContent": ["import { Message } from '@query'\nimport type { UUID } from '@minto-types/common'\nimport { countTokens } from './tokens'\nimport crypto from 'crypto'\n\nexport interface MessageRetentionStrategy {\n type:\n | 'preserve_recent'\n | 'preserve_important'\n | 'smart_compression'\n | 'auto_compact'\n maxTokens: number\n preserveCount?: number\n importanceThreshold?: number\n}\n\nexport interface MessageTruncationResult {\n truncatedMessages: Message[]\n removedCount: number\n preservedTokens: number\n strategy: string\n summary?: string\n}\n\n/**\n * Smart message truncation for context-limited models\n * Implements multiple strategies for preserving important conversation content\n */\nexport class MessageContextManager {\n /**\n * Truncate messages intelligently based on strategy and token limit\n */\n async truncateMessages(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): Promise<MessageTruncationResult> {\n switch (strategy.type) {\n case 'preserve_recent':\n return this.preserveRecentMessages(messages, strategy)\n case 'preserve_important':\n return this.preserveImportantMessages(messages, strategy)\n case 'smart_compression':\n return this.smartCompressionStrategy(messages, strategy)\n case 'auto_compact':\n return this.autoCompactStrategy(messages, strategy)\n default:\n return this.preserveRecentMessages(messages, strategy)\n }\n }\n\n /**\n * Strategy 1: Preserve most recent messages\n */\n private preserveRecentMessages(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): MessageTruncationResult {\n const preserveCount =\n strategy.preserveCount || this.estimateMessageCount(strategy.maxTokens)\n const truncatedMessages = messages.slice(-preserveCount)\n const removedCount = messages.length - truncatedMessages.length\n\n return {\n truncatedMessages,\n removedCount,\n preservedTokens: countTokens(truncatedMessages),\n strategy: `Preserved last ${preserveCount} messages`,\n summary:\n removedCount > 0\n ? `Removed ${removedCount} older messages to fit context window`\n : 'No messages removed',\n }\n }\n\n /**\n * Strategy 2: Preserve important messages (errors, user queries, recent context)\n */\n private preserveImportantMessages(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): MessageTruncationResult {\n const importantMessages: Message[] = []\n const recentMessages: Message[] = []\n\n // Always preserve the last few messages for context continuity\n const recentCount = Math.min(5, messages.length)\n recentMessages.push(...messages.slice(-recentCount))\n\n // Identify important messages (errors, tool failures, user decisions)\n for (let i = 0; i < messages.length - recentCount; i++) {\n const message = messages[i]\n if (this.isImportantMessage(message)) {\n importantMessages.push(message)\n }\n }\n\n // Combine and deduplicate\n const combinedMessages = [\n ...importantMessages,\n ...recentMessages.filter(\n msg => !importantMessages.some(imp => this.messagesEqual(imp, msg)),\n ),\n ]\n\n // Sort by original order \u2014 use a pre-built index map for O(1) lookups\n // instead of Array.indexOf which is O(n) per comparison\n const indexMap = new Map<Message, number>()\n for (let i = 0; i < messages.length; i++) {\n indexMap.set(messages[i]!, i)\n }\n const truncatedMessages = combinedMessages.sort((a, b) => {\n const aIndex = indexMap.get(a) ?? 0\n const bIndex = indexMap.get(b) ?? 0\n return aIndex - bIndex\n })\n\n const removedCount = messages.length - truncatedMessages.length\n\n return {\n truncatedMessages,\n removedCount,\n preservedTokens: countTokens(truncatedMessages),\n strategy: `Preserved ${importantMessages.length} important + ${recentMessages.length} recent messages`,\n summary: `Kept critical errors, user decisions, and recent context (${removedCount} messages archived)`,\n }\n }\n\n /**\n * Strategy 3: Smart compression with summary\n */\n private async smartCompressionStrategy(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): Promise<MessageTruncationResult> {\n const recentCount = Math.min(10, Math.floor(messages.length * 0.3))\n const recentMessages = messages.slice(-recentCount)\n const olderMessages = messages.slice(0, -recentCount)\n\n // Create a summary of older messages\n const summary = this.createMessagesSummary(olderMessages)\n\n // Create a synthetic summary message (not a real assistant response)\n const summaryMessage: Message = {\n type: 'assistant',\n message: {\n role: 'assistant',\n content: [\n {\n type: 'text',\n text: `[SYNTHETIC CONVERSATION SUMMARY - ${olderMessages.length} messages compressed by context manager, not a real assistant response]\\n\\n${summary}\\n\\n[END SUMMARY - Recent context follows...]`,\n },\n ],\n },\n costUSD: 0,\n durationMs: 0,\n uuid: crypto.randomUUID() as UUID,\n isSynthetic: true,\n }\n\n const truncatedMessages = [summaryMessage, ...recentMessages]\n\n return {\n truncatedMessages,\n removedCount: olderMessages.length,\n preservedTokens: countTokens(truncatedMessages),\n strategy: `Compressed ${olderMessages.length} messages + preserved ${recentCount} recent`,\n summary: `Created intelligent summary of conversation history`,\n }\n }\n\n /**\n * Strategy 4: auto_compact \u2014 not yet implemented.\n * Falls back to preserve_recent with a warning.\n * @deprecated Use 'preserve_recent' or 'smart_compression' instead.\n */\n private async autoCompactStrategy(\n messages: Message[],\n strategy: MessageRetentionStrategy,\n ): Promise<MessageTruncationResult> {\n // auto_compact is not yet implemented \u2014 log warning and fallback\n if (typeof process !== 'undefined' && process.env.DEBUG) {\n console.warn(\n '[MessageContextManager] auto_compact strategy is not implemented, falling back to preserve_recent',\n )\n }\n return this.preserveRecentMessages(messages, strategy)\n }\n\n /**\n * Helper: Estimate how many messages fit in token budget\n */\n private estimateMessageCount(maxTokens: number): number {\n const avgTokensPerMessage = 150 // Conservative estimate\n return Math.max(3, Math.floor(maxTokens / avgTokensPerMessage))\n }\n\n /**\n * Helper: Determine if a message is important\n */\n private isImportantMessage(message: Message): boolean {\n if (message.type === 'user') return true // User messages are always important\n\n if (message.type === 'assistant') {\n const content = message.message.content\n if (Array.isArray(content)) {\n const textContent = content\n .filter(c => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n .toLowerCase()\n\n // Mark as important if contains error keywords\n return (\n textContent.includes('error') ||\n textContent.includes('failed') ||\n textContent.includes('warning') ||\n textContent.includes('critical') ||\n textContent.includes('issue')\n )\n }\n }\n\n return false\n }\n\n /**\n * Helper: Check if two messages are equal\n */\n private messagesEqual(a: Message, b: Message): boolean {\n if ('uuid' in a && 'uuid' in b && a.uuid && b.uuid) return a.uuid === b.uuid\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n /**\n * Helper: Create summary of message sequence\n */\n private createMessagesSummary(messages: Message[]): string {\n const userMessages = messages.filter(m => m.type === 'user').length\n const assistantMessages = messages.filter(\n m => m.type === 'assistant',\n ).length\n const toolUses = messages.filter(\n m =>\n m.type === 'assistant' &&\n Array.isArray(m.message.content) &&\n m.message.content.some(c => c.type === 'tool_use'),\n ).length\n\n const topics: string[] = []\n\n // Extract key topics from user messages\n messages.forEach(msg => {\n if (msg.type === 'user' && Array.isArray(msg.message.content)) {\n const text = msg.message.content\n .filter(c => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n\n // Simple keyword extraction (could be enhanced with NLP)\n if (text.includes('error') || text.includes('bug'))\n topics.push('debugging')\n if (text.includes('implement') || text.includes('create'))\n topics.push('implementation')\n if (text.includes('explain') || text.includes('understand'))\n topics.push('explanation')\n if (text.includes('fix') || text.includes('solve'))\n topics.push('problem-solving')\n }\n })\n\n const uniqueTopics = [...new Set(topics)]\n\n return `Previous conversation included ${userMessages} user messages and ${assistantMessages} assistant responses, with ${toolUses} tool invocations. Key topics: ${uniqueTopics.join(', ') || 'general discussion'}.`\n }\n}\n\n/**\n * Factory function to create appropriate retention strategy\n */\nexport function createRetentionStrategy(\n targetContextLength: number,\n currentTokens: number,\n userPreference: 'aggressive' | 'balanced' | 'conservative' = 'balanced',\n): MessageRetentionStrategy {\n const maxTokens = Math.floor(targetContextLength * 0.7) // Leave room for new conversation\n\n switch (userPreference) {\n case 'aggressive':\n return {\n type: 'preserve_recent',\n maxTokens,\n preserveCount: Math.max(3, Math.floor(maxTokens / 200)),\n }\n case 'conservative':\n return {\n type: 'smart_compression',\n maxTokens,\n }\n case 'balanced':\n default:\n return {\n type: 'preserve_important',\n maxTokens,\n preserveCount: Math.max(5, Math.floor(maxTokens / 150)),\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -147,7 +147,7 @@ class MessageGroupManager {
|
|
|
147
147
|
const content = message.message.content;
|
|
148
148
|
if (!content || !Array.isArray(content)) continue;
|
|
149
149
|
for (const block of content) {
|
|
150
|
-
if (block.type === "tool_use" && block.name === "Task") {
|
|
150
|
+
if (block.type === "tool_use" && (block.name === "Agent" || block.name === "Task")) {
|
|
151
151
|
if (unresolvedToolUseIDs.has(block.id)) {
|
|
152
152
|
unresolvedIds.push(block.id);
|
|
153
153
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/messageGroupManager.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * V1+ Message Group Manager\n *\n * Unified manager combining V1's generality with V3's concrete solutions:\n * 1. Plugin-based type handlers for extensibility\n * 2. Unified recursive state computation\n * 3. Position anchoring mechanism\n */\n\nimport type { NormalizedMessage } from '@utils/messages'\nimport type {\n MessageGroup,\n MessageGroupType,\n IdentifiedGroup,\n PositionAnchor,\n ResolutionState,\n} from '@minto-types/messageGroup'\nimport type { GroupTypeHandler } from './groupHandlers/types'\nimport { TaskGroupHandler } from './groupHandlers/taskHandler'\nimport { ParallelTasksHandler } from './groupHandlers/parallelTasksHandler'\nimport { getAgentIdByToolUseId, getAgentTranscript } from './agentTranscripts'\n\n/**\n * V1+ Message Group Manager\n *\n * Features:\n * 1. Plugin-based type handlers\n * 2. Unified recursive state computation\n * 3. Position anchoring mechanism\n */\nexport class MessageGroupManager {\n private groups: Map<string, MessageGroup> = new Map()\n private toolUseToGroup: Map<string, string> = new Map()\n private messageToGroup: Map<string, string> = new Map()\n private typeHandlers: Map<MessageGroupType, GroupTypeHandler> = new Map()\n private messageIndexMap: Map<string, number> = new Map()\n private idCounter = 0\n\n constructor() {\n // Register built-in type handlers\n this.registerHandler(new TaskGroupHandler())\n this.registerHandler(new ParallelTasksHandler())\n }\n\n /**\n * Register a group type handler (supports custom extensions)\n */\n registerHandler(handler: GroupTypeHandler): void {\n this.typeHandlers.set(handler.type, handler)\n }\n\n /**\n * Identify all groups from message list\n */\n identifyGroups(messages: NormalizedMessage[]): void {\n this.reset()\n\n // Build message index map for sorting\n messages.forEach((msg, idx) => {\n this.messageIndexMap.set(msg.uuid, idx)\n })\n\n // Process in dependency order: parallel-tasks first (to exclude from task handler)\n // Then task handler for remaining single tasks\n const processingOrder: MessageGroupType[] = ['parallel-tasks', 'task']\n\n // Track UUIDs that are part of parallel groups\n const parallelGroupUuids = new Set<string>()\n\n for (const type of processingOrder) {\n const handler = this.typeHandlers.get(type)\n if (!handler) continue\n\n const identified = handler.identify(messages)\n\n for (const identifiedGroup of identified) {\n // For task groups, skip if the message is already in a parallel group\n if (type === 'task') {\n const msgUuid = identifiedGroup.messageUuids[0]\n if (parallelGroupUuids.has(msgUuid)) {\n continue\n }\n }\n\n // Track parallel group UUIDs\n if (type === 'parallel-tasks') {\n for (const uuid of identifiedGroup.messageUuids) {\n parallelGroupUuids.add(uuid)\n }\n }\n\n this.createGroup(identifiedGroup, handler, messages)\n }\n }\n }\n\n /**\n * Create a group and compute initial state\n */\n private createGroup(\n identified: IdentifiedGroup,\n handler: GroupTypeHandler,\n messages: NormalizedMessage[],\n ): MessageGroup {\n const groupId = this.generateGroupId(identified.type)\n\n const group: MessageGroup = {\n id: groupId,\n type: identified.type,\n childIds: identified.childIds || [],\n messageUuids: identified.messageUuids,\n status: 'pending',\n metadata: identified.metadata,\n // V1+ new fields: will be computed\n anchor: { anchorMessageUuid: '', anchorStrategy: 'first' },\n resolution: {\n isSelfResolved: false,\n isNestedResolved: true,\n isFullyResolved: false,\n unresolvedToolUseIds: [],\n },\n }\n\n // Compute anchor\n group.anchor = handler.computeAnchor(group, messages)\n\n // Register mappings\n this.groups.set(group.id, group)\n for (const uuid of group.messageUuids) {\n this.messageToGroup.set(uuid, group.id)\n }\n if (identified.metadata.toolUseId) {\n this.toolUseToGroup.set(identified.metadata.toolUseId, group.id)\n }\n // Also register sibling tool use IDs for parallel groups\n if (identified.metadata.siblingToolUseIds) {\n for (const toolUseId of identified.metadata.siblingToolUseIds) {\n this.toolUseToGroup.set(toolUseId, group.id)\n }\n }\n\n return group\n }\n\n /**\n * Update resolution states for all groups\n * This is the generalized version of V3's nested checking\n */\n updateResolutionStates(\n unresolvedToolUseIDs: Set<string>,\n inProgressToolUseIDs: Set<string>,\n ): void {\n // First pass: update all groups' resolution using their handlers\n for (const group of this.groups.values()) {\n const handler = this.typeHandlers.get(group.type)\n if (handler) {\n group.resolution = handler.computeResolution(\n group,\n unresolvedToolUseIDs,\n )\n }\n }\n\n // Second pass: for parallel groups, aggregate child resolutions\n for (const group of this.groups.values()) {\n if (group.type === 'parallel-tasks') {\n this.updateParallelGroupResolution(group, unresolvedToolUseIDs)\n }\n }\n\n // Third pass: update status based on resolution\n for (const group of this.groups.values()) {\n group.status = this.computeGroupStatus(group, inProgressToolUseIDs)\n }\n }\n\n /**\n * Update parallel group resolution by checking all member tasks\n */\n private updateParallelGroupResolution(\n group: MessageGroup,\n unresolvedToolUseIDs: Set<string>,\n ): void {\n const memberIds = (group.metadata.siblingToolUseIds as string[]) || []\n\n // Check each member's nested resolution\n let allNestedResolved = true\n const allUnresolvedIds: string[] = [\n ...group.resolution.unresolvedToolUseIds,\n ]\n\n for (const toolUseId of memberIds) {\n const agentId = getAgentIdByToolUseId(toolUseId)\n if (agentId) {\n const nestedResult = this.checkNestedTasksResolution(\n agentId,\n unresolvedToolUseIDs,\n )\n if (nestedResult.hasUnresolved) {\n allNestedResolved = false\n allUnresolvedIds.push(...nestedResult.unresolvedIds)\n }\n }\n }\n\n group.resolution.isNestedResolved = allNestedResolved\n group.resolution.isFullyResolved =\n group.resolution.isSelfResolved && allNestedResolved\n group.resolution.unresolvedToolUseIds = allUnresolvedIds\n }\n\n /**\n * Recursively check if all nested tasks are resolved\n */\n private checkNestedTasksResolution(\n agentId: string,\n unresolvedToolUseIDs: Set<string>,\n ): { hasUnresolved: boolean; unresolvedIds: string[] } {\n const transcript = getAgentTranscript(agentId)\n if (!transcript) {\n return { hasUnresolved: false, unresolvedIds: [] }\n }\n\n const unresolvedIds: string[] = []\n\n for (const message of transcript.messages) {\n if (message.type === 'assistant') {\n const content = message.message.content\n if (!content || !Array.isArray(content)) continue\n\n for (const block of content) {\n if (block.type === 'tool_use' && block.name === 'Task') {\n if (unresolvedToolUseIDs.has(block.id)) {\n unresolvedIds.push(block.id)\n }\n\n const nestedAgentId = getAgentIdByToolUseId(block.id)\n if (nestedAgentId) {\n const nested = this.checkNestedTasksResolution(\n nestedAgentId,\n unresolvedToolUseIDs,\n )\n unresolvedIds.push(...nested.unresolvedIds)\n }\n }\n }\n }\n }\n\n return {\n hasUnresolved: unresolvedIds.length > 0,\n unresolvedIds,\n }\n }\n\n /**\n * Check if a group should be rendered as Static\n * V1+ core: only fully resolved groups can be Static\n */\n shouldGroupBeStatic(group: MessageGroup): boolean {\n return group.resolution.isFullyResolved\n }\n\n /**\n * Get ordered root groups (groups without parent)\n * Sorted by anchor message position\n */\n getOrderedRootGroups(): MessageGroup[] {\n const roots = Array.from(this.groups.values()).filter(g => !g.parentId)\n return roots.sort((a, b) => {\n const aIndex = this.messageIndexMap.get(a.anchor.anchorMessageUuid) ?? 0\n const bIndex = this.messageIndexMap.get(b.anchor.anchorMessageUuid) ?? 0\n return aIndex - bIndex\n })\n }\n\n /**\n * Get all tool use IDs associated with a group\n */\n getGroupToolUseIds(group: MessageGroup): string[] {\n const ids: string[] = []\n if (group.metadata.toolUseId) {\n ids.push(group.metadata.toolUseId)\n }\n if (group.metadata.siblingToolUseIds) {\n ids.push(...group.metadata.siblingToolUseIds)\n }\n return ids\n }\n\n /**\n * Compute group status based on resolution and progress\n *\n * IMPORTANT: For parallel tasks, we must check inProgressToolUseIDs BEFORE\n * checking isFullyResolved, because tool uses may still be running even if\n * they haven't received results yet. The resolution check only tells us if\n * tool_results exist, not if agents are still running.\n */\n private computeGroupStatus(\n group: MessageGroup,\n inProgressToolUseIDs: Set<string>,\n ): 'pending' | 'running' | 'completed' | 'failed' {\n const toolUseIds = this.getGroupToolUseIds(group)\n\n // Check running status FIRST - if any toolUseId is in progress, the group is running\n // This is critical for parallel tasks where agents may still be running\n if (toolUseIds.some(id => inProgressToolUseIDs.has(id))) {\n return 'running'\n }\n\n // Only after confirming nothing is running, check resolution\n if (group.resolution.isFullyResolved) {\n return 'completed'\n }\n\n return 'pending'\n }\n\n private generateGroupId(type: MessageGroupType): string {\n this.idCounter++\n return `${type}-${Date.now()}-${this.idCounter}`\n }\n\n reset(): void {\n this.groups.clear()\n this.toolUseToGroup.clear()\n this.messageToGroup.clear()\n this.messageIndexMap.clear()\n this.idCounter = 0\n }\n\n getGroup(id: string): MessageGroup | undefined {\n return this.groups.get(id)\n }\n\n getGroupByToolUseId(toolUseId: string): MessageGroup | undefined {\n const groupId = this.toolUseToGroup.get(toolUseId)\n return groupId ? this.groups.get(groupId) : undefined\n }\n\n getGroupByMessageUuid(uuid: string): MessageGroup | undefined {\n const groupId = this.messageToGroup.get(uuid)\n return groupId ? this.groups.get(groupId) : undefined\n }\n\n getAllGroups(): MessageGroup[] {\n return Array.from(this.groups.values())\n }\n\n /**\n * Check if a toolUseId is the anchor of its group\n */\n isGroupAnchor(toolUseId: string): boolean {\n const group = this.getGroupByToolUseId(toolUseId)\n if (!group) return false\n\n // For parallel groups, check if this is the first sibling\n if (group.type === 'parallel-tasks') {\n const siblings = group.metadata.siblingToolUseIds as string[] | undefined\n return siblings?.[0] === toolUseId\n }\n\n // For single task groups, the toolUseId is always the anchor\n return group.metadata.toolUseId === toolUseId\n }\n}\n\n// Singleton instance for global access\nlet globalManager: MessageGroupManager | null = null\n\nexport function getMessageGroupManager(): MessageGroupManager {\n if (!globalManager) {\n globalManager = new MessageGroupManager()\n }\n return globalManager\n}\n\nexport function resetMessageGroupManager(): void {\n globalManager = null\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * V1+ Message Group Manager\n *\n * Unified manager combining V1's generality with V3's concrete solutions:\n * 1. Plugin-based type handlers for extensibility\n * 2. Unified recursive state computation\n * 3. Position anchoring mechanism\n */\n\nimport type { NormalizedMessage } from '@utils/messages'\nimport type {\n MessageGroup,\n MessageGroupType,\n IdentifiedGroup,\n PositionAnchor,\n ResolutionState,\n} from '@minto-types/messageGroup'\nimport type { GroupTypeHandler } from './groupHandlers/types'\nimport { TaskGroupHandler } from './groupHandlers/taskHandler'\nimport { ParallelTasksHandler } from './groupHandlers/parallelTasksHandler'\nimport { getAgentIdByToolUseId, getAgentTranscript } from './agentTranscripts'\n\n/**\n * V1+ Message Group Manager\n *\n * Features:\n * 1. Plugin-based type handlers\n * 2. Unified recursive state computation\n * 3. Position anchoring mechanism\n */\nexport class MessageGroupManager {\n private groups: Map<string, MessageGroup> = new Map()\n private toolUseToGroup: Map<string, string> = new Map()\n private messageToGroup: Map<string, string> = new Map()\n private typeHandlers: Map<MessageGroupType, GroupTypeHandler> = new Map()\n private messageIndexMap: Map<string, number> = new Map()\n private idCounter = 0\n\n constructor() {\n // Register built-in type handlers\n this.registerHandler(new TaskGroupHandler())\n this.registerHandler(new ParallelTasksHandler())\n }\n\n /**\n * Register a group type handler (supports custom extensions)\n */\n registerHandler(handler: GroupTypeHandler): void {\n this.typeHandlers.set(handler.type, handler)\n }\n\n /**\n * Identify all groups from message list\n */\n identifyGroups(messages: NormalizedMessage[]): void {\n this.reset()\n\n // Build message index map for sorting\n messages.forEach((msg, idx) => {\n this.messageIndexMap.set(msg.uuid, idx)\n })\n\n // Process in dependency order: parallel-tasks first (to exclude from task handler)\n // Then task handler for remaining single tasks\n const processingOrder: MessageGroupType[] = ['parallel-tasks', 'task']\n\n // Track UUIDs that are part of parallel groups\n const parallelGroupUuids = new Set<string>()\n\n for (const type of processingOrder) {\n const handler = this.typeHandlers.get(type)\n if (!handler) continue\n\n const identified = handler.identify(messages)\n\n for (const identifiedGroup of identified) {\n // For task groups, skip if the message is already in a parallel group\n if (type === 'task') {\n const msgUuid = identifiedGroup.messageUuids[0]\n if (parallelGroupUuids.has(msgUuid)) {\n continue\n }\n }\n\n // Track parallel group UUIDs\n if (type === 'parallel-tasks') {\n for (const uuid of identifiedGroup.messageUuids) {\n parallelGroupUuids.add(uuid)\n }\n }\n\n this.createGroup(identifiedGroup, handler, messages)\n }\n }\n }\n\n /**\n * Create a group and compute initial state\n */\n private createGroup(\n identified: IdentifiedGroup,\n handler: GroupTypeHandler,\n messages: NormalizedMessage[],\n ): MessageGroup {\n const groupId = this.generateGroupId(identified.type)\n\n const group: MessageGroup = {\n id: groupId,\n type: identified.type,\n childIds: identified.childIds || [],\n messageUuids: identified.messageUuids,\n status: 'pending',\n metadata: identified.metadata,\n // V1+ new fields: will be computed\n anchor: { anchorMessageUuid: '', anchorStrategy: 'first' },\n resolution: {\n isSelfResolved: false,\n isNestedResolved: true,\n isFullyResolved: false,\n unresolvedToolUseIds: [],\n },\n }\n\n // Compute anchor\n group.anchor = handler.computeAnchor(group, messages)\n\n // Register mappings\n this.groups.set(group.id, group)\n for (const uuid of group.messageUuids) {\n this.messageToGroup.set(uuid, group.id)\n }\n if (identified.metadata.toolUseId) {\n this.toolUseToGroup.set(identified.metadata.toolUseId, group.id)\n }\n // Also register sibling tool use IDs for parallel groups\n if (identified.metadata.siblingToolUseIds) {\n for (const toolUseId of identified.metadata.siblingToolUseIds) {\n this.toolUseToGroup.set(toolUseId, group.id)\n }\n }\n\n return group\n }\n\n /**\n * Update resolution states for all groups\n * This is the generalized version of V3's nested checking\n */\n updateResolutionStates(\n unresolvedToolUseIDs: Set<string>,\n inProgressToolUseIDs: Set<string>,\n ): void {\n // First pass: update all groups' resolution using their handlers\n for (const group of this.groups.values()) {\n const handler = this.typeHandlers.get(group.type)\n if (handler) {\n group.resolution = handler.computeResolution(\n group,\n unresolvedToolUseIDs,\n )\n }\n }\n\n // Second pass: for parallel groups, aggregate child resolutions\n for (const group of this.groups.values()) {\n if (group.type === 'parallel-tasks') {\n this.updateParallelGroupResolution(group, unresolvedToolUseIDs)\n }\n }\n\n // Third pass: update status based on resolution\n for (const group of this.groups.values()) {\n group.status = this.computeGroupStatus(group, inProgressToolUseIDs)\n }\n }\n\n /**\n * Update parallel group resolution by checking all member tasks\n */\n private updateParallelGroupResolution(\n group: MessageGroup,\n unresolvedToolUseIDs: Set<string>,\n ): void {\n const memberIds = (group.metadata.siblingToolUseIds as string[]) || []\n\n // Check each member's nested resolution\n let allNestedResolved = true\n const allUnresolvedIds: string[] = [\n ...group.resolution.unresolvedToolUseIds,\n ]\n\n for (const toolUseId of memberIds) {\n const agentId = getAgentIdByToolUseId(toolUseId)\n if (agentId) {\n const nestedResult = this.checkNestedTasksResolution(\n agentId,\n unresolvedToolUseIDs,\n )\n if (nestedResult.hasUnresolved) {\n allNestedResolved = false\n allUnresolvedIds.push(...nestedResult.unresolvedIds)\n }\n }\n }\n\n group.resolution.isNestedResolved = allNestedResolved\n group.resolution.isFullyResolved =\n group.resolution.isSelfResolved && allNestedResolved\n group.resolution.unresolvedToolUseIds = allUnresolvedIds\n }\n\n /**\n * Recursively check if all nested tasks are resolved\n */\n private checkNestedTasksResolution(\n agentId: string,\n unresolvedToolUseIDs: Set<string>,\n ): { hasUnresolved: boolean; unresolvedIds: string[] } {\n const transcript = getAgentTranscript(agentId)\n if (!transcript) {\n return { hasUnresolved: false, unresolvedIds: [] }\n }\n\n const unresolvedIds: string[] = []\n\n for (const message of transcript.messages) {\n if (message.type === 'assistant') {\n const content = message.message.content\n if (!content || !Array.isArray(content)) continue\n\n for (const block of content) {\n if (\n block.type === 'tool_use' &&\n (block.name === 'Agent' || block.name === 'Task')\n ) {\n if (unresolvedToolUseIDs.has(block.id)) {\n unresolvedIds.push(block.id)\n }\n\n const nestedAgentId = getAgentIdByToolUseId(block.id)\n if (nestedAgentId) {\n const nested = this.checkNestedTasksResolution(\n nestedAgentId,\n unresolvedToolUseIDs,\n )\n unresolvedIds.push(...nested.unresolvedIds)\n }\n }\n }\n }\n }\n\n return {\n hasUnresolved: unresolvedIds.length > 0,\n unresolvedIds,\n }\n }\n\n /**\n * Check if a group should be rendered as Static\n * V1+ core: only fully resolved groups can be Static\n */\n shouldGroupBeStatic(group: MessageGroup): boolean {\n return group.resolution.isFullyResolved\n }\n\n /**\n * Get ordered root groups (groups without parent)\n * Sorted by anchor message position\n */\n getOrderedRootGroups(): MessageGroup[] {\n const roots = Array.from(this.groups.values()).filter(g => !g.parentId)\n return roots.sort((a, b) => {\n const aIndex = this.messageIndexMap.get(a.anchor.anchorMessageUuid) ?? 0\n const bIndex = this.messageIndexMap.get(b.anchor.anchorMessageUuid) ?? 0\n return aIndex - bIndex\n })\n }\n\n /**\n * Get all tool use IDs associated with a group\n */\n getGroupToolUseIds(group: MessageGroup): string[] {\n const ids: string[] = []\n if (group.metadata.toolUseId) {\n ids.push(group.metadata.toolUseId)\n }\n if (group.metadata.siblingToolUseIds) {\n ids.push(...group.metadata.siblingToolUseIds)\n }\n return ids\n }\n\n /**\n * Compute group status based on resolution and progress\n *\n * IMPORTANT: For parallel tasks, we must check inProgressToolUseIDs BEFORE\n * checking isFullyResolved, because tool uses may still be running even if\n * they haven't received results yet. The resolution check only tells us if\n * tool_results exist, not if agents are still running.\n */\n private computeGroupStatus(\n group: MessageGroup,\n inProgressToolUseIDs: Set<string>,\n ): 'pending' | 'running' | 'completed' | 'failed' {\n const toolUseIds = this.getGroupToolUseIds(group)\n\n // Check running status FIRST - if any toolUseId is in progress, the group is running\n // This is critical for parallel tasks where agents may still be running\n if (toolUseIds.some(id => inProgressToolUseIDs.has(id))) {\n return 'running'\n }\n\n // Only after confirming nothing is running, check resolution\n if (group.resolution.isFullyResolved) {\n return 'completed'\n }\n\n return 'pending'\n }\n\n private generateGroupId(type: MessageGroupType): string {\n this.idCounter++\n return `${type}-${Date.now()}-${this.idCounter}`\n }\n\n reset(): void {\n this.groups.clear()\n this.toolUseToGroup.clear()\n this.messageToGroup.clear()\n this.messageIndexMap.clear()\n this.idCounter = 0\n }\n\n getGroup(id: string): MessageGroup | undefined {\n return this.groups.get(id)\n }\n\n getGroupByToolUseId(toolUseId: string): MessageGroup | undefined {\n const groupId = this.toolUseToGroup.get(toolUseId)\n return groupId ? this.groups.get(groupId) : undefined\n }\n\n getGroupByMessageUuid(uuid: string): MessageGroup | undefined {\n const groupId = this.messageToGroup.get(uuid)\n return groupId ? this.groups.get(groupId) : undefined\n }\n\n getAllGroups(): MessageGroup[] {\n return Array.from(this.groups.values())\n }\n\n /**\n * Check if a toolUseId is the anchor of its group\n */\n isGroupAnchor(toolUseId: string): boolean {\n const group = this.getGroupByToolUseId(toolUseId)\n if (!group) return false\n\n // For parallel groups, check if this is the first sibling\n if (group.type === 'parallel-tasks') {\n const siblings = group.metadata.siblingToolUseIds as string[] | undefined\n return siblings?.[0] === toolUseId\n }\n\n // For single task groups, the toolUseId is always the anchor\n return group.metadata.toolUseId === toolUseId\n }\n}\n\n// Singleton instance for global access\nlet globalManager: MessageGroupManager | null = null\n\nexport function getMessageGroupManager(): MessageGroupManager {\n if (!globalManager) {\n globalManager = new MessageGroupManager()\n }\n return globalManager\n}\n\nexport function resetMessageGroupManager(): void {\n globalManager = null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|