@ddlqhd/agent-sdk 0.1.0 → 0.1.1
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 +4 -2
- package/dist/{chunk-NDSL7NPN.js → chunk-742JTNYI.js} +224 -19
- package/dist/chunk-742JTNYI.js.map +1 -0
- package/dist/{chunk-5QMA2YBY.cjs → chunk-AJD3DTL7.cjs} +57 -28
- package/dist/chunk-AJD3DTL7.cjs.map +1 -0
- package/dist/{chunk-X35MHWXE.cjs → chunk-DQFTAD3I.cjs} +231 -24
- package/dist/chunk-DQFTAD3I.cjs.map +1 -0
- package/dist/{chunk-Q3SOMX26.js → chunk-DXMVWGLJ.js} +52 -25
- package/dist/chunk-DXMVWGLJ.js.map +1 -0
- package/dist/chunk-LOYIGOBZ.js +54 -0
- package/dist/chunk-LOYIGOBZ.js.map +1 -0
- package/dist/chunk-OZO7D77N.cjs +59 -0
- package/dist/chunk-OZO7D77N.cjs.map +1 -0
- package/dist/{chunk-JF5AJQMU.cjs → chunk-Q3L4GIBG.cjs} +211 -58
- package/dist/chunk-Q3L4GIBG.cjs.map +1 -0
- package/dist/{chunk-OHXW2YM6.js → chunk-THKEF32L.js} +210 -57
- package/dist/chunk-THKEF32L.js.map +1 -0
- package/dist/cli/index.cjs +36 -37
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +11 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/{index-DPsZ1zat.d.ts → index-DGPDMbW5.d.cts} +8 -21
- package/dist/{index-RTPmFjMp.d.cts → index-nEfayAzD.d.ts} +8 -21
- package/dist/index.cjs +91 -79
- package/dist/index.d.cts +26 -6
- package/dist/index.d.ts +26 -6
- package/dist/index.js +4 -4
- package/dist/models/index.cjs +15 -15
- package/dist/models/index.d.cts +50 -6
- package/dist/models/index.d.ts +50 -6
- package/dist/models/index.js +2 -2
- package/dist/tools/index.cjs +51 -51
- package/dist/tools/index.d.cts +3 -3
- package/dist/tools/index.d.ts +3 -3
- package/dist/tools/index.js +2 -2
- package/dist/{types-C0aX_Qdp.d.cts → types-BLf9IqRs.d.cts} +34 -49
- package/dist/{types-C0aX_Qdp.d.ts → types-BLf9IqRs.d.ts} +34 -49
- package/package.json +15 -4
- package/dist/chunk-5QMA2YBY.cjs.map +0 -1
- package/dist/chunk-CNSGZVRN.cjs +0 -152
- package/dist/chunk-CNSGZVRN.cjs.map +0 -1
- package/dist/chunk-JF5AJQMU.cjs.map +0 -1
- package/dist/chunk-NDSL7NPN.js.map +0 -1
- package/dist/chunk-OHXW2YM6.js.map +0 -1
- package/dist/chunk-Q3SOMX26.js.map +0 -1
- package/dist/chunk-WH3APNQ5.js +0 -147
- package/dist/chunk-WH3APNQ5.js.map +0 -1
- package/dist/chunk-X35MHWXE.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/output-handler.ts","../src/tools/registry.ts","../src/tools/builtin/filesystem-encoding.ts","../src/tools/builtin/filesystem.ts","../src/core/environment.ts","../src/tools/builtin/shell.ts","../src/tools/builtin/grep.ts","../src/tools/builtin/tavily-search.ts","../src/tools/builtin/web-fetch.ts","../src/tools/builtin/web.ts","../src/tools/builtin/task.ts","../src/tools/builtin/interaction.ts","../src/tools/builtin/skill-activation.ts","../src/tools/builtin/subagent.ts","../src/tools/builtin/index.ts","../src/tools/hooks/loader.ts","../src/tools/hooks/manager.ts"],"names":["lines","i","iconv","pathWin32","z","MAX_LINE_LENGTH","fg","join","homedir","spawn"],"mappings":"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","file":"chunk-THKEF32L.js","sourcesContent":["import { mkdir, writeFile } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport type { ToolResult } from '../core/types.js';\n\n/**\n * 输出处理配置\n */\nexport const OUTPUT_CONFIG = {\n /** 直接返回的最大字符数 (~12k tokens) */\n maxDirectOutput: 50_000,\n /** 保存到文件的最大大小 */\n maxStorageSize: 10_000_000,\n /** 摘要显示的行数 */\n summaryHeadLines: 100,\n summaryTailLines: 100,\n /** 智能截断保留的行数 */\n truncateHeadLines: 500,\n truncateTailLines: 500,\n /** 存储目录 */\n storageDir: '.claude/tool-outputs/',\n};\n\n/**\n * 输出策略接口\n */\nexport interface OutputStrategy {\n /**\n * 处理超长输出\n * @param content 原始内容\n * @param toolName 工具名称\n * @param context 上下文信息\n */\n handle(\n content: string,\n toolName: string,\n context?: { args?: unknown; cwd?: string; userBasePath?: string }\n ): Promise<ToolResult>;\n}\n\n/**\n * 文件存储策略 (shell / MCP / web)\n * 保存完整内容到文件,返回摘要 + 文件路径;可用 Read 的 offset/limit 分页查看\n */\nexport class FileStorageStrategy implements OutputStrategy {\n private userBasePath: string;\n\n constructor(userBasePath?: string) {\n this.userBasePath = userBasePath || homedir();\n }\n\n async handle(\n content: string,\n toolName: string,\n context?: { args?: unknown; cwd?: string; userBasePath?: string }\n ): Promise<ToolResult> {\n const basePath = context?.userBasePath || this.userBasePath;\n const timestamp = Date.now();\n const safeName = toolName.replace(/[^a-zA-Z0-9_-]/g, '_');\n const filename = `${safeName}-${timestamp}.txt`;\n const storageDir = join(basePath, OUTPUT_CONFIG.storageDir);\n const filepath = join(storageDir, filename);\n\n try {\n // 创建目录并写入文件\n await mkdir(dirname(filepath), { recursive: true });\n await writeFile(filepath, content, 'utf-8');\n } catch (error) {\n // 文件写入失败,回退到截断策略\n const errorMessage = error instanceof Error ? error.message : String(error);\n const lines = content.split('\\n');\n return {\n content:\n `Output too large (${lines.length} lines)\\n\\n` +\n `Failed to save to file: ${errorMessage}\\n\\n` +\n `Truncated output:\\n${content.slice(0, OUTPUT_CONFIG.maxDirectOutput)}`,\n metadata: {\n truncated: true,\n originalLength: content.length,\n lineCount: lines.length,\n },\n };\n }\n\n // 生成摘要\n const lines = content.split('\\n');\n const summary = this.generateSummary(content, lines);\n const sizeKB = (content.length / 1024).toFixed(1);\n\n return {\n content:\n `Output too large (${sizeKB} KB, ${lines.length} lines)\\n\\n` +\n `Summary:\\n${summary}\\n\\n` +\n `Full output saved to: ${filepath}\\n` +\n `Use 'Read' with offset/limit to view specific sections.`,\n metadata: {\n truncated: true,\n originalLength: content.length,\n storagePath: filepath,\n lineCount: lines.length,\n },\n };\n }\n\n private generateSummary(content: string, lines: string[]): string {\n const { summaryHeadLines, summaryTailLines } = OUTPUT_CONFIG;\n\n if (lines.length <= summaryHeadLines + summaryTailLines) {\n return content;\n }\n\n const head = lines.slice(0, summaryHeadLines).join('\\n');\n const tail = lines.slice(-summaryTailLines).join('\\n');\n const omitted = lines.length - summaryHeadLines - summaryTailLines;\n\n return `${head}\\n\\n... (${omitted} lines omitted) ...\\n\\n${tail}`;\n }\n}\n\n/**\n * 分页提示策略 (filesystem)\n * 提示用户使用分页参数,显示预览\n */\nexport class PaginationHintStrategy implements OutputStrategy {\n async handle(\n content: string,\n _toolName: string,\n context?: { args?: unknown; cwd?: string }\n ): Promise<ToolResult> {\n const lines = content.split('\\n');\n const sizeKB = (content.length / 1024).toFixed(1);\n const previewLines = OUTPUT_CONFIG.summaryHeadLines;\n\n // 提取文件路径(如果是从 args 中)\n const filePath = this.extractFilePath(context?.args);\n\n let hint = `Content is too large (${lines.length} lines, ${sizeKB} KB)\\n\\n`;\n\n if (filePath) {\n hint += `To read efficiently:\\n`;\n hint += `1. Use 'Read' with offset and limit:\\n`;\n hint += ` Read(file_path=\"${filePath}\", offset=1, limit=500)\\n\\n`;\n hint += `2. Use 'Grep' to search for patterns:\\n`;\n hint += ` Grep(pattern=\"keyword\", path=\"${filePath}\")\\n\\n`;\n }\n\n hint += `First ${previewLines} lines preview:\\n`;\n hint += lines.slice(0, previewLines).join('\\n');\n\n if (lines.length > previewLines) {\n hint += `\\n\\n... (${lines.length - previewLines} more lines)`;\n }\n\n return {\n content: hint,\n metadata: {\n truncated: true,\n originalLength: content.length,\n lineCount: lines.length,\n },\n };\n }\n\n private extractFilePath(args: unknown): string | null {\n if (typeof args === 'object' && args !== null) {\n const a = args as Record<string, unknown>;\n if (typeof a.path === 'string') return a.path;\n if (typeof a.file_path === 'string') return a.file_path;\n }\n return null;\n }\n}\n\n/**\n * 智能截断策略 (search/默认)\n * 保留首尾内容,显示省略统计\n */\nexport class SmartTruncateStrategy implements OutputStrategy {\n async handle(\n content: string,\n _toolName: string,\n _context?: { args?: unknown; cwd?: string }\n ): Promise<ToolResult> {\n const lines = content.split('\\n');\n const { truncateHeadLines, truncateTailLines, maxDirectOutput } = OUTPUT_CONFIG;\n\n // 如果行数在限制内,按字符截断\n if (lines.length <= truncateHeadLines + truncateTailLines) {\n const truncated =\n content.slice(0, maxDirectOutput) +\n `\\n\\n... [truncated, ${content.length} total chars]`;\n return {\n content: truncated,\n metadata: {\n truncated: true,\n originalLength: content.length,\n lineCount: lines.length,\n },\n };\n }\n\n // 按行截断,保留首尾\n const head = lines.slice(0, truncateHeadLines);\n const tail = lines.slice(-truncateTailLines);\n const omitted = lines.length - truncateHeadLines - truncateTailLines;\n\n const result =\n head.join('\\n') +\n `\\n\\n... [${omitted} lines omitted] ...\\n\\n` +\n tail.join('\\n');\n\n return {\n content: result,\n metadata: {\n truncated: true,\n originalLength: content.length,\n originalLineCount: lines.length,\n displayedLineCount: truncateHeadLines + truncateTailLines,\n },\n };\n }\n}\n\n/**\n * 输出处理器\n * 根据工具类别选择合适的处理策略\n */\nexport class OutputHandler {\n private strategies: Map<string, OutputStrategy> = new Map();\n private defaultStrategy: OutputStrategy;\n\n constructor(userBasePath?: string) {\n // 注册策略\n this.strategies.set('shell', new FileStorageStrategy(userBasePath));\n this.strategies.set('mcp', new FileStorageStrategy(userBasePath));\n this.strategies.set('web', new FileStorageStrategy(userBasePath));\n this.strategies.set('filesystem', new PaginationHintStrategy());\n this.strategies.set('search', new SmartTruncateStrategy());\n\n // 默认策略\n this.defaultStrategy = new SmartTruncateStrategy();\n }\n\n /**\n * 处理工具输出\n * @param content 工具输出内容\n * @param toolName 工具名称\n * @param category 工具类别\n * @param context 上下文信息\n */\n async handle(\n content: string,\n toolName: string,\n category?: string,\n context?: { args?: unknown; cwd?: string; userBasePath?: string }\n ): Promise<ToolResult> {\n // 内容未超限,直接返回\n if (content.length <= OUTPUT_CONFIG.maxDirectOutput) {\n return { content };\n }\n\n // 选择策略\n const strategy =\n this.strategies.get(category || '') || this.defaultStrategy;\n\n return strategy.handle(content, toolName, context);\n }\n\n /**\n * 注册自定义策略\n */\n registerStrategy(category: string, strategy: OutputStrategy): void {\n this.strategies.set(category, strategy);\n }\n\n /**\n * 检查内容是否需要处理\n */\n needsHandling(content: string): boolean {\n return content.length > OUTPUT_CONFIG.maxDirectOutput;\n }\n}\n\n/**\n * 创建输出处理器\n */\nexport function createOutputHandler(userBasePath?: string): OutputHandler {\n return new OutputHandler(userBasePath);\n}","import type {\n ToolDefinition,\n ToolExecutionContext,\n ToolExecutionPolicy,\n ToolResult,\n ToolSchema\n} from '../core/types.js';\nimport { zodToJsonSchema } from '../models/base.js';\nimport { OutputHandler, createOutputHandler } from './output-handler.js';\nimport type { HookManager } from './hooks/manager.js';\nimport type { HookContext } from './hooks/types.js';\n\n/**\n * Tool 注册中心配置\n */\nexport interface ToolRegistryConfig {\n /** 用户基础路径,用于存储超长输出 */\n userBasePath?: string;\n /** 是否启用输出处理(默认 true) */\n enableOutputHandler?: boolean;\n /** 执行前校验(disallowed / allowedTools / canUseTool);未设置则不限制 */\n executionPolicy?: ToolExecutionPolicy;\n}\n\n/** 工具执行选项(Hook 上下文等) */\nexport interface ToolExecuteOptions {\n toolCallId?: string;\n projectDir?: string;\n agentDepth?: number;\n}\n\n/**\n * Tool 注册中心\n */\nexport class ToolRegistry {\n private tools: Map<string, ToolDefinition> = new Map();\n private categories: Map<string, Set<string>> = new Map();\n private outputHandler: OutputHandler | null;\n private hookManager: HookManager | null = null;\n private readonly executionPolicy: ToolExecutionPolicy | undefined;\n\n constructor(config?: ToolRegistryConfig) {\n const enableOutputHandler = config?.enableOutputHandler !== false;\n this.outputHandler = enableOutputHandler\n ? createOutputHandler(config?.userBasePath)\n : null;\n this.executionPolicy = config?.executionPolicy;\n }\n\n /**\n * 工具名是否在 {@link ToolExecutionPolicy.disallowedTools} 中(无策略时为 false)。\n */\n isDisallowed(name: string): boolean {\n return this.executionPolicy?.disallowedTools?.includes(name) ?? false;\n }\n\n /**\n * `allowedTools` 未设置时视为全部自动批准;已设置时仅列表内自动批准。\n */\n private isAutoApproved(name: string): boolean {\n const allowed = this.executionPolicy?.allowedTools;\n if (allowed === undefined) {\n return true;\n }\n return allowed.includes(name);\n }\n\n private async checkExecutionPolicy(name: string, args: unknown): Promise<ToolResult | null> {\n const policy = this.executionPolicy;\n if (!policy) {\n return null;\n }\n\n if (this.isDisallowed(name)) {\n return {\n content: `Tool \"${name}\" is disallowed by configuration`,\n isError: true\n };\n }\n\n if (this.isAutoApproved(name)) {\n return null;\n }\n\n const canUse = policy.canUseTool;\n if (!canUse) {\n return {\n content: `Tool \"${name}\" requires approval: configure allowedTools or canUseTool`,\n isError: true\n };\n }\n\n const raw = args;\n const input: Record<string, unknown> =\n raw !== null && raw !== undefined && typeof raw === 'object' && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n const ok = await canUse(name, input);\n if (!ok) {\n return {\n content: `Tool \"${name}\" was denied by canUseTool`,\n isError: true\n };\n }\n return null;\n }\n\n setHookManager(manager: HookManager | null): void {\n this.hookManager = manager;\n }\n\n getHookManager(): HookManager | null {\n return this.hookManager;\n }\n\n private buildHookContext(\n event: HookContext['eventType'],\n name: string,\n toolInput: Record<string, unknown>,\n options: ToolExecuteOptions | undefined,\n extra: Partial<HookContext> = {}\n ): HookContext {\n return {\n eventType: event,\n toolName: name,\n toolInput,\n timestamp: Date.now(),\n projectDir: options?.projectDir,\n toolCallId: options?.toolCallId,\n ...extra\n };\n }\n\n /**\n * 注册工具\n */\n register(tool: ToolDefinition): void {\n if (this.isDisallowed(tool.name)) {\n throw new Error(\n `Cannot register tool \"${tool.name}\": it is listed in disallowedTools`\n );\n }\n if (this.tools.has(tool.name)) {\n throw new Error(`Tool \"${tool.name}\" is already registered`);\n }\n this.tools.set(tool.name, tool);\n }\n\n /**\n * 注册多个工具\n */\n registerMany(tools: ToolDefinition[]): void {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n /**\n * 注销工具\n */\n unregister(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /**\n * 获取工具定义\n */\n get(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /**\n * 获取所有工具定义\n */\n getAll(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * 获取工具名称列表\n */\n getNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /**\n * 检查工具是否存在\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * 获取工具数量\n */\n get size(): number {\n return this.tools.size;\n }\n\n /**\n * 执行工具\n */\n async execute(name: string, args: unknown, options?: ToolExecuteOptions): Promise<ToolResult> {\n const hookMgr = this.hookManager;\n const rawArgsObj =\n typeof args === 'object' && args !== null ? (args as Record<string, unknown>) : {};\n\n const policyBlock = await this.checkExecutionPolicy(name, args);\n if (policyBlock) {\n return policyBlock;\n }\n\n const tool = this.tools.get(name);\n if (!tool) {\n const ctx = this.buildHookContext('postToolUseFailure', name, rawArgsObj, options, {\n errorMessage: `Tool \"${name}\" not found`,\n failureKind: 'tool_error'\n });\n await hookMgr?.executePostToolUseFailure(ctx);\n return {\n content: `Tool \"${name}\" not found`,\n isError: true\n };\n }\n\n let workingInput: Record<string, unknown> = rawArgsObj;\n try {\n const initial = tool.parameters.safeParse(args);\n if (!initial.success) {\n const msg = `Invalid arguments for tool \"${name}\": ${initial.error.issues.map(i => i.message).join(', ')}`;\n await hookMgr?.executePostToolUseFailure(\n this.buildHookContext('postToolUseFailure', name, rawArgsObj, options, {\n errorMessage: msg,\n failureKind: 'validation'\n })\n );\n return { content: msg, isError: true };\n }\n workingInput = initial.data as Record<string, unknown>;\n\n if (hookMgr) {\n const pre = await hookMgr.executePreToolUse(\n this.buildHookContext('preToolUse', name, workingInput, options)\n );\n if (!pre.allowed) {\n return {\n content: pre.reason ?? 'Blocked by hook',\n isError: true\n };\n }\n const merged = tool.parameters.safeParse(pre.updatedInput ?? workingInput);\n if (!merged.success) {\n const msg = `Invalid arguments after hook merge for tool \"${name}\": ${merged.error.issues.map(i => i.message).join(', ')}`;\n await hookMgr.executePostToolUseFailure(\n this.buildHookContext('postToolUseFailure', name, workingInput, options, {\n errorMessage: msg,\n failureKind: 'validation'\n })\n );\n return { content: msg, isError: true };\n }\n workingInput = merged.data as Record<string, unknown>;\n }\n\n const handlerArgs = workingInput as Parameters<ToolDefinition['handler']>[0];\n const executionContext: ToolExecutionContext = {\n toolCallId: options?.toolCallId,\n projectDir: options?.projectDir,\n agentDepth: options?.agentDepth\n };\n const result = await tool.handler(handlerArgs, executionContext);\n const toolResultRaw = result;\n\n if (result.isError) {\n await hookMgr?.executePostToolUseFailure(\n this.buildHookContext('postToolUseFailure', name, workingInput, options, {\n errorMessage: result.content,\n failureKind: 'tool_error'\n })\n );\n return result;\n }\n\n let finalResult = result;\n if (this.outputHandler && this.outputHandler.needsHandling(result.content)) {\n finalResult = await this.outputHandler.handle(\n result.content,\n name,\n tool.category,\n { args: handlerArgs }\n );\n }\n\n await hookMgr?.executePostToolUse(\n this.buildHookContext('postToolUse', name, workingInput, options, {\n toolResultRaw,\n toolResultFinal: finalResult\n })\n );\n\n return finalResult;\n } catch (error) {\n const msg = `Error executing tool \"${name}\": ${error instanceof Error ? error.message : String(error)}`;\n await hookMgr?.executePostToolUseFailure(\n this.buildHookContext('postToolUseFailure', name, workingInput, options, {\n errorMessage: msg,\n failureKind: 'handler_throw'\n })\n );\n return {\n content: msg,\n isError: true\n };\n }\n }\n\n /**\n * 获取工具 Schema (用于模型调用)\n */\n toSchema(): ToolSchema[] {\n return this.getAll().map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters) as Record<string, unknown>\n }));\n }\n\n /**\n * 清空所有工具\n */\n clear(): void {\n this.tools.clear();\n this.categories.clear();\n }\n\n /**\n * 按类别注册工具\n */\n registerWithCategory(category: string, tool: ToolDefinition): void {\n this.register(tool);\n \n if (!this.categories.has(category)) {\n this.categories.set(category, new Set());\n }\n this.categories.get(category)!.add(tool.name);\n }\n\n /**\n * 获取类别下的工具\n */\n getByCategory(category: string): ToolDefinition[] {\n const toolNames = this.categories.get(category);\n if (!toolNames) return [];\n\n return Array.from(toolNames)\n .map(name => this.tools.get(name))\n .filter((tool): tool is ToolDefinition => tool !== undefined);\n }\n\n /**\n * 获取所有类别\n */\n getCategories(): string[] {\n return Array.from(this.categories.keys());\n }\n\n /**\n * 过滤工具\n */\n filter(predicate: (tool: ToolDefinition) => boolean): ToolDefinition[] {\n return this.getAll().filter(predicate);\n }\n\n /**\n * 搜索工具\n */\n search(query: string): ToolDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.filter(tool =>\n tool.name.toLowerCase().includes(lowerQuery) ||\n tool.description.toLowerCase().includes(lowerQuery)\n );\n }\n\n /**\n * 导出工具配置\n */\n export(): Array<{ name: string; description: string; parameters: unknown }> {\n return this.getAll().map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters)\n }));\n }\n}\n\n/**\n * 创建工具定义\n */\nexport function createTool(config: {\n name: string;\n description: string;\n parameters: ToolDefinition['parameters'];\n handler: ToolDefinition['handler'];\n isDangerous?: boolean;\n category?: string;\n}): ToolDefinition {\n return {\n name: config.name,\n description: config.description,\n parameters: config.parameters,\n handler: config.handler,\n isDangerous: config.isDangerous,\n category: config.category\n };\n}\n\n/**\n * 创建全局工具注册中心\n */\nlet globalRegistry: ToolRegistry | null = null;\n\nexport function getGlobalRegistry(): ToolRegistry {\n if (!globalRegistry) {\n globalRegistry = new ToolRegistry();\n }\n return globalRegistry;\n}\n","/**\n * Charset detection and encode/decode helpers for builtin filesystem tools (Read / Write / Edit).\n */\nimport { analyse } from 'chardet';\nimport iconv from 'iconv-lite';\n\n/** Bytes to read from file start for charset detection (larger samples reduce CJK mis-detection). */\nconst SAMPLE_BYTES = 64 * 1024;\n\n/**\n * When chardet assigns equal confidence to several East Asian encodings (common on short samples),\n * we first prefer matches whose `lang` aligns with the encoding (see `langAffinityScore`), then fall\n * back to this order so GBK/GB18030 text is less often misread as Shift_JIS when still ambiguous.\n */\nconst CJK_TIE_BREAK_ORDER = [\n 'GB18030',\n 'Big5',\n 'EUC-KR',\n 'EUC-JP',\n 'Shift_JIS'\n] as const;\n\nfunction cjkTieBreakRank(name: string): number {\n const i = CJK_TIE_BREAK_ORDER.indexOf(name as (typeof CJK_TIE_BREAK_ORDER)[number]);\n return i === -1 ? 100 : i;\n}\n\n/** Chardet labels for encodings we treat as East Asian multibyte (do not override with GB heuristic). */\nfunction isCjkChardetName(name: string): boolean {\n switch (name) {\n case 'GB18030':\n case 'GBK':\n case 'Big5':\n case 'EUC-JP':\n case 'EUC-KR':\n case 'Shift_JIS':\n case 'ISO-2022-CN':\n case 'ISO-2022-JP':\n case 'ISO-2022-KR':\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Counts plausible GBK/GB18030 double-byte pairs (lead 0x81–0xFE, trail 0x40–0x7E or 0x80–0xFE).\n * Used when chardet prefers a single-byte ISO/Windows encoding by a small margin over GB18030.\n */\nfunction plausibleGbkDoubleBytePairCount(buf: Buffer): number {\n let n = 0;\n for (let i = 0; i < buf.length - 1; i++) {\n const a = buf[i]!;\n const b = buf[i + 1]!;\n if (a >= 0x81 && a <= 0xfe && b >= 0x40 && b <= 0xfe && b !== 0x7f) {\n n++;\n i++;\n }\n }\n return n;\n}\n\n/**\n * If the sample looks like GBK multibyte text but chardet ranks ISO-8859-* / windows-125* etc.\n * slightly higher than GB18030, prefer GB18030 (common for mixed ASCII + Chinese on Windows).\n */\nfunction preferGb18030OverChardetTop(\n buf: Buffer,\n matches: Array<{ name: string; confidence: number; lang?: string }>\n): boolean {\n if (matches.length === 0) return false;\n if (plausibleGbkDoubleBytePairCount(buf) < 2) return false;\n\n const top = matches[0];\n if (!top || isCjkChardetName(top.name)) return false;\n\n const maxConf = Math.max(...matches.map((m) => m.confidence));\n const gb = matches.find((m) => {\n const n = m.name as string;\n return n === 'GB18030' || n === 'GBK';\n });\n if (!gb) return false;\n\n const margin = 8;\n if (maxConf - gb.confidence > margin) return false;\n\n return true;\n}\n\n/**\n * Uses the whole sample as one UTF-8 byte sequence. If the file is damaged (UTF-8 then another\n * encoding), detection may still choose UTF-8 and the rest will look wrong — callers can pass an\n * explicit `encoding` on the Read tool to override.\n */\nfunction isValidUtf8(buf: Buffer): boolean {\n if (buf.length === 0) return true;\n try {\n new TextDecoder('utf-8', { fatal: true }).decode(buf);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * When chardet gives the same confidence to several CJK encodings, use its optional `lang` hint\n * (zh / ja / ko) to prefer encodings that typically match that script before the static CJK order.\n */\nfunction langAffinityScore(name: string, lang: string | undefined): number {\n if (!lang) return 0;\n const zhEnc = name === 'GB18030' || name === 'Big5';\n const jaEnc = name === 'Shift_JIS' || name === 'EUC-JP';\n if (zhEnc && lang === 'zh') return 2;\n if (jaEnc && lang === 'ja') return 2;\n if (name === 'EUC-KR' && lang === 'ko') return 2;\n if (zhEnc && (lang === 'ja' || lang === 'ko')) return -1;\n if (jaEnc && (lang === 'zh' || lang === 'ko')) return -1;\n if (name === 'EUC-KR' && (lang === 'zh' || lang === 'ja')) return -1;\n return 0;\n}\n\n/** BOM at file start → Node/iconv encoding name for reading. */\nfunction encodingFromBom(buf: Buffer): string | null {\n if (buf.length >= 3 && buf[0] === 0xef && buf[1] === 0xbb && buf[2] === 0xbf) {\n return 'utf8';\n }\n // UTF-32 BE / LE must be checked before UTF-16: FF FE is shared by UTF-16 LE and UTF-32 LE BOM.\n if (buf.length >= 4 && buf[0] === 0 && buf[1] === 0 && buf[2] === 0xfe && buf[3] === 0xff) {\n return 'utf-32be';\n }\n if (buf.length >= 4 && buf[0] === 0xff && buf[1] === 0xfe && buf[2] === 0 && buf[3] === 0) {\n return 'utf-32le';\n }\n if (buf.length >= 2 && buf[0] === 0xff && buf[1] === 0xfe) {\n return 'utf16le';\n }\n if (buf.length >= 2 && buf[0] === 0xfe && buf[1] === 0xff) {\n return 'utf-16be';\n }\n return null;\n}\n\n/** Map chardet encoding label to a value accepted by Node fs streams or iconv-lite. */\nfunction chardetNameToReadEncoding(name: string): string | null {\n if (name === 'mbcs') return null;\n\n const table: Record<string, string> = {\n ASCII: 'utf8',\n 'UTF-8': 'utf8',\n 'UTF-16LE': 'utf16le',\n 'UTF-16BE': 'utf-16be',\n 'UTF-32LE': 'utf-32le',\n 'UTF-32BE': 'utf-32be',\n 'UTF-32': 'utf-32le',\n GB18030: 'gb18030',\n GBK: 'gbk',\n Big5: 'big5',\n 'EUC-JP': 'euc-jp',\n 'EUC-KR': 'euc-kr',\n Shift_JIS: 'shift_jis',\n 'ISO-8859-1': 'latin1',\n 'ISO-8859-2': 'latin2',\n 'ISO-8859-5': 'iso88595',\n 'ISO-8859-6': 'iso88596',\n 'ISO-8859-7': 'iso88597',\n 'ISO-8859-8': 'iso88598',\n 'ISO-8859-9': 'latin5',\n 'ISO-2022-CN': 'iso-2022-cn',\n 'ISO-2022-JP': 'iso-2022-jp',\n 'ISO-2022-KR': 'iso-2022-kr',\n ISO_2022: 'iso-2022-jp',\n 'KOI8-R': 'koi8-r',\n 'windows-1250': 'cp1250',\n 'windows-1251': 'cp1251',\n 'windows-1252': 'cp1252',\n 'windows-1253': 'cp1253',\n 'windows-1254': 'cp1254',\n 'windows-1255': 'cp1255',\n 'windows-1256': 'cp1256'\n };\n\n const mapped = table[name];\n if (mapped) {\n if (mapped === 'utf8' || mapped === 'utf16le' || mapped === 'latin1') {\n return mapped;\n }\n if (iconv.encodingExists(mapped)) {\n return mapped;\n }\n }\n\n const lower = name.toLowerCase().replace(/_/g, '-');\n if (lower !== 'mbcs' && iconv.encodingExists(lower)) {\n return lower;\n }\n\n const compact = name.replace(/-/g, '').toLowerCase();\n if (iconv.encodingExists(compact)) {\n return compact;\n }\n\n return null;\n}\n\n/**\n * Read the start of a file for charset detection (does not decode).\n */\nexport async function readEncodingSample(filePath: string, fileSize?: number): Promise<Buffer> {\n const fs = await import('fs/promises');\n const fh = await fs.open(filePath, 'r');\n try {\n const size = fileSize !== undefined ? fileSize : (await fh.stat()).size;\n const len = Math.min(SAMPLE_BYTES, size);\n if (len === 0) {\n return Buffer.alloc(0);\n }\n const buf = Buffer.allocUnsafe(len);\n const { bytesRead } = await fh.read(buf, 0, len, 0);\n return bytesRead < len ? buf.subarray(0, bytesRead) : buf;\n } finally {\n await fh.close();\n }\n}\n\n/**\n * Pick an encoding for reading: BOM → UTF-8 validity (whole sample) → chardet, with confidence\n * sort, then `lang` affinity, then CJK static tie-break. Mixed or pathological files may need a\n * manual `encoding` override.\n */\nexport function detectEncodingFromSample(buf: Buffer): string {\n if (buf.length === 0) {\n return 'utf8';\n }\n\n const bom = encodingFromBom(buf);\n if (bom) {\n return bom;\n }\n\n if (isValidUtf8(buf)) {\n return 'utf8';\n }\n\n const matches = analyse(buf).filter(\n (m) => m.confidence > 0 && m.name !== 'ASCII' && m.name !== 'mbcs'\n );\n\n matches.sort((a, b) => {\n if (b.confidence !== a.confidence) {\n return b.confidence - a.confidence;\n }\n const langDiff = langAffinityScore(b.name, b.lang) - langAffinityScore(a.name, a.lang);\n if (langDiff !== 0) {\n return langDiff;\n }\n return cjkTieBreakRank(a.name) - cjkTieBreakRank(b.name);\n });\n\n if (preferGb18030OverChardetTop(buf, matches)) {\n const gb = matches.find((m) => {\n const n = m.name as string;\n return n === 'GB18030' || n === 'GBK';\n });\n if (gb) {\n const enc = chardetNameToReadEncoding(gb.name);\n if (enc && (isNativeReadEncoding(enc) || iconv.encodingExists(enc))) {\n return enc;\n }\n }\n }\n\n for (const m of matches) {\n const enc = chardetNameToReadEncoding(m.name);\n if (enc && (isNativeReadEncoding(enc) || iconv.encodingExists(enc))) {\n return enc;\n }\n }\n\n return 'utf8';\n}\n\nexport function isNativeReadEncoding(enc: string): boolean {\n return enc === 'utf8' || enc === 'utf16le' || enc === 'latin1';\n}\n\n/**\n * Normalize user-supplied encoding for Read (explicit override), Write, and Edit:\n * empty/omitted → utf8; utf-8 → utf8; cp936 → gbk.\n */\nexport function normalizeFilesystemEncoding(encoding: string | undefined): string {\n const raw = encoding?.trim() ?? '';\n if (raw === '') return 'utf8';\n let e = raw.toLowerCase();\n if (e === 'utf-8') e = 'utf8';\n if (e === 'cp936') e = 'gbk';\n return e;\n}\n\nexport function isFilesystemEncodingSupported(normalized: string): boolean {\n return isNativeReadEncoding(normalized) || iconv.encodingExists(normalized);\n}\n\n/**\n * Read a file as a JavaScript string using the given normalized encoding.\n */\nexport async function readFileAsUnicodeString(\n filePath: string,\n normalized: string\n): Promise<string> {\n const fs = await import('fs/promises');\n if (isNativeReadEncoding(normalized)) {\n return fs.readFile(filePath, {\n encoding: normalized as 'utf8' | 'utf16le' | 'latin1'\n });\n }\n const buf = await fs.readFile(filePath);\n return iconv.decode(buf, normalized);\n}\n\n/**\n * Write a JavaScript string to a file using the given normalized encoding.\n */\nexport async function writeFileFromUnicodeString(\n filePath: string,\n text: string,\n normalized: string\n): Promise<void> {\n const fs = await import('fs/promises');\n if (isNativeReadEncoding(normalized)) {\n await fs.writeFile(filePath, text, {\n encoding: normalized as 'utf8' | 'utf16le' | 'latin1'\n });\n } else {\n await fs.writeFile(filePath, iconv.encode(text, normalized));\n }\n}\n","import type { Readable } from 'node:stream';\nimport iconv from 'iconv-lite';\nimport fg from 'fast-glob';\nimport { z } from 'zod';\nimport { createTool } from '../registry.js';\nimport type { ToolDefinition } from '../../core/types.js';\nimport {\n detectEncodingFromSample,\n isNativeReadEncoding,\n isFilesystemEncodingSupported,\n normalizeFilesystemEncoding,\n readEncodingSample,\n readFileAsUnicodeString,\n writeFileFromUnicodeString\n} from './filesystem-encoding.js';\n\nconst DEFAULT_READ_LIMIT = 2000;\nconst MAX_LINE_LENGTH = 2000;\nconst MAX_LINE_SUFFIX = `... (line truncated to ${MAX_LINE_LENGTH} chars)`;\nconst MAX_BYTES = 50 * 1024;\nconst MAX_BYTES_LABEL = `${MAX_BYTES / 1024} KB`;\n\n/** Edit loads the full file into memory; reject at or above this size (bytes). */\nconst EDIT_MAX_FILE_BYTES = 1024 ** 3;\n\nfunction detectDominantEol(content: string): '\\r\\n' | '\\n' {\n let crlf = 0;\n for (let i = 0; i < content.length - 1; i++) {\n if (content[i] === '\\r' && content[i + 1] === '\\n') {\n crlf++;\n }\n }\n let nl = 0;\n for (let i = 0; i < content.length; i++) {\n if (content[i] === '\\n') {\n nl++;\n }\n }\n const bareLf = nl - crlf;\n if (crlf > bareLf) {\n return '\\r\\n';\n }\n return '\\n';\n}\n\nfunction normalizeNewStringEols(text: string, eol: '\\r\\n' | '\\n'): string {\n const unified = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (eol === '\\n') {\n return unified;\n }\n return unified.replace(/\\n/g, '\\r\\n');\n}\n\nfunction buildNeedleCandidates(oldString: string, dominantEol: '\\r\\n' | '\\n'): string[] {\n const out: string[] = [oldString];\n if (dominantEol === '\\r\\n') {\n if (!oldString.includes('\\r')) {\n const v = oldString.replace(/\\n/g, '\\r\\n');\n if (v !== oldString) {\n out.push(v);\n }\n }\n } else {\n if (oldString.includes('\\r\\n')) {\n const v = oldString.replace(/\\r\\n/g, '\\n');\n if (v !== oldString) {\n out.push(v);\n }\n } else if (oldString.includes('\\r')) {\n const v = oldString.replace(/\\r/g, '\\n');\n if (v !== oldString) {\n out.push(v);\n }\n }\n }\n return out;\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (needle.length === 0) {\n return 0;\n }\n let n = 0;\n let from = 0;\n let i = 0;\n while ((i = haystack.indexOf(needle, from)) !== -1) {\n n++;\n from = i + needle.length;\n }\n return n;\n}\n\nfunction replaceNonOverlapping(\n content: string,\n needle: string,\n replacement: string,\n replaceAll: boolean\n): string {\n if (!replaceAll) {\n const i = content.indexOf(needle);\n if (i === -1) {\n throw new Error('Edit: needle not found after resolution (internal inconsistency)');\n }\n return content.slice(0, i) + replacement + content.slice(i + needle.length);\n }\n let out = '';\n let from = 0;\n let i = 0;\n while ((i = content.indexOf(needle, from)) !== -1) {\n out += content.slice(from, i) + replacement;\n from = i + needle.length;\n }\n out += content.slice(from);\n return out;\n}\n\n/**\n * Read 工具 - 读取文件内容\n */\nexport const readFileTool = createTool({\n name: 'Read',\n category: 'filesystem',\n description: `Reads human-readable text from the local filesystem: source code, configuration, logs, Markdown, and structured text (JSON, XML, YAML, etc.).\n\nDo NOT use Read for binary formats. This tool decodes the file as text; for binaries the result is garbage or misleading. Examples: images (png, jpg, gif, webp, ico), Office/OpenXML (xlsx, docx, pptx), PDF, audio/video, archives (zip, gz, etc.), and compiled binaries. Prefer format-specific tooling, a small script or library in the user's environment, or ask the user for an exported/plain-text view.\n\nUsage:\n- The file_path parameter must be an absolute path, not a relative path\n- By default, it reads up to 2000 lines starting from the beginning of the file\n- You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters\n- Results are returned using cat -n style, with line numbers starting at 1\n- Lines longer than 2000 characters are truncated\n- Use the offset and limit parameters to read specific line ranges of large files\n- An empty file (no lines) returns successfully with no numbered lines and a suffix noting zero total lines—it is not an error\n- Text encoding is detected automatically from the file (BOM, UTF-8 validity, charset analysis). You rarely need to set encoding; use it only to override detection (e.g. gbk, gb18030, cp936 maps to gbk)`,\n parameters: z.object({\n file_path: z\n .string()\n .describe(\n 'Absolute path to a text or text-decodable source file (not binary formats such as images, xlsx, or pdf).'\n ),\n encoding: z\n .string()\n .optional()\n .describe(\n 'Optional. Omit or use \"auto\" for automatic detection (default). Set only to force a specific encoding (utf8, gbk, gb18030, latin1, etc.; cp936 is treated as gbk).'\n ),\n offset: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe('The line number to start reading from (1-indexed). Only provide if the file is too large to read at once'),\n limit: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe('The number of lines to read. Only provide if the file is too large to read at once')\n }),\n handler: async ({ file_path, encoding, offset, limit }) => {\n try {\n const fs = await import('fs/promises');\n const { createReadStream } = await import('fs');\n const { createInterface } = await import('readline');\n\n const stat = await fs.stat(file_path);\n if (!stat.isFile()) {\n return {\n content: `Error: ${file_path} is not a file`,\n isError: true\n };\n }\n\n const encTrim = encoding?.trim() ?? '';\n const useAuto = encTrim === '' || encTrim.toLowerCase() === 'auto';\n\n let normalized: string;\n let autoDetected = false;\n\n if (useAuto) {\n const sample = await readEncodingSample(file_path, stat.size);\n normalized = detectEncodingFromSample(sample);\n autoDetected = true;\n } else {\n normalized = normalizeFilesystemEncoding(encTrim);\n if (!isFilesystemEncodingSupported(normalized)) {\n return {\n content: `Error: unsupported encoding: ${encTrim}`,\n isError: true\n };\n }\n }\n\n const startLine = offset ? offset - 1 : 0;\n const maxLines = limit ?? DEFAULT_READ_LIMIT;\n\n const toDestroy: Readable[] = [];\n let lineInput: Readable;\n if (isNativeReadEncoding(normalized)) {\n const stream = createReadStream(file_path, {\n encoding: normalized as 'utf8' | 'utf16le' | 'latin1'\n });\n toDestroy.push(stream);\n lineInput = stream;\n } else {\n const raw = createReadStream(file_path);\n const decoded = raw.pipe(iconv.decodeStream(normalized)) as unknown as Readable;\n toDestroy.push(raw, decoded);\n lineInput = decoded;\n }\n\n const rl = createInterface({\n input: lineInput,\n crlfDelay: Infinity\n });\n\n const selectedLines: string[] = [];\n let totalLines = 0;\n let totalBytes = 0;\n let truncatedByBytes = false;\n let hasMoreLines = false;\n\n try {\n for await (const line of rl) {\n totalLines++;\n if (totalLines <= startLine) continue;\n\n if (selectedLines.length >= maxLines) {\n hasMoreLines = true;\n continue;\n }\n\n const processedLine =\n line.length > MAX_LINE_LENGTH\n ? line.substring(0, MAX_LINE_LENGTH) + MAX_LINE_SUFFIX\n : line;\n\n const lineBytes = Buffer.byteLength(processedLine, 'utf-8') + 1;\n if (totalBytes + lineBytes > MAX_BYTES) {\n truncatedByBytes = true;\n hasMoreLines = true;\n break;\n }\n\n selectedLines.push(processedLine);\n totalBytes += lineBytes;\n }\n } finally {\n rl.close();\n for (const s of toDestroy) {\n s.destroy();\n }\n }\n\n if (totalLines < startLine && !(totalLines === 0 && startLine === 0)) {\n return {\n content: `Error: Offset ${offset} is out of range for this file (${totalLines} lines)`,\n isError: true\n };\n }\n\n const numbered = selectedLines\n .map((line, i) => `${String(startLine + i + 1).padStart(5)}\\t${line}`)\n .join('\\n');\n\n const lastReadLine = startLine + selectedLines.length;\n const nextOffset = lastReadLine + 1;\n let suffix: string;\n\n if (truncatedByBytes) {\n suffix = `\\n\\n(Output capped at ${MAX_BYTES_LABEL}. Showing lines ${offset ?? 1}-${lastReadLine}. Use offset=${nextOffset} to continue.)`;\n } else if (hasMoreLines) {\n suffix = `\\n\\n(Showing lines ${offset ?? 1}-${lastReadLine} of ${totalLines}. Use offset=${nextOffset} to continue.)`;\n } else {\n suffix = `\\n\\n(End of file - total ${totalLines} lines)`;\n }\n\n if (autoDetected) {\n suffix += `\\n\\n(Auto-detected encoding: ${normalized}.)`;\n }\n\n return { content: numbered + suffix };\n } catch (error) {\n return {\n content: `Error reading file: ${error instanceof Error ? error.message : String(error)}`,\n isError: true\n };\n }\n }\n});\n\n/**\n * Write 工具 - 写入文件\n */\nexport const writeFileTool = createTool({\n name: 'Write',\n category: 'filesystem',\n description: `Writes a file to the local filesystem.\n\nUsage:\n- This tool will overwrite the existing file if there is one at the provided path\n- If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first\n- Prefer the Edit tool for modifying existing files — it only sends the diff. Only use this tool to create new files or for complete rewrites\n- NEVER create documentation files (*.md) or README files unless explicitly requested by the User\n- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked\n- For non-UTF-8 files (e.g. GBK on Windows), set encoding to match what you use with Read; default is utf8`,\n parameters: z.object({\n file_path: z.string().describe('The absolute path to the file to write (must be absolute, not relative)'),\n content: z.string().describe('The content to write to the file'),\n encoding: z\n .string()\n .optional()\n .describe(\n 'File character encoding. Default utf8. Use gbk or gb18030 for legacy Chinese ANSI text; cp936 is treated as gbk.'\n )\n }),\n handler: async ({ file_path, content, encoding }) => {\n try {\n const fs = await import('fs/promises');\n const pathModule = await import('path');\n\n const normalized = normalizeFilesystemEncoding(encoding);\n if (!isFilesystemEncodingSupported(normalized)) {\n return {\n content: `Error: unsupported encoding: ${encoding?.trim() || 'utf8'}`,\n isError: true\n };\n }\n\n const dir = pathModule.dirname(file_path);\n await fs.mkdir(dir, { recursive: true });\n\n await writeFileFromUnicodeString(file_path, content, normalized);\n return { content: `Successfully wrote to ${file_path}` };\n } catch (error) {\n return {\n content: `Error writing file: ${error instanceof Error ? error.message : String(error)}`,\n isError: true\n };\n }\n }\n});\n\n/**\n * Edit 工具 - 精确编辑文件\n */\nexport const editTool = createTool({\n name: 'Edit',\n category: 'filesystem',\n description: `Performs exact string replacements in files.\n\nUsage:\n- You must use the Read tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file\n- Files at or above 1 GiB cannot be edited with this tool (use another workflow for huge files)\n- When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. The line number prefix format is: line number + tab. Everything after that is the actual file content to match. Never include any part of the line number prefix in the old_string or new_string\n- old_string may use \\\\n line breaks; CRLF files are matched and new_string is rewritten to the file's dominant line ending style (\\\\r\\\\n vs \\\\n)\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required\n- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked\n- The edit will FAIL if old_string is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use replace_all to change every instance of old_string\n- Use replace_all for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance\n- For non-UTF-8 files, set encoding to the same value you used with Read (default is utf8)`,\n parameters: z.object({\n file_path: z.string().describe('The absolute path to the file to modify'),\n old_string: z.string().min(1).describe('The text to replace (non-empty)'),\n new_string: z.string().describe('The text to replace it with (must be different from old_string)'),\n replace_all: z\n .boolean()\n .default(false)\n .describe('Replace all occurrences of old_string (default false)'),\n encoding: z\n .string()\n .optional()\n .describe(\n 'File character encoding. Default utf8. Use gbk or gb18030 for legacy Chinese ANSI text; cp936 is treated as gbk.'\n )\n }),\n handler: async ({ file_path, old_string, new_string, replace_all, encoding }) => {\n try {\n if (old_string === new_string) {\n return {\n content: 'old_string and new_string must be different',\n isError: true\n };\n }\n\n const normalized = normalizeFilesystemEncoding(encoding);\n if (!isFilesystemEncodingSupported(normalized)) {\n return {\n content: `Error: unsupported encoding: ${encoding?.trim() || 'utf8'}`,\n isError: true\n };\n }\n\n const fs = await import('fs/promises');\n const stat = await fs.stat(file_path);\n if (!stat.isFile()) {\n return {\n content: `Error: ${file_path} is not a file`,\n isError: true\n };\n }\n if (stat.size >= EDIT_MAX_FILE_BYTES) {\n return {\n content: `Error: file is too large to edit (${stat.size} bytes). Maximum size is ${EDIT_MAX_FILE_BYTES} bytes (1 GiB). Use a different tool or split the work.`,\n isError: true\n };\n }\n\n const content = await readFileAsUnicodeString(file_path, normalized);\n\n const dominantEol = detectDominantEol(content);\n const candidates = buildNeedleCandidates(old_string, dominantEol);\n let needle: string | null = null;\n for (const c of candidates) {\n if (countOccurrences(content, c) > 0) {\n needle = c;\n break;\n }\n }\n\n if (needle === null) {\n return {\n content: `old_string not found in ${file_path}`,\n isError: true\n };\n }\n\n const occurrences = countOccurrences(content, needle);\n\n if (!replace_all && occurrences > 1) {\n return {\n content: `Found ${occurrences} matches for old_string. Provide more context to make it unique, or set replace_all to true.`,\n isError: true\n };\n }\n\n const normalizedNew = normalizeNewStringEols(new_string, dominantEol);\n const newContent = replaceNonOverlapping(content, needle, normalizedNew, replace_all);\n\n await writeFileFromUnicodeString(file_path, newContent, normalized);\n\n return {\n content: `Successfully edited ${file_path} (${occurrences} replacement${occurrences > 1 ? 's' : ''})`\n };\n } catch (error) {\n return {\n content: `Error editing file: ${error instanceof Error ? error.message : String(error)}`,\n isError: true\n };\n }\n }\n});\n\n/**\n * Glob 工具 - 文件模式匹配\n */\nexport const globTool = createTool({\n name: 'Glob',\n category: 'filesystem',\n description: `- Fast file pattern matching tool that works with any codebase size\n- Supports glob patterns like \"**/*.js\" or \"src/**/*.ts\" (use forward slashes in patterns; works on Windows)\n- Returns matching file paths as absolute paths, sorted by modification time (newest first)\n- Dotfiles and dot-directories are excluded unless the pattern targets them (starts with \".\" or contains \"/.\")\n- Use this tool when you need to find files by name patterns\n- When you are doing an open ended search that may require multiple rounds of globbing and grepping, use the Agent tool instead`,\n parameters: z.object({\n pattern: z.string().describe('The glob pattern to match files against'),\n path: z\n .string()\n .optional()\n .describe('The directory to search in. If omitted, uses the agent working directory when available, otherwise the current process directory. IMPORTANT: Omit this field to use the default directory. Must be a valid directory path if provided.')\n }),\n handler: async ({ pattern, path: searchPath }, context) => {\n try {\n const fs = await import('fs/promises');\n const pathModule = await import('path');\n\n const rootDir = pathModule.resolve(searchPath || context?.projectDir || '.');\n const normalizedPattern = pattern.replace(/\\\\/g, '/');\n const includeDotfiles =\n normalizedPattern.startsWith('.') || normalizedPattern.includes('/.');\n\n const entries = await fg(normalizedPattern, {\n cwd: rootDir,\n onlyFiles: true,\n absolute: true,\n dot: includeDotfiles,\n suppressErrors: true\n });\n\n const matches: Array<{ path: string; mtime: number }> = [];\n for (const filePath of entries) {\n const nativePath = pathModule.normalize(filePath);\n try {\n const stat = await fs.stat(nativePath);\n if (stat.isFile()) {\n matches.push({ path: nativePath, mtime: stat.mtimeMs });\n }\n } catch {\n // Race: removed between glob and stat\n }\n }\n\n matches.sort((a, b) => b.mtime - a.mtime);\n\n return {\n content: matches.length > 0 ? matches.map((m) => m.path).join('\\n') : 'No files found'\n };\n } catch (error) {\n return {\n content: `Error searching files: ${error instanceof Error ? error.message : String(error)}`,\n isError: true\n };\n }\n }\n});\n\n/**\n * 获取所有文件系统工具\n */\nexport function getFileSystemTools(): ToolDefinition[] {\n return [\n readFileTool,\n writeFileTool,\n editTool,\n globTool\n ];\n}\n","import { existsSync } from 'fs';\nimport { execSync } from 'child_process';\nimport { win32 as pathWin32 } from 'node:path';\n\nexport interface EnvironmentInfo {\n cwd: string;\n platform: NodeJS.Platform;\n date: string;\n isGitRepo: boolean;\n shell: string | undefined;\n}\n\n// Cache for shell path to avoid repeated sync calls\nlet cachedShellPath: string | null = null;\n\n/**\n * Find an executable in PATH using 'where' command (Windows only)\n */\nfunction findInPath(executable: string): string | null {\n try {\n const result = execSync(`where ${executable}`, {\n encoding: 'utf-8',\n timeout: 1000\n }).trim().split('\\n')[0];\n return result && existsSync(result) ? result : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve Git Bash from a Git for Windows git.exe path (any drive or parent folder).\n * Handles .../Git/cmd/git.exe, .../Git/bin/git.exe, and deeper mingw layouts.\n */\nfunction findGitBashNextToGitExe(gitExe: string): string | null {\n if (!existsSync(gitExe)) {\n return null;\n }\n const dir = pathWin32.dirname(gitExe);\n const siblingBash = pathWin32.join(dir, 'bash.exe');\n if (existsSync(siblingBash)) {\n return siblingBash;\n }\n let walk = dir;\n for (let i = 0; i < 4; i++) {\n const bashPath = pathWin32.join(walk, 'bin', 'bash.exe');\n if (existsSync(bashPath)) {\n return bashPath;\n }\n const parent = pathWin32.dirname(walk);\n if (parent === walk) {\n break;\n }\n walk = parent;\n }\n return null;\n}\n\nfunction findBashViaGitInstall(): string | null {\n const gitExe = findInPath('git');\n if (!gitExe) {\n return null;\n }\n return findGitBashNextToGitExe(gitExe);\n}\n\n/** Typical Git for Windows locations (C/D/E cover non–system-drive installs). */\nfunction findGitBashInDefaultInstallDirs(): string | null {\n const drives = ['C', 'D', 'E'];\n const relatives = [\n ['Program Files', 'Git', 'bin', 'bash.exe'],\n ['Program Files (x86)', 'Git', 'bin', 'bash.exe']\n ] as const;\n for (const drive of drives) {\n const root = `${drive}:\\\\`;\n for (const parts of relatives) {\n const p = pathWin32.join(root, ...parts);\n if (existsSync(p)) {\n return p;\n }\n }\n }\n return null;\n}\n\n/**\n * Get the shell path with caching to improve performance\n */\nexport function getShellPath(): string {\n // Return cached result if available\n if (cachedShellPath !== null) {\n return cachedShellPath;\n }\n\n if (process.platform === 'win32') {\n // Priority: bash in PATH > Git for Windows (via git.exe) > default install dirs > pwsh > powershell\n const bashPath = findInPath('bash');\n if (bashPath) {\n cachedShellPath = bashPath;\n return bashPath;\n }\n\n const viaGit = findBashViaGitInstall();\n if (viaGit) {\n cachedShellPath = viaGit;\n return viaGit;\n }\n\n const fromDirs = findGitBashInDefaultInstallDirs();\n if (fromDirs) {\n cachedShellPath = fromDirs;\n return fromDirs;\n }\n\n const pwshPath = findInPath('pwsh');\n if (pwshPath) {\n cachedShellPath = 'pwsh';\n return 'pwsh';\n }\n\n cachedShellPath = 'powershell.exe';\n return 'powershell.exe';\n }\n\n // Unix: use SHELL env or fallback to bash\n cachedShellPath = process.env.SHELL || '/bin/bash';\n return cachedShellPath;\n}\n\nexport function getEnvironmentInfo(cwd: string): EnvironmentInfo {\n let isGitRepo = false;\n try {\n execSync('git rev-parse --is-inside-work-tree', {\n cwd,\n stdio: 'pipe',\n timeout: 2000\n });\n isGitRepo = true;\n } catch { /* not a git repo */ }\n\n const shellPath = getShellPath();\n const shell = shellPath.split(/[/\\\\]/).pop()?.replace(/\\.exe$/i, '');\n\n return {\n cwd,\n platform: process.platform,\n date: new Date().toLocaleDateString('en-US', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n }),\n isGitRepo,\n shell\n };\n}\n\nexport function formatEnvironmentSection(info: EnvironmentInfo): string {\n const shellLine = info.shell ? `\\n Shell: ${info.shell}` : '';\n return `\n## Environment\n\n<env>\n Working directory: ${info.cwd}\n Platform: ${info.platform}\n Today's date: ${info.date}\n Is git repo: ${info.isGitRepo ? 'yes' : 'no'}${shellLine}\n</env>`;\n}\n","import { spawn } from 'child_process';\nimport { z } from 'zod';\nimport { createTool } from '../registry.js';\nimport { getShellPath } from '../../core/environment.js';\nimport type { ToolDefinition } from '../../core/types.js';\n\n// Maximum output size (10MB) to prevent memory issues\nconst MAX_OUTPUT_SIZE = 10 * 1024 * 1024;\n// Grace period before SIGKILL after SIGTERM (ms)\nconst KILL_DELAY = 5000;\n\n/**\n * Bash 工具 - 执行 shell 命令\n */\nexport const bashTool = createTool({\n name: 'Bash',\n category: 'shell',\n description: `Executes a given bash command and returns its output.\n\nThe working directory persists between commands, but shell state does not. The shell environment is initialized from the user's profile (bash or zsh).\n\nIMPORTANT: Avoid using this tool to run find, grep, cat, head, tail, sed, awk, or echo commands, unless explicitly instructed or after you have verified that a dedicated tool cannot accomplish your task. Instead, use the appropriate dedicated tool as this will provide a much better experience for the user:\n\n - File search: Use Glob (NOT find or ls)\n - Content search: Use Grep (NOT grep or rg)\n - Read files: Use Read (NOT cat/head/tail)\n - Edit files: Use Edit (NOT sed/awk)\n - Write files: Use Write (NOT echo >file)\n - Communication: Output text directly (NOT echo/printf)\n\n# Instructions\n- If your command will create new directories or files, first use this tool to run ls to verify the parent directory exists and is the correct location\n- Always quote file paths that contain spaces with double quotes in your command (e.g., cd \"path with spaces/file.txt\")\n- If cwd is omitted, the command runs in the agent working directory when available\n- You may specify an optional timeout in milliseconds (up to 600000ms / 10 minutes). By default, your command will timeout after 120000ms (2 minutes).`,\n parameters: z.object({\n command: z.string().describe('The command to execute'),\n description: z\n .string()\n .optional()\n .describe('Clear, concise description of what this command does in active voice. Keep it brief (5-10 words).'),\n cwd: z.string().optional().describe('Working directory for the command'),\n timeout: z\n .number()\n .int()\n .min(1)\n .max(600000)\n .optional()\n .describe('Optional timeout in milliseconds (max 600000)')\n }),\n isDangerous: true,\n handler: async ({ command, description: desc, cwd, timeout }, context) => {\n return new Promise((resolve) => {\n const shellPath = getShellPath();\n let stdout = '';\n let stderr = '';\n let outputTruncated = false;\n const effectiveTimeout = timeout ?? 120000;\n\n const child = spawn(command, [], {\n shell: shellPath,\n cwd: cwd ?? context?.projectDir,\n env: { ...process.env },\n });\n\n const timer = setTimeout(() => {\n // Try SIGTERM first, then SIGKILL if process doesn't exit\n child.kill('SIGTERM');\n\n const killTimer = setTimeout(() => {\n try {\n child.kill('SIGKILL');\n } catch {\n // Process already exited\n }\n }, KILL_DELAY);\n\n // Clean up kill timer if process exits\n child.on('exit', () => clearTimeout(killTimer));\n\n resolve({\n content: `${desc ? `[${desc}]\\n` : ''}Command timed out after ${effectiveTimeout}ms`,\n isError: true\n });\n }, effectiveTimeout);\n\n child.stdout.on('data', (data) => {\n if (!outputTruncated && stdout.length < MAX_OUTPUT_SIZE) {\n stdout += data.toString();\n if (stdout.length >= MAX_OUTPUT_SIZE) {\n stdout += '\\n[Output truncated due to size limit]';\n outputTruncated = true;\n }\n }\n });\n\n child.stderr.on('data', (data) => {\n if (!outputTruncated && stderr.length < MAX_OUTPUT_SIZE) {\n stderr += data.toString();\n if (stderr.length >= MAX_OUTPUT_SIZE) {\n stderr += '\\n[Output truncated due to size limit]';\n outputTruncated = true;\n }\n }\n });\n\n child.on('error', (error) => {\n clearTimeout(timer);\n resolve({\n content: `${desc ? `[${desc}]\\n` : ''}Command failed: ${error.message}`,\n isError: true\n });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n const output: string[] = [];\n if (stdout) output.push(stdout);\n if (stderr) output.push(`STDERR:\\n${stderr}`);\n\n const prefix = desc ? `[${desc}]\\n` : '';\n if (code === 0) {\n resolve({\n content: prefix + (output.join('\\n') || 'Command executed successfully (no output)')\n });\n } else {\n resolve({\n content: `${prefix}Command failed (exit code ${code})\\n${output.join('\\n')}`,\n isError: true\n });\n }\n });\n });\n }\n});\n\n/**\n * 获取所有 Shell 工具\n */\nexport function getShellTools(): ToolDefinition[] {\n return [bashTool];\n}\n","import { z } from 'zod';\nimport fg from 'fast-glob';\nimport ignore from 'ignore';\nimport micromatch from 'micromatch';\nimport { createTool } from '../registry.js';\nimport type { ToolDefinition } from '../../core/types.js';\n\n/** Default cap on number of matching lines returned (each line counts as one match). */\nexport const DEFAULT_GREP_HEAD_LIMIT = 250;\n\n/** Max characters for a single match line in output (match-aware window, see {@link truncateMatchLineForDisplay}). */\nexport const MAX_LINE_LENGTH = 2000;\n\nconst FG_IGNORE = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/build/**',\n '**/__pycache__/**'\n] as const;\n\n/**\n * Shorten a long line for Grep output while keeping the first regex match visible (not a fixed [0, MAX) slice).\n * Context lines (when using `context` > 0) are not passed through this function.\n */\nexport function truncateMatchLineForDisplay(line: string, regex: RegExp): string {\n const max = MAX_LINE_LENGTH;\n if (line.length <= max) {\n return line;\n }\n\n const safeFlags = regex.flags.replace(/g/g, '').replace(/y/g, '');\n const re = new RegExp(regex.source, safeFlags);\n const m = re.exec(line);\n if (!m || m.index === undefined) {\n return line.slice(0, max) + '...';\n }\n\n const matchStart = m.index;\n const matchEnd = m.index + m[0].length;\n const matchLen = matchEnd - matchStart;\n if (matchLen >= max) {\n return m[0].slice(0, max) + '...';\n }\n\n let start = matchStart - Math.floor((max - matchLen) / 2);\n let end = start + max;\n\n if (start < 0) {\n start = 0;\n end = max;\n }\n if (end > line.length) {\n end = line.length;\n start = end - max;\n }\n if (start < 0) {\n start = 0;\n }\n\n if (matchStart < start) {\n start = Math.max(0, matchEnd - max);\n end = Math.min(line.length, start + max);\n }\n if (matchEnd > end) {\n end = line.length;\n start = Math.max(0, end - max);\n }\n\n const slice = line.slice(start, end);\n return (start > 0 ? '...' : '') + slice + (end < line.length ? '...' : '');\n}\n\nexport const grepTool = createTool({\n name: 'Grep',\n category: 'search',\n description: `Search file contents with ECMAScript regular expressions (line-by-line, pure Node.js; does not spawn ripgrep/grep).\n\nUsage:\n- ALWAYS use Grep for search tasks. NEVER invoke grep or rg as a Bash command.\n- Uses JavaScript RegExp semantics (not PCRE/ripgrep); very complex patterns may differ from rg.\n- Filter files with glob (e.g. \"*.js\", \"**/*.{ts,tsx}\"); brace expansion is supported.\n- Root directory search respects a .gitignore file at the search root when present.\n- Long match lines are truncated with a window centered on the match (max ${MAX_LINE_LENGTH} chars).\n- Use the Agent tool for open-ended searches requiring multiple rounds.\n- Output: matching lines with file paths and line numbers`,\n\n parameters: z.object({\n pattern: z.string().describe('The regular expression pattern to search for in file contents'),\n path: z\n .string()\n .optional()\n .describe('File or directory to search in. Defaults to the agent working directory when available, otherwise current process directory.'),\n glob: z\n .string()\n .optional()\n .describe('Glob pattern to filter files (e.g. \"*.js\", \"**/*.{ts,tsx}\")'),\n case_insensitive: z\n .boolean()\n .default(false)\n .describe('Case insensitive search'),\n context: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Number of lines to show before and after each match'),\n head_limit: z\n .number()\n .int()\n .min(1)\n .default(DEFAULT_GREP_HEAD_LIMIT)\n .describe(`Limit to the first N matching lines. Defaults to ${DEFAULT_GREP_HEAD_LIMIT}.`)\n }),\n\n handler: async (\n { pattern, path: searchPath, glob: globParam, case_insensitive, context, head_limit },\n toolContext\n ) => {\n try {\n const fs = await import('fs/promises');\n const pathModule = await import('path');\n\n const projectBase = pathModule.resolve(toolContext?.projectDir ?? process.cwd());\n const rootPathRaw = searchPath || toolContext?.projectDir || '.';\n const resolvedRoot = pathModule.resolve(rootPathRaw);\n\n let stat;\n try {\n stat = await fs.stat(resolvedRoot);\n } catch {\n return {\n content: `Path does not exist: ${rootPathRaw}`,\n isError: true\n };\n }\n\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, case_insensitive ? 'i' : '');\n } catch (e) {\n return {\n content: `Invalid regex pattern: ${e instanceof Error ? e.message : String(e)}`,\n isError: true\n };\n }\n\n let filesToSearch: string[] = [];\n\n if (stat.isFile()) {\n if (globParam) {\n const rel = pathModule.relative(projectBase, resolvedRoot).split(pathModule.sep).join('/');\n if (!micromatch.isMatch(rel, globParam, { posix: true })) {\n return {\n content: 'No matches found (path does not match glob filter)'\n };\n }\n }\n filesToSearch = [resolvedRoot];\n } else {\n const absolutePaths = await fg.glob(globParam ?? '**/*', {\n cwd: resolvedRoot,\n onlyFiles: true,\n dot: false,\n ignore: [...FG_IGNORE],\n absolute: true\n });\n\n let ig: ReturnType<typeof ignore> | null = null;\n try {\n const giContent = await fs.readFile(pathModule.join(resolvedRoot, '.gitignore'), 'utf-8');\n ig = ignore().add(giContent);\n } catch {\n /* no or unreadable root .gitignore */\n }\n\n filesToSearch = absolutePaths.filter((abs) => {\n const rel = pathModule.relative(resolvedRoot, abs).split(pathModule.sep).join('/');\n if (!rel || rel.startsWith('..')) {\n return true;\n }\n return !(ig && ig.ignores(rel));\n });\n }\n\n const results: string[] = [];\n let totalMatches = 0;\n\n for (const filePath of filesToSearch) {\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n const relDisplay = pathModule.relative(resolvedRoot, filePath).split(pathModule.sep).join('/');\n const displayPath = relDisplay || pathModule.basename(filePath);\n\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) {\n totalMatches++;\n\n const matchLineOut = truncateMatchLineForDisplay(lines[i], regex);\n\n if (context > 0) {\n const start = Math.max(0, i - context);\n const end = Math.min(lines.length - 1, i + context);\n\n if (start < i) {\n for (let j = start; j < i; j++) {\n results.push(`${displayPath}:${j + 1}-${lines[j]}`);\n }\n }\n results.push(`${displayPath}:${i + 1}:${matchLineOut}`);\n if (end > i) {\n for (let j = i + 1; j <= end; j++) {\n results.push(`${displayPath}:${j + 1}-${lines[j]}`);\n }\n }\n results.push('--');\n } else {\n results.push(`${displayPath}:${i + 1}:${matchLineOut}`);\n }\n\n if (totalMatches >= head_limit) break;\n }\n }\n\n if (totalMatches >= head_limit) break;\n }\n\n if (results.length === 0) {\n return { content: 'No matches found' };\n }\n\n if (results[results.length - 1] === '--') {\n results.pop();\n }\n\n const output = results.join('\\n');\n const suffix =\n totalMatches >= head_limit\n ? `\\n\\n(Showing first ${head_limit} matches)`\n : `\\n\\n(${totalMatches} matches)`;\n\n return { content: output + suffix };\n } catch (error) {\n return {\n content: `Error searching: ${error instanceof Error ? error.message : String(error)}`,\n isError: true\n };\n }\n }\n});\n\n/**\n * 获取 Grep 工具\n */\nexport function getGrepTools(): ToolDefinition[] {\n return [grepTool];\n}\n","import type { ToolResult } from '../../core/types.js';\n\nexport const TAVILY_SEARCH_URL = 'https://api.tavily.com/search';\n\n/** Aligns with WebFetch timeout scale. */\nexport const TAVILY_SEARCH_TIMEOUT_MS = 30_000;\n\n/** Tavily allows up to 300 include domains per request. */\nexport const TAVILY_MAX_INCLUDE_DOMAINS = 300;\n\n/** Tavily allows up to 150 exclude domains per request. */\nexport const TAVILY_MAX_EXCLUDE_DOMAINS = 150;\n\nconst SEARCH_DEPTHS = new Set(['basic', 'advanced', 'fast', 'ultra-fast']);\n\nexport type TavilySearchDepth = 'basic' | 'advanced' | 'fast' | 'ultra-fast';\n\nexport interface TavilyWebSearchInput {\n query: string;\n allowed_domains?: string[];\n blocked_domains?: string[];\n apiKey: string;\n /** From env or default */\n searchDepth?: TavilySearchDepth;\n maxResults?: number;\n}\n\ninterface TavilySearchResultItem {\n title?: string;\n url?: string;\n content?: string;\n}\n\ninterface TavilySearchResponseBody {\n query?: string;\n results?: TavilySearchResultItem[];\n answer?: string;\n detail?: { error?: string } | string;\n}\n\nfunction parseSearchDepthFromEnv(): TavilySearchDepth {\n const raw = process.env.TAVILY_SEARCH_DEPTH?.trim().toLowerCase();\n if (raw && SEARCH_DEPTHS.has(raw)) {\n return raw as TavilySearchDepth;\n }\n return 'basic';\n}\n\nfunction parseMaxResultsFromEnv(): number {\n const raw = process.env.TAVILY_MAX_RESULTS?.trim();\n if (!raw) {\n return 5;\n }\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1 || n > 20) {\n return 5;\n }\n return n;\n}\n\nfunction truncateDomains(domains: string[] | undefined, max: number): string[] {\n if (!domains?.length) {\n return [];\n }\n return domains.slice(0, max).map((d) => d.trim()).filter(Boolean);\n}\n\n/** Escapes `[` `]` `\\` so link label text does not break `[label](url)` rendering. */\nfunction escapeMarkdownLinkLabel(text: string): string {\n return text.replace(/\\\\/g, '\\\\\\\\').replace(/\\[/g, '\\\\[').replace(/\\]/g, '\\\\]');\n}\n\n/**\n * Formats Tavily `results` into markdown with hyperlinks.\n */\nexport function formatTavilyResultsMarkdown(data: TavilySearchResponseBody): string {\n const lines: string[] = [];\n if (data.answer) {\n lines.push('**Summary**', '', data.answer, '');\n }\n const results = data.results ?? [];\n if (results.length === 0) {\n lines.push('No search results returned.');\n return lines.join('\\n').trim();\n }\n lines.push('**Results**', '');\n for (const r of results) {\n const title = (r.title ?? 'Untitled').trim();\n const url = (r.url ?? '').trim();\n const snippet = (r.content ?? '').trim();\n if (url) {\n lines.push(`- [${escapeMarkdownLinkLabel(title)}](${url})`);\n } else {\n lines.push(`- ${escapeMarkdownLinkLabel(title)}`);\n }\n if (snippet) {\n lines.push(` ${snippet.replace(/\\n+/g, ' ')}`);\n }\n lines.push('');\n }\n return lines.join('\\n').trim();\n}\n\nfunction extractErrorMessage(status: number, body: unknown): string {\n if (body && typeof body === 'object' && 'detail' in body) {\n const detail = (body as { detail?: unknown }).detail;\n if (detail && typeof detail === 'object' && detail !== null && 'error' in detail) {\n const err = (detail as { error?: unknown }).error;\n if (typeof err === 'string') {\n return err;\n }\n }\n if (typeof detail === 'string') {\n return detail;\n }\n if (Array.isArray(detail) && detail.length > 0) {\n const first = detail[0];\n if (first && typeof first === 'object' && first !== null && 'msg' in first) {\n const msg = (first as { msg?: unknown }).msg;\n if (typeof msg === 'string') {\n return msg;\n }\n }\n }\n }\n if (status === 401) {\n return 'Unauthorized: missing or invalid API key.';\n }\n if (status === 429) {\n return 'Rate limit exceeded. Try again later.';\n }\n return `Tavily search failed (HTTP ${status}).`;\n}\n\n/**\n * Calls Tavily Search API and returns markdown for the model or an error result.\n */\nexport async function tavilyWebSearch(input: TavilyWebSearchInput): Promise<ToolResult> {\n const {\n query,\n apiKey,\n allowed_domains,\n blocked_domains,\n searchDepth = parseSearchDepthFromEnv(),\n maxResults = parseMaxResultsFromEnv()\n } = input;\n\n const include_domains = truncateDomains(allowed_domains, TAVILY_MAX_INCLUDE_DOMAINS);\n const exclude_domains = truncateDomains(blocked_domains, TAVILY_MAX_EXCLUDE_DOMAINS);\n\n const body: Record<string, unknown> = {\n api_key: apiKey,\n query,\n search_depth: searchDepth,\n max_results: maxResults,\n include_domains,\n exclude_domains\n };\n\n try {\n const res = await fetch(TAVILY_SEARCH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(TAVILY_SEARCH_TIMEOUT_MS)\n });\n\n const text = await res.text();\n let json: unknown;\n try {\n json = text ? JSON.parse(text) : {};\n } catch {\n return {\n content: `Tavily search failed: invalid JSON response (HTTP ${res.status}).`,\n isError: true\n };\n }\n\n if (!res.ok) {\n const msg = extractErrorMessage(res.status, json);\n return {\n content: `Tavily search error: ${msg}`,\n isError: true\n };\n }\n\n const data = json as TavilySearchResponseBody;\n const markdown = formatTavilyResultsMarkdown(data);\n return { content: markdown };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: `Tavily search failed: ${message}`,\n isError: true\n };\n }\n}\n","import * as dns from 'node:dns';\nimport ipaddr from 'ipaddr.js';\nimport { Readability } from '@mozilla/readability';\nimport { parseHTML } from 'linkedom';\nimport TurndownService from 'turndown';\n\n/** Default request timeout (ms). */\nexport const WEB_FETCH_DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Max response body bytes (stream cap). */\nexport const WEB_FETCH_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;\n\n/** Max characters in returned markdown/text after conversion (second line of defense). */\nexport const WEB_FETCH_MAX_OUTPUT_CHARS = 512_000;\n\n/** Max HTTP redirects when using manual redirect handling. */\nexport const WEB_FETCH_MAX_REDIRECTS = 5;\n\nconst USER_AGENT = 'Agent-SDK-WebFetch/0.1 (+https://github.com/)';\n\nexport type DnsLookupFn = (\n hostname: string,\n options: { all: true; verbatim?: boolean }\n) => Promise<import('node:dns').LookupAddress[]>;\n\nfunction isBlockedAddress(addr: ipaddr.IPv4 | ipaddr.IPv6): boolean {\n if (addr.kind() === 'ipv4') {\n return addr.range() !== 'unicast';\n }\n const v6 = addr as ipaddr.IPv6;\n if (v6.isIPv4MappedAddress()) {\n const v4 = v6.toIPv4Address();\n return v4.range() !== 'unicast';\n }\n return v6.range() !== 'unicast';\n}\n\n/** Returns true if the IP must not be reached (SSRF). Exported for tests. */\nexport function isDangerousIp(ip: string): boolean {\n try {\n if (!ipaddr.isValid(ip)) {\n return true;\n }\n const addr = ipaddr.parse(ip);\n return isBlockedAddress(addr);\n } catch {\n return true;\n }\n}\n\n/** Hostname patterns blocked without DNS (metadata, local, etc.). Exported for tests. */\nexport function isBlockedHostname(hostname: string): boolean {\n const h = hostname.toLowerCase();\n if (h === 'localhost' || h === 'metadata') {\n return true;\n }\n if (h.endsWith('.localhost')) {\n return true;\n }\n if (h === 'metadata.google.internal') {\n return true;\n }\n if (h.endsWith('.internal')) {\n return true;\n }\n if (h.endsWith('.local')) {\n return true;\n }\n return false;\n}\n\n/**\n * Ensures URL scheme is http(s) only.\n */\nexport function assertHttpUrl(url: URL): void {\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`Only http and https URLs are allowed, got: ${url.protocol}`);\n }\n}\n\n/**\n * Resolve hostname and ensure no resolved address is in a forbidden range.\n */\nexport async function assertResolvableHostSafe(\n hostname: string,\n lookup: DnsLookupFn = dns.promises.lookup as DnsLookupFn\n): Promise<void> {\n const results = await lookup(hostname, { all: true, verbatim: true });\n if (!results.length) {\n throw new Error('DNS lookup returned no addresses');\n }\n for (const { address } of results) {\n if (isDangerousIp(address)) {\n throw new Error(`Refused to connect: address \"${address}\" is not a public endpoint`);\n }\n }\n}\n\n/**\n * Full URL check: scheme, hostname blocklist, literal IP or DNS+IP rules.\n */\nexport async function assertUrlSafeForFetch(\n url: URL,\n lookup: DnsLookupFn = dns.promises.lookup as DnsLookupFn\n): Promise<void> {\n assertHttpUrl(url);\n const host = url.hostname;\n if (!host) {\n throw new Error('URL has no hostname');\n }\n if (isBlockedHostname(host)) {\n throw new Error(`Refused to connect: hostname \"${host}\" is blocked`);\n }\n if (ipaddr.isValid(host)) {\n if (isDangerousIp(host)) {\n throw new Error(`Refused to connect: address \"${host}\" is not a public endpoint`);\n }\n return;\n }\n await assertResolvableHostSafe(host, lookup);\n}\n\nexport interface ReadBodyResult {\n text: string;\n truncated: boolean;\n}\n\n/**\n * Read response body up to maxBytes UTF-8; tracks truncation.\n */\nexport async function readResponseBodyWithCap(\n response: Response,\n maxBytes: number\n): Promise<ReadBodyResult> {\n const cl = response.headers.get('content-length');\n if (cl !== null && cl !== '') {\n const n = Number.parseInt(cl, 10);\n if (Number.isFinite(n) && n > maxBytes) {\n throw new Error(`Response too large (Content-Length: ${n} bytes, max ${maxBytes})`);\n }\n }\n\n if (!response.body) {\n const buf = new Uint8Array(await response.arrayBuffer());\n return decodeWithCap(buf, maxBytes);\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n let truncated = false;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (!value || value.length === 0) {\n continue;\n }\n if (total + value.length <= maxBytes) {\n chunks.push(value);\n total += value.length;\n } else {\n const rest = maxBytes - total;\n if (rest > 0) {\n chunks.push(value.slice(0, rest));\n total += rest;\n }\n truncated = true;\n await reader.cancel();\n break;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const merged = mergeChunks(chunks, total);\n const dec = decodeWithCap(merged, maxBytes);\n return { text: dec.text, truncated: dec.truncated || truncated };\n}\n\nfunction mergeChunks(chunks: Uint8Array[], total: number): Uint8Array {\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.length;\n }\n return out;\n}\n\nfunction decodeWithCap(buf: Uint8Array, maxBytes: number): ReadBodyResult {\n const truncated = buf.length >= maxBytes;\n const decoder = new TextDecoder('utf-8', { fatal: false });\n return { text: decoder.decode(buf), truncated };\n}\n\nfunction primaryMimeType(contentType: string | null): string {\n if (!contentType) {\n return '';\n }\n return contentType.split(';')[0]?.trim().toLowerCase() ?? '';\n}\n\n/**\n * Convert HTML to markdown via Readability + Turndown. If Readability yields nothing, falls back to body HTML.\n * Stronger compatibility can use jsdom instead of linkedom (heavier).\n */\nexport function htmlToMarkdown(html: string): string {\n const { document } = parseHTML(html);\n const reader = new Readability(document);\n const article = reader.parse();\n let htmlContent = article?.content?.trim() ?? '';\n if (!htmlContent && document.body) {\n htmlContent = document.body.innerHTML ?? '';\n }\n if (!htmlContent) {\n return '';\n }\n const turndown = new TurndownService({\n headingStyle: 'atx',\n codeBlockStyle: 'fenced'\n });\n return turndown.turndown(htmlContent).trim();\n}\n\nfunction truncateOutput(text: string, maxChars: number): string {\n if (text.length <= maxChars) {\n return text;\n }\n return `${text.slice(0, maxChars)}\\n\\n[Output truncated to ${maxChars} characters]`;\n}\n\nfunction formatJsonText(raw: string): string {\n try {\n const v = JSON.parse(raw) as unknown;\n return JSON.stringify(v, null, 2);\n } catch {\n return raw;\n }\n}\n\nexport interface WebFetchContentOptions {\n timeoutMs?: number;\n maxResponseBytes?: number;\n maxOutputChars?: number;\n maxRedirects?: number;\n /** Test-only DNS override */\n dnsLookup?: DnsLookupFn;\n}\n\n/**\n * Fetches a URL with SSRF checks, redirect re-validation, timeout, and size limits.\n * Returns markdown or plain text suitable for model context.\n */\nexport async function fetchUrlToReadableContent(\n urlString: string,\n options: WebFetchContentOptions = {}\n): Promise<{ content: string; isError: boolean }> {\n const timeoutMs = options.timeoutMs ?? WEB_FETCH_DEFAULT_TIMEOUT_MS;\n const maxResponseBytes = options.maxResponseBytes ?? WEB_FETCH_MAX_RESPONSE_BYTES;\n const maxOutputChars = options.maxOutputChars ?? WEB_FETCH_MAX_OUTPUT_CHARS;\n const maxRedirects = options.maxRedirects ?? WEB_FETCH_MAX_REDIRECTS;\n const lookup = options.dnsLookup ?? (dns.promises.lookup as DnsLookupFn);\n\n let currentUrl: URL;\n try {\n currentUrl = new URL(urlString);\n } catch {\n return { content: 'Invalid URL', isError: true };\n }\n\n try {\n let redirectCount = 0;\n for (;;) {\n await assertUrlSafeForFetch(currentUrl, lookup);\n\n const response = await fetch(currentUrl, {\n method: 'GET',\n redirect: 'manual',\n signal: AbortSignal.timeout(timeoutMs),\n headers: {\n Accept: 'text/html,application/json,text/plain;q=0.9,*/*;q=0.8',\n 'User-Agent': USER_AGENT\n }\n });\n\n const status = response.status;\n if (status >= 300 && status < 400) {\n const loc = response.headers.get('location');\n if (!loc || redirectCount >= maxRedirects) {\n return {\n content: loc\n ? `Too many redirects or missing Location (HTTP ${status})`\n : `Redirect without Location (HTTP ${status})`,\n isError: true\n };\n }\n redirectCount++;\n currentUrl = new URL(loc, currentUrl);\n continue;\n }\n\n if (!response.ok) {\n return {\n content: `Failed to fetch: ${status} ${response.statusText}`,\n isError: true\n };\n }\n\n const mime = primaryMimeType(response.headers.get('content-type'));\n const { text: rawText, truncated: bodyTruncated } = await readResponseBodyWithCap(\n response,\n maxResponseBytes\n );\n\n let content: string;\n if (mime.includes('html') || mime === '' || mime === 'application/xhtml+xml') {\n content = htmlToMarkdown(rawText);\n } else if (mime.includes('json') || mime.endsWith('+json')) {\n content = formatJsonText(rawText);\n } else {\n content = rawText;\n }\n\n if (bodyTruncated) {\n content = `${content}\\n\\n[Response body truncated at ${maxResponseBytes} bytes]`;\n }\n\n content = truncateOutput(content, maxOutputChars);\n return { content, isError: false };\n }\n } catch (error) {\n return {\n content: `Error fetching webpage: ${formatNetworkError(error)}`,\n isError: true\n };\n }\n}\n\n/** Includes undici/Node `fetch` nested causes (e.g. ECONNRESET) — `error.message` alone is often just \"fetch failed\". */\nfunction formatNetworkError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error);\n }\n const parts: string[] = [error.message];\n let cursor: unknown = error.cause;\n let depth = 0;\n while (cursor instanceof Error && depth < 4) {\n parts.push(cursor.message);\n cursor = cursor.cause;\n depth++;\n }\n if (typeof cursor === 'object' && cursor !== null && 'code' in cursor) {\n const code = (cursor as { code?: string }).code;\n if (code && !parts.join(' ').includes(code)) {\n parts.push(`code=${code}`);\n }\n }\n return parts.join(' — ');\n}\n","import { z } from 'zod';\nimport { createTool } from '../registry.js';\nimport type { ToolDefinition } from '../../core/types.js';\nimport { tavilyWebSearch } from './tavily-search.js';\nimport { fetchUrlToReadableContent } from './web-fetch.js';\n\n/**\n * WebFetch 工具 - 获取网页内容\n */\nexport const webFetchTool = createTool({\n name: 'WebFetch',\n category: 'web',\n description: `Fetches public http(s) URLs and returns readable markdown (HTML), formatted JSON, or plain text.\n\nLimits and behavior:\n- Only http:// and https:// are allowed; private IPs, loopback, link-local, and common metadata/local hostnames are blocked (SSRF protection).\n- Requests time out, responses are size-capped, and very long markdown may be truncated before return.\n- If the result exceeds the direct context limit, the full text is saved under your user tool-outputs directory; the tool response will include the file path—use **Read** with offset and limit parameters to page through it (same pattern as large shell output).\n- Authenticated or private pages usually cannot be fetched; prefer specialized MCP tools when available.\n- Use https URLs directly when possible (no automatic http→https upgrade).\n- For GitHub URLs, prefer the gh CLI via Bash when appropriate (e.g., gh pr view, gh api).`,\n parameters: z.object({\n url: z.string().describe('The URL to fetch content from')\n }),\n handler: async ({ url }) => {\n const result = await fetchUrlToReadableContent(url);\n return result.isError\n ? { content: result.content, isError: true }\n : { content: result.content };\n }\n});\n\n/**\n * WebSearch 工具 - 网络搜索\n */\nexport const webSearchTool = createTool({\n name: 'WebSearch',\n category: 'web',\n description: `- Allows searching the web and use the results to inform responses\n- Provides up-to-date information for current events and recent data\n- Returns search result information with links as markdown hyperlinks\n- Use this tool for accessing information beyond the knowledge cutoff\n- When \\`TAVILY_API_KEY\\` is set, uses the Tavily Search API; otherwise returns a configuration message`,\n parameters: z.object({\n query: z.string().min(2).describe('The search query to use'),\n allowed_domains: z\n .array(z.string())\n .optional()\n .describe('Only include search results from these domains'),\n blocked_domains: z\n .array(z.string())\n .optional()\n .describe('Never include search results from these domains')\n }),\n handler: async ({ query, allowed_domains, blocked_domains }) => {\n const apiKey = process.env.TAVILY_API_KEY?.trim();\n if (!apiKey) {\n return {\n content: `Web search is not configured. Set the TAVILY_API_KEY environment variable to enable Tavily Search, or register a custom WebSearch tool with another provider. Query was: \"${query}\"`,\n isError: true\n };\n }\n return tavilyWebSearch({\n query,\n apiKey,\n allowed_domains,\n blocked_domains\n });\n }\n});\n\n/**\n * 获取所有 Web 工具\n */\nexport function getWebTools(): ToolDefinition[] {\n return [webFetchTool, webSearchTool];\n}\n","import { z } from 'zod';\nimport { createTool } from '../registry.js';\nimport type { ToolDefinition } from '../../core/types.js';\n\ninterface Task {\n id: string;\n subject: string;\n description: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm?: string;\n}\n\n// In-memory task store\nconst tasks: Map<string, Task> = new Map();\nlet nextId = 1;\n\n/**\n * TaskCreate 工具 - 创建任务\n */\nexport const taskCreateTool = createTool({\n name: 'TaskCreate',\n category: 'planning',\n description: `Use this tool to create a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n\n## When to Use This Tool\n\n- Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n- Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n- User explicitly requests todo list - When the user directly asks you to use the task list\n- User provides multiple tasks - When users provide a list of things to be done\n\n## When NOT to Use\n\n- There is only a single, straightforward task\n- The task is trivial and tracking it provides no organizational benefit\n- The task can be completed in less than 3 trivial steps\n\nAll tasks are created with status pending.`,\n parameters: z.object({\n subject: z.string().describe('A brief title for the task'),\n description: z.string().describe('What needs to be done'),\n activeForm: z\n .string()\n .optional()\n .describe('Present continuous form shown in spinner when in_progress (e.g., \"Running tests\")')\n }),\n handler: async ({ subject, description, activeForm }) => {\n const id = String(nextId++);\n const task: Task = {\n id,\n subject,\n description,\n status: 'pending',\n ...(activeForm && { activeForm })\n };\n tasks.set(id, task);\n\n return {\n content: `Task created [${id}]: ${subject}`,\n metadata: { task }\n };\n }\n});\n\n/**\n * TaskUpdate 工具 - 更新任务\n */\nexport const taskUpdateTool = createTool({\n name: 'TaskUpdate',\n category: 'planning',\n description: `Use this tool to update a task in the task list.\n\n## When to Use This Tool\n\n**Mark tasks as completed:**\n- When you have completed the work described in a task\n- IMPORTANT: Always mark your assigned tasks as completed when you finish them\n\n**Delete tasks:**\n- When a task is no longer relevant or was created in error\n\n## Status Workflow\n\nStatus progresses: pending → in_progress → completed`,\n parameters: z.object({\n taskId: z.string().describe('The ID of the task to update'),\n status: z\n .enum(['pending', 'in_progress', 'completed', 'deleted'])\n .optional()\n .describe('New status for the task'),\n subject: z.string().optional().describe('New subject for the task'),\n description: z.string().optional().describe('New description for the task'),\n activeForm: z\n .string()\n .optional()\n .describe('Present continuous form shown in spinner when in_progress')\n }),\n handler: async ({ taskId, status, subject, description, activeForm }) => {\n const task = tasks.get(taskId);\n if (!task) {\n return {\n content: `Task ${taskId} not found`,\n isError: true\n };\n }\n\n if (status === 'deleted') {\n tasks.delete(taskId);\n return { content: `Task ${taskId} deleted` };\n }\n\n if (status) task.status = status;\n if (subject) task.subject = subject;\n if (description) task.description = description;\n if (activeForm) task.activeForm = activeForm;\n\n const icon = task.status === 'completed' ? 'x' : task.status === 'in_progress' ? '>' : ' ';\n return {\n content: `Task [${taskId}] updated: [${icon}] ${task.subject}`,\n metadata: { task }\n };\n }\n});\n\n/**\n * TaskList 工具 - 列出所有任务\n */\nexport const taskListTool = createTool({\n name: 'TaskList',\n category: 'planning',\n description: `Use this tool to list all tasks in the task list.\n\n## Output\n\nReturns a summary of each task:\n- id: Task identifier (use with TaskUpdate)\n- subject: Brief description of the task\n- status: pending, in_progress, or completed`,\n parameters: z.object({}),\n handler: async () => {\n if (tasks.size === 0) {\n return { content: 'No tasks in the list.' };\n }\n\n const lines: string[] = [];\n for (const [, task] of tasks) {\n const icon = task.status === 'completed' ? 'x' : task.status === 'in_progress' ? '>' : ' ';\n lines.push(`[${icon}] [${task.id}] ${task.subject}`);\n }\n\n const pending = [...tasks.values()].filter(t => t.status === 'pending').length;\n const inProgress = [...tasks.values()].filter(t => t.status === 'in_progress').length;\n const completed = [...tasks.values()].filter(t => t.status === 'completed').length;\n\n return {\n content: `Tasks (${completed} completed, ${inProgress} in progress, ${pending} pending):\\n\\n${lines.join('\\n')}`\n };\n }\n});\n\n/**\n * 获取所有 Task 工具\n */\nexport function getTaskTools(): ToolDefinition[] {\n return [taskCreateTool, taskUpdateTool, taskListTool];\n}\n","import { z } from 'zod';\nimport { createTool } from '../registry.js';\nimport type { ToolDefinition } from '../../core/types.js';\n\nconst questionsSchema = z.object({\n questions: z\n .array(\n z.object({\n question: z\n .string()\n .describe(\n 'The complete question to ask the user. Should be clear, specific, and end with a question mark.'\n ),\n header: z.string().describe('Very short label displayed as a chip/tag (max 30 chars).'),\n options: z\n .array(\n z.object({\n label: z.string().describe('The display text for this option. Should be concise (1-5 words).'),\n description: z\n .string()\n .describe('Explanation of what this option means or what will happen if chosen.')\n })\n )\n .min(2)\n .max(4)\n .describe('The available choices for this question. Must have 2-4 options.'),\n multiSelect: z\n .boolean()\n .default(false)\n .describe('Set to true to allow the user to select multiple options.')\n })\n )\n .min(1)\n .max(4)\n .describe('Questions to ask the user (1-4 questions)')\n});\n\nexport type AskUserQuestionItem = z.infer<typeof questionsSchema>['questions'][number];\n\nexport type AskUserQuestionAnswer = {\n questionIndex: number;\n selectedLabels: string[];\n otherText?: string;\n};\n\n/**\n * Host-provided implementation: CLI (TTY), web UI (WebSocket), tests, etc.\n */\nexport type AskUserQuestionResolver = (\n questions: AskUserQuestionItem[]\n) => Promise<AskUserQuestionAnswer[]>;\n\n/**\n * Format questions for display (static fallback body).\n */\nexport function formatAskUserQuestionPrompt(questions: AskUserQuestionItem[]): string {\n const lines: string[] = [];\n for (const q of questions) {\n lines.push(`[${q.header}] ${q.question}\\n`);\n q.options.forEach((opt, i) => {\n lines.push(` ${i + 1}. ${opt.label} — ${opt.description}`);\n });\n if (q.multiSelect) {\n lines.push('\\n(Select one or more options)');\n } else {\n lines.push('\\n(Select one option)');\n }\n lines.push('');\n }\n return lines.join('\\n');\n}\n\nexport function formatAnswerSummary(questions: AskUserQuestionItem[], answers: AskUserQuestionAnswer[]): string {\n const lines: string[] = ['', '--- User responses ---'];\n for (const a of answers) {\n const q = questions[a.questionIndex];\n if (a.otherText !== undefined) {\n lines.push(\n `[${q.header}] Other: ${a.otherText.trim() === '' ? '(empty)' : a.otherText}`\n );\n } else if (a.selectedLabels.length > 0) {\n lines.push(`[${q.header}] ${a.selectedLabels.join(', ')}`);\n } else {\n lines.push(`[${q.header}] (no selection)`);\n }\n }\n return lines.join('\\n');\n}\n\nexport interface CreateAskUserQuestionToolOptions {\n /**\n * When set, collects answers interactively. When omitted, the tool returns only formatted questions (non-blocking).\n */\n resolve?: AskUserQuestionResolver;\n}\n\n/**\n * AskUserQuestion — interactive behavior is entirely determined by {@link CreateAskUserQuestionToolOptions.resolve}.\n */\nexport function createAskUserQuestionTool(options?: CreateAskUserQuestionToolOptions): ToolDefinition {\n const resolve = options?.resolve;\n\n return createTool({\n name: 'AskUserQuestion',\n category: 'interaction',\n description: `Use this tool when you need to ask the user questions during execution. This allows you to:\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Offer choices to the user about what direction to take.\n\nThe host application must provide a resolver that collects answers; without it, only the question text is returned.\n\nUsage notes:\n- Users will always be able to select \"Other\" to provide custom text input\n- Use multiSelect: true to allow multiple answers to be selected for a question\n- If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label`,\n parameters: questionsSchema,\n handler: async ({ questions }) => {\n const promptText = formatAskUserQuestionPrompt(questions);\n\n if (!resolve) {\n return {\n content: promptText,\n metadata: { questions }\n };\n }\n\n let answers: AskUserQuestionAnswer[];\n try {\n answers = await resolve(questions);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return {\n content: `AskUserQuestion failed: ${msg}`,\n isError: true,\n metadata: { questions }\n };\n }\n\n const summary = formatAnswerSummary(questions, answers);\n return {\n content: promptText + summary,\n metadata: { questions, answers }\n };\n }\n });\n}\n\nexport const questionTool = createAskUserQuestionTool();\n\n/**\n * Interaction tools (AskUserQuestion).\n */\nexport function getInteractionTools(options?: CreateAskUserQuestionToolOptions): ToolDefinition[] {\n return [createAskUserQuestionTool(options)];\n}\n","import { z } from 'zod';\nimport { createTool } from '../registry.js';\nimport type { SkillRegistry } from '../../skills/registry.js';\n\n/**\n * 创建 Skill 工具\n */\nexport function createSkillTool(skillRegistry: SkillRegistry) {\n return createTool({\n name: 'Skill',\n category: 'skills',\n description: `Execute a skill within the main conversation.\n\nWhen users ask you to perform tasks, check if any of the available skills match. Skills provide specialized capabilities and domain knowledge.\n\nHow to invoke:\n- Use this tool with the skill name and optional arguments\n- Available skills are listed in system-reminder messages in the conversation\n- When a skill matches the user's request, invoke the relevant Skill tool BEFORE generating any other response about the task\n- Do not invoke a skill that is already running`,\n parameters: z.object({\n skill: z.string().describe('The skill name. E.g., \"commit\", \"review-pr\", or \"pdf\"'),\n args: z.string().optional().describe('Optional arguments for the skill')\n }),\n handler: async ({ skill: skillName }) => {\n try {\n if (!skillRegistry.has(skillName)) {\n const available = skillRegistry.getMetadataList();\n const availableList = available.length > 0\n ? available.map(s => `- ${s.name}: ${s.description}`).join('\\n')\n : 'No skills available.';\n\n return {\n content: `Skill \"${skillName}\" not found.\\n\\nAvailable skills:\\n${availableList}`,\n isError: true\n };\n }\n\n const fullContent = await skillRegistry.loadFullContent(skillName);\n const skill = skillRegistry.get(skillName);\n\n const sections: string[] = [];\n sections.push(`# Skill: ${skill?.metadata.name || skillName}`);\n sections.push(`Description: ${skill?.metadata.description || ''}`);\n sections.push(`Base Path: ${skill?.path || ''}`);\n sections.push('');\n sections.push('---');\n sections.push('');\n sections.push(fullContent);\n\n return {\n content: sections.join('\\n')\n };\n } catch (error) {\n return {\n content: `Error activating skill \"${skillName}\": ${error instanceof Error ? error.message : String(error)}`,\n isError: true\n };\n }\n }\n });\n}\n\n/**\n * 获取 Skill 相关工具\n */\nexport function getSkillTools(skillRegistry: SkillRegistry) {\n return [createSkillTool(skillRegistry)];\n}\n","import { z } from 'zod';\nimport { createTool } from '../registry.js';\nimport type { ToolDefinition, ToolExecutionContext, ToolResult } from '../../core/types.js';\n\nexport const subagentRequestSchema = z.object({\n prompt: z.string().min(1).describe('Task prompt for the subagent. Include all required context.'),\n description: z\n .string()\n .optional()\n .describe('Short 3-5 words task label for logs and metadata.'),\n subagent_type: z\n .enum(['general-purpose', 'explore'])\n .default('general-purpose')\n .describe('Subagent profile/type to use.'),\n allowed_tools: z\n .array(z.string().min(1))\n .optional()\n .describe('Optional allowlist of tool names for the subagent.'),\n max_iterations: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe('Maximum reasoning iterations for the subagent.'),\n timeout_ms: z\n .number()\n .int()\n .min(1000)\n .optional()\n .describe('Timeout for this subagent run in milliseconds.'),\n system_prompt: z\n .string()\n .optional()\n .describe('Optional system prompt appended for the subagent run.')\n});\n\nexport type SubagentRequest = z.infer<typeof subagentRequestSchema>;\n\nexport interface SubagentRunner {\n (request: SubagentRequest, context?: ToolExecutionContext): Promise<ToolResult>;\n}\n\nexport interface CreateAgentToolOptions {\n runner: SubagentRunner;\n}\n\n/**\n * Agent tool - delegates a task to a dedicated subagent run.\n */\nexport function createAgentTool(options: CreateAgentToolOptions): ToolDefinition {\n return createTool({\n name: 'Agent',\n category: 'planning',\n description: `Launch a new subagent to handle complex, multi-step tasks autonomously.\n\nThe Agent tool delegates work to a dedicated subagent that runs in isolated context and returns a final result back to the parent agent.\n\nUse this tool when:\n- The task requires broader exploration or multi-step research\n- You want to keep the parent context focused and concise\n- You need a specific subagent profile (for example, explore vs general-purpose)\n\nWhen NOT to use this tool:\n- Reading a known file path (use Read directly)\n- Simple symbol or text lookup (use Grep/Glob directly)\n- Small scoped changes in 1-3 files that do not benefit from delegation\n\nUsage notes:\n- Always pass a short description and a complete prompt with all required context\n- Use subagent_type to select behavior; default is general-purpose\n- Subagents do not inherit parent conversation history, only the prompt you provide\n- Subagents cannot spawn other subagents (no nested Agent calls)`,\n parameters: subagentRequestSchema,\n handler: async (args, context) => {\n return options.runner(args as SubagentRequest, context);\n }\n });\n}\n\nexport const agentTool = createAgentTool({\n runner: async () => ({\n content: 'Agent tool runner is not configured in this runtime',\n isError: true\n })\n});\n\nexport function getSubagentTools(): ToolDefinition[] {\n return [agentTool];\n}\n\n","// Built-in tools\nexport * from './filesystem.js';\nexport * from './shell.js';\nexport * from './grep.js';\nexport * from './web.js';\nexport * from './task.js';\nexport * from './interaction.js';\nexport * from './skill-activation.js';\nexport * from './subagent.js';\n\nimport type { ToolDefinition } from '../../core/types.js';\nimport type { SkillRegistry } from '../../skills/registry.js';\nimport { getFileSystemTools } from './filesystem.js';\nimport { getShellTools } from './shell.js';\nimport { getGrepTools } from './grep.js';\nimport { getWebTools } from './web.js';\nimport { getTaskTools } from './task.js';\nimport { getInteractionTools, type CreateAskUserQuestionToolOptions } from './interaction.js';\nimport { getSkillTools } from './skill-activation.js';\nimport { getSubagentTools } from './subagent.js';\n\n/**\n * 获取所有内置工具\n * @param skillRegistry - Skill注册中心,用于激活skill工具\n * @param interactionOptions - 可选:AskUserQuestion 的 {@link CreateAskUserQuestionToolOptions}\n */\nexport function getAllBuiltinTools(\n skillRegistry: SkillRegistry,\n interactionOptions?: CreateAskUserQuestionToolOptions\n): ToolDefinition[] {\n return [\n ...getFileSystemTools(),\n ...getShellTools(),\n ...getGrepTools(),\n ...getWebTools(),\n ...getTaskTools(),\n ...getInteractionTools(interactionOptions),\n ...getSubagentTools(),\n ...getSkillTools(skillRegistry)\n ];\n}\n\n/**\n * 获取安全的内置工具 (不含危险操作)\n * @param skillRegistry - Skill注册中心,用于激活skill工具\n * @param interactionOptions - 可选:AskUserQuestion 的 {@link CreateAskUserQuestionToolOptions}\n */\nexport function getSafeBuiltinTools(\n skillRegistry: SkillRegistry,\n interactionOptions?: CreateAskUserQuestionToolOptions\n): ToolDefinition[] {\n return getAllBuiltinTools(skillRegistry, interactionOptions).filter((tool) => !tool.isDangerous);\n}\n","import { readFile } from 'fs/promises';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { HookEventType, HooksSettings, HooksSettingsFile } from './types.js';\n\nconst EVENT_JSON_TO_RUNTIME: Record<string, HookEventType> = {\n PreToolUse: 'preToolUse',\n PostToolUse: 'postToolUse',\n PostToolUseFailure: 'postToolUseFailure'\n};\n\nfunction emptyHooksSettings(): HooksSettings {\n return {\n hooks: {\n preToolUse: [],\n postToolUse: [],\n postToolUseFailure: []\n }\n };\n}\n\n/**\n * 将磁盘 settings.json 转为内部 HooksSettings(PascalCase → HookEventType)\n */\nexport function parseHooksSettingsFile(raw: unknown): HooksSettings {\n if (!raw || typeof raw !== 'object') {\n return emptyHooksSettings();\n }\n\n const file = raw as HooksSettingsFile;\n const base = emptyHooksSettings();\n base.disableAllHooks = file.disableAllHooks;\n\n if (!file.hooks || typeof file.hooks !== 'object') {\n return base;\n }\n\n for (const [jsonKey, eventType] of Object.entries(EVENT_JSON_TO_RUNTIME)) {\n const groups = (file.hooks as Record<string, unknown>)[jsonKey];\n if (!Array.isArray(groups)) continue;\n\n for (const g of groups) {\n if (!g || typeof g !== 'object') continue;\n const group = g as { matcher?: string; hooks?: unknown };\n const hookList = Array.isArray(group.hooks) ? group.hooks : [];\n const normalized: typeof base.hooks.preToolUse[0] = {\n matcher: typeof group.matcher === 'string' ? group.matcher : undefined,\n hooks: []\n };\n\n for (const h of hookList) {\n if (!h || typeof h !== 'object') continue;\n const c = h as Record<string, unknown>;\n if (c.type !== 'command' || typeof c.command !== 'string') continue;\n normalized.hooks.push({\n id: typeof c.id === 'string' ? c.id : undefined,\n type: 'command',\n command: c.command,\n timeout: typeof c.timeout === 'number' ? c.timeout : undefined,\n async: typeof c.async === 'boolean' ? c.async : undefined\n });\n }\n\n if (normalized.hooks.length > 0) {\n base.hooks[eventType].push(normalized);\n }\n }\n }\n\n return base;\n}\n\n/**\n * 读取并解析项目级 `.claude/settings.json`\n */\nexport async function loadHooksSettingsFromProject(projectDir: string): Promise<HooksSettings> {\n const path = join(projectDir, '.claude', 'settings.json');\n try {\n const text = await readFile(path, 'utf-8');\n const json = JSON.parse(text) as unknown;\n return parseHooksSettingsFile(json);\n } catch {\n return emptyHooksSettings();\n }\n}\n\n/**\n * 读取并解析用户级 `~/.claude/settings.json`\n */\nexport async function loadHooksSettingsFromUser(): Promise<HooksSettings> {\n const path = join(homedir(), '.claude', 'settings.json');\n try {\n const text = await readFile(path, 'utf-8');\n const json = JSON.parse(text) as unknown;\n return parseHooksSettingsFile(json);\n } catch {\n return emptyHooksSettings();\n }\n}\n","import { spawn } from 'child_process';\nimport { loadHooksSettingsFromProject, loadHooksSettingsFromUser } from './loader.js';\nimport type {\n CommandHookConfig,\n FunctionHook,\n HookCommandStdin,\n HookContext,\n HookEventType,\n HookGroupConfig,\n HookResult,\n HooksSettings\n} from './types.js';\n\n/** 扁平化的文件 command hook(含 matcher) */\nexport interface FlatCommandHookEntry {\n matcher?: string;\n hook: CommandHookConfig;\n}\n\nfunction emptyHooksRecord(): Record<HookEventType, HookGroupConfig[]> {\n return {\n preToolUse: [],\n postToolUse: [],\n postToolUseFailure: []\n };\n}\n\n/**\n * matcher 为 JavaScript 正则源码(不含定界符)\n */\nexport function matchTool(toolName: string, matcher?: string): boolean {\n if (!matcher || matcher === '*') return true;\n try {\n return new RegExp(matcher).test(toolName);\n } catch {\n return false;\n }\n}\n\nfunction toUpperSnake(paramName: string): string {\n return paramName\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n}\n\nexport function buildHookEnv(context: HookContext): NodeJS.ProcessEnv {\n const env = { ...process.env } as NodeJS.ProcessEnv;\n env.CLAUDE_TOOL_NAME = context.toolName;\n if (context.toolCallId) env.CLAUDE_TOOL_CALL_ID = context.toolCallId;\n if (context.projectDir) env.CLAUDE_PROJECT_DIR = context.projectDir;\n env.CLAUDE_HOOK_EVENT = context.eventType;\n for (const [k, v] of Object.entries(context.toolInput)) {\n const key = `CLAUDE_TOOL_INPUT_${toUpperSnake(k)}`;\n env[key] = typeof v === 'string' ? v : JSON.stringify(v);\n }\n return env;\n}\n\nfunction buildStdinPayload(context: HookContext): HookCommandStdin {\n const payload: HookCommandStdin = {\n hook_event: context.eventType,\n tool_name: context.toolName,\n tool_input: context.toolInput\n };\n if (context.toolCallId) payload.tool_call_id = context.toolCallId;\n if (context.projectDir) payload.project_dir = context.projectDir;\n if (context.toolResultRaw) {\n payload.tool_result_raw = {\n content: context.toolResultRaw.content,\n isError: context.toolResultRaw.isError\n };\n }\n if (context.toolResultFinal) {\n payload.tool_result_final = {\n content: context.toolResultFinal.content,\n isError: context.toolResultFinal.isError\n };\n }\n if (context.errorMessage) payload.error_message = context.errorMessage;\n if (context.failureKind) payload.failure_kind = context.failureKind;\n return payload;\n}\n\n/**\n * 将 HookGroup[] 展开为带 matcher 的条目列表(保持组内顺序)\n */\nfunction flattenGroups(groups: HookGroupConfig[]): FlatCommandHookEntry[] {\n const out: FlatCommandHookEntry[] = [];\n for (const g of groups) {\n for (const hook of g.hooks) {\n out.push({ matcher: g.matcher, hook });\n }\n }\n return out;\n}\n\n/**\n * 合并项目层与用户层 command hook(§6.3)\n */\nexport function mergeCommandHookLayers(\n project: HookGroupConfig[],\n user: HookGroupConfig[]\n): FlatCommandHookEntry[] {\n const projectFlat = flattenGroups(project);\n const userFlat = flattenGroups(user);\n\n const projectNoId: FlatCommandHookEntry[] = [];\n const idMap = new Map<string, FlatCommandHookEntry>();\n\n for (const e of projectFlat) {\n if (e.hook.id) {\n idMap.set(e.hook.id, e);\n } else {\n projectNoId.push(e);\n }\n }\n\n const userNoId: FlatCommandHookEntry[] = [];\n for (const e of userFlat) {\n if (e.hook.id) {\n idMap.set(e.hook.id, e);\n } else {\n userNoId.push(e);\n }\n }\n\n return [...projectNoId, ...userNoId, ...idMap.values()];\n}\n\nfunction mergeDisableAll(project?: boolean, user?: boolean): boolean {\n return project === true || user === true;\n}\n\nfunction runSpawnWithStdin(\n command: string,\n env: NodeJS.ProcessEnv,\n stdinBody: string,\n timeoutSec: number\n): Promise<{ code: number | null; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, {\n shell: true,\n env,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n\n let stderr = '';\n child.stderr?.on('data', (d: Buffer) => {\n stderr += d.toString('utf-8');\n });\n child.stdout?.on('data', () => {\n /* drain */\n });\n\n const timeoutMs = Math.max(1, timeoutSec) * 1000;\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n }, timeoutMs);\n\n child.on('error', err => {\n clearTimeout(timer);\n reject(err);\n });\n\n child.on('close', code => {\n clearTimeout(timer);\n resolve({ code, stderr });\n });\n\n try {\n child.stdin?.write(stdinBody, 'utf-8');\n child.stdin?.end();\n } catch (e) {\n clearTimeout(timer);\n reject(e);\n }\n });\n}\n\nfunction parseReasonFromStderr(stderr: string): string | undefined {\n const trimmed = stderr.trim();\n if (!trimmed) return undefined;\n try {\n const j = JSON.parse(trimmed) as { reason?: string };\n if (typeof j.reason === 'string') return j.reason;\n } catch {\n /* ignore */\n }\n return trimmed;\n}\n\nexport class HookManager {\n private runtimeEnabled = true;\n private mergedDisableAll = false;\n private mergedHooks: Record<HookEventType, FlatCommandHookEntry[]> = {\n preToolUse: [],\n postToolUse: [],\n postToolUseFailure: []\n };\n private functionHooks = new Map<string, FunctionHook>();\n private projectHooks: HooksSettings = this.emptySettings();\n private userHooks: HooksSettings = this.emptySettings();\n\n private emptySettings(): HooksSettings {\n return {\n disableAllHooks: false,\n hooks: emptyHooksRecord()\n };\n }\n\n private rebuildMerged(): void {\n const events: HookEventType[] = ['preToolUse', 'postToolUse', 'postToolUseFailure'];\n for (const ev of events) {\n this.mergedHooks[ev] = mergeCommandHookLayers(\n this.projectHooks.hooks[ev],\n this.userHooks.hooks[ev]\n );\n }\n this.mergedDisableAll = mergeDisableAll(\n this.projectHooks.disableAllHooks,\n this.userHooks.disableAllHooks\n );\n }\n\n private shouldRunHooks(): boolean {\n if (!this.runtimeEnabled) return false;\n if (this.mergedDisableAll) return false;\n return true;\n }\n\n private getHooksForEvent(event: HookEventType): FlatCommandHookEntry[] {\n return this.mergedHooks[event] ?? [];\n }\n\n private getFunctionHooksForEvent(event: HookEventType): FunctionHook[] {\n return [...this.functionHooks.values()].filter(h => h.event === event);\n }\n\n private async runCommandHook(\n cmd: CommandHookConfig,\n context: HookContext,\n phase: 'pre' | 'post'\n ): Promise<HookResult | void> {\n const env = buildHookEnv(context);\n const stdinBody = JSON.stringify(buildStdinPayload(context));\n const timeoutSec = cmd.timeout ?? 30;\n\n try {\n const { code, stderr } = await runSpawnWithStdin(cmd.command, env, stdinBody, timeoutSec);\n if (phase === 'pre') {\n if (code === 0) return { allowed: true };\n if (code === 2) {\n return {\n allowed: false,\n reason: parseReasonFromStderr(stderr) ?? 'Hook blocked tool execution'\n };\n }\n console.error(\n `[HookManager] PreToolUse command exited with code ${code}: ${stderr || cmd.command}`\n );\n return {\n allowed: false,\n reason: parseReasonFromStderr(stderr) ?? `Hook process exited with code ${code}`\n };\n }\n if (code !== 0 && code !== null) {\n console.error(`[HookManager] Post* hook non-zero exit (${code}): ${stderr || cmd.command}`);\n }\n } catch (err) {\n console.error(`[HookManager] Command hook failed: ${cmd.command}`, err);\n if (phase === 'pre') {\n return {\n allowed: false,\n reason: err instanceof Error ? err.message : String(err)\n };\n }\n }\n }\n\n private fireAsyncCommandHook(cmd: CommandHookConfig, context: HookContext): void {\n const env = buildHookEnv(context);\n const stdinBody = JSON.stringify(buildStdinPayload(context));\n const timeoutSec = cmd.timeout ?? 30;\n void runSpawnWithStdin(cmd.command, env, stdinBody, timeoutSec)\n .then(({ code, stderr }) => {\n if (code !== 0 && code !== null) {\n console.error(`[HookManager] async hook exit (${code}): ${stderr || cmd.command}`);\n }\n })\n .catch(err => {\n console.error(`[HookManager] async hook error: ${cmd.command}`, err);\n });\n }\n\n private async runFunctionHookSafe(\n hook: FunctionHook,\n context: HookContext,\n phase: 'pre' | 'post'\n ): Promise<HookResult | void> {\n try {\n return await hook.handler(context);\n } catch (err) {\n console.error(`[HookManager] Function hook \"${hook.id}\" threw`, err);\n if (phase === 'pre') {\n return {\n allowed: false,\n reason: err instanceof Error ? err.message : String(err)\n };\n }\n }\n }\n\n register(hook: FunctionHook): void {\n this.functionHooks.set(hook.id, hook);\n }\n\n unregister(id: string): boolean {\n return this.functionHooks.delete(id);\n }\n\n async loadProjectConfig(projectDir: string): Promise<void> {\n this.projectHooks = await loadHooksSettingsFromProject(projectDir);\n this.rebuildMerged();\n }\n\n async loadUserConfig(): Promise<void> {\n this.userHooks = await loadHooksSettingsFromUser();\n this.rebuildMerged();\n }\n\n async discoverAndLoad(projectDir?: string): Promise<void> {\n const dir = projectDir ?? process.cwd();\n await this.loadProjectConfig(dir);\n await this.loadUserConfig();\n }\n\n setEnabled(enabled: boolean): void {\n this.runtimeEnabled = enabled;\n }\n\n isEnabled(): boolean {\n return this.runtimeEnabled;\n }\n\n async executePreToolUse(context: HookContext): Promise<HookResult> {\n if (!this.shouldRunHooks()) {\n return { allowed: true, updatedInput: { ...context.toolInput } };\n }\n\n let workingInput = { ...context.toolInput };\n\n for (const entry of this.getHooksForEvent('preToolUse')) {\n if (!matchTool(context.toolName, entry.matcher)) continue;\n const ctx = { ...context, toolInput: workingInput };\n const result = await this.runCommandHook(entry.hook, ctx, 'pre');\n if (result?.allowed === false) {\n return { allowed: false, reason: result.reason };\n }\n }\n\n for (const fh of this.getFunctionHooksForEvent('preToolUse')) {\n if (!matchTool(context.toolName, fh.matcher)) continue;\n const ctx = { ...context, toolInput: workingInput };\n const result = await this.runFunctionHookSafe(fh, ctx, 'pre');\n if (result?.allowed === false) {\n return { allowed: false, reason: result.reason };\n }\n if (result?.updatedInput) {\n workingInput = { ...workingInput, ...result.updatedInput };\n }\n }\n\n return { allowed: true, updatedInput: workingInput };\n }\n\n async executePostToolUse(context: HookContext): Promise<void> {\n if (!this.shouldRunHooks()) return;\n\n for (const entry of this.getHooksForEvent('postToolUse')) {\n if (!matchTool(context.toolName, entry.matcher)) continue;\n if (entry.hook.async) {\n this.fireAsyncCommandHook(entry.hook, context);\n continue;\n }\n await this.runCommandHook(entry.hook, context, 'post');\n }\n\n for (const fh of this.getFunctionHooksForEvent('postToolUse')) {\n if (!matchTool(context.toolName, fh.matcher)) continue;\n await this.runFunctionHookSafe(fh, context, 'post');\n }\n }\n\n async executePostToolUseFailure(context: HookContext): Promise<void> {\n if (!this.shouldRunHooks()) return;\n\n for (const entry of this.getHooksForEvent('postToolUseFailure')) {\n if (!matchTool(context.toolName, entry.matcher)) continue;\n if (entry.hook.async) {\n this.fireAsyncCommandHook(entry.hook, context);\n continue;\n }\n await this.runCommandHook(entry.hook, context, 'post');\n }\n\n for (const fh of this.getFunctionHooksForEvent('postToolUseFailure')) {\n if (!matchTool(context.toolName, fh.matcher)) continue;\n await this.runFunctionHookSafe(fh, context, 'post');\n }\n }\n\n static create(): HookManager {\n return new HookManager();\n }\n}\n\nexport function createFunctionHook(config: {\n id: string;\n event: HookEventType;\n matcher?: string;\n description?: string;\n handler: (context: HookContext) => Promise<HookResult | void>;\n}): FunctionHook {\n return {\n id: config.id,\n event: config.event,\n matcher: config.matcher,\n description: config.description,\n handler: config.handler\n };\n}\n"]}
|