สถาปัตยกรรม
ภาพรวมของระบบ
iOS app / agent client -> api.<domain> -> API Gateway -> Lambda backend -> Postgres
Web app -> app.<domain> -> CloudFront -> SPA
Browser and agent auth -> auth.<domain> -> API Gateway -> Auth Lambda -> Cognito
Apex fallback -> <domain> -> CloudFront redirect -> app.<domain>
หลักการ
- แยกโดเมนสาธารณะสำหรับ
app,apiและauth - Postgres คือแหล่งข้อมูลหลัก
- ไคลเอ็นต์ iOS ทำงานแบบออฟไลน์เป็นหลัก โดยใช้ SQLite ในเครื่องร่วมกับการซิงค์
- เว็บแอป แอป iOS และส่วนติดต่อสำหรับเอเจนต์ภายนอกใช้โมเดลพื้นที่ทำงานเดียวกัน
- เอเจนต์ภายนอกเริ่มต้นจาก
GET https://api.nibomo.com/v1/
ไคลเอ็นต์ที่รองรับ
- เว็บแอปบน
app.nibomo.com - แอป iOS ในรีโพซิทอรีหลัก พร้อมพื้นที่จัดเก็บ SQLite ในเครื่อง
- แอป Android บน Google Play
- ไคลเอ็นต์เอเจนต์ภายนอกผ่าน discovery การตั้งค่าเริ่มต้นด้วย OTP และ
Authorization: ApiKey
โมเดลข้อมูล
workspacesworkspace_membersuser_settingsdevicescardsdecksreview_eventsapplied_operationssync_state
การไหลของข้อมูล
เว็บ
- เบราว์เซอร์ลงชื่อเข้าใช้ผ่าน
auth.<domain> - เว็บแอปโหลดข้อมูลพื้นที่ทำงานจาก
api.<domain> - คำขอแชต AI ส่งผ่าน
/chat/local-turn - การส่งผลการทบทวนจะอัปเดตสถานะของตัวจัดตารางทันทีที่เขียนข้อมูล
iOS
- แอป iOS เขียนข้อมูลลง SQLite ในเครื่องก่อน
- การเปลี่ยนแปลงในเครื่องจะเข้าคิวไว้ใน outbox
- การซิงค์อัปโหลดการเปลี่ยนแปลงผ่าน
/v1/workspaces/{workspaceId}/sync/push - การซิงค์ดาวน์โหลดการอัปเดตจากเซิร์ฟเวอร์ผ่าน
/v1/workspaces/{workspaceId}/sync/pull - ฐานข้อมูลในเครื่องนำการเปลี่ยนแปลงไปใช้และเลื่อนเคอร์เซอร์การซิงค์ไปข้างหน้า
เอเจนต์ภายนอก
- เอเจนต์เริ่มต้นด้วย
GET /v1/ - การตั้งค่าเริ่มต้นด้วย OTP ทำงานบน
auth.<domain> - เอเจนต์ได้รับคีย์ API แบบใช้งานได้ระยะยาว
- เอเจนต์โหลด
/v1/agent/meแสดงรายการพื้นที่ทำงาน เลือกพื้นที่ทำงานหากจำเป็น แล้วใช้/v1/agent/sql/queryและ/v1/agent/sql/execute
การจัดตาราง
Nibomo ใช้ FSRS เป็นตัวจัดตารางการทบทวน
หมายเหตุด้านการพัฒนา:
- แบ็กเอนด์และ iOS ต่างมีโค้ด FSRS ของตัวเองที่ทำงานตรงกัน
- เว็บแอปใช้ข้อกำหนดข้อมูลการจัดตาราง (data contract) แบบเดียวกัน แต่ไม่ได้มีตัวจัดตารางชุดที่สามของตัวเอง
- การตั้งค่าตัวจัดตารางระดับพื้นที่ทำงานประกอบด้วยอัตราการจำที่ต้องการ (desired retention) ขั้นตอนการเรียนรู้ ขั้นตอนการเรียนรู้ใหม่ ช่วงห่างสูงสุด และการสุ่มคลาดเคลื่อน (fuzz)
- เวลาทบทวนจริงมาจาก
reviewedAtClient
ดูข้อกำหนดโดยละเอียดได้ที่ตรรกะการจัดตาราง FSRS ในรีโพซิทอรีหลัก
การยืนยันตัวตน
- OTP ทางอีเมลผ่าน Cognito
- คุกกี้เซสชันของเบราว์เซอร์แบบใช้โดเมนร่วมกันสำหรับเว็บแอปที่โฮสต์ให้
- การตั้งค่าเริ่มต้นด้วย OTP สำหรับเอเจนต์บน
auth.<domain>ซึ่งให้ผลลัพธ์เป็น ApiKey แบบใช้งานได้ระยะยาว AUTH_MODE=noneสำหรับการพัฒนาในเครื่องAUTH_MODE=cognitoสำหรับการยืนยันตัวตนแบบใกล้เคียงโปรดักชัน
รูปแบบการดีพลอย
app.<domain>-> CloudFront + S3api.<domain>-> API Gateway + แบ็กเอนด์บน Lambdaauth.<domain>-> API Gateway + บริการยืนยันตัวตนบน Lambda- Postgres บน AWS RDS
โดเมนหลัก (apex) ยังใช้กับเว็บไซต์การตลาดที่แยกต่างหากต่อไปได้ หากโดเมนนี้ยังว่างอยู่ระหว่างการตั้งค่าเริ่มต้น โครงสร้างพื้นฐานสามารถเปลี่ยนเส้นทางโดเมนนี้ไปยัง app.<domain> ชั่วคราวได้