@within-7/minto 0.1.5 → 0.1.7
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/commands/agents/AgentsCommand.js +2342 -0
- package/dist/commands/agents/AgentsCommand.js.map +7 -0
- package/dist/commands/agents/constants.js +58 -0
- package/dist/commands/agents/constants.js.map +7 -0
- package/dist/commands/agents/index.js +37 -0
- package/dist/commands/agents/index.js.map +7 -0
- package/dist/commands/agents/types.js +10 -0
- package/dist/commands/agents/types.js.map +7 -0
- package/dist/commands/agents/utils/fileOperations.js +185 -0
- package/dist/commands/agents/utils/fileOperations.js.map +7 -0
- package/dist/commands/agents/utils/index.js +21 -0
- package/dist/commands/agents/utils/index.js.map +7 -0
- package/dist/commands/bug.js +2 -2
- package/dist/commands/bug.js.map +2 -2
- package/dist/commands/compact.js +5 -5
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/ctx_viz.js +55 -22
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/mcp-interactive.js +11 -11
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +94 -32
- package/dist/commands/model.js.map +3 -3
- package/dist/commands/plugin/AddMarketplaceForm.js +49 -21
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +38 -26
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +24 -8
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +3 -1
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +16 -7
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +84 -39
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +7 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +16 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +4 -2
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +12 -6
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +14 -5
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin/example-usage.js.map +2 -2
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +226 -46
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/refreshCommands.js +6 -3
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/resume.js +2 -1
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/setup.js +19 -5
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/terminalSetup.js +2 -2
- package/dist/commands/terminalSetup.js.map +1 -1
- package/dist/commands.js +14 -30
- package/dist/commands.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +10 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +5 -1
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/Config.js +17 -4
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/CustomSelect/select-option.js +4 -1
- package/dist/components/CustomSelect/select-option.js.map +2 -2
- package/dist/components/Help.js +6 -8
- package/dist/components/Help.js.map +2 -2
- package/dist/components/Logo.js +1 -1
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +2030 -0
- package/dist/components/ModelSelector/ModelSelector.js.map +7 -0
- package/dist/components/ModelSelector/ScreenContainer.js +27 -0
- package/dist/components/ModelSelector/ScreenContainer.js.map +7 -0
- package/dist/components/ModelSelector/constants.js +37 -0
- package/dist/components/ModelSelector/constants.js.map +7 -0
- package/dist/components/ModelSelector/hooks/index.js +5 -0
- package/dist/components/ModelSelector/hooks/index.js.map +7 -0
- package/dist/components/ModelSelector/hooks/useEscapeNavigation.js +21 -0
- package/dist/components/ModelSelector/hooks/useEscapeNavigation.js.map +7 -0
- package/dist/components/ModelSelector/index.js +17 -0
- package/dist/components/ModelSelector/index.js.map +7 -0
- package/dist/components/ModelSelector/types.js +1 -0
- package/dist/components/ModelSelector/types.js.map +7 -0
- package/dist/components/PressEnterToContinue.js +1 -1
- package/dist/components/PressEnterToContinue.js.map +2 -2
- package/dist/components/ProjectOnboarding.js +1 -1
- package/dist/components/ProjectOnboarding.js.map +2 -2
- package/dist/components/PromptInput.js +88 -37
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/QuitSummary.js +17 -10
- package/dist/components/QuitSummary.js.map +2 -2
- package/dist/components/SentryErrorBoundary.js.map +2 -2
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TodoItem.js.map +1 -1
- package/dist/components/binary-feedback/BinaryFeedbackOption.js +1 -3
- package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +2 -2
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +1 -1
- package/dist/components/messages/AssistantToolUseMessage.js +3 -1
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/TaskProgressMessage.js.map +2 -2
- package/dist/components/messages/TaskToolMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/utils.js.map +2 -2
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +2 -2
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +2 -2
- package/dist/components/permissions/hooks.js.map +2 -2
- package/dist/constants/modelCapabilities.js +1 -1
- package/dist/constants/modelCapabilities.js.map +2 -2
- package/dist/constants/prompts.js.map +1 -1
- package/dist/constants/timing.js +34 -0
- package/dist/constants/timing.js.map +7 -0
- package/dist/entrypoints/cli.js +128 -33
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/entrypoints/mcp.js +13 -18
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useCancelRequest.js.map +1 -1
- package/dist/hooks/useHistorySearch.js.map +2 -2
- package/dist/hooks/useLogStartupTime.js.map +2 -2
- package/dist/hooks/usePermissionRequestLogging.js.map +2 -2
- package/dist/hooks/useTextInput.js.map +1 -1
- package/dist/hooks/useUnifiedCompletion.js +493 -394
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/index.js.map +2 -2
- package/dist/permissions.js +4 -7
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +6 -1
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +72 -36
- package/dist/screens/REPL.js.map +2 -2
- package/dist/screens/ResumeConversation.js +2 -1
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/adapters/base.js.map +2 -2
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/responsesAPI.js +3 -1
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/claude.js +327 -328
- package/dist/services/claude.js.map +2 -2
- package/dist/services/customCommands.js +6 -1
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/fileFreshness.js.map +2 -2
- package/dist/services/gpt5ConnectionTest.js +20 -7
- package/dist/services/gpt5ConnectionTest.js.map +2 -2
- package/dist/services/hookExecutor.js +6 -12
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/mcpClient.js +29 -2
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/mentionProcessor.js +23 -10
- package/dist/services/mentionProcessor.js.map +2 -2
- package/dist/services/modelAdapterFactory.js.map +2 -2
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +109 -72
- package/dist/services/openai.js.map +3 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/tools/ArchitectTool/ArchitectTool.js +10 -9
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +14 -8
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +23 -4
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +11 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +7 -5
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/MCPTool/MCPTool.js +11 -12
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +4 -1
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js +11 -5
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/SkillTool/SkillTool.js +18 -6
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +37 -51
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/ThinkTool/ThinkTool.js +6 -1
- package/dist/tools/ThinkTool/ThinkTool.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +29 -5
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +5 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +6 -3
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js +3 -1
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/searchProviders.js +15 -6
- package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
- package/dist/tools.js +4 -1
- package/dist/tools.js.map +2 -2
- package/dist/types/core.js +1 -0
- package/dist/types/core.js.map +7 -0
- package/dist/types/hooks.js +1 -4
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js +8 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/plugin.js +9 -6
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/BackgroundShellManager.js +76 -10
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/PersistentShell.js +7 -2
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/advancedFuzzyMatcher.js +4 -1
- package/dist/utils/advancedFuzzyMatcher.js.map +2 -2
- package/dist/utils/agentLoader.js +69 -35
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentStorage.js.map +2 -2
- package/dist/utils/async.js +163 -0
- package/dist/utils/async.js.map +7 -0
- package/dist/utils/autoUpdater.js +8 -2
- package/dist/utils/autoUpdater.js.map +2 -2
- package/dist/utils/commands.js +23 -11
- package/dist/utils/commands.js.map +2 -2
- package/dist/utils/commonUnixCommands.js +3 -1
- package/dist/utils/commonUnixCommands.js.map +2 -2
- package/dist/utils/compressionMode.js.map +2 -2
- package/dist/utils/config.js +30 -14
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/debugLogger.js.map +2 -2
- package/dist/utils/env.js.map +2 -2
- package/dist/utils/envConfig.js +82 -0
- package/dist/utils/envConfig.js.map +7 -0
- package/dist/utils/errorHandling.js +89 -0
- package/dist/utils/errorHandling.js.map +7 -0
- package/dist/utils/expertChatStorage.js.map +2 -2
- package/dist/utils/fuzzyMatcher.js +13 -7
- package/dist/utils/fuzzyMatcher.js.map +2 -2
- package/dist/utils/hookManager.js +14 -4
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/log.js.map +2 -2
- package/dist/utils/marketplaceManager.js +44 -9
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/messageContextManager.js.map +1 -1
- package/dist/utils/messages.js +6 -3
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +3 -1
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +3 -15
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +41 -13
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/pluginRegistry.js.map +2 -2
- package/dist/utils/pluginValidator.js +71 -49
- package/dist/utils/pluginValidator.js.map +2 -2
- package/dist/utils/ptyCompat.js.map +2 -2
- package/dist/utils/roundConverter.js.map +2 -2
- package/dist/utils/secureFile.js +43 -14
- package/dist/utils/secureFile.js.map +2 -2
- package/dist/utils/sessionState.js.map +2 -2
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/teamConfig.js +7 -4
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js.map +2 -2
- package/dist/utils/thinking.js.map +2 -2
- package/dist/utils/unaryLogging.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/debugLogger.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, mkdirSync, appendFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport chalk from 'chalk'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { SESSION_ID } from './log'\nimport type { Message } from '@minto-types/conversation'\n\n// \u8C03\u8BD5\u65E5\u5FD7\u7EA7\u522B\nexport enum LogLevel {\n TRACE = 'TRACE',\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n WARN = 'WARN',\n ERROR = 'ERROR',\n FLOW = 'FLOW',\n API = 'API',\n STATE = 'STATE',\n REMINDER = 'REMINDER', // \u65B0\u589E\uFF1A\u7CFB\u7EDF\u63D0\u9192\u4E8B\u4EF6\n}\n\n// \u8C03\u8BD5\u6A21\u5F0F\u68C0\u6D4B\nconst isDebugMode = () =>\n process.argv.includes('--debug') || process.argv.includes('--debug-verbose')\nconst isVerboseMode = () => process.argv.includes('--verbose')\nconst isDebugVerboseMode = () => process.argv.includes('--debug-verbose')\n\n// \u7EC8\u7AEF\u65E5\u5FD7\u7EA7\u522B\u914D\u7F6E - \u663E\u793A\u5173\u952E\u4FE1\u606F\nconst TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.INFO, // \u6DFB\u52A0 INFO \u7EA7\u522B\uFF0C\u663E\u793A\u5173\u952E\u7CFB\u7EDF\u72B6\u6001\n LogLevel.REMINDER, // \u7CFB\u7EDF\u63D0\u9192\u4E8B\u4EF6\uFF0C\u7528\u6237\u5E94\u8BE5\u770B\u5230\n])\n\n// \u5728\u8C03\u8BD5\u8BE6\u7EC6\u6A21\u5F0F\u4E0B\u663E\u793A\u66F4\u591A\u65E5\u5FD7\u7EA7\u522B\nconst DEBUG_VERBOSE_TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.FLOW,\n LogLevel.API,\n LogLevel.STATE,\n LogLevel.INFO,\n LogLevel.REMINDER, // \u7CFB\u7EDF\u63D0\u9192\u5728\u8BE6\u7EC6\u6A21\u5F0F\u4E0B\u4E5F\u663E\u793A\n])\n\n// \u7528\u6237\u53CB\u597D\u7684\u65E5\u5FD7\u7EA7\u522B - \u7B80\u5316\u7684\u9AD8\u7EA7\u65E5\u5FD7\nconst USER_FRIENDLY_LEVELS = new Set([\n 'SESSION_START',\n 'QUERY_START',\n 'QUERY_PROGRESS',\n 'QUERY_COMPLETE',\n 'TOOL_EXECUTION',\n 'ERROR_OCCURRED',\n 'PERFORMANCE_SUMMARY',\n])\n\n// \u542F\u52A8\u65F6\u95F4\u6233\u7528\u4E8E\u6587\u4EF6\u547D\u540D\nconst STARTUP_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-')\nconst REQUEST_START_TIME = Date.now()\n\n// \u8DEF\u5F84\u914D\u7F6E - \u7EDF\u4E00\u4F7F\u7528 ~/.minto \u76EE\u5F55\nconst MINTO_DIR = join(homedir(), '.minto')\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nconst DEBUG_PATHS = {\n base: () => join(MINTO_DIR, getProjectDir(process.cwd()), 'debug'),\n detailed: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-detailed.log`),\n flow: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-flow.log`),\n api: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-api.log`),\n state: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-state.log`),\n}\n\n// \u786E\u4FDD\u8C03\u8BD5\u76EE\u5F55\u5B58\u5728\nfunction ensureDebugDir() {\n const debugDir = DEBUG_PATHS.base()\n if (!existsSync(debugDir)) {\n mkdirSync(debugDir, { recursive: true })\n }\n}\n\n// \u65E5\u5FD7\u6761\u76EE\u63A5\u53E3\ninterface LogEntry {\n timestamp: string\n level: LogLevel\n phase: string\n requestId?: string\n data: any\n elapsed?: number\n}\n\n// \u5F53\u524D\u8BF7\u6C42\u4E0A\u4E0B\u6587\nclass RequestContext {\n public readonly id: string\n public readonly startTime: number\n private phases: Map<string, number> = new Map()\n\n constructor() {\n this.id = randomUUID().slice(0, 8)\n this.startTime = Date.now()\n }\n\n markPhase(phase: string) {\n this.phases.set(phase, Date.now() - this.startTime)\n }\n\n getPhaseTime(phase: string): number {\n return this.phases.get(phase) || 0\n }\n\n getAllPhases(): Record<string, number> {\n return Object.fromEntries(this.phases)\n }\n}\n\n// \u5168\u5C40\u8BF7\u6C42\u4E0A\u4E0B\u6587\u7BA1\u7406\nconst activeRequests = new Map<string, RequestContext>()\nlet currentRequest: RequestContext | null = null\n\n// \u6838\u5FC3\u65E5\u5FD7\u8BB0\u5F55\u51FD\u6570\nfunction writeToFile(filePath: string, entry: LogEntry) {\n if (!isDebugMode()) return\n\n try {\n ensureDebugDir()\n const logLine =\n JSON.stringify(\n {\n ...entry,\n sessionId: SESSION_ID,\n pid: process.pid,\n uptime: Date.now() - REQUEST_START_TIME,\n },\n null,\n 2,\n ) + ',\\n'\n\n appendFileSync(filePath, logLine)\n } catch (error) {\n // \u9759\u9ED8\u5931\u8D25\uFF0C\u907F\u514D\u8C03\u8BD5\u65E5\u5FD7\u5F71\u54CD\u4E3B\u529F\u80FD\n }\n}\n\n// \u65E5\u5FD7\u53BB\u91CD\u673A\u5236\nconst recentLogs = new Map<string, number>()\nconst LOG_DEDUPE_WINDOW_MS = 5000 // 5\u79D2\u5185\u76F8\u540C\u65E5\u5FD7\u89C6\u4E3A\u91CD\u590D\n\n// \u751F\u6210\u65E5\u5FD7\u53BB\u91CD\u952E\nfunction getDedupeKey(level: LogLevel, phase: string, data: any): string {\n // \u5BF9\u4E8E\u914D\u7F6E\u76F8\u5173\u7684\u65E5\u5FD7\uFF0C\u4F7F\u7528\u6587\u4EF6\u8DEF\u5F84\u548C\u64CD\u4F5C\u7C7B\u578B\u4F5C\u4E3A\u952E\n if (phase.startsWith('CONFIG_')) {\n const file = data?.file || ''\n return `${level}:${phase}:${file}`\n }\n\n // \u5BF9\u4E8E\u5176\u4ED6\u65E5\u5FD7\uFF0C\u4F7F\u7528\u9636\u6BB5\u4F5C\u4E3A\u952E\n return `${level}:${phase}`\n}\n\n// \u68C0\u67E5\u662F\u5426\u5E94\u8BE5\u8BB0\u5F55\u65E5\u5FD7\uFF08\u53BB\u91CD\uFF09\nfunction shouldLogWithDedupe(\n level: LogLevel,\n phase: string,\n data: any,\n): boolean {\n const key = getDedupeKey(level, phase, data)\n const now = Date.now()\n const lastLogTime = recentLogs.get(key)\n\n // \u5982\u679C\u662F\u7B2C\u4E00\u6B21\u8BB0\u5F55\uFF0C\u6216\u8005\u8D85\u8FC7\u53BB\u91CD\u65F6\u95F4\u7A97\u53E3\uFF0C\u5219\u5141\u8BB8\u8BB0\u5F55\n if (!lastLogTime || now - lastLogTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.set(key, now)\n\n // \u6E05\u7406\u8FC7\u671F\u7684\u65E5\u5FD7\u8BB0\u5F55\n for (const [oldKey, oldTime] of recentLogs.entries()) {\n if (now - oldTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.delete(oldKey)\n }\n }\n\n return true\n }\n\n return false\n}\nfunction formatMessages(messages: any): string {\n if (Array.isArray(messages)) {\n // \u53EA\u663E\u793A\u6700\u8FD1 5 \u6761\u6D88\u606F\n const recentMessages = messages.slice(-5)\n return recentMessages\n .map((msg, index) => {\n const role = msg.role || 'unknown'\n let content = ''\n\n if (typeof msg.content === 'string') {\n // \u6BCF\u6761\u6D88\u606F\u6700\u957F 300 \u5B57\u7B26\uFF0C\u8D85\u51FA\u7701\u7565\n content =\n msg.content.length > 300\n ? msg.content.substring(0, 300) + '...'\n : msg.content\n } else if (typeof msg.content === 'object') {\n content = '[complex_content]'\n } else {\n content = String(msg.content || '')\n }\n\n const totalIndex = messages.length - recentMessages.length + index\n return `[${totalIndex}] ${chalk.dim(role)}: ${content}`\n })\n .join('\\n ')\n }\n\n if (typeof messages === 'string') {\n try {\n const parsed = JSON.parse(messages)\n if (Array.isArray(parsed)) {\n return formatMessages(parsed) // \u9012\u5F52\u5904\u7406\u89E3\u6790\u540E\u7684\u6570\u7EC4\n }\n } catch {\n // \u5982\u679C\u89E3\u6790\u5931\u8D25\uFF0C\u8FD4\u56DE\u622A\u65AD\u7684\u5B57\u7B26\u4E32\n }\n }\n\n // \u5BF9\u4E8E\u975E\u6D88\u606F\u6570\u7EC4\u7684\u957F\u5B57\u7B26\u4E32\uFF0C\u4E5F\u8FDB\u884C\u622A\u65AD\n if (typeof messages === 'string' && messages.length > 200) {\n return messages.substring(0, 200) + '...'\n }\n\n return typeof messages === 'string' ? messages : JSON.stringify(messages)\n}\n\n// \u5224\u65AD\u662F\u5426\u5E94\u8BE5\u5728\u7EC8\u7AEF\u663E\u793A\u65E5\u5FD7\nfunction shouldShowInTerminal(level: LogLevel): boolean {\n if (!isDebugMode()) return false\n\n // \u5728\u8C03\u8BD5\u8BE6\u7EC6\u6A21\u5F0F\u4E0B\u663E\u793A\u66F4\u591A\u65E5\u5FD7\u7EA7\u522B\n if (isDebugVerboseMode()) {\n return DEBUG_VERBOSE_TERMINAL_LOG_LEVELS.has(level)\n }\n\n // \u9ED8\u8BA4\u53EA\u663E\u793A\u9519\u8BEF\u548C\u8B66\u544A\n return TERMINAL_LOG_LEVELS.has(level)\n}\n\n// \u7EC8\u7AEF\u5F69\u8272\u8F93\u51FA\nfunction logToTerminal(entry: LogEntry) {\n // \u4F7F\u7528\u65B0\u7684\u8FC7\u6EE4\u903B\u8F91\n if (!shouldShowInTerminal(entry.level)) return\n\n const { level, phase, data, requestId, elapsed } = entry\n const timestamp = new Date().toISOString().slice(11, 23) // HH:mm:ss.SSS\n\n let prefix = ''\n let color = chalk.gray\n\n switch (level) {\n case LogLevel.FLOW:\n prefix = '\uD83D\uDD04'\n color = chalk.cyan\n break\n case LogLevel.API:\n prefix = '\uD83C\uDF10'\n color = chalk.yellow\n break\n case LogLevel.STATE:\n prefix = '\uD83D\uDCCA'\n color = chalk.blue\n break\n case LogLevel.ERROR:\n prefix = '\u274C'\n color = chalk.red\n break\n case LogLevel.WARN:\n prefix = '\u26A0\uFE0F'\n color = chalk.yellow\n break\n case LogLevel.INFO:\n prefix = '\u2139\uFE0F'\n color = chalk.green\n break\n case LogLevel.TRACE:\n prefix = '\uD83D\uDCC8'\n color = chalk.magenta\n break\n default:\n prefix = '\uD83D\uDD0D'\n color = chalk.gray\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId}]`) : ''\n const elapsedStr = elapsed !== undefined ? chalk.dim(`+${elapsed}ms`) : ''\n\n // \u7279\u6B8A\u5904\u7406\u4E00\u4E9B\u6570\u636E\u683C\u5F0F\n let dataStr = ''\n if (typeof data === 'object' && data !== null) {\n if (data.messages) {\n // \u683C\u5F0F\u5316\u6D88\u606F\u6570\u7EC4\n const formattedMessages = formatMessages(data.messages)\n dataStr = JSON.stringify(\n {\n ...data,\n messages: `\\n ${formattedMessages}`,\n },\n null,\n 2,\n )\n } else {\n dataStr = JSON.stringify(data, null, 2)\n }\n } else {\n dataStr = typeof data === 'string' ? data : JSON.stringify(data)\n }\n\n console.log(\n `${color(`[${timestamp}]`)} ${prefix} ${color(phase)} ${reqId} ${dataStr} ${elapsedStr}`,\n )\n}\n\n// \u4E3B\u8981\u8C03\u8BD5\u65E5\u5FD7\u51FD\u6570\nexport function debugLog(\n level: LogLevel,\n phase: string,\n data: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n // \u68C0\u67E5\u662F\u5426\u5E94\u8BE5\u8BB0\u5F55\uFF08\u53BB\u91CD\u68C0\u67E5\uFF09\n if (!shouldLogWithDedupe(level, phase, data)) {\n return // \u8DF3\u8FC7\u91CD\u590D\u7684\u65E5\u5FD7\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n phase,\n data,\n requestId: requestId || currentRequest?.id,\n elapsed: currentRequest ? Date.now() - currentRequest.startTime : undefined,\n }\n\n // \u5199\u5165\u5BF9\u5E94\u7684\u65E5\u5FD7\u6587\u4EF6\n writeToFile(DEBUG_PATHS.detailed(), entry)\n\n switch (level) {\n case LogLevel.FLOW:\n writeToFile(DEBUG_PATHS.flow(), entry)\n break\n case LogLevel.API:\n writeToFile(DEBUG_PATHS.api(), entry)\n break\n case LogLevel.STATE:\n writeToFile(DEBUG_PATHS.state(), entry)\n break\n }\n\n // \u7EC8\u7AEF\u8F93\u51FA\uFF08\u4E5F\u4F1A\u88AB\u8FC7\u6EE4\uFF09\n logToTerminal(entry)\n}\n\n// \u4FBF\u6377\u7684\u65E5\u5FD7\u51FD\u6570\nexport const debug = {\n flow: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.FLOW, phase, data, requestId),\n\n api: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.API, phase, data, requestId),\n\n state: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, phase, data, requestId),\n\n info: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.INFO, phase, data, requestId),\n\n warn: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.WARN, phase, data, requestId),\n\n error: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.ERROR, phase, data, requestId),\n\n trace: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.TRACE, phase, data, requestId),\n\n // \u65B0\u589EUI\u76F8\u5173\u7684\u8C03\u8BD5\u51FD\u6570 (\u53EA\u8BB0\u5F55\u5230\u6587\u4EF6\uFF0C\u4E0D\u663E\u793A\u5728\u7EC8\u7AEF)\n ui: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, `UI_${phase}`, data, requestId),\n}\n\n// \u8BF7\u6C42\u751F\u547D\u5468\u671F\u7BA1\u7406\nexport function startRequest(): RequestContext {\n const ctx = new RequestContext()\n currentRequest = ctx\n activeRequests.set(ctx.id, ctx)\n\n debug.flow('REQUEST_START', {\n requestId: ctx.id,\n activeRequests: activeRequests.size,\n })\n\n return ctx\n}\n\nexport function endRequest(ctx?: RequestContext) {\n const request = ctx || currentRequest\n if (!request) return\n\n debug.flow('REQUEST_END', {\n requestId: request.id,\n totalTime: Date.now() - request.startTime,\n phases: request.getAllPhases(),\n })\n\n activeRequests.delete(request.id)\n if (currentRequest === request) {\n currentRequest = null\n }\n}\n\nexport function getCurrentRequest(): RequestContext | null {\n return currentRequest\n}\n\n// \u9636\u6BB5\u6807\u8BB0\u51FD\u6570\nexport function markPhase(phase: string, data?: any) {\n if (!currentRequest) return\n\n currentRequest.markPhase(phase)\n debug.flow(`PHASE_${phase.toUpperCase()}`, {\n requestId: currentRequest.id,\n elapsed: currentRequest.getPhaseTime(phase),\n data,\n })\n}\n\n// \u65B0\u589E\uFF1AReminder \u4E8B\u4EF6\u65E5\u5FD7\u8BB0\u5F55\nexport function logReminderEvent(\n eventType: string,\n reminderData: any,\n agentId?: string,\n) {\n if (!isDebugMode()) return\n\n debug.info('REMINDER_EVENT_TRIGGERED', {\n eventType,\n agentId: agentId || 'default',\n reminderType: reminderData.type || 'unknown',\n reminderCategory: reminderData.category || 'general',\n reminderPriority: reminderData.priority || 'medium',\n contentLength: reminderData.content ? reminderData.content.length : 0,\n timestamp: Date.now(),\n })\n}\n\n// API\u9519\u8BEF\u65E5\u5FD7\u529F\u80FD\nexport function logAPIError(context: {\n model: string\n endpoint: string\n status: number\n error: any\n request?: any\n response?: any\n provider?: string\n}) {\n const errorDir = join(MINTO_DIR, 'logs', 'error', 'api')\n \n // \u786E\u4FDD\u76EE\u5F55\u5B58\u5728\n if (!existsSync(errorDir)) {\n try {\n mkdirSync(errorDir, { recursive: true })\n } catch (err) {\n console.error('Failed to create error log directory:', err)\n return // Exit early if we can't create the directory\n }\n }\n \n // \u751F\u6210\u6587\u4EF6\u540D\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const sanitizedModel = context.model.replace(/[^a-zA-Z0-9-_]/g, '_')\n const filename = `${sanitizedModel}_${timestamp}.log`\n const filepath = join(errorDir, filename)\n \n // \u51C6\u5907\u5B8C\u6574\u7684\u65E5\u5FD7\u5185\u5BB9\uFF08\u6587\u4EF6\u4E2D\u4FDD\u5B58\u6240\u6709\u4FE1\u606F\uFF09\n const fullLogContent = {\n timestamp: new Date().toISOString(),\n sessionId: SESSION_ID,\n requestId: getCurrentRequest()?.id,\n model: context.model,\n provider: context.provider,\n endpoint: context.endpoint,\n status: context.status,\n error: context.error,\n request: context.request, // \u4FDD\u5B58\u5B8C\u6574\u8BF7\u6C42\n response: context.response, // \u4FDD\u5B58\u5B8C\u6574\u54CD\u5E94\n environment: {\n nodeVersion: process.version,\n platform: process.platform,\n cwd: process.cwd(),\n }\n }\n \n // \u5199\u5165\u6587\u4EF6\uFF08\u4FDD\u5B58\u5B8C\u6574\u4FE1\u606F\uFF09\n try {\n appendFileSync(filepath, JSON.stringify(fullLogContent, null, 2) + '\\n')\n appendFileSync(filepath, '='.repeat(80) + '\\n\\n')\n } catch (err) {\n console.error('Failed to write API error log:', err)\n }\n \n // \u5728\u8C03\u8BD5\u6A21\u5F0F\u4E0B\u8BB0\u5F55\u5230\u7CFB\u7EDF\u65E5\u5FD7\n if (isDebugMode()) {\n debug.error('API_ERROR', {\n model: context.model,\n status: context.status,\n error: typeof context.error === 'string' ? context.error : context.error?.message || 'Unknown error',\n endpoint: context.endpoint,\n logFile: filename,\n })\n }\n \n // \u4F18\u96C5\u7684\u7EC8\u7AEF\u663E\u793A\uFF08\u4EC5\u5728verbose\u6A21\u5F0F\u4E0B\uFF09\n if (isVerboseMode() || isDebugVerboseMode()) {\n console.log()\n console.log(chalk.red('\u2501'.repeat(60)))\n console.log(chalk.red.bold('\u26A0\uFE0F API Error'))\n console.log(chalk.red('\u2501'.repeat(60)))\n \n // \u663E\u793A\u5173\u952E\u4FE1\u606F\n console.log(chalk.white(' Model: ') + chalk.yellow(context.model))\n console.log(chalk.white(' Status: ') + chalk.red(context.status))\n \n // \u683C\u5F0F\u5316\u9519\u8BEF\u6D88\u606F\n let errorMessage = 'Unknown error'\n if (typeof context.error === 'string') {\n errorMessage = context.error\n } else if (context.error?.message) {\n errorMessage = context.error.message\n } else if (context.error?.error?.message) {\n errorMessage = context.error.error.message\n }\n \n // \u9519\u8BEF\u6D88\u606F\u6362\u884C\u663E\u793A\n console.log(chalk.white(' Error: ') + chalk.red(errorMessage))\n \n // \u5982\u679C\u6709\u54CD\u5E94\u4F53\uFF0C\u663E\u793A\u683C\u5F0F\u5316\u7684\u54CD\u5E94\n if (context.response) {\n console.log()\n console.log(chalk.gray(' Response:'))\n const responseStr = typeof context.response === 'string' \n ? context.response \n : JSON.stringify(context.response, null, 2)\n \n // \u7F29\u8FDB\u663E\u793A\u54CD\u5E94\u5185\u5BB9\n responseStr.split('\\n').forEach(line => {\n console.log(chalk.gray(' ' + line))\n })\n }\n \n console.log()\n console.log(chalk.dim(` \uD83D\uDCC1 Full log: ${filepath}`))\n console.log(chalk.red('\u2501'.repeat(60)))\n console.log()\n }\n}\n\n// \u65B0\u589E\uFF1ALLM \u4EA4\u4E92\u6838\u5FC3\u8C03\u8BD5\u4FE1\u606F\nexport function logLLMInteraction(context: {\n systemPrompt: string\n messages: any[]\n response: any\n usage?: { inputTokens: number; outputTokens: number }\n timing: { start: number; end: number }\n apiFormat?: 'anthropic' | 'openai'\n}) {\n if (!isDebugMode()) return\n\n const duration = context.timing.end - context.timing.start\n\n console.log('\\n' + chalk.blue('\uD83E\uDDE0 LLM CALL DEBUG'))\n console.log(chalk.gray('\u2501'.repeat(60)))\n\n // \u663E\u793A\u4E0A\u4E0B\u6587\u57FA\u672C\u4FE1\u606F\n console.log(chalk.yellow('\uD83D\uDCCA Context Overview:'))\n console.log(` Messages Count: ${context.messages.length}`)\n console.log(` System Prompt Length: ${context.systemPrompt.length} chars`)\n console.log(` Duration: ${duration.toFixed(0)}ms`)\n\n if (context.usage) {\n console.log(\n ` Token Usage: ${context.usage.inputTokens} \u2192 ${context.usage.outputTokens}`,\n )\n }\n\n // \u663E\u793A\u771F\u5B9E\u53D1\u9001\u7ED9 LLM API \u7684 messages\uFF08\u5B8C\u6574\u8FD8\u539FAPI\u8C03\u7528\uFF09\n const apiLabel = context.apiFormat\n ? ` (${context.apiFormat.toUpperCase()})`\n : ''\n console.log(chalk.cyan(`\\n\uD83D\uDCAC Real API Messages${apiLabel} (last 10):`))\n\n // \u8FD9\u91CC\u5C55\u793A\u7684\u662F\u771F\u6B63\u53D1\u9001\u7ED9LLM API\u7684messages\uFF0C\u4E0D\u662F\u5185\u90E8\u5904\u7406\u7684\u7248\u672C\n const recentMessages = context.messages.slice(-10)\n recentMessages.forEach((msg, index) => {\n const globalIndex = context.messages.length - recentMessages.length + index\n const roleColor =\n msg.role === 'user'\n ? 'green'\n : msg.role === 'assistant'\n ? 'blue'\n : msg.role === 'system'\n ? 'yellow'\n : 'gray'\n\n let content = ''\n let isReminder = false\n\n if (typeof msg.content === 'string') {\n // \u68C0\u67E5\u662F\u5426\u662F system-reminder\n if (msg.content.includes('<system-reminder>')) {\n isReminder = true\n // \u63D0\u53D6 reminder \u7684\u6838\u5FC3\u5185\u5BB9\uFF0C\u663E\u793A\u66F4\u591A\u5B57\u7B26\uFF0C\u8BB0\u5F97\u52A0\u7701\u7565\u53F7\n const reminderContent = msg.content\n .replace(/<\\/?system-reminder>/g, '')\n .trim()\n content = `\uD83D\uDD14 ${reminderContent.length > 800 ? reminderContent.substring(0, 800) + '...' : reminderContent}`\n } else {\n // \u589E\u52A0\u666E\u901A\u6D88\u606F\u7684\u663E\u793A\u5B57\u7B26\u6570 - \u7528\u6237\u6D88\u606F\u548C\u7CFB\u7EDF\u6D88\u606F\u663E\u793A\u66F4\u591A\n const maxLength =\n msg.role === 'user' ? 1000 : msg.role === 'system' ? 1200 : 800\n content =\n msg.content.length > maxLength\n ? msg.content.substring(0, maxLength) + '...'\n : msg.content\n }\n } else if (Array.isArray(msg.content)) {\n // Anthropic\u683C\u5F0F\uFF1Acontent\u662F\u5BF9\u8C61\u6570\u7EC4\n const textBlocks = msg.content.filter(\n (block: any) => block.type === 'text',\n )\n const toolBlocks = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (textBlocks.length > 0) {\n const text = textBlocks[0].text || ''\n // Assistant\u6D88\u606F\u663E\u793A\u66F4\u591A\u5185\u5BB9\n const maxLength = msg.role === 'assistant' ? 1000 : 800\n content =\n text.length > maxLength ? text.substring(0, maxLength) + '...' : text\n }\n if (toolBlocks.length > 0) {\n content += ` [+ ${toolBlocks.length} tool calls]`\n }\n if (textBlocks.length === 0 && toolBlocks.length === 0) {\n content = `[${msg.content.length} blocks: ${msg.content.map(b => b.type || 'unknown').join(', ')}]`\n }\n } else {\n content = '[complex_content]'\n }\n\n // \u6839\u636E\u6D88\u606F\u7C7B\u578B\u4F7F\u7528\u4E0D\u540C\u7684\u663E\u793A\u6837\u5F0F - \u66F4\u53CB\u597D\u7684\u89C6\u89C9\u683C\u5F0F\n if (isReminder) {\n console.log(\n ` [${globalIndex}] ${chalk.magenta('\uD83D\uDD14 REMINDER')}: ${chalk.dim(content)}`,\n )\n } else {\n // \u4E3A\u4E0D\u540C\u89D2\u8272\u6DFB\u52A0\u56FE\u6807\n const roleIcon =\n msg.role === 'user'\n ? '\uD83D\uDC64'\n : msg.role === 'assistant'\n ? '\uD83E\uDD16'\n : msg.role === 'system'\n ? '\u2699\uFE0F'\n : '\uD83D\uDCC4'\n console.log(\n ` [${globalIndex}] ${(chalk as any)[roleColor](roleIcon + ' ' + msg.role.toUpperCase())}: ${content}`,\n )\n }\n\n // \u663E\u793A\u5DE5\u5177\u8C03\u7528\u4FE1\u606F\uFF08Anthropic\u683C\u5F0F\uFF09- \u66F4\u6E05\u6670\u7684\u683C\u5F0F\n if (msg.role === 'assistant' && Array.isArray(msg.content)) {\n const toolCalls = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (toolCalls.length > 0) {\n console.log(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${toolCalls.length}): ${toolCalls.map((t: any) => t.name).join(', ')}`,\n ),\n )\n // \u663E\u793A\u6BCF\u4E2A\u5DE5\u5177\u7684\u8BE6\u7EC6\u53C2\u6570\n toolCalls.forEach((tool: any, idx: number) => {\n const inputStr = JSON.stringify(tool.input || {})\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n console.log(\n chalk.dim(` [${idx}] ${tool.name}: ${displayInput}`),\n )\n })\n }\n }\n // OpenAI\u683C\u5F0F\u7684\u5DE5\u5177\u8C03\u7528\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n console.log(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${msg.tool_calls.length}): ${msg.tool_calls.map((t: any) => t.function.name).join(', ')}`,\n ),\n )\n msg.tool_calls.forEach((tool: any, idx: number) => {\n const inputStr = tool.function.arguments || '{}'\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n console.log(\n chalk.dim(` [${idx}] ${tool.function.name}: ${displayInput}`),\n )\n })\n }\n })\n\n // \u663E\u793A LLM \u54CD\u5E94\u6838\u5FC3\u4FE1\u606F - \u66F4\u8BE6\u7EC6\u53CB\u597D\u7684\u683C\u5F0F\n console.log(chalk.magenta('\\n\uD83E\uDD16 LLM Response:'))\n\n // Handle different response formats (Anthropic vs OpenAI)\n let responseContent = ''\n let toolCalls: any[] = []\n\n if (Array.isArray(context.response.content)) {\n // Anthropic format: content is array of blocks\n const textBlocks = context.response.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.content === 'string') {\n // OpenAI format: content might be string\n responseContent = context.response.content\n // Tool calls are separate in OpenAI format\n toolCalls = context.response.tool_calls || []\n } else {\n responseContent = JSON.stringify(context.response.content || '')\n }\n\n // \u663E\u793A\u66F4\u591A\u54CD\u5E94\u5185\u5BB9\n const maxResponseLength = 1000\n const displayContent =\n responseContent.length > maxResponseLength\n ? responseContent.substring(0, maxResponseLength) + '...'\n : responseContent\n console.log(` Content: ${displayContent}`)\n\n if (toolCalls.length > 0) {\n const toolNames = toolCalls.map(\n (t: any) => t.name || t.function?.name || 'unknown',\n )\n console.log(\n chalk.cyan(\n ` \uD83D\uDD27 Tool Calls (${toolCalls.length}): ${toolNames.join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, index: number) => {\n const toolName = tool.name || tool.function?.name || 'unknown'\n const toolInput = tool.input || tool.function?.arguments || '{}'\n const inputStr =\n typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput)\n // \u663E\u793A\u66F4\u591A\u5DE5\u5177\u53C2\u6570\u5185\u5BB9\n const maxToolInputLength = 300\n const displayInput =\n inputStr.length > maxToolInputLength\n ? inputStr.substring(0, maxToolInputLength) + '...'\n : inputStr\n console.log(chalk.dim(` [${index}] ${toolName}: ${displayInput}`))\n })\n }\n\n console.log(\n ` Stop Reason: ${context.response.stop_reason || context.response.finish_reason || 'unknown'}`,\n )\n console.log(chalk.gray('\u2501'.repeat(60)))\n}\n\n// \u65B0\u589E\uFF1A\u7CFB\u7EDF\u63D0\u793A\u6784\u5EFA\u8FC7\u7A0B\u8C03\u8BD5\nexport function logSystemPromptConstruction(construction: {\n basePrompt: string\n mintoContext?: string\n reminders: string[]\n finalPrompt: string\n}) {\n if (!isDebugMode()) return\n\n console.log('\\n' + chalk.yellow('\uD83D\uDCDD SYSTEM PROMPT CONSTRUCTION'))\n console.log(` Base Prompt: ${construction.basePrompt.length} chars`)\n\n if (construction.mintoContext) {\n console.log(` + Minto Context: ${construction.mintoContext.length} chars`)\n }\n\n if (construction.reminders.length > 0) {\n console.log(\n ` + Dynamic Reminders: ${construction.reminders.length} items`,\n )\n construction.reminders.forEach((reminder, index) => {\n console.log(chalk.dim(` [${index}] ${reminder.substring(0, 80)}...`))\n })\n }\n\n console.log(` = Final Length: ${construction.finalPrompt.length} chars`)\n}\n\n// \u65B0\u589E\uFF1A\u4E0A\u4E0B\u6587\u538B\u7F29\u8FC7\u7A0B\u8C03\u8BD5\nexport function logContextCompression(compression: {\n beforeMessages: number\n afterMessages: number\n trigger: string\n preservedFiles: string[]\n compressionRatio: number\n}) {\n if (!isDebugMode()) return\n\n console.log('\\n' + chalk.red('\uD83D\uDDDC\uFE0F CONTEXT COMPRESSION'))\n console.log(` Trigger: ${compression.trigger}`)\n console.log(\n ` Messages: ${compression.beforeMessages} \u2192 ${compression.afterMessages}`,\n )\n console.log(\n ` Compression Ratio: ${(compression.compressionRatio * 100).toFixed(1)}%`,\n )\n\n if (compression.preservedFiles.length > 0) {\n console.log(` Preserved Files: ${compression.preservedFiles.join(', ')}`)\n }\n}\n\n// \u65B0\u589E\uFF1A\u7528\u6237\u53CB\u597D\u7684\u65E5\u5FD7\u663E\u793A\nexport function logUserFriendly(type: string, data: any, requestId?: string) {\n if (!isDebugMode()) return\n\n const timestamp = new Date().toLocaleTimeString()\n let message = ''\n let color = chalk.gray\n let icon = '\u2022'\n\n switch (type) {\n case 'SESSION_START':\n icon = '\uD83D\uDE80'\n color = chalk.green\n message = `Session started with ${data.model || 'default model'}`\n break\n case 'QUERY_START':\n icon = '\uD83D\uDCAD'\n color = chalk.blue\n message = `Processing query: \"${data.query?.substring(0, 50)}${data.query?.length > 50 ? '...' : ''}\"`\n break\n case 'QUERY_PROGRESS':\n icon = '\u23F3'\n color = chalk.yellow\n message = `${data.phase} (${data.elapsed}ms)`\n break\n case 'QUERY_COMPLETE':\n icon = '\u2705'\n color = chalk.green\n message = `Query completed in ${data.duration}ms - Cost: $${data.cost} - ${data.tokens} tokens`\n break\n case 'TOOL_EXECUTION':\n icon = '\uD83D\uDD27'\n color = chalk.cyan\n message = `${data.toolName}: ${data.action} ${data.target ? '\u2192 ' + data.target : ''}`\n break\n case 'ERROR_OCCURRED':\n icon = '\u274C'\n color = chalk.red\n message = `${data.error} ${data.context ? '(' + data.context + ')' : ''}`\n break\n case 'PERFORMANCE_SUMMARY':\n icon = '\uD83D\uDCCA'\n color = chalk.magenta\n message = `Session: ${data.queries} queries, $${data.totalCost}, ${data.avgResponseTime}ms avg`\n break\n default:\n message = JSON.stringify(data)\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId.slice(0, 8)}]`) : ''\n console.log(`${color(`[${timestamp}]`)} ${icon} ${color(message)} ${reqId}`)\n}\n\n// \u521D\u59CB\u5316\u65E5\u5FD7\u7CFB\u7EDF\nexport function initDebugLogger() {\n if (!isDebugMode()) return\n\n debug.info('DEBUG_LOGGER_INIT', {\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n })\n\n // \u663E\u793A\u7EC8\u7AEF\u8F93\u51FA\u8FC7\u6EE4\u4FE1\u606F\n const terminalLevels = isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS).join(', ')\n : Array.from(TERMINAL_LOG_LEVELS).join(', ')\n\n console.log(\n chalk.dim(`[DEBUG] Terminal output filtered to: ${terminalLevels}`),\n )\n console.log(\n chalk.dim(`[DEBUG] Complete logs saved to: ${DEBUG_PATHS.base()}`),\n )\n if (!isDebugVerboseMode()) {\n console.log(\n chalk.dim(\n `[DEBUG] Use --debug-verbose for detailed system logs (FLOW, API, STATE)`,\n ),\n )\n }\n}\n\n// \u65B0\u589E\uFF1A\u9519\u8BEF\u8BCA\u65AD\u548C\u6062\u590D\u5EFA\u8BAE\u7CFB\u7EDF\ninterface ErrorDiagnosis {\n errorType: string\n category:\n | 'NETWORK'\n | 'API'\n | 'PERMISSION'\n | 'CONFIG'\n | 'SYSTEM'\n | 'USER_INPUT'\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'\n description: string\n suggestions: string[]\n debugSteps: string[]\n relatedLogs?: string[]\n}\n\nexport function diagnoseError(error: any, context?: any): ErrorDiagnosis {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n // AbortController \u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('aborted') ||\n errorMessage.includes('AbortController')\n ) {\n return {\n errorType: 'REQUEST_ABORTED',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description:\n 'Request was aborted, often due to user cancellation or timeout',\n suggestions: [\n '\u68C0\u67E5\u662F\u5426\u6309\u4E0B\u4E86 ESC \u952E\u53D6\u6D88\u8BF7\u6C42',\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u7A33\u5B9A',\n '\u9A8C\u8BC1 AbortController \u72B6\u6001: isActive \u548C signal.aborted \u5E94\u8BE5\u4E00\u81F4',\n '\u67E5\u770B\u662F\u5426\u6709\u91CD\u590D\u7684\u8BF7\u6C42\u5BFC\u81F4\u51B2\u7A81',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u6A21\u5F0F\u67E5\u770B\u8BE6\u7EC6\u7684\u8BF7\u6C42\u6D41\u7A0B',\n '\u68C0\u67E5 debug \u65E5\u5FD7\u4E2D\u7684 BINARY_FEEDBACK_* \u4E8B\u4EF6',\n '\u9A8C\u8BC1 REQUEST_START \u548C REQUEST_END \u65E5\u5FD7\u914D\u5BF9',\n '\u67E5\u770B QUERY_ABORTED \u4E8B\u4EF6\u7684\u89E6\u53D1\u539F\u56E0',\n ],\n }\n }\n\n // API \u5BC6\u94A5\u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('api-key') ||\n errorMessage.includes('authentication') ||\n errorMessage.includes('401')\n ) {\n return {\n errorType: 'API_AUTHENTICATION',\n category: 'API',\n severity: 'HIGH',\n description: 'API authentication failed - invalid or missing API key',\n suggestions: [\n '\u8FD0\u884C /login \u91CD\u65B0\u8BBE\u7F6E API \u5BC6\u94A5',\n '\u68C0\u67E5 ~/.minto/ \u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 API \u5BC6\u94A5',\n '\u9A8C\u8BC1 API \u5BC6\u94A5\u662F\u5426\u5DF2\u8FC7\u671F\u6216\u88AB\u64A4\u9500',\n '\u786E\u8BA4\u4F7F\u7528\u7684 provider \u8BBE\u7F6E\u6B63\u786E (anthropic/opendev/bigdream)',\n ],\n debugSteps: [\n '\u68C0\u67E5 CONFIG_LOAD \u65E5\u5FD7\u4E2D\u7684 provider \u548C API \u5BC6\u94A5\u72B6\u6001',\n '\u8FD0\u884C minto doctor \u68C0\u67E5\u7CFB\u7EDF\u5065\u5EB7\u72B6\u6001',\n '\u67E5\u770B API_ERROR \u65E5\u5FD7\u4E86\u89E3\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 minto config \u547D\u4EE4\u67E5\u770B\u5F53\u524D\u914D\u7F6E',\n ],\n }\n }\n\n // \u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\n if (\n errorMessage.includes('ECONNREFUSED') ||\n errorMessage.includes('ENOTFOUND') ||\n errorMessage.includes('timeout')\n ) {\n return {\n errorType: 'NETWORK_CONNECTION',\n category: 'NETWORK',\n severity: 'HIGH',\n description: 'Network connection failed - unable to reach API endpoint',\n suggestions: [\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38',\n '\u786E\u8BA4\u9632\u706B\u5899\u6CA1\u6709\u963B\u6B62\u76F8\u5173\u7AEF\u53E3',\n '\u68C0\u67E5 proxy \u8BBE\u7F6E\u662F\u5426\u6B63\u786E',\n '\u5C1D\u8BD5\u5207\u6362\u5230\u4E0D\u540C\u7684\u7F51\u7EDC\u73AF\u5883',\n '\u9A8C\u8BC1 baseURL \u914D\u7F6E\u662F\u5426\u6B63\u786E',\n ],\n debugSteps: [\n '\u68C0\u67E5 API_REQUEST_START \u548C\u76F8\u5173\u7F51\u7EDC\u65E5\u5FD7',\n '\u67E5\u770B LLM_REQUEST_ERROR \u4E2D\u7684\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 ping \u6216 curl \u6D4B\u8BD5 API \u7AEF\u70B9\u8FDE\u901A\u6027',\n '\u68C0\u67E5\u4F01\u4E1A\u7F51\u7EDC\u662F\u5426\u9700\u8981\u4EE3\u7406\u8BBE\u7F6E',\n ],\n }\n }\n\n // \u6743\u9650\u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('EACCES') ||\n errorMessage.includes('denied')\n ) {\n return {\n errorType: 'PERMISSION_DENIED',\n category: 'PERMISSION',\n severity: 'MEDIUM',\n description: 'Permission denied - insufficient access rights',\n suggestions: [\n '\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u7684\u8BFB\u5199\u6743\u9650',\n '\u786E\u8BA4\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u7CFB\u7EDF\u6743\u9650',\n '\u67E5\u770B\u662F\u5426\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C',\n '\u68C0\u67E5\u5DE5\u5177\u6743\u9650\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B PERMISSION_* \u65E5\u5FD7\u4E86\u89E3\u6743\u9650\u68C0\u67E5\u8FC7\u7A0B',\n '\u68C0\u67E5\u6587\u4EF6\u7CFB\u7EDF\u6743\u9650: ls -la',\n '\u9A8C\u8BC1\u5DE5\u5177\u5BA1\u6279\u72B6\u6001',\n '\u67E5\u770B TOOL_* \u76F8\u5173\u7684\u8C03\u8BD5\u65E5\u5FD7',\n ],\n }\n }\n\n // LLM \u54CD\u5E94\u683C\u5F0F\u9519\u8BEF\n if (\n errorMessage.includes('substring is not a function') ||\n errorMessage.includes('content')\n ) {\n return {\n errorType: 'RESPONSE_FORMAT',\n category: 'API',\n severity: 'MEDIUM',\n description: 'LLM response format mismatch between different providers',\n suggestions: [\n '\u68C0\u67E5\u5F53\u524D\u4F7F\u7528\u7684 provider \u662F\u5426\u4E0E\u671F\u671B\u4E00\u81F4',\n '\u9A8C\u8BC1\u54CD\u5E94\u683C\u5F0F\u5904\u7406\u903B\u8F91',\n '\u786E\u8BA4\u4E0D\u540C provider \u7684\u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u68C0\u67E5\u662F\u5426\u9700\u8981\u66F4\u65B0\u54CD\u5E94\u89E3\u6790\u4EE3\u7801',\n ],\n debugSteps: [\n '\u67E5\u770B LLM_CALL_DEBUG \u4E2D\u7684\u54CD\u5E94\u683C\u5F0F',\n '\u68C0\u67E5 provider \u914D\u7F6E\u548C\u5B9E\u9645\u4F7F\u7528\u7684 API',\n '\u5BF9\u6BD4 Anthropic \u548C OpenAI \u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u9A8C\u8BC1 logLLMInteraction \u51FD\u6570\u7684\u683C\u5F0F\u5904\u7406',\n ],\n }\n }\n\n // \u4E0A\u4E0B\u6587\u7A97\u53E3\u6EA2\u51FA\n if (\n errorMessage.includes('too long') ||\n errorMessage.includes('context') ||\n errorMessage.includes('token')\n ) {\n return {\n errorType: 'CONTEXT_OVERFLOW',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: 'Context window exceeded - conversation too long',\n suggestions: [\n '\u8FD0\u884C /compact \u624B\u52A8\u538B\u7F29\u5BF9\u8BDD\u5386\u53F2',\n '\u68C0\u67E5\u81EA\u52A8\u538B\u7F29\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n '\u51CF\u5C11\u5355\u6B21\u8F93\u5165\u7684\u5185\u5BB9\u957F\u5EA6',\n '\u6E05\u7406\u4E0D\u5FC5\u8981\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F',\n ],\n debugSteps: [\n '\u67E5\u770B AUTO_COMPACT_* \u65E5\u5FD7\u68C0\u67E5\u538B\u7F29\u89E6\u53D1',\n '\u68C0\u67E5 token \u4F7F\u7528\u91CF\u548C\u9608\u503C',\n '\u67E5\u770B CONTEXT_COMPRESSION \u76F8\u5173\u65E5\u5FD7',\n '\u9A8C\u8BC1\u6A21\u578B\u7684\u6700\u5927 token \u9650\u5236',\n ],\n }\n }\n\n // \u914D\u7F6E\u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('config') ||\n (errorMessage.includes('undefined') && context?.configRelated)\n ) {\n return {\n errorType: 'CONFIGURATION',\n category: 'CONFIG',\n severity: 'MEDIUM',\n description: 'Configuration error - missing or invalid settings',\n suggestions: [\n '\u8FD0\u884C minto config \u68C0\u67E5\u914D\u7F6E\u8BBE\u7F6E',\n '\u5220\u9664\u635F\u574F\u7684\u914D\u7F6E\u6587\u4EF6\u91CD\u65B0\u521D\u59CB\u5316',\n '\u68C0\u67E5 JSON \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u662F\u5426\u6B63\u786E',\n '\u9A8C\u8BC1\u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B CONFIG_LOAD \u548C CONFIG_SAVE \u65E5\u5FD7',\n '\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650',\n '\u9A8C\u8BC1 JSON \u683C\u5F0F: cat ~/.minto/config.json | jq',\n '\u67E5\u770B\u914D\u7F6E\u7F13\u5B58\u76F8\u5173\u7684\u8C03\u8BD5\u4FE1\u606F',\n ],\n }\n }\n\n // \u901A\u7528\u9519\u8BEF\u515C\u5E95\n return {\n errorType: 'UNKNOWN',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: `Unexpected error: ${errorMessage}`,\n suggestions: [\n '\u91CD\u65B0\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F',\n '\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u662F\u5426\u5145\u8DB3',\n '\u67E5\u770B\u5B8C\u6574\u7684\u9519\u8BEF\u65E5\u5FD7\u83B7\u53D6\u66F4\u591A\u4FE1\u606F',\n '\u5982\u679C\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u62A5\u544A\u6B64\u9519\u8BEF',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u83B7\u53D6\u8BE6\u7EC6\u65E5\u5FD7',\n '\u68C0\u67E5 error.log \u4E2D\u7684\u5B8C\u6574\u9519\u8BEF\u4FE1\u606F',\n '\u67E5\u770B\u7CFB\u7EDF\u8D44\u6E90\u4F7F\u7528\u60C5\u51B5',\n '\u6536\u96C6\u91CD\u73B0\u6B65\u9AA4\u548C\u73AF\u5883\u4FE1\u606F',\n ],\n relatedLogs: errorStack ? [errorStack] : undefined,\n }\n}\n\nexport function logErrorWithDiagnosis(\n error: any,\n context?: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n const diagnosis = diagnoseError(error, context)\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n // \u8BB0\u5F55\u6807\u51C6\u9519\u8BEF\u65E5\u5FD7\n debug.error(\n 'ERROR_OCCURRED',\n {\n error: errorMessage,\n errorType: diagnosis.errorType,\n category: diagnosis.category,\n severity: diagnosis.severity,\n context,\n },\n requestId,\n )\n\n // \u5728\u7EC8\u7AEF\u663E\u793A\u8BCA\u65AD\u4FE1\u606F\n console.log('\\n' + chalk.red('\uD83D\uDEA8 ERROR DIAGNOSIS'))\n console.log(chalk.gray('\u2501'.repeat(60)))\n\n console.log(chalk.red(`\u274C ${diagnosis.errorType}`))\n console.log(\n chalk.dim(\n `Category: ${diagnosis.category} | Severity: ${diagnosis.severity}`,\n ),\n )\n console.log(`\\n${diagnosis.description}`)\n\n console.log(chalk.yellow('\\n\uD83D\uDCA1 Recovery Suggestions:'))\n diagnosis.suggestions.forEach((suggestion, index) => {\n console.log(` ${index + 1}. ${suggestion}`)\n })\n\n console.log(chalk.cyan('\\n\uD83D\uDD0D Debug Steps:'))\n diagnosis.debugSteps.forEach((step, index) => {\n console.log(` ${index + 1}. ${step}`)\n })\n\n if (diagnosis.relatedLogs && diagnosis.relatedLogs.length > 0) {\n console.log(chalk.magenta('\\n\uD83D\uDCCB Related Information:'))\n diagnosis.relatedLogs.forEach((log, index) => {\n const truncatedLog =\n log.length > 200 ? log.substring(0, 200) + '...' : log\n console.log(chalk.dim(` ${truncatedLog}`))\n })\n }\n\n const debugPath = DEBUG_PATHS.base()\n console.log(chalk.gray(`\\n\uD83D\uDCC1 Complete logs: ${debugPath}`))\n console.log(chalk.gray('\u2501'.repeat(60)))\n}\nexport function getDebugInfo() {\n return {\n isDebugMode: isDebugMode(),\n isVerboseMode: isVerboseMode(),\n isDebugVerboseMode: isDebugVerboseMode(),\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n currentRequest: currentRequest?.id,\n activeRequests: Array.from(activeRequests.keys()),\n terminalLogLevels: isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS)\n : Array.from(TERMINAL_LOG_LEVELS),\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { existsSync, mkdirSync, appendFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport chalk from 'chalk'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { SESSION_ID } from './log'\nimport type { Message } from '@minto-types/conversation'\n\n// \u8C03\u8BD5\u65E5\u5FD7\u7EA7\u522B\nexport enum LogLevel {\n TRACE = 'TRACE',\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n WARN = 'WARN',\n ERROR = 'ERROR',\n FLOW = 'FLOW',\n API = 'API',\n STATE = 'STATE',\n REMINDER = 'REMINDER', // \u65B0\u589E\uFF1A\u7CFB\u7EDF\u63D0\u9192\u4E8B\u4EF6\n}\n\n// \u8C03\u8BD5\u6A21\u5F0F\u68C0\u6D4B\nconst isDebugMode = () =>\n process.argv.includes('--debug') || process.argv.includes('--debug-verbose')\nconst isVerboseMode = () => process.argv.includes('--verbose')\nconst isDebugVerboseMode = () => process.argv.includes('--debug-verbose')\n\n// \u7EC8\u7AEF\u65E5\u5FD7\u7EA7\u522B\u914D\u7F6E - \u663E\u793A\u5173\u952E\u4FE1\u606F\nconst TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.INFO, // \u6DFB\u52A0 INFO \u7EA7\u522B\uFF0C\u663E\u793A\u5173\u952E\u7CFB\u7EDF\u72B6\u6001\n LogLevel.REMINDER, // \u7CFB\u7EDF\u63D0\u9192\u4E8B\u4EF6\uFF0C\u7528\u6237\u5E94\u8BE5\u770B\u5230\n])\n\n// \u5728\u8C03\u8BD5\u8BE6\u7EC6\u6A21\u5F0F\u4E0B\u663E\u793A\u66F4\u591A\u65E5\u5FD7\u7EA7\u522B\nconst DEBUG_VERBOSE_TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.FLOW,\n LogLevel.API,\n LogLevel.STATE,\n LogLevel.INFO,\n LogLevel.REMINDER, // \u7CFB\u7EDF\u63D0\u9192\u5728\u8BE6\u7EC6\u6A21\u5F0F\u4E0B\u4E5F\u663E\u793A\n])\n\n// \u7528\u6237\u53CB\u597D\u7684\u65E5\u5FD7\u7EA7\u522B - \u7B80\u5316\u7684\u9AD8\u7EA7\u65E5\u5FD7\nconst USER_FRIENDLY_LEVELS = new Set([\n 'SESSION_START',\n 'QUERY_START',\n 'QUERY_PROGRESS',\n 'QUERY_COMPLETE',\n 'TOOL_EXECUTION',\n 'ERROR_OCCURRED',\n 'PERFORMANCE_SUMMARY',\n])\n\n// \u542F\u52A8\u65F6\u95F4\u6233\u7528\u4E8E\u6587\u4EF6\u547D\u540D\nconst STARTUP_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-')\nconst REQUEST_START_TIME = Date.now()\n\n// \u8DEF\u5F84\u914D\u7F6E - \u7EDF\u4E00\u4F7F\u7528 ~/.minto \u76EE\u5F55\nconst MINTO_DIR = join(homedir(), '.minto')\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nconst DEBUG_PATHS = {\n base: () => join(MINTO_DIR, getProjectDir(process.cwd()), 'debug'),\n detailed: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-detailed.log`),\n flow: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-flow.log`),\n api: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-api.log`),\n state: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-state.log`),\n}\n\n// \u786E\u4FDD\u8C03\u8BD5\u76EE\u5F55\u5B58\u5728\nfunction ensureDebugDir() {\n const debugDir = DEBUG_PATHS.base()\n if (!existsSync(debugDir)) {\n mkdirSync(debugDir, { recursive: true })\n }\n}\n\n// \u65E5\u5FD7\u6761\u76EE\u63A5\u53E3\ninterface LogEntry {\n timestamp: string\n level: LogLevel\n phase: string\n requestId?: string\n data: any\n elapsed?: number\n}\n\n// \u5F53\u524D\u8BF7\u6C42\u4E0A\u4E0B\u6587\nclass RequestContext {\n public readonly id: string\n public readonly startTime: number\n private phases: Map<string, number> = new Map()\n\n constructor() {\n this.id = randomUUID().slice(0, 8)\n this.startTime = Date.now()\n }\n\n markPhase(phase: string) {\n this.phases.set(phase, Date.now() - this.startTime)\n }\n\n getPhaseTime(phase: string): number {\n return this.phases.get(phase) || 0\n }\n\n getAllPhases(): Record<string, number> {\n return Object.fromEntries(this.phases)\n }\n}\n\n// \u5168\u5C40\u8BF7\u6C42\u4E0A\u4E0B\u6587\u7BA1\u7406\nconst activeRequests = new Map<string, RequestContext>()\nlet currentRequest: RequestContext | null = null\n\n// \u6838\u5FC3\u65E5\u5FD7\u8BB0\u5F55\u51FD\u6570\nfunction writeToFile(filePath: string, entry: LogEntry) {\n if (!isDebugMode()) return\n\n try {\n ensureDebugDir()\n const logLine =\n JSON.stringify(\n {\n ...entry,\n sessionId: SESSION_ID,\n pid: process.pid,\n uptime: Date.now() - REQUEST_START_TIME,\n },\n null,\n 2,\n ) + ',\\n'\n\n appendFileSync(filePath, logLine)\n } catch (error) {\n // \u9759\u9ED8\u5931\u8D25\uFF0C\u907F\u514D\u8C03\u8BD5\u65E5\u5FD7\u5F71\u54CD\u4E3B\u529F\u80FD\n }\n}\n\n// \u65E5\u5FD7\u53BB\u91CD\u673A\u5236\nconst recentLogs = new Map<string, number>()\nconst LOG_DEDUPE_WINDOW_MS = 5000 // 5\u79D2\u5185\u76F8\u540C\u65E5\u5FD7\u89C6\u4E3A\u91CD\u590D\n\n// \u751F\u6210\u65E5\u5FD7\u53BB\u91CD\u952E\nfunction getDedupeKey(level: LogLevel, phase: string, data: any): string {\n // \u5BF9\u4E8E\u914D\u7F6E\u76F8\u5173\u7684\u65E5\u5FD7\uFF0C\u4F7F\u7528\u6587\u4EF6\u8DEF\u5F84\u548C\u64CD\u4F5C\u7C7B\u578B\u4F5C\u4E3A\u952E\n if (phase.startsWith('CONFIG_')) {\n const file = data?.file || ''\n return `${level}:${phase}:${file}`\n }\n\n // \u5BF9\u4E8E\u5176\u4ED6\u65E5\u5FD7\uFF0C\u4F7F\u7528\u9636\u6BB5\u4F5C\u4E3A\u952E\n return `${level}:${phase}`\n}\n\n// \u68C0\u67E5\u662F\u5426\u5E94\u8BE5\u8BB0\u5F55\u65E5\u5FD7\uFF08\u53BB\u91CD\uFF09\nfunction shouldLogWithDedupe(\n level: LogLevel,\n phase: string,\n data: any,\n): boolean {\n const key = getDedupeKey(level, phase, data)\n const now = Date.now()\n const lastLogTime = recentLogs.get(key)\n\n // \u5982\u679C\u662F\u7B2C\u4E00\u6B21\u8BB0\u5F55\uFF0C\u6216\u8005\u8D85\u8FC7\u53BB\u91CD\u65F6\u95F4\u7A97\u53E3\uFF0C\u5219\u5141\u8BB8\u8BB0\u5F55\n if (!lastLogTime || now - lastLogTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.set(key, now)\n\n // \u6E05\u7406\u8FC7\u671F\u7684\u65E5\u5FD7\u8BB0\u5F55\n for (const [oldKey, oldTime] of recentLogs.entries()) {\n if (now - oldTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.delete(oldKey)\n }\n }\n\n return true\n }\n\n return false\n}\nfunction formatMessages(messages: any): string {\n if (Array.isArray(messages)) {\n // \u53EA\u663E\u793A\u6700\u8FD1 5 \u6761\u6D88\u606F\n const recentMessages = messages.slice(-5)\n return recentMessages\n .map((msg, index) => {\n const role = msg.role || 'unknown'\n let content = ''\n\n if (typeof msg.content === 'string') {\n // \u6BCF\u6761\u6D88\u606F\u6700\u957F 300 \u5B57\u7B26\uFF0C\u8D85\u51FA\u7701\u7565\n content =\n msg.content.length > 300\n ? msg.content.substring(0, 300) + '...'\n : msg.content\n } else if (typeof msg.content === 'object') {\n content = '[complex_content]'\n } else {\n content = String(msg.content || '')\n }\n\n const totalIndex = messages.length - recentMessages.length + index\n return `[${totalIndex}] ${chalk.dim(role)}: ${content}`\n })\n .join('\\n ')\n }\n\n if (typeof messages === 'string') {\n try {\n const parsed = JSON.parse(messages)\n if (Array.isArray(parsed)) {\n return formatMessages(parsed) // \u9012\u5F52\u5904\u7406\u89E3\u6790\u540E\u7684\u6570\u7EC4\n }\n } catch {\n // \u5982\u679C\u89E3\u6790\u5931\u8D25\uFF0C\u8FD4\u56DE\u622A\u65AD\u7684\u5B57\u7B26\u4E32\n }\n }\n\n // \u5BF9\u4E8E\u975E\u6D88\u606F\u6570\u7EC4\u7684\u957F\u5B57\u7B26\u4E32\uFF0C\u4E5F\u8FDB\u884C\u622A\u65AD\n if (typeof messages === 'string' && messages.length > 200) {\n return messages.substring(0, 200) + '...'\n }\n\n return typeof messages === 'string' ? messages : JSON.stringify(messages)\n}\n\n// \u5224\u65AD\u662F\u5426\u5E94\u8BE5\u5728\u7EC8\u7AEF\u663E\u793A\u65E5\u5FD7\nfunction shouldShowInTerminal(level: LogLevel): boolean {\n if (!isDebugMode()) return false\n\n // \u5728\u8C03\u8BD5\u8BE6\u7EC6\u6A21\u5F0F\u4E0B\u663E\u793A\u66F4\u591A\u65E5\u5FD7\u7EA7\u522B\n if (isDebugVerboseMode()) {\n return DEBUG_VERBOSE_TERMINAL_LOG_LEVELS.has(level)\n }\n\n // \u9ED8\u8BA4\u53EA\u663E\u793A\u9519\u8BEF\u548C\u8B66\u544A\n return TERMINAL_LOG_LEVELS.has(level)\n}\n\n// \u7EC8\u7AEF\u5F69\u8272\u8F93\u51FA\nfunction logToTerminal(entry: LogEntry) {\n // \u4F7F\u7528\u65B0\u7684\u8FC7\u6EE4\u903B\u8F91\n if (!shouldShowInTerminal(entry.level)) return\n\n const { level, phase, data, requestId, elapsed } = entry\n const timestamp = new Date().toISOString().slice(11, 23) // HH:mm:ss.SSS\n\n let prefix = ''\n let color = chalk.gray\n\n switch (level) {\n case LogLevel.FLOW:\n prefix = '\uD83D\uDD04'\n color = chalk.cyan\n break\n case LogLevel.API:\n prefix = '\uD83C\uDF10'\n color = chalk.yellow\n break\n case LogLevel.STATE:\n prefix = '\uD83D\uDCCA'\n color = chalk.blue\n break\n case LogLevel.ERROR:\n prefix = '\u274C'\n color = chalk.red\n break\n case LogLevel.WARN:\n prefix = '\u26A0\uFE0F'\n color = chalk.yellow\n break\n case LogLevel.INFO:\n prefix = '\u2139\uFE0F'\n color = chalk.green\n break\n case LogLevel.TRACE:\n prefix = '\uD83D\uDCC8'\n color = chalk.magenta\n break\n default:\n prefix = '\uD83D\uDD0D'\n color = chalk.gray\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId}]`) : ''\n const elapsedStr = elapsed !== undefined ? chalk.dim(`+${elapsed}ms`) : ''\n\n // \u7279\u6B8A\u5904\u7406\u4E00\u4E9B\u6570\u636E\u683C\u5F0F\n let dataStr = ''\n if (typeof data === 'object' && data !== null) {\n if (data.messages) {\n // \u683C\u5F0F\u5316\u6D88\u606F\u6570\u7EC4\n const formattedMessages = formatMessages(data.messages)\n dataStr = JSON.stringify(\n {\n ...data,\n messages: `\\n ${formattedMessages}`,\n },\n null,\n 2,\n )\n } else {\n dataStr = JSON.stringify(data, null, 2)\n }\n } else {\n dataStr = typeof data === 'string' ? data : JSON.stringify(data)\n }\n\n console.log(\n `${color(`[${timestamp}]`)} ${prefix} ${color(phase)} ${reqId} ${dataStr} ${elapsedStr}`,\n )\n}\n\n// \u4E3B\u8981\u8C03\u8BD5\u65E5\u5FD7\u51FD\u6570\nexport function debugLog(\n level: LogLevel,\n phase: string,\n data: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n // \u68C0\u67E5\u662F\u5426\u5E94\u8BE5\u8BB0\u5F55\uFF08\u53BB\u91CD\u68C0\u67E5\uFF09\n if (!shouldLogWithDedupe(level, phase, data)) {\n return // \u8DF3\u8FC7\u91CD\u590D\u7684\u65E5\u5FD7\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n phase,\n data,\n requestId: requestId || currentRequest?.id,\n elapsed: currentRequest ? Date.now() - currentRequest.startTime : undefined,\n }\n\n // \u5199\u5165\u5BF9\u5E94\u7684\u65E5\u5FD7\u6587\u4EF6\n writeToFile(DEBUG_PATHS.detailed(), entry)\n\n switch (level) {\n case LogLevel.FLOW:\n writeToFile(DEBUG_PATHS.flow(), entry)\n break\n case LogLevel.API:\n writeToFile(DEBUG_PATHS.api(), entry)\n break\n case LogLevel.STATE:\n writeToFile(DEBUG_PATHS.state(), entry)\n break\n }\n\n // \u7EC8\u7AEF\u8F93\u51FA\uFF08\u4E5F\u4F1A\u88AB\u8FC7\u6EE4\uFF09\n logToTerminal(entry)\n}\n\n// \u4FBF\u6377\u7684\u65E5\u5FD7\u51FD\u6570\nexport const debug = {\n flow: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.FLOW, phase, data, requestId),\n\n api: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.API, phase, data, requestId),\n\n state: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, phase, data, requestId),\n\n info: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.INFO, phase, data, requestId),\n\n warn: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.WARN, phase, data, requestId),\n\n error: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.ERROR, phase, data, requestId),\n\n trace: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.TRACE, phase, data, requestId),\n\n // \u65B0\u589EUI\u76F8\u5173\u7684\u8C03\u8BD5\u51FD\u6570 (\u53EA\u8BB0\u5F55\u5230\u6587\u4EF6\uFF0C\u4E0D\u663E\u793A\u5728\u7EC8\u7AEF)\n ui: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, `UI_${phase}`, data, requestId),\n}\n\n// \u8BF7\u6C42\u751F\u547D\u5468\u671F\u7BA1\u7406\nexport function startRequest(): RequestContext {\n const ctx = new RequestContext()\n currentRequest = ctx\n activeRequests.set(ctx.id, ctx)\n\n debug.flow('REQUEST_START', {\n requestId: ctx.id,\n activeRequests: activeRequests.size,\n })\n\n return ctx\n}\n\nexport function endRequest(ctx?: RequestContext) {\n const request = ctx || currentRequest\n if (!request) return\n\n debug.flow('REQUEST_END', {\n requestId: request.id,\n totalTime: Date.now() - request.startTime,\n phases: request.getAllPhases(),\n })\n\n activeRequests.delete(request.id)\n if (currentRequest === request) {\n currentRequest = null\n }\n}\n\nexport function getCurrentRequest(): RequestContext | null {\n return currentRequest\n}\n\n// \u9636\u6BB5\u6807\u8BB0\u51FD\u6570\nexport function markPhase(phase: string, data?: any) {\n if (!currentRequest) return\n\n currentRequest.markPhase(phase)\n debug.flow(`PHASE_${phase.toUpperCase()}`, {\n requestId: currentRequest.id,\n elapsed: currentRequest.getPhaseTime(phase),\n data,\n })\n}\n\n// \u65B0\u589E\uFF1AReminder \u4E8B\u4EF6\u65E5\u5FD7\u8BB0\u5F55\nexport function logReminderEvent(\n eventType: string,\n reminderData: any,\n agentId?: string,\n) {\n if (!isDebugMode()) return\n\n debug.info('REMINDER_EVENT_TRIGGERED', {\n eventType,\n agentId: agentId || 'default',\n reminderType: reminderData.type || 'unknown',\n reminderCategory: reminderData.category || 'general',\n reminderPriority: reminderData.priority || 'medium',\n contentLength: reminderData.content ? reminderData.content.length : 0,\n timestamp: Date.now(),\n })\n}\n\n// API\u9519\u8BEF\u65E5\u5FD7\u529F\u80FD\nexport function logAPIError(context: {\n model: string\n endpoint: string\n status: number\n error: any\n request?: any\n response?: any\n provider?: string\n}) {\n const errorDir = join(MINTO_DIR, 'logs', 'error', 'api')\n\n // \u786E\u4FDD\u76EE\u5F55\u5B58\u5728\n if (!existsSync(errorDir)) {\n try {\n mkdirSync(errorDir, { recursive: true })\n } catch (err) {\n console.error('Failed to create error log directory:', err)\n return // Exit early if we can't create the directory\n }\n }\n\n // \u751F\u6210\u6587\u4EF6\u540D\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const sanitizedModel = context.model.replace(/[^a-zA-Z0-9-_]/g, '_')\n const filename = `${sanitizedModel}_${timestamp}.log`\n const filepath = join(errorDir, filename)\n\n // \u51C6\u5907\u5B8C\u6574\u7684\u65E5\u5FD7\u5185\u5BB9\uFF08\u6587\u4EF6\u4E2D\u4FDD\u5B58\u6240\u6709\u4FE1\u606F\uFF09\n const fullLogContent = {\n timestamp: new Date().toISOString(),\n sessionId: SESSION_ID,\n requestId: getCurrentRequest()?.id,\n model: context.model,\n provider: context.provider,\n endpoint: context.endpoint,\n status: context.status,\n error: context.error,\n request: context.request, // \u4FDD\u5B58\u5B8C\u6574\u8BF7\u6C42\n response: context.response, // \u4FDD\u5B58\u5B8C\u6574\u54CD\u5E94\n environment: {\n nodeVersion: process.version,\n platform: process.platform,\n cwd: process.cwd(),\n },\n }\n\n // \u5199\u5165\u6587\u4EF6\uFF08\u4FDD\u5B58\u5B8C\u6574\u4FE1\u606F\uFF09\n try {\n appendFileSync(filepath, JSON.stringify(fullLogContent, null, 2) + '\\n')\n appendFileSync(filepath, '='.repeat(80) + '\\n\\n')\n } catch (err) {\n console.error('Failed to write API error log:', err)\n }\n\n // \u5728\u8C03\u8BD5\u6A21\u5F0F\u4E0B\u8BB0\u5F55\u5230\u7CFB\u7EDF\u65E5\u5FD7\n if (isDebugMode()) {\n debug.error('API_ERROR', {\n model: context.model,\n status: context.status,\n error:\n typeof context.error === 'string'\n ? context.error\n : context.error?.message || 'Unknown error',\n endpoint: context.endpoint,\n logFile: filename,\n })\n }\n\n // \u4F18\u96C5\u7684\u7EC8\u7AEF\u663E\u793A\uFF08\u4EC5\u5728verbose\u6A21\u5F0F\u4E0B\uFF09\n if (isVerboseMode() || isDebugVerboseMode()) {\n console.log()\n console.log(chalk.red('\u2501'.repeat(60)))\n console.log(chalk.red.bold('\u26A0\uFE0F API Error'))\n console.log(chalk.red('\u2501'.repeat(60)))\n\n // \u663E\u793A\u5173\u952E\u4FE1\u606F\n console.log(chalk.white(' Model: ') + chalk.yellow(context.model))\n console.log(chalk.white(' Status: ') + chalk.red(context.status))\n\n // \u683C\u5F0F\u5316\u9519\u8BEF\u6D88\u606F\n let errorMessage = 'Unknown error'\n if (typeof context.error === 'string') {\n errorMessage = context.error\n } else if (context.error?.message) {\n errorMessage = context.error.message\n } else if (context.error?.error?.message) {\n errorMessage = context.error.error.message\n }\n\n // \u9519\u8BEF\u6D88\u606F\u6362\u884C\u663E\u793A\n console.log(chalk.white(' Error: ') + chalk.red(errorMessage))\n\n // \u5982\u679C\u6709\u54CD\u5E94\u4F53\uFF0C\u663E\u793A\u683C\u5F0F\u5316\u7684\u54CD\u5E94\n if (context.response) {\n console.log()\n console.log(chalk.gray(' Response:'))\n const responseStr =\n typeof context.response === 'string'\n ? context.response\n : JSON.stringify(context.response, null, 2)\n\n // \u7F29\u8FDB\u663E\u793A\u54CD\u5E94\u5185\u5BB9\n responseStr.split('\\n').forEach(line => {\n console.log(chalk.gray(' ' + line))\n })\n }\n\n console.log()\n console.log(chalk.dim(` \uD83D\uDCC1 Full log: ${filepath}`))\n console.log(chalk.red('\u2501'.repeat(60)))\n console.log()\n }\n}\n\n// \u65B0\u589E\uFF1ALLM \u4EA4\u4E92\u6838\u5FC3\u8C03\u8BD5\u4FE1\u606F\nexport function logLLMInteraction(context: {\n systemPrompt: string\n messages: any[]\n response: any\n usage?: { inputTokens: number; outputTokens: number }\n timing: { start: number; end: number }\n apiFormat?: 'anthropic' | 'openai'\n}) {\n if (!isDebugMode()) return\n\n const duration = context.timing.end - context.timing.start\n\n console.log('\\n' + chalk.blue('\uD83E\uDDE0 LLM CALL DEBUG'))\n console.log(chalk.gray('\u2501'.repeat(60)))\n\n // \u663E\u793A\u4E0A\u4E0B\u6587\u57FA\u672C\u4FE1\u606F\n console.log(chalk.yellow('\uD83D\uDCCA Context Overview:'))\n console.log(` Messages Count: ${context.messages.length}`)\n console.log(` System Prompt Length: ${context.systemPrompt.length} chars`)\n console.log(` Duration: ${duration.toFixed(0)}ms`)\n\n if (context.usage) {\n console.log(\n ` Token Usage: ${context.usage.inputTokens} \u2192 ${context.usage.outputTokens}`,\n )\n }\n\n // \u663E\u793A\u771F\u5B9E\u53D1\u9001\u7ED9 LLM API \u7684 messages\uFF08\u5B8C\u6574\u8FD8\u539FAPI\u8C03\u7528\uFF09\n const apiLabel = context.apiFormat\n ? ` (${context.apiFormat.toUpperCase()})`\n : ''\n console.log(chalk.cyan(`\\n\uD83D\uDCAC Real API Messages${apiLabel} (last 10):`))\n\n // \u8FD9\u91CC\u5C55\u793A\u7684\u662F\u771F\u6B63\u53D1\u9001\u7ED9LLM API\u7684messages\uFF0C\u4E0D\u662F\u5185\u90E8\u5904\u7406\u7684\u7248\u672C\n const recentMessages = context.messages.slice(-10)\n recentMessages.forEach((msg, index) => {\n const globalIndex = context.messages.length - recentMessages.length + index\n const roleColor =\n msg.role === 'user'\n ? 'green'\n : msg.role === 'assistant'\n ? 'blue'\n : msg.role === 'system'\n ? 'yellow'\n : 'gray'\n\n let content = ''\n let isReminder = false\n\n if (typeof msg.content === 'string') {\n // \u68C0\u67E5\u662F\u5426\u662F system-reminder\n if (msg.content.includes('<system-reminder>')) {\n isReminder = true\n // \u63D0\u53D6 reminder \u7684\u6838\u5FC3\u5185\u5BB9\uFF0C\u663E\u793A\u66F4\u591A\u5B57\u7B26\uFF0C\u8BB0\u5F97\u52A0\u7701\u7565\u53F7\n const reminderContent = msg.content\n .replace(/<\\/?system-reminder>/g, '')\n .trim()\n content = `\uD83D\uDD14 ${reminderContent.length > 800 ? reminderContent.substring(0, 800) + '...' : reminderContent}`\n } else {\n // \u589E\u52A0\u666E\u901A\u6D88\u606F\u7684\u663E\u793A\u5B57\u7B26\u6570 - \u7528\u6237\u6D88\u606F\u548C\u7CFB\u7EDF\u6D88\u606F\u663E\u793A\u66F4\u591A\n const maxLength =\n msg.role === 'user' ? 1000 : msg.role === 'system' ? 1200 : 800\n content =\n msg.content.length > maxLength\n ? msg.content.substring(0, maxLength) + '...'\n : msg.content\n }\n } else if (Array.isArray(msg.content)) {\n // Anthropic\u683C\u5F0F\uFF1Acontent\u662F\u5BF9\u8C61\u6570\u7EC4\n const textBlocks = msg.content.filter(\n (block: any) => block.type === 'text',\n )\n const toolBlocks = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (textBlocks.length > 0) {\n const text = textBlocks[0].text || ''\n // Assistant\u6D88\u606F\u663E\u793A\u66F4\u591A\u5185\u5BB9\n const maxLength = msg.role === 'assistant' ? 1000 : 800\n content =\n text.length > maxLength ? text.substring(0, maxLength) + '...' : text\n }\n if (toolBlocks.length > 0) {\n content += ` [+ ${toolBlocks.length} tool calls]`\n }\n if (textBlocks.length === 0 && toolBlocks.length === 0) {\n content = `[${msg.content.length} blocks: ${msg.content.map(b => b.type || 'unknown').join(', ')}]`\n }\n } else {\n content = '[complex_content]'\n }\n\n // \u6839\u636E\u6D88\u606F\u7C7B\u578B\u4F7F\u7528\u4E0D\u540C\u7684\u663E\u793A\u6837\u5F0F - \u66F4\u53CB\u597D\u7684\u89C6\u89C9\u683C\u5F0F\n if (isReminder) {\n console.log(\n ` [${globalIndex}] ${chalk.magenta('\uD83D\uDD14 REMINDER')}: ${chalk.dim(content)}`,\n )\n } else {\n // \u4E3A\u4E0D\u540C\u89D2\u8272\u6DFB\u52A0\u56FE\u6807\n const roleIcon =\n msg.role === 'user'\n ? '\uD83D\uDC64'\n : msg.role === 'assistant'\n ? '\uD83E\uDD16'\n : msg.role === 'system'\n ? '\u2699\uFE0F'\n : '\uD83D\uDCC4'\n console.log(\n ` [${globalIndex}] ${(chalk as any)[roleColor](roleIcon + ' ' + msg.role.toUpperCase())}: ${content}`,\n )\n }\n\n // \u663E\u793A\u5DE5\u5177\u8C03\u7528\u4FE1\u606F\uFF08Anthropic\u683C\u5F0F\uFF09- \u66F4\u6E05\u6670\u7684\u683C\u5F0F\n if (msg.role === 'assistant' && Array.isArray(msg.content)) {\n const toolCalls = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (toolCalls.length > 0) {\n console.log(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${toolCalls.length}): ${toolCalls.map((t: any) => t.name).join(', ')}`,\n ),\n )\n // \u663E\u793A\u6BCF\u4E2A\u5DE5\u5177\u7684\u8BE6\u7EC6\u53C2\u6570\n toolCalls.forEach((tool: any, idx: number) => {\n const inputStr = JSON.stringify(tool.input || {})\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n console.log(\n chalk.dim(` [${idx}] ${tool.name}: ${displayInput}`),\n )\n })\n }\n }\n // OpenAI\u683C\u5F0F\u7684\u5DE5\u5177\u8C03\u7528\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n console.log(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${msg.tool_calls.length}): ${msg.tool_calls.map((t: any) => t.function.name).join(', ')}`,\n ),\n )\n msg.tool_calls.forEach((tool: any, idx: number) => {\n const inputStr = tool.function.arguments || '{}'\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n console.log(\n chalk.dim(` [${idx}] ${tool.function.name}: ${displayInput}`),\n )\n })\n }\n })\n\n // \u663E\u793A LLM \u54CD\u5E94\u6838\u5FC3\u4FE1\u606F - \u66F4\u8BE6\u7EC6\u53CB\u597D\u7684\u683C\u5F0F\n console.log(chalk.magenta('\\n\uD83E\uDD16 LLM Response:'))\n\n // Handle different response formats (Anthropic vs OpenAI)\n let responseContent = ''\n let toolCalls: any[] = []\n\n if (Array.isArray(context.response.content)) {\n // Anthropic format: content is array of blocks\n const textBlocks = context.response.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.content === 'string') {\n // OpenAI format: content might be string\n responseContent = context.response.content\n // Tool calls are separate in OpenAI format\n toolCalls = context.response.tool_calls || []\n } else {\n responseContent = JSON.stringify(context.response.content || '')\n }\n\n // \u663E\u793A\u66F4\u591A\u54CD\u5E94\u5185\u5BB9\n const maxResponseLength = 1000\n const displayContent =\n responseContent.length > maxResponseLength\n ? responseContent.substring(0, maxResponseLength) + '...'\n : responseContent\n console.log(` Content: ${displayContent}`)\n\n if (toolCalls.length > 0) {\n const toolNames = toolCalls.map(\n (t: any) => t.name || t.function?.name || 'unknown',\n )\n console.log(\n chalk.cyan(\n ` \uD83D\uDD27 Tool Calls (${toolCalls.length}): ${toolNames.join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, index: number) => {\n const toolName = tool.name || tool.function?.name || 'unknown'\n const toolInput = tool.input || tool.function?.arguments || '{}'\n const inputStr =\n typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput)\n // \u663E\u793A\u66F4\u591A\u5DE5\u5177\u53C2\u6570\u5185\u5BB9\n const maxToolInputLength = 300\n const displayInput =\n inputStr.length > maxToolInputLength\n ? inputStr.substring(0, maxToolInputLength) + '...'\n : inputStr\n console.log(chalk.dim(` [${index}] ${toolName}: ${displayInput}`))\n })\n }\n\n console.log(\n ` Stop Reason: ${context.response.stop_reason || context.response.finish_reason || 'unknown'}`,\n )\n console.log(chalk.gray('\u2501'.repeat(60)))\n}\n\n// \u65B0\u589E\uFF1A\u7CFB\u7EDF\u63D0\u793A\u6784\u5EFA\u8FC7\u7A0B\u8C03\u8BD5\nexport function logSystemPromptConstruction(construction: {\n basePrompt: string\n mintoContext?: string\n reminders: string[]\n finalPrompt: string\n}) {\n if (!isDebugMode()) return\n\n console.log('\\n' + chalk.yellow('\uD83D\uDCDD SYSTEM PROMPT CONSTRUCTION'))\n console.log(` Base Prompt: ${construction.basePrompt.length} chars`)\n\n if (construction.mintoContext) {\n console.log(` + Minto Context: ${construction.mintoContext.length} chars`)\n }\n\n if (construction.reminders.length > 0) {\n console.log(\n ` + Dynamic Reminders: ${construction.reminders.length} items`,\n )\n construction.reminders.forEach((reminder, index) => {\n console.log(chalk.dim(` [${index}] ${reminder.substring(0, 80)}...`))\n })\n }\n\n console.log(` = Final Length: ${construction.finalPrompt.length} chars`)\n}\n\n// \u65B0\u589E\uFF1A\u4E0A\u4E0B\u6587\u538B\u7F29\u8FC7\u7A0B\u8C03\u8BD5\nexport function logContextCompression(compression: {\n beforeMessages: number\n afterMessages: number\n trigger: string\n preservedFiles: string[]\n compressionRatio: number\n}) {\n if (!isDebugMode()) return\n\n console.log('\\n' + chalk.red('\uD83D\uDDDC\uFE0F CONTEXT COMPRESSION'))\n console.log(` Trigger: ${compression.trigger}`)\n console.log(\n ` Messages: ${compression.beforeMessages} \u2192 ${compression.afterMessages}`,\n )\n console.log(\n ` Compression Ratio: ${(compression.compressionRatio * 100).toFixed(1)}%`,\n )\n\n if (compression.preservedFiles.length > 0) {\n console.log(` Preserved Files: ${compression.preservedFiles.join(', ')}`)\n }\n}\n\n// \u65B0\u589E\uFF1A\u7528\u6237\u53CB\u597D\u7684\u65E5\u5FD7\u663E\u793A\nexport function logUserFriendly(type: string, data: any, requestId?: string) {\n if (!isDebugMode()) return\n\n const timestamp = new Date().toLocaleTimeString()\n let message = ''\n let color = chalk.gray\n let icon = '\u2022'\n\n switch (type) {\n case 'SESSION_START':\n icon = '\uD83D\uDE80'\n color = chalk.green\n message = `Session started with ${data.model || 'default model'}`\n break\n case 'QUERY_START':\n icon = '\uD83D\uDCAD'\n color = chalk.blue\n message = `Processing query: \"${data.query?.substring(0, 50)}${data.query?.length > 50 ? '...' : ''}\"`\n break\n case 'QUERY_PROGRESS':\n icon = '\u23F3'\n color = chalk.yellow\n message = `${data.phase} (${data.elapsed}ms)`\n break\n case 'QUERY_COMPLETE':\n icon = '\u2705'\n color = chalk.green\n message = `Query completed in ${data.duration}ms - Cost: $${data.cost} - ${data.tokens} tokens`\n break\n case 'TOOL_EXECUTION':\n icon = '\uD83D\uDD27'\n color = chalk.cyan\n message = `${data.toolName}: ${data.action} ${data.target ? '\u2192 ' + data.target : ''}`\n break\n case 'ERROR_OCCURRED':\n icon = '\u274C'\n color = chalk.red\n message = `${data.error} ${data.context ? '(' + data.context + ')' : ''}`\n break\n case 'PERFORMANCE_SUMMARY':\n icon = '\uD83D\uDCCA'\n color = chalk.magenta\n message = `Session: ${data.queries} queries, $${data.totalCost}, ${data.avgResponseTime}ms avg`\n break\n default:\n message = JSON.stringify(data)\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId.slice(0, 8)}]`) : ''\n console.log(`${color(`[${timestamp}]`)} ${icon} ${color(message)} ${reqId}`)\n}\n\n// \u521D\u59CB\u5316\u65E5\u5FD7\u7CFB\u7EDF\nexport function initDebugLogger() {\n if (!isDebugMode()) return\n\n debug.info('DEBUG_LOGGER_INIT', {\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n })\n\n // \u663E\u793A\u7EC8\u7AEF\u8F93\u51FA\u8FC7\u6EE4\u4FE1\u606F\n const terminalLevels = isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS).join(', ')\n : Array.from(TERMINAL_LOG_LEVELS).join(', ')\n\n console.log(\n chalk.dim(`[DEBUG] Terminal output filtered to: ${terminalLevels}`),\n )\n console.log(\n chalk.dim(`[DEBUG] Complete logs saved to: ${DEBUG_PATHS.base()}`),\n )\n if (!isDebugVerboseMode()) {\n console.log(\n chalk.dim(\n `[DEBUG] Use --debug-verbose for detailed system logs (FLOW, API, STATE)`,\n ),\n )\n }\n}\n\n// \u65B0\u589E\uFF1A\u9519\u8BEF\u8BCA\u65AD\u548C\u6062\u590D\u5EFA\u8BAE\u7CFB\u7EDF\ninterface ErrorDiagnosis {\n errorType: string\n category:\n | 'NETWORK'\n | 'API'\n | 'PERMISSION'\n | 'CONFIG'\n | 'SYSTEM'\n | 'USER_INPUT'\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'\n description: string\n suggestions: string[]\n debugSteps: string[]\n relatedLogs?: string[]\n}\n\nexport function diagnoseError(error: any, context?: any): ErrorDiagnosis {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n // AbortController \u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('aborted') ||\n errorMessage.includes('AbortController')\n ) {\n return {\n errorType: 'REQUEST_ABORTED',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description:\n 'Request was aborted, often due to user cancellation or timeout',\n suggestions: [\n '\u68C0\u67E5\u662F\u5426\u6309\u4E0B\u4E86 ESC \u952E\u53D6\u6D88\u8BF7\u6C42',\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u7A33\u5B9A',\n '\u9A8C\u8BC1 AbortController \u72B6\u6001: isActive \u548C signal.aborted \u5E94\u8BE5\u4E00\u81F4',\n '\u67E5\u770B\u662F\u5426\u6709\u91CD\u590D\u7684\u8BF7\u6C42\u5BFC\u81F4\u51B2\u7A81',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u6A21\u5F0F\u67E5\u770B\u8BE6\u7EC6\u7684\u8BF7\u6C42\u6D41\u7A0B',\n '\u68C0\u67E5 debug \u65E5\u5FD7\u4E2D\u7684 BINARY_FEEDBACK_* \u4E8B\u4EF6',\n '\u9A8C\u8BC1 REQUEST_START \u548C REQUEST_END \u65E5\u5FD7\u914D\u5BF9',\n '\u67E5\u770B QUERY_ABORTED \u4E8B\u4EF6\u7684\u89E6\u53D1\u539F\u56E0',\n ],\n }\n }\n\n // API \u5BC6\u94A5\u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('api-key') ||\n errorMessage.includes('authentication') ||\n errorMessage.includes('401')\n ) {\n return {\n errorType: 'API_AUTHENTICATION',\n category: 'API',\n severity: 'HIGH',\n description: 'API authentication failed - invalid or missing API key',\n suggestions: [\n '\u8FD0\u884C /login \u91CD\u65B0\u8BBE\u7F6E API \u5BC6\u94A5',\n '\u68C0\u67E5 ~/.minto/ \u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 API \u5BC6\u94A5',\n '\u9A8C\u8BC1 API \u5BC6\u94A5\u662F\u5426\u5DF2\u8FC7\u671F\u6216\u88AB\u64A4\u9500',\n '\u786E\u8BA4\u4F7F\u7528\u7684 provider \u8BBE\u7F6E\u6B63\u786E (anthropic/opendev/bigdream)',\n ],\n debugSteps: [\n '\u68C0\u67E5 CONFIG_LOAD \u65E5\u5FD7\u4E2D\u7684 provider \u548C API \u5BC6\u94A5\u72B6\u6001',\n '\u8FD0\u884C minto doctor \u68C0\u67E5\u7CFB\u7EDF\u5065\u5EB7\u72B6\u6001',\n '\u67E5\u770B API_ERROR \u65E5\u5FD7\u4E86\u89E3\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 minto config \u547D\u4EE4\u67E5\u770B\u5F53\u524D\u914D\u7F6E',\n ],\n }\n }\n\n // \u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\n if (\n errorMessage.includes('ECONNREFUSED') ||\n errorMessage.includes('ENOTFOUND') ||\n errorMessage.includes('timeout')\n ) {\n return {\n errorType: 'NETWORK_CONNECTION',\n category: 'NETWORK',\n severity: 'HIGH',\n description: 'Network connection failed - unable to reach API endpoint',\n suggestions: [\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38',\n '\u786E\u8BA4\u9632\u706B\u5899\u6CA1\u6709\u963B\u6B62\u76F8\u5173\u7AEF\u53E3',\n '\u68C0\u67E5 proxy \u8BBE\u7F6E\u662F\u5426\u6B63\u786E',\n '\u5C1D\u8BD5\u5207\u6362\u5230\u4E0D\u540C\u7684\u7F51\u7EDC\u73AF\u5883',\n '\u9A8C\u8BC1 baseURL \u914D\u7F6E\u662F\u5426\u6B63\u786E',\n ],\n debugSteps: [\n '\u68C0\u67E5 API_REQUEST_START \u548C\u76F8\u5173\u7F51\u7EDC\u65E5\u5FD7',\n '\u67E5\u770B LLM_REQUEST_ERROR \u4E2D\u7684\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 ping \u6216 curl \u6D4B\u8BD5 API \u7AEF\u70B9\u8FDE\u901A\u6027',\n '\u68C0\u67E5\u4F01\u4E1A\u7F51\u7EDC\u662F\u5426\u9700\u8981\u4EE3\u7406\u8BBE\u7F6E',\n ],\n }\n }\n\n // \u6743\u9650\u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('EACCES') ||\n errorMessage.includes('denied')\n ) {\n return {\n errorType: 'PERMISSION_DENIED',\n category: 'PERMISSION',\n severity: 'MEDIUM',\n description: 'Permission denied - insufficient access rights',\n suggestions: [\n '\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u7684\u8BFB\u5199\u6743\u9650',\n '\u786E\u8BA4\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u7CFB\u7EDF\u6743\u9650',\n '\u67E5\u770B\u662F\u5426\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C',\n '\u68C0\u67E5\u5DE5\u5177\u6743\u9650\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B PERMISSION_* \u65E5\u5FD7\u4E86\u89E3\u6743\u9650\u68C0\u67E5\u8FC7\u7A0B',\n '\u68C0\u67E5\u6587\u4EF6\u7CFB\u7EDF\u6743\u9650: ls -la',\n '\u9A8C\u8BC1\u5DE5\u5177\u5BA1\u6279\u72B6\u6001',\n '\u67E5\u770B TOOL_* \u76F8\u5173\u7684\u8C03\u8BD5\u65E5\u5FD7',\n ],\n }\n }\n\n // LLM \u54CD\u5E94\u683C\u5F0F\u9519\u8BEF\n if (\n errorMessage.includes('substring is not a function') ||\n errorMessage.includes('content')\n ) {\n return {\n errorType: 'RESPONSE_FORMAT',\n category: 'API',\n severity: 'MEDIUM',\n description: 'LLM response format mismatch between different providers',\n suggestions: [\n '\u68C0\u67E5\u5F53\u524D\u4F7F\u7528\u7684 provider \u662F\u5426\u4E0E\u671F\u671B\u4E00\u81F4',\n '\u9A8C\u8BC1\u54CD\u5E94\u683C\u5F0F\u5904\u7406\u903B\u8F91',\n '\u786E\u8BA4\u4E0D\u540C provider \u7684\u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u68C0\u67E5\u662F\u5426\u9700\u8981\u66F4\u65B0\u54CD\u5E94\u89E3\u6790\u4EE3\u7801',\n ],\n debugSteps: [\n '\u67E5\u770B LLM_CALL_DEBUG \u4E2D\u7684\u54CD\u5E94\u683C\u5F0F',\n '\u68C0\u67E5 provider \u914D\u7F6E\u548C\u5B9E\u9645\u4F7F\u7528\u7684 API',\n '\u5BF9\u6BD4 Anthropic \u548C OpenAI \u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u9A8C\u8BC1 logLLMInteraction \u51FD\u6570\u7684\u683C\u5F0F\u5904\u7406',\n ],\n }\n }\n\n // \u4E0A\u4E0B\u6587\u7A97\u53E3\u6EA2\u51FA\n if (\n errorMessage.includes('too long') ||\n errorMessage.includes('context') ||\n errorMessage.includes('token')\n ) {\n return {\n errorType: 'CONTEXT_OVERFLOW',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: 'Context window exceeded - conversation too long',\n suggestions: [\n '\u8FD0\u884C /compact \u624B\u52A8\u538B\u7F29\u5BF9\u8BDD\u5386\u53F2',\n '\u68C0\u67E5\u81EA\u52A8\u538B\u7F29\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n '\u51CF\u5C11\u5355\u6B21\u8F93\u5165\u7684\u5185\u5BB9\u957F\u5EA6',\n '\u6E05\u7406\u4E0D\u5FC5\u8981\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F',\n ],\n debugSteps: [\n '\u67E5\u770B AUTO_COMPACT_* \u65E5\u5FD7\u68C0\u67E5\u538B\u7F29\u89E6\u53D1',\n '\u68C0\u67E5 token \u4F7F\u7528\u91CF\u548C\u9608\u503C',\n '\u67E5\u770B CONTEXT_COMPRESSION \u76F8\u5173\u65E5\u5FD7',\n '\u9A8C\u8BC1\u6A21\u578B\u7684\u6700\u5927 token \u9650\u5236',\n ],\n }\n }\n\n // \u914D\u7F6E\u76F8\u5173\u9519\u8BEF\n if (\n errorMessage.includes('config') ||\n (errorMessage.includes('undefined') && context?.configRelated)\n ) {\n return {\n errorType: 'CONFIGURATION',\n category: 'CONFIG',\n severity: 'MEDIUM',\n description: 'Configuration error - missing or invalid settings',\n suggestions: [\n '\u8FD0\u884C minto config \u68C0\u67E5\u914D\u7F6E\u8BBE\u7F6E',\n '\u5220\u9664\u635F\u574F\u7684\u914D\u7F6E\u6587\u4EF6\u91CD\u65B0\u521D\u59CB\u5316',\n '\u68C0\u67E5 JSON \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u662F\u5426\u6B63\u786E',\n '\u9A8C\u8BC1\u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B CONFIG_LOAD \u548C CONFIG_SAVE \u65E5\u5FD7',\n '\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650',\n '\u9A8C\u8BC1 JSON \u683C\u5F0F: cat ~/.minto/config.json | jq',\n '\u67E5\u770B\u914D\u7F6E\u7F13\u5B58\u76F8\u5173\u7684\u8C03\u8BD5\u4FE1\u606F',\n ],\n }\n }\n\n // \u901A\u7528\u9519\u8BEF\u515C\u5E95\n return {\n errorType: 'UNKNOWN',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: `Unexpected error: ${errorMessage}`,\n suggestions: [\n '\u91CD\u65B0\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F',\n '\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u662F\u5426\u5145\u8DB3',\n '\u67E5\u770B\u5B8C\u6574\u7684\u9519\u8BEF\u65E5\u5FD7\u83B7\u53D6\u66F4\u591A\u4FE1\u606F',\n '\u5982\u679C\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u62A5\u544A\u6B64\u9519\u8BEF',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u83B7\u53D6\u8BE6\u7EC6\u65E5\u5FD7',\n '\u68C0\u67E5 error.log \u4E2D\u7684\u5B8C\u6574\u9519\u8BEF\u4FE1\u606F',\n '\u67E5\u770B\u7CFB\u7EDF\u8D44\u6E90\u4F7F\u7528\u60C5\u51B5',\n '\u6536\u96C6\u91CD\u73B0\u6B65\u9AA4\u548C\u73AF\u5883\u4FE1\u606F',\n ],\n relatedLogs: errorStack ? [errorStack] : undefined,\n }\n}\n\nexport function logErrorWithDiagnosis(\n error: any,\n context?: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n const diagnosis = diagnoseError(error, context)\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n // \u8BB0\u5F55\u6807\u51C6\u9519\u8BEF\u65E5\u5FD7\n debug.error(\n 'ERROR_OCCURRED',\n {\n error: errorMessage,\n errorType: diagnosis.errorType,\n category: diagnosis.category,\n severity: diagnosis.severity,\n context,\n },\n requestId,\n )\n\n // \u5728\u7EC8\u7AEF\u663E\u793A\u8BCA\u65AD\u4FE1\u606F\n console.log('\\n' + chalk.red('\uD83D\uDEA8 ERROR DIAGNOSIS'))\n console.log(chalk.gray('\u2501'.repeat(60)))\n\n console.log(chalk.red(`\u274C ${diagnosis.errorType}`))\n console.log(\n chalk.dim(\n `Category: ${diagnosis.category} | Severity: ${diagnosis.severity}`,\n ),\n )\n console.log(`\\n${diagnosis.description}`)\n\n console.log(chalk.yellow('\\n\uD83D\uDCA1 Recovery Suggestions:'))\n diagnosis.suggestions.forEach((suggestion, index) => {\n console.log(` ${index + 1}. ${suggestion}`)\n })\n\n console.log(chalk.cyan('\\n\uD83D\uDD0D Debug Steps:'))\n diagnosis.debugSteps.forEach((step, index) => {\n console.log(` ${index + 1}. ${step}`)\n })\n\n if (diagnosis.relatedLogs && diagnosis.relatedLogs.length > 0) {\n console.log(chalk.magenta('\\n\uD83D\uDCCB Related Information:'))\n diagnosis.relatedLogs.forEach((log, index) => {\n const truncatedLog =\n log.length > 200 ? log.substring(0, 200) + '...' : log\n console.log(chalk.dim(` ${truncatedLog}`))\n })\n }\n\n const debugPath = DEBUG_PATHS.base()\n console.log(chalk.gray(`\\n\uD83D\uDCC1 Complete logs: ${debugPath}`))\n console.log(chalk.gray('\u2501'.repeat(60)))\n}\nexport function getDebugInfo() {\n return {\n isDebugMode: isDebugMode(),\n isVerboseMode: isVerboseMode(),\n isDebugVerboseMode: isDebugVerboseMode(),\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n currentRequest: currentRequest?.id,\n activeRequests: Array.from(activeRequests.keys()),\n terminalLogLevels: isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS)\n : Array.from(TERMINAL_LOG_LEVELS),\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["LogLevel", "toolCalls"]
|
|
7
7
|
}
|
package/dist/utils/env.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/env.ts"],
|
|
4
|
-
"sourcesContent": ["import { execFileNoThrow } from './execFileNoThrow'\nimport { memoize } from 'lodash-es'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { CONFIG_BASE_DIR, CONFIG_FILE } from '@constants/product'\n\n// Base directory for all Minto data files\n// Support MINTO_CONFIG_DIR and CLAUDE_CONFIG_DIR for compatibility\n// Priority: MINTO_CONFIG_DIR > CLAUDE_CONFIG_DIR > ~/.minto\nexport const MINTO_BASE_DIR =\n process.env.MINTO_CONFIG_DIR
|
|
5
|
-
"mappings": "AAAA,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,iBAAiB,mBAAmB;AAKtC,MAAM,iBACX,QAAQ,IAAI,
|
|
4
|
+
"sourcesContent": ["import { execFileNoThrow } from './execFileNoThrow'\nimport { memoize } from 'lodash-es'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { CONFIG_BASE_DIR, CONFIG_FILE } from '@constants/product'\n\n// Base directory for all Minto data files\n// Support MINTO_CONFIG_DIR and CLAUDE_CONFIG_DIR for compatibility\n// Priority: MINTO_CONFIG_DIR > CLAUDE_CONFIG_DIR > ~/.minto\nexport const MINTO_BASE_DIR =\n process.env.MINTO_CONFIG_DIR ??\n process.env.CLAUDE_CONFIG_DIR ??\n join(homedir(), CONFIG_BASE_DIR)\n\n// Config and data paths\n// When using custom config directory, use config.json inside it\n// Otherwise use .minto.json in home directory\nexport const GLOBAL_CONFIG_FILE =\n process.env.MINTO_CONFIG_DIR || process.env.CLAUDE_CONFIG_DIR\n ? join(MINTO_BASE_DIR, 'config.json')\n : join(homedir(), CONFIG_FILE)\n\n// Memory storage directory\nexport const MEMORY_DIR = join(MINTO_BASE_DIR, 'memory')\n\nconst getIsDocker = memoize(async (): Promise<boolean> => {\n // Check for .dockerenv file\n const { code } = await execFileNoThrow('test', ['-f', '/.dockerenv'])\n if (code !== 0) {\n return false\n }\n return process.platform === 'linux'\n})\n\nconst hasInternetAccess = memoize(async (): Promise<boolean> => {\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 1000)\n\n await fetch('http://1.1.1.1', {\n method: 'HEAD',\n signal: controller.signal,\n })\n\n clearTimeout(timeout)\n return true\n } catch {\n return false\n }\n})\n\n// all of these should be immutable\nexport const env = {\n getIsDocker,\n hasInternetAccess,\n isCI: Boolean(process.env.CI),\n platform:\n process.platform === 'win32'\n ? 'windows'\n : process.platform === 'darwin'\n ? 'macos'\n : 'linux',\n nodeVersion: process.version,\n terminal: process.env.TERM_PROGRAM,\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,iBAAiB,mBAAmB;AAKtC,MAAM,iBACX,QAAQ,IAAI,oBACZ,QAAQ,IAAI,qBACZ,KAAK,QAAQ,GAAG,eAAe;AAK1B,MAAM,qBACX,QAAQ,IAAI,oBAAoB,QAAQ,IAAI,oBACxC,KAAK,gBAAgB,aAAa,IAClC,KAAK,QAAQ,GAAG,WAAW;AAG1B,MAAM,aAAa,KAAK,gBAAgB,QAAQ;AAEvD,MAAM,cAAc,QAAQ,YAA8B;AAExD,QAAM,EAAE,KAAK,IAAI,MAAM,gBAAgB,QAAQ,CAAC,MAAM,aAAa,CAAC;AACpE,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,aAAa;AAC9B,CAAC;AAED,MAAM,oBAAoB,QAAQ,YAA8B;AAC9D,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AAEzD,UAAM,MAAM,kBAAkB;AAAA,MAC5B,QAAQ;AAAA,MACR,QAAQ,WAAW;AAAA,IACrB,CAAC;AAED,iBAAa,OAAO;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF,CAAC;AAGM,MAAM,MAAM;AAAA,EACjB;AAAA,EACA;AAAA,EACA,MAAM,QAAQ,QAAQ,IAAI,EAAE;AAAA,EAC5B,UACE,QAAQ,aAAa,UACjB,YACA,QAAQ,aAAa,WACnB,UACA;AAAA,EACR,aAAa,QAAQ;AAAA,EACrB,UAAU,QAAQ,IAAI;AACxB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const EnvSchema = z.object({
|
|
3
|
+
// Minto configuration directories
|
|
4
|
+
MINTO_CONFIG_DIR: z.string().optional(),
|
|
5
|
+
CLAUDE_CONFIG_DIR: z.string().optional(),
|
|
6
|
+
MINTO_SESSION_ID: z.string().optional(),
|
|
7
|
+
// Shell configuration
|
|
8
|
+
MINTO_BASH: z.string().optional(),
|
|
9
|
+
KODE_BASH: z.string().optional(),
|
|
10
|
+
// Legacy compatibility
|
|
11
|
+
// Debug and development
|
|
12
|
+
MINTO_DEBUG_AGENTS: z.string().optional(),
|
|
13
|
+
DEBUG: z.string().optional(),
|
|
14
|
+
// Feature flags and user type
|
|
15
|
+
USER_TYPE: z.enum(["internal", "external", "ant", "SWE_BENCH"]).optional(),
|
|
16
|
+
THINK_TOOL: z.string().optional(),
|
|
17
|
+
MAX_THINKING_TOKENS: z.string().optional().transform((val) => val ? parseInt(val, 10) : void 0),
|
|
18
|
+
// API keys (existence only, not validated for content)
|
|
19
|
+
ANTHROPIC_API_KEY: z.string().optional(),
|
|
20
|
+
OPENAI_API_KEY: z.string().optional(),
|
|
21
|
+
AWS_ACCESS_KEY_ID: z.string().optional(),
|
|
22
|
+
AWS_SECRET_ACCESS_KEY: z.string().optional(),
|
|
23
|
+
AWS_SESSION_TOKEN: z.string().optional(),
|
|
24
|
+
AWS_REGION: z.string().optional(),
|
|
25
|
+
// Cloud platform flags
|
|
26
|
+
CLAUDE_CODE_USE_BEDROCK: z.string().optional(),
|
|
27
|
+
CLAUDE_CODE_USE_VERTEX: z.string().optional(),
|
|
28
|
+
// Proxy configuration
|
|
29
|
+
HTTP_PROXY: z.string().optional(),
|
|
30
|
+
HTTPS_PROXY: z.string().optional(),
|
|
31
|
+
NO_PROXY: z.string().optional(),
|
|
32
|
+
http_proxy: z.string().optional(),
|
|
33
|
+
https_proxy: z.string().optional(),
|
|
34
|
+
no_proxy: z.string().optional(),
|
|
35
|
+
// System
|
|
36
|
+
HOME: z.string().optional(),
|
|
37
|
+
SHELL: z.string().optional(),
|
|
38
|
+
TERM: z.string().optional(),
|
|
39
|
+
PATH: z.string().optional(),
|
|
40
|
+
CI: z.string().optional()
|
|
41
|
+
});
|
|
42
|
+
function parseEnv() {
|
|
43
|
+
const result = EnvSchema.safeParse(process.env);
|
|
44
|
+
if (!result.success) {
|
|
45
|
+
console.error("Environment validation warnings:", result.error.flatten());
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
return result.data;
|
|
49
|
+
}
|
|
50
|
+
const env = parseEnv();
|
|
51
|
+
function isCI() {
|
|
52
|
+
return !!env.CI;
|
|
53
|
+
}
|
|
54
|
+
function isInternalUser() {
|
|
55
|
+
return env.USER_TYPE === "ant" || env.USER_TYPE === "internal";
|
|
56
|
+
}
|
|
57
|
+
function isSweBenchMode() {
|
|
58
|
+
return env.USER_TYPE === "SWE_BENCH";
|
|
59
|
+
}
|
|
60
|
+
function isAgentDebugEnabled() {
|
|
61
|
+
return !!env.MINTO_DEBUG_AGENTS;
|
|
62
|
+
}
|
|
63
|
+
function getCustomBashPath() {
|
|
64
|
+
return env.MINTO_BASH ?? env.KODE_BASH;
|
|
65
|
+
}
|
|
66
|
+
function getMaxThinkingTokens() {
|
|
67
|
+
return env.MAX_THINKING_TOKENS;
|
|
68
|
+
}
|
|
69
|
+
function getProxyUrl() {
|
|
70
|
+
return env.HTTPS_PROXY ?? env.https_proxy ?? env.HTTP_PROXY ?? env.http_proxy;
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
env,
|
|
74
|
+
getCustomBashPath,
|
|
75
|
+
getMaxThinkingTokens,
|
|
76
|
+
getProxyUrl,
|
|
77
|
+
isAgentDebugEnabled,
|
|
78
|
+
isCI,
|
|
79
|
+
isInternalUser,
|
|
80
|
+
isSweBenchMode
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=envConfig.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/envConfig.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Centralized environment variable management with type-safe access.\n * Validates and provides typed access to all environment variables used by Minto.\n */\n\nimport { z } from 'zod'\n\n/**\n * Schema for environment variables.\n * Using optional() since env vars may not be set.\n */\nconst EnvSchema = z.object({\n // Minto configuration directories\n MINTO_CONFIG_DIR: z.string().optional(),\n CLAUDE_CONFIG_DIR: z.string().optional(),\n MINTO_SESSION_ID: z.string().optional(),\n\n // Shell configuration\n MINTO_BASH: z.string().optional(),\n KODE_BASH: z.string().optional(), // Legacy compatibility\n\n // Debug and development\n MINTO_DEBUG_AGENTS: z.string().optional(),\n DEBUG: z.string().optional(),\n\n // Feature flags and user type\n USER_TYPE: z.enum(['internal', 'external', 'ant', 'SWE_BENCH']).optional(),\n THINK_TOOL: z.string().optional(),\n MAX_THINKING_TOKENS: z\n .string()\n .optional()\n .transform(val => (val ? parseInt(val, 10) : undefined)),\n\n // API keys (existence only, not validated for content)\n ANTHROPIC_API_KEY: z.string().optional(),\n OPENAI_API_KEY: z.string().optional(),\n AWS_ACCESS_KEY_ID: z.string().optional(),\n AWS_SECRET_ACCESS_KEY: z.string().optional(),\n AWS_SESSION_TOKEN: z.string().optional(),\n AWS_REGION: z.string().optional(),\n\n // Cloud platform flags\n CLAUDE_CODE_USE_BEDROCK: z.string().optional(),\n CLAUDE_CODE_USE_VERTEX: z.string().optional(),\n\n // Proxy configuration\n HTTP_PROXY: z.string().optional(),\n HTTPS_PROXY: z.string().optional(),\n NO_PROXY: z.string().optional(),\n http_proxy: z.string().optional(),\n https_proxy: z.string().optional(),\n no_proxy: z.string().optional(),\n\n // System\n HOME: z.string().optional(),\n SHELL: z.string().optional(),\n TERM: z.string().optional(),\n PATH: z.string().optional(),\n CI: z.string().optional(),\n})\n\nexport type EnvConfig = z.infer<typeof EnvSchema>\n\n/**\n * Parsed and validated environment configuration.\n * Safe to access - all values are typed and validated.\n */\nfunction parseEnv(): EnvConfig {\n const result = EnvSchema.safeParse(process.env)\n if (!result.success) {\n // Log validation errors but don't throw - use defaults\n console.error('Environment validation warnings:', result.error.flatten())\n return {} as EnvConfig\n }\n return result.data\n}\n\nexport const env = parseEnv()\n\n/**\n * Check if running in CI environment\n */\nexport function isCI(): boolean {\n return !!env.CI\n}\n\n/**\n * Check if user is internal (Anthropic employee)\n */\nexport function isInternalUser(): boolean {\n return env.USER_TYPE === 'ant' || env.USER_TYPE === 'internal'\n}\n\n/**\n * Check if running in SWE_BENCH mode\n */\nexport function isSweBenchMode(): boolean {\n return env.USER_TYPE === 'SWE_BENCH'\n}\n\n/**\n * Check if agent debugging is enabled\n */\nexport function isAgentDebugEnabled(): boolean {\n return !!env.MINTO_DEBUG_AGENTS\n}\n\n/**\n * Get the custom bash path if configured\n */\nexport function getCustomBashPath(): string | undefined {\n return env.MINTO_BASH ?? env.KODE_BASH\n}\n\n/**\n * Get maximum thinking tokens if configured\n */\nexport function getMaxThinkingTokens(): number | undefined {\n return env.MAX_THINKING_TOKENS\n}\n\n/**\n * Get proxy URL for HTTP requests\n */\nexport function getProxyUrl(): string | undefined {\n return env.HTTPS_PROXY ?? env.https_proxy ?? env.HTTP_PROXY ?? env.http_proxy\n}\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,SAAS;AAMlB,MAAM,YAAY,EAAE,OAAO;AAAA;AAAA,EAEzB,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAGtC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA,EAG/B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG3B,WAAW,EAAE,KAAK,CAAC,YAAY,YAAY,OAAO,WAAW,CAAC,EAAE,SAAS;AAAA,EACzE,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,qBAAqB,EAClB,OAAO,EACP,SAAS,EACT,UAAU,SAAQ,MAAM,SAAS,KAAK,EAAE,IAAI,MAAU;AAAA;AAAA,EAGzD,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,uBAAuB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAGhC,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7C,wBAAwB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG5C,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG9B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,IAAI,EAAE,OAAO,EAAE,SAAS;AAC1B,CAAC;AAQD,SAAS,WAAsB;AAC7B,QAAM,SAAS,UAAU,UAAU,QAAQ,GAAG;AAC9C,MAAI,CAAC,OAAO,SAAS;AAEnB,YAAQ,MAAM,oCAAoC,OAAO,MAAM,QAAQ,CAAC;AACxE,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO;AAChB;AAEO,MAAM,MAAM,SAAS;AAKrB,SAAS,OAAgB;AAC9B,SAAO,CAAC,CAAC,IAAI;AACf;AAKO,SAAS,iBAA0B;AACxC,SAAO,IAAI,cAAc,SAAS,IAAI,cAAc;AACtD;AAKO,SAAS,iBAA0B;AACxC,SAAO,IAAI,cAAc;AAC3B;AAKO,SAAS,sBAA+B;AAC7C,SAAO,CAAC,CAAC,IAAI;AACf;AAKO,SAAS,oBAAwC;AACtD,SAAO,IAAI,cAAc,IAAI;AAC/B;AAKO,SAAS,uBAA2C;AACzD,SAAO,IAAI;AACb;AAKO,SAAS,cAAkC;AAChD,SAAO,IAAI,eAAe,IAAI,eAAe,IAAI,cAAc,IAAI;AACrE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { logError } from "./log.js";
|
|
2
|
+
function getErrorMessage(error) {
|
|
3
|
+
if (error instanceof Error) {
|
|
4
|
+
return error.message;
|
|
5
|
+
}
|
|
6
|
+
if (typeof error === "string") {
|
|
7
|
+
return error;
|
|
8
|
+
}
|
|
9
|
+
return String(error);
|
|
10
|
+
}
|
|
11
|
+
function isAbortError(error) {
|
|
12
|
+
if (error instanceof Error) {
|
|
13
|
+
return error.name === "AbortError" || error.message.includes("aborted") || error.message.includes("abort");
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
function isTimeoutError(error) {
|
|
18
|
+
if (error instanceof Error) {
|
|
19
|
+
return error.name === "TimeoutError" || error.message.includes("timeout") || error.message.includes("timed out");
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
async function safeCleanup(name, fn) {
|
|
24
|
+
try {
|
|
25
|
+
await fn();
|
|
26
|
+
} catch (error) {
|
|
27
|
+
logError(new Error(`Cleanup failed [${name}]: ${getErrorMessage(error)}`));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function safeCleanupSync(name, fn) {
|
|
31
|
+
try {
|
|
32
|
+
fn();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
logError(new Error(`Cleanup failed [${name}]: ${getErrorMessage(error)}`));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function withErrorLogging(name, fn) {
|
|
38
|
+
return ((...args) => {
|
|
39
|
+
try {
|
|
40
|
+
const result = fn(...args);
|
|
41
|
+
if (result instanceof Promise) {
|
|
42
|
+
return result.catch((error) => {
|
|
43
|
+
logError(new Error(`[${name}]: ${getErrorMessage(error)}`));
|
|
44
|
+
throw error;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
logError(new Error(`[${name}]: ${getErrorMessage(error)}`));
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function withSilentErrorLogging(name, fn) {
|
|
55
|
+
return async (...args) => {
|
|
56
|
+
try {
|
|
57
|
+
await fn(...args);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
logError(new Error(`[${name}]: ${getErrorMessage(error)}`));
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function safeEventHandler(name, handler) {
|
|
64
|
+
return (event) => {
|
|
65
|
+
try {
|
|
66
|
+
const result = handler(event);
|
|
67
|
+
if (result instanceof Promise) {
|
|
68
|
+
result.catch((error) => {
|
|
69
|
+
logError(
|
|
70
|
+
new Error(`Event handler [${name}]: ${getErrorMessage(error)}`)
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
logError(new Error(`Event handler [${name}]: ${getErrorMessage(error)}`));
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
getErrorMessage,
|
|
81
|
+
isAbortError,
|
|
82
|
+
isTimeoutError,
|
|
83
|
+
safeCleanup,
|
|
84
|
+
safeCleanupSync,
|
|
85
|
+
safeEventHandler,
|
|
86
|
+
withErrorLogging,
|
|
87
|
+
withSilentErrorLogging
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=errorHandling.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/errorHandling.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Error handling utilities for consistent error management.\n * Provides safe cleanup patterns and error logging wrappers.\n */\n\nimport { logError } from './log'\n\n/**\n * Extracts error message from unknown error types.\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message\n }\n if (typeof error === 'string') {\n return error\n }\n return String(error)\n}\n\n/**\n * Checks if an error is an abort error (from AbortController).\n */\nexport function isAbortError(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.name === 'AbortError' ||\n error.message.includes('aborted') ||\n error.message.includes('abort')\n )\n }\n return false\n}\n\n/**\n * Checks if an error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.name === 'TimeoutError' ||\n error.message.includes('timeout') ||\n error.message.includes('timed out')\n )\n }\n return false\n}\n\n/**\n * Safely executes a cleanup operation, logging but not throwing errors.\n * Use for cleanup code in finally blocks or shutdown sequences.\n */\nexport async function safeCleanup(\n name: string,\n fn: () => void | Promise<void>,\n): Promise<void> {\n try {\n await fn()\n } catch (error) {\n logError(new Error(`Cleanup failed [${name}]: ${getErrorMessage(error)}`))\n }\n}\n\n/**\n * Synchronous version of safeCleanup for non-async operations.\n */\nexport function safeCleanupSync(name: string, fn: () => void): void {\n try {\n fn()\n } catch (error) {\n logError(new Error(`Cleanup failed [${name}]: ${getErrorMessage(error)}`))\n }\n}\n\n/**\n * Wraps a function to ensure all errors are logged.\n * Useful for callbacks and event handlers where errors might be swallowed.\n */\nexport function withErrorLogging<T extends (...args: never[]) => unknown>(\n name: string,\n fn: T,\n): T {\n return ((...args: Parameters<T>) => {\n try {\n const result = fn(...args)\n if (result instanceof Promise) {\n return result.catch(error => {\n logError(new Error(`[${name}]: ${getErrorMessage(error)}`))\n throw error\n })\n }\n return result\n } catch (error) {\n logError(new Error(`[${name}]: ${getErrorMessage(error)}`))\n throw error\n }\n }) as T\n}\n\n/**\n * Wraps an async function to catch and log errors without rethrowing.\n * Useful for fire-and-forget operations.\n */\nexport function withSilentErrorLogging<\n T extends (...args: never[]) => Promise<unknown>,\n>(name: string, fn: T): (...args: Parameters<T>) => Promise<void> {\n return async (...args: Parameters<T>) => {\n try {\n await fn(...args)\n } catch (error) {\n logError(new Error(`[${name}]: ${getErrorMessage(error)}`))\n }\n }\n}\n\n/**\n * Creates a safe wrapper for event handlers that logs errors.\n */\nexport function safeEventHandler<E>(\n name: string,\n handler: (event: E) => void | Promise<void>,\n): (event: E) => void {\n return (event: E) => {\n try {\n const result = handler(event)\n if (result instanceof Promise) {\n result.catch(error => {\n logError(\n new Error(`Event handler [${name}]: ${getErrorMessage(error)}`),\n )\n })\n }\n } catch (error) {\n logError(new Error(`Event handler [${name}]: ${getErrorMessage(error)}`))\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,gBAAgB;AAKlB,SAAS,gBAAgB,OAAwB;AACtD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAKO,SAAS,aAAa,OAAyB;AACpD,MAAI,iBAAiB,OAAO;AAC1B,WACE,MAAM,SAAS,gBACf,MAAM,QAAQ,SAAS,SAAS,KAChC,MAAM,QAAQ,SAAS,OAAO;AAAA,EAElC;AACA,SAAO;AACT;AAKO,SAAS,eAAe,OAAyB;AACtD,MAAI,iBAAiB,OAAO;AAC1B,WACE,MAAM,SAAS,kBACf,MAAM,QAAQ,SAAS,SAAS,KAChC,MAAM,QAAQ,SAAS,WAAW;AAAA,EAEtC;AACA,SAAO;AACT;AAMA,eAAsB,YACpB,MACA,IACe;AACf,MAAI;AACF,UAAM,GAAG;AAAA,EACX,SAAS,OAAO;AACd,aAAS,IAAI,MAAM,mBAAmB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE,CAAC;AAAA,EAC3E;AACF;AAKO,SAAS,gBAAgB,MAAc,IAAsB;AAClE,MAAI;AACF,OAAG;AAAA,EACL,SAAS,OAAO;AACd,aAAS,IAAI,MAAM,mBAAmB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE,CAAC;AAAA,EAC3E;AACF;AAMO,SAAS,iBACd,MACA,IACG;AACH,UAAQ,IAAI,SAAwB;AAClC,QAAI;AACF,YAAM,SAAS,GAAG,GAAG,IAAI;AACzB,UAAI,kBAAkB,SAAS;AAC7B,eAAO,OAAO,MAAM,WAAS;AAC3B,mBAAS,IAAI,MAAM,IAAI,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE,CAAC;AAC1D,gBAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,eAAS,IAAI,MAAM,IAAI,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE,CAAC;AAC1D,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAMO,SAAS,uBAEd,MAAc,IAAkD;AAChE,SAAO,UAAU,SAAwB;AACvC,QAAI;AACF,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB,SAAS,OAAO;AACd,eAAS,IAAI,MAAM,IAAI,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAKO,SAAS,iBACd,MACA,SACoB;AACpB,SAAO,CAAC,UAAa;AACnB,QAAI;AACF,YAAM,SAAS,QAAQ,KAAK;AAC5B,UAAI,kBAAkB,SAAS;AAC7B,eAAO,MAAM,WAAS;AACpB;AAAA,YACE,IAAI,MAAM,kBAAkB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE;AAAA,UAChE;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,eAAS,IAAI,MAAM,kBAAkB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE,CAAC;AAAA,IAC1E;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/expertChatStorage.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\n\n/**\n * Expert Chat Session Storage - \u6781\u7B80\u7248\n * \u5B58\u50A8\u7B26\u5408OpenAI\u683C\u5F0F\u7684messages\u5386\u53F2\n */\n\nexport interface ChatMessage {\n role: 'user' | 'assistant'\n content: string\n}\n\nexport interface ExpertChatSession {\n sessionId: string\n expertModel: string\n messages: ChatMessage[]\n createdAt: number\n lastUpdated: number\n}\n\n/**\n * \u83B7\u53D6\u4E13\u5BB6\u804A\u5929\u5B58\u50A8\u76EE\u5F55\n */\nfunction getExpertChatDirectory(): string {\n const configDir
|
|
5
|
-
"mappings": "AAAA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAuB3B,SAAS,yBAAiC;AACxC,QAAM,
|
|
4
|
+
"sourcesContent": ["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\n\n/**\n * Expert Chat Session Storage - \u6781\u7B80\u7248\n * \u5B58\u50A8\u7B26\u5408OpenAI\u683C\u5F0F\u7684messages\u5386\u53F2\n */\n\nexport interface ChatMessage {\n role: 'user' | 'assistant'\n content: string\n}\n\nexport interface ExpertChatSession {\n sessionId: string\n expertModel: string\n messages: ChatMessage[]\n createdAt: number\n lastUpdated: number\n}\n\n/**\n * \u83B7\u53D6\u4E13\u5BB6\u804A\u5929\u5B58\u50A8\u76EE\u5F55\n */\nfunction getExpertChatDirectory(): string {\n const configDir = process.env.MINTO_CONFIG_DIR ?? join(homedir(), '.minto')\n const expertChatDir = join(configDir, 'expert-chats')\n\n if (!existsSync(expertChatDir)) {\n mkdirSync(expertChatDir, { recursive: true })\n }\n\n return expertChatDir\n}\n\n/**\n * \u83B7\u53D6\u4F1A\u8BDD\u6587\u4EF6\u8DEF\u5F84 - \u4F7F\u7528 sessionId.json \u683C\u5F0F\n */\nfunction getSessionFilePath(sessionId: string): string {\n return join(getExpertChatDirectory(), `${sessionId}.json`)\n}\n\n/**\n * \u521B\u5EFA\u65B0\u7684\u4E13\u5BB6\u804A\u5929\u4F1A\u8BDD\n */\nexport function createExpertChatSession(\n expertModel: string,\n): ExpertChatSession {\n const sessionId = randomUUID().slice(0, 5)\n const session: ExpertChatSession = {\n sessionId,\n expertModel,\n messages: [],\n createdAt: Date.now(),\n lastUpdated: Date.now(),\n }\n\n saveExpertChatSession(session)\n return session\n}\n\n/**\n * \u52A0\u8F7D\u73B0\u6709\u4E13\u5BB6\u804A\u5929\u4F1A\u8BDD\n */\nexport function loadExpertChatSession(\n sessionId: string,\n): ExpertChatSession | null {\n const filePath = getSessionFilePath(sessionId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as ExpertChatSession\n } catch (error) {\n console.error(`Failed to load expert chat session ${sessionId}:`, error)\n return null\n }\n}\n\n/**\n * \u4FDD\u5B58\u4E13\u5BB6\u804A\u5929\u4F1A\u8BDD\n */\nexport function saveExpertChatSession(session: ExpertChatSession): void {\n const filePath = getSessionFilePath(session.sessionId)\n\n try {\n session.lastUpdated = Date.now()\n writeFileSync(filePath, JSON.stringify(session, null, 2), 'utf-8')\n } catch (error) {\n console.error(\n `Failed to save expert chat session ${session.sessionId}:`,\n error,\n )\n throw error\n }\n}\n\n/**\n * \u6DFB\u52A0\u6D88\u606F\u5230\u4F1A\u8BDD\n */\nexport function addMessageToSession(\n sessionId: string,\n role: 'user' | 'assistant',\n content: string,\n): ExpertChatSession | null {\n const session = loadExpertChatSession(sessionId)\n if (!session) {\n return null\n }\n\n session.messages.push({ role, content })\n saveExpertChatSession(session)\n\n return session\n}\n\n/**\n * \u83B7\u53D6\u4F1A\u8BDD\u7684\u6D88\u606F\u5386\u53F2 - \u8FD4\u56DEOpenAI\u683C\u5F0F\n */\nexport function getSessionMessages(sessionId: string): ChatMessage[] {\n const session = loadExpertChatSession(sessionId)\n return session?.messages || []\n}\n\n/**\n * \u751F\u6210\u65B0\u7684\u4F1A\u8BDDID\n */\nexport function generateSessionId(): string {\n return randomUUID().slice(0, 5)\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAuB3B,SAAS,yBAAiC;AACxC,QAAM,YAAY,QAAQ,IAAI,oBAAoB,KAAK,QAAQ,GAAG,QAAQ;AAC1E,QAAM,gBAAgB,KAAK,WAAW,cAAc;AAEpD,MAAI,CAAC,WAAW,aAAa,GAAG;AAC9B,cAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAEA,SAAO;AACT;AAKA,SAAS,mBAAmB,WAA2B;AACrD,SAAO,KAAK,uBAAuB,GAAG,GAAG,SAAS,OAAO;AAC3D;AAKO,SAAS,wBACd,aACmB;AACnB,QAAM,YAAY,WAAW,EAAE,MAAM,GAAG,CAAC;AACzC,QAAM,UAA6B;AAAA,IACjC;AAAA,IACA;AAAA,IACA,UAAU,CAAC;AAAA,IACX,WAAW,KAAK,IAAI;AAAA,IACpB,aAAa,KAAK,IAAI;AAAA,EACxB;AAEA,wBAAsB,OAAO;AAC7B,SAAO;AACT;AAKO,SAAS,sBACd,WAC0B;AAC1B,QAAM,WAAW,mBAAmB,SAAS;AAE7C,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,sCAAsC,SAAS,KAAK,KAAK;AACvE,WAAO;AAAA,EACT;AACF;AAKO,SAAS,sBAAsB,SAAkC;AACtE,QAAM,WAAW,mBAAmB,QAAQ,SAAS;AAErD,MAAI;AACF,YAAQ,cAAc,KAAK,IAAI;AAC/B,kBAAc,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAAA,EACnE,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,sCAAsC,QAAQ,SAAS;AAAA,MACvD;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAKO,SAAS,oBACd,WACA,MACA,SAC0B;AAC1B,QAAM,UAAU,sBAAsB,SAAS;AAC/C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,UAAQ,SAAS,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,wBAAsB,OAAO;AAE7B,SAAO;AACT;AAKO,SAAS,mBAAmB,WAAkC;AACnE,QAAM,UAAU,sBAAsB,SAAS;AAC/C,SAAO,SAAS,YAAY,CAAC;AAC/B;AAKO,SAAS,oBAA4B;AAC1C,SAAO,WAAW,EAAE,MAAM,GAAG,CAAC;AAChC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|