Claude Code: สถาปัตยกรรมระบบ Tool

🇹🇭 Thai claude-codetoolsarchitectureanalysisthai
📋 Table of Contents (12 sections)
  1. ระบบเครื่องมือ (Tools System)
  2. ภาพรวม
  3. แคตตาล็อกเครื่องมือ (~40 เครื่องมือ)
  4. รูปแบบโรงงานของเครื่องมือ
  5. โครงสร้างไดเรกทอรีของเครื่องมือ
  6. ระบบ Permission
  7. การไหลของการดำเนินการเครื่องมือ
  8. หมวดหมู่เครื่องมือหลัก
  9. แนวปฏิบัติที่ดีของเครื่องมือ
  10. การค้นหาเครื่องมือ
  11. การผสานรวมเครื่องมือ MCP
  12. ข้อควรพิจารณาด้านความปลอดภัย

ระบบเครื่องมือ (Tools System)

ภาพรวม

ระบบเครื่องมือเป็น ** abstraction หลัก** ของ claude-code-leaked ทุกความสามารถ (การดำเนินการกับไฟล์, การรันคำสั่ง shell, การผสานรวม MCP, การจัดการ agents) จะถูกเปิดเผยเป็นเครื่องมือที่แยกออกมาเป็นอิสระ

แคตตาล็อกเครื่องมือ (~40 เครื่องมือ)

เครื่องมือสำหรับดำเนินการกับไฟล์

  • FileReadTool - อ่านเนื้อหาของไฟล์
  • FileWriteTool - บันทึกไฟล์ใหม่
  • FileEditTool - แก้ไขไฟล์ที่มีอยู่
  • FileSearchTool - ค้นหาไฟล์ตามแพทเทิร์น
  • GlobTool - จับคู่ไฟล์ตาม glob pattern

เครื่องมือสำหรับการรันคำสั่ง Shell

  • BashTool - รันคำสั่ง bash
  • PowerShellTool - รันคำสั่ง PowerShell
  • REPLTool - การรันแบบ interactive REPL

เครื่องมือสำหรับการจัดการ Agents

  • AgentTool - สร้างและจัดการ sub-agents
  • TeamCreateTool - สร้างทีม agents
  • SendMessageTool - ส่งข้อความไปยัง agents

เครื่องมือสำหรับผสานรวม MCP

  • MCPTool - การดำเนินการของ Model Context Protocol
  • ListMcpResourcesTool - แสดงรายการทรัพยากร MCP
  • ReadMcpResourceTool - อ่านเนื้อหาของทรัพยากร 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: โหลดและดำเนินการ skills
  • AgentTool: จัดการการ spawn ของ sub-agents

แนวปฏิบัติที่ดีของเครื่องมือ

  1. แยกออกมาเป็นอิสระ: แต่ละเครื่องมือมีตรรกะ, UI, และ prompt ของตัวเอง
  2. การตรวจสอบ Schema: ใช้ Zod schemas สำหรับการตรวจสอบ input ที่เข้มงวด
  3. การควบคุมด้วย Permission: การควบคุมการเข้าถึงที่ปรับแต่งได้
  4. Lazy Loading: โหลดเครื่องมือหนักเมื่อต้องการ
  5. การจัดการข้อผิดพลาด: โค้ดข้อผิดพลาดและข้อความที่สม่ำเสมอ
  6. การผสานรวมกับ 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 ที่เชื่อมต่อ
  // ส่งคืนรายการเครื่องมือที่รวมกัน
}

ข้อควรพิจารณาด้านความปลอดภัย

  1. ข้อจำกัดของไดเรกทอรีการทำงาน: เครื่องมือตรวจสอบว่า paths อยู่ในไดเรกทอรีที่ได้รับอนุญาต
  2. โหมด Permission: โหมดต่างๆ ควบคุมการเข้าถึงเครื่องมือ
  3. Feature Flags: ความพร้อมใช้งานของเครื่องมือตามเงื่อนไข
  4. การจัดการข้อผิดพลาด: การลดผลกระทบจากข้อผิดพลาดอย่างนุ่มนวล
← Back to claudecodeanalysis