pybao-cli 1.3.3 → 1.3.5
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/README.md +1 -440
- package/README.zh-CN.md +35 -35
- package/cli-acp.js +3 -3
- package/cli.js +4 -4
- package/dist/REPL-4YZC3LJO.js +42 -0
- package/dist/{acp-75HO2LBV.js → acp-SE4B3WSL.js} +43 -43
- package/dist/acp-SE4B3WSL.js.map +7 -0
- package/dist/{agentsValidate-6Z57ARKC.js → agentsValidate-LZISHE5F.js} +15 -15
- package/dist/agentsValidate-LZISHE5F.js.map +7 -0
- package/dist/{ask-NXXXCGY4.js → ask-5IDOHI4E.js} +26 -26
- package/dist/ask-5IDOHI4E.js.map +7 -0
- package/dist/{autoUpdater-PJMGNPUG.js → autoUpdater-ECGS62JN.js} +3 -3
- package/dist/{chunk-6RZIUY5K.js → chunk-3X2KNIS3.js} +5 -5
- package/dist/chunk-3X2KNIS3.js.map +7 -0
- package/dist/{chunk-VTVTEE5N.js → chunk-4U4MLA4R.js} +18 -18
- package/dist/chunk-4U4MLA4R.js.map +7 -0
- package/dist/{chunk-PCXUZ6AT.js → chunk-5AGDLQAW.js} +3 -3
- package/dist/chunk-5AGDLQAW.js.map +7 -0
- package/dist/{chunk-27GYWUY2.js → chunk-5JHD6MUL.js} +3 -3
- package/dist/chunk-5JHD6MUL.js.map +7 -0
- package/dist/{chunk-Z3HMXDXP.js → chunk-5JTKXNG4.js} +6 -6
- package/dist/chunk-5JTKXNG4.js.map +7 -0
- package/dist/{chunk-HIRIJ2LQ.js → chunk-5UJ7KHM7.js} +34 -33
- package/dist/chunk-5UJ7KHM7.js.map +7 -0
- package/dist/{chunk-JKGOGSFT.js → chunk-6BSVSUGW.js} +3 -3
- package/dist/{chunk-4XPNRLJG.js → chunk-AT7FEIUK.js} +7 -7
- package/dist/chunk-AT7FEIUK.js.map +7 -0
- package/dist/{chunk-T6GVXTNQ.js → chunk-B6IMQJZM.js} +7 -7
- package/dist/chunk-B6IMQJZM.js.map +7 -0
- package/dist/{chunk-ZJGXEWKF.js → chunk-BO63S4OP.js} +9 -9
- package/dist/chunk-BO63S4OP.js.map +7 -0
- package/dist/{chunk-6WELHKDA.js → chunk-C66U55GA.js} +11 -11
- package/dist/chunk-C66U55GA.js.map +7 -0
- package/dist/{chunk-3KNGJX7Q.js → chunk-CTKC574I.js} +11 -11
- package/dist/chunk-CTKC574I.js.map +7 -0
- package/dist/{chunk-QBHEERCF.js → chunk-E2R24MD6.js} +139 -129
- package/dist/chunk-E2R24MD6.js.map +7 -0
- package/dist/{chunk-3PDD7M4T.js → chunk-EGHIB45T.js} +5 -5
- package/dist/chunk-EGHIB45T.js.map +7 -0
- package/dist/{chunk-TXFCNQDE.js → chunk-G2W2B3A3.js} +25 -25
- package/dist/chunk-G2W2B3A3.js.map +7 -0
- package/dist/{chunk-XXFY63TM.js → chunk-HBWCMS4E.js} +7 -7
- package/dist/chunk-HBWCMS4E.js.map +7 -0
- package/dist/{chunk-3ZNSAB7B.js → chunk-KVP2VINI.js} +4 -4
- package/dist/chunk-KVP2VINI.js.map +7 -0
- package/dist/{chunk-JZDE77EH.js → chunk-MLU76W2R.js} +3 -3
- package/dist/{chunk-SWYJOV5E.js → chunk-MRHGVQ5T.js} +1 -1
- package/dist/{chunk-SWYJOV5E.js.map → chunk-MRHGVQ5T.js.map} +1 -1
- package/dist/{chunk-VRGR4ZTQ.js → chunk-MWPFU2KU.js} +2 -2
- package/dist/chunk-MWPFU2KU.js.map +7 -0
- package/dist/{chunk-7AAE6EO2.js → chunk-NAXCFXKW.js} +7 -7
- package/dist/chunk-NAXCFXKW.js.map +7 -0
- package/dist/{chunk-ICTEVBLN.js → chunk-NRKOXQT5.js} +11 -11
- package/dist/chunk-NRKOXQT5.js.map +7 -0
- package/dist/{chunk-BQA2EOUU.js → chunk-OTNHBUGC.js} +5 -5
- package/dist/chunk-OTNHBUGC.js.map +7 -0
- package/dist/{chunk-WPTPPOYN.js → chunk-PGLKCZAE.js} +2 -2
- package/dist/{chunk-UUNVJZWA.js → chunk-PMKSJ3AZ.js} +3 -3
- package/dist/chunk-PMKSJ3AZ.js.map +7 -0
- package/dist/{chunk-QIHB5PYM.js → chunk-R6WNNB47.js} +6 -6
- package/dist/{chunk-QIHB5PYM.js.map → chunk-R6WNNB47.js.map} +2 -2
- package/dist/{chunk-Q24ZGKIE.js → chunk-V3AKMLFM.js} +14 -14
- package/dist/chunk-V3AKMLFM.js.map +7 -0
- package/dist/{chunk-T7GPUZVK.js → chunk-VF3J4G4Z.js} +27 -27
- package/dist/chunk-VF3J4G4Z.js.map +7 -0
- package/dist/{chunk-4SNFQYCY.js → chunk-VKMVP2QQ.js} +12 -12
- package/dist/chunk-VKMVP2QQ.js.map +7 -0
- package/dist/chunk-XI4LTVYT.js.map +7 -0
- package/dist/{chunk-A6PUMROK.js → chunk-YDXW3IJK.js} +4 -4
- package/dist/{chunk-A6PUMROK.js.map → chunk-YDXW3IJK.js.map} +1 -1
- package/dist/{chunk-HB2P6645.js → chunk-ZZQ6WGYG.js} +4 -4
- package/dist/{cli-RFYBXM7F.js → cli-MBYLENJH.js} +119 -119
- package/dist/cli-MBYLENJH.js.map +7 -0
- package/dist/commands-ECIN5O3E.js +46 -0
- package/dist/{config-5OPX3H2K.js → config-45ETSXTS.js} +4 -4
- package/dist/{context-THRRBPFP.js → context-34YXWOMP.js} +5 -5
- package/dist/{customCommands-4XOZH44N.js → customCommands-J52KDUBX.js} +4 -4
- package/dist/{env-EL4KBHMB.js → env-ODQXSPMW.js} +8 -8
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/{llm-A3BCM4Q2.js → llm-BBYIGM3X.js} +34 -34
- package/dist/llm-BBYIGM3X.js.map +7 -0
- package/dist/{llmLazy-ZJSRLZVD.js → llmLazy-VHWTJ7FY.js} +1 -1
- package/dist/{loader-HZQBWO74.js → loader-TXZ3EJZO.js} +4 -4
- package/dist/{mcp-XKOJ55B2.js → mcp-SHR6KH2Y.js} +7 -7
- package/dist/{mentionProcessor-ANYU5MLF.js → mentionProcessor-CDELTWDV.js} +5 -5
- package/dist/{messages-75DL5XBP.js → messages-R4ICGYOI.js} +1 -1
- package/dist/{model-OPJGJZRC.js → model-AO4OE46E.js} +5 -5
- package/dist/{openai-DT54BAFP.js → openai-F7WL45GM.js} +5 -5
- package/dist/{outputStyles-TPFVI52O.js → outputStyles-BWAE3CTZ.js} +4 -4
- package/dist/{pluginRuntime-W74PYSZ4.js → pluginRuntime-AHKVCUSE.js} +8 -8
- package/dist/pluginRuntime-AHKVCUSE.js.map +7 -0
- package/dist/{pluginValidation-FALYRVI2.js → pluginValidation-YSUVH4GM.js} +6 -6
- package/dist/prompts-4AUAETB4.js +48 -0
- package/dist/pybAgentSessionId-3HDHCCI5.js +13 -0
- package/dist/pybAgentSessionLoad-5FMAFO4P.js +18 -0
- package/dist/pybAgentSessionResume-GCVJHXVV.js +16 -0
- package/dist/{kodeAgentStreamJson-3T26CHCP.js → pybAgentStreamJson-UG22YE4Z.js} +5 -5
- package/dist/{kodeAgentStreamJsonSession-BZS2VDCY.js → pybAgentStreamJsonSession-BRWXPZ5Z.js} +9 -9
- package/dist/pybAgentStreamJsonSession-BRWXPZ5Z.js.map +7 -0
- package/dist/{kodeAgentStructuredStdio-TNB6U6SP.js → pybAgentStructuredStdio-QDF6UGAJ.js} +3 -3
- package/dist/{kodeHooks-VUAWIY2D.js → pybHooks-WXEUSK2Y.js} +7 -7
- package/dist/query-JNWSOFYQ.js +50 -0
- package/dist/{ripgrep-XJGSUBG7.js → ripgrep-ON745BFW.js} +3 -3
- package/dist/{skillMarketplace-AUGKNCPW.js → skillMarketplace-ZLW4PQFC.js} +3 -3
- package/dist/{state-DQYRXKTG.js → state-E57SH5ZM.js} +2 -2
- package/dist/{theme-MS5HDUBJ.js → theme-XJG6O2YU.js} +5 -5
- package/dist/{toolPermissionSettings-4MPZVYDR.js → toolPermissionSettings-BXLCU7BK.js} +6 -6
- package/dist/tools-UJZBVLIU.js +47 -0
- package/dist/{userInput-F2PGBRFU.js → userInput-IVM4BDPE.js} +34 -34
- package/dist/userInput-IVM4BDPE.js.map +7 -0
- package/package.json +1 -1
- package/scripts/binary-utils.cjs +8 -8
- package/scripts/cli-acp-wrapper.cjs +3 -3
- package/scripts/cli-wrapper.cjs +4 -4
- package/scripts/postinstall.js +7 -7
- package/dist/REPL-WPV32MTF.js +0 -42
- package/dist/acp-75HO2LBV.js.map +0 -7
- package/dist/agentsValidate-6Z57ARKC.js.map +0 -7
- package/dist/ask-NXXXCGY4.js.map +0 -7
- package/dist/chunk-27GYWUY2.js.map +0 -7
- package/dist/chunk-3KNGJX7Q.js.map +0 -7
- package/dist/chunk-3PDD7M4T.js.map +0 -7
- package/dist/chunk-3ZNSAB7B.js.map +0 -7
- package/dist/chunk-4SNFQYCY.js.map +0 -7
- package/dist/chunk-4XPNRLJG.js.map +0 -7
- package/dist/chunk-6RZIUY5K.js.map +0 -7
- package/dist/chunk-6WELHKDA.js.map +0 -7
- package/dist/chunk-7AAE6EO2.js.map +0 -7
- package/dist/chunk-BQA2EOUU.js.map +0 -7
- package/dist/chunk-HIRIJ2LQ.js.map +0 -7
- package/dist/chunk-ICTEVBLN.js.map +0 -7
- package/dist/chunk-M624LT6O.js.map +0 -7
- package/dist/chunk-PCXUZ6AT.js.map +0 -7
- package/dist/chunk-Q24ZGKIE.js.map +0 -7
- package/dist/chunk-QBHEERCF.js.map +0 -7
- package/dist/chunk-T6GVXTNQ.js.map +0 -7
- package/dist/chunk-T7GPUZVK.js.map +0 -7
- package/dist/chunk-TXFCNQDE.js.map +0 -7
- package/dist/chunk-UUNVJZWA.js.map +0 -7
- package/dist/chunk-VRGR4ZTQ.js.map +0 -7
- package/dist/chunk-VTVTEE5N.js.map +0 -7
- package/dist/chunk-XXFY63TM.js.map +0 -7
- package/dist/chunk-Z3HMXDXP.js.map +0 -7
- package/dist/chunk-ZJGXEWKF.js.map +0 -7
- package/dist/cli-RFYBXM7F.js.map +0 -7
- package/dist/commands-YOXMODDO.js +0 -46
- package/dist/kodeAgentSessionId-PROTVRBR.js +0 -13
- package/dist/kodeAgentSessionLoad-UMPV7MC3.js +0 -18
- package/dist/kodeAgentSessionResume-YJS4FVQM.js +0 -16
- package/dist/kodeAgentStreamJsonSession-BZS2VDCY.js.map +0 -7
- package/dist/llm-A3BCM4Q2.js.map +0 -7
- package/dist/pluginRuntime-W74PYSZ4.js.map +0 -7
- package/dist/prompts-J4TPRMJ3.js +0 -48
- package/dist/query-K3QKBVDN.js +0 -50
- package/dist/tools-QW6SIJLJ.js +0 -47
- package/dist/userInput-F2PGBRFU.js.map +0 -7
- /package/dist/{REPL-WPV32MTF.js.map → REPL-4YZC3LJO.js.map} +0 -0
- /package/dist/{autoUpdater-PJMGNPUG.js.map → autoUpdater-ECGS62JN.js.map} +0 -0
- /package/dist/{chunk-JKGOGSFT.js.map → chunk-6BSVSUGW.js.map} +0 -0
- /package/dist/{chunk-JZDE77EH.js.map → chunk-MLU76W2R.js.map} +0 -0
- /package/dist/{chunk-WPTPPOYN.js.map → chunk-PGLKCZAE.js.map} +0 -0
- /package/dist/{chunk-M624LT6O.js → chunk-XI4LTVYT.js} +0 -0
- /package/dist/{chunk-HB2P6645.js.map → chunk-ZZQ6WGYG.js.map} +0 -0
- /package/dist/{commands-YOXMODDO.js.map → commands-ECIN5O3E.js.map} +0 -0
- /package/dist/{config-5OPX3H2K.js.map → config-45ETSXTS.js.map} +0 -0
- /package/dist/{context-THRRBPFP.js.map → context-34YXWOMP.js.map} +0 -0
- /package/dist/{customCommands-4XOZH44N.js.map → customCommands-J52KDUBX.js.map} +0 -0
- /package/dist/{env-EL4KBHMB.js.map → env-ODQXSPMW.js.map} +0 -0
- /package/dist/{kodeAgentSessionId-PROTVRBR.js.map → llmLazy-VHWTJ7FY.js.map} +0 -0
- /package/dist/{kodeAgentSessionLoad-UMPV7MC3.js.map → loader-TXZ3EJZO.js.map} +0 -0
- /package/dist/{kodeAgentSessionResume-YJS4FVQM.js.map → mcp-SHR6KH2Y.js.map} +0 -0
- /package/dist/{mentionProcessor-ANYU5MLF.js.map → mentionProcessor-CDELTWDV.js.map} +0 -0
- /package/dist/{kodeAgentStreamJson-3T26CHCP.js.map → messages-R4ICGYOI.js.map} +0 -0
- /package/dist/{kodeAgentStructuredStdio-TNB6U6SP.js.map → model-AO4OE46E.js.map} +0 -0
- /package/dist/{kodeHooks-VUAWIY2D.js.map → openai-F7WL45GM.js.map} +0 -0
- /package/dist/{llmLazy-ZJSRLZVD.js.map → outputStyles-BWAE3CTZ.js.map} +0 -0
- /package/dist/{loader-HZQBWO74.js.map → pluginValidation-YSUVH4GM.js.map} +0 -0
- /package/dist/{mcp-XKOJ55B2.js.map → prompts-4AUAETB4.js.map} +0 -0
- /package/dist/{messages-75DL5XBP.js.map → pybAgentSessionId-3HDHCCI5.js.map} +0 -0
- /package/dist/{model-OPJGJZRC.js.map → pybAgentSessionLoad-5FMAFO4P.js.map} +0 -0
- /package/dist/{openai-DT54BAFP.js.map → pybAgentSessionResume-GCVJHXVV.js.map} +0 -0
- /package/dist/{outputStyles-TPFVI52O.js.map → pybAgentStreamJson-UG22YE4Z.js.map} +0 -0
- /package/dist/{pluginValidation-FALYRVI2.js.map → pybAgentStructuredStdio-QDF6UGAJ.js.map} +0 -0
- /package/dist/{prompts-J4TPRMJ3.js.map → pybHooks-WXEUSK2Y.js.map} +0 -0
- /package/dist/{query-K3QKBVDN.js.map → query-JNWSOFYQ.js.map} +0 -0
- /package/dist/{ripgrep-XJGSUBG7.js.map → ripgrep-ON745BFW.js.map} +0 -0
- /package/dist/{skillMarketplace-AUGKNCPW.js.map → skillMarketplace-ZLW4PQFC.js.map} +0 -0
- /package/dist/{state-DQYRXKTG.js.map → state-E57SH5ZM.js.map} +0 -0
- /package/dist/{theme-MS5HDUBJ.js.map → theme-XJG6O2YU.js.map} +0 -0
- /package/dist/{toolPermissionSettings-4MPZVYDR.js.map → toolPermissionSettings-BXLCU7BK.js.map} +0 -0
- /package/dist/{tools-QW6SIJLJ.js.map → tools-UJZBVLIU.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/log/debugLogger.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, mkdirSync, appendFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { format } from 'node:util'\nimport chalk from 'chalk'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { SESSION_ID } from './index'\nimport type { Message } from '@kode-types/conversation'\n\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',\n}\n\nconst isDebugMode = () =>\n process.argv.includes('--debug-verbose') ||\n process.argv.includes('--mcp-debug') ||\n process.argv.some(\n arg => arg === '--debug' || arg === '-d' || arg.startsWith('--debug='),\n )\nconst isVerboseMode = () => process.argv.includes('--verbose')\nconst isDebugVerboseMode = () => process.argv.includes('--debug-verbose')\n\nconst TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.INFO,\n LogLevel.REMINDER,\n])\n\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,\n])\n\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\nconst STARTUP_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-')\nconst REQUEST_START_TIME = Date.now()\n\nconst KODE_DIR = join(homedir(), '.kode')\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nconst DEBUG_PATHS = {\n base: () => join(KODE_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\nfunction ensureDebugDir() {\n const debugDir = DEBUG_PATHS.base()\n if (!existsSync(debugDir)) {\n mkdirSync(debugDir, { recursive: true })\n }\n}\n\ninterface LogEntry {\n timestamp: string\n level: LogLevel\n phase: string\n requestId?: string\n data: any\n elapsed?: number\n}\n\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\nconst activeRequests = new Map<string, RequestContext>()\nlet currentRequest: RequestContext | null = null\n\nfunction terminalLog(...args: unknown[]): void {\n process.stderr.write(`${format(...args)}\\n`)\n}\n\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 }\n}\n\nconst recentLogs = new Map<string, number>()\nconst LOG_DEDUPE_WINDOW_MS = 5000\n\nfunction getDedupeKey(level: LogLevel, phase: string, data: any): string {\n if (phase.startsWith('CONFIG_')) {\n const file = data?.file || ''\n return `${level}:${phase}:${file}`\n }\n\n return `${level}:${phase}`\n}\n\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 if (!lastLogTime || now - lastLogTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.set(key, now)\n\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 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 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)\n }\n } catch {\n }\n }\n\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\nfunction shouldShowInTerminal(level: LogLevel): boolean {\n if (!isDebugMode()) return false\n\n if (isDebugVerboseMode()) {\n return DEBUG_VERBOSE_TERMINAL_LOG_LEVELS.has(level)\n }\n\n return TERMINAL_LOG_LEVELS.has(level)\n}\n\nfunction logToTerminal(entry: LogEntry) {\n if (!shouldShowInTerminal(entry.level)) return\n\n const { level, phase, data, requestId, elapsed } = entry\n const timestamp = new Date().toISOString().slice(11, 23)\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 let dataStr = ''\n if (typeof data === 'object' && data !== null) {\n if (data.messages) {\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 terminalLog(\n `${color(`[${timestamp}]`)} ${prefix} ${color(phase)} ${reqId} ${dataStr} ${elapsedStr}`,\n )\n}\n\nexport function debugLog(\n level: LogLevel,\n phase: string,\n data: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n if (!shouldLogWithDedupe(level, phase, data)) {\n return\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 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 logToTerminal(entry)\n}\n\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 ui: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, `UI_${phase}`, data, requestId),\n}\n\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\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\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\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(KODE_DIR, 'logs', 'error', 'api')\n\n if (!existsSync(errorDir)) {\n try {\n mkdirSync(errorDir, { recursive: true })\n } catch (err) {\n terminalLog('Failed to create error log directory:', err)\n return\n }\n }\n\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 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,\n response: context.response,\n environment: {\n nodeVersion: process.version,\n platform: process.platform,\n cwd: process.cwd(),\n },\n }\n\n try {\n appendFileSync(filepath, JSON.stringify(fullLogContent, null, 2) + '\\n')\n appendFileSync(filepath, '='.repeat(80) + '\\n\\n')\n } catch (err) {\n terminalLog('Failed to write API error log:', err)\n }\n\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 if (isVerboseMode() || isDebugVerboseMode()) {\n terminalLog()\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog(chalk.red.bold('\u26A0\uFE0F API Error'))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n\n terminalLog(chalk.white(' Model: ') + chalk.yellow(context.model))\n terminalLog(chalk.white(' Status: ') + chalk.red(context.status))\n\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 terminalLog(chalk.white(' Error: ') + chalk.red(errorMessage))\n\n if (context.response) {\n terminalLog()\n terminalLog(chalk.gray(' Response:'))\n const responseStr =\n typeof context.response === 'string'\n ? context.response\n : JSON.stringify(context.response, null, 2)\n\n responseStr.split('\\n').forEach(line => {\n terminalLog(chalk.gray(' ' + line))\n })\n }\n\n terminalLog()\n terminalLog(chalk.dim(` \uD83D\uDCC1 Full log: ${filepath}`))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog()\n }\n}\n\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 terminalLog('\\n' + chalk.blue('\uD83E\uDDE0 LLM CALL DEBUG'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.yellow('\uD83D\uDCCA Context Overview:'))\n terminalLog(` Messages Count: ${context.messages.length}`)\n terminalLog(` System Prompt Length: ${context.systemPrompt.length} chars`)\n terminalLog(` Duration: ${duration.toFixed(0)}ms`)\n\n if (context.usage) {\n terminalLog(\n ` Token Usage: ${context.usage.inputTokens} \u2192 ${context.usage.outputTokens}`,\n )\n }\n\n const apiLabel = context.apiFormat\n ? ` (${context.apiFormat.toUpperCase()})`\n : ''\n terminalLog(chalk.cyan(`\\n\uD83D\uDCAC Real API Messages${apiLabel} (last 10):`))\n\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 if (msg.content.includes('<system-reminder>')) {\n isReminder = true\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 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 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 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 if (isReminder) {\n terminalLog(\n ` [${globalIndex}] ${chalk.magenta('\uD83D\uDD14 REMINDER')}: ${chalk.dim(content)}`,\n )\n } else {\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 terminalLog(\n ` [${globalIndex}] ${(chalk as any)[roleColor](roleIcon + ' ' + msg.role.toUpperCase())}: ${content}`,\n )\n }\n\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 terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${toolCalls.length}): ${toolCalls.map((t: any) => t.name).join(', ')}`,\n ),\n )\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 terminalLog(\n chalk.dim(` [${idx}] ${tool.name}: ${displayInput}`),\n )\n })\n }\n }\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n terminalLog(\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 terminalLog(\n chalk.dim(` [${idx}] ${tool.function.name}: ${displayInput}`),\n )\n })\n }\n })\n\n terminalLog(chalk.magenta('\\n\uD83E\uDD16 LLM Response:'))\n\n let responseContent = ''\n let toolCalls: any[] = []\n\n if (Array.isArray(context.response.content)) {\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 responseContent = context.response.content\n toolCalls = context.response.tool_calls || context.response.toolCalls || []\n } else if (context.response.message?.content) {\n if (Array.isArray(context.response.message.content)) {\n const textBlocks = context.response.message.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.message.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.message.content === 'string') {\n responseContent = context.response.message.content\n }\n } else {\n responseContent = JSON.stringify(\n context.response.content || context.response || '',\n )\n }\n\n const maxResponseLength = 1000\n const displayContent =\n responseContent.length > maxResponseLength\n ? responseContent.substring(0, maxResponseLength) + '...'\n : responseContent\n terminalLog(` Content: ${displayContent}`)\n\n if (toolCalls.length > 0) {\n const toolNames = toolCalls.map(\n (t: any) => t.name || t.function?.name || 'unknown',\n )\n terminalLog(\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 const maxToolInputLength = 300\n const displayInput =\n inputStr.length > maxToolInputLength\n ? inputStr.substring(0, maxToolInputLength) + '...'\n : inputStr\n terminalLog(chalk.dim(` [${index}] ${toolName}: ${displayInput}`))\n })\n }\n\n terminalLog(\n ` Stop Reason: ${context.response.stop_reason || context.response.finish_reason || 'unknown'}`,\n )\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n}\n\nexport function logSystemPromptConstruction(construction: {\n basePrompt: string\n kodeContext?: string\n reminders: string[]\n finalPrompt: string\n}) {\n if (!isDebugMode()) return\n\n terminalLog('\\n' + chalk.yellow('\uD83D\uDCDD SYSTEM PROMPT CONSTRUCTION'))\n terminalLog(` Base Prompt: ${construction.basePrompt.length} chars`)\n\n if (construction.kodeContext) {\n terminalLog(` + Kode Context: ${construction.kodeContext.length} chars`)\n }\n\n if (construction.reminders.length > 0) {\n terminalLog(\n ` + Dynamic Reminders: ${construction.reminders.length} items`,\n )\n construction.reminders.forEach((reminder, index) => {\n terminalLog(chalk.dim(` [${index}] ${reminder.substring(0, 80)}...`))\n })\n }\n\n terminalLog(` = Final Length: ${construction.finalPrompt.length} chars`)\n}\n\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 terminalLog('\\n' + chalk.red('\uD83D\uDDDC\uFE0F CONTEXT COMPRESSION'))\n terminalLog(` Trigger: ${compression.trigger}`)\n terminalLog(\n ` Messages: ${compression.beforeMessages} \u2192 ${compression.afterMessages}`,\n )\n terminalLog(\n ` Compression Ratio: ${(compression.compressionRatio * 100).toFixed(1)}%`,\n )\n\n if (compression.preservedFiles.length > 0) {\n terminalLog(` Preserved Files: ${compression.preservedFiles.join(', ')}`)\n }\n}\n\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 terminalLog(`${color(`[${timestamp}]`)} ${icon} ${color(message)} ${reqId}`)\n}\n\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 const terminalLevels = isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS).join(', ')\n : Array.from(TERMINAL_LOG_LEVELS).join(', ')\n\n terminalLog(\n chalk.dim(`[DEBUG] Terminal output filtered to: ${terminalLevels}`),\n )\n terminalLog(\n chalk.dim(`[DEBUG] Complete logs saved to: ${DEBUG_PATHS.base()}`),\n )\n if (!isDebugVerboseMode()) {\n terminalLog(\n chalk.dim(\n `[DEBUG] Use --debug-verbose for detailed system logs (FLOW, API, STATE)`,\n ),\n )\n }\n}\n\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 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 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 ~/.kode/ \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 kode 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 kode config \u547D\u4EE4\u67E5\u770B\u5F53\u524D\u914D\u7F6E',\n ],\n }\n }\n\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 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 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 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 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 kode 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 ~/.kode/config.json | jq',\n '\u67E5\u770B\u914D\u7F6E\u7F13\u5B58\u76F8\u5173\u7684\u8C03\u8BD5\u4FE1\u606F',\n ],\n }\n }\n\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 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 terminalLog('\\n' + chalk.red('\uD83D\uDEA8 ERROR DIAGNOSIS'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.red(`\u274C ${diagnosis.errorType}`))\n terminalLog(\n chalk.dim(\n `Category: ${diagnosis.category} | Severity: ${diagnosis.severity}`,\n ),\n )\n terminalLog(`\\n${diagnosis.description}`)\n\n terminalLog(chalk.yellow('\\n\uD83D\uDCA1 Recovery Suggestions:'))\n diagnosis.suggestions.forEach((suggestion, index) => {\n terminalLog(` ${index + 1}. ${suggestion}`)\n })\n\n terminalLog(chalk.cyan('\\n\uD83D\uDD0D Debug Steps:'))\n diagnosis.debugSteps.forEach((step, index) => {\n terminalLog(` ${index + 1}. ${step}`)\n })\n\n if (diagnosis.relatedLogs && diagnosis.relatedLogs.length > 0) {\n terminalLog(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 terminalLog(chalk.dim(` ${truncatedLog}`))\n })\n }\n\n const debugPath = DEBUG_PATHS.base()\n terminalLog(chalk.gray(`\\n\uD83D\uDCC1 Complete logs: ${debugPath}`))\n terminalLog(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
|
-
"names": ["toolCalls"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/system/ripgrep.ts"],
|
|
4
|
-
"sourcesContent": ["import { rgPath } from '@vscode/ripgrep'\nimport { findActualExecutable } from 'spawn-rx'\nimport { memoize } from 'lodash-es'\nimport { existsSync } from 'node:fs'\nimport { execFile } from 'child_process'\nimport debug from 'debug'\nimport { quote } from 'shell-quote'\nimport { logError } from '@utils/log'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport type { BunShellSandboxOptions } from '@utils/bun/shell'\nimport { BunShell } from '@utils/bun/shell'\n\nconst d = debug('kode:ripgrep')\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\n}\n\nfunction resolveRipgrepPathOrThrow(): string {\n const explicit = process.env.KODE_RIPGREP_PATH\n if (explicit) {\n if (!existsSync(explicit)) {\n throw new Error(`KODE_RIPGREP_PATH points to a missing file: ${explicit}`)\n }\n return explicit\n }\n\n const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP)\n if (!preferBundled) {\n const { cmd } = findActualExecutable('rg', [])\n d(`ripgrep initially resolved as: ${cmd}`)\n if (cmd !== 'rg') {\n return cmd\n }\n }\n\n if (!rgPath || !existsSync(rgPath)) {\n throw new Error(\n [\n 'ripgrep (rg) was not found on PATH, and @vscode/ripgrep is missing.',\n 'Fix:',\n '- Install ripgrep: https://github.com/BurntSushi/ripgrep',\n '- Or reinstall @shareai-lab/kode (ensure dependencies are present)',\n ].join('\\n'),\n )\n }\n\n d('Using @vscode/ripgrep fallback: %s', rgPath)\n return rgPath\n}\n\nexport const getRipgrepPath = memoize((): string => resolveRipgrepPathOrThrow())\n\nexport async function ripGrep(\n args: string[],\n target: string,\n abortSignal: AbortSignal,\n options?: { sandbox?: BunShellSandboxOptions },\n): Promise<string[]> {\n await codesignRipgrepIfNecessary()\n const rg = getRipgrepPath()\n d('ripgrep called: %s %o', rg, target, args)\n\n if (options?.sandbox?.enabled === true) {\n const cmd = quote([rg, ...args, target])\n const result = await BunShell.getInstance().exec(cmd, abortSignal, 10_000, {\n sandbox: options.sandbox,\n })\n if (result.code === 1) return []\n if (result.code !== 0) {\n logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`)\n return []\n }\n return result.stdout.trim().split('\\n').filter(Boolean)\n }\n\n return new Promise(resolve => {\n execFile(\n rg,\n [...args, target],\n {\n maxBuffer: 1_000_000,\n signal: abortSignal,\n timeout: 10_000,\n },\n (error, stdout) => {\n if (error) {\n if (error.code !== 1) {\n d('ripgrep error: %o', error)\n logError(error)\n }\n resolve([])\n } else {\n d('ripgrep succeeded with %s', stdout)\n resolve(stdout.trim().split('\\n').filter(Boolean))\n }\n },\n )\n })\n}\n\nexport async function listAllContentFiles(\n path: string,\n abortSignal: AbortSignal,\n limit: number,\n): Promise<string[]> {\n try {\n d('listAllContentFiles called: %s', path)\n return (await ripGrep(['-l', '.', path], path, abortSignal)).slice(0, limit)\n } catch (e) {\n d('listAllContentFiles failed: %o', e)\n\n logError(e)\n return []\n }\n}\n\nlet alreadyDoneSignCheck = false\nasync function codesignRipgrepIfNecessary(): Promise<void> {\n if (process.platform !== 'darwin' || alreadyDoneSignCheck) {\n return\n }\n\n alreadyDoneSignCheck = true\n\n d('checking if ripgrep is already signed')\n const lines = (\n await execFileNoThrow(\n 'codesign',\n ['-vv', '-d', getRipgrepPath()],\n undefined,\n undefined,\n false,\n )\n ).stdout.split('\\n')\n\n const needsSigned = lines.find(line => line.includes('linker-signed'))\n if (!needsSigned) {\n d('seems to be already signed')\n return\n }\n\n try {\n d('signing ripgrep')\n const signResult = await execFileNoThrow('codesign', [\n '--sign',\n '-',\n '--force',\n '--preserve-metadata=entitlements,requirements,flags,runtime',\n getRipgrepPath(),\n ])\n\n if (signResult.code !== 0) {\n d('failed to sign ripgrep: %o', signResult)\n logError(\n `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`,\n )\n }\n\n d('removing quarantine')\n const quarantineResult = await execFileNoThrow('xattr', [\n '-d',\n 'com.apple.quarantine',\n getRipgrepPath(),\n ])\n\n if (quarantineResult.code !== 0) {\n d('failed to remove quarantine: %o', quarantineResult)\n logError(\n `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`,\n )\n }\n } catch (e) {\n d('failed during sign: %o', e)\n logError(e)\n }\n}\n\nexport function resetRipgrepPathCacheForTests(): void {\n ;(getRipgrepPath as any).cache?.clear?.()\n alreadyDoneSignCheck = false\n}\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/config/style.ts", "../src/utils/config/projectInstructions.ts", "../src/context/index.ts", "../src/utils/system/git.ts", "../src/utils/identity/user.ts"],
|
|
4
|
-
"sourcesContent": ["import { readFileSync } from 'fs'\nimport { memoize } from 'lodash-es'\nimport { getCwd } from '@utils/state'\nimport { getProjectInstructionFiles } from './projectInstructions'\n\nconst STYLE_PROMPT =\n 'The codebase follows strict style guidelines shown below. All code changes must strictly adhere to these guidelines to maintain consistency and quality.'\n\nexport const getCodeStyle = memoize((): string => {\n const styles: string[] = []\n\n const instructionFiles = getProjectInstructionFiles(getCwd())\n for (const file of instructionFiles) {\n try {\n styles.push(\n `Contents of ${file.absolutePath}:\\n\\n${readFileSync(file.absolutePath, 'utf-8')}`,\n )\n } catch {\n }\n }\n\n if (styles.length === 0) {\n return ''\n }\n\n return `${STYLE_PROMPT}\\n\\n${styles.join('\\n\\n')}`\n})\n", "import { existsSync, readFileSync } from 'fs'\nimport { dirname, join, parse, relative, resolve, sep } from 'path'\n\nexport type ProjectInstructionFile = {\n absolutePath: string\n relativePathFromGitRoot: string\n filename: 'AGENTS.override.md' | 'AGENTS.md'\n}\n\nconst DEFAULT_PROJECT_DOC_MAX_BYTES = 32 * 1024\n\nfunction isRegularFile(path: string): boolean {\n try {\n return existsSync(path)\n } catch {\n return false\n }\n}\n\nexport function findGitRoot(startDir: string): string | null {\n let currentDir = resolve(startDir)\n const fsRoot = parse(currentDir).root\n\n while (true) {\n const dotGitPath = join(currentDir, '.git')\n if (existsSync(dotGitPath)) {\n return currentDir\n }\n if (currentDir === fsRoot) {\n return null\n }\n currentDir = dirname(currentDir)\n }\n}\n\nfunction getDirsFromGitRootToCwd(gitRoot: string, cwd: string): string[] {\n const absoluteGitRoot = resolve(gitRoot)\n const absoluteCwd = resolve(cwd)\n\n const rel = relative(absoluteGitRoot, absoluteCwd)\n if (!rel || rel === '.') {\n return [absoluteGitRoot]\n }\n\n const parts = rel.split(sep).filter(Boolean)\n const dirs: string[] = [absoluteGitRoot]\n for (let i = 0; i < parts.length; i++) {\n dirs.push(join(absoluteGitRoot, ...parts.slice(0, i + 1)))\n }\n return dirs\n}\n\nexport function getProjectInstructionFiles(\n cwd: string,\n): ProjectInstructionFile[] {\n const gitRoot = findGitRoot(cwd)\n const root = gitRoot ?? resolve(cwd)\n const dirs = getDirsFromGitRootToCwd(root, cwd)\n\n const results: ProjectInstructionFile[] = []\n for (const dir of dirs) {\n const overridePath = join(dir, 'AGENTS.override.md')\n const agentsPath = join(dir, 'AGENTS.md')\n\n if (isRegularFile(overridePath)) {\n results.push({\n absolutePath: overridePath,\n relativePathFromGitRoot:\n relative(root, overridePath) || 'AGENTS.override.md',\n filename: 'AGENTS.override.md',\n })\n continue\n }\n\n if (isRegularFile(agentsPath)) {\n results.push({\n absolutePath: agentsPath,\n relativePathFromGitRoot: relative(root, agentsPath) || 'AGENTS.md',\n filename: 'AGENTS.md',\n })\n }\n }\n\n return results\n}\n\nexport function getProjectDocMaxBytes(): number {\n const raw = process.env.KODE_PROJECT_DOC_MAX_BYTES\n if (!raw) return DEFAULT_PROJECT_DOC_MAX_BYTES\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isFinite(parsed) || parsed <= 0)\n return DEFAULT_PROJECT_DOC_MAX_BYTES\n return parsed\n}\n\nexport function readAndConcatProjectInstructionFiles(\n files: ProjectInstructionFile[],\n {\n maxBytes = getProjectDocMaxBytes(),\n includeHeadings = true,\n }: { maxBytes?: number; includeHeadings?: boolean } = {},\n): { content: string; truncated: boolean } {\n let totalBytes = 0\n let truncated = false\n\n const parts: string[] = []\n\n const truncateUtf8ToBytes = (value: string, bytes: number): string => {\n const buf = Buffer.from(value, 'utf8')\n if (buf.length <= bytes) return value\n return buf.subarray(0, Math.max(0, bytes)).toString('utf8')\n }\n\n for (const file of files) {\n if (totalBytes >= maxBytes) {\n truncated = true\n break\n }\n\n let raw: string\n try {\n raw = readFileSync(file.absolutePath, 'utf-8')\n } catch {\n continue\n }\n\n if (!raw.trim()) continue\n\n const separator = parts.length > 0 ? '\\n\\n' : ''\n const separatorBytes = Buffer.byteLength(separator, 'utf8')\n const remainingAfterSeparator = maxBytes - totalBytes - separatorBytes\n if (remainingAfterSeparator <= 0) {\n truncated = true\n break\n }\n\n const heading = includeHeadings\n ? `# ${file.filename}\\n\\n_Path: ${file.relativePathFromGitRoot}_\\n\\n`\n : ''\n\n const block = `${heading}${raw}`.trimEnd()\n const blockBytes = Buffer.byteLength(block, 'utf8')\n\n if (blockBytes <= remainingAfterSeparator) {\n parts.push(`${separator}${block}`)\n totalBytes += separatorBytes + blockBytes\n continue\n }\n\n truncated = true\n const suffix = `\\n\\n... (truncated: project instruction files exceeded ${maxBytes} bytes)`\n const suffixBytes = Buffer.byteLength(suffix, 'utf8')\n\n let finalBlock = ''\n if (suffixBytes >= remainingAfterSeparator) {\n finalBlock = truncateUtf8ToBytes(suffix, remainingAfterSeparator)\n } else {\n const prefixBudget = remainingAfterSeparator - suffixBytes\n const prefix = truncateUtf8ToBytes(block, prefixBudget)\n finalBlock = `${prefix}${suffix}`\n }\n\n parts.push(`${separator}${finalBlock}`)\n totalBytes += separatorBytes + Buffer.byteLength(finalBlock, 'utf8')\n break\n }\n\n return { content: parts.join(''), truncated }\n}\n", "import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from '@utils/log'\nimport { getCodeStyle } from '@utils/config/style'\nimport { getCwd } from '@utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { getIsGit } from '@utils/system/git'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { join } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { getModelManager } from '@utils/model'\nimport { lastX } from '@utils/text/generators'\nimport { getGitEmail } from '@utils/identity/user'\nimport {\n getProjectInstructionFiles,\n readAndConcatProjectInstructionFiles,\n} from '@utils/config/projectInstructions'\nexport async function getInstructionFilesNote(): Promise<string | null> {\n try {\n const cwd = getCwd()\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n const hasLegacy = existsSync(legacyPath)\n\n if (instructionFiles.length === 0 && !hasLegacy) {\n return null\n }\n\n const fileTypes = new Set<string>()\n for (const f of instructionFiles) fileTypes.add(f.filename)\n if (hasLegacy) fileTypes.add('CLAUDE.md (legacy)')\n\n const allFiles = [\n ...instructionFiles.map(f => f.absolutePath),\n ...(hasLegacy ? [legacyPath] : []),\n ]\n\n return `NOTE: Additional project instruction files (${Array.from(fileTypes).join(', ')}) were found. When working in these directories, make sure to read and follow the instructions in the corresponding files:\\n${allFiles\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\nexport async function getProjectDocsForCwd(\n cwd: string,\n): Promise<string | null> {\n try {\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n\n const docs = []\n\n if (instructionFiles.length > 0) {\n const { content } = readAndConcatProjectInstructionFiles(\n instructionFiles,\n { includeHeadings: true },\n )\n if (content.trim().length > 0) docs.push(content)\n }\n\n if (existsSync(legacyPath)) {\n try {\n const content = await readFile(legacyPath, 'utf-8')\n docs.push(\n `# Legacy instructions (CLAUDE.md)\\n\\n${content}`,\n )\n } catch (e) {\n logError(e)\n }\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n}\n\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n return getProjectDocsForCwd(getCwd())\n})\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\n return `This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation.\\nCurrent branch: ${branch}\\n\\nMain branch (you will usually use this for PRs): ${mainBranch}\\n\\nStatus:\\n${truncatedStatus || '(clean)'}\\n\\nRecent commits:\\n${log}\\n\\nYour recent commits:\\n${authorLog || '(no recent commits)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\nexport const getContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [\n gitStatus,\n directoryStructure,\n instructionFilesNote,\n readme,\n projectDocs,\n ] = await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n dontCrawl ? Promise.resolve('') : getInstructionFilesNote(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(directoryStructure ? { directoryStructure } : {}),\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(instructionFilesNote ? { instructionFilesNote } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\nexport const getDirectoryStructure = memoize(\n async function (): Promise<string> {\n let lines: string\n try {\n const entries = readdirSync(getCwd(), { withFileTypes: true })\n lines = entries\n .map(entry => `${entry.isDirectory() ? 'd' : 'f'} ${entry.name}`)\n .join('\\n')\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `Below is a snapshot of this project's file structure at the start of the conversation. This snapshot will NOT update during the conversation.\n\n${lines}`\n },\n)\n", "import { memoize } from 'lodash-es'\nimport { execFileNoThrow } from './execFileNoThrow'\n\nexport const getIsGit = memoize(async (): Promise<boolean> => {\n const { code } = await execFileNoThrow('git', [\n 'rev-parse',\n '--is-inside-work-tree',\n ])\n return code === 0\n})\n\nexport const getHead = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])\n return stdout.trim()\n}\n\nexport const getBranch = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim()\n}\n\nexport const getRemoteUrl = async (): Promise<string | null> => {\n const { stdout, code } = await execFileNoThrow(\n 'git',\n ['remote', 'get-url', 'origin'],\n undefined,\n undefined,\n false,\n )\n return code === 0 ? stdout.trim() : null\n}\n\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\n const { code } = await execFileNoThrow(\n 'git',\n ['rev-parse', '@{u}'],\n undefined,\n undefined,\n false,\n )\n return code === 0\n}\n\nexport const getIsClean = async (): Promise<boolean> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['status', '--porcelain'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim().length === 0\n}\n\nexport interface GitRepoState {\n commitHash: string\n branchName: string\n remoteUrl: string | null\n isHeadOnRemote: boolean\n isClean: boolean\n}\n\nexport async function getGitState(): Promise<GitRepoState | null> {\n try {\n const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =\n await Promise.all([\n getHead(),\n getBranch(),\n getRemoteUrl(),\n getIsHeadOnRemote(),\n getIsClean(),\n ])\n\n return {\n commitHash,\n branchName,\n remoteUrl,\n isHeadOnRemote,\n isClean,\n }\n } catch (_) {\n return null\n }\n}\n", "import { getGlobalConfig, getOrCreateUserID } from '@utils/config'\nimport { memoize } from 'lodash-es'\nimport { env } from '@utils/config/env'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { logError, SESSION_ID } from '@utils/log'\nimport { MACRO } from '@constants/macros'\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\n const result = await execFileNoThrow('git', ['config', 'user.email'])\n if (result.code !== 0) {\n logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)\n return undefined\n }\n return result.stdout.trim() || undefined\n})\n\ntype SimpleUser = {\n customIDs?: Record<string, string>\n userID: string\n appVersion?: string\n userAgent?: string\n email?: string\n custom?: Record<string, unknown>\n}\n\nexport const getUser = memoize(async (): Promise<SimpleUser> => {\n const userID = getOrCreateUserID()\n const config = getGlobalConfig()\n const email = undefined\n return {\n customIDs: {\n sessionId: SESSION_ID,\n },\n userID,\n appVersion: MACRO.VERSION,\n userAgent: env.platform,\n email,\n custom: {\n nodeVersion: env.nodeVersion,\n userType: process.env.USER_TYPE,\n organizationUuid: config.oauthAccount?.organizationUuid,\n accountUuid: config.oauthAccount?.accountUuid,\n },\n }\n})\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["readFileSync", "readFileSync", "memoize", "memoize", "memoize", "join", "existsSync", "memoize", "memoize", "join", "existsSync", "memoize"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/services/ui/outputStyles.ts", "../src/utils/config/localSettings.ts"],
|
|
4
|
-
"sourcesContent": ["import figures from 'figures'\nimport { memoize } from 'lodash-es'\nimport { existsSync, readdirSync, readFileSync, statSync } from 'fs'\nimport { basename, dirname, join, resolve } from 'path'\nimport { homedir } from 'os'\nimport matter from 'gray-matter'\nimport yaml from 'js-yaml'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { readLocalSettings, updateLocalSettings } from '@utils/config/localSettings'\nimport { getCwd } from '@utils/state'\nimport { isSettingSourceEnabled } from '@utils/config/settingSources'\n\nexport type OutputStyleSource =\n | 'built-in'\n | 'plugin'\n | 'userSettings'\n | 'projectSettings'\n | 'policySettings'\n\nexport type OutputStyleDefinition = {\n name: string\n description: string\n prompt: string\n source: OutputStyleSource\n keepCodingInstructions?: boolean\n}\n\nexport type OutputStyleMap = Record<string, OutputStyleDefinition | null>\n\nexport const DEFAULT_OUTPUT_STYLE = 'default'\n\nfunction normalizeString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed ? trimmed : null\n}\n\nfunction getClaudePolicyBaseDir(): string {\n switch (process.platform) {\n case 'darwin':\n return '/Library/Application Support/ClaudeCode'\n case 'win32':\n return existsSync('C:\\\\Program Files\\\\ClaudeCode')\n ? 'C:\\\\Program Files\\\\ClaudeCode'\n : 'C:\\\\ProgramData\\\\ClaudeCode'\n default:\n return '/etc/claude-code'\n }\n}\n\nfunction getUserConfigBaseDirs(): { claude: string; kode: string }[] {\n const out: { claude: string; kode: string }[] = []\n\n const hasAnyOverride =\n typeof process.env.CLAUDE_CONFIG_DIR === 'string' ||\n typeof process.env.KODE_CONFIG_DIR === 'string'\n\n const claudeBase = normalizeString(process.env.CLAUDE_CONFIG_DIR)\n const kodeBase = normalizeString(process.env.KODE_CONFIG_DIR)\n\n if (claudeBase) out.push({ claude: resolve(claudeBase), kode: resolve(claudeBase) })\n if (kodeBase) out.push({ claude: resolve(kodeBase), kode: resolve(kodeBase) })\n\n if (hasAnyOverride) {\n return dedupeConfigBases(out)\n }\n\n return dedupeConfigBases([\n { claude: join(homedir(), '.claude'), kode: join(homedir(), '.claude') },\n { claude: join(homedir(), '.kode'), kode: join(homedir(), '.kode') },\n ])\n}\n\nfunction dedupeConfigBases(\n bases: Array<{ claude: string; kode: string }>,\n): Array<{ claude: string; kode: string }> {\n const seen = new Set<string>()\n const out: Array<{ claude: string; kode: string }> = []\n for (const base of bases) {\n const key = `${base.claude}::${base.kode}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push(base)\n }\n return out\n}\n\nfunction findProjectSubdirs(subdir: string, cwd: string): string[] {\n const result: string[] = []\n const home = resolve(homedir())\n let current = resolve(cwd)\n\n while (current !== home) {\n const claudeDir = join(current, '.claude', subdir)\n if (existsSync(claudeDir)) result.push(claudeDir)\n\n const kodeDir = join(current, '.kode', subdir)\n if (existsSync(kodeDir)) result.push(kodeDir)\n\n const parent = dirname(current)\n if (parent === current) break\n current = parent\n }\n\n return result\n}\n\nfunction markdownFirstLineOrHeading(content: string, fallback: string): string {\n const lines = content.split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const heading = trimmed.match(/^#+\\s+(.+)$/)?.[1] ?? trimmed\n return heading.length > 100 ? `${heading.substring(0, 97)}...` : heading\n }\n return fallback\n}\n\nfunction listMarkdownFilesRecursively(rootDir: string): string[] {\n const files: string[] = []\n const visitedDirs = new Set<string>()\n\n const walk = (dirPath: string) => {\n let dirStat: ReturnType<typeof statSync>\n try {\n dirStat = statSync(dirPath)\n } catch {\n return\n }\n if (!dirStat.isDirectory()) return\n\n const dirKey = `${dirStat.dev}:${dirStat.ino}`\n if (visitedDirs.has(dirKey)) return\n visitedDirs.add(dirKey)\n\n let entries: Array<{ name: string; isDirectory(): boolean; isFile(): boolean; isSymbolicLink(): boolean }>\n try {\n entries = readdirSync(dirPath, { withFileTypes: true, encoding: 'utf8' }) as any\n } catch {\n return\n }\n\n for (const entry of entries) {\n const name = String(entry.name ?? '')\n const fullPath = join(dirPath, name)\n\n if (entry.isDirectory()) {\n walk(fullPath)\n continue\n }\n\n if (entry.isFile()) {\n if (name.endsWith('.md')) files.push(fullPath)\n continue\n }\n\n if (entry.isSymbolicLink()) {\n try {\n const st = statSync(fullPath)\n if (st.isDirectory()) {\n walk(fullPath)\n } else if (st.isFile() && name.endsWith('.md')) {\n files.push(fullPath)\n }\n } catch {\n continue\n }\n }\n }\n }\n\n if (!existsSync(rootDir)) return []\n walk(rootDir)\n return files\n}\n\nfunction readMarkdownFile(filePath: string): { frontmatter: any; content: string } | null {\n try {\n const raw = readFileSync(filePath, 'utf8')\n const yamlSchema = (yaml as any).JSON_SCHEMA\n const matterOptions = {\n engines: {\n yaml: {\n parse: (input: string) =>\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\n {},\n },\n },\n }\n const parsed = matter(raw, matterOptions)\n return { frontmatter: (parsed.data as any) ?? {}, content: String(parsed.content ?? '') }\n } catch {\n return null\n }\n}\n\nfunction inodeKeyForPath(filePath: string): string | null {\n try {\n const st = statSync(filePath)\n if (typeof (st as any).dev === 'number' && typeof (st as any).ino === 'number') {\n return `${(st as any).dev}:${(st as any).ino}`\n }\n return null\n } catch {\n return null\n }\n}\n\nconst INSIGHTS_SECTION = `\n## Insights\nIn order to encourage learning, before and after writing code, always provide brief educational explanations about implementation choices using (with backticks):\n\"\\`${figures.star} Insight \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\`\n[2-3 key educational points]\n\\`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\`\"\n\nThese insights should be included in the conversation, not in the codebase. You should generally focus on interesting insights that are specific to the codebase or the code you just wrote, rather than general programming concepts.`\n\nfunction getBuiltInOutputStyles(): OutputStyleMap {\n return {\n [DEFAULT_OUTPUT_STYLE]: null,\n Explanatory: {\n name: 'Explanatory',\n source: 'built-in',\n description: 'Claude explains its implementation choices and codebase patterns',\n keepCodingInstructions: true,\n prompt: `You are an interactive CLI tool that helps users with software engineering tasks. In addition to software engineering tasks, you should provide educational insights about the codebase along the way.\n\nYou should be clear and educational, providing helpful explanations while remaining focused on the task. Balance educational content with task completion. When providing insights, you may exceed typical length constraints, but remain focused and relevant.\n\n# Explanatory Style Active\n${INSIGHTS_SECTION}`,\n },\n Learning: {\n name: 'Learning',\n source: 'built-in',\n description:\n 'Claude pauses and asks you to write small pieces of code for hands-on practice',\n keepCodingInstructions: true,\n prompt: `You are an interactive CLI tool that helps users with software engineering tasks. In addition to software engineering tasks, you should help users learn more about the codebase through hands-on practice and educational insights.\n\nYou should be collaborative and encouraging. Balance task completion with learning by requesting user input for meaningful design decisions while handling routine implementation yourself. \n\n# Learning Style Active\n## Requesting Human Contributions\nIn order to encourage learning, ask the human to contribute 2-10 line code pieces when generating 20+ lines involving:\n- Design decisions (error handling, data structures)\n- Business logic with multiple valid approaches \n- Key algorithms or interface definitions\n\n**TodoList Integration**: If using a TodoList for the overall task, include a specific todo item like \"Request human input on [specific decision]\" when planning to request human input. This ensures proper task tracking. Note: TodoList is not required for all tasks.\n\nExample TodoList flow:\n \u2713 \"Set up component structure with placeholder for logic\"\n \u2713 \"Request human collaboration on decision logic implementation\"\n \u2713 \"Integrate contribution and complete feature\"\n\n### Request Format\n\\`\\`\\`\n${figures.bullet} **Learn by Doing**\n**Context:** [what's built and why this decision matters]\n**Your Task:** [specific function/section in file, mention file and TODO(human) but do not include line numbers]\n**Guidance:** [trade-offs and constraints to consider]\n\\`\\`\\`\n\n### Key Guidelines\n- Frame contributions as valuable design decisions, not busy work\n- You must first add a TODO(human) section into the codebase with your editing tools before making the Learn by Doing request \n- Make sure there is one and only one TODO(human) section in the code\n- Don't take any action or output anything after the Learn by Doing request. Wait for human implementation before proceeding.\n\n### Example Requests\n\n**Whole Function Example:**\n\\`\\`\\`\n${figures.bullet} **Learn by Doing**\n\n**Context:** I've set up the hint feature UI with a button that triggers the hint system. The infrastructure is ready: when clicked, it calls selectHintCell() to determine which cell to hint, then highlights that cell with a yellow background and shows possible values. The hint system needs to decide which empty cell would be most helpful to reveal to the user.\n\n**Your Task:** In sudoku.js, implement the selectHintCell(board) function. Look for TODO(human). This function should analyze the board and return {row, col} for the best cell to hint, or null if the puzzle is complete.\n\n**Guidance:** Consider multiple strategies: prioritize cells with only one possible value (naked singles), or cells that appear in rows/columns/boxes with many filled cells. You could also consider a balanced approach that helps without making it too easy. The board parameter is a 9x9 array where 0 represents empty cells.\n\\`\\`\\`\n\n**Partial Function Example:**\n\\`\\`\\`\n${figures.bullet} **Learn by Doing**\n\n**Context:** I've built a file upload component that validates files before accepting them. The main validation logic is complete, but it needs specific handling for different file type categories in the switch statement.\n\n**Your Task:** In upload.js, inside the validateFile() function's switch statement, implement the 'case \"document\":' branch. Look for TODO(human). This should validate document files (pdf, doc, docx).\n\n**Guidance:** Consider checking file size limits (maybe 10MB for documents?), validating the file extension matches the MIME type, and returning {valid: boolean, error?: string}. The file object has properties: name, size, type.\n\\`\\`\\`\n\n**Debugging Example:**\n\\`\\`\\`\n${figures.bullet} **Learn by Doing**\n\n**Context:** The user reported that number inputs aren't working correctly in the calculator. I've identified the handleInput() function as the likely source, but need to understand what values are being processed.\n\n**Your Task:** In calculator.js, inside the handleInput() function, add 2-3 console.log statements after the TODO(human) comment to help debug why number inputs fail.\n\n**Guidance:** Consider logging: the raw input value, the parsed result, and any validation state. This will help us understand where the conversion breaks.\n\\`\\`\\`\n\n### After Contributions\nShare one insight connecting their code to broader patterns or system effects. Avoid praise or repetition.\n\n## Insights\n${INSIGHTS_SECTION}`,\n },\n }\n}\n\nfunction parseKeepCodingInstructions(value: unknown): boolean | undefined {\n if (value === 'true') return true\n if (value === 'false') return false\n return undefined\n}\n\nfunction parseCustomOutputStyleFile(options: {\n filePath: string\n source: Exclude<OutputStyleSource, 'built-in' | 'plugin'>\n}): OutputStyleDefinition | null {\n const parsed = readMarkdownFile(options.filePath)\n if (!parsed) return null\n\n const base = basename(options.filePath, '.md')\n const name = normalizeString(parsed.frontmatter?.name) ?? base\n const description =\n normalizeString(parsed.frontmatter?.description) ??\n markdownFirstLineOrHeading(parsed.content, `Custom ${base} output style`)\n const keepCodingInstructions = parseKeepCodingInstructions(\n parsed.frontmatter?.['keep-coding-instructions'],\n )\n const prompt = parsed.content.trim()\n\n return {\n name,\n description,\n prompt,\n source: options.source,\n ...(keepCodingInstructions !== undefined ? { keepCodingInstructions } : {}),\n }\n}\n\nfunction parsePluginOutputStyleFile(options: {\n filePath: string\n pluginName: string\n seen: Set<string>\n}): OutputStyleDefinition | null {\n const inodeKey = inodeKeyForPath(options.filePath)\n const dedupeKey = inodeKey ? `inode:${inodeKey}` : `path:${options.filePath}`\n if (options.seen.has(dedupeKey)) return null\n options.seen.add(dedupeKey)\n\n const parsed = readMarkdownFile(options.filePath)\n if (!parsed) return null\n\n const base = basename(options.filePath, '.md')\n const styleName = normalizeString(parsed.frontmatter?.name) ?? base\n const fullName = `${options.pluginName}:${styleName}`\n const description =\n normalizeString(parsed.frontmatter?.description) ??\n markdownFirstLineOrHeading(\n parsed.content,\n `Output style from ${options.pluginName} plugin`,\n )\n const prompt = parsed.content.trim()\n\n return {\n name: fullName,\n description,\n prompt,\n source: 'plugin',\n }\n}\n\nfunction loadPluginOutputStyles(): OutputStyleDefinition[] {\n const out: OutputStyleDefinition[] = []\n const plugins = getSessionPlugins()\n for (const plugin of plugins) {\n const pluginName = plugin.name\n const seen = new Set<string>()\n for (const dir of plugin.outputStylesDirs ?? []) {\n let st: ReturnType<typeof statSync>\n try {\n st = statSync(dir)\n } catch {\n continue\n }\n if (st.isFile()) {\n if (!dir.endsWith('.md')) continue\n const style = parsePluginOutputStyleFile({\n filePath: dir,\n pluginName,\n seen,\n })\n if (style) out.push(style)\n continue\n }\n\n if (st.isDirectory()) {\n const files = listMarkdownFilesRecursively(dir)\n for (const filePath of files) {\n const style = parsePluginOutputStyleFile({\n filePath,\n pluginName,\n seen,\n })\n if (style) out.push(style)\n }\n }\n }\n }\n return out\n}\n\nfunction loadCustomOutputStyles(options: { cwd: string }): OutputStyleDefinition[] {\n const out: OutputStyleDefinition[] = []\n const seen = new Set<string>()\n\n const policyDir = join(\n getClaudePolicyBaseDir(),\n '.claude',\n 'output-styles',\n )\n for (const filePath of listMarkdownFilesRecursively(policyDir)) {\n const inodeKey = inodeKeyForPath(filePath)\n const dedupeKey = inodeKey ? `inode:${inodeKey}` : `path:${filePath}`\n if (seen.has(dedupeKey)) continue\n seen.add(dedupeKey)\n const style = parseCustomOutputStyleFile({\n filePath,\n source: 'policySettings',\n })\n if (style) out.push(style)\n }\n\n if (isSettingSourceEnabled('userSettings')) {\n const userBases = getUserConfigBaseDirs()\n for (const base of userBases) {\n for (const userBaseDir of new Set([base.claude, base.kode])) {\n const dirPath = join(userBaseDir, 'output-styles')\n for (const filePath of listMarkdownFilesRecursively(dirPath)) {\n const inodeKey = inodeKeyForPath(filePath)\n const dedupeKey = inodeKey ? `inode:${inodeKey}` : `path:${filePath}`\n if (seen.has(dedupeKey)) continue\n seen.add(dedupeKey)\n const style = parseCustomOutputStyleFile({\n filePath,\n source: 'userSettings',\n })\n if (style) out.push(style)\n }\n }\n }\n }\n\n if (isSettingSourceEnabled('projectSettings')) {\n for (const dirPath of findProjectSubdirs('output-styles', options.cwd)) {\n for (const filePath of listMarkdownFilesRecursively(dirPath)) {\n const inodeKey = inodeKeyForPath(filePath)\n const dedupeKey = inodeKey ? `inode:${inodeKey}` : `path:${filePath}`\n if (seen.has(dedupeKey)) continue\n seen.add(dedupeKey)\n const style = parseCustomOutputStyleFile({\n filePath,\n source: 'projectSettings',\n })\n if (style) out.push(style)\n }\n }\n }\n\n return out\n}\n\nexport const getAvailableOutputStyles = memoize((): OutputStyleMap => {\n const cwd = getCwd()\n const builtIn = getBuiltInOutputStyles()\n const merged: OutputStyleMap = { ...builtIn }\n\n for (const style of loadPluginOutputStyles()) {\n merged[style.name] = style\n }\n\n const custom = loadCustomOutputStyles({ cwd })\n const user = custom.filter(s => s.source === 'userSettings')\n const project = custom.filter(s => s.source === 'projectSettings')\n const policy = custom.filter(s => s.source === 'policySettings')\n\n for (const style of user) merged[style.name] = style\n for (const style of project) merged[style.name] = style\n for (const style of policy) merged[style.name] = style\n\n return merged\n})\n\nexport function clearOutputStyleCache(): void {\n ;(getAvailableOutputStyles as any).cache?.clear?.()\n}\n\nexport function getCurrentOutputStyle(): string {\n if (!isSettingSourceEnabled('localSettings')) return DEFAULT_OUTPUT_STYLE\n\n const settings = readLocalSettings()\n const candidate = normalizeString(settings.outputStyle)\n return candidate ?? DEFAULT_OUTPUT_STYLE\n}\n\nexport function setCurrentOutputStyle(styleName: string): void {\n updateLocalSettings({ outputStyle: styleName })\n}\n\nexport function resolveOutputStyleName(input: string): string | null {\n const raw = normalizeString(input)\n if (!raw) return null\n const styles = getAvailableOutputStyles()\n if (raw in styles) return raw\n const lower = raw.toLowerCase()\n for (const name of Object.keys(styles)) {\n if (name.toLowerCase() === lower) return name\n }\n return null\n}\n\nexport function getCurrentOutputStyleDefinition(): OutputStyleDefinition | null {\n const current = getCurrentOutputStyle()\n const styles = getAvailableOutputStyles()\n return styles[current] ?? null\n}\n\nexport function getOutputStyleSystemPromptAdditions(): string[] {\n const style = getCurrentOutputStyleDefinition()\n if (!style) return []\n const prompt = style.prompt.trim()\n if (!prompt) return []\n return [`\\n# Output Style: ${style.name}\\n${prompt}\\n`]\n}\n", "import { join } from 'path'\nimport { getCwd } from '@utils/state'\nimport {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n} from '@utils/config/settingsFiles'\n\nexport type LocalSettings = {\n outputStyle?: unknown\n [key: string]: unknown\n}\n\nexport function getLocalSettingsPath(options?: {\n projectDir?: string\n}): string {\n const projectDir = options?.projectDir ?? getCwd()\n return join(projectDir, '.kode', 'settings.local.json')\n}\n\nexport function readLocalSettings(options?: {\n projectDir?: string\n}): LocalSettings {\n const projectDir = options?.projectDir ?? getCwd()\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'localSettings',\n projectDir,\n migrateToPrimary: true,\n })\n return (loaded.settings as LocalSettings | null) ?? {}\n}\n\nexport function updateLocalSettings(\n patch: Record<string, unknown>,\n options?: {\n projectDir?: string\n },\n): LocalSettings {\n const projectDir = options?.projectDir ?? getCwd()\n const candidates = getSettingsFileCandidates({\n destination: 'localSettings',\n projectDir,\n })\n const existing =\n (candidates\n ? loadSettingsWithLegacyFallback({\n destination: 'localSettings',\n projectDir,\n migrateToPrimary: true,\n }).settings\n : null) ?? {}\n\n const next = { ...(existing as Record<string, unknown>), ...patch }\n\n if (candidates) {\n saveSettingsToPrimaryAndSyncLegacy({\n destination: 'localSettings',\n projectDir,\n settings: next,\n syncLegacyIfExists: true,\n })\n }\n\n return next as LocalSettings\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/services/mcp/client.ts", "../src/services/mcp/internal/jsonc.ts", "../src/services/mcp/discovery.ts", "../src/services/mcp/tools-integration.ts", "../src/tools/mcp/MCPTool/MCPTool.tsx", "../src/ui/components/FallbackToolUseRejectedMessage.tsx", "../src/tools/mcp/MCPTool/prompt.ts", "../src/tools/system/BashTool/OutputLine.tsx", "../src/utils/sandbox/sandboxConfig.ts", "../src/tools/system/BashTool/prompt.ts", "../src/services/mcp/cli-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import type { McpServerConfig } from '@utils/config'\nimport {\n getCurrentProjectConfig,\n getGlobalConfig,\n getProjectMcpServerDefinitions,\n} from '@utils/config'\nimport { existsSync, readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport { getCwd } from '@utils/state'\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport { WebSocketClientTransport } from '@modelcontextprotocol/sdk/client/websocket.js'\nimport { memoize, pickBy } from 'lodash-es'\nimport { logMCPError } from '@utils/log'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { parseJsonOrJsonc } from './internal/jsonc'\nimport { getMcprcServerStatus, listPluginMCPServers } from './discovery'\n\nfunction getMcpServerConnectionBatchSize(): number {\n const raw = process.env.MCP_SERVER_CONNECTION_BATCH_SIZE\n const parsed = raw ? Number.parseInt(raw, 10) : NaN\n if (Number.isFinite(parsed) && parsed > 0 && parsed <= 50) return parsed\n return 3\n}\n\nasync function connectToServer(\n name: string,\n serverRef: McpServerConfig,\n): Promise<Client> {\n type Candidate = { transport: unknown; kind: 'stdio' | 'sse' | 'http' | 'ws' }\n\n const ensureWebSocketGlobal = async () => {\n if (typeof (globalThis as any).WebSocket === 'function') return\n try {\n const undici = await import('undici')\n if (typeof (undici as any).WebSocket === 'function') {\n ;(globalThis as any).WebSocket = (undici as any).WebSocket\n }\n } catch {}\n }\n\n const candidates: Candidate[] = await (async () => {\n switch (serverRef.type) {\n case 'sse': {\n const ref = serverRef\n return [\n {\n kind: 'sse',\n transport: new SSEClientTransport(new URL(ref.url), {\n ...(ref.headers ? { requestInit: { headers: ref.headers } } : {}),\n }),\n },\n {\n kind: 'http',\n transport: new StreamableHTTPClientTransport(new URL(ref.url), {\n ...(ref.headers ? { requestInit: { headers: ref.headers } } : {}),\n }),\n },\n ]\n }\n case 'sse-ide': {\n const ref = serverRef\n return [\n {\n kind: 'sse',\n transport: new SSEClientTransport(new URL(ref.url), {\n ...(ref.headers ? { requestInit: { headers: ref.headers } } : {}),\n }),\n },\n ]\n }\n case 'http': {\n const ref = serverRef\n return [\n {\n kind: 'http',\n transport: new StreamableHTTPClientTransport(new URL(ref.url), {\n ...(ref.headers ? { requestInit: { headers: ref.headers } } : {}),\n }),\n },\n {\n kind: 'sse',\n transport: new SSEClientTransport(new URL(ref.url), {\n ...(ref.headers ? { requestInit: { headers: ref.headers } } : {}),\n }),\n },\n ]\n }\n case 'ws': {\n const ref = serverRef\n await ensureWebSocketGlobal()\n return [\n {\n kind: 'ws',\n transport: new WebSocketClientTransport(new URL(ref.url)),\n },\n ]\n }\n case 'ws-ide': {\n const ref = serverRef\n\n let url = ref.url\n if (ref.authToken) {\n try {\n const parsed = new URL(url)\n if (!parsed.searchParams.has('authToken')) {\n parsed.searchParams.set('authToken', ref.authToken)\n url = parsed.toString()\n }\n } catch {}\n }\n\n await ensureWebSocketGlobal()\n return [\n {\n kind: 'ws',\n transport: new WebSocketClientTransport(new URL(url)),\n },\n ]\n }\n case 'stdio':\n default: {\n const ref = serverRef\n return [\n {\n kind: 'stdio',\n transport: new StdioClientTransport({\n command: ref.command,\n args: ref.args,\n env: {\n ...process.env,\n ...ref.env,\n } as Record<string, string>,\n stderr: 'pipe',\n }),\n },\n ]\n }\n }\n })()\n\n const rawTimeout = process.env.MCP_CONNECTION_TIMEOUT_MS\n const parsedTimeout = rawTimeout ? Number.parseInt(rawTimeout, 10) : NaN\n const CONNECTION_TIMEOUT_MS = Number.isFinite(parsedTimeout)\n ? parsedTimeout\n : 30_000\n\n let lastError: unknown\n\n for (const candidate of candidates) {\n const client = new Client(\n {\n name: PRODUCT_COMMAND,\n version: '0.1.0',\n },\n {\n capabilities: {},\n },\n )\n\n try {\n const connectPromise = client.connect(candidate.transport as any)\n if (CONNECTION_TIMEOUT_MS > 0) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n reject(\n new Error(\n `Connection to MCP server \"${name}\" timed out after ${CONNECTION_TIMEOUT_MS}ms`,\n ),\n )\n }, CONNECTION_TIMEOUT_MS)\n\n connectPromise.then(\n () => clearTimeout(timeoutId),\n () => clearTimeout(timeoutId),\n )\n })\n\n await Promise.race([connectPromise, timeoutPromise])\n } else {\n await connectPromise\n }\n\n if (candidate.kind === 'stdio') {\n ;(candidate.transport as StdioClientTransport).stderr?.on(\n 'data',\n (data: Buffer) => {\n const errorText = data.toString().trim()\n if (errorText) {\n logMCPError(name, `Server stderr: ${errorText}`)\n }\n },\n )\n }\n\n if (candidates.length > 1 && candidate !== candidates[0]) {\n logMCPError(\n name,\n `Connected using fallback transport \"${candidate.kind}\". Consider setting the server type explicitly in your MCP config.`,\n )\n }\n\n return client\n } catch (error) {\n lastError = error\n try {\n await client.close()\n } catch {}\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error(`Failed to connect to MCP server \"${name}\"`)\n}\n\ntype ConnectedClient = {\n client: Client\n capabilities?: Record<string, unknown> | null\n name: string\n type: 'connected'\n}\ntype FailedClient = {\n name: string\n type: 'failed'\n}\nexport type WrappedClient = ConnectedClient | FailedClient\n\nexport const getClients = memoize(async (): Promise<WrappedClient[]> => {\n if (process.env.CI && process.env.NODE_ENV !== 'test') {\n return []\n }\n\n const pluginServers = listPluginMCPServers()\n const globalServers = getGlobalConfig().mcpServers ?? {}\n const projectFileServers = getProjectMcpServerDefinitions().servers\n const projectServers = getCurrentProjectConfig().mcpServers ?? {}\n\n const approvedProjectFileServers = pickBy(\n projectFileServers,\n (_, name) => getMcprcServerStatus(name) === 'approved',\n )\n\n const allServers = {\n ...pluginServers,\n ...globalServers,\n ...approvedProjectFileServers,\n ...projectServers,\n }\n\n const batchSize = getMcpServerConnectionBatchSize()\n const entries = Object.entries(allServers)\n const results: WrappedClient[] = []\n\n for (let i = 0; i < entries.length; i += batchSize) {\n const batch = entries.slice(i, i + batchSize)\n const batchResults = await Promise.all(\n batch.map(async ([name, serverRef]) => {\n try {\n const client = await connectToServer(name, serverRef as McpServerConfig)\n let capabilities: Record<string, unknown> | null = null\n try {\n capabilities = client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n return { name, client, capabilities, type: 'connected' as const }\n } catch (error) {\n logMCPError(\n name,\n `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n return { name, type: 'failed' as const }\n }\n }),\n )\n results.push(...batchResults)\n }\n\n return results\n})\n\nfunction parseMcpServersFromCliConfigEntries(options: {\n entries: string[]\n projectDir: string\n}): Record<string, McpServerConfig> {\n const out: Record<string, McpServerConfig> = {}\n\n for (const rawEntry of options.entries) {\n const entry = String(rawEntry ?? '').trim()\n if (!entry) continue\n\n const resolvedPath = resolve(options.projectDir, entry)\n const payload = existsSync(resolvedPath)\n ? readFileSync(resolvedPath, 'utf8')\n : existsSync(entry)\n ? readFileSync(entry, 'utf8')\n : entry\n\n const parsed = parseJsonOrJsonc(payload)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) continue\n\n const rawServers =\n (parsed as any).mcpServers &&\n typeof (parsed as any).mcpServers === 'object' &&\n !Array.isArray((parsed as any).mcpServers)\n ? (parsed as any).mcpServers\n : parsed\n\n if (!rawServers || typeof rawServers !== 'object' || Array.isArray(rawServers))\n continue\n\n for (const [name, cfg] of Object.entries(rawServers as any)) {\n if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg)) continue\n out[name] = cfg as McpServerConfig\n }\n }\n\n return out\n}\n\nexport async function getClientsForCliMcpConfig(options: {\n mcpConfig?: string[]\n strictMcpConfig?: boolean\n projectDir?: string\n}): Promise<WrappedClient[]> {\n const projectDir = options.projectDir ?? getCwd()\n const entries =\n Array.isArray(options.mcpConfig) && options.mcpConfig.length > 0\n ? options.mcpConfig\n : []\n const strict = options.strictMcpConfig === true\n\n if (entries.length === 0 && !strict) {\n return getClients()\n }\n\n const cliServers = parseMcpServersFromCliConfigEntries({\n entries,\n projectDir,\n })\n\n const pluginServers = strict ? {} : listPluginMCPServers()\n const globalServers = strict ? {} : (getGlobalConfig().mcpServers ?? {})\n const projectFileServers = strict ? {} : getProjectMcpServerDefinitions().servers\n const projectServers = strict ? {} : (getCurrentProjectConfig().mcpServers ?? {})\n\n const approvedProjectFileServers = strict\n ? {}\n : pickBy(projectFileServers, (_, name) => getMcprcServerStatus(name) === 'approved')\n\n const allServers = {\n ...(pluginServers ?? {}),\n ...(globalServers ?? {}),\n ...(approvedProjectFileServers ?? {}),\n ...(projectServers ?? {}),\n ...(cliServers ?? {}),\n }\n\n const batchSize = getMcpServerConnectionBatchSize()\n const entriesToConnect = Object.entries(allServers)\n const results: WrappedClient[] = []\n\n for (let i = 0; i < entriesToConnect.length; i += batchSize) {\n const batch = entriesToConnect.slice(i, i + batchSize)\n const batchResults = await Promise.all(\n batch.map(async ([name, serverRef]) => {\n try {\n const client = await connectToServer(name, serverRef as McpServerConfig)\n let capabilities: Record<string, unknown> | null = null\n try {\n capabilities = client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n return { name, client, capabilities, type: 'connected' as const }\n } catch (error) {\n logMCPError(\n name,\n `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n return { name, type: 'failed' as const }\n }\n }),\n )\n results.push(...batchResults)\n }\n\n return results\n}\n", "function stripJsonComments(input: string): string {\n let out = ''\n let inString = false\n let escaped = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]!\n const next = i + 1 < input.length ? input[i + 1]! : ''\n\n if (inLineComment) {\n if (ch === '\\n') {\n inLineComment = false\n out += ch\n }\n continue\n }\n\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false\n i++\n }\n continue\n }\n\n if (inString) {\n out += ch\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') inString = false\n continue\n }\n\n if (ch === '\"') {\n inString = true\n out += ch\n continue\n }\n\n if (ch === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (ch === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n\n out += ch\n }\n\n return out\n}\n\nexport function parseJsonOrJsonc(text: string): unknown {\n const raw = String(text ?? '')\n if (!raw.trim()) return null\n try {\n return JSON.parse(raw)\n } catch {\n try {\n return JSON.parse(stripJsonComments(raw))\n } catch {\n return null\n }\n }\n}\n\n", "import {\n getCurrentProjectConfig,\n getGlobalConfig,\n getProjectMcpServerDefinitions,\n saveCurrentProjectConfig,\n saveGlobalConfig,\n addMcprcServerForTesting,\n removeMcprcServerForTesting,\n type McpServerConfig,\n} from '@utils/config'\nimport { existsSync, readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { getCwd } from '@utils/state'\nimport { safeParseJSON } from '@utils/text/json'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { parseJsonOrJsonc } from './internal/jsonc'\n\ntype McpName = string\n\nfunction expandTemplateString(value: string, pluginRoot: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, key) => {\n const k = String(key ?? '').trim()\n if (!k) return match\n if (k === 'CLAUDE_PLUGIN_ROOT') return pluginRoot\n const env = process.env[k]\n return env !== undefined ? env : match\n })\n}\n\nfunction expandTemplateDeep(value: unknown, pluginRoot: string): unknown {\n if (typeof value === 'string') return expandTemplateString(value, pluginRoot)\n if (Array.isArray(value))\n return value.map(v => expandTemplateDeep(v, pluginRoot))\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n out[k] = expandTemplateDeep(v, pluginRoot)\n }\n return out\n }\n return value\n}\n\nexport function listPluginMCPServers(): Record<string, McpServerConfig> {\n const plugins = getSessionPlugins()\n if (plugins.length === 0) return {}\n\n const out: Record<string, McpServerConfig> = {}\n\n for (const plugin of plugins) {\n const pluginRoot = plugin.rootDir\n const pluginName = plugin.name\n\n const configs: Array<Record<string, McpServerConfig>> = []\n\n for (const configPath of plugin.mcpConfigFiles ?? []) {\n try {\n const raw = readFileSync(configPath, 'utf8')\n const parsed = parseJsonOrJsonc(raw)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))\n continue\n const rawServers =\n (parsed as any).mcpServers &&\n typeof (parsed as any).mcpServers === 'object' &&\n !Array.isArray((parsed as any).mcpServers)\n ? (parsed as any).mcpServers\n : parsed\n\n if (\n !rawServers ||\n typeof rawServers !== 'object' ||\n Array.isArray(rawServers)\n )\n continue\n\n const servers: Record<string, McpServerConfig> = {}\n for (const [name, cfg] of Object.entries(rawServers as any)) {\n if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg)) continue\n servers[name] = expandTemplateDeep(cfg, pluginRoot) as McpServerConfig\n }\n configs.push(servers)\n } catch {\n continue\n }\n }\n\n const manifestRaw = (plugin.manifest as any)?.mcpServers\n if (\n manifestRaw &&\n typeof manifestRaw === 'object' &&\n !Array.isArray(manifestRaw)\n ) {\n const rawServers =\n (manifestRaw as any).mcpServers &&\n typeof (manifestRaw as any).mcpServers === 'object' &&\n !Array.isArray((manifestRaw as any).mcpServers)\n ? (manifestRaw as any).mcpServers\n : manifestRaw\n\n if (\n rawServers &&\n typeof rawServers === 'object' &&\n !Array.isArray(rawServers)\n ) {\n const servers: Record<string, McpServerConfig> = {}\n for (const [name, cfg] of Object.entries(rawServers as any)) {\n if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg)) continue\n servers[name] = expandTemplateDeep(cfg, pluginRoot) as McpServerConfig\n }\n configs.push(servers)\n }\n }\n\n const merged: Record<string, McpServerConfig> = Object.assign({}, ...configs)\n\n for (const [serverName, cfg] of Object.entries(merged)) {\n const fullName = `plugin_${pluginName}_${serverName}`\n out[fullName] = cfg\n }\n }\n\n return out\n}\n\nexport function parseEnvVars(\n rawEnvArgs: string[] | undefined,\n): Record<string, string> {\n const parsedEnv: Record<string, string> = {}\n\n if (rawEnvArgs) {\n for (const envStr of rawEnvArgs) {\n const [key, ...valueParts] = envStr.split('=')\n if (!key || valueParts.length === 0) {\n throw new Error(\n `Invalid environment variable format: ${envStr}, environment variables should be added as: -e KEY1=value1 -e KEY2=value2`,\n )\n }\n parsedEnv[key] = valueParts.join('=')\n }\n }\n return parsedEnv\n}\n\nconst VALID_SCOPES = ['project', 'global', 'mcprc', 'mcpjson'] as const\ntype ConfigScope = (typeof VALID_SCOPES)[number]\nconst EXTERNAL_SCOPES = [\n 'project',\n 'global',\n 'mcprc',\n 'mcpjson',\n] as ConfigScope[]\n\nexport function ensureConfigScope(scope?: string): ConfigScope {\n if (!scope) return 'project'\n\n const scopesToCheck =\n process.env.USER_TYPE === 'external' ? EXTERNAL_SCOPES : VALID_SCOPES\n\n if (!scopesToCheck.includes(scope as ConfigScope)) {\n throw new Error(\n `Invalid scope: ${scope}. Must be one of: ${scopesToCheck.join(', ')}`,\n )\n }\n\n return scope as ConfigScope\n}\n\nexport function addMcpServer(\n name: McpName,\n server: McpServerConfig,\n scope: ConfigScope = 'project',\n): void {\n if (scope === 'mcprc') {\n if (process.env.NODE_ENV === 'test') {\n addMcprcServerForTesting(name, server)\n } else {\n const mcprcPath = join(getCwd(), '.mcprc')\n let mcprcConfig: Record<string, McpServerConfig> = {}\n\n if (existsSync(mcprcPath)) {\n try {\n const mcprcContent = readFileSync(mcprcPath, 'utf-8')\n const existingConfig = safeParseJSON(mcprcContent)\n if (existingConfig && typeof existingConfig === 'object') {\n mcprcConfig = existingConfig as Record<string, McpServerConfig>\n }\n } catch {\n }\n }\n\n mcprcConfig[name] = server\n\n try {\n writeFileSync(mcprcPath, JSON.stringify(mcprcConfig, null, 2), 'utf-8')\n } catch (error) {\n throw new Error(`Failed to write to .mcprc: ${error}`)\n }\n }\n } else if (scope === 'mcpjson') {\n const mcpJsonPath = join(getCwd(), '.mcp.json')\n let config: Record<string, unknown> = { mcpServers: {} }\n\n if (existsSync(mcpJsonPath)) {\n try {\n const content = readFileSync(mcpJsonPath, 'utf-8')\n const parsed = safeParseJSON(content)\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n config = parsed as Record<string, unknown>\n }\n } catch {\n }\n }\n\n const rawServers = (config as { mcpServers?: unknown }).mcpServers\n const servers =\n rawServers && typeof rawServers === 'object' && !Array.isArray(rawServers)\n ? (rawServers as Record<string, McpServerConfig>)\n : ({} as Record<string, McpServerConfig>)\n\n servers[name] = server\n config.mcpServers = servers\n\n try {\n writeFileSync(mcpJsonPath, JSON.stringify(config, null, 2), 'utf-8')\n } catch (error) {\n throw new Error(`Failed to write to .mcp.json: ${error}`)\n }\n } else if (scope === 'global') {\n const config = getGlobalConfig()\n if (!config.mcpServers) {\n config.mcpServers = {}\n }\n config.mcpServers[name] = server\n saveGlobalConfig(config)\n } else {\n const config = getCurrentProjectConfig()\n if (!config.mcpServers) {\n config.mcpServers = {}\n }\n config.mcpServers[name] = server\n saveCurrentProjectConfig(config)\n }\n}\n\nexport function removeMcpServer(\n name: McpName,\n scope: ConfigScope = 'project',\n): void {\n if (scope === 'mcprc') {\n if (process.env.NODE_ENV === 'test') {\n removeMcprcServerForTesting(name)\n } else {\n const mcprcPath = join(getCwd(), '.mcprc')\n if (!existsSync(mcprcPath)) {\n throw new Error('No .mcprc file found in this directory')\n }\n\n try {\n const mcprcContent = readFileSync(mcprcPath, 'utf-8')\n const mcprcConfig = safeParseJSON(mcprcContent) as Record<\n string,\n McpServerConfig\n > | null\n\n if (\n !mcprcConfig ||\n typeof mcprcConfig !== 'object' ||\n !mcprcConfig[name]\n ) {\n throw new Error(`No MCP server found with name: ${name} in .mcprc`)\n }\n\n delete mcprcConfig[name]\n writeFileSync(mcprcPath, JSON.stringify(mcprcConfig, null, 2), 'utf-8')\n } catch (error) {\n if (error instanceof Error) {\n throw error\n }\n throw new Error(`Failed to remove from .mcprc: ${error}`)\n }\n }\n } else if (scope === 'mcpjson') {\n const mcpJsonPath = join(getCwd(), '.mcp.json')\n if (!existsSync(mcpJsonPath)) {\n throw new Error('No .mcp.json file found in this directory')\n }\n\n try {\n const content = readFileSync(mcpJsonPath, 'utf-8')\n const parsed = safeParseJSON(content) as Record<string, unknown> | null\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Invalid .mcp.json format')\n }\n\n const rawServers = (parsed as { mcpServers?: unknown }).mcpServers\n if (\n !rawServers ||\n typeof rawServers !== 'object' ||\n Array.isArray(rawServers)\n ) {\n throw new Error('Invalid .mcp.json format (missing mcpServers)')\n }\n\n const servers = rawServers as Record<string, McpServerConfig>\n if (!servers[name]) {\n throw new Error(`No MCP server found with name: ${name} in .mcp.json`)\n }\n\n delete servers[name]\n ;(parsed as any).mcpServers = servers\n writeFileSync(mcpJsonPath, JSON.stringify(parsed, null, 2), 'utf-8')\n } catch (error) {\n if (error instanceof Error) throw error\n throw new Error(`Failed to remove from .mcp.json: ${error}`)\n }\n } else if (scope === 'global') {\n const config = getGlobalConfig()\n if (!config.mcpServers?.[name]) {\n throw new Error(`No global MCP server found with name: ${name}`)\n }\n delete config.mcpServers[name]\n saveGlobalConfig(config)\n } else {\n const config = getCurrentProjectConfig()\n if (!config.mcpServers?.[name]) {\n throw new Error(`No local MCP server found with name: ${name}`)\n }\n delete config.mcpServers[name]\n saveCurrentProjectConfig(config)\n }\n}\n\nexport function listMCPServers(): Record<string, McpServerConfig> {\n const pluginServers = listPluginMCPServers()\n const globalConfig = getGlobalConfig()\n const projectFileConfig = getProjectMcpServerDefinitions().servers\n const projectConfig = getCurrentProjectConfig()\n return {\n ...(pluginServers ?? {}),\n ...(globalConfig.mcpServers ?? {}),\n ...(projectFileConfig ?? {}),\n ...(projectConfig.mcpServers ?? {}),\n }\n}\n\nexport type ScopedMcpServerConfig = McpServerConfig & {\n scope: ConfigScope\n}\n\nexport function getMcpServer(name: McpName): ScopedMcpServerConfig | undefined {\n const projectConfig = getCurrentProjectConfig()\n const projectFileDefinitions = getProjectMcpServerDefinitions()\n const projectFileConfig = projectFileDefinitions.servers\n const globalConfig = getGlobalConfig()\n\n if (projectConfig.mcpServers?.[name]) {\n return { ...projectConfig.mcpServers[name], scope: 'project' }\n }\n\n if (projectFileConfig?.[name]) {\n const source = projectFileDefinitions.sources[name]\n const scope: ConfigScope = source === '.mcp.json' ? 'mcpjson' : 'mcprc'\n return { ...projectFileConfig[name], scope }\n }\n\n if (globalConfig.mcpServers?.[name]) {\n return { ...globalConfig.mcpServers[name], scope: 'global' }\n }\n\n return undefined\n}\n\nexport function getMcprcServerStatus(\n serverName: string,\n): 'approved' | 'rejected' | 'pending' {\n const config = getCurrentProjectConfig()\n if (config.approvedMcprcServers?.includes(serverName)) {\n return 'approved'\n }\n if (config.rejectedMcprcServers?.includes(serverName)) {\n return 'rejected'\n }\n return 'pending'\n}\n", "import { zipObject, memoize } from 'lodash-es'\nimport type { Tool } from '@tool'\nimport { MCPTool } from '@tools/mcp/MCPTool/MCPTool'\nimport { logMCPError } from '@utils/log'\nimport type { Command } from '@commands'\nimport type {\n ImageBlockParam,\n MessageParam,\n ToolResultBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport {\n CallToolResultSchema,\n type ClientRequest,\n type ListPromptsResult,\n ListPromptsResultSchema,\n type ListToolsResult,\n ListToolsResultSchema,\n type Result,\n ResultSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { getClients, type WrappedClient } from './client'\n\ntype ConnectedClient = Extract<WrappedClient, { type: 'connected' }>\n\nfunction sanitizeMcpIdentifierPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, '_')\n}\n\nfunction getMcpToolTimeoutMs(): number | null {\n const raw = process.env.MCP_TOOL_TIMEOUT\n const parsed = raw ? Number.parseInt(raw, 10) : NaN\n if (!Number.isFinite(parsed) || parsed <= 0) return null\n return parsed\n}\n\ntype TimeoutSignal = { signal: AbortSignal; cleanup: () => void }\n\nfunction createTimeoutSignal(timeoutMs: number): TimeoutSignal {\n const timeoutFn = (AbortSignal as any)?.timeout\n if (typeof timeoutFn === 'function') {\n return { signal: timeoutFn(timeoutMs) as AbortSignal, cleanup: () => {} }\n }\n\n const controller = new AbortController()\n const id = setTimeout(() => controller.abort(), timeoutMs)\n return { signal: controller.signal, cleanup: () => clearTimeout(id) }\n}\n\nfunction mergeAbortSignals(\n signals: Array<AbortSignal | undefined>,\n): { signal: AbortSignal; cleanup: () => void } | null {\n const active = signals.filter((s): s is AbortSignal => !!s)\n if (active.length === 0) return null\n if (active.length === 1) return { signal: active[0]!, cleanup: () => {} }\n\n const controller = new AbortController()\n\n const abort = () => {\n try {\n controller.abort()\n } catch {}\n }\n\n for (const s of active) {\n if (s.aborted) {\n abort()\n return { signal: controller.signal, cleanup: () => {} }\n }\n s.addEventListener('abort', abort, { once: true })\n }\n\n return { signal: controller.signal, cleanup: () => {} }\n}\n\nconst IDE_MCP_TOOL_ALLOWLIST = new Set([\n 'mcp__ide__executeCode',\n 'mcp__ide__getDiagnostics',\n])\n\nasync function requestAll<\n ResultT extends Result,\n ResultSchemaT extends typeof ResultSchema,\n>(\n req: ClientRequest,\n resultSchema: ResultSchemaT,\n requiredCapability: string,\n): Promise<{ client: ConnectedClient; result: ResultT }[]> {\n const timeoutMs = getMcpToolTimeoutMs()\n const clients = await getClients()\n const results = await Promise.allSettled(\n clients.map(async client => {\n if (client.type === 'failed') return null\n\n let timeoutSignal: TimeoutSignal | null = null\n\n try {\n let capabilities: Record<string, unknown> | null = client.capabilities ?? null\n\n if (!capabilities) {\n try {\n capabilities = client.client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n client.capabilities = capabilities\n }\n\n if (!(capabilities as any)?.[requiredCapability]) {\n return null\n }\n\n timeoutSignal = timeoutMs ? createTimeoutSignal(timeoutMs) : null\n const merged = mergeAbortSignals([timeoutSignal?.signal])\n\n return {\n client,\n result: (await client.client.request(\n req,\n resultSchema,\n merged?.signal ? ({ signal: merged.signal } as any) : undefined,\n )) as ResultT,\n }\n } catch (error) {\n if (client.type === 'connected') {\n logMCPError(\n client.name,\n `Failed to request '${req.method}': ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n return null\n } finally {\n timeoutSignal?.cleanup()\n }\n }),\n )\n return results\n .filter(\n (\n result,\n ): result is PromiseFulfilledResult<{ client: ConnectedClient; result: ResultT } | null> =>\n result.status === 'fulfilled',\n )\n .map(result => result.value)\n .filter((result): result is { client: ConnectedClient; result: ResultT } => result !== null)\n}\n\nexport const getMCPTools = memoize(async (): Promise<Tool[]> => {\n const toolsList = await requestAll<ListToolsResult, typeof ListToolsResultSchema>(\n {\n method: 'tools/list',\n },\n ListToolsResultSchema,\n 'tools',\n )\n\n return toolsList.flatMap(({ client, result: { tools } }) => {\n const serverPart = sanitizeMcpIdentifierPart(client.name)\n\n return tools\n .map((tool): Tool | null => {\n const toolPart = sanitizeMcpIdentifierPart(tool.name)\n const name = `mcp__${serverPart}__${toolPart}`\n\n if (name.startsWith('mcp__ide__') && !IDE_MCP_TOOL_ALLOWLIST.has(name)) {\n return null\n }\n\n return {\n ...MCPTool,\n name,\n isConcurrencySafe() {\n return tool.annotations?.readOnlyHint ?? false\n },\n isReadOnly() {\n return tool.annotations?.readOnlyHint ?? false\n },\n async description() {\n return tool.description ?? ''\n },\n async prompt() {\n return tool.description ?? ''\n },\n inputJSONSchema: tool.inputSchema as Tool['inputJSONSchema'],\n async validateInput() {\n return { result: true }\n },\n async *call(args: Record<string, unknown>, context) {\n const data = await callMCPTool({\n client,\n tool: tool.name,\n args,\n toolUseId: context.toolUseId,\n signal: context.abortController.signal,\n })\n yield {\n type: 'result' as const,\n data,\n resultForAssistant: data,\n }\n },\n userFacingName() {\n const title = tool.annotations?.title || tool.name\n return `${client.name} - ${title} (MCP)`\n },\n }\n })\n .filter((tool): tool is Tool => tool !== null)\n })\n})\n\nasync function callMCPTool({\n client: { client, name },\n tool,\n args,\n toolUseId,\n signal,\n}: {\n client: ConnectedClient\n tool: string\n args: Record<string, unknown>\n toolUseId?: string\n signal?: AbortSignal\n}): Promise<ToolResultBlockParam['content']> {\n const timeoutMs = getMcpToolTimeoutMs()\n const timeoutSignal = timeoutMs ? createTimeoutSignal(timeoutMs) : null\n const merged = mergeAbortSignals([signal, timeoutSignal?.signal])\n\n const meta =\n toolUseId && toolUseId.trim()\n ? { 'claudecode/toolUseId': toolUseId }\n : undefined\n\n try {\n const result = await client.callTool(\n {\n name: tool,\n arguments: args,\n ...(meta ? { _meta: meta } : {}),\n },\n CallToolResultSchema,\n merged?.signal ? ({ signal: merged.signal } as any) : undefined,\n )\n\n if ('isError' in result && result.isError) {\n const contentText =\n 'content' in result && Array.isArray(result.content)\n ? result.content.find(item => item.type === 'text' && 'text' in item)\n : null\n\n const rawMessage =\n contentText && typeof (contentText as any).text === 'string'\n ? String((contentText as any).text)\n : 'error' in result && result.error\n ? String(result.error)\n : ''\n\n const message = rawMessage || `Error calling tool ${tool}`\n logMCPError(name, `Error calling tool ${tool}: ${message}`)\n throw new Error(message)\n }\n\n if ('toolResult' in result) {\n return String(result.toolResult)\n }\n\n if ('structuredContent' in result && result.structuredContent !== undefined) {\n return JSON.stringify(result.structuredContent)\n }\n\n if ('content' in result && Array.isArray(result.content)) {\n return result.content.map(item => {\n if (item.type === 'image') {\n return {\n type: 'image',\n source: {\n type: 'base64',\n data: String(item.data),\n media_type: item.mimeType as ImageBlockParam.Source['media_type'],\n },\n }\n }\n return item\n })\n }\n\n throw Error(`Unexpected response format from tool ${tool}`)\n } finally {\n timeoutSignal?.cleanup()\n }\n}\n\nexport const getMCPCommands = memoize(async (): Promise<Command[]> => {\n const results = await requestAll<ListPromptsResult, typeof ListPromptsResultSchema>(\n {\n method: 'prompts/list',\n },\n ListPromptsResultSchema,\n 'prompts',\n )\n\n return results.flatMap(({ client, result }) =>\n result.prompts?.map(_ => {\n const serverPart = sanitizeMcpIdentifierPart(client.name)\n const argNames = Object.values(_.arguments ?? {}).map(k => k.name)\n return {\n type: 'prompt',\n name: `mcp__${serverPart}__${_.name}`,\n description: _.description ?? '',\n isEnabled: true,\n isHidden: false,\n progressMessage: 'running',\n userFacingName() {\n const title = typeof (_ as any).title === 'string' ? (_ as any).title : _.name\n return `${client.name}:${title} (MCP)`\n },\n argNames,\n async getPromptForCommand(args: string) {\n const argsArray = args.split(' ')\n return await runCommand({ name: _.name, client }, zipObject(argNames, argsArray))\n },\n } satisfies Command\n }),\n )\n})\n\nexport async function runCommand(\n { name, client }: { name: string; client: ConnectedClient },\n args: Record<string, string>,\n): Promise<MessageParam[]> {\n try {\n const result = await client.client.getPrompt({ name, arguments: args })\n return result.messages.map((message): MessageParam => {\n const content = message.content\n if (content.type === 'text') {\n return {\n role: message.role,\n content: [\n {\n type: 'text',\n text: content.text,\n },\n ],\n }\n }\n if (content.type === 'image' && 'data' in content) {\n return {\n role: message.role,\n content: [\n {\n type: 'image',\n source: {\n data: String((content as any).data),\n media_type: (content as any).mimeType as ImageBlockParam.Source['media_type'],\n type: 'base64',\n },\n },\n ],\n }\n }\n return {\n role: message.role,\n content: [\n {\n type: 'text',\n text: `Unsupported MCP content type ${(content as any)?.type ?? 'unknown'}`,\n },\n ],\n }\n })\n } catch (error) {\n logMCPError(\n client.name,\n `Error running command '${name}': ${error instanceof Error ? error.message : String(error)}`,\n )\n throw error\n }\n}\n\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { type Tool } from '@tool'\nimport { getTheme } from '@utils/theme'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { OutputLine } from '@tools/BashTool/OutputLine'\n\nconst inputSchema = z.object({}).passthrough()\n\nexport const MCPTool = {\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n name: 'mcp',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n async *call() {\n yield {\n type: 'result',\n data: '',\n resultForAssistant: '',\n }\n },\n needsPermissions() {\n return true\n },\n renderToolUseMessage(input) {\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n userFacingName: () => 'mcp',\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output) {\n const verbose = false\n if (Array.isArray(output)) {\n return (\n <Box flexDirection=\"column\">\n {output.map((item, i) => {\n if (item.type === 'image') {\n return (\n <Box\n key={i}\n justifyContent=\"space-between\"\n overflowX=\"hidden\"\n width=\"100%\"\n >\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>[Image]</Text>\n </Box>\n </Box>\n )\n }\n const lines = item.text.split('\\n').length\n return (\n <OutputLine\n key={i}\n content={item.text}\n lines={lines}\n verbose={verbose}\n />\n )\n })}\n </Box>\n )\n }\n\n if (!output) {\n return (\n <Box justifyContent=\"space-between\" overflowX=\"hidden\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text color={getTheme().secondaryText}>(No content)</Text>\n </Box>\n </Box>\n )\n }\n\n const lines = output.split('\\n').length\n return <OutputLine content={output} lines={lines} verbose={verbose} />\n },\n renderResultForAssistant(content) {\n return content\n },\n} satisfies Tool<typeof inputSchema, string>\n", "import * as React from 'react'\nimport { getTheme } from '@utils/theme'\nimport { Text } from 'ink'\nimport { PRODUCT_NAME } from '@constants/product'\n\nexport function FallbackToolUseRejectedMessage(): React.ReactNode {\n return (\n <Text>\n \u23BF \n <Text color={getTheme().error}>\n No (tell {PRODUCT_NAME} what to do differently)\n </Text>\n </Text>\n )\n}\n", "export const PROMPT = ''\nexport const DESCRIPTION = ''\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '@utils/theme'\nimport { MAX_RENDERED_LINES } from './prompt'\nimport chalk from 'chalk'\n\nfunction renderTruncatedContent(content: string, totalLines: number): string {\n const allLines = content.split('\\n')\n if (allLines.length <= MAX_RENDERED_LINES) {\n return allLines.join('\\n')\n }\n\n const lastLines = allLines.slice(-MAX_RENDERED_LINES)\n return [\n chalk.grey(\n `Showing last ${MAX_RENDERED_LINES} lines of ${totalLines} total lines`,\n ),\n ...lastLines,\n ].join('\\n')\n}\n\nexport function OutputLine({\n content,\n lines,\n verbose,\n isError,\n}: {\n content: string\n lines: number\n verbose: boolean\n isError?: boolean\n key?: React.Key\n}) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Box flexDirection=\"column\">\n <Text color={isError ? getTheme().error : undefined}>\n {verbose\n ? content.trim()\n : renderTruncatedContent(content.trim(), lines)}\n </Text>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import { watchFile, unwatchFile } from 'fs'\nimport { homedir } from 'os'\nimport {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n} from '@utils/config/settingsFiles'\n\nexport type SandboxNetworkConfig = {\n allowedDomains: string[]\n deniedDomains: string[]\n allowUnixSockets: string[]\n allowAllUnixSockets?: boolean\n allowLocalBinding?: boolean\n httpProxyPort?: number\n socksProxyPort?: number\n}\n\nexport type SandboxFilesystemConfig = {\n denyRead: string[]\n allowWrite: string[]\n denyWrite: string[]\n}\n\nexport type SandboxRipgrepConfig = {\n command: string\n args: string[]\n}\n\nexport type SandboxRuntimeConfig = {\n network: SandboxNetworkConfig\n filesystem: SandboxFilesystemConfig\n ignoreViolations?: boolean\n enableWeakerNestedSandbox?: boolean\n ripgrep: SandboxRipgrepConfig\n excludedCommands?: string[]\n}\n\ntype SettingsPermissions = {\n allow?: unknown\n deny?: unknown\n}\n\ntype SettingsSandboxNetwork = {\n allowedDomains?: unknown\n deniedDomains?: unknown\n allowUnixSockets?: unknown\n allowAllUnixSockets?: unknown\n allowLocalBinding?: unknown\n httpProxyPort?: unknown\n socksProxyPort?: unknown\n}\n\ntype SettingsSandboxRipgrep = {\n command?: unknown\n args?: unknown\n}\n\ntype SettingsSandbox = {\n enabled?: unknown\n autoAllowBashIfSandboxed?: unknown\n allowUnsandboxedCommands?: unknown\n network?: SettingsSandboxNetwork\n ignoreViolations?: unknown\n enableWeakerNestedSandbox?: unknown\n ripgrep?: SettingsSandboxRipgrep\n excludedCommands?: unknown\n}\n\nexport type KodeSettingsFile = {\n permissions?: SettingsPermissions\n sandbox?: SettingsSandbox\n [key: string]: unknown\n}\n\ntype ToolRuleValue = { toolName: string; ruleContent?: string }\n\nfunction parseToolRuleString(rule: string): ToolRuleValue {\n const match = rule.match(/^([^(]+)\\(([^)]+)\\)$/)\n if (!match) return { toolName: rule }\n\n const toolName = match[1]\n const ruleContent = match[2]\n if (!toolName || !ruleContent) return { toolName: rule }\n return { toolName, ruleContent }\n}\n\nfunction uniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const out: string[] = []\n const seen = new Set<string>()\n for (const item of value) {\n if (typeof item !== 'string') continue\n const trimmed = item.trim()\n if (!trimmed) continue\n if (seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out\n}\n\nfunction uniqueStringsUnion(...lists: string[][]): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const list of lists) {\n for (const item of list) {\n const trimmed = item.trim()\n if (!trimmed) continue\n if (seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n }\n return out\n}\n\nfunction mergeSandboxSettings(\n base: SettingsSandbox | undefined,\n next: SettingsSandbox | undefined,\n): SettingsSandbox | undefined {\n if (!base && !next) return undefined\n const merged: SettingsSandbox = { ...(base ?? {}) }\n\n const mergeBool = (k: keyof SettingsSandbox) => {\n if (next && k in next && next[k] !== undefined) merged[k] = next[k]\n }\n mergeBool('enabled')\n mergeBool('autoAllowBashIfSandboxed')\n mergeBool('allowUnsandboxedCommands')\n mergeBool('ignoreViolations')\n mergeBool('enableWeakerNestedSandbox')\n mergeBool('excludedCommands')\n\n if (next?.network) {\n merged.network = { ...(merged.network ?? {}), ...next.network }\n }\n if (next?.ripgrep) {\n merged.ripgrep = { ...(merged.ripgrep ?? {}), ...next.ripgrep }\n }\n\n return merged\n}\n\nexport function loadMergedSettings(options?: {\n projectDir?: string\n homeDir?: string\n}): KodeSettingsFile {\n const projectDir = options?.projectDir ?? process.cwd()\n const homeDir = options?.homeDir\n\n const user = loadSettingsWithLegacyFallback({\n destination: 'userSettings',\n homeDir,\n migrateToPrimary: true,\n }).settings as KodeSettingsFile | null\n const project = loadSettingsWithLegacyFallback({\n destination: 'projectSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true,\n }).settings as KodeSettingsFile | null\n const local = loadSettingsWithLegacyFallback({\n destination: 'localSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true,\n }).settings as KodeSettingsFile | null\n\n const allow = uniqueStringsUnion(\n uniqueStrings(user?.permissions?.allow),\n uniqueStrings(project?.permissions?.allow),\n uniqueStrings(local?.permissions?.allow),\n )\n const deny = uniqueStringsUnion(\n uniqueStrings(user?.permissions?.deny),\n uniqueStrings(project?.permissions?.deny),\n uniqueStrings(local?.permissions?.deny),\n )\n\n const sandbox = mergeSandboxSettings(\n mergeSandboxSettings(user?.sandbox, project?.sandbox),\n local?.sandbox,\n )\n\n return {\n permissions: { allow, deny },\n ...(sandbox ? { sandbox } : {}),\n }\n}\n\nexport function normalizeSandboxRuntimeConfigFromSettings(\n settings: KodeSettingsFile,\n options?: {\n projectDir?: string\n homeDir?: string\n defaultRipgrep?: SandboxRipgrepConfig\n },\n): SandboxRuntimeConfig {\n const projectDir = options?.projectDir ?? process.cwd()\n const homeDir = options?.homeDir ?? homedir()\n\n const permissions = settings.permissions ?? {}\n const allowRules = uniqueStrings(permissions.allow)\n const denyRules = uniqueStrings(permissions.deny)\n\n const explicitAllowedDomains = uniqueStrings(\n settings.sandbox?.network?.allowedDomains,\n )\n const allowedDomains: string[] = [...explicitAllowedDomains]\n const deniedDomains: string[] = []\n\n for (const rule of allowRules) {\n const parsed = parseToolRuleString(rule)\n if (\n parsed?.toolName === 'WebFetch' &&\n parsed.ruleContent?.startsWith('domain:')\n ) {\n allowedDomains.push(parsed.ruleContent.substring(7))\n }\n }\n\n for (const rule of denyRules) {\n const parsed = parseToolRuleString(rule)\n if (\n parsed?.toolName === 'WebFetch' &&\n parsed.ruleContent?.startsWith('domain:')\n ) {\n deniedDomains.push(parsed.ruleContent.substring(7))\n }\n }\n\n const allowWrite: string[] = ['.']\n const denyWrite: string[] = []\n const denyRead: string[] = []\n\n const userCandidates = getSettingsFileCandidates({\n destination: 'userSettings',\n homeDir,\n })\n const userCandidatesWithEnv = getSettingsFileCandidates({\n destination: 'userSettings',\n })\n const projectCandidates = getSettingsFileCandidates({\n destination: 'projectSettings',\n projectDir,\n homeDir,\n })\n const localCandidates = getSettingsFileCandidates({\n destination: 'localSettings',\n projectDir,\n homeDir,\n })\n\n for (const path of [\n userCandidates?.primary,\n ...(userCandidates?.legacy ?? []),\n userCandidatesWithEnv?.primary,\n ...(userCandidatesWithEnv?.legacy ?? []),\n projectCandidates?.primary,\n ...(projectCandidates?.legacy ?? []),\n localCandidates?.primary,\n ...(localCandidates?.legacy ?? []),\n ]) {\n if (!path) continue\n if (denyWrite.includes(path)) continue\n denyWrite.push(path)\n }\n\n for (const rule of allowRules) {\n const parsed = parseToolRuleString(rule)\n if (\n (parsed?.toolName === 'Write' || parsed?.toolName === 'Edit') &&\n parsed.ruleContent\n ) {\n allowWrite.push(parsed.ruleContent)\n }\n }\n\n for (const rule of denyRules) {\n const parsed = parseToolRuleString(rule)\n if (\n (parsed?.toolName === 'Write' || parsed?.toolName === 'Edit') &&\n parsed.ruleContent\n ) {\n denyWrite.push(parsed.ruleContent)\n }\n if (parsed?.toolName === 'Read' && parsed.ruleContent) {\n denyRead.push(parsed.ruleContent)\n }\n }\n\n const sandboxNetwork = settings.sandbox?.network\n\n const defaultRipgrep: SandboxRipgrepConfig = options?.defaultRipgrep ?? {\n command: 'rg',\n args: [],\n }\n const ripgrep: SandboxRipgrepConfig =\n typeof settings.sandbox?.ripgrep?.command === 'string'\n ? {\n command: settings.sandbox!.ripgrep!.command as string,\n args: Array.isArray(settings.sandbox?.ripgrep?.args)\n ? (settings.sandbox!.ripgrep!.args as unknown[]).filter(\n (v): v is string => typeof v === 'string',\n )\n : [],\n }\n : defaultRipgrep\n\n return {\n network: {\n allowedDomains: uniqueStringsUnion(allowedDomains),\n deniedDomains: uniqueStringsUnion(deniedDomains),\n allowUnixSockets: Array.isArray(sandboxNetwork?.allowUnixSockets)\n ? (sandboxNetwork!.allowUnixSockets as unknown[]).filter(\n (v): v is string => typeof v === 'string',\n )\n : [],\n allowAllUnixSockets:\n typeof sandboxNetwork?.allowAllUnixSockets === 'boolean'\n ? sandboxNetwork.allowAllUnixSockets\n : undefined,\n allowLocalBinding:\n typeof sandboxNetwork?.allowLocalBinding === 'boolean'\n ? sandboxNetwork.allowLocalBinding\n : undefined,\n httpProxyPort:\n typeof sandboxNetwork?.httpProxyPort === 'number'\n ? sandboxNetwork.httpProxyPort\n : undefined,\n socksProxyPort:\n typeof sandboxNetwork?.socksProxyPort === 'number'\n ? sandboxNetwork.socksProxyPort\n : undefined,\n },\n filesystem: {\n denyRead: uniqueStringsUnion(denyRead),\n allowWrite: uniqueStringsUnion(allowWrite),\n denyWrite: uniqueStringsUnion(denyWrite),\n },\n ignoreViolations:\n typeof settings.sandbox?.ignoreViolations === 'boolean'\n ? settings.sandbox.ignoreViolations\n : undefined,\n enableWeakerNestedSandbox:\n typeof settings.sandbox?.enableWeakerNestedSandbox === 'boolean'\n ? settings.sandbox.enableWeakerNestedSandbox\n : undefined,\n excludedCommands: uniqueStrings(settings.sandbox?.excludedCommands),\n ripgrep,\n }\n}\n\nfunction looksLikeLinuxGlobPattern(ruleContent: string): boolean {\n const trimmed = ruleContent.replace(/\\/\\*\\*$/, '')\n return /[*?[\\]]/.test(trimmed)\n}\n\nexport function getLinuxSandboxGlobPatternWarnings(\n settings: KodeSettingsFile,\n options?: { platform?: NodeJS.Platform },\n): string[] {\n const platform = options?.platform ?? process.platform\n if (platform !== 'linux') return []\n if (settings.sandbox?.enabled !== true) return []\n\n const permissions = settings.permissions ?? {}\n const allow = uniqueStrings(permissions.allow)\n const deny = uniqueStrings(permissions.deny)\n\n const warnings: string[] = []\n for (const rule of [...allow, ...deny]) {\n const parsed = parseToolRuleString(rule)\n if (!parsed?.ruleContent) continue\n if (\n parsed.toolName !== 'Write' &&\n parsed.toolName !== 'Edit' &&\n parsed.toolName !== 'Read'\n )\n continue\n if (!looksLikeLinuxGlobPattern(parsed.ruleContent)) continue\n warnings.push(rule)\n }\n\n return warnings\n}\n\nexport type SandboxConfigListener = (config: SandboxRuntimeConfig) => void\n\nexport class SandboxConfigManager {\n private listeners = new Set<SandboxConfigListener>()\n private watchPaths: string[] = []\n private current: SandboxRuntimeConfig | null = null\n\n getCurrent(): SandboxRuntimeConfig {\n if (!this.current) {\n const settings = loadMergedSettings()\n this.current = normalizeSandboxRuntimeConfigFromSettings(settings)\n }\n return this.current\n }\n\n subscribe(listener: SandboxConfigListener): () => void {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n initialize(options?: { projectDir?: string; homeDir?: string }): void {\n const projectDir = options?.projectDir ?? process.cwd()\n const homeDir = options?.homeDir ?? homedir()\n const user = getSettingsFileCandidates({\n destination: 'userSettings',\n homeDir,\n })\n const userEnv = getSettingsFileCandidates({ destination: 'userSettings' })\n const project = getSettingsFileCandidates({\n destination: 'projectSettings',\n projectDir,\n homeDir,\n })\n const local = getSettingsFileCandidates({\n destination: 'localSettings',\n projectDir,\n homeDir,\n })\n\n const paths = [\n user?.primary,\n ...(user?.legacy ?? []),\n userEnv?.primary,\n ...(userEnv?.legacy ?? []),\n project?.primary,\n ...(project?.legacy ?? []),\n local?.primary,\n ...(local?.legacy ?? []),\n ].filter((p): p is string => Boolean(p))\n this.watchPaths = Array.from(new Set(paths))\n\n for (const p of this.watchPaths) {\n watchFile(p, { interval: 1000 }, () => {\n const settings = loadMergedSettings({ projectDir, homeDir })\n this.current = normalizeSandboxRuntimeConfigFromSettings(settings, {\n projectDir,\n homeDir,\n })\n for (const listener of this.listeners) listener(this.current)\n })\n }\n }\n\n close(): void {\n for (const p of this.watchPaths) {\n try {\n unwatchFile(p)\n } catch {}\n }\n this.watchPaths = []\n }\n}\n", "import {\n loadMergedSettings,\n normalizeSandboxRuntimeConfigFromSettings,\n} from '@utils/sandbox/sandboxConfig'\n\nexport const DEFAULT_TIMEOUT_MS = 120000\nexport const MAX_TIMEOUT_MS = 600000\nexport const MAX_OUTPUT_LENGTH = 30000\nexport const MAX_RENDERED_LINES = 5\n\nconst PROJECT_URL = 'https://github.com/shareAI-lab/kode'\nconst DEFAULT_CO_AUTHOR = 'ShareAI Lab'\n\nconst TOOL_NAME_BASH = 'Bash'\nconst TOOL_NAME_GLOB = 'Glob'\nconst TOOL_NAME_GREP = 'Grep'\nconst TOOL_NAME_READ = 'Read'\nconst TOOL_NAME_EDIT = 'Edit'\nconst TOOL_NAME_WRITE = 'Write'\nconst TOOL_NAME_TASK = 'Task'\n\nfunction isExperimentalMcpCliEnabled(): boolean {\n const value = process.env.ENABLE_EXPERIMENTAL_MCP_CLI\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(String(value).trim().toLowerCase())\n}\n\nfunction indentJsonForPrompt(value: unknown): string {\n return JSON.stringify(value, null, 2).split('\\n').join('\\n ')\n}\n\nfunction getAttribution(): { commit: string; pr: string } {\n const pr = `\uD83E\uDD16 Generated with [Kode Agent](${PROJECT_URL})`\n const commit = `${pr}\\n\\n Co-Authored-By: ${DEFAULT_CO_AUTHOR} <ai-lab@foxmail.com>`\n return { commit, pr }\n}\n\nfunction getBashSandboxPrompt(): string {\n const settings = loadMergedSettings()\n if (settings.sandbox?.enabled !== true) return ''\n\n const runtimeConfig = normalizeSandboxRuntimeConfigFromSettings(settings)\n\n const fsReadConfig = { denyOnly: runtimeConfig.filesystem.denyRead }\n const fsWriteConfig = {\n allowOnly: runtimeConfig.filesystem.allowWrite,\n denyWithinAllow: runtimeConfig.filesystem.denyWrite,\n }\n\n const filesystem = { read: fsReadConfig, write: fsWriteConfig }\n\n const allowUnixSockets =\n runtimeConfig.network.allowAllUnixSockets === true\n ? true\n : runtimeConfig.network.allowUnixSockets.length > 0\n ? runtimeConfig.network.allowUnixSockets\n : undefined\n\n const network = {\n ...(runtimeConfig.network.allowedDomains.length\n ? { allowedHosts: runtimeConfig.network.allowedDomains }\n : {}),\n ...(runtimeConfig.network.deniedDomains.length\n ? { deniedHosts: runtimeConfig.network.deniedDomains }\n : {}),\n ...(allowUnixSockets ? { allowUnixSockets } : {}),\n }\n\n const ignoredViolations = runtimeConfig.ignoreViolations\n const allowUnsandboxedCommands =\n settings.sandbox?.allowUnsandboxedCommands !== false\n\n const sections: string[] = []\n sections.push(` - Filesystem: ${indentJsonForPrompt(filesystem)}`)\n if (Object.keys(network).length > 0) {\n sections.push(` - Network: ${indentJsonForPrompt(network)}`)\n }\n if (ignoredViolations) {\n sections.push(\n ` - Ignored violations: ${indentJsonForPrompt(ignoredViolations)}`,\n )\n }\n\n const mcpCliException = isExperimentalMcpCliEnabled()\n ? ' - EXCEPTION: `mcp-cli` commands must always be called with `dangerouslyDisableSandbox: true` as they do not work properly in sandboxed mode\\n'\n : ''\n\n const overridePolicy = allowUnsandboxedCommands\n ? ` - CRITICAL: Commands run in sandbox mode by default - do NOT set \\`dangerouslyDisableSandbox\\`\n - Even if you have recently run commands with \\`dangerouslyDisableSandbox: true\\`, you MUST NOT continue that pattern\n - VERY IMPORTANT: Do NOT learn from or repeat the pattern of overriding sandbox - each command should run sandboxed by default\n${mcpCliException} - Set \\`dangerouslyDisableSandbox: true\\` if:\n 1. The user *explicitly* asks to bypass sandbox, OR\n 2. A command just failed and you see evidence of sandbox restrictions causing the failure\n - When analyzing failures:\n - Commands can fail for many reasons unrelated to the sandbox (missing files, wrong arguments, network issues, etc.)\n - Evidence of sandbox-caused failures includes:\n - \"Operation not permitted\" errors for file/network operations\n - Access denied to specific paths outside allowed directories\n - Network connection failures to non-whitelisted hosts\n - Unix socket connection errors\n - Sandbox violation logs can be noisy, but clear permission errors are strong indicators\n - When you see evidence of sandbox-caused failure:\n - IMMEDIATELY retry with \\`dangerouslyDisableSandbox: true\\` (don't ask, just do it)\n - Briefly explain what sandbox restriction likely caused the failure\n - Mention: \"Use \\`/sandbox\\` to manage restrictions\"\n - This will prompt the user for permission\n - Example of normal usage: { \"command\": \"ls\", \"description\": \"List files\" }\n - Example of override: { \"command\": \"my-tool\", \"description\": \"Run my-tool\", \"dangerouslyDisableSandbox\": true }\n - DO NOT suggest adding sensitive paths like ~/.bashrc, ~/.zshrc, ~/.ssh/*, or credential files to the allowlist`\n : ` - CRITICAL: All commands MUST run in sandbox mode - the \\`dangerouslyDisableSandbox\\` parameter is disabled by policy\n - Commands cannot run outside the sandbox under any circumstances\n - If a command fails due to sandbox restrictions, work with the user to adjust sandbox settings instead`\n\n return `- Commands run in a sandbox by default with the following restrictions:\n${sections.join('\\n')}\n${overridePolicy}\n - IMPORTANT: For temporary files, rely on the sandbox temp directory via \\`TMPDIR\\`\n - In sandbox mode, \\`TMPDIR\\` is set to a dedicated temp directory\n - Prefer using \\`TMPDIR\\` over writing directly to \\`/tmp\\`\n - Most programs that respect \\`TMPDIR\\` will automatically use it`\n}\n\nfunction getBashGitPrompt(): string {\n const { commit, pr } = getAttribution()\n return `# Committing changes with git\n\nOnly create commits when requested by the user. If unclear, ask first. When the user asks you to create a new git commit, follow these steps carefully:\n\nGit Safety Protocol:\n- NEVER update the git config\n- NEVER run destructive/irreversible git commands (like push --force, hard reset, etc) unless the user explicitly requests them \n- NEVER skip hooks (--no-verify, --no-gpg-sign, etc) unless the user explicitly requests it\n- NEVER run force push to main/master, warn the user if they request it\n- Avoid git commit --amend. ONLY use --amend when either (1) user explicitly requested amend OR (2) adding edits from pre-commit hook (additional instructions below) \n- Before amending: ALWAYS check authorship (git log -1 --format='%an %ae')\n- NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.\n\n1. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following bash commands in parallel, each using the ${TOOL_NAME_BASH} tool:\n - Run a git status command to see all untracked files.\n - Run a git diff command to see both staged and unstaged changes that will be committed.\n - Run a git log command to see recent commit messages, so that you can follow this repository's commit message style.\n2. Analyze all staged changes (both previously staged and newly added) and draft a commit message:\n - Summarize the nature of the changes (eg. new feature, enhancement to an existing feature, bug fix, refactoring, test, docs, etc.). Ensure the message accurately reflects the changes and their purpose (i.e. \"add\" means a wholly new feature, \"update\" means an enhancement to an existing feature, \"fix\" means a bug fix, etc.).\n - Do not commit files that likely contain secrets (.env, credentials.json, etc). Warn the user if they specifically request to commit those files\n - Draft a concise (1-2 sentences) commit message that focuses on the \"why\" rather than the \"what\"\n - Ensure it accurately reflects the changes and their purpose\n3. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following commands:\n - Add relevant untracked files to the staging area.\n - Create the commit with a message${commit ? ` ending with:\\n ${commit}` : '.'}\n - Run git status after the commit completes to verify success.\n Note: git status depends on the commit completing, so run it sequentially after the commit.\n4. If the commit fails due to pre-commit hook changes, retry ONCE. If it succeeds but files were modified by the hook, verify it's safe to amend:\n - Check HEAD commit: git log -1 --format='[%h] (%an <%ae>) %s'. VERIFY it matches your commit\n - Check not pushed: git status shows \"Your branch is ahead\"\n - If both true: amend your commit. Otherwise: create NEW commit (never amend other developers' commits)\n\nImportant notes:\n- NEVER run additional commands to read or explore code, besides git bash commands\n- NEVER use the ${TOOL_NAME_WRITE} or ${TOOL_NAME_TASK} tools\n- DO NOT push to the remote repository unless the user explicitly asks you to do so\n- IMPORTANT: Never use git commands with the -i flag (like git rebase -i or git add -i) since they require interactive input which is not supported.\n- If there are no changes to commit (i.e., no untracked files and no modifications), do not create an empty commit\n- In order to ensure good formatting, ALWAYS pass the commit message via a HEREDOC, a la this example:\n<example>\ngit commit -m \"$(cat <<'EOF'\n Commit message here.${commit ? `\\n\\n ${commit}` : ''}\n EOF\n )\"\n</example>\n\n# Creating pull requests\nUse the gh command via the Bash tool for ALL GitHub-related tasks including working with issues, pull requests, checks, and releases. If given a Github URL use the gh command to get the information needed.\n\nIMPORTANT: When the user asks you to create a pull request, follow these steps carefully:\n\n1. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following bash commands in parallel using the ${TOOL_NAME_BASH} tool, in order to understand the current state of the branch since it diverged from the main branch:\n - Run a git status command to see all untracked files\n - Run a git diff command to see both staged and unstaged changes that will be committed\n - Check if the current branch tracks a remote branch and is up to date with the remote, so you know if you need to push to the remote\n - Run a git log command and \\`git diff [base-branch]...HEAD\\` to understand the full commit history for the current branch (from the time it diverged from the base branch)\n2. Analyze all changes that will be included in the pull request, making sure to look at all relevant commits (NOT just the latest commit, but ALL commits that will be included in the pull request!!!), and draft a pull request summary\n3. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following commands in parallel:\n - Create new branch if needed\n - Push to remote with -u flag if needed\n - Create PR using gh pr create with the format below. Use a HEREDOC to pass the body to ensure correct formatting.\n<example>\ngh pr create --title \"the pr title\" --body \"$(cat <<'EOF'\n## Summary\n<1-3 bullet points>\n\n## Test plan\n[Bulleted markdown checklist of TODOs for testing the pull request...]${pr ? `\\n\\n${pr}` : ''}\nEOF\n)\"\n</example>\n\nImportant:\n- DO NOT use the ${TOOL_NAME_WRITE} or ${TOOL_NAME_TASK} tools\n- Return the PR URL when you're done, so the user can see it\n\n# Other common operations\n- View comments on a Github PR: gh api repos/foo/bar/pulls/123/comments`\n}\n\nexport function getBashToolPrompt(): string {\n const sandboxPrompt = getBashSandboxPrompt()\n return `Executes a given bash command in a persistent shell session with optional timeout, ensuring proper handling and security measures.\n\nIMPORTANT: This tool is for terminal operations like git, npm, docker, etc. DO NOT use it for file operations (reading, writing, editing, searching, finding files) - use the specialized tools for this instead.\n\nBefore executing the command, please follow these steps:\n\n1. Directory Verification:\n - If the command will create new directories or files, first use \\`ls\\` to verify the parent directory exists and is the correct location\n - For example, before running \"mkdir foo/bar\", first use \\`ls foo\\` to check that \"foo\" exists and is the intended parent directory\n\n2. Command Execution:\n - Always quote file paths that contain spaces with double quotes (e.g., cd \"path with spaces/file.txt\")\n - Examples of proper quoting:\n - cd \"/Users/name/My Documents\" (correct)\n - cd /Users/name/My Documents (incorrect - will fail)\n - python \"/path/with spaces/script.py\" (correct)\n - python /path/with spaces/script.py (incorrect - will fail)\n - After ensuring proper quoting, execute the command.\n - Capture the output of the command.\n\nUsage notes:\n - The command argument is required.\n - You can specify an optional timeout in milliseconds (up to ${MAX_TIMEOUT_MS}ms / ${MAX_TIMEOUT_MS / 60000} minutes). If not specified, commands will timeout after ${DEFAULT_TIMEOUT_MS}ms (${DEFAULT_TIMEOUT_MS / 60000} minutes).\n - It is very helpful if you write a clear, concise description of what this command does in 5-10 words.\n - If the output exceeds ${MAX_OUTPUT_LENGTH} characters, output will be truncated before being returned to you.\n - You can use the \\`run_in_background\\` parameter to run the command in the background, which allows you to continue working while the command runs. You can monitor the output using the ${TOOL_NAME_BASH} tool as it becomes available. You do not need to use '&' at the end of the command when using this parameter.\n ${sandboxPrompt}\n - Avoid using Bash with the \\`find\\`, \\`grep\\`, \\`cat\\`, \\`head\\`, \\`tail\\`, \\`sed\\`, \\`awk\\`, or \\`echo\\` commands, unless explicitly instructed or when these commands are truly necessary for the task. Instead, always prefer using the dedicated tools for these commands:\n - File search: Use ${TOOL_NAME_GLOB} (NOT find or ls)\n - Content search: Use ${TOOL_NAME_GREP} (NOT grep or rg)\n - Read files: Use ${TOOL_NAME_READ} (NOT cat/head/tail)\n - Edit files: Use ${TOOL_NAME_EDIT} (NOT sed/awk)\n - Write files: Use ${TOOL_NAME_WRITE} (NOT echo >/cat <<EOF)\n - Communication: Output text directly (NOT echo/printf)\n - When issuing multiple commands:\n - If the commands are independent and can run in parallel, make multiple ${TOOL_NAME_BASH} tool calls in a single message. For example, if you need to run \"git status\" and \"git diff\", send a single message with two ${TOOL_NAME_BASH} tool calls in parallel.\n - If the commands depend on each other and must run sequentially, use a single ${TOOL_NAME_BASH} call with '&&' to chain them together (e.g., \\`git add . && git commit -m \"message\" && git push\\`). For instance, if one operation must complete before another starts (like mkdir before cp, Write before Bash for git operations, or git add before git commit), run these operations sequentially instead.\n - Use ';' only when you need to run commands sequentially but don't care if earlier commands fail\n - DO NOT use newlines to separate commands (newlines are ok in quoted strings)\n - Try to maintain your current working directory throughout the session by using absolute paths and avoiding usage of \\`cd\\`. You may use \\`cd\\` if the User explicitly requests it.\n <good-example>\n pytest /foo/bar/tests\n </good-example>\n <bad-example>\n cd /foo/bar && pytest tests\n </bad-example>\n\n${getBashGitPrompt()}`\n}\n", "import { ensureConfigScope } from './discovery'\n\nexport type McpCliTransport = 'stdio' | 'sse' | 'http'\n\nexport function looksLikeMcpUrl(value: string): boolean {\n const trimmed = value.trim()\n if (!trimmed) return false\n\n if (/^(https?|wss?):\\/\\//i.test(trimmed)) return true\n if (/^localhost(?::\\d+)?(\\/|$)/i.test(trimmed)) return true\n if (/^\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d+)?(\\/|$)/.test(trimmed)) return true\n return trimmed.endsWith('/sse') || trimmed.endsWith('/mcp')\n}\n\nexport function parseMcpHeaders(\n raw: string[] | undefined,\n): Record<string, string> | undefined {\n if (!raw || raw.length === 0) return undefined\n const headers: Record<string, string> = {}\n for (const item of raw) {\n const idx = item.indexOf(':')\n if (idx === -1) {\n throw new Error(\n `Invalid header format: \"${item}\". Expected format: \"Header-Name: value\"`,\n )\n }\n const key = item.slice(0, idx).trim()\n const value = item.slice(idx + 1).trim()\n if (!key) {\n throw new Error(`Invalid header: \"${item}\". Header name cannot be empty.`)\n }\n headers[key] = value\n }\n return headers\n}\n\nexport function normalizeMcpScopeForCli(scope: string | undefined): {\n scope: ReturnType<typeof ensureConfigScope>\n display: string\n} {\n const raw = (scope ?? 'local').trim() || 'local'\n\n if (raw === 'local')\n return { scope: ensureConfigScope('project'), display: 'local' }\n if (raw === 'user')\n return { scope: ensureConfigScope('global'), display: 'user' }\n if (raw === 'project')\n return { scope: ensureConfigScope('mcpjson'), display: 'project' }\n\n if (raw === 'global')\n return { scope: ensureConfigScope('global'), display: 'user' }\n if (raw === 'projectConfig' || raw === 'project-config') {\n return { scope: ensureConfigScope('project'), display: 'local' }\n }\n\n return { scope: ensureConfigScope(raw), display: raw }\n}\n\nexport function normalizeMcpTransport(transport: string | undefined): {\n transport: McpCliTransport\n explicit: boolean\n} {\n if (!transport) return { transport: 'stdio', explicit: false }\n const normalized = transport.trim()\n if (normalized === 'stdio' || normalized === 'sse' || normalized === 'http') {\n return { transport: normalized, explicit: true }\n }\n throw new Error(\n `Invalid transport type: ${transport}. Must be one of: stdio, sse, http`,\n )\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,cAAAA,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,eAAe;AAExB,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,0BAA0B;AACnC,SAAS,qCAAqC;AAC9C,SAAS,gCAAgC;AACzC,SAAS,SAAS,cAAc;;;ACdhC,SAAS,kBAAkB,OAAuB;AAChD,MAAI,MAAM;AACV,MAAI,WAAW;AACf,MAAI,UAAU;AACd,MAAI,gBAAgB;AACpB,MAAI,iBAAiB;AAErB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,KAAK,MAAM,CAAC;AAClB,UAAM,OAAO,IAAI,IAAI,MAAM,SAAS,MAAM,IAAI,CAAC,IAAK;AAEpD,QAAI,eAAe;AACjB,UAAI,OAAO,MAAM;AACf,wBAAgB;AAChB,eAAO;AAAA,MACT;AACA;AAAA,IACF;AAEA,QAAI,gBAAgB;AAClB,UAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,yBAAiB;AACjB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,aAAO;AACP,UAAI,SAAS;AACX,kBAAU;AACV;AAAA,MACF;AACA,UAAI,OAAO,MAAM;AACf,kBAAU;AACV;AAAA,MACF;AACA,UAAI,OAAO,IAAK,YAAW;AAC3B;AAAA,IACF;AAEA,QAAI,OAAO,KAAK;AACd,iBAAW;AACX,aAAO;AACP;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,sBAAgB;AAChB;AACA;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,uBAAiB;AACjB;AACA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,MAAuB;AACtD,QAAM,MAAM,OAAO,QAAQ,EAAE;AAC7B,MAAI,CAAC,IAAI,KAAK,EAAG,QAAO;AACxB,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,QAAI;AACF,aAAO,KAAK,MAAM,kBAAkB,GAAG,CAAC;AAAA,IAC1C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACnEA,SAAS,YAAY,cAAc,qBAAqB;AACxD,SAAS,YAAY;AAQrB,SAAS,qBAAqB,OAAe,YAA4B;AACvE,SAAO,MAAM,QAAQ,kBAAkB,CAAC,OAAO,QAAQ;AACrD,UAAM,IAAI,OAAO,OAAO,EAAE,EAAE,KAAK;AACjC,QAAI,CAAC,EAAG,QAAO;AACf,QAAI,MAAM,qBAAsB,QAAO;AACvC,UAAM,MAAM,QAAQ,IAAI,CAAC;AACzB,WAAO,QAAQ,SAAY,MAAM;AAAA,EACnC,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAgB,YAA6B;AACvE,MAAI,OAAO,UAAU,SAAU,QAAO,qBAAqB,OAAO,UAAU;AAC5E,MAAI,MAAM,QAAQ,KAAK;AACrB,WAAO,MAAM,IAAI,OAAK,mBAAmB,GAAG,UAAU,CAAC;AACzD,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,UAAI,CAAC,IAAI,mBAAmB,GAAG,UAAU;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,uBAAwD;AACtE,QAAM,UAAU,kBAAkB;AAClC,MAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAElC,QAAM,MAAuC,CAAC;AAE9C,aAAW,UAAU,SAAS;AAC5B,UAAM,aAAa,OAAO;AAC1B,UAAM,aAAa,OAAO;AAE1B,UAAM,UAAkD,CAAC;AAEzD,eAAW,cAAc,OAAO,kBAAkB,CAAC,GAAG;AACpD,UAAI;AACF,cAAM,MAAM,aAAa,YAAY,MAAM;AAC3C,cAAM,SAAS,iBAAiB,GAAG;AACnC,YAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM;AAC/D;AACF,cAAM,aACH,OAAe,cAChB,OAAQ,OAAe,eAAe,YACtC,CAAC,MAAM,QAAS,OAAe,UAAU,IACpC,OAAe,aAChB;AAEN,YACE,CAAC,cACD,OAAO,eAAe,YACtB,MAAM,QAAQ,UAAU;AAExB;AAEF,cAAM,UAA2C,CAAC;AAClD,mBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAiB,GAAG;AAC3D,cAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG;AAC3D,kBAAQ,IAAI,IAAI,mBAAmB,KAAK,UAAU;AAAA,QACpD;AACA,gBAAQ,KAAK,OAAO;AAAA,MACtB,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAe,OAAO,UAAkB;AAC9C,QACE,eACA,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,GAC1B;AACA,YAAM,aACH,YAAoB,cACrB,OAAQ,YAAoB,eAAe,YAC3C,CAAC,MAAM,QAAS,YAAoB,UAAU,IACzC,YAAoB,aACrB;AAEN,UACE,cACA,OAAO,eAAe,YACtB,CAAC,MAAM,QAAQ,UAAU,GACzB;AACA,cAAM,UAA2C,CAAC;AAClD,mBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAiB,GAAG;AAC3D,cAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG;AAC3D,kBAAQ,IAAI,IAAI,mBAAmB,KAAK,UAAU;AAAA,QACpD;AACA,gBAAQ,KAAK,OAAO;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,SAA0C,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO;AAE5E,eAAW,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AACtD,YAAM,WAAW,UAAU,UAAU,IAAI,UAAU;AACnD,UAAI,QAAQ,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aACd,YACwB;AACxB,QAAM,YAAoC,CAAC;AAE3C,MAAI,YAAY;AACd,eAAW,UAAU,YAAY;AAC/B,YAAM,CAAC,KAAK,GAAG,UAAU,IAAI,OAAO,MAAM,GAAG;AAC7C,UAAI,CAAC,OAAO,WAAW,WAAW,GAAG;AACnC,cAAM,IAAI;AAAA,UACR,wCAAwC,MAAM;AAAA,QAChD;AAAA,MACF;AACA,gBAAU,GAAG,IAAI,WAAW,KAAK,GAAG;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,WAAW,UAAU,SAAS,SAAS;AAE7D,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,kBAAkB,OAA6B;AAC7D,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,gBACJ,QAAQ,IAAI,cAAc,aAAa,kBAAkB;AAE3D,MAAI,CAAC,cAAc,SAAS,KAAoB,GAAG;AACjD,UAAM,IAAI;AAAA,MACR,kBAAkB,KAAK,qBAAqB,cAAc,KAAK,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aACd,MACA,QACA,QAAqB,WACf;AACN,MAAI,UAAU,SAAS;AACrB,QAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,+BAAyB,MAAM,MAAM;AAAA,IACvC,OAAO;AACL,YAAM,YAAY,KAAK,OAAO,GAAG,QAAQ;AACzC,UAAI,cAA+C,CAAC;AAEpD,UAAI,WAAW,SAAS,GAAG;AACzB,YAAI;AACF,gBAAM,eAAe,aAAa,WAAW,OAAO;AACpD,gBAAM,iBAAiB,cAAc,YAAY;AACjD,cAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACxD,0BAAc;AAAA,UAChB;AAAA,QACF,QAAQ;AAAA,QACR;AAAA,MACF;AAEA,kBAAY,IAAI,IAAI;AAEpB,UAAI;AACF,sBAAc,WAAW,KAAK,UAAU,aAAa,MAAM,CAAC,GAAG,OAAO;AAAA,MACxE,SAAS,OAAO;AACd,cAAM,IAAI,MAAM,8BAA8B,KAAK,EAAE;AAAA,MACvD;AAAA,IACF;AAAA,EACF,WAAW,UAAU,WAAW;AAC9B,UAAM,cAAc,KAAK,OAAO,GAAG,WAAW;AAC9C,QAAI,SAAkC,EAAE,YAAY,CAAC,EAAE;AAEvD,QAAI,WAAW,WAAW,GAAG;AAC3B,UAAI;AACF,cAAM,UAAU,aAAa,aAAa,OAAO;AACjD,cAAM,SAAS,cAAc,OAAO;AACpC,YAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,mBAAS;AAAA,QACX;AAAA,MACF,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,UAAM,aAAc,OAAoC;AACxD,UAAM,UACJ,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,UAAU,IACpE,aACA,CAAC;AAER,YAAQ,IAAI,IAAI;AAChB,WAAO,aAAa;AAEpB,QAAI;AACF,oBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,IACrE,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,IAC1D;AAAA,EACF,WAAW,UAAU,UAAU;AAC7B,UAAM,SAAS,gBAAgB;AAC/B,QAAI,CAAC,OAAO,YAAY;AACtB,aAAO,aAAa,CAAC;AAAA,IACvB;AACA,WAAO,WAAW,IAAI,IAAI;AAC1B,qBAAiB,MAAM;AAAA,EACzB,OAAO;AACL,UAAM,SAAS,wBAAwB;AACvC,QAAI,CAAC,OAAO,YAAY;AACtB,aAAO,aAAa,CAAC;AAAA,IACvB;AACA,WAAO,WAAW,IAAI,IAAI;AAC1B,6BAAyB,MAAM;AAAA,EACjC;AACF;AAEO,SAAS,gBACd,MACA,QAAqB,WACf;AACN,MAAI,UAAU,SAAS;AACrB,QAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,kCAA4B,IAAI;AAAA,IAClC,OAAO;AACL,YAAM,YAAY,KAAK,OAAO,GAAG,QAAQ;AACzC,UAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAEA,UAAI;AACF,cAAM,eAAe,aAAa,WAAW,OAAO;AACpD,cAAM,cAAc,cAAc,YAAY;AAK9C,YACE,CAAC,eACD,OAAO,gBAAgB,YACvB,CAAC,YAAY,IAAI,GACjB;AACA,gBAAM,IAAI,MAAM,kCAAkC,IAAI,YAAY;AAAA,QACpE;AAEA,eAAO,YAAY,IAAI;AACvB,sBAAc,WAAW,KAAK,UAAU,aAAa,MAAM,CAAC,GAAG,OAAO;AAAA,MACxE,SAAS,OAAO;AACd,YAAI,iBAAiB,OAAO;AAC1B,gBAAM;AAAA,QACR;AACA,cAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,WAAW,UAAU,WAAW;AAC9B,UAAM,cAAc,KAAK,OAAO,GAAG,WAAW;AAC9C,QAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,QAAI;AACF,YAAM,UAAU,aAAa,aAAa,OAAO;AACjD,YAAM,SAAS,cAAc,OAAO;AACpC,UAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AAEA,YAAM,aAAc,OAAoC;AACxD,UACE,CAAC,cACD,OAAO,eAAe,YACtB,MAAM,QAAQ,UAAU,GACxB;AACA,cAAM,IAAI,MAAM,+CAA+C;AAAA,MACjE;AAEA,YAAM,UAAU;AAChB,UAAI,CAAC,QAAQ,IAAI,GAAG;AAClB,cAAM,IAAI,MAAM,kCAAkC,IAAI,eAAe;AAAA,MACvE;AAEA,aAAO,QAAQ,IAAI;AAClB,MAAC,OAAe,aAAa;AAC9B,oBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,IACrE,SAAS,OAAO;AACd,UAAI,iBAAiB,MAAO,OAAM;AAClC,YAAM,IAAI,MAAM,oCAAoC,KAAK,EAAE;AAAA,IAC7D;AAAA,EACF,WAAW,UAAU,UAAU;AAC7B,UAAM,SAAS,gBAAgB;AAC/B,QAAI,CAAC,OAAO,aAAa,IAAI,GAAG;AAC9B,YAAM,IAAI,MAAM,yCAAyC,IAAI,EAAE;AAAA,IACjE;AACA,WAAO,OAAO,WAAW,IAAI;AAC7B,qBAAiB,MAAM;AAAA,EACzB,OAAO;AACL,UAAM,SAAS,wBAAwB;AACvC,QAAI,CAAC,OAAO,aAAa,IAAI,GAAG;AAC9B,YAAM,IAAI,MAAM,wCAAwC,IAAI,EAAE;AAAA,IAChE;AACA,WAAO,OAAO,WAAW,IAAI;AAC7B,6BAAyB,MAAM;AAAA,EACjC;AACF;AAEO,SAAS,iBAAkD;AAChE,QAAM,gBAAgB,qBAAqB;AAC3C,QAAM,eAAe,gBAAgB;AACrC,QAAM,oBAAoB,+BAA+B,EAAE;AAC3D,QAAM,gBAAgB,wBAAwB;AAC9C,SAAO;AAAA,IACL,GAAI,iBAAiB,CAAC;AAAA,IACtB,GAAI,aAAa,cAAc,CAAC;AAAA,IAChC,GAAI,qBAAqB,CAAC;AAAA,IAC1B,GAAI,cAAc,cAAc,CAAC;AAAA,EACnC;AACF;AAMO,SAAS,aAAa,MAAkD;AAC7E,QAAM,gBAAgB,wBAAwB;AAC9C,QAAM,yBAAyB,+BAA+B;AAC9D,QAAM,oBAAoB,uBAAuB;AACjD,QAAM,eAAe,gBAAgB;AAErC,MAAI,cAAc,aAAa,IAAI,GAAG;AACpC,WAAO,EAAE,GAAG,cAAc,WAAW,IAAI,GAAG,OAAO,UAAU;AAAA,EAC/D;AAEA,MAAI,oBAAoB,IAAI,GAAG;AAC7B,UAAM,SAAS,uBAAuB,QAAQ,IAAI;AAClD,UAAM,QAAqB,WAAW,cAAc,YAAY;AAChE,WAAO,EAAE,GAAG,kBAAkB,IAAI,GAAG,MAAM;AAAA,EAC7C;AAEA,MAAI,aAAa,aAAa,IAAI,GAAG;AACnC,WAAO,EAAE,GAAG,aAAa,WAAW,IAAI,GAAG,OAAO,SAAS;AAAA,EAC7D;AAEA,SAAO;AACT;AAEO,SAAS,qBACd,YACqC;AACrC,QAAM,SAAS,wBAAwB;AACvC,MAAI,OAAO,sBAAsB,SAAS,UAAU,GAAG;AACrD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,sBAAsB,SAAS,UAAU,GAAG;AACrD,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AF3WA,SAAS,kCAA0C;AACjD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,OAAO,SAAS,KAAK,EAAE,IAAI;AAChD,MAAI,OAAO,SAAS,MAAM,KAAK,SAAS,KAAK,UAAU,GAAI,QAAO;AAClE,SAAO;AACT;AAEA,eAAe,gBACb,MACA,WACiB;AAGjB,QAAM,wBAAwB,YAAY;AACxC,QAAI,OAAQ,WAAmB,cAAc,WAAY;AACzD,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,UAAI,OAAQ,OAAe,cAAc,YAAY;AACnD;AAAC,QAAC,WAAmB,YAAa,OAAe;AAAA,MACnD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,QAAM,aAA0B,OAAO,YAAY;AACjD,YAAQ,UAAU,MAAM;AAAA,MACtB,KAAK,OAAO;AACV,cAAM,MAAM;AACZ,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,mBAAmB,IAAI,IAAI,IAAI,GAAG,GAAG;AAAA,cAClD,GAAI,IAAI,UAAU,EAAE,aAAa,EAAE,SAAS,IAAI,QAAQ,EAAE,IAAI,CAAC;AAAA,YACjE,CAAC;AAAA,UACH;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,8BAA8B,IAAI,IAAI,IAAI,GAAG,GAAG;AAAA,cAC7D,GAAI,IAAI,UAAU,EAAE,aAAa,EAAE,SAAS,IAAI,QAAQ,EAAE,IAAI,CAAC;AAAA,YACjE,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,MAAM;AACZ,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,mBAAmB,IAAI,IAAI,IAAI,GAAG,GAAG;AAAA,cAClD,GAAI,IAAI,UAAU,EAAE,aAAa,EAAE,SAAS,IAAI,QAAQ,EAAE,IAAI,CAAC;AAAA,YACjE,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,MAAM;AACZ,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,8BAA8B,IAAI,IAAI,IAAI,GAAG,GAAG;AAAA,cAC7D,GAAI,IAAI,UAAU,EAAE,aAAa,EAAE,SAAS,IAAI,QAAQ,EAAE,IAAI,CAAC;AAAA,YACjE,CAAC;AAAA,UACH;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,mBAAmB,IAAI,IAAI,IAAI,GAAG,GAAG;AAAA,cAClD,GAAI,IAAI,UAAU,EAAE,aAAa,EAAE,SAAS,IAAI,QAAQ,EAAE,IAAI,CAAC;AAAA,YACjE,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,MAAM;AACT,cAAM,MAAM;AACZ,cAAM,sBAAsB;AAC5B,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,yBAAyB,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,MAAM;AAEZ,YAAI,MAAM,IAAI;AACd,YAAI,IAAI,WAAW;AACjB,cAAI;AACF,kBAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,gBAAI,CAAC,OAAO,aAAa,IAAI,WAAW,GAAG;AACzC,qBAAO,aAAa,IAAI,aAAa,IAAI,SAAS;AAClD,oBAAM,OAAO,SAAS;AAAA,YACxB;AAAA,UACF,QAAQ;AAAA,UAAC;AAAA,QACX;AAEA,cAAM,sBAAsB;AAC5B,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,yBAAyB,IAAI,IAAI,GAAG,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,SAAS;AACP,cAAM,MAAM;AACZ,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,WAAW,IAAI,qBAAqB;AAAA,cAClC,SAAS,IAAI;AAAA,cACb,MAAM,IAAI;AAAA,cACV,KAAK;AAAA,gBACH,GAAG,QAAQ;AAAA,gBACX,GAAG,IAAI;AAAA,cACT;AAAA,cACA,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AAEH,QAAM,aAAa,QAAQ,IAAI;AAC/B,QAAM,gBAAgB,aAAa,OAAO,SAAS,YAAY,EAAE,IAAI;AACrE,QAAM,wBAAwB,OAAO,SAAS,aAAa,IACvD,gBACA;AAEJ,MAAI;AAEJ,aAAW,aAAa,YAAY;AAClC,UAAM,SAAS,IAAI;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,cAAc,CAAC;AAAA,MACjB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,iBAAiB,OAAO,QAAQ,UAAU,SAAgB;AAChE,UAAI,wBAAwB,GAAG;AAC7B,cAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,gBAAM,YAAY,WAAW,MAAM;AACjC;AAAA,cACE,IAAI;AAAA,gBACF,6BAA6B,IAAI,qBAAqB,qBAAqB;AAAA,cAC7E;AAAA,YACF;AAAA,UACF,GAAG,qBAAqB;AAExB,yBAAe;AAAA,YACb,MAAM,aAAa,SAAS;AAAA,YAC5B,MAAM,aAAa,SAAS;AAAA,UAC9B;AAAA,QACF,CAAC;AAED,cAAM,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC;AAAA,MACrD,OAAO;AACL,cAAM;AAAA,MACR;AAEA,UAAI,UAAU,SAAS,SAAS;AAC9B;AAAC,QAAC,UAAU,UAAmC,QAAQ;AAAA,UACrD;AAAA,UACA,CAAC,SAAiB;AAChB,kBAAM,YAAY,KAAK,SAAS,EAAE,KAAK;AACvC,gBAAI,WAAW;AACb,0BAAY,MAAM,kBAAkB,SAAS,EAAE;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,SAAS,KAAK,cAAc,WAAW,CAAC,GAAG;AACxD;AAAA,UACE;AAAA,UACA,uCAAuC,UAAU,IAAI;AAAA,QACvD;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI;AACF,cAAM,OAAO,MAAM;AAAA,MACrB,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAEA,QAAM,qBAAqB,QACvB,YACA,IAAI,MAAM,oCAAoC,IAAI,GAAG;AAC3D;AAcO,IAAM,aAAa,QAAQ,YAAsC;AACtE,MAAI,QAAQ,IAAI,MAAM,QAAQ,IAAI,aAAa,QAAQ;AACrD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAgB,qBAAqB;AAC3C,QAAM,gBAAgB,gBAAgB,EAAE,cAAc,CAAC;AACvD,QAAM,qBAAqB,+BAA+B,EAAE;AAC5D,QAAM,iBAAiB,wBAAwB,EAAE,cAAc,CAAC;AAEhE,QAAM,6BAA6B;AAAA,IACjC;AAAA,IACA,CAAC,GAAG,SAAS,qBAAqB,IAAI,MAAM;AAAA,EAC9C;AAEA,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAM,YAAY,gCAAgC;AAClD,QAAM,UAAU,OAAO,QAAQ,UAAU;AACzC,QAAM,UAA2B,CAAC;AAElC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,WAAW;AAClD,UAAM,QAAQ,QAAQ,MAAM,GAAG,IAAI,SAAS;AAC5C,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,OAAO,CAAC,MAAM,SAAS,MAAM;AACrC,YAAI;AACF,gBAAM,SAAS,MAAM,gBAAgB,MAAM,SAA4B;AACvE,cAAI,eAA+C;AACnD,cAAI;AACF,2BAAe,OAAO,sBAAsB;AAAA,UAC9C,QAAQ;AACN,2BAAe;AAAA,UACjB;AACA,iBAAO,EAAE,MAAM,QAAQ,cAAc,MAAM,YAAqB;AAAA,QAClE,SAAS,OAAO;AACd;AAAA,YACE;AAAA,YACA,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC9E;AACA,iBAAO,EAAE,MAAM,MAAM,SAAkB;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AACA,YAAQ,KAAK,GAAG,YAAY;AAAA,EAC9B;AAEA,SAAO;AACT,CAAC;AAED,SAAS,oCAAoC,SAGT;AAClC,QAAM,MAAuC,CAAC;AAE9C,aAAW,YAAY,QAAQ,SAAS;AACtC,UAAM,QAAQ,OAAO,YAAY,EAAE,EAAE,KAAK;AAC1C,QAAI,CAAC,MAAO;AAEZ,UAAM,eAAe,QAAQ,QAAQ,YAAY,KAAK;AACtD,UAAM,UAAUC,YAAW,YAAY,IACnCC,cAAa,cAAc,MAAM,IACjCD,YAAW,KAAK,IACdC,cAAa,OAAO,MAAM,IAC1B;AAEN,UAAM,SAAS,iBAAiB,OAAO;AACvC,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG;AAEpE,UAAM,aACH,OAAe,cAChB,OAAQ,OAAe,eAAe,YACtC,CAAC,MAAM,QAAS,OAAe,UAAU,IACpC,OAAe,aAChB;AAEN,QAAI,CAAC,cAAc,OAAO,eAAe,YAAY,MAAM,QAAQ,UAAU;AAC3E;AAEF,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAiB,GAAG;AAC3D,UAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG;AAC3D,UAAI,IAAI,IAAI;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,0BAA0B,SAInB;AAC3B,QAAM,aAAa,QAAQ,cAAc,OAAO;AAChD,QAAM,UACJ,MAAM,QAAQ,QAAQ,SAAS,KAAK,QAAQ,UAAU,SAAS,IAC3D,QAAQ,YACR,CAAC;AACP,QAAM,SAAS,QAAQ,oBAAoB;AAE3C,MAAI,QAAQ,WAAW,KAAK,CAAC,QAAQ;AACnC,WAAO,WAAW;AAAA,EACpB;AAEA,QAAM,aAAa,oCAAoC;AAAA,IACrD;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,SAAS,CAAC,IAAI,qBAAqB;AACzD,QAAM,gBAAgB,SAAS,CAAC,IAAK,gBAAgB,EAAE,cAAc,CAAC;AACtE,QAAM,qBAAqB,SAAS,CAAC,IAAI,+BAA+B,EAAE;AAC1E,QAAM,iBAAiB,SAAS,CAAC,IAAK,wBAAwB,EAAE,cAAc,CAAC;AAE/E,QAAM,6BAA6B,SAC/B,CAAC,IACD,OAAO,oBAAoB,CAAC,GAAG,SAAS,qBAAqB,IAAI,MAAM,UAAU;AAErF,QAAM,aAAa;AAAA,IACjB,GAAI,iBAAiB,CAAC;AAAA,IACtB,GAAI,iBAAiB,CAAC;AAAA,IACtB,GAAI,8BAA8B,CAAC;AAAA,IACnC,GAAI,kBAAkB,CAAC;AAAA,IACvB,GAAI,cAAc,CAAC;AAAA,EACrB;AAEA,QAAM,YAAY,gCAAgC;AAClD,QAAM,mBAAmB,OAAO,QAAQ,UAAU;AAClD,QAAM,UAA2B,CAAC;AAElC,WAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK,WAAW;AAC3D,UAAM,QAAQ,iBAAiB,MAAM,GAAG,IAAI,SAAS;AACrD,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,OAAO,CAAC,MAAM,SAAS,MAAM;AACrC,YAAI;AACF,gBAAM,SAAS,MAAM,gBAAgB,MAAM,SAA4B;AACvE,cAAI,eAA+C;AACnD,cAAI;AACF,2BAAe,OAAO,sBAAsB;AAAA,UAC9C,QAAQ;AACN,2BAAe;AAAA,UACjB;AACA,iBAAO,EAAE,MAAM,QAAQ,cAAc,MAAM,YAAqB;AAAA,QAClE,SAAS,OAAO;AACd;AAAA,YACE;AAAA,YACA,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC9E;AACA,iBAAO,EAAE,MAAM,MAAM,SAAkB;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AACA,YAAQ,KAAK,GAAG,YAAY;AAAA,EAC9B;AAEA,SAAO;AACT;;;AGvYA,SAAS,WAAW,WAAAC,gBAAe;;;ACAnC,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,YAAYC,YAAW;AACvB,SAAS,SAAS;;;ACFlB,YAAY,WAAW;AAEvB,SAAS,YAAY;AAGd,SAAS,iCAAkD;AAChE,SACE,oCAAC,YAAK,uBAEJ,oCAAC,QAAK,OAAO,SAAS,EAAE,SAAO,aACnB,cAAa,0BACzB,CACF;AAEJ;;;ACdO,IAAM,SAAS;AACf,IAAM,cAAc;;;ACD3B,SAAS,KAAK,QAAAC,aAAY;AAC1B,YAAYC,YAAW;;;ACAvB,SAAS,eAAe;AA2ExB,SAAS,oBAAoB,MAA6B;AACxD,QAAM,QAAQ,KAAK,MAAM,sBAAsB;AAC/C,MAAI,CAAC,MAAO,QAAO,EAAE,UAAU,KAAK;AAEpC,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,cAAc,MAAM,CAAC;AAC3B,MAAI,CAAC,YAAY,CAAC,YAAa,QAAO,EAAE,UAAU,KAAK;AACvD,SAAO,EAAE,UAAU,YAAY;AACjC;AAEA,SAAS,cAAc,OAA0B;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,SAAU;AAC9B,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,QAAI,KAAK,IAAI,OAAO,EAAG;AACvB,SAAK,IAAI,OAAO;AAChB,QAAI,KAAK,OAAO;AAAA,EAClB;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAA6B;AAC1D,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,OAAO;AACxB,eAAW,QAAQ,MAAM;AACvB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AACd,UAAI,KAAK,IAAI,OAAO,EAAG;AACvB,WAAK,IAAI,OAAO;AAChB,UAAI,KAAK,OAAO;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBACP,MACA,MAC6B;AAC7B,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAC3B,QAAM,SAA0B,EAAE,GAAI,QAAQ,CAAC,EAAG;AAElD,QAAM,YAAY,CAAC,MAA6B;AAC9C,QAAI,QAAQ,KAAK,QAAQ,KAAK,CAAC,MAAM,OAAW,QAAO,CAAC,IAAI,KAAK,CAAC;AAAA,EACpE;AACA,YAAU,SAAS;AACnB,YAAU,0BAA0B;AACpC,YAAU,0BAA0B;AACpC,YAAU,kBAAkB;AAC5B,YAAU,2BAA2B;AACrC,YAAU,kBAAkB;AAE5B,MAAI,MAAM,SAAS;AACjB,WAAO,UAAU,EAAE,GAAI,OAAO,WAAW,CAAC,GAAI,GAAG,KAAK,QAAQ;AAAA,EAChE;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,UAAU,EAAE,GAAI,OAAO,WAAW,CAAC,GAAI,GAAG,KAAK,QAAQ;AAAA,EAChE;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,SAGd;AACnB,QAAM,aAAa,SAAS,cAAc,QAAQ,IAAI;AACtD,QAAM,UAAU,SAAS;AAEzB,QAAM,OAAO,+BAA+B;AAAA,IAC1C,aAAa;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC,EAAE;AACH,QAAM,UAAU,+BAA+B;AAAA,IAC7C,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC,EAAE;AACH,QAAM,QAAQ,+BAA+B;AAAA,IAC3C,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC,EAAE;AAEH,QAAM,QAAQ;AAAA,IACZ,cAAc,MAAM,aAAa,KAAK;AAAA,IACtC,cAAc,SAAS,aAAa,KAAK;AAAA,IACzC,cAAc,OAAO,aAAa,KAAK;AAAA,EACzC;AACA,QAAM,OAAO;AAAA,IACX,cAAc,MAAM,aAAa,IAAI;AAAA,IACrC,cAAc,SAAS,aAAa,IAAI;AAAA,IACxC,cAAc,OAAO,aAAa,IAAI;AAAA,EACxC;AAEA,QAAM,UAAU;AAAA,IACd,qBAAqB,MAAM,SAAS,SAAS,OAAO;AAAA,IACpD,OAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,aAAa,EAAE,OAAO,KAAK;AAAA,IAC3B,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,0CACd,UACA,SAKsB;AACtB,QAAM,aAAa,SAAS,cAAc,QAAQ,IAAI;AACtD,QAAM,UAAU,SAAS,WAAW,QAAQ;AAE5C,QAAM,cAAc,SAAS,eAAe,CAAC;AAC7C,QAAM,aAAa,cAAc,YAAY,KAAK;AAClD,QAAM,YAAY,cAAc,YAAY,IAAI;AAEhD,QAAM,yBAAyB;AAAA,IAC7B,SAAS,SAAS,SAAS;AAAA,EAC7B;AACA,QAAM,iBAA2B,CAAC,GAAG,sBAAsB;AAC3D,QAAM,gBAA0B,CAAC;AAEjC,aAAW,QAAQ,YAAY;AAC7B,UAAM,SAAS,oBAAoB,IAAI;AACvC,QACE,QAAQ,aAAa,cACrB,OAAO,aAAa,WAAW,SAAS,GACxC;AACA,qBAAe,KAAK,OAAO,YAAY,UAAU,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,aAAW,QAAQ,WAAW;AAC5B,UAAM,SAAS,oBAAoB,IAAI;AACvC,QACE,QAAQ,aAAa,cACrB,OAAO,aAAa,WAAW,SAAS,GACxC;AACA,oBAAc,KAAK,OAAO,YAAY,UAAU,CAAC,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,aAAuB,CAAC,GAAG;AACjC,QAAM,YAAsB,CAAC;AAC7B,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,0BAA0B;AAAA,IAC/C,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACD,QAAM,wBAAwB,0BAA0B;AAAA,IACtD,aAAa;AAAA,EACf,CAAC;AACD,QAAM,oBAAoB,0BAA0B;AAAA,IAClD,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,kBAAkB,0BAA0B;AAAA,IAChD,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF,CAAC;AAED,aAAW,QAAQ;AAAA,IACjB,gBAAgB;AAAA,IAChB,GAAI,gBAAgB,UAAU,CAAC;AAAA,IAC/B,uBAAuB;AAAA,IACvB,GAAI,uBAAuB,UAAU,CAAC;AAAA,IACtC,mBAAmB;AAAA,IACnB,GAAI,mBAAmB,UAAU,CAAC;AAAA,IAClC,iBAAiB;AAAA,IACjB,GAAI,iBAAiB,UAAU,CAAC;AAAA,EAClC,GAAG;AACD,QAAI,CAAC,KAAM;AACX,QAAI,UAAU,SAAS,IAAI,EAAG;AAC9B,cAAU,KAAK,IAAI;AAAA,EACrB;AAEA,aAAW,QAAQ,YAAY;AAC7B,UAAM,SAAS,oBAAoB,IAAI;AACvC,SACG,QAAQ,aAAa,WAAW,QAAQ,aAAa,WACtD,OAAO,aACP;AACA,iBAAW,KAAK,OAAO,WAAW;AAAA,IACpC;AAAA,EACF;AAEA,aAAW,QAAQ,WAAW;AAC5B,UAAM,SAAS,oBAAoB,IAAI;AACvC,SACG,QAAQ,aAAa,WAAW,QAAQ,aAAa,WACtD,OAAO,aACP;AACA,gBAAU,KAAK,OAAO,WAAW;AAAA,IACnC;AACA,QAAI,QAAQ,aAAa,UAAU,OAAO,aAAa;AACrD,eAAS,KAAK,OAAO,WAAW;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS,SAAS;AAEzC,QAAM,iBAAuC,SAAS,kBAAkB;AAAA,IACtE,SAAS;AAAA,IACT,MAAM,CAAC;AAAA,EACT;AACA,QAAM,UACJ,OAAO,SAAS,SAAS,SAAS,YAAY,WAC1C;AAAA,IACE,SAAS,SAAS,QAAS,QAAS;AAAA,IACpC,MAAM,MAAM,QAAQ,SAAS,SAAS,SAAS,IAAI,IAC9C,SAAS,QAAS,QAAS,KAAmB;AAAA,MAC7C,CAAC,MAAmB,OAAO,MAAM;AAAA,IACnC,IACA,CAAC;AAAA,EACP,IACA;AAEN,SAAO;AAAA,IACL,SAAS;AAAA,MACP,gBAAgB,mBAAmB,cAAc;AAAA,MACjD,eAAe,mBAAmB,aAAa;AAAA,MAC/C,kBAAkB,MAAM,QAAQ,gBAAgB,gBAAgB,IAC3D,eAAgB,iBAA+B;AAAA,QAC9C,CAAC,MAAmB,OAAO,MAAM;AAAA,MACnC,IACA,CAAC;AAAA,MACL,qBACE,OAAO,gBAAgB,wBAAwB,YAC3C,eAAe,sBACf;AAAA,MACN,mBACE,OAAO,gBAAgB,sBAAsB,YACzC,eAAe,oBACf;AAAA,MACN,eACE,OAAO,gBAAgB,kBAAkB,WACrC,eAAe,gBACf;AAAA,MACN,gBACE,OAAO,gBAAgB,mBAAmB,WACtC,eAAe,iBACf;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,UAAU,mBAAmB,QAAQ;AAAA,MACrC,YAAY,mBAAmB,UAAU;AAAA,MACzC,WAAW,mBAAmB,SAAS;AAAA,IACzC;AAAA,IACA,kBACE,OAAO,SAAS,SAAS,qBAAqB,YAC1C,SAAS,QAAQ,mBACjB;AAAA,IACN,2BACE,OAAO,SAAS,SAAS,8BAA8B,YACnD,SAAS,QAAQ,4BACjB;AAAA,IACN,kBAAkB,cAAc,SAAS,SAAS,gBAAgB;AAAA,IAClE;AAAA,EACF;AACF;;;AC1VO,IAAM,qBAAqB;AAC3B,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAElC,IAAM,cAAc;AACpB,IAAM,oBAAoB;AAE1B,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AAEvB,SAAS,8BAAuC;AAC9C,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;AAC/E;AAEA,SAAS,oBAAoB,OAAwB;AACnD,SAAO,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,KAAK,UAAU;AACnE;AAEA,SAAS,iBAAiD;AACxD,QAAM,KAAK,yCAAkC,WAAW;AACxD,QAAM,SAAS,GAAG,EAAE;AAAA;AAAA,qBAA0B,iBAAiB;AAC/D,SAAO,EAAE,QAAQ,GAAG;AACtB;AAEA,SAAS,uBAA+B;AACtC,QAAM,WAAW,mBAAmB;AACpC,MAAI,SAAS,SAAS,YAAY,KAAM,QAAO;AAE/C,QAAM,gBAAgB,0CAA0C,QAAQ;AAExE,QAAM,eAAe,EAAE,UAAU,cAAc,WAAW,SAAS;AACnE,QAAM,gBAAgB;AAAA,IACpB,WAAW,cAAc,WAAW;AAAA,IACpC,iBAAiB,cAAc,WAAW;AAAA,EAC5C;AAEA,QAAM,aAAa,EAAE,MAAM,cAAc,OAAO,cAAc;AAE9D,QAAM,mBACJ,cAAc,QAAQ,wBAAwB,OAC1C,OACA,cAAc,QAAQ,iBAAiB,SAAS,IAC9C,cAAc,QAAQ,mBACtB;AAER,QAAM,UAAU;AAAA,IACd,GAAI,cAAc,QAAQ,eAAe,SACrC,EAAE,cAAc,cAAc,QAAQ,eAAe,IACrD,CAAC;AAAA,IACL,GAAI,cAAc,QAAQ,cAAc,SACpC,EAAE,aAAa,cAAc,QAAQ,cAAc,IACnD,CAAC;AAAA,IACL,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,EACjD;AAEA,QAAM,oBAAoB,cAAc;AACxC,QAAM,2BACJ,SAAS,SAAS,6BAA6B;AAEjD,QAAM,WAAqB,CAAC;AAC5B,WAAS,KAAK,qBAAqB,oBAAoB,UAAU,CAAC,EAAE;AACpE,MAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,aAAS,KAAK,kBAAkB,oBAAoB,OAAO,CAAC,EAAE;AAAA,EAChE;AACA,MAAI,mBAAmB;AACrB,aAAS;AAAA,MACP,6BAA6B,oBAAoB,iBAAiB,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,kBAAkB,4BAA4B,IAChD,sJACA;AAEJ,QAAM,iBAAiB,2BACnB;AAAA;AAAA;AAAA,EAGJ,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wHAmBX;AAAA;AAAA;AAIJ,SAAO;AAAA,EACP,SAAS,KAAK,IAAI,CAAC;AAAA,EACnB,cAAc;AAAA;AAAA;AAAA;AAAA;AAKhB;AAEA,SAAS,mBAA2B;AAClC,QAAM,EAAE,QAAQ,GAAG,IAAI,eAAe;AACtC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sRAa6Q,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAW7P,SAAS;AAAA,KAAqB,MAAM,KAAK,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAUjE,eAAe,OAAO,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAO7B,SAAS;AAAA;AAAA,KAAU,MAAM,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gRAUuN,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wEAgBtN,KAAK;AAAA;AAAA,EAAO,EAAE,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAM1E,eAAe,OAAO,cAAc;AAAA;AAAA;AAAA;AAAA;AAKvD;AAEO,SAAS,oBAA4B;AAC1C,QAAM,gBAAgB,qBAAqB;AAC3C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAsBwD,cAAc,QAAQ,iBAAiB,GAAK,4DAA4D,kBAAkB,OAAO,qBAAqB,GAAK;AAAA;AAAA,4BAEhM,iBAAiB;AAAA,8LACiJ,cAAc;AAAA,IACxM,aAAa;AAAA;AAAA,yBAEQ,cAAc;AAAA,4BACX,cAAc;AAAA,wBAClB,cAAc;AAAA,wBACd,cAAc;AAAA,yBACb,eAAe;AAAA;AAAA;AAAA,+EAGuC,cAAc,gIAAgI,cAAc;AAAA,qFACtJ,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWjG,iBAAiB,CAAC;AACpB;;;AF3PA,OAAO,WAAW;AAElB,SAAS,uBAAuB,SAAiB,YAA4B;AAC3E,QAAM,WAAW,QAAQ,MAAM,IAAI;AACnC,MAAI,SAAS,UAAU,oBAAoB;AACzC,WAAO,SAAS,KAAK,IAAI;AAAA,EAC3B;AAEA,QAAM,YAAY,SAAS,MAAM,CAAC,kBAAkB;AACpD,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,gBAAgB,kBAAkB,aAAa,UAAU;AAAA,IAC3D;AAAA,IACA,GAAG;AAAA,EACL,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,qCAAC,OAAI,gBAAe,iBAAgB,OAAM,UACxC,qCAAC,OAAI,eAAc,SACjB,qCAACC,OAAA,MAAK,qBAAoB,GAC1B,qCAAC,OAAI,eAAc,YACjB,qCAACA,OAAA,EAAK,OAAO,UAAU,SAAS,EAAE,QAAQ,UACvC,UACG,QAAQ,KAAK,IACb,uBAAuB,QAAQ,KAAK,GAAG,KAAK,CAClD,CACF,CACF,CACF;AAEJ;;;AHtCA,IAAM,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAEtC,IAAM,UAAU;AAAA,EACrB,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,OAAO,OAAO;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,oBAAoB;AAAA,IACtB;AAAA,EACF;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,qBAAqB,OAAO;AAC1B,WAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,EACxD,KAAK,IAAI;AAAA,EACd;AAAA,EACA,gBAAgB,MAAM;AAAA,EACtB,+BAA+B;AAC7B,WAAO,qCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAQ;AAC9B,UAAM,UAAU;AAChB,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aACE,qCAACC,MAAA,EAAI,eAAc,YAChB,OAAO,IAAI,CAAC,MAAM,MAAM;AACvB,YAAI,KAAK,SAAS,SAAS;AACzB,iBACE;AAAA,YAACA;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,gBAAe;AAAA,cACf,WAAU;AAAA,cACV,OAAM;AAAA;AAAA,YAEN,qCAACA,MAAA,EAAI,eAAc,SACjB,qCAACC,OAAA,MAAK,qBAAoB,GAC1B,qCAACA,OAAA,MAAK,SAAO,CACf;AAAA,UACF;AAAA,QAEJ;AACA,cAAMC,SAAQ,KAAK,KAAK,MAAM,IAAI,EAAE;AACpC,eACE;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,SAAS,KAAK;AAAA,YACd,OAAOA;AAAA,YACP;AAAA;AAAA,QACF;AAAA,MAEJ,CAAC,CACH;AAAA,IAEJ;AAEA,QAAI,CAAC,QAAQ;AACX,aACE,qCAACF,MAAA,EAAI,gBAAe,iBAAgB,WAAU,UAAS,OAAM,UAC3D,qCAACA,MAAA,EAAI,eAAc,SACjB,qCAACC,OAAA,MAAK,qBAAoB,GAC1B,qCAACA,OAAA,EAAK,OAAO,SAAS,EAAE,iBAAe,cAAY,CACrD,CACF;AAAA,IAEJ;AAEA,UAAM,QAAQ,OAAO,MAAM,IAAI,EAAE;AACjC,WAAO,qCAAC,cAAW,SAAS,QAAQ,OAAc,SAAkB;AAAA,EACtE;AAAA,EACA,yBAAyB,SAAS;AAChC,WAAO;AAAA,EACT;AACF;;;AD1FA;AAAA,EACE;AAAA,EAGA;AAAA,EAEA;AAAA,OAGK;AAKP,SAAS,0BAA0B,OAAuB;AACxD,SAAO,MAAM,QAAQ,mBAAmB,GAAG;AAC7C;AAEA,SAAS,sBAAqC;AAC5C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,OAAO,SAAS,KAAK,EAAE,IAAI;AAChD,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,EAAG,QAAO;AACpD,SAAO;AACT;AAIA,SAAS,oBAAoB,WAAkC;AAC7D,QAAM,YAAa,aAAqB;AACxC,MAAI,OAAO,cAAc,YAAY;AACnC,WAAO,EAAE,QAAQ,UAAU,SAAS,GAAkB,SAAS,MAAM;AAAA,IAAC,EAAE;AAAA,EAC1E;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,KAAK,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AACzD,SAAO,EAAE,QAAQ,WAAW,QAAQ,SAAS,MAAM,aAAa,EAAE,EAAE;AACtE;AAEA,SAAS,kBACP,SACqD;AACrD,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAwB,CAAC,CAAC,CAAC;AAC1D,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,QAAQ,OAAO,CAAC,GAAI,SAAS,MAAM;AAAA,EAAC,EAAE;AAExE,QAAM,aAAa,IAAI,gBAAgB;AAEvC,QAAM,QAAQ,MAAM;AAClB,QAAI;AACF,iBAAW,MAAM;AAAA,IACnB,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,aAAW,KAAK,QAAQ;AACtB,QAAI,EAAE,SAAS;AACb,YAAM;AACN,aAAO,EAAE,QAAQ,WAAW,QAAQ,SAAS,MAAM;AAAA,MAAC,EAAE;AAAA,IACxD;AACA,MAAE,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,EACnD;AAEA,SAAO,EAAE,QAAQ,WAAW,QAAQ,SAAS,MAAM;AAAA,EAAC,EAAE;AACxD;AAEA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AACF,CAAC;AAED,eAAe,WAIb,KACA,cACA,oBACyD;AACzD,QAAM,YAAY,oBAAoB;AACtC,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,QAAQ,IAAI,OAAM,WAAU;AAC1B,UAAI,OAAO,SAAS,SAAU,QAAO;AAErC,UAAI,gBAAsC;AAE1C,UAAI;AACF,YAAI,eAA+C,OAAO,gBAAgB;AAE1E,YAAI,CAAC,cAAc;AACjB,cAAI;AACF,2BAAe,OAAO,OAAO,sBAAsB;AAAA,UACrD,QAAQ;AACN,2BAAe;AAAA,UACjB;AACA,iBAAO,eAAe;AAAA,QACxB;AAEA,YAAI,CAAE,eAAuB,kBAAkB,GAAG;AAChD,iBAAO;AAAA,QACT;AAEA,wBAAgB,YAAY,oBAAoB,SAAS,IAAI;AAC7D,cAAM,SAAS,kBAAkB,CAAC,eAAe,MAAM,CAAC;AAExD,eAAO;AAAA,UACL;AAAA,UACA,QAAS,MAAM,OAAO,OAAO;AAAA,YAC3B;AAAA,YACA;AAAA,YACA,QAAQ,SAAU,EAAE,QAAQ,OAAO,OAAO,IAAY;AAAA,UACxD;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YAAI,OAAO,SAAS,aAAa;AAC/B;AAAA,YACE,OAAO;AAAA,YACP,sBAAsB,IAAI,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC9F;AAAA,QACF;AACA,eAAO;AAAA,MACT,UAAE;AACA,uBAAe,QAAQ;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,QACJ;AAAA,IACC,CACE,WAEA,OAAO,WAAW;AAAA,EACtB,EACC,IAAI,YAAU,OAAO,KAAK,EAC1B,OAAO,CAAC,WAAmE,WAAW,IAAI;AAC/F;AAEO,IAAM,cAAcE,SAAQ,YAA6B;AAC9D,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,MACE,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,QAAQ,EAAE,MAAM,EAAE,MAAM;AAC1D,UAAM,aAAa,0BAA0B,OAAO,IAAI;AAExD,WAAO,MACJ,IAAI,CAAC,SAAsB;AAC1B,YAAM,WAAW,0BAA0B,KAAK,IAAI;AACpD,YAAM,OAAO,QAAQ,UAAU,KAAK,QAAQ;AAE5C,UAAI,KAAK,WAAW,YAAY,KAAK,CAAC,uBAAuB,IAAI,IAAI,GAAG;AACtE,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,oBAAoB;AAClB,iBAAO,KAAK,aAAa,gBAAgB;AAAA,QAC3C;AAAA,QACA,aAAa;AACX,iBAAO,KAAK,aAAa,gBAAgB;AAAA,QAC3C;AAAA,QACA,MAAM,cAAc;AAClB,iBAAO,KAAK,eAAe;AAAA,QAC7B;AAAA,QACA,MAAM,SAAS;AACb,iBAAO,KAAK,eAAe;AAAA,QAC7B;AAAA,QACA,iBAAiB,KAAK;AAAA,QACtB,MAAM,gBAAgB;AACpB,iBAAO,EAAE,QAAQ,KAAK;AAAA,QACxB;AAAA,QACA,OAAO,KAAK,MAA+B,SAAS;AAClD,gBAAM,OAAO,MAAM,YAAY;AAAA,YAC7B;AAAA,YACA,MAAM,KAAK;AAAA,YACX;AAAA,YACA,WAAW,QAAQ;AAAA,YACnB,QAAQ,QAAQ,gBAAgB;AAAA,UAClC,CAAC;AACD,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN;AAAA,YACA,oBAAoB;AAAA,UACtB;AAAA,QACF;AAAA,QACA,iBAAiB;AACf,gBAAM,QAAQ,KAAK,aAAa,SAAS,KAAK;AAC9C,iBAAO,GAAG,OAAO,IAAI,MAAM,KAAK;AAAA,QAClC;AAAA,MACF;AAAA,IACF,CAAC,EACA,OAAO,CAAC,SAAuB,SAAS,IAAI;AAAA,EACjD,CAAC;AACH,CAAC;AAED,eAAe,YAAY;AAAA,EACzB,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAM6C;AAC3C,QAAM,YAAY,oBAAoB;AACtC,QAAM,gBAAgB,YAAY,oBAAoB,SAAS,IAAI;AACnE,QAAM,SAAS,kBAAkB,CAAC,QAAQ,eAAe,MAAM,CAAC;AAEhE,QAAM,OACJ,aAAa,UAAU,KAAK,IACxB,EAAE,wBAAwB,UAAU,IACpC;AAEN,MAAI;AACF,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,QACX,GAAI,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,MAChC;AAAA,MACA;AAAA,MACA,QAAQ,SAAU,EAAE,QAAQ,OAAO,OAAO,IAAY;AAAA,IACxD;AAEA,QAAI,aAAa,UAAU,OAAO,SAAS;AACzC,YAAM,cACJ,aAAa,UAAU,MAAM,QAAQ,OAAO,OAAO,IAC/C,OAAO,QAAQ,KAAK,UAAQ,KAAK,SAAS,UAAU,UAAU,IAAI,IAClE;AAEN,YAAM,aACJ,eAAe,OAAQ,YAAoB,SAAS,WAChD,OAAQ,YAAoB,IAAI,IAChC,WAAW,UAAU,OAAO,QAC1B,OAAO,OAAO,KAAK,IACnB;AAER,YAAM,UAAU,cAAc,sBAAsB,IAAI;AACxD,kBAAY,MAAM,sBAAsB,IAAI,KAAK,OAAO,EAAE;AAC1D,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,QAAI,gBAAgB,QAAQ;AAC1B,aAAO,OAAO,OAAO,UAAU;AAAA,IACjC;AAEA,QAAI,uBAAuB,UAAU,OAAO,sBAAsB,QAAW;AAC3E,aAAO,KAAK,UAAU,OAAO,iBAAiB;AAAA,IAChD;AAEA,QAAI,aAAa,UAAU,MAAM,QAAQ,OAAO,OAAO,GAAG;AACxD,aAAO,OAAO,QAAQ,IAAI,UAAQ;AAChC,YAAI,KAAK,SAAS,SAAS;AACzB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,MAAM,OAAO,KAAK,IAAI;AAAA,cACtB,YAAY,KAAK;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,UAAM,MAAM,wCAAwC,IAAI,EAAE;AAAA,EAC5D,UAAE;AACA,mBAAe,QAAQ;AAAA,EACzB;AACF;AAEO,IAAM,iBAAiBA,SAAQ,YAAgC;AACpE,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,MACE,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,QAAQ;AAAA,IAAQ,CAAC,EAAE,QAAQ,OAAO,MACvC,OAAO,SAAS,IAAI,OAAK;AACvB,YAAM,aAAa,0BAA0B,OAAO,IAAI;AACxD,YAAM,WAAW,OAAO,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,OAAK,EAAE,IAAI;AACjE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,QAAQ,UAAU,KAAK,EAAE,IAAI;AAAA,QACnC,aAAa,EAAE,eAAe;AAAA,QAC9B,WAAW;AAAA,QACX,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,iBAAiB;AACf,gBAAM,QAAQ,OAAQ,EAAU,UAAU,WAAY,EAAU,QAAQ,EAAE;AAC1E,iBAAO,GAAG,OAAO,IAAI,IAAI,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA,MAAM,oBAAoB,MAAc;AACtC,gBAAM,YAAY,KAAK,MAAM,GAAG;AAChC,iBAAO,MAAM,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,GAAG,UAAU,UAAU,SAAS,CAAC;AAAA,QAClF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAED,eAAsB,WACpB,EAAE,MAAM,OAAO,GACf,MACyB;AACzB,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,OAAO,UAAU,EAAE,MAAM,WAAW,KAAK,CAAC;AACtE,WAAO,OAAO,SAAS,IAAI,CAAC,YAA0B;AACpD,YAAM,UAAU,QAAQ;AACxB,UAAI,QAAQ,SAAS,QAAQ;AAC3B,eAAO;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,QAAQ;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,QAAQ,SAAS,WAAW,UAAU,SAAS;AACjD,eAAO;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM,OAAQ,QAAgB,IAAI;AAAA,gBAClC,YAAa,QAAgB;AAAA,gBAC7B,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM,QAAQ;AAAA,QACd,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,gCAAiC,SAAiB,QAAQ,SAAS;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd;AAAA,MACE,OAAO;AAAA,MACP,0BAA0B,IAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC5F;AACA,UAAM;AAAA,EACR;AACF;;;AOpXO,SAAS,gBAAgB,OAAwB;AACtD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,uBAAuB,KAAK,OAAO,EAAG,QAAO;AACjD,MAAI,6BAA6B,KAAK,OAAO,EAAG,QAAO;AACvD,MAAI,0CAA0C,KAAK,OAAO,EAAG,QAAO;AACpE,SAAO,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,MAAM;AAC5D;AAEO,SAAS,gBACd,KACoC;AACpC,MAAI,CAAC,OAAO,IAAI,WAAW,EAAG,QAAO;AACrC,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,KAAK;AACtB,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,QAAQ,IAAI;AACd,YAAM,IAAI;AAAA,QACR,2BAA2B,IAAI;AAAA,MACjC;AAAA,IACF;AACA,UAAM,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK;AACpC,UAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AACvC,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,oBAAoB,IAAI,iCAAiC;AAAA,IAC3E;AACA,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,OAGtC;AACA,QAAM,OAAO,SAAS,SAAS,KAAK,KAAK;AAEzC,MAAI,QAAQ;AACV,WAAO,EAAE,OAAO,kBAAkB,SAAS,GAAG,SAAS,QAAQ;AACjE,MAAI,QAAQ;AACV,WAAO,EAAE,OAAO,kBAAkB,QAAQ,GAAG,SAAS,OAAO;AAC/D,MAAI,QAAQ;AACV,WAAO,EAAE,OAAO,kBAAkB,SAAS,GAAG,SAAS,UAAU;AAEnE,MAAI,QAAQ;AACV,WAAO,EAAE,OAAO,kBAAkB,QAAQ,GAAG,SAAS,OAAO;AAC/D,MAAI,QAAQ,mBAAmB,QAAQ,kBAAkB;AACvD,WAAO,EAAE,OAAO,kBAAkB,SAAS,GAAG,SAAS,QAAQ;AAAA,EACjE;AAEA,SAAO,EAAE,OAAO,kBAAkB,GAAG,GAAG,SAAS,IAAI;AACvD;AAEO,SAAS,sBAAsB,WAGpC;AACA,MAAI,CAAC,UAAW,QAAO,EAAE,WAAW,SAAS,UAAU,MAAM;AAC7D,QAAM,aAAa,UAAU,KAAK;AAClC,MAAI,eAAe,WAAW,eAAe,SAAS,eAAe,QAAQ;AAC3E,WAAO,EAAE,WAAW,YAAY,UAAU,KAAK;AAAA,EACjD;AACA,QAAM,IAAI;AAAA,IACR,2BAA2B,SAAS;AAAA,EACtC;AACF;",
|
|
6
|
-
"names": ["existsSync", "readFileSync", "existsSync", "readFileSync", "memoize", "Box", "Text", "React", "Text", "React", "Text", "Box", "Text", "lines", "memoize"]
|
|
7
|
-
}
|