บทความนี้เล่ากลไกข้างในของ ANA ว่าประโยคที่เราพิมพ์ในแชทเดินทางไปถึง coding agent แล้วกลับมาเป็นการเปลี่ยนแปลงของแอปได้อย่างไร

ภาพรวมสองชิ้นส่วน

ระบบมีแค่สองชิ้นส่วน คือ server ที่ติดตั้ง runtime ไฟล์เดียวชื่อ channel-core.js กับ tmux session ที่รัน coding agent อยู่ (เช่น claude) โดยไม่ต้องพึ่ง MCP bridge หรือ plugin ใดๆ เพิ่มเติม ข้อความเดินทางสองขา ดังนี้:

ขาเส้นทางวิธี
ขาไปหน้าเว็บ → server → tmuxPOST /api/chat แล้วฉีดด้วย paste-buffer + Enter
ขากลับtmux → server → หน้าเว็บอ่านจอด้วย capture-pane ทุก 300ms แล้วส่งผ่าน SSE

ขาไป: ส่งข้อความเข้าหา agent

หน้าเว็บส่ง POST /api/chat พร้อมข้อความ server จะนำข้อความนั้นใส่ paste-buffer ของ tmux แล้วกด Enter ให้ agent เหมือนมีคนพิมพ์ให้ที่คีย์บอร์ด นอกจากนี้ยังมีปุ่มส่ง control key เช่น Enter Esc ลูกศร และตัวเลข ไว้ตอบ dialog ที่เป็นเมนูใน terminal ของ agent ได้จากหน้าเว็บโดยตรง

ขากลับ: สะท้อนจอกลับมาเป็นบทสนทนา

ลูป capture-pane จะอ่านจอ terminal ของ agent ทุก 300ms มาแยกแยะ แล้วบันทึกเป็น ledger แบบต่อท้ายอย่างเดียว ก่อนส่งกลับหน้าเว็บผ่าน SSE parser เฉพาะทางจะตัด UI ด้านล่างของ terminal ทิ้งให้เหลือแต่บทสนทนา ตรวจจับสถานะ busy และ dialog ที่กำลังถามอยู่ ถ้า agent เก็บ structured log ไว้ (Claude Code กับ Codex มี) แชทจะแสดงผลจาก log นั้นแทนการอ่านจอ ทำให้คำตอบกับ tool calls ตรงตามจริง

วงจรที่ทำให้แอปพัฒนาได้: proposal

เวลาขอฟีเจอร์หรือขอเปลี่ยนพฤติกรรม agent จะยังไม่แก้ทันที แต่ส่ง proposal มาเป็นการ์ด before/after ให้ดูก่อน พอเรากด approve server จึง apply diff แล้วเพิ่ม version เพื่อให้ทุกอุปกรณ์ที่เปิดอยู่ sync ตาม ทุกการอนุมัติถูกบันทึกเป็นประวัติย้อนดูได้ วิธีนี้ทำให้ "คุยแล้วแอปเปลี่ยน" แต่ยังปลอดภัยเพราะไม่มีอะไรเปลี่ยนแปลงโดยไม่ผ่านการอนุมัติ

ข้อมูลโยงกันเป็น graph

งาน โน้ต และนัดหมายไม่ได้อยู่แยกกัน แต่อยู่บน relation graph (NodeRel) เช่น ทำงานเสร็จแล้วรอบถัดไปถูกสร้างพร้อม link NEXT_OCCURRENCE สร้างนัดหมายจากงานพร้อม link SCHEDULED_AS ส่วนงานที่เกิดจากการอนุมัติแผนของ agent จะโยงกลับด้วย link SPAWNED graph นี้คือสิ่งที่ agent ใช้อ่านบริบทก่อนตัดสินใจ

รายละเอียดที่กันพัง

  • ชื่อ session เป็นระเบียบแบบ ชื่อANA-ชื่อagent สลับแชทได้โดยประวัติแยกกัน
  • ส่งข้อความซ้ำตอน agent กำลังพิมพ์มี guard กันชนกัน แล้วตอบ 409 พร้อมวิธีแก้
  • พิมพ์วันที่ภาษาไทยกำกวม ระบบจะถามกลับก่อนสร้าง ไม่เดาเอาเอง

บทความต่อไปจะเล่าว่าเอา ANA ไปทดสอบอย่างไร และผลที่ได้น่าสนใจแค่ไหน