telepty เป็น คอนโทรลเพลนสำหรับเซสชันเอเจนต์ ขนาดเบา ที่ช่วยให้ส่งคำสั่งจากระยะไกลและอ่านหน้าจอของเซสชัน terminal AI CLI (เช่น claude, codex, gemini ฯลฯ) ที่รันอยู่บนหลายเครื่องได้ — การอนุมานและงานยังคงให้เอเจนต์แต่ละตัวทำเหมือนเดิม (data plane) ส่วน telepty รับผิดชอบเฉพาะเลเยอร์ที่ใช้เรียกเซสชันเหล่านั้นด้วยที่อยู่และรับประกันการส่งต่อ (เดมอนเบื้องหลังบน PTY + session bridge) โดยกำหนดที่อยู่ตามชื่อให้แต่ละเซสชัน ตรวจสอบได้จนถึงขั้นว่าคำสั่งถูกรับจริงแล้วหรือไม่ และรองรับ macOS·Linux·Windows การส่งข้ามเครื่องไม่ได้สร้างเอง แต่ วางบน Tailscale (WireGuard) ที่ผ่านการพิสูจน์แล้ว — แทนที่จะเพิ่มพื้นผิวโจมตีด้วยการทำ key exchange, NAT traversal และการเข้ารหัสเองใหม่ จึงเลือกมอบหมายให้เลเยอร์ที่ผ่านการใช้งานจริงมาหลายปีรับผิดชอบ เป็นโอเพนซอร์สภายใต้ไลเซนส์ MIT
npm i -g @dmsdc-ai/aigentry-telepty && telepty daemon start
# ห่อ CLI ที่ใช้อยู่เดิมให้เป็นเซสชันที่มีชื่อ (ทำครั้งละหนึ่งครั้งในแต่ละเครื่อง)
telepty allow --id orchestrator claude # เซสชัน claude ของเครื่องนี้ → "orchestrator"
telepty inject "backend@100.x.y.z" "인증 미들웨어 리팩터링 시작해줘" # ส่งคำสั่งไปยังเซสชันระยะไกล
telepty read-screen "backend@100.x.y.z" # ตรวจสอบความคืบหน้า
telepty broadcast "작업 마무리하고 상태 보고해줘" # ประกาศไปยังทุกเซสชัน
เบื้องหลัง
การพัฒนาที่ใช้งานเซสชัน AI CLI หลายตัวบนหลายเครื่องกลายเป็นเรื่องพบได้บ่อย การรันสามารถขยายแบบขนานได้ตามจำนวนเซสชัน แต่การส่งต่อระหว่างเซสชัน — การกระจายคำสั่ง การตรวจสอบความคืบหน้า การดึงผลลัพธ์กลับ — ยังต้องให้คนสลับไปมาระหว่างเทอร์มินัล จุดเริ่มต้นของเครื่องมือนี้ก็คือคอขวดนั้น: เมื่อลองรันเซสชัน AI CLI สามเซสชันพร้อมกันบนเครื่องสามเครื่อง พบว่าขั้นตอน “การส่งต่อ” คำสั่งและผลลัพธ์ติดที่คนก่อนขั้นตอนการรันเสียอีก
- เดิม: สลับโฟกัสไปมาระหว่างเทอร์มินัล 3 หน้าต่าง → คัดลอก-วางคำสั่ง → ตรวจสอบความคืบหน้า ทำซ้ำทีละเซสชัน
- telepty: จากเทอร์มินัลเดียว ฉีดคำสั่งด้วยที่อยู่
ชื่อ@โฮสต์และดึงหน้าจอกลับมา
เครื่องมือเดิมยังเติมเต็มเลเยอร์นี้ไม่ได้ tmux/SSH เป็นเครื่องมือสำหรับ “เกาะติด” เซสชัน จึงยังต้องส่งและตรวจสอบด้วยมือ ส่วนเฟรมเวิร์กเอเจนต์มักต้องการให้เขียนเซสชันและเวิร์กโฟลว์เดิมใหม่ตามวิธีของมัน telepty ตั้งเป้าเป็นเลเยอร์บาง ๆ ตรงกลาง — ปล่อยให้เซสชันที่รันอยู่แล้วอยู่เหมือนเดิม และย้ายเฉพาะการส่งต่อให้เป็นโครงสร้างพื้นฐาน
การออกแบบ
- ชี้เซสชันด้วยชื่อ — เรียกทุกเซสชันด้วยรูปแบบ
<ชื่อเซสชัน>@<โฮสต์>ไม่ต้องสนใจว่าเป้าหมายอยู่เครื่องไหนหรือ OS ใด - แยก “ส่งแล้ว” กับ “ได้รับแล้ว” — ถ้าเซสชันปลายทางกำลังทำงานอยู่ จะเก็บข้อความไว้ในคิว (mailbox) และตัดสินยืนยันเวลาที่ถูกรับจริงจากสถานะการเรนเดอร์ของเทอร์มินัล จึงไม่ต้องส่งแล้วให้คนกลับไปตรวจอีก
- รีสตาร์ตเดมอนแล้วเซสชันยังอยู่ — โปรเซสที่ถือเซสชัน (bridge) แยกจาก routing daemon ทำให้การอัปเกรดเดมอนไม่ตัดงานที่กำลังดำเนินอยู่
- มอบหมายการส่งให้เลเยอร์ที่พิสูจน์แล้ว — ไม่ได้สร้างโปรโตคอล P2P เอง หากมี Tailscale เดมอนจะตรวจจับ tailnet IP อัตโนมัติและเชื่อมต่อบนเลเยอร์นั้นทันที: เปิดพอร์ต 0, จัดการใบรับรอง 0, ตั้งกฎไฟร์วอลล์ 0 ส่วนสภาพแวดล้อมที่ไม่มี tailnet จะเชื่อมผ่าน SSH tunnel (
telepty connect user@host) — ไม่ว่าจะทางไหน การเข้ารหัสและตัวตนให้เครื่องมือที่พิสูจน์แล้วรับผิดชอบ ส่วน telepty ทำเฉพาะการระบุที่อยู่เซสชันและการส่งต่อบนเลเยอร์นั้น
คำสั่งมี 6 คำสั่งคือ inject / read-screen / attach / send-key / broadcast / list โดย CLI ก็คือ API จึงนำไปประกอบใช้ใน shell script ได้ทันที และ ไม่ได้สร้างมาให้คนใช้เท่านั้น — ในแพ็กเกจมีสกิล 9 แบบสำหรับ Claude Code·Codex·Gemini CLI รวมอยู่ด้วย (ติดตั้งผ่านตัวติดตั้งในตัว) ทำให้ เอเจนต์เองใช้ telepty เป็นเครื่องมือได้: ดูรายการเซสชัน ส่งคำสั่งไปยังเอเจนต์บนเครื่องอื่น และอ่านหน้าจอกลับมา รีเลย์ในเดโมด้านล่างคือฉากนั้นพอดี — ไม่ใช่คน แต่เป็น LLM แต่ละตัวที่เรียก telepty inject เอง
ตัวชี้วัดอ้างอิงช่วงแรก (วัดจากบิลด์ 0.6.11 — รีลีสปัจจุบัน 0.7.1 · รวม network round-trip และโอเวอร์เฮดการเริ่ม PTY)
- สำหรับ gated inject ไปยังเซสชัน busy ตั้งแต่การเข้าคิว→ยืนยันการรับ: Linux ประมาณ 487ms · Windows ประมาณ 1.2s — กำลังสะสมการวัดเพิ่ม และสิ่งสำคัญกว่าตัวเลขคือ ใช้การมาถึงของ ACK ฝั่งรับเป็นเกณฑ์การรับ ไม่ใช่การตอบรับ HTTP
- ตรวจสอบการส่งข้ามเครื่อง 3 OS ได้แก่ macOS·Linux·Windows ด้วยเกณฑ์เดียวกันแล้ว
ความปลอดภัย
เดมอน bind เฉพาะ localhost (127.0.0.1) และ IP เฉพาะของ tailnet — ไม่มีการเปิด 0.0.0.0 จึงไม่สามารถเข้าถึงได้ด้วยการสแกนพอร์ตจากนอก tailnet เชื่อถือเฉพาะ peer ใน tailnet และสิทธิ์ในการเขียนไปยัง PTY ไม่เกินขอบเขตผู้ใช้ที่เป็นเจ้าของเซสชัน ตั้งแต่ 0.7.1 เป็นต้นมา ปฏิเสธคำขอที่มาจากเบราว์เซอร์อย่างชัดเจน — ปิดเส้นทางที่เว็บเพจที่ผู้ใช้เข้าชมจะเข้าถึงเซสชันผ่าน control API หรือ WebSocket บน localhost (ค่าเริ่มต้นไม่มี origin ที่อนุญาต)
ข้อจำกัด
ยังเป็น beta ยังมี edge case ด้านการเรนเดอร์ของแต่ละ CLI และ Windows ยังติดป้าย beta เนื่องจากไม่ได้ทำ terminal emulation read-screen จึงคืนส่วนท้ายของ output stream ไม่ใช่ cell grid — ใน TUI ที่ repaint บ่อย อาจเห็นเฟรมเดิมซ้ำ ๆ รายการที่ทราบถูกรวบรวมไว้ในส่วน Limitations ของ README
ลิงก์
- GitHub: https://github.com/dmsdc-ai/aigentry-telepty
- เดโม README: ฉากที่ LLM 3 ตัว (Grok·Codex·Claude) บน 3 เครื่อง (macOS·Linux·Windows) เรียก telepty inject เองและรีเลย์หากัน — แต่ละหน้าจอเป็นการจับภาพสดจาก CLI TUI ต้นฉบับด้วย
attachคำสั่งเดียวกันทำงานระหว่างเซสชันภายในเครื่องเดียวกันได้เหมือนเดิม (มีเดโมรีเลย์ในเครื่องเดียวกันด้วย) - npm:
@dmsdc-ai/aigentry-telepty(MIT, 0.7.1)
อยากทราบแนวทางแก้ปัญหาเลเยอร์การส่งต่อของผู้ที่ใช้งานเซสชัน AI CLI หลายตัว หากส่งฟีดแบ็กมา จะนำไปปรับปรุงครับ
1 ความคิดเห็น
ขอเสริมแรงจูงใจในการพัฒนา: จุดเริ่มต้นคือผมรันเซสชัน 4 ตัวของ Cluade, Codex Gemini และ Grok บนเครื่องข้ามแพลตฟอร์ม 3 เครื่อง แล้วเจอคอขวดว่า “การรันงานสเกลเอาต์ได้ แต่การส่งต่อกลับผูกอยู่กับคนเพียงคนเดียว” เครื่องมือนี้ไม่ใช่ตัวแทนของ tmux/SSH แต่เป็นเครื่องมือที่ใช้ควบคู่กัน — เป้าหมายไม่ใช่ “การเชื่อมต่อเทอร์มินัล” แต่เป็น “การระบุที่อยู่เซสชัน + การยืนยันการส่งต่อ” ถ้ามีข้อสงสัยถามได้ตามสะดวกครับ