newcraw 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +692 -0
- package/README.zh-CN.md +338 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-74GZVSMY.js +42 -0
- package/dist/REPL-74GZVSMY.js.map +7 -0
- package/dist/acp-A55ZRIPP.js +1357 -0
- package/dist/acp-A55ZRIPP.js.map +7 -0
- package/dist/agentsValidate-XWFIEHJ2.js +373 -0
- package/dist/agentsValidate-XWFIEHJ2.js.map +7 -0
- package/dist/ask-4ACYU23S.js +126 -0
- package/dist/ask-4ACYU23S.js.map +7 -0
- package/dist/autoUpdater-O2WHHSGP.js +17 -0
- package/dist/autoUpdater-O2WHHSGP.js.map +7 -0
- package/dist/chunk-2UO3BFZH.js +16 -0
- package/dist/chunk-2UO3BFZH.js.map +7 -0
- package/dist/chunk-3C73U2IU.js +2970 -0
- package/dist/chunk-3C73U2IU.js.map +7 -0
- package/dist/chunk-3U5X4VWP.js +2613 -0
- package/dist/chunk-3U5X4VWP.js.map +7 -0
- package/dist/chunk-755HIAI3.js +95 -0
- package/dist/chunk-755HIAI3.js.map +7 -0
- package/dist/chunk-7ZFLZNOW.js +21 -0
- package/dist/chunk-7ZFLZNOW.js.map +7 -0
- package/dist/chunk-A44DGORI.js +49 -0
- package/dist/chunk-A44DGORI.js.map +7 -0
- package/dist/chunk-AXWJI6N5.js +11 -0
- package/dist/chunk-AXWJI6N5.js.map +7 -0
- package/dist/chunk-B26ZUMJI.js +515 -0
- package/dist/chunk-B26ZUMJI.js.map +7 -0
- package/dist/chunk-BHNQGSLO.js +96 -0
- package/dist/chunk-BHNQGSLO.js.map +7 -0
- package/dist/chunk-BUI6KGVA.js +164 -0
- package/dist/chunk-BUI6KGVA.js.map +7 -0
- package/dist/chunk-DY5D4SS7.js +936 -0
- package/dist/chunk-DY5D4SS7.js.map +7 -0
- package/dist/chunk-EENI5HG7.js +498 -0
- package/dist/chunk-EENI5HG7.js.map +7 -0
- package/dist/chunk-EXPWPWA4.js +654 -0
- package/dist/chunk-EXPWPWA4.js.map +7 -0
- package/dist/chunk-FHOCKJOW.js +766 -0
- package/dist/chunk-FHOCKJOW.js.map +7 -0
- package/dist/chunk-GPKVTIYJ.js +191 -0
- package/dist/chunk-GPKVTIYJ.js.map +7 -0
- package/dist/chunk-H5BCUDEN.js +794 -0
- package/dist/chunk-H5BCUDEN.js.map +7 -0
- package/dist/chunk-INJSFEKL.js +47 -0
- package/dist/chunk-INJSFEKL.js.map +7 -0
- package/dist/chunk-JX5ZQYTQ.js +12 -0
- package/dist/chunk-JX5ZQYTQ.js.map +7 -0
- package/dist/chunk-KQSHIOZK.js +24 -0
- package/dist/chunk-KQSHIOZK.js.map +7 -0
- package/dist/chunk-L6WKZEK4.js +1609 -0
- package/dist/chunk-L6WKZEK4.js.map +7 -0
- package/dist/chunk-LC4CL3YJ.js +124 -0
- package/dist/chunk-LC4CL3YJ.js.map +7 -0
- package/dist/chunk-MXSB7IOZ.js +1097 -0
- package/dist/chunk-MXSB7IOZ.js.map +7 -0
- package/dist/chunk-N5OHRWG2.js +249 -0
- package/dist/chunk-N5OHRWG2.js.map +7 -0
- package/dist/chunk-NQE3GGE3.js +19 -0
- package/dist/chunk-NQE3GGE3.js.map +7 -0
- package/dist/chunk-QF6YDTME.js +139 -0
- package/dist/chunk-QF6YDTME.js.map +7 -0
- package/dist/chunk-QTX7AJFQ.js +240 -0
- package/dist/chunk-QTX7AJFQ.js.map +7 -0
- package/dist/chunk-S3ZAJPYZ.js +515 -0
- package/dist/chunk-S3ZAJPYZ.js.map +7 -0
- package/dist/chunk-S5Y5IF2H.js +735 -0
- package/dist/chunk-S5Y5IF2H.js.map +7 -0
- package/dist/chunk-SBE6Y327.js +836 -0
- package/dist/chunk-SBE6Y327.js.map +7 -0
- package/dist/chunk-T25Z3JMG.js +17 -0
- package/dist/chunk-T25Z3JMG.js.map +7 -0
- package/dist/chunk-T6VKT5FR.js +196 -0
- package/dist/chunk-T6VKT5FR.js.map +7 -0
- package/dist/chunk-TSGGSPYD.js +151 -0
- package/dist/chunk-TSGGSPYD.js.map +7 -0
- package/dist/chunk-TY3CCSAT.js +24 -0
- package/dist/chunk-TY3CCSAT.js.map +7 -0
- package/dist/chunk-U224EQOS.js +34 -0
- package/dist/chunk-U224EQOS.js.map +7 -0
- package/dist/chunk-U7S4MEYP.js +95 -0
- package/dist/chunk-U7S4MEYP.js.map +7 -0
- package/dist/chunk-ULVAAZ2U.js +30517 -0
- package/dist/chunk-ULVAAZ2U.js.map +7 -0
- package/dist/chunk-WWLFALT7.js +128 -0
- package/dist/chunk-WWLFALT7.js.map +7 -0
- package/dist/chunk-XJQATPV7.js +23 -0
- package/dist/chunk-XJQATPV7.js.map +7 -0
- package/dist/chunk-XMGUQHMF.js +72 -0
- package/dist/chunk-XMGUQHMF.js.map +7 -0
- package/dist/chunk-XOMW5QTV.js +472 -0
- package/dist/chunk-XOMW5QTV.js.map +7 -0
- package/dist/chunk-Y7VZUSIM.js +1256 -0
- package/dist/chunk-Y7VZUSIM.js.map +7 -0
- package/dist/chunk-YVNBXMIP.js +511 -0
- package/dist/chunk-YVNBXMIP.js.map +7 -0
- package/dist/chunk-YYPJWXSA.js +145 -0
- package/dist/chunk-YYPJWXSA.js.map +7 -0
- package/dist/cli-BW34VKCN.js +3917 -0
- package/dist/cli-BW34VKCN.js.map +7 -0
- package/dist/commands-4CNZZBTE.js +46 -0
- package/dist/commands-4CNZZBTE.js.map +7 -0
- package/dist/config-XKRCXCSS.js +81 -0
- package/dist/config-XKRCXCSS.js.map +7 -0
- package/dist/context-T5CR3RP6.js +30 -0
- package/dist/context-T5CR3RP6.js.map +7 -0
- package/dist/costTracker-2G3ZI2JF.js +19 -0
- package/dist/costTracker-2G3ZI2JF.js.map +7 -0
- package/dist/customCommands-OCUMXZDN.js +25 -0
- package/dist/customCommands-OCUMXZDN.js.map +7 -0
- package/dist/env-DYDNFB4D.js +22 -0
- package/dist/env-DYDNFB4D.js.map +7 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-KTGFX2BE.js +13 -0
- package/dist/kodeAgentSessionId-KTGFX2BE.js.map +7 -0
- package/dist/kodeAgentSessionLoad-ZKR2VGHO.js +18 -0
- package/dist/kodeAgentSessionLoad-ZKR2VGHO.js.map +7 -0
- package/dist/kodeAgentSessionResume-NFZCTIBZ.js +16 -0
- package/dist/kodeAgentSessionResume-NFZCTIBZ.js.map +7 -0
- package/dist/kodeAgentStreamJson-VIXFTYL5.js +13 -0
- package/dist/kodeAgentStreamJson-VIXFTYL5.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js +131 -0
- package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-SI5C7AAD.js +10 -0
- package/dist/kodeAgentStructuredStdio-SI5C7AAD.js.map +7 -0
- package/dist/kodeHooks-5RXJRDCY.js +36 -0
- package/dist/kodeHooks-5RXJRDCY.js.map +7 -0
- package/dist/llm-QJA3QMXR.js +3118 -0
- package/dist/llm-QJA3QMXR.js.map +7 -0
- package/dist/llmLazy-VCEV22DK.js +15 -0
- package/dist/llmLazy-VCEV22DK.js.map +7 -0
- package/dist/loader-CKNYMPCZ.js +28 -0
- package/dist/loader-CKNYMPCZ.js.map +7 -0
- package/dist/mcp-2SZTOKZX.js +49 -0
- package/dist/mcp-2SZTOKZX.js.map +7 -0
- package/dist/mentionProcessor-O7NWOH6S.js +211 -0
- package/dist/mentionProcessor-O7NWOH6S.js.map +7 -0
- package/dist/messages-PRKIHXMK.js +65 -0
- package/dist/messages-PRKIHXMK.js.map +7 -0
- package/dist/model-WG6RA25G.js +30 -0
- package/dist/model-WG6RA25G.js.map +7 -0
- package/dist/openai-VQLYFQ6B.js +29 -0
- package/dist/openai-VQLYFQ6B.js.map +7 -0
- package/dist/outputStyles-VQ57E3B6.js +28 -0
- package/dist/outputStyles-VQ57E3B6.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-NWOLU73K.js +218 -0
- package/dist/pluginRuntime-NWOLU73K.js.map +7 -0
- package/dist/pluginValidation-R7B6QQ6T.js +17 -0
- package/dist/pluginValidation-R7B6QQ6T.js.map +7 -0
- package/dist/prompts-W4V4Y67M.js +48 -0
- package/dist/prompts-W4V4Y67M.js.map +7 -0
- package/dist/query-GFFKKURO.js +50 -0
- package/dist/query-GFFKKURO.js.map +7 -0
- package/dist/responsesStreaming-2AIT6GHG.js +10 -0
- package/dist/responsesStreaming-2AIT6GHG.js.map +7 -0
- package/dist/ripgrep-SVBVC46X.js +17 -0
- package/dist/ripgrep-SVBVC46X.js.map +7 -0
- package/dist/skillMarketplace-5Z7Y6FTD.js +37 -0
- package/dist/skillMarketplace-5Z7Y6FTD.js.map +7 -0
- package/dist/state-X3R7BV7A.js +16 -0
- package/dist/state-X3R7BV7A.js.map +7 -0
- package/dist/theme-4VA64EWF.js +14 -0
- package/dist/theme-4VA64EWF.js.map +7 -0
- package/dist/toolPermissionContext-I3IXPVED.js +17 -0
- package/dist/toolPermissionContext-I3IXPVED.js.map +7 -0
- package/dist/toolPermissionSettings-35DJQEKG.js +18 -0
- package/dist/toolPermissionSettings-35DJQEKG.js.map +7 -0
- package/dist/tools-USOBTPOI.js +47 -0
- package/dist/tools-USOBTPOI.js.map +7 -0
- package/dist/userInput-NID2UYXG.js +312 -0
- package/dist/userInput-NID2UYXG.js.map +7 -0
- package/dist/uuid-VA3KVASX.js +9 -0
- package/dist/uuid-VA3KVASX.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +135 -0
- package/scripts/binary-utils.cjs +61 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- package/web/dist/assets/index-COAJqX1Z.css +1 -0
- package/web/dist/assets/index-CzS_4LmC.js +179 -0
- package/web/dist/index.html +14 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/log/debugLogger.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync, mkdirSync, appendFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport { homedir } from 'os'\r\nimport { randomUUID } from 'crypto'\r\nimport { format } from 'node:util'\r\nimport chalk from 'chalk'\r\nimport envPaths from 'env-paths'\r\nimport { PRODUCT_COMMAND } from '@constants/product'\r\nimport { SESSION_ID } from './index'\r\nimport type { Message } from '@newcraw-types/conversation'\r\n\r\nexport enum LogLevel {\r\n TRACE = 'TRACE',\r\n DEBUG = 'DEBUG',\r\n INFO = 'INFO',\r\n WARN = 'WARN',\r\n ERROR = 'ERROR',\r\n FLOW = 'FLOW',\r\n API = 'API',\r\n STATE = 'STATE',\r\n REMINDER = 'REMINDER',\r\n}\r\n\r\nconst isDebugMode = () =>\r\n process.argv.includes('--debug-verbose') ||\r\n process.argv.includes('--mcp-debug') ||\r\n process.argv.some(\r\n arg => arg === '--debug' || arg === '-d' || arg.startsWith('--debug='),\r\n )\r\nconst isVerboseMode = () => process.argv.includes('--verbose')\r\nconst isDebugVerboseMode = () => process.argv.includes('--debug-verbose')\r\n\r\nconst TERMINAL_LOG_LEVELS = new Set([\r\n LogLevel.ERROR,\r\n LogLevel.WARN,\r\n LogLevel.INFO,\r\n LogLevel.REMINDER,\r\n])\r\n\r\nconst DEBUG_VERBOSE_TERMINAL_LOG_LEVELS = new Set([\r\n LogLevel.ERROR,\r\n LogLevel.WARN,\r\n LogLevel.FLOW,\r\n LogLevel.API,\r\n LogLevel.STATE,\r\n LogLevel.INFO,\r\n LogLevel.REMINDER,\r\n])\r\n\r\nconst USER_FRIENDLY_LEVELS = new Set([\r\n 'SESSION_START',\r\n 'QUERY_START',\r\n 'QUERY_PROGRESS',\r\n 'QUERY_COMPLETE',\r\n 'TOOL_EXECUTION',\r\n 'ERROR_OCCURRED',\r\n 'PERFORMANCE_SUMMARY',\r\n])\r\n\r\nconst STARTUP_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-')\r\nconst REQUEST_START_TIME = Date.now()\r\n\r\nconst NEWCRAW_DIR = join(homedir(), '.newcraw')\r\nfunction getProjectDir(cwd: string): string {\r\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\r\n}\r\n\r\nconst DEBUG_PATHS = {\r\n base: () => join(NEWCRAW_DIR, getProjectDir(process.cwd()), 'debug'),\r\n detailed: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-detailed.log`),\r\n flow: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-flow.log`),\r\n api: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-api.log`),\r\n state: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-state.log`),\r\n}\r\n\r\nfunction ensureDebugDir() {\r\n const debugDir = DEBUG_PATHS.base()\r\n if (!existsSync(debugDir)) {\r\n mkdirSync(debugDir, { recursive: true })\r\n }\r\n}\r\n\r\ninterface LogEntry {\r\n timestamp: string\r\n level: LogLevel\r\n phase: string\r\n requestId?: string\r\n data: any\r\n elapsed?: number\r\n}\r\n\r\nclass RequestContext {\r\n public readonly id: string\r\n public readonly startTime: number\r\n private phases: Map<string, number> = new Map()\r\n\r\n constructor() {\r\n this.id = randomUUID().slice(0, 8)\r\n this.startTime = Date.now()\r\n }\r\n\r\n markPhase(phase: string) {\r\n this.phases.set(phase, Date.now() - this.startTime)\r\n }\r\n\r\n getPhaseTime(phase: string): number {\r\n return this.phases.get(phase) || 0\r\n }\r\n\r\n getAllPhases(): Record<string, number> {\r\n return Object.fromEntries(this.phases)\r\n }\r\n}\r\n\r\nconst activeRequests = new Map<string, RequestContext>()\r\nlet currentRequest: RequestContext | null = null\r\n\r\nfunction terminalLog(...args: unknown[]): void {\r\n process.stderr.write(`${format(...args)}\\n`)\r\n}\r\n\r\nfunction writeToFile(filePath: string, entry: LogEntry) {\r\n if (!isDebugMode()) return\r\n\r\n try {\r\n ensureDebugDir()\r\n const logLine =\r\n JSON.stringify(\r\n {\r\n ...entry,\r\n sessionId: SESSION_ID,\r\n pid: process.pid,\r\n uptime: Date.now() - REQUEST_START_TIME,\r\n },\r\n null,\r\n 2,\r\n ) + ',\\n'\r\n\r\n appendFileSync(filePath, logLine)\r\n } catch (error) {\r\n }\r\n}\r\n\r\nconst recentLogs = new Map<string, number>()\r\nconst LOG_DEDUPE_WINDOW_MS = 5000\r\n\r\nfunction getDedupeKey(level: LogLevel, phase: string, data: any): string {\r\n if (phase.startsWith('CONFIG_')) {\r\n const file = data?.file || ''\r\n return `${level}:${phase}:${file}`\r\n }\r\n\r\n return `${level}:${phase}`\r\n}\r\n\r\nfunction shouldLogWithDedupe(\r\n level: LogLevel,\r\n phase: string,\r\n data: any,\r\n): boolean {\r\n const key = getDedupeKey(level, phase, data)\r\n const now = Date.now()\r\n const lastLogTime = recentLogs.get(key)\r\n\r\n if (!lastLogTime || now - lastLogTime > LOG_DEDUPE_WINDOW_MS) {\r\n recentLogs.set(key, now)\r\n\r\n for (const [oldKey, oldTime] of recentLogs.entries()) {\r\n if (now - oldTime > LOG_DEDUPE_WINDOW_MS) {\r\n recentLogs.delete(oldKey)\r\n }\r\n }\r\n\r\n return true\r\n }\r\n\r\n return false\r\n}\r\nfunction formatMessages(messages: any): string {\r\n if (Array.isArray(messages)) {\r\n const recentMessages = messages.slice(-5)\r\n return recentMessages\r\n .map((msg, index) => {\r\n const role = msg.role || 'unknown'\r\n let content = ''\r\n\r\n if (typeof msg.content === 'string') {\r\n content =\r\n msg.content.length > 300\r\n ? msg.content.substring(0, 300) + '...'\r\n : msg.content\r\n } else if (typeof msg.content === 'object') {\r\n content = '[complex_content]'\r\n } else {\r\n content = String(msg.content || '')\r\n }\r\n\r\n const totalIndex = messages.length - recentMessages.length + index\r\n return `[${totalIndex}] ${chalk.dim(role)}: ${content}`\r\n })\r\n .join('\\n ')\r\n }\r\n\r\n if (typeof messages === 'string') {\r\n try {\r\n const parsed = JSON.parse(messages)\r\n if (Array.isArray(parsed)) {\r\n return formatMessages(parsed)\r\n }\r\n } catch {\r\n }\r\n }\r\n\r\n if (typeof messages === 'string' && messages.length > 200) {\r\n return messages.substring(0, 200) + '...'\r\n }\r\n\r\n return typeof messages === 'string' ? messages : JSON.stringify(messages)\r\n}\r\n\r\nfunction shouldShowInTerminal(level: LogLevel): boolean {\r\n if (!isDebugMode()) return false\r\n\r\n if (isDebugVerboseMode()) {\r\n return DEBUG_VERBOSE_TERMINAL_LOG_LEVELS.has(level)\r\n }\r\n\r\n return TERMINAL_LOG_LEVELS.has(level)\r\n}\r\n\r\nfunction logToTerminal(entry: LogEntry) {\r\n if (!shouldShowInTerminal(entry.level)) return\r\n\r\n const { level, phase, data, requestId, elapsed } = entry\r\n const timestamp = new Date().toISOString().slice(11, 23)\r\n\r\n let prefix = ''\r\n let color = chalk.gray\r\n\r\n switch (level) {\r\n case LogLevel.FLOW:\r\n prefix = '\uD83D\uDD04'\r\n color = chalk.cyan\r\n break\r\n case LogLevel.API:\r\n prefix = '\uD83C\uDF10'\r\n color = chalk.yellow\r\n break\r\n case LogLevel.STATE:\r\n prefix = '\uD83D\uDCCA'\r\n color = chalk.blue\r\n break\r\n case LogLevel.ERROR:\r\n prefix = '\u274C'\r\n color = chalk.red\r\n break\r\n case LogLevel.WARN:\r\n prefix = '\u26A0\uFE0F'\r\n color = chalk.yellow\r\n break\r\n case LogLevel.INFO:\r\n prefix = '\u2139\uFE0F'\r\n color = chalk.green\r\n break\r\n case LogLevel.TRACE:\r\n prefix = '\uD83D\uDCC8'\r\n color = chalk.magenta\r\n break\r\n default:\r\n prefix = '\uD83D\uDD0D'\r\n color = chalk.gray\r\n }\r\n\r\n const reqId = requestId ? chalk.dim(`[${requestId}]`) : ''\r\n const elapsedStr = elapsed !== undefined ? chalk.dim(`+${elapsed}ms`) : ''\r\n\r\n let dataStr = ''\r\n if (typeof data === 'object' && data !== null) {\r\n if (data.messages) {\r\n const formattedMessages = formatMessages(data.messages)\r\n dataStr = JSON.stringify(\r\n {\r\n ...data,\r\n messages: `\\n ${formattedMessages}`,\r\n },\r\n null,\r\n 2,\r\n )\r\n } else {\r\n dataStr = JSON.stringify(data, null, 2)\r\n }\r\n } else {\r\n dataStr = typeof data === 'string' ? data : JSON.stringify(data)\r\n }\r\n\r\n terminalLog(\r\n `${color(`[${timestamp}]`)} ${prefix} ${color(phase)} ${reqId} ${dataStr} ${elapsedStr}`,\r\n )\r\n}\r\n\r\nexport function debugLog(\r\n level: LogLevel,\r\n phase: string,\r\n data: any,\r\n requestId?: string,\r\n) {\r\n if (!isDebugMode()) return\r\n\r\n if (!shouldLogWithDedupe(level, phase, data)) {\r\n return\r\n }\r\n\r\n const entry: LogEntry = {\r\n timestamp: new Date().toISOString(),\r\n level,\r\n phase,\r\n data,\r\n requestId: requestId || currentRequest?.id,\r\n elapsed: currentRequest ? Date.now() - currentRequest.startTime : undefined,\r\n }\r\n\r\n writeToFile(DEBUG_PATHS.detailed(), entry)\r\n\r\n switch (level) {\r\n case LogLevel.FLOW:\r\n writeToFile(DEBUG_PATHS.flow(), entry)\r\n break\r\n case LogLevel.API:\r\n writeToFile(DEBUG_PATHS.api(), entry)\r\n break\r\n case LogLevel.STATE:\r\n writeToFile(DEBUG_PATHS.state(), entry)\r\n break\r\n }\r\n\r\n logToTerminal(entry)\r\n}\r\n\r\nexport const debug = {\r\n flow: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.FLOW, phase, data, requestId),\r\n\r\n api: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.API, phase, data, requestId),\r\n\r\n state: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.STATE, phase, data, requestId),\r\n\r\n info: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.INFO, phase, data, requestId),\r\n\r\n warn: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.WARN, phase, data, requestId),\r\n\r\n error: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.ERROR, phase, data, requestId),\r\n\r\n trace: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.TRACE, phase, data, requestId),\r\n\r\n ui: (phase: string, data: any, requestId?: string) =>\r\n debugLog(LogLevel.STATE, `UI_${phase}`, data, requestId),\r\n}\r\n\r\nexport function startRequest(): RequestContext {\r\n const ctx = new RequestContext()\r\n currentRequest = ctx\r\n activeRequests.set(ctx.id, ctx)\r\n\r\n debug.flow('REQUEST_START', {\r\n requestId: ctx.id,\r\n activeRequests: activeRequests.size,\r\n })\r\n\r\n return ctx\r\n}\r\n\r\nexport function endRequest(ctx?: RequestContext) {\r\n const request = ctx || currentRequest\r\n if (!request) return\r\n\r\n debug.flow('REQUEST_END', {\r\n requestId: request.id,\r\n totalTime: Date.now() - request.startTime,\r\n phases: request.getAllPhases(),\r\n })\r\n\r\n activeRequests.delete(request.id)\r\n if (currentRequest === request) {\r\n currentRequest = null\r\n }\r\n}\r\n\r\nexport function getCurrentRequest(): RequestContext | null {\r\n return currentRequest\r\n}\r\n\r\nexport function markPhase(phase: string, data?: any) {\r\n if (!currentRequest) return\r\n\r\n currentRequest.markPhase(phase)\r\n debug.flow(`PHASE_${phase.toUpperCase()}`, {\r\n requestId: currentRequest.id,\r\n elapsed: currentRequest.getPhaseTime(phase),\r\n data,\r\n })\r\n}\r\n\r\nexport function logReminderEvent(\r\n eventType: string,\r\n reminderData: any,\r\n agentId?: string,\r\n) {\r\n if (!isDebugMode()) return\r\n\r\n debug.info('REMINDER_EVENT_TRIGGERED', {\r\n eventType,\r\n agentId: agentId || 'default',\r\n reminderType: reminderData.type || 'unknown',\r\n reminderCategory: reminderData.category || 'general',\r\n reminderPriority: reminderData.priority || 'medium',\r\n contentLength: reminderData.content ? reminderData.content.length : 0,\r\n timestamp: Date.now(),\r\n })\r\n}\r\n\r\nexport function logAPIError(context: {\r\n model: string\r\n endpoint: string\r\n status: number\r\n error: any\r\n request?: any\r\n response?: any\r\n provider?: string\r\n}) {\r\n const errorDir = join(NEWCRAW_DIR, 'logs', 'error', 'api')\r\n\r\n if (!existsSync(errorDir)) {\r\n try {\r\n mkdirSync(errorDir, { recursive: true })\r\n } catch (err) {\r\n terminalLog('Failed to create error log directory:', err)\r\n return\r\n }\r\n }\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\r\n const sanitizedModel = context.model.replace(/[^a-zA-Z0-9-_]/g, '_')\r\n const filename = `${sanitizedModel}_${timestamp}.log`\r\n const filepath = join(errorDir, filename)\r\n\r\n const fullLogContent = {\r\n timestamp: new Date().toISOString(),\r\n sessionId: SESSION_ID,\r\n requestId: getCurrentRequest()?.id,\r\n model: context.model,\r\n provider: context.provider,\r\n endpoint: context.endpoint,\r\n status: context.status,\r\n error: context.error,\r\n request: context.request,\r\n response: context.response,\r\n environment: {\r\n nodeVersion: process.version,\r\n platform: process.platform,\r\n cwd: process.cwd(),\r\n },\r\n }\r\n\r\n try {\r\n appendFileSync(filepath, JSON.stringify(fullLogContent, null, 2) + '\\n')\r\n appendFileSync(filepath, '='.repeat(80) + '\\n\\n')\r\n } catch (err) {\r\n terminalLog('Failed to write API error log:', err)\r\n }\r\n\r\n if (isDebugMode()) {\r\n debug.error('API_ERROR', {\r\n model: context.model,\r\n status: context.status,\r\n error:\r\n typeof context.error === 'string'\r\n ? context.error\r\n : context.error?.message || 'Unknown error',\r\n endpoint: context.endpoint,\r\n logFile: filename,\r\n })\r\n }\r\n\r\n if (isVerboseMode() || isDebugVerboseMode()) {\r\n terminalLog()\r\n terminalLog(chalk.red('\u2501'.repeat(60)))\r\n terminalLog(chalk.red.bold('\u26A0\uFE0F API Error'))\r\n terminalLog(chalk.red('\u2501'.repeat(60)))\r\n\r\n terminalLog(chalk.white(' Model: ') + chalk.yellow(context.model))\r\n terminalLog(chalk.white(' Status: ') + chalk.red(context.status))\r\n\r\n let errorMessage = 'Unknown error'\r\n if (typeof context.error === 'string') {\r\n errorMessage = context.error\r\n } else if (context.error?.message) {\r\n errorMessage = context.error.message\r\n } else if (context.error?.error?.message) {\r\n errorMessage = context.error.error.message\r\n }\r\n\r\n terminalLog(chalk.white(' Error: ') + chalk.red(errorMessage))\r\n\r\n if (context.response) {\r\n terminalLog()\r\n terminalLog(chalk.gray(' Response:'))\r\n const responseStr =\r\n typeof context.response === 'string'\r\n ? context.response\r\n : JSON.stringify(context.response, null, 2)\r\n\r\n responseStr.split('\\n').forEach(line => {\r\n terminalLog(chalk.gray(' ' + line))\r\n })\r\n }\r\n\r\n terminalLog()\r\n terminalLog(chalk.dim(` \uD83D\uDCC1 Full log: ${filepath}`))\r\n terminalLog(chalk.red('\u2501'.repeat(60)))\r\n terminalLog()\r\n }\r\n}\r\n\r\nexport function logLLMInteraction(context: {\r\n systemPrompt: string\r\n messages: any[]\r\n response: any\r\n usage?: { inputTokens: number; outputTokens: number }\r\n timing: { start: number; end: number }\r\n apiFormat?: 'anthropic' | 'openai'\r\n}) {\r\n if (!isDebugMode()) return\r\n\r\n const duration = context.timing.end - context.timing.start\r\n\r\n terminalLog('\\n' + chalk.blue('\uD83E\uDDE0 LLM CALL DEBUG'))\r\n terminalLog(chalk.gray('\u2501'.repeat(60)))\r\n\r\n terminalLog(chalk.yellow('\uD83D\uDCCA Context Overview:'))\r\n terminalLog(` Messages Count: ${context.messages.length}`)\r\n terminalLog(` System Prompt Length: ${context.systemPrompt.length} chars`)\r\n terminalLog(` Duration: ${duration.toFixed(0)}ms`)\r\n\r\n if (context.usage) {\r\n terminalLog(\r\n ` Token Usage: ${context.usage.inputTokens} \u2192 ${context.usage.outputTokens}`,\r\n )\r\n }\r\n\r\n const apiLabel = context.apiFormat\r\n ? ` (${context.apiFormat.toUpperCase()})`\r\n : ''\r\n terminalLog(chalk.cyan(`\\n\uD83D\uDCAC Real API Messages${apiLabel} (last 10):`))\r\n\r\n const recentMessages = context.messages.slice(-10)\r\n recentMessages.forEach((msg, index) => {\r\n const globalIndex = context.messages.length - recentMessages.length + index\r\n const roleColor =\r\n msg.role === 'user'\r\n ? 'green'\r\n : msg.role === 'assistant'\r\n ? 'blue'\r\n : msg.role === 'system'\r\n ? 'yellow'\r\n : 'gray'\r\n\r\n let content = ''\r\n let isReminder = false\r\n\r\n if (typeof msg.content === 'string') {\r\n if (msg.content.includes('<system-reminder>')) {\r\n isReminder = true\r\n const reminderContent = msg.content\r\n .replace(/<\\/?system-reminder>/g, '')\r\n .trim()\r\n content = `\uD83D\uDD14 ${reminderContent.length > 800 ? reminderContent.substring(0, 800) + '...' : reminderContent}`\r\n } else {\r\n const maxLength =\r\n msg.role === 'user' ? 1000 : msg.role === 'system' ? 1200 : 800\r\n content =\r\n msg.content.length > maxLength\r\n ? msg.content.substring(0, maxLength) + '...'\r\n : msg.content\r\n }\r\n } else if (Array.isArray(msg.content)) {\r\n const textBlocks = msg.content.filter(\r\n (block: any) => block.type === 'text',\r\n )\r\n const toolBlocks = msg.content.filter(\r\n (block: any) => block.type === 'tool_use',\r\n )\r\n if (textBlocks.length > 0) {\r\n const text = textBlocks[0].text || ''\r\n const maxLength = msg.role === 'assistant' ? 1000 : 800\r\n content =\r\n text.length > maxLength ? text.substring(0, maxLength) + '...' : text\r\n }\r\n if (toolBlocks.length > 0) {\r\n content += ` [+ ${toolBlocks.length} tool calls]`\r\n }\r\n if (textBlocks.length === 0 && toolBlocks.length === 0) {\r\n content = `[${msg.content.length} blocks: ${msg.content.map(b => b.type || 'unknown').join(', ')}]`\r\n }\r\n } else {\r\n content = '[complex_content]'\r\n }\r\n\r\n if (isReminder) {\r\n terminalLog(\r\n ` [${globalIndex}] ${chalk.magenta('\uD83D\uDD14 REMINDER')}: ${chalk.dim(content)}`,\r\n )\r\n } else {\r\n const roleIcon =\r\n msg.role === 'user'\r\n ? '\uD83D\uDC64'\r\n : msg.role === 'assistant'\r\n ? '\uD83E\uDD16'\r\n : msg.role === 'system'\r\n ? '\u2699\uFE0F'\r\n : '\uD83D\uDCC4'\r\n terminalLog(\r\n ` [${globalIndex}] ${(chalk as any)[roleColor](roleIcon + ' ' + msg.role.toUpperCase())}: ${content}`,\r\n )\r\n }\r\n\r\n if (msg.role === 'assistant' && Array.isArray(msg.content)) {\r\n const toolCalls = msg.content.filter(\r\n (block: any) => block.type === 'tool_use',\r\n )\r\n if (toolCalls.length > 0) {\r\n terminalLog(\r\n chalk.cyan(\r\n ` \uD83D\uDD27 \u2192 Tool calls (${toolCalls.length}): ${toolCalls.map((t: any) => t.name).join(', ')}`,\r\n ),\r\n )\r\n toolCalls.forEach((tool: any, idx: number) => {\r\n const inputStr = JSON.stringify(tool.input || {})\r\n const maxLength = 200\r\n const displayInput =\r\n inputStr.length > maxLength\r\n ? inputStr.substring(0, maxLength) + '...'\r\n : inputStr\r\n terminalLog(\r\n chalk.dim(` [${idx}] ${tool.name}: ${displayInput}`),\r\n )\r\n })\r\n }\r\n }\r\n if (msg.tool_calls && msg.tool_calls.length > 0) {\r\n terminalLog(\r\n chalk.cyan(\r\n ` \uD83D\uDD27 \u2192 Tool calls (${msg.tool_calls.length}): ${msg.tool_calls.map((t: any) => t.function.name).join(', ')}`,\r\n ),\r\n )\r\n msg.tool_calls.forEach((tool: any, idx: number) => {\r\n const inputStr = tool.function.arguments || '{}'\r\n const maxLength = 200\r\n const displayInput =\r\n inputStr.length > maxLength\r\n ? inputStr.substring(0, maxLength) + '...'\r\n : inputStr\r\n terminalLog(\r\n chalk.dim(` [${idx}] ${tool.function.name}: ${displayInput}`),\r\n )\r\n })\r\n }\r\n })\r\n\r\n terminalLog(chalk.magenta('\\n\uD83E\uDD16 LLM Response:'))\r\n\r\n let responseContent = ''\r\n let toolCalls: any[] = []\r\n\r\n if (Array.isArray(context.response.content)) {\r\n const textBlocks = context.response.content.filter(\r\n (block: any) => block.type === 'text',\r\n )\r\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\r\n toolCalls = context.response.content.filter(\r\n (block: any) => block.type === 'tool_use',\r\n )\r\n } else if (typeof context.response.content === 'string') {\r\n responseContent = context.response.content\r\n toolCalls = context.response.tool_calls || context.response.toolCalls || []\r\n } else if (context.response.message?.content) {\r\n if (Array.isArray(context.response.message.content)) {\r\n const textBlocks = context.response.message.content.filter(\r\n (block: any) => block.type === 'text',\r\n )\r\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\r\n toolCalls = context.response.message.content.filter(\r\n (block: any) => block.type === 'tool_use',\r\n )\r\n } else if (typeof context.response.message.content === 'string') {\r\n responseContent = context.response.message.content\r\n }\r\n } else {\r\n responseContent = JSON.stringify(\r\n context.response.content || context.response || '',\r\n )\r\n }\r\n\r\n const maxResponseLength = 1000\r\n const displayContent =\r\n responseContent.length > maxResponseLength\r\n ? responseContent.substring(0, maxResponseLength) + '...'\r\n : responseContent\r\n terminalLog(` Content: ${displayContent}`)\r\n\r\n if (toolCalls.length > 0) {\r\n const toolNames = toolCalls.map(\r\n (t: any) => t.name || t.function?.name || 'unknown',\r\n )\r\n terminalLog(\r\n chalk.cyan(\r\n ` \uD83D\uDD27 Tool Calls (${toolCalls.length}): ${toolNames.join(', ')}`,\r\n ),\r\n )\r\n toolCalls.forEach((tool: any, index: number) => {\r\n const toolName = tool.name || tool.function?.name || 'unknown'\r\n const toolInput = tool.input || tool.function?.arguments || '{}'\r\n const inputStr =\r\n typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput)\r\n const maxToolInputLength = 300\r\n const displayInput =\r\n inputStr.length > maxToolInputLength\r\n ? inputStr.substring(0, maxToolInputLength) + '...'\r\n : inputStr\r\n terminalLog(chalk.dim(` [${index}] ${toolName}: ${displayInput}`))\r\n })\r\n }\r\n\r\n terminalLog(\r\n ` Stop Reason: ${context.response.stop_reason || context.response.finish_reason || 'unknown'}`,\r\n )\r\n terminalLog(chalk.gray('\u2501'.repeat(60)))\r\n}\r\n\r\nexport function logSystemPromptConstruction(construction: {\r\n basePrompt: string\r\n kodeContext?: string\r\n reminders: string[]\r\n finalPrompt: string\r\n}) {\r\n if (!isDebugMode()) return\r\n\r\n terminalLog('\\n' + chalk.yellow('\uD83D\uDCDD SYSTEM PROMPT CONSTRUCTION'))\r\n terminalLog(` Base Prompt: ${construction.basePrompt.length} chars`)\r\n\r\n if (construction.newcrawContext) {\r\n terminalLog(` + NewCraw Context: ${construction.newcrawContext.length} chars`)\r\n }\r\n\r\n if (construction.reminders.length > 0) {\r\n terminalLog(\r\n ` + Dynamic Reminders: ${construction.reminders.length} items`,\r\n )\r\n construction.reminders.forEach((reminder, index) => {\r\n terminalLog(chalk.dim(` [${index}] ${reminder.substring(0, 80)}...`))\r\n })\r\n }\r\n\r\n terminalLog(` = Final Length: ${construction.finalPrompt.length} chars`)\r\n}\r\n\r\nexport function logContextCompression(compression: {\r\n beforeMessages: number\r\n afterMessages: number\r\n trigger: string\r\n preservedFiles: string[]\r\n compressionRatio: number\r\n}) {\r\n if (!isDebugMode()) return\r\n\r\n terminalLog('\\n' + chalk.red('\uD83D\uDDDC\uFE0F CONTEXT COMPRESSION'))\r\n terminalLog(` Trigger: ${compression.trigger}`)\r\n terminalLog(\r\n ` Messages: ${compression.beforeMessages} \u2192 ${compression.afterMessages}`,\r\n )\r\n terminalLog(\r\n ` Compression Ratio: ${(compression.compressionRatio * 100).toFixed(1)}%`,\r\n )\r\n\r\n if (compression.preservedFiles.length > 0) {\r\n terminalLog(` Preserved Files: ${compression.preservedFiles.join(', ')}`)\r\n }\r\n}\r\n\r\nexport function logUserFriendly(type: string, data: any, requestId?: string) {\r\n if (!isDebugMode()) return\r\n\r\n const timestamp = new Date().toLocaleTimeString()\r\n let message = ''\r\n let color = chalk.gray\r\n let icon = '\u2022'\r\n\r\n switch (type) {\r\n case 'SESSION_START':\r\n icon = '\uD83D\uDE80'\r\n color = chalk.green\r\n message = `Session started with ${data.model || 'default model'}`\r\n break\r\n case 'QUERY_START':\r\n icon = '\uD83D\uDCAD'\r\n color = chalk.blue\r\n message = `Processing query: \"${data.query?.substring(0, 50)}${data.query?.length > 50 ? '...' : ''}\"`\r\n break\r\n case 'QUERY_PROGRESS':\r\n icon = '\u23F3'\r\n color = chalk.yellow\r\n message = `${data.phase} (${data.elapsed}ms)`\r\n break\r\n case 'QUERY_COMPLETE':\r\n icon = '\u2705'\r\n color = chalk.green\r\n message = `Query completed in ${data.duration}ms - Cost: $${data.cost} - ${data.tokens} tokens`\r\n break\r\n case 'TOOL_EXECUTION':\r\n icon = '\uD83D\uDD27'\r\n color = chalk.cyan\r\n message = `${data.toolName}: ${data.action} ${data.target ? '\u2192 ' + data.target : ''}`\r\n break\r\n case 'ERROR_OCCURRED':\r\n icon = '\u274C'\r\n color = chalk.red\r\n message = `${data.error} ${data.context ? '(' + data.context + ')' : ''}`\r\n break\r\n case 'PERFORMANCE_SUMMARY':\r\n icon = '\uD83D\uDCCA'\r\n color = chalk.magenta\r\n message = `Session: ${data.queries} queries, $${data.totalCost}, ${data.avgResponseTime}ms avg`\r\n break\r\n default:\r\n message = JSON.stringify(data)\r\n }\r\n\r\n const reqId = requestId ? chalk.dim(`[${requestId.slice(0, 8)}]`) : ''\r\n terminalLog(`${color(`[${timestamp}]`)} ${icon} ${color(message)} ${reqId}`)\r\n}\r\n\r\nexport function initDebugLogger() {\r\n if (!isDebugMode()) return\r\n\r\n debug.info('DEBUG_LOGGER_INIT', {\r\n startupTimestamp: STARTUP_TIMESTAMP,\r\n sessionId: SESSION_ID,\r\n debugPaths: {\r\n detailed: DEBUG_PATHS.detailed(),\r\n flow: DEBUG_PATHS.flow(),\r\n api: DEBUG_PATHS.api(),\r\n state: DEBUG_PATHS.state(),\r\n },\r\n })\r\n\r\n const terminalLevels = isDebugVerboseMode()\r\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS).join(', ')\r\n : Array.from(TERMINAL_LOG_LEVELS).join(', ')\r\n\r\n terminalLog(\r\n chalk.dim(`[DEBUG] Terminal output filtered to: ${terminalLevels}`),\r\n )\r\n terminalLog(\r\n chalk.dim(`[DEBUG] Complete logs saved to: ${DEBUG_PATHS.base()}`),\r\n )\r\n if (!isDebugVerboseMode()) {\r\n terminalLog(\r\n chalk.dim(\r\n `[DEBUG] Use --debug-verbose for detailed system logs (FLOW, API, STATE)`,\r\n ),\r\n )\r\n }\r\n}\r\n\r\ninterface ErrorDiagnosis {\r\n errorType: string\r\n category:\r\n | 'NETWORK'\r\n | 'API'\r\n | 'PERMISSION'\r\n | 'CONFIG'\r\n | 'SYSTEM'\r\n | 'USER_INPUT'\r\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'\r\n description: string\r\n suggestions: string[]\r\n debugSteps: string[]\r\n relatedLogs?: string[]\r\n}\r\n\r\nexport function diagnoseError(error: any, context?: any): ErrorDiagnosis {\r\n const errorMessage = error instanceof Error ? error.message : String(error)\r\n const errorStack = error instanceof Error ? error.stack : undefined\r\n\r\n if (\r\n errorMessage.includes('aborted') ||\r\n errorMessage.includes('AbortController')\r\n ) {\r\n return {\r\n errorType: 'REQUEST_ABORTED',\r\n category: 'SYSTEM',\r\n severity: 'MEDIUM',\r\n description:\r\n 'Request was aborted, often due to user cancellation or timeout',\r\n suggestions: [\r\n '\u68C0\u67E5\u662F\u5426\u6309\u4E0B\u4E86 ESC \u952E\u53D6\u6D88\u8BF7\u6C42',\r\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u7A33\u5B9A',\r\n '\u9A8C\u8BC1 AbortController \u72B6\u6001: isActive \u548C signal.aborted \u5E94\u8BE5\u4E00\u81F4',\r\n '\u67E5\u770B\u662F\u5426\u6709\u91CD\u590D\u7684\u8BF7\u6C42\u5BFC\u81F4\u51B2\u7A81',\r\n ],\r\n debugSteps: [\r\n '\u4F7F\u7528 --debug-verbose \u6A21\u5F0F\u67E5\u770B\u8BE6\u7EC6\u7684\u8BF7\u6C42\u6D41\u7A0B',\r\n '\u68C0\u67E5 debug \u65E5\u5FD7\u4E2D\u7684 BINARY_FEEDBACK_* \u4E8B\u4EF6',\r\n '\u9A8C\u8BC1 REQUEST_START \u548C REQUEST_END \u65E5\u5FD7\u914D\u5BF9',\r\n '\u67E5\u770B QUERY_ABORTED \u4E8B\u4EF6\u7684\u89E6\u53D1\u539F\u56E0',\r\n ],\r\n }\r\n }\r\n\r\n if (\r\n errorMessage.includes('api-key') ||\r\n errorMessage.includes('authentication') ||\r\n errorMessage.includes('401')\r\n ) {\r\n return {\r\n errorType: 'API_AUTHENTICATION',\r\n category: 'API',\r\n severity: 'HIGH',\r\n description: 'API authentication failed - invalid or missing API key',\r\n suggestions: [\r\n '\u8FD0\u884C /login \u91CD\u65B0\u8BBE\u7F6E API \u5BC6\u94A5',\r\n '\u68C0\u67E5 ~/.newcraw/ \u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 API \u5BC6\u94A5',\r\n '\u9A8C\u8BC1 API \u5BC6\u94A5\u662F\u5426\u5DF2\u8FC7\u671F\u6216\u88AB\u64A4\u9500',\r\n '\u786E\u8BA4\u4F7F\u7528\u7684 provider \u8BBE\u7F6E\u6B63\u786E (anthropic/opendev/bigdream)',\r\n ],\r\n debugSteps: [\r\n '\u68C0\u67E5 CONFIG_LOAD \u65E5\u5FD7\u4E2D\u7684 provider \u548C API \u5BC6\u94A5\u72B6\u6001',\r\n '\u8FD0\u884C newcraw doctor \u68C0\u67E5\u7CFB\u7EDF\u5065\u5EB7\u72B6\u6001',\r\n '\u67E5\u770B API_ERROR \u65E5\u5FD7\u4E86\u89E3\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\r\n '\u4F7F\u7528 newcraw config \u547D\u4EE4\u67E5\u770B\u5F53\u524D\u914D\u7F6E',\r\n ],\r\n }\r\n }\r\n\r\n if (\r\n errorMessage.includes('ECONNREFUSED') ||\r\n errorMessage.includes('ENOTFOUND') ||\r\n errorMessage.includes('timeout')\r\n ) {\r\n return {\r\n errorType: 'NETWORK_CONNECTION',\r\n category: 'NETWORK',\r\n severity: 'HIGH',\r\n description: 'Network connection failed - unable to reach API endpoint',\r\n suggestions: [\r\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38',\r\n '\u786E\u8BA4\u9632\u706B\u5899\u6CA1\u6709\u963B\u6B62\u76F8\u5173\u7AEF\u53E3',\r\n '\u68C0\u67E5 proxy \u8BBE\u7F6E\u662F\u5426\u6B63\u786E',\r\n '\u5C1D\u8BD5\u5207\u6362\u5230\u4E0D\u540C\u7684\u7F51\u7EDC\u73AF\u5883',\r\n '\u9A8C\u8BC1 baseURL \u914D\u7F6E\u662F\u5426\u6B63\u786E',\r\n ],\r\n debugSteps: [\r\n '\u68C0\u67E5 API_REQUEST_START \u548C\u76F8\u5173\u7F51\u7EDC\u65E5\u5FD7',\r\n '\u67E5\u770B LLM_REQUEST_ERROR \u4E2D\u7684\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\r\n '\u4F7F\u7528 ping \u6216 curl \u6D4B\u8BD5 API \u7AEF\u70B9\u8FDE\u901A\u6027',\r\n '\u68C0\u67E5\u4F01\u4E1A\u7F51\u7EDC\u662F\u5426\u9700\u8981\u4EE3\u7406\u8BBE\u7F6E',\r\n ],\r\n }\r\n }\r\n\r\n if (\r\n errorMessage.includes('permission') ||\r\n errorMessage.includes('EACCES') ||\r\n errorMessage.includes('denied')\r\n ) {\r\n return {\r\n errorType: 'PERMISSION_DENIED',\r\n category: 'PERMISSION',\r\n severity: 'MEDIUM',\r\n description: 'Permission denied - insufficient access rights',\r\n suggestions: [\r\n '\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u7684\u8BFB\u5199\u6743\u9650',\r\n '\u786E\u8BA4\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u7CFB\u7EDF\u6743\u9650',\r\n '\u67E5\u770B\u662F\u5426\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C',\r\n '\u68C0\u67E5\u5DE5\u5177\u6743\u9650\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\r\n ],\r\n debugSteps: [\r\n '\u67E5\u770B PERMISSION_* \u65E5\u5FD7\u4E86\u89E3\u6743\u9650\u68C0\u67E5\u8FC7\u7A0B',\r\n '\u68C0\u67E5\u6587\u4EF6\u7CFB\u7EDF\u6743\u9650: ls -la',\r\n '\u9A8C\u8BC1\u5DE5\u5177\u5BA1\u6279\u72B6\u6001',\r\n '\u67E5\u770B TOOL_* \u76F8\u5173\u7684\u8C03\u8BD5\u65E5\u5FD7',\r\n ],\r\n }\r\n }\r\n\r\n if (\r\n errorMessage.includes('substring is not a function') ||\r\n errorMessage.includes('content')\r\n ) {\r\n return {\r\n errorType: 'RESPONSE_FORMAT',\r\n category: 'API',\r\n severity: 'MEDIUM',\r\n description: 'LLM response format mismatch between different providers',\r\n suggestions: [\r\n '\u68C0\u67E5\u5F53\u524D\u4F7F\u7528\u7684 provider \u662F\u5426\u4E0E\u671F\u671B\u4E00\u81F4',\r\n '\u9A8C\u8BC1\u54CD\u5E94\u683C\u5F0F\u5904\u7406\u903B\u8F91',\r\n '\u786E\u8BA4\u4E0D\u540C provider \u7684\u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\r\n '\u68C0\u67E5\u662F\u5426\u9700\u8981\u66F4\u65B0\u54CD\u5E94\u89E3\u6790\u4EE3\u7801',\r\n ],\r\n debugSteps: [\r\n '\u67E5\u770B LLM_CALL_DEBUG \u4E2D\u7684\u54CD\u5E94\u683C\u5F0F',\r\n '\u68C0\u67E5 provider \u914D\u7F6E\u548C\u5B9E\u9645\u4F7F\u7528\u7684 API',\r\n '\u5BF9\u6BD4 Anthropic \u548C OpenAI \u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\r\n '\u9A8C\u8BC1 logLLMInteraction \u51FD\u6570\u7684\u683C\u5F0F\u5904\u7406',\r\n ],\r\n }\r\n }\r\n\r\n if (\r\n errorMessage.includes('too long') ||\r\n errorMessage.includes('context') ||\r\n errorMessage.includes('token')\r\n ) {\r\n return {\r\n errorType: 'CONTEXT_OVERFLOW',\r\n category: 'SYSTEM',\r\n severity: 'MEDIUM',\r\n description: 'Context window exceeded - conversation too long',\r\n suggestions: [\r\n '\u8FD0\u884C /compact \u624B\u52A8\u538B\u7F29\u5BF9\u8BDD\u5386\u53F2',\r\n '\u68C0\u67E5\u81EA\u52A8\u538B\u7F29\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\r\n '\u51CF\u5C11\u5355\u6B21\u8F93\u5165\u7684\u5185\u5BB9\u957F\u5EA6',\r\n '\u6E05\u7406\u4E0D\u5FC5\u8981\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F',\r\n ],\r\n debugSteps: [\r\n '\u67E5\u770B AUTO_COMPACT_* \u65E5\u5FD7\u68C0\u67E5\u538B\u7F29\u89E6\u53D1',\r\n '\u68C0\u67E5 token \u4F7F\u7528\u91CF\u548C\u9608\u503C',\r\n '\u67E5\u770B CONTEXT_COMPRESSION \u76F8\u5173\u65E5\u5FD7',\r\n '\u9A8C\u8BC1\u6A21\u578B\u7684\u6700\u5927 token \u9650\u5236',\r\n ],\r\n }\r\n }\r\n\r\n if (\r\n errorMessage.includes('config') ||\r\n (errorMessage.includes('undefined') && context?.configRelated)\r\n ) {\r\n return {\r\n errorType: 'CONFIGURATION',\r\n category: 'CONFIG',\r\n severity: 'MEDIUM',\r\n description: 'Configuration error - missing or invalid settings',\r\n suggestions: [\r\n '\u8FD0\u884C newcraw config \u68C0\u67E5\u914D\u7F6E\u8BBE\u7F6E',\r\n '\u5220\u9664\u635F\u574F\u7684\u914D\u7F6E\u6587\u4EF6\u91CD\u65B0\u521D\u59CB\u5316',\r\n '\u68C0\u67E5 JSON \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u662F\u5426\u6B63\u786E',\r\n '\u9A8C\u8BC1\u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E',\r\n ],\r\n debugSteps: [\r\n '\u67E5\u770B CONFIG_LOAD \u548C CONFIG_SAVE \u65E5\u5FD7',\r\n '\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650',\r\n '\u9A8C\u8BC1 JSON \u683C\u5F0F: cat ~/.newcraw/config.json | jq',\r\n '\u67E5\u770B\u914D\u7F6E\u7F13\u5B58\u76F8\u5173\u7684\u8C03\u8BD5\u4FE1\u606F',\r\n ],\r\n }\r\n }\r\n\r\n return {\r\n errorType: 'UNKNOWN',\r\n category: 'SYSTEM',\r\n severity: 'MEDIUM',\r\n description: `Unexpected error: ${errorMessage}`,\r\n suggestions: [\r\n '\u91CD\u65B0\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F',\r\n '\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u662F\u5426\u5145\u8DB3',\r\n '\u67E5\u770B\u5B8C\u6574\u7684\u9519\u8BEF\u65E5\u5FD7\u83B7\u53D6\u66F4\u591A\u4FE1\u606F',\r\n '\u5982\u679C\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u62A5\u544A\u6B64\u9519\u8BEF',\r\n ],\r\n debugSteps: [\r\n '\u4F7F\u7528 --debug-verbose \u83B7\u53D6\u8BE6\u7EC6\u65E5\u5FD7',\r\n '\u68C0\u67E5 error.log \u4E2D\u7684\u5B8C\u6574\u9519\u8BEF\u4FE1\u606F',\r\n '\u67E5\u770B\u7CFB\u7EDF\u8D44\u6E90\u4F7F\u7528\u60C5\u51B5',\r\n '\u6536\u96C6\u91CD\u73B0\u6B65\u9AA4\u548C\u73AF\u5883\u4FE1\u606F',\r\n ],\r\n relatedLogs: errorStack ? [errorStack] : undefined,\r\n }\r\n}\r\n\r\nexport function logErrorWithDiagnosis(\r\n error: any,\r\n context?: any,\r\n requestId?: string,\r\n) {\r\n if (!isDebugMode()) return\r\n\r\n const diagnosis = diagnoseError(error, context)\r\n const errorMessage = error instanceof Error ? error.message : String(error)\r\n\r\n debug.error(\r\n 'ERROR_OCCURRED',\r\n {\r\n error: errorMessage,\r\n errorType: diagnosis.errorType,\r\n category: diagnosis.category,\r\n severity: diagnosis.severity,\r\n context,\r\n },\r\n requestId,\r\n )\r\n\r\n terminalLog('\\n' + chalk.red('\uD83D\uDEA8 ERROR DIAGNOSIS'))\r\n terminalLog(chalk.gray('\u2501'.repeat(60)))\r\n\r\n terminalLog(chalk.red(`\u274C ${diagnosis.errorType}`))\r\n terminalLog(\r\n chalk.dim(\r\n `Category: ${diagnosis.category} | Severity: ${diagnosis.severity}`,\r\n ),\r\n )\r\n terminalLog(`\\n${diagnosis.description}`)\r\n\r\n terminalLog(chalk.yellow('\\n\uD83D\uDCA1 Recovery Suggestions:'))\r\n diagnosis.suggestions.forEach((suggestion, index) => {\r\n terminalLog(` ${index + 1}. ${suggestion}`)\r\n })\r\n\r\n terminalLog(chalk.cyan('\\n\uD83D\uDD0D Debug Steps:'))\r\n diagnosis.debugSteps.forEach((step, index) => {\r\n terminalLog(` ${index + 1}. ${step}`)\r\n })\r\n\r\n if (diagnosis.relatedLogs && diagnosis.relatedLogs.length > 0) {\r\n terminalLog(chalk.magenta('\\n\uD83D\uDCCB Related Information:'))\r\n diagnosis.relatedLogs.forEach((log, index) => {\r\n const truncatedLog =\r\n log.length > 200 ? log.substring(0, 200) + '...' : log\r\n terminalLog(chalk.dim(` ${truncatedLog}`))\r\n })\r\n }\r\n\r\n const debugPath = DEBUG_PATHS.base()\r\n terminalLog(chalk.gray(`\\n\uD83D\uDCC1 Complete logs: ${debugPath}`))\r\n terminalLog(chalk.gray('\u2501'.repeat(60)))\r\n}\r\nexport function getDebugInfo() {\r\n return {\r\n isDebugMode: isDebugMode(),\r\n isVerboseMode: isVerboseMode(),\r\n isDebugVerboseMode: isDebugVerboseMode(),\r\n startupTimestamp: STARTUP_TIMESTAMP,\r\n sessionId: SESSION_ID,\r\n currentRequest: currentRequest?.id,\r\n activeRequests: Array.from(activeRequests.keys()),\r\n terminalLogLevels: isDebugVerboseMode()\r\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS)\r\n : Array.from(TERMINAL_LOG_LEVELS),\r\n debugPaths: {\r\n detailed: DEBUG_PATHS.detailed(),\r\n flow: DEBUG_PATHS.flow(),\r\n api: DEBUG_PATHS.api(),\r\n state: DEBUG_PATHS.state(),\r\n },\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["toolCalls"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
|
+
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/utils/config/settingSources.ts
|
|
5
|
+
var CLI_TO_SETTING_SOURCE = {
|
|
6
|
+
user: "userSettings",
|
|
7
|
+
project: "projectSettings",
|
|
8
|
+
local: "localSettings"
|
|
9
|
+
};
|
|
10
|
+
var enabledSettingSources = new Set(
|
|
11
|
+
Object.values(CLI_TO_SETTING_SOURCE)
|
|
12
|
+
);
|
|
13
|
+
function setEnabledSettingSourcesFromCli(sources) {
|
|
14
|
+
if (sources === void 0) return;
|
|
15
|
+
const trimmed = sources.trim();
|
|
16
|
+
if (!trimmed) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
`Invalid --setting-sources value: ${JSON.stringify(sources)}. Expected a comma-separated list of: user, project, local.`
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
const parts = trimmed.split(",").map((p) => p.trim()).filter(Boolean);
|
|
22
|
+
const next = /* @__PURE__ */ new Set();
|
|
23
|
+
const unknown = [];
|
|
24
|
+
for (const part of parts) {
|
|
25
|
+
const key = part.toLowerCase();
|
|
26
|
+
const mapped = CLI_TO_SETTING_SOURCE[key];
|
|
27
|
+
if (!mapped) {
|
|
28
|
+
unknown.push(part);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
next.add(mapped);
|
|
32
|
+
}
|
|
33
|
+
if (unknown.length > 0) {
|
|
34
|
+
throw new Error(
|
|
35
|
+
`Unknown setting source(s): ${unknown.join(", ")}. Expected: user, project, local.`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
enabledSettingSources = next;
|
|
39
|
+
}
|
|
40
|
+
function isSettingSourceEnabled(source) {
|
|
41
|
+
return enabledSettingSources.has(source);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
setEnabledSettingSourcesFromCli,
|
|
46
|
+
isSettingSourceEnabled
|
|
47
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/config/settingSources.ts"],
|
|
4
|
+
"sourcesContent": ["export type SettingSource = 'userSettings' | 'projectSettings' | 'localSettings'\r\n\r\nconst CLI_TO_SETTING_SOURCE: Record<string, SettingSource> = {\r\n user: 'userSettings',\r\n project: 'projectSettings',\r\n local: 'localSettings',\r\n}\r\n\r\nlet enabledSettingSources: Set<SettingSource> = new Set(\r\n Object.values(CLI_TO_SETTING_SOURCE),\r\n)\r\n\r\nexport function setEnabledSettingSourcesFromCli(\r\n sources: string | undefined,\r\n): void {\r\n if (sources === undefined) return\r\n\r\n const trimmed = sources.trim()\r\n if (!trimmed) {\r\n throw new Error(\r\n `Invalid --setting-sources value: ${JSON.stringify(sources)}. Expected a comma-separated list of: user, project, local.`,\r\n )\r\n }\r\n\r\n const parts = trimmed\r\n .split(',')\r\n .map(p => p.trim())\r\n .filter(Boolean)\r\n\r\n const next = new Set<SettingSource>()\r\n const unknown: string[] = []\r\n\r\n for (const part of parts) {\r\n const key = part.toLowerCase()\r\n const mapped = CLI_TO_SETTING_SOURCE[key]\r\n if (!mapped) {\r\n unknown.push(part)\r\n continue\r\n }\r\n next.add(mapped)\r\n }\r\n\r\n if (unknown.length > 0) {\r\n throw new Error(\r\n `Unknown setting source(s): ${unknown.join(', ')}. Expected: user, project, local.`,\r\n )\r\n }\r\n\r\n enabledSettingSources = next\r\n}\r\n\r\nexport function isSettingSourceEnabled(source: SettingSource): boolean {\r\n return enabledSettingSources.has(source)\r\n}\r\n\r\nexport function __resetSettingSourcesForTests(): void {\r\n enabledSettingSources = new Set(Object.values(CLI_TO_SETTING_SOURCE))\r\n}\r\n\r\n"],
|
|
5
|
+
"mappings": ";;;;AAEA,IAAM,wBAAuD;AAAA,EAC3D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AAEA,IAAI,wBAA4C,IAAI;AAAA,EAClD,OAAO,OAAO,qBAAqB;AACrC;AAEO,SAAS,gCACd,SACM;AACN,MAAI,YAAY,OAAW;AAE3B,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,oCAAoC,KAAK,UAAU,OAAO,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,QAAQ,QACX,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAEjB,QAAM,OAAO,oBAAI,IAAmB;AACpC,QAAM,UAAoB,CAAC;AAE3B,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,SAAS,sBAAsB,GAAG;AACxC,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,SAAK,IAAI,MAAM;AAAA,EACjB;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,8BAA8B,QAAQ,KAAK,IAAI,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,0BAAwB;AAC1B;AAEO,SAAS,uBAAuB,QAAgC;AACrE,SAAO,sBAAsB,IAAI,MAAM;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
|
+
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/utils/text/uuid.ts
|
|
5
|
+
var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
6
|
+
function isUuid(value) {
|
|
7
|
+
return UUID_RE.test(value.trim());
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
isUuid
|
|
12
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/text/uuid.ts"],
|
|
4
|
+
"sourcesContent": ["const UUID_RE =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\r\n\r\nexport function isUuid(value: string): boolean {\r\n return UUID_RE.test(value.trim())\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;AAAA,IAAM,UACJ;AAEK,SAAS,OAAO,OAAwB;AAC7C,SAAO,QAAQ,KAAK,MAAM,KAAK,CAAC;AAClC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
|
+
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/utils/text/errors.ts
|
|
5
|
+
var MalformedCommandError = class extends TypeError {
|
|
6
|
+
};
|
|
7
|
+
var AbortError = class extends Error {
|
|
8
|
+
};
|
|
9
|
+
var ConfigParseError = class extends Error {
|
|
10
|
+
filePath;
|
|
11
|
+
defaultConfig;
|
|
12
|
+
constructor(message, filePath, defaultConfig) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "ConfigParseError";
|
|
15
|
+
this.filePath = filePath;
|
|
16
|
+
this.defaultConfig = defaultConfig;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
MalformedCommandError,
|
|
22
|
+
AbortError,
|
|
23
|
+
ConfigParseError
|
|
24
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/text/errors.ts"],
|
|
4
|
+
"sourcesContent": ["export class MalformedCommandError extends TypeError {}\r\n\r\nexport class DeprecatedCommandError extends Error {}\r\n\r\nexport class AbortError extends Error {}\r\n\r\nexport class ConfigParseError extends Error {\r\n filePath: string\r\n defaultConfig: unknown\r\n\r\n constructor(message: string, filePath: string, defaultConfig: unknown) {\r\n super(message)\r\n this.name = 'ConfigParseError'\r\n this.filePath = filePath\r\n this.defaultConfig = defaultConfig\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;AAAO,IAAM,wBAAN,cAAoC,UAAU;AAAC;AAI/C,IAAM,aAAN,cAAyB,MAAM;AAAC;AAEhC,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,UAAkB,eAAwB;AACrE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,gBAAgB;AAAA,EACvB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|