ระบบเครื่องมือ (Tools System)
ภาพรวม
ระบบเครื่องมือเป็น ** abstraction หลัก** ของ claude-code-leaked ทุกความสามารถ (การดำเนินการกับไฟล์, การรันคำสั่ง shell, การผสานรวม MCP, การจัดการ agents) จะถูกเปิดเผยเป็นเครื่องมือที่แยกออกมาเป็นอิสระ
แคตตาล็อกเครื่องมือ (~40 เครื่องมือ)
เครื่องมือสำหรับดำเนินการกับไฟล์
FileReadTool- อ่านเนื้อหาของไฟล์FileWriteTool- บันทึกไฟล์ใหม่FileEditTool- แก้ไขไฟล์ที่มีอยู่FileSearchTool- ค้นหาไฟล์ตามแพทเทิร์นGlobTool- จับคู่ไฟล์ตาม glob pattern
เครื่องมือสำหรับการรันคำสั่ง Shell
BashTool- รันคำสั่ง bashPowerShellTool- รันคำสั่ง PowerShellREPLTool- การรันแบบ interactive REPL
เครื่องมือสำหรับการจัดการ Agents
AgentTool- สร้างและจัดการ sub-agentsTeamCreateTool- สร้างทีม agentsSendMessageTool- ส่งข้อความไปยัง agents
เครื่องมือสำหรับผสานรวม MCP
MCPTool- การดำเนินการของ Model Context ProtocolListMcpResourcesTool- แสดงรายการทรัพยากร MCPReadMcpResourceTool- อ่านเนื้อหาของทรัพยากร MCP
เครื่องมือระบบ
WebSearchTool- ความสามารถค้นหาในเว็บTaskTool- การจัดการงานMemoryTool- การจัดการหน่วยความจำ
รูปแบบโรงงานของเครื่องมือ
ทุกเครื่องมือถูกสร้างด้วยฟังก์ชันโรงงานที่สม่ำเสมอ:
buildTool({
name: 'ToolName',
description: 'คำอธิบายว่า tool นี้ทำอะไร',
inputSchema: z.object({
// สคีมาตรวจสอบ input โดยใช้ Zod
param1: z.string(),
param2: z.number(),
}),
async call(args, context) {
// ตรรกะการดำเนินการของ tool
return result;
},
async checkPermissions(input, context) {
// การตรวจสอบ permission ก่อนดำเนินการ
return true; // หรือ false พร้อมข้อความข้อผิดพลาด
},
async toMessage(args, result, context) {
// แปลงผลลัพธ์ของ tool ให้เป็นรูปแบบข้อความ
return message;
},
});
โครงสร้างไดเรกทอรีของเครื่องมือ
แต่ละเครื่องมือมีไดเรกทอรีของตัวเอง:
src/tools/<ToolName>/
├── <ToolName>Tool.ts - การดำเนินการของเครื่องมือ
├── UI.tsx - ส่วนประกอบ UI
├── prompt.ts - การมีส่วนร่วมใน system prompt
└── [ไฟล์ทดสอบ, helpers (ถ้ามี)]
ตัวอย่าง: BashTool
// src/tools/BashTool/BashTool.ts
import { buildTool } from '../../Tool.js';
import { z } from 'zod/v4';
import { executeCommand } from './executor.js';
export const BashTool = buildTool({
name: 'BashTool',
description: 'รันคำสั่ง bash ใน terminal',
inputSchema: z.object({
command: z.string().describe('คำสั่ง bash ที่จะรัน'),
timeout: z.number().optional().describe('เวลาหมดเขตเป็นมิลลิวินาที'),
workdir: z.string().optional().describe('ไดเรกทอรีการทำงาน'),
}),
async call(args, context) {
const result = await executeCommand(args.command, {
timeout: args.timeout,
workdir: args.workdir,
});
return result;
},
async checkPermissions(input, context) {
// ตรวจสอบว่าคำสั่งได้รับอนุญาตในไดเรกทอรีการทำงานปัจจุบัน
return true;
},
});
ระบบ Permission
เครื่องมือสามารถกำหนดการตรวจสอบ permission เฉพาะตัว:
async checkPermissions(input, context) {
// ตรวจสอบข้อจำกัดของไดเรกทอรีการทำงาน
// ตรวจสอบกฎเฉพาะเครื่องมือ
return { result: true }; // หรือ { result: false, message: '...', errorCode: 403 }
}
โหมด Permission:
- default: การตรวจสอบ permission มาตรฐาน
- plan: โหมดการวางแผน (เริ่มโดย model)
- auto: การจัดการ permission อัตโนมัติ
- bypassPermissions: ข้ามการถาม permission
การไหลของการดำเนินการเครื่องมือ
1. ผู้ใช้เรียกใช้เครื่องมือผ่านภาษาธรรมชาติหรือคำสั่ง
2. QueryEngine ตรวจสอบ schema ของ input ของเครื่องมือ
3. checkPermissions() ทำงาน (ถ้าเปิดใช้งาน)
4. call() ดำเนินการตรรกะของเครื่องมือ
5. toMessage() จัดรูปแบบผลลัพธ์สำหรับการแสดงผล
6. ผลลัพธ์ถูกเพิ่มในประวัติข้อความ
7. UI แสดงผลลัพธ์ของเครื่องมือ
หมวดหมู่เครื่องมือหลัก
เครื่องมือหลัก (พร้อมใช้งานเสมอ)
- การดำเนินการกับไฟล์ (อ่าน, เขียน, แก้ไข)
- การรันคำสั่ง shell (bash, powershell)
- การค้นหาและ glob patterns
เครื่องมือตามเงื่อนไข (เปิดด้วย Feature Flags)
- เครื่องมือ Agent (COORDINATOR_MODE)
- เครื่องมือ MCP (MCP_ENABLED)
- เครื่องมือค้นหาเว็บ (WEB_SEARCH)
เครื่องมือพิเศษ
SyntheticOutputTool: จัดการผลลัพธ์แบบมีโครงสร้างSkillTool: โหลดและดำเนินการ skillsAgentTool: จัดการการ spawn ของ sub-agents
แนวปฏิบัติที่ดีของเครื่องมือ
- แยกออกมาเป็นอิสระ: แต่ละเครื่องมือมีตรรกะ, UI, และ prompt ของตัวเอง
- การตรวจสอบ Schema: ใช้ Zod schemas สำหรับการตรวจสอบ input ที่เข้มงวด
- การควบคุมด้วย Permission: การควบคุมการเข้าถึงที่ปรับแต่งได้
- Lazy Loading: โหลดเครื่องมือหนักเมื่อต้องการ
- การจัดการข้อผิดพลาด: โค้ดข้อผิดพลาดและข้อความที่สม่ำเสมอ
- การผสานรวมกับ UI: ส่วนประกอบ UI เฉพาะสำหรับแต่ละเครื่องมือ
การค้นหาเครื่องมือ
เครื่องมือถูกค้นหาและลงทะเบียนผ่าน:
// src/tools.ts
export function getTools(): Tools {
const tools: Tools = [];
tools.push(BashTool);
tools.push(FileReadTool);
tools.push(FileWriteTool);
// ... เครื่องมืออื่นๆ ทั้งหมด
return tools;
}
การผสานรวมเครื่องมือ MCP
เครื่องมือ MCP (Model Context Protocol) ขยายความสามารถ:
// src/services/mcp/client.ts
export async function getMcpToolsCommandsAndResources(
servers: MCPServerConnection[]
): Promise<Tools> {
// ดึงเครื่องมือจากเซิร์ฟเวอร์ MCP ที่เชื่อมต่อ
// ส่งคืนรายการเครื่องมือที่รวมกัน
}
ข้อควรพิจารณาด้านความปลอดภัย
- ข้อจำกัดของไดเรกทอรีการทำงาน: เครื่องมือตรวจสอบว่า paths อยู่ในไดเรกทอรีที่ได้รับอนุญาต
- โหมด Permission: โหมดต่างๆ ควบคุมการเข้าถึงเครื่องมือ
- Feature Flags: ความพร้อมใช้งานของเครื่องมือตามเงื่อนไข
- การจัดการข้อผิดพลาด: การลดผลกระทบจากข้อผิดพลาดอย่างนุ่มนวล