บทความนี้เล่ากลไกข้างในของ ANA ว่าประโยคที่เราพิมพ์ในแชทเดินทางไปถึง coding agent แล้วกลับมาเป็นการเปลี่ยนแปลงของแอปได้อย่างไร
ภาพรวมสองชิ้นส่วน
ระบบมีแค่สองชิ้นส่วน คือ server ที่ติดตั้ง runtime ไฟล์เดียวชื่อ channel-core.js
กับ tmux session ที่รัน coding agent อยู่ (เช่น claude) โดยไม่ต้องพึ่ง MCP
bridge หรือ plugin ใดๆ เพิ่มเติม ข้อความเดินทางสองขา ดังนี้:
| ขา | เส้นทาง | วิธี |
|---|---|---|
| ขาไป | หน้าเว็บ → server → tmux | POST /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 ไปทดสอบอย่างไร และผลที่ได้น่าสนใจแค่ไหน