Get started
การปรับโครงสร้างสถานะโดยใช้ฐานข้อมูลเป็นหลัก
การปรับโครงสร้างสถานะโดยยึดฐานข้อมูลเป็นหลัก
ข้อสรุป
ใช้โครงสร้าง SQLite สองระดับ:
- ฐานข้อมูลส่วนกลาง:
~/.openclaw/state/openclaw.sqlite - ฐานข้อมูลเอเจนต์: ฐานข้อมูล SQLite หนึ่งฐานต่อเอเจนต์สำหรับพื้นที่ทำงานที่เอเจนต์เป็นเจ้าของ บันทึกบทสนทนา VFS อาร์ติแฟกต์ และสถานะรันไทม์ขนาดใหญ่เฉพาะเอเจนต์
- การกำหนดค่ายังคงใช้ไฟล์เป็นที่จัดเก็บ:
openclaw.jsonยังคงอยู่นอก ฐานข้อมูล โปรไฟล์การยืนยันตัวตนของรันไทม์ย้ายไปยัง SQLite ส่วนไฟล์ข้อมูลประจำตัว ของผู้ให้บริการภายนอกหรือ CLI ยังคงให้เจ้าของจัดการภายนอกฐานข้อมูลของ OpenClaw
ฐานข้อมูลส่วนกลางคือฐานข้อมูลของระนาบควบคุม โดยเป็นเจ้าของการค้นพบเอเจนต์ สถานะ Gateway ที่ใช้ร่วมกัน การจับคู่ สถานะอุปกรณ์/Node บัญชีแยกประเภทของงานและโฟลว์ สถานะ Plugin สถานะรันไทม์ของตัวจัดกำหนดการ เมทาดาทาการสำรองข้อมูล และสถานะการย้ายข้อมูล
ฐานข้อมูลเอเจนต์คือฐานข้อมูลของระนาบข้อมูล โดยเป็นเจ้าของเมทาดาทาเซสชันของเอเจนต์ สตรีมเหตุการณ์บันทึกบทสนทนา พื้นที่ทำงาน VFS หรือเนมสเปซชั่วคราว อาร์ติแฟกต์ของเครื่องมือ อาร์ติแฟกต์การรัน และข้อมูลแคชภายในเอเจนต์ที่ค้นหาและสร้างดัชนีได้
แนวทางนี้ให้มุมมองส่วนกลางที่คงทนหนึ่งชุด โดยไม่บังคับให้พื้นที่ทำงานของเอเจนต์ขนาดใหญ่ บันทึกบทสนทนา และข้อมูลไบนารีชั่วคราวเข้าสู่ช่องทางการเขียนของ Gateway ที่ใช้ร่วมกัน
สัญญาที่เคร่งครัด
การย้ายข้อมูลนี้มีรูปแบบรันไทม์มาตรฐานเพียงรูปแบบเดียว:
- แถวเซสชันจัดเก็บเฉพาะเมทาดาทาเซสชันเท่านั้น ต้องไม่จัดเก็บ
transcriptLocatorพาธไฟล์บันทึกบทสนทนา พาธ JSONL ข้างเคียง พาธล็อก เมทาดาทาการตัดแต่ง หรือพอยน์เตอร์ความเข้ากันได้จากยุคที่ใช้ไฟล์ - อัตลักษณ์ของบันทึกบทสนทนาเป็นอัตลักษณ์ SQLite เสมอ:
{agentId, sessionId}พร้อม เมทาดาทาหัวข้อแบบไม่บังคับในกรณีที่โปรโตคอลจำเป็นต้องใช้ sqlite-transcript://...ไม่ใช่อัตลักษณ์ของรันไทม์หรือโปรโตคอล โค้ดใหม่ต้อง ไม่สร้าง จัดเก็บ ส่ง แยกวิเคราะห์ หรือย้ายตัวระบุตำแหน่งบันทึกบทสนทนา รันไทม์และ การทดสอบไม่ควรมีตัวระบุตำแหน่งจำลองใด ๆ เลย เอกสารอาจกล่าวถึงสตริงนี้ ได้เฉพาะเพื่อระบุข้อห้ามsessions.jsonแบบเดิม, JSONL ของบันทึกบทสนทนา,.jsonl.lock, การตัดแต่ง, การตัดทอน และตรรกะพาธเซสชันแบบเก่า เป็นของพาธการย้าย/นำเข้าผ่าน doctor เท่านั้น- นามแฝงการกำหนดค่าเซสชันแบบเดิมเป็นของการย้ายข้อมูลผ่าน doctor เท่านั้น รันไทม์
ไม่ตีความ
session.idleMinutes,session.resetByType.dmหรือ นามแฝงเซสชันหลักagent:main:*ข้ามเอเจนต์สำหรับเอเจนต์อื่นที่กำหนดค่าไว้ - อัตลักษณ์การกำหนดเส้นทางเซสชันเป็นสถานะแบบเชิงสัมพันธ์ที่มีชนิดกำกับ พาธรันไทม์ที่ใช้งานหนักและพาธ UI
ควรอ่าน
sessions.session_scope,sessions.account_id,sessions.primary_conversation_id,conversationsและsession_conversationsโดยต้องไม่แยกวิเคราะห์session_keyหรือขุดค้นsession_entries.entry_jsonเพื่อหาอัตลักษณ์ผู้ให้บริการ ยกเว้นในฐานะ เงาความเข้ากันได้ระหว่างที่กำลังลบจุดเรียกใช้งานเก่า - เครื่องหมายข้อความโดยตรงระดับช่องทาง เช่น
dmเทียบกับdirectเป็นคำศัพท์ สำหรับการกำหนดเส้นทาง ไม่ใช่ตัวระบุตำแหน่งบันทึกบทสนทนาหรือแฮนเดิลความเข้ากันได้ของที่จัดเก็บแบบไฟล์ - การกำหนดค่าตัวจัดการฮุกแบบเดิมเป็นของพื้นผิวการเตือน/ย้ายข้อมูลของ doctor เท่านั้น
รันไทม์ต้องไม่โหลด
hooks.internal.handlersฮุกทำงานผ่านไดเรกทอรีฮุก ที่ค้นพบและเมทาดาทาHOOK.mdเท่านั้น - การเริ่มต้นรันไทม์ พาธตอบกลับที่ใช้งานหนัก Compaction การรีเซ็ต การกู้คืน การวินิจฉัย
TTS ฮุกหน่วยความจำ เอเจนต์ย่อย การกำหนดเส้นทางคำสั่ง Plugin ขอบเขตโปรโตคอล และ
ฮุก ต้องส่ง
{agentId, sessionId}ผ่านรันไทม์ - การทดสอบควรเตรียมและตรวจยืนยันแถวบันทึกบทสนทนา SQLite ผ่าน
{agentId, sessionId}ควรลบการทดสอบที่พิสูจน์เพียงการส่งต่อพาธ JSONL การคงตัวระบุตำแหน่งที่ผู้เรียกส่งมา หรือความเข้ากันได้กับไฟล์บันทึกบทสนทนา เว้นแต่จะครอบคลุมการนำเข้าผ่าน doctor การสร้างข้อมูลประกอบสำหรับการสนับสนุน/ดีบัก ที่ไม่ใช่เซสชัน หรือรูปแบบโปรโตคอล runEmbeddedPiAgent(...)การรันของเวิร์กเกอร์ที่เตรียมไว้ และความพยายามแบบฝังตัว ภายใน ต้องไม่รับตัวระบุตำแหน่งบันทึกบทสนทนา โดยเปิดตัวจัดการบันทึกบทสนทนา SQLite ด้วย{agentId, sessionId}และส่งตัวจัดการนั้นไปยังเซสชันเอเจนต์ ที่เข้ากันได้กับ PI ซึ่งรวมไว้ภายใน เพื่อไม่ให้ผู้เรียกที่ล้าสมัยทำให้รันเนอร์เขียน บันทึกบทสนทนา JSON/JSONL ได้- การวินิจฉัยของรันเนอร์ต้องจัดเก็บระเบียนการติดตามรันไทม์/แคช/เพย์โหลดใน SQLite การวินิจฉัยรันไทม์ต้องไม่เปิดเผยตัวเลือกแทนที่ไฟล์ JSONL หรือเครื่องมือช่วยส่งออก JSONL ของบันทึกบทสนทนาแบบทั่วไป การส่งออกที่ผู้ใช้มองเห็นสามารถสร้างอาร์ติแฟกต์ ที่ระบุชัดจากแถวฐานข้อมูลได้โดยไม่ส่งชื่อไฟล์กลับเข้าสู่รันไทม์
- การบันทึกสตรีมดิบใช้
OPENCLAW_RAW_STREAM=1ร่วมกับแถวการวินิจฉัย SQLite สัญญาตัวบันทึกไฟล์ pi-mono แบบเก่า ได้แก่PI_RAW_STREAM,PI_RAW_STREAM_PATHและraw-openai-completions.jsonlไม่ได้เป็นส่วนหนึ่งของรันไทม์หรือการทดสอบ ของ OpenClaw - การสร้างดัชนีหน่วยความจำ QMD ต้องไม่ส่งออกบันทึกบทสนทนา SQLite ไปยังไฟล์ Markdown QMD สร้างดัชนีเฉพาะไฟล์หน่วยความจำที่กำหนดค่าไว้ ส่วนการค้นหาบันทึกบทสนทนาเซสชัน ยังคงใช้ SQLite เป็นที่จัดเก็บ
- พาธย่อยของ SDK สำหรับ QMD มีไว้สำหรับ QMD เท่านั้นในโค้ดใหม่ เครื่องมือช่วยสร้างดัชนี
บันทึกบทสนทนาเซสชัน SQLite อยู่บน
memory-core-host-engine-session-transcriptsการส่งออกซ้ำ ผ่าน QMD ใด ๆ มีไว้เพื่อความเข้ากันได้เท่านั้นและโค้ดรันไทม์ต้องไม่ใช้ - ดัชนีหน่วยความจำในตัวอยู่ในฐานข้อมูลเอเจนต์ที่เป็นเจ้าของ การกำหนดค่ารันไทม์และ
สัญญารันไทม์ที่แก้ค่าแล้วต้องไม่เปิดเผย
memorySearch.store.path; doctor ลบคีย์การกำหนดค่าแบบเดิมนั้น และโค้ดปัจจุบันส่งdatabasePathของเอเจนต์ภายใน
งานติดตั้งใช้งานควรลบโค้ดต่อไปจนกว่าข้อความเหล่านี้จะเป็นจริง โดยไม่มีข้อยกเว้นนอกขอบเขต doctor/นำเข้า/ส่งออก/ดีบัก
สถานะเป้าหมายและความคืบหน้า
เป้าหมายที่เคร่งครัด
- ฐานข้อมูล SQLite ส่วนกลางหนึ่งฐานเป็นเจ้าของสถานะระนาบควบคุม:
state/openclaw.sqlite - ฐานข้อมูล SQLite หนึ่งฐานต่อเอเจนต์เป็นเจ้าของสถานะระนาบข้อมูล:
agents/<agentId>/agent/openclaw-agent.sqlite - การกำหนดค่ายังคงใช้ไฟล์เป็นที่จัดเก็บ
openclaw.jsonไม่ได้เป็นส่วนหนึ่งของการปรับโครงสร้าง ฐานข้อมูลนี้ - ไฟล์แบบเดิมเป็นข้อมูลนำเข้าสำหรับการย้ายข้อมูลผ่าน doctor เท่านั้น
- รันไทม์ไม่เคยเขียนหรืออ่าน JSONL ของเซสชันหรือบันทึกบทสนทนาเป็นสถานะที่ใช้งานอยู่
สถานะเป้าหมาย
not-started: โค้ดรันไทม์ยุคไฟล์ยังคงเขียนสถานะที่ใช้งานอยู่migrating: โค้ด doctor/นำเข้าสามารถย้ายข้อมูลไฟล์เข้าสู่ SQLitedual-read: บริดจ์ชั่วคราวอ่านทั้ง SQLite และไฟล์แบบเดิม สถานะนี้ เป็นสิ่งต้องห้ามสำหรับการปรับโครงสร้างนี้ เว้นแต่จะมีการบันทึกไว้อย่างชัดเจนว่า ใช้เฉพาะกับ doctorsqlite-runtime: รันไทม์อ่านและเขียนเฉพาะ SQLiteclean: API และการทดสอบรันไทม์แบบเดิมถูกลบ และตัวป้องกันขัดขวาง การถดถอยdone: เอกสาร การทดสอบ การสำรองข้อมูล การย้ายข้อมูลผ่าน doctor และการตรวจสอบการเปลี่ยนแปลง พิสูจน์ สถานะที่สะอาด
สถานะปัจจุบัน
- เซสชัน:
cleanสำหรับรันไทม์ แถวเซสชันอยู่ในฐานข้อมูลต่อเอเจนต์ API รันไทม์ใช้{agentId, sessionId}หรือ{agentId, sessionKey}และsessions.jsonเป็นข้อมูลนำเข้าแบบเดิมสำหรับ doctor เท่านั้น - บันทึกบทสนทนา:
cleanสำหรับรันไทม์ เหตุการณ์ อัตลักษณ์ สแนปช็อต และเหตุการณ์รันไทม์ของวิถีบันทึกบทสนทนาอยู่ในฐานข้อมูลต่อเอเจนต์ รันไทม์ไม่ รับตัวระบุตำแหน่งบันทึกบทสนทนาหรือพาธบันทึกบทสนทนา JSONL อีกต่อไป - รันเนอร์ PI แบบฝังตัว:
cleanการรัน PI แบบฝังตัว เวิร์กเกอร์ที่เตรียมไว้ Compaction และลูปลองใหม่ ใช้ขอบเขตเซสชัน SQLite และปฏิเสธแฮนเดิลบันทึกบทสนทนาที่ล้าสมัย - Cron:
cleanสำหรับรันไทม์ รันไทม์ใช้cron_jobsและtask_runsที่ Cron เป็นเจ้าของ การทดสอบรันไทม์ใช้การตั้งชื่อstoreKeyของ SQLite และพาธ Cron ยุคไฟล์ยังคงอยู่ เฉพาะในการทดสอบการย้ายข้อมูลแบบเดิมผ่าน doctor - รีจิสทรีงาน:
cleanแถวรันไทม์ของงานและ Task Flow อยู่ในstate/openclaw.sqliteและตัวนำเข้า SQLite แบบไซด์คาร์ที่ยังไม่เผยแพร่ถูกลบแล้ว - สถานะ Plugin:
cleanแถวสถานะ/บล็อบของ Plugin อยู่ในฐานข้อมูลส่วนกลาง ที่ใช้ร่วมกัน และมีการป้องกันไม่ให้ใช้เครื่องมือช่วย SQLite แบบไซด์คาร์ของสถานะ Plugin เก่า - หน่วยความจำ:
sqlite-runtimeสำหรับหน่วยความจำในตัวและการสร้างดัชนีบันทึกบทสนทนาเซสชัน ตารางดัชนีหน่วยความจำอยู่ในฐานข้อมูลต่อเอเจนต์ สถานะหน่วยความจำของ Plugin ใช้ แถวสถานะ Plugin ที่ใช้ร่วมกัน และไฟล์หน่วยความจำแบบเดิมเป็นข้อมูลนำเข้าสำหรับการย้ายผ่าน doctor หรือเนื้อหาในพื้นที่ทำงานของผู้ใช้ - การสำรองข้อมูล:
sqlite-runtimeการสำรองข้อมูลจัดเตรียมสแนปช็อต SQLite แบบกระชับ ละเว้นไซด์คาร์ WAL/SHM ที่กำลังใช้งาน ตรวจสอบความสมบูรณ์ของ SQLite และบันทึกการรันสำรองข้อมูลใน ฐานข้อมูลส่วนกลาง - การตั้งค่าพื้นที่ทำงาน:
sqlite-runtimeการตั้งค่าเสร็จสมบูรณ์ การรับรองพื้นที่ทำงาน และแฮชบูตสแตรปที่สร้างขึ้นอยู่ในตาราง SQLite ที่ใช้ร่วมกันและมีชนิดกำกับ รันไทม์ ไม่อ่านหรือเขียน JSON ของพื้นที่ทำงานที่เลิกใช้แล้วและไซด์คาร์.attested; Doctor เป็นเจ้าของการนำเข้าที่ผ่านการตรวจสอบและการลบที่ผ่านการยืนยัน - การย้ายข้อมูลผ่าน Doctor:
migratingโดยเจตนา Doctor นำเข้า JSON JSONL และที่จัดเก็บแบบไซด์คาร์ที่เลิกใช้แล้วเข้าสู่ SQLite บันทึกการรัน/แหล่งที่มาของการย้ายข้อมูล และลบแหล่งที่มาที่ดำเนินการสำเร็จ - การอนุมัติ Exec:
file-runtimeTypeScript และ macOS ยังคงอ่านและเขียนexec-approvals.jsonของไดเรกทอรีสถานะที่ใช้งานอยู่ ส่วนสคีมาexec_approvals_configที่สงวนไว้ยังไม่มีเจ้าของรันไทม์ การเปลี่ยนผ่านในอนาคตต้อง เพิ่มการนำเข้าผ่าน doctor ในสถานะเดียวกันและย้ายรันไทม์ทั้งสองพร้อมกัน - สคริปต์ E2E:
cleanสำหรับความครอบคลุมรันไทม์ การเตรียมข้อมูล Docker MCP เขียนแถว SQLite สคริปต์ Docker สำหรับบริบทรันไทม์สร้าง JSONL แบบเดิมเฉพาะภายใน ข้อมูลเริ่มต้นสำหรับการย้ายผ่าน doctor และระบุชื่อพาธดัชนีเซสชันแบบเดิมไว้อย่างชัดเจน
งานที่เหลือ
- [x] เปลี่ยนชื่อตัวแปรที่จัดเก็บในการทดสอบรันไทม์ Cron ไม่ให้ใช้
storePathเว้นแต่ จะเป็นข้อมูลนำเข้าแบบเดิมสำหรับ doctor ไฟล์:src/cron/service.test-harness.ts,src/cron/service.runs-one-shot-main-job-disables-it.test.ts,src/cron/service/timer.regression.test.ts,src/cron/service/ops.test.ts,src/cron/service/store.test.ts,src/cron/service.heartbeat-ok-summary-suppressed.test.ts,src/cron/service.main-job-passes-heartbeat-target-last.test.ts,src/cron/store.test.tsหลักฐาน:pnpm check:database-first-legacy-stores;rg -n 'storePath' src/cron --glob '!**/commands/doctor/**' - [x] ลบหรือเปลี่ยนชื่อม็อกการทดสอบการส่งออกยุคไฟล์ที่ล้าสมัย
ไฟล์:
src/auto-reply/reply/commands-export-test-mocks.tsหลักฐาน:rg -n 'resolveSessionFilePath|sessionFile|storePath|transcriptLocator' src/auto-reply/reply - [x] ทำให้ข้อมูลเริ่มต้น JSONL แบบเดิมของบริบทรันไทม์ Docker เห็นได้ชัดว่าใช้เฉพาะกับ doctor
ไฟล์:
scripts/e2e/session-runtime-context-docker-client.tsหลักฐาน:rg -n 'sessions\\.json|sessionFile|\\.jsonl' scripts/e2e/session-runtime-context-docker-client.tsแสดงเฉพาะseedBrokenLegacySessionForDoctorMigration - [x] รักษาชนิดที่ Kysely สร้างให้สอดคล้องหลังการเปลี่ยนแปลงสคีมาใด ๆ
ไฟล์:
src/state/openclaw-state-schema.sql,src/state/openclaw-agent-schema.sql,src/state/*generated*หลักฐาน: ไม่มีการเปลี่ยนแปลงสคีมาในรอบนี้;pnpm db:kysely:check;pnpm lint:kysely - [x] รันการทดสอบแบบเจาะจงอีกครั้งสำหรับที่จัดเก็บ คำสั่ง และสคริปต์ที่แก้ไข
หลักฐาน:
pnpm test src/cron/service/store.test.ts src/cron/store.test.ts src/cron/service.heartbeat-ok-summary-suppressed.test.ts src/cron/service.main-job-passes-heartbeat-target-last.test.ts src/cron/service.every-jobs-fire.test.ts src/cron/service.persists-delivered-status.test.ts src/cron/service.runs-one-shot-main-job-disables-it.test.ts src/cron/service/ops.test.ts src/cron/service/timer.regression.test.ts src/auto-reply/reply/commands-export-session.test.ts extensions/telegram/src/thread-bindings.test.ts extensions/slack/src/monitor/message-handler/prepare.test.ts src/acp/translator.session-lineage-meta.test.ts;git diff --check - [x] ก่อนประกาศ
doneให้รันเกตการเปลี่ยนแปลงหรือการพิสูจน์แบบกว้างจากระยะไกล หลักฐาน:pnpm check:changed --timed -- <changed extension paths>ผ่านบน การรัน Hetzner Crabboxrun_3f1cabf6b25cหลังตั้งค่า Node 24/pnpm ชั่วคราวและ กำหนดเส้นทางพาธอย่างชัดเจนสำหรับพื้นที่ทำงานที่ซิงค์แล้วซึ่งไม่มี.git
ห้ามถดถอย
- ห้ามมีตัวระบุตำแหน่งบันทึกบทสนทนา
- ห้ามมีไฟล์เซสชันที่ใช้งานอยู่
- ห้ามมีฟิกซ์เจอร์ทดสอบ JSONL ปลอม ยกเว้นการทดสอบการย้ายข้อมูลแบบเดิมผ่าน doctor
- ห้ามเข้าถึง SQLite แบบดิบในจุดที่คาดให้ใช้ Kysely
- ห้ามมีการย้ายฐานข้อมูลยุคไฟล์ใหม่ สคีมาส่วนกลางยังคงอยู่ที่เวอร์ชัน
1สคีมาเวอร์ชัน1ต่อเอเจนต์ที่เผยแพร่แล้วมีการย้ายรันไทม์แบบจำกัดหนึ่งรายการไปยัง เวอร์ชัน2เพื่อให้อัตลักษณ์แหล่งที่มาของหน่วยความจำมีเสถียรภาพ
สมมติฐานจากการอ่านโค้ด
ไม่มีข้อสรุปด้านผลิตภัณฑ์เพิ่มเติมที่ขัดขวางแผนนี้ การติดตั้งใช้งานควร ดำเนินต่อไปภายใต้สมมติฐานต่อไปนี้:
- ใช้
node:sqliteโดยตรง และกำหนดให้เส้นทางการจัดเก็บนี้ใช้รันไทม์ Node ที่ปลอดภัยต่อการรีเซ็ต WAL (22.22.3+, 24.15+ หรือ 25.9+) - เก็บไฟล์การกำหนดค่าปกติไว้เพียงไฟล์เดียวเท่านั้น อย่าย้ายการกำหนดค่า manifest ของ Plugin หรือพื้นที่ทำงาน Git ไปไว้ใน SQLite ในการปรับโครงสร้างครั้งนี้
- ไม่จำเป็นต้องมีไฟล์สำหรับความเข้ากันได้ของรันไทม์ ไฟล์ JSON และ JSONL แบบเดิมเป็นเพียง อินพุตสำหรับการย้ายข้อมูลเท่านั้น ไฟล์ sidecar ของ SQLite ที่มีเฉพาะในสาขานี้ไม่เคยเผยแพร่ จึงถูกลบแทนที่จะนำเข้า
openclaw doctor --fixเป็นเจ้าของการย้ายข้อมูลจากไฟล์แบบเดิมไปยังฐานข้อมูล การเริ่มต้น รันไทม์เป็นเจ้าของเฉพาะการอัปเกรดแบบมีขอบเขตระหว่างเวอร์ชันสคีมา SQLite ที่เผยแพร่แล้ว และต้องไม่นำเข้าสถานะจากยุคที่ใช้ไฟล์- ความเข้ากันได้ของข้อมูลประจำตัวใช้กฎเดียวกัน กล่าวคือข้อมูลประจำตัวของรันไทม์อยู่ใน
SQLite ไฟล์
auth-profiles.jsonแบบเก่า,auth.jsonประจำเอเจนต์ และcredentials/oauth.jsonที่ใช้ร่วมกันเป็นอินพุตสำหรับการย้ายข้อมูลของ doctor จากนั้นจะถูกลบ หลังนำเข้า - สถานะแค็ตตาล็อกโมเดลที่สร้างขึ้นมีฐานข้อมูลรองรับ โค้ดรันไทม์ต้องไม่เขียน
agents/<agentId>/agent/models.json; ไฟล์models.jsonที่มีอยู่เป็นอินพุตแบบเดิม สำหรับ doctor และจะถูกลบหลังนำเข้าไปยังagent_model_catalogs - รันไทม์ต้องไม่ย้ายข้อมูล ปรับให้อยู่ในรูปแบบมาตรฐาน หรือเชื่อมตัวระบุตำแหน่งทรานสคริปต์
ข้อมูลระบุตัวตนของทรานสคริปต์ที่ใช้งานอยู่คือ
{agentId, sessionId}ใน SQLite พาธไฟล์เป็นเพียง อินพุตแบบเดิมสำหรับ doctor และsqlite-transcript://...ต้องหายไปจาก พื้นผิวของรันไทม์ โปรโตคอล hook และ Plugin แทนที่จะถูกใช้เป็น ตัวจัดการขอบเขต - การอ่านทรานสคริปต์ SQLite ของรันไทม์จะไม่เรียกใช้การย้ายรูปแบบรายการ JSONL แบบเก่า หรือเขียนทรานสคริปต์ทั้งหมดใหม่เพื่อความเข้ากันได้ การปรับรายการแบบเดิมให้อยู่ในรูปแบบมาตรฐานยังคงอยู่ใน ยูทิลิตี doctor/นำเข้าที่เรียกใช้อย่างชัดเจน Doctor จะปรับไฟล์ทรานสคริปต์ JSONL แบบเดิม ให้อยู่ในรูปแบบมาตรฐานก่อนแทรกแถว SQLite ส่วนแถวรันไทม์ปัจจุบัน ถูกเขียนด้วยสคีมาทรานสคริปต์ปัจจุบันอยู่แล้ว การส่งออกเส้นทางการทำงาน/เซสชัน จะอ่านแถวเหล่านั้นตามที่เป็น และต้องไม่ดำเนินการย้ายข้อมูลแบบเดิมในขณะส่งออก
- ตัวช่วยแยกวิเคราะห์/ย้ายข้อมูล JSONL ของทรานสคริปต์แบบเดิมมีไว้สำหรับ doctor เท่านั้น โค้ดรูปแบบ ทรานสคริปต์ของรันไทม์สร้างเฉพาะบริบททรานสคริปต์ SQLite ปัจจุบัน ส่วน doctor เป็นเจ้าของการอัปเกรดรายการ JSONL แบบเก่าก่อนแทรกแถว
- ตัวช่วยสตรีมทรานสคริปต์ JSONL แบบเก่าที่รันไทม์เป็นเจ้าของถูกลบแล้ว โค้ดนำเข้า ของ doctor เป็นเจ้าของการอ่านไฟล์แบบเดิมอย่างชัดเจน ส่วนประวัติเซสชันของรันไทม์อ่าน แถว SQLite
- การเชื่อมโยง app-server ของ Codex ใช้
sessionIdของ OpenClaw เป็นคีย์มาตรฐาน ในเนมสเปซสถานะ Plugin ของ Codex ส่วนsessionKeyเป็นเมทาดาทาสำหรับ การกำหนดเส้นทาง/การแสดงผล และต้องไม่แทนที่รหัสเซสชันถาวรหรือทำให้ ข้อมูลระบุตัวตนจากไฟล์ทรานสคริปต์กลับมาอีก - กลไกบริบทจะได้รับสัญญารันไทม์ปัจจุบันโดยตรง รีจิสทรี
ต้องไม่ห่อหุ้มกลไกด้วย shim สำหรับลองใหม่ที่ลบ
sessionKey,transcriptScopeหรือprompt; กลไกที่ไม่สามารถรับพารามิเตอร์แบบ ฐานข้อมูลมาก่อนในปัจจุบันควรล้มเหลวอย่างชัดเจนแทนที่จะถูกเชื่อมต่อผ่านตัวกลาง - เอาต์พุตการสำรองข้อมูลควรคงเป็นไฟล์เก็บถาวรหนึ่งไฟล์ เนื้อหาฐานข้อมูลควรถูกบรรจุ ลงในไฟล์เก็บถาวรนั้นเป็นสแนปช็อต SQLite แบบกะทัดรัด ไม่ใช่ไฟล์ sidecar ของ WAL ที่กำลังใช้งานแบบดิบ
- การค้นหาทรานสคริปต์มีประโยชน์ แต่ไม่จำเป็นสำหรับการปรับใช้แบบฐานข้อมูลมาก่อน ครั้งแรก ออกแบบสคีมาให้สามารถเพิ่ม FTS ได้ภายหลัง
- การดำเนินงานของ worker ควรยังคงเป็นฟีเจอร์ทดลองภายใต้การตั้งค่า ขณะที่ขอบเขต ฐานข้อมูลเริ่มลงตัว
ข้อค้นพบจากการอ่านโค้ด
สาขาปัจจุบันผ่านขั้นพิสูจน์แนวคิดมาแล้ว มีฐานข้อมูล
ที่ใช้ร่วมกันอยู่แล้ว, Node node:sqlite เชื่อมต่อผ่านตัวช่วยรันไทม์ขนาดเล็ก และ
พื้นที่จัดเก็บเดิมขณะนี้เขียนไปยัง state/openclaw.sqlite หรือฐานข้อมูล
openclaw-agent.sqlite ของเจ้าของ
งานที่เหลือไม่ใช่การเลือก SQLite แต่คือการรักษาขอบเขตใหม่ให้สะอาด และลบอินเทอร์เฟซที่สร้างขึ้นเพื่อความเข้ากันได้ทั้งหมดซึ่งยังดูคล้ายโลกแบบใช้ไฟล์เดิม:
- เซสชัน
storePathไม่ใช่ข้อมูลระบุตัวตนของรันไทม์ รูปแบบ fixture สำหรับการทดสอบ หรือ ฟิลด์เพย์โหลดสถานะอีกต่อไป การทดสอบรันไทม์และบริดจ์ไม่มีชื่อสัญญาstorePathแล้ว โดยโค้ด doctor/การย้ายข้อมูลเป็นเจ้าของคำศัพท์แบบเดิมนั้น - การเขียนเซสชันไม่ผ่านคิว
store-writer.tsภายในโพรเซสแบบเก่า อีกต่อไป การเขียนแพตช์ SQLite จะเตรียมข้อมูลนอกธุรกรรม จากนั้นใช้ธุรกรรม ตรวจสอบ/นำไปใช้แบบซิงโครนัสที่สั้น พร้อมการตรวจหาข้อขัดแย้งอย่างชัดเจน - การค้นหาพาธแบบเดิมยังมีกรณีใช้งานที่ถูกต้องสำหรับการย้ายข้อมูล แต่โค้ดรันไทม์ควร
หยุดถือว่า
sessions.jsonและไฟล์ทรานสคริปต์ JSONL เป็นเป้าหมายการเขียนที่เป็นไปได้ - ตารางที่เอเจนต์เป็นเจ้าของอยู่ในฐานข้อมูล SQLite ประจำเอเจนต์ ฐานข้อมูลส่วนกลางเก็บ
แถวรีจิสทรี/ระนาบควบคุม ส่วนข้อมูลระบุตัวตนของทรานสคริปต์คือ
{agentId, sessionId}ใน แถวทรานสคริปต์ประจำเอเจนต์ โค้ดรันไทม์ต้องไม่จัดเก็บพาธไฟล์ทรานสคริปต์ อย่างถาวรหรือย้ายตัวระบุตำแหน่งทรานสคริปต์ - Doctor นำเข้าไฟล์แบบเดิมหลายไฟล์อยู่แล้ว การเก็บกวาดคือทำให้กระบวนการนั้นเป็น การใช้งานการย้ายข้อมูลที่ชัดเจนเพียงชุดเดียวซึ่ง doctor เรียกใช้ พร้อมรายงาน การย้ายข้อมูลแบบถาวร
ไม่มีคำถามเพิ่มเติมเกี่ยวกับผลิตภัณฑ์ที่ขัดขวางการนำไปใช้
รูปแบบโค้ดปัจจุบัน
สาขานี้มีฐาน SQLite ที่ใช้ร่วมกันจริงอยู่แล้ว:
- ขณะนี้เวอร์ชันขั้นต่ำของรันไทม์ต้องเป็นบิลด์ Node ที่รีเซ็ต WAL ได้อย่างปลอดภัย: 22.22.3+,
24.15+ หรือ 25.9+ โดย
package.json, ตัวป้องกันรันไทม์ของ CLI, ค่าเริ่มต้นของตัวติดตั้ง, ตัวระบุตำแหน่งรันไทม์ของ macOS, CI และเอกสารการติดตั้งสาธารณะต่างกำหนดตรงกัน src/state/openclaw-state-db.tsเปิดopenclaw.sqlite, ตั้งค่า WAL,synchronous=NORMAL,busy_timeout=30000,foreign_keys=ONและใช้ โมดูลสคีมาที่สร้างขึ้นจากsrc/state/openclaw-state-schema.sql- ประเภทตาราง Kysely และโมดูลสคีมารันไทม์สร้างขึ้นจากฐานข้อมูล
SQLite แบบใช้แล้วทิ้งซึ่งสร้างจากไฟล์
.sqlที่คอมมิตไว้ โค้ดรันไทม์ไม่ เก็บสตริงสคีมาที่คัดลอกและวางไว้สำหรับฐานข้อมูลส่วนกลาง ฐานข้อมูลต่อเอเจนต์ หรือฐานข้อมูล บันทึกพร็อกซีอีกต่อไป - ที่เก็บรันไทม์อนุมานประเภทแถวที่เลือกและแทรกจากอินเทอร์เฟซ Kysely
DBที่สร้างขึ้นเหล่านั้น แทนการกำหนดรูปร่างแถว SQLite ซ้ำด้วยตนเอง ส่วน SQL ดิบ ยังคงจำกัดไว้เฉพาะการใช้สคีมา pragma และ DDL สำหรับการย้ายข้อมูลเท่านั้น - สคีมา SQLite ส่วนกลางยังคงอยู่ที่
user_version = 1สคีมาต่อเอเจนต์ อยู่ที่เวอร์ชัน2โดยตัวเปิดจะย้ายคีย์แหล่งหน่วยความจำของเวอร์ชัน1ที่เผยแพร่แล้วไปเป็นอัตลักษณ์จำนวนเต็มที่เสถียรแบบอะตอม การนำเข้าจากไฟล์ไปยังฐานข้อมูล ยังคงอยู่ในโค้ด doctor - มีการบังคับใช้ความเป็นเจ้าของเชิงสัมพันธ์ในจุดที่ขอบเขตความเป็นเจ้าของเป็นแหล่งมาตรฐาน:
แถวการย้ายแหล่งข้อมูลลบต่อเนื่องจาก
migration_runs, สถานะการส่งมอบงาน ลบต่อเนื่องจากtask_runsและแถวอัตลักษณ์ทรานสคริปต์ลบต่อเนื่องจาก เหตุการณ์ทรานสคริปต์ - ตารางที่ใช้ร่วมกันในปัจจุบันประกอบด้วย
agent_databases,auth_profile_stores,auth_profile_state,plugin_state_entries,plugin_blob_entries,media_blobs,skill_uploads,capture_sessions,capture_events,capture_blobs,sandbox_registry_entries,cron_jobs,commitments,delivery_queue_entries,model_capability_cache,workspace_setup_state,workspace_path_aliases,workspace_attestations,workspace_generated_bootstrap_hashes,native_hook_relay_bridges,current_conversation_bindings,plugin_binding_approvals,tui_last_sessions,acp_sessions,acp_replay_sessions,acp_replay_events,task_runs,task_delivery_state,flow_runs,subagent_runs,migration_runsและbackup_runs - สถานะตามอำเภอใจที่ Plugin เป็นเจ้าของจะไม่ได้รับตารางแบบมีประเภทซึ่งโฮสต์เป็นเจ้าของ Plugin
ที่ติดตั้งใช้
plugin_state_entriesสำหรับเพย์โหลด JSON ที่มีเวอร์ชัน และplugin_blob_entriesสำหรับข้อมูลไบต์ พร้อมความเป็นเจ้าของเนมสเปซ/คีย์ การล้างข้อมูลตาม TTL การสำรองข้อมูล และระเบียนการย้ายข้อมูลของ Plugin สถานะการประสานงาน Plugin ที่โฮสต์เป็นเจ้าของยังคง มีตารางแบบมีประเภทได้เมื่อโฮสต์เป็นเจ้าของสัญญาการสืบค้น เช่นplugin_binding_approvals - การย้ายข้อมูลของ Plugin เป็นการย้ายข้อมูลเหนือเนมสเปซที่ Plugin เป็นเจ้าของ ไม่ใช่การย้าย
สคีมาของโฮสต์ Plugin สามารถย้ายรายการสถานะ/บล็อบที่มีเวอร์ชันของตนเอง
ผ่านผู้ให้บริการการย้ายข้อมูล และโฮสต์จะบันทึกสถานะแหล่งที่มา/การทำงานไว้ใน
บัญชีแยกประเภทการย้ายข้อมูลตามปกติ การติดตั้ง Plugin ใหม่ไม่จำเป็นต้องเปลี่ยน
openclaw-state-schema.sqlเว้นแต่โฮสต์จะเข้ารับความเป็นเจ้าของ สัญญาข้าม Plugin ใหม่ด้วยตนเอง src/state/openclaw-agent-db.tsเปิดagents/<agentId>/agent/openclaw-agent.sqlite, ลงทะเบียนฐานข้อมูลใน DB ส่วนกลาง และเป็นเจ้าของตารางเซสชัน ทรานสคริปต์ VFS อาร์ติแฟกต์ แคช และดัชนีหน่วยความจำภายในเอเจนต์ ขณะนี้การค้นหารันไทม์ที่ใช้ร่วมกันอ่านรีจิสทรีagent_databasesแบบมีประเภทที่สร้างขึ้น แทนการสร้างการสืบค้นนั้นใหม่ในแต่ละ จุดเรียกใช้- ฐานข้อมูลส่วนกลางและต่อเอเจนต์บันทึกแถว
schema_metaซึ่งมีบทบาทของฐานข้อมูล เวอร์ชันสคีมา การประทับเวลา และ ID เอเจนต์สำหรับฐานข้อมูลเอเจนต์ DB ส่วนกลาง ยังคงอยู่ที่user_version = 1ส่วน DB ต่อเอเจนต์ใช้เวอร์ชัน2หลังจากการย้าย อัตลักษณ์แหล่งหน่วยความจำแบบมีขอบเขต - ขณะนี้อัตลักษณ์เซสชันต่อเอเจนต์มีตารางรากมาตรฐาน
sessionsซึ่งใช้session_idเป็นคีย์ โดยมีsession_key,session_scope,account_id,primary_conversation_id, การประทับเวลา ฟิลด์แสดงผล เมทาดาทาของโมเดล, ID ฮาร์เนส และการเชื่อมโยงพาเรนต์/การสร้างเป็นคอลัมน์ที่สืบค้นได้session_routesเป็นดัชนีเส้นทางที่ใช้งานอยู่แบบไม่ซ้ำจากsession_keyไปยังsession_idปัจจุบัน เพื่อให้คีย์เส้นทางย้ายไปยังเซสชันถาวรใหม่ได้โดยไม่ ทำให้การอ่านในเส้นทางด่วนต้องเลือกระหว่างแถวsessions.session_keyที่ซ้ำกัน เพย์โหลดเก่าsession_entries.entry_jsonที่มีรูปร่างเพื่อความเข้ากันได้เชื่อมอยู่กับ รากถาวรsession_idผ่านคีย์นอก และไม่ได้เป็นเพียง ตัวแทนระดับสคีมาแบบเดียวของเซสชันอีกต่อไป - อัตลักษณ์การสนทนาภายนอกต่อเอเจนต์เป็นเชิงสัมพันธ์ด้วยเช่นกัน:
conversationsเก็บอัตลักษณ์ผู้ให้บริการ/บัญชี/การสนทนาที่ทำให้เป็นมาตรฐาน และsession_conversationsเชื่อมเซสชัน OpenClaw หนึ่งเซสชันกับการสนทนาภายนอกหนึ่งรายการขึ้นไป ซึ่งรองรับเซสชัน DM แบบ main ที่ใช้ร่วมกัน ซึ่งเพียร์หลายรายสามารถแมปไปยังเซสชันเดียวโดยตั้งใจ ได้โดยไม่บันทึกข้อมูลเท็จในsession_keyนอกจากนี้ SQLite ยัง บังคับใช้ความไม่ซ้ำกันสำหรับอัตลักษณ์ผู้ให้บริการตามธรรมชาติ เพื่อไม่ให้ทูเพิล ช่องทาง/บัญชี/ชนิด/เพียร์/เธรดเดียวกันแยกไปยัง ID การสนทนาหลายรายการได้ เพียร์โดยตรงของ main ที่ใช้ร่วมกันเชื่อมด้วยบทบาทparticipantเพื่อให้ เซสชัน OpenClaw หนึ่งเซสชันสามารถแทนเพียร์ DM ภายนอกหลายรายได้โดยไม่ลดสถานะ เพียร์เก่าให้เป็นเพียงแถวที่เกี่ยวข้องอย่างคลุมเครือsessions.primary_conversation_idยังคง ชี้ไปยังเป้าหมายการส่งมอบแบบมีประเภทปัจจุบัน คอลัมน์การกำหนดเส้นทาง/สถานะที่เป็นชุดปิด ถูกบังคับใช้ด้วยข้อจำกัดCHECKของ SQLite แทนการพึ่งพา ยูเนียน TypeScript เพียงอย่างเดียว การฉายเซสชันรันไทม์จะล้างเงาการกำหนดเส้นทางเพื่อความเข้ากันได้ออกจากsession_entries.entry_jsonก่อนใช้คอลัมน์เซสชัน/การสนทนาแบบมีประเภท เพื่อไม่ให้เพย์โหลด JSON ที่ล้าสมัยทำให้เป้าหมายการส่งมอบกลับมาปรากฏอีก การกำหนดเส้นทางประกาศของเอเจนต์ย่อยก็ต้องใช้บริบทการส่งมอบ SQLite แบบมีประเภทเช่นกัน และจะไม่ย้อนกลับไปใช้ฟิลด์เส้นทางSessionEntryเพื่อความเข้ากันได้อีกต่อไป การสืบทอดการส่งมอบแบบชัดแจ้งของ Gatewaychat.sendอ่านบริบทการส่งมอบ SQLite แบบมีประเภทแทนฟิลด์เพื่อความเข้ากันได้origin/last*tools.effectiveอนุมานบริบทผู้ให้บริการ/บัญชี/เธรดจากแถว การส่งมอบ/การกำหนดเส้นทาง SQLite แบบมีประเภทเช่นกัน ไม่ใช่เงารายการเซสชันlast*ที่ล้าสมัย บริบทพรอมต์ของเหตุการณ์ระบบสร้างฟิลด์ช่องทาง/ปลายทาง/บัญชี/เธรดใหม่จาก ฟิลด์การส่งมอบแบบมีประเภท แทนเงาoriginขณะนี้ตัวช่วยdeliveryContextFromSessionที่ใช้ร่วมกันและตัวแมปเซสชันไปยังการสนทนา จะละเว้นSessionEntry.originโดยสิ้นเชิง มีเพียงฟิลด์การส่งมอบแบบมีประเภท และแถวการสนทนาเชิงสัมพันธ์เท่านั้นที่สร้างอัตลักษณ์เส้นทางด่วนได้ การปรับรายการเซสชันรันไทม์ให้เป็นมาตรฐานจะตัดoriginออกก่อนบันทึกหรือ ฉายentry_jsonและการเขียนเมทาดาทาขาเข้าจะเขียนฟิลด์ช่องทาง/แชต แบบมีประเภทพร้อมแถวการสนทนาเชิงสัมพันธ์ แทนการสร้างเงาต้นทางใหม่ - ขณะนี้เหตุการณ์ทรานสคริปต์ สแนปช็อตทรานสคริปต์ และเหตุการณ์รันไทม์ของวิถี
อ้างอิงรากมาตรฐานต่อเอเจนต์
sessionsและลบต่อเนื่องเมื่อเซสชัน ถูกลบ แถวอัตลักษณ์/การทำซ้ำได้อย่างปลอดภัยของทรานสคริปต์ยังคงลบต่อเนื่องจาก แถวเหตุการณ์ทรานสคริปต์ที่ตรงกัน - ขณะนี้ดัชนี memory-core ใช้ตารางฐานข้อมูลเอเจนต์ที่ระบุอย่างชัดเจน
memory_index_meta,memory_index_sources,memory_index_chunksและmemory_embedding_cacheโดยmemory_index_stateติดตามการเปลี่ยนแปลงรีวิชัน ดัชนีข้างเคียง FTS/เวกเตอร์แบบไม่บังคับใช้ชื่อmemory_index_chunks_ftsและmemory_index_chunks_vecแทนตารางชื่อทั่วไปmeta,files,chunks,chunks_ftsหรือchunks_vecชื่อมาตรฐานยังคงรักษารูปร่างแถว พาธ/แหล่งข้อมูลปัจจุบันและความเข้ากันได้ของเอ็มเบดดิงแบบซีเรียลไลซ์ ตารางเหล่านี้ เป็นแคชที่ได้มาสำหรับการค้นหา ไม่ใช่ที่เก็บทรานสคริปต์มาตรฐาน จึงสามารถ ลบและสร้างใหม่จากไฟล์เวิร์กสเปซหน่วยความจำและแหล่งข้อมูลที่กำหนดค่าไว้ได้ การเปิดดัชนีหน่วยความจำชื่อทั่วไปที่เผยแพร่แล้วจะย้ายเมทาดาทา แหล่งข้อมูล ชังก์ และแคชเอ็มเบดดิงไปยังตารางมาตรฐาน ส่วนตาราง FTS/เวกเตอร์ ที่ได้มาจะถูกสร้างใหม่ภายใต้ชื่อมาตรฐาน - ขณะนี้สถานะการกู้คืนการทำงานของเอเจนต์ย่อยอยู่ในแถว
subagent_runsแบบมีประเภทที่ใช้ร่วมกัน พร้อมคีย์เซสชันลูก ผู้ร้องขอ และตัวควบคุมที่มีดัชนี ไฟล์เก่าsubagents/runs.jsonเป็นเพียงอินพุตสำหรับการล้างข้อมูลของ Doctor รายการการทำงานในไฟล์ เป็นสถานะการกู้คืนชั่วคราว ดังนั้น Doctor จะบันทึกหลักฐานการเลิกใช้งานและ ทิ้งไฟล์โดยไม่นำเข้า เนื่องจากไฟล์ไม่สามารถพิสูจน์ได้ว่ารายการ ยังทำงานอยู่หรือล้าสมัยหลังจากแถว SQLite ถูกตัดออกแล้ว ผู้ดูแลระบบ ต้องปล่อยให้การทำงานที่ยังใช้งานอยู่จากยุคไฟล์เสร็จสิ้นก่อนอัปเกรดข้ามขอบเขตนี้ - ขณะนี้การผูกการสนทนาปัจจุบันอยู่ในแถวแบบมีประเภทที่ใช้ร่วมกัน
current_conversation_bindingsซึ่งใช้ ID การสนทนาที่ทำให้เป็นมาตรฐานเป็นคีย์ โดยมี คอลัมน์เอเจนต์/เซสชันเป้าหมาย ชนิดการสนทนา สถานะ เวลาหมดอายุ และเมทาดาทา เก็บเป็นคอลัมน์เชิงสัมพันธ์ แทนระเบียนการผูกแบบทึบแสงที่ซ้ำกัน คีย์การผูกแบบถาวรรวมชนิดการสนทนาที่ทำให้เป็นมาตรฐาน เพื่อให้ การอ้างอิงแบบโดยตรง/กลุ่ม/ช่องทางไม่ชนกัน และ SQLite จะปฏิเสธค่าชนิด/สถานะ การผูกที่ไม่ถูกต้อง ไฟล์เก่าbindings/current-conversations.jsonเป็นเพียงอินพุตการย้ายข้อมูลของ doctor - ขณะนี้การกู้คืนคิวการส่งมอบซ้อนทับคอลัมน์คิวแบบมีประเภทสำหรับช่องทาง เป้าหมาย
บัญชี เซสชัน การลองใหม่ ข้อผิดพลาด การส่งผ่านแพลตฟอร์ม และสถานะการกู้คืนลงบน
JSON สำหรับเล่นซ้ำ
entry_jsonยังคงเก็บเพย์โหลดสำหรับเล่นซ้ำ ฮุก และเพย์โหลด การจัดรูปแบบ แต่คอลัมน์แบบมีประเภทเป็นแหล่งข้อมูลที่มีอำนาจสำหรับการกำหนดเส้นทาง/สถานะคิวด่วน - ขณะนี้ตัวชี้การคืนค่าเซสชันล่าสุดของ TUI อยู่ในแถวแบบมีประเภทที่ใช้ร่วมกัน
tui_last_sessionsซึ่งใช้ขอบเขตการเชื่อมต่อ/เซสชัน TUI ที่แฮชแล้วเป็นคีย์ รันไทม์อ่านและเขียนเฉพาะ SQLite, อัปเซิร์ตแต่ละขอบเขตแบบอะตอม และ ไม่รวมเซสชัน Heartbeatopenclaw doctor --fixตรวจสอบความถูกต้องของ ไฟล์ JSON เก่าของ TUI อย่างเคร่งครัด เก็บแถว SQLite ที่ใหม่กว่า ตรวจสอบผลลัพธ์มาตรฐาน และลบไฟล์เดิมที่ไม่เปลี่ยนแปลง แทนการเก็บไฟล์ถาวรไว้ - ขณะนี้แฮชการปรับใช้คำสั่ง Discord อยู่ในที่เก็บ SQLite สำหรับสถานะ Plugin ที่ใช้ร่วมกัน
รันไทม์อ่านและเขียนเฉพาะคีย์ที่กำหนดขอบเขตตามแอปพลิเคชันอย่างแม่นยำ Doctor
ลบไฟล์เดิม
discord/command-deploy-cache.jsonที่สร้างใหม่ได้ โดยไม่นำเข้า ดังนั้นการเริ่มต้นครั้งถัดไปจะดำเนินการกระทบยอดตามมาตรฐานหนึ่งครั้ง - ขณะนี้ค่ากำหนด TTS เริ่มต้นอยู่ในแถว SQLite สำหรับสถานะ Plugin ที่ใช้ร่วมกัน ซึ่งใช้คีย์ภายใต้
Plugin
speech-coreไฟล์เก่าsettings/tts.jsonเป็นเพียงอินพุต การย้ายข้อมูลของ doctor รันไทม์ไม่อ่านหรือเขียนไฟล์ JSON ค่ากำหนด TTS อีกต่อไป และ ตัวแก้พาธเดิมอยู่ในโมดูลการย้ายข้อมูลของ doctor - ขณะนี้เมทาดาทาเป้าหมายข้อมูลลับกล่าวถึงที่เก็บ แทนการทำเสมือนว่า
เป้าหมายข้อมูลประจำตัวทุกแห่งเป็นไฟล์กำหนดค่า
openclaw.jsonยังคงเป็นที่เก็บการกำหนดค่า ส่วนเป้าหมายโปรไฟล์การรับรองความถูกต้องใช้แถว SQLite แบบมีประเภทauth_profile_storesโดยเก็บ ข้อมูลประจำตัวตามรูปแบบของผู้ให้บริการเป็นเพย์โหลด JSON - การตรวจสอบข้อมูลลับจะไม่สแกนไฟล์ต่อเอเจนต์
auth.jsonที่เลิกใช้แล้วอีกต่อไป Doctor เป็นผู้รับผิดชอบ การเตือน การนำเข้า และการลบไฟล์เดิมดังกล่าว - ขณะนี้ตัวช่วยพาธโปรไฟล์การรับรองความถูกต้องแบบเดิมอยู่ในโค้ดเดิมของ doctor ตัวช่วยพาธ
โปรไฟล์การรับรองความถูกต้องหลักจะแสดงอัตลักษณ์ที่เก็บการรับรองความถูกต้อง SQLite และตำแหน่งแสดงผล
ไม่ใช่พาธรันไทม์
auth-profiles.jsonหรือauth-state.json - ขณะนี้โมดูลรันไทม์สำหรับการกู้คืนการทำงานของเอเจนต์ย่อยและแคชความสามารถของโมเดล OpenRouter
แยกตัวอ่าน/เขียนสแนปช็อต SQLite ออกจากตัวช่วยนำเข้า JSON เดิมที่ใช้เฉพาะใน doctor
ความสามารถ OpenRouter ใช้แถวทั่วไปแบบมีประเภท
model_capability_cacheภายใต้provider_id = "openrouter"แทน บล็อบแคชทึบแสงก้อนเดียวหรือตารางโฮสต์เฉพาะผู้ให้บริการ การทำงานของเอเจนต์ย่อยtaskNameถูกเก็บในคอลัมน์แบบมีประเภทsubagent_runs.task_nameส่วนสำเนาpayload_jsonเป็นข้อมูลสำหรับเล่นซ้ำ/ดีบัก ไม่ใช่แหล่งข้อมูลสำหรับฟิลด์แสดงผลหรือ ค้นหาในเส้นทางด่วน src/agents/filesystem/virtual-agent-fs.sqlite.tsใช้งาน VFS ของ SQLite เหนือตารางvfs_entriesในฐานข้อมูลเอเจนต์ การอ่านไดเรกทอรี การส่งออก แบบเรียกซ้ำ การลบ และการเปลี่ยนชื่อใช้ช่วงคำนำหน้า(namespace, path)ที่มีดัชนี แทนการสแกนทั้งเนมสเปซหรือพึ่งพาการจับคู่พาธLIKEsrc/agents/runtime-worker.entry.tsสร้าง SQLite VFS, ที่เก็บอาร์ติแฟกต์ของเครื่องมือ, ที่เก็บอาร์ติแฟกต์ของการรัน และที่เก็บแคชแบบจำกัดขอบเขตสำหรับ worker แยกตามการรัน- สถานะการบูตสแตรปพื้นที่ทำงานเสร็จสมบูรณ์ ความใหม่ของการรับรอง และแฮชบูตสแตรป
ที่สร้างขึ้น จะเก็บอยู่ในแถว
workspace_setup_state,workspace_path_aliases,workspace_attestationsและworkspace_generated_bootstrap_hashesแบบมีชนิดที่ใช้ข้อมูลประจำตัวพื้นที่ทำงาน แบบมาตรฐานเป็นคีย์ นามแฝงเชิงข้อความและนามแฝงพาธจริงที่คงอยู่ช่วยให้ การป้องกันพื้นที่ทำงานที่สูญหายยังคงเสถียรหลัง symlink ที่กำหนดค่าไว้หายไป ส่วนนามแฝงที่เปลี่ยนปลายทางจะล้มเหลวแบบปิด ขณะรันจะไม่อ่านหรือเขียนopenclaw-workspace-state.json,.openclaw/workspace-state.json,workspace-attestations/*.attestedในไดเรกทอรีสถานะ หรือไฟล์ประกบ<workspace>.attestedอีกต่อไปopenclaw doctor --fixจะตรวจสอบและเข้าครอบครองแหล่งข้อมูลเดิม นำเข้าไปยัง SQLite พร้อมใบรับรองการย้ายข้อมูล ตรวจสอบแถวแบบมาตรฐาน แล้วจึงลบไฟล์ที่เข้าครอบครองไว้ - สคีมาที่ใช้ร่วมกันสงวนแถวซิงเกิลตัน
exec_approvals_configไว้ แต่การเปลี่ยน ขณะรันยังอยู่ระหว่างดำเนินการ TypeScript และโปรแกรมคู่หูบน macOS ยังคงใช้ ไฟล์ JSON ที่จำกัดขอบเขตตามสถานะ และต้องย้ายไปยัง SQLite พร้อมกัน - ขณะนี้ข้อมูลประจำตัวอุปกรณ์ของ TypeScript ใช้แถว
device_identitiesแบบมีชนิด โดยการนำเข้า JSON เดิมที่ใช้เฉพาะ doctor จะอยู่นอกเจ้าของส่วนขณะรัน การยืนยันตัวตน ของอุปกรณ์ยังคงใช้ไฟล์เป็นที่เก็บระหว่างรอการย้ายสคีมาและการย้ายข้อมูลข้ามรันไทม์ ที่ประสานงานกันไว้ โดยยังสงวนdevice_auth_tokensไว้สำหรับงานติดตามผลดังกล่าว - แคชการแลกเปลี่ยนโทเค็น GitHub Copilot ใช้ตารางสถานะ Plugin ของ SQLite ที่ใช้ร่วมกัน
ภายใต้
github-copilot/token-cache/defaultเนื่องจากเป็นสถานะแคชที่ผู้ให้บริการเป็นเจ้าของ จึงตั้งใจไม่เพิ่มตารางลงในสคีมาของโฮสต์ - Compaction ของ GitHub Copilot จะไม่เขียนไฟล์ประกบ
openclaw-compaction-*.jsonในพื้นที่ทำงานอีกต่อไป harness จะเรียก RPC สำหรับ Compaction ประวัติของ SDK สำหรับเซสชัน SDK ที่ติดตามอยู่ และ OpenClaw จะเก็บสถานะเซสชัน/บทถอดความ แบบคงทนไว้ใน SQLite แทนไฟล์เครื่องหมายความเข้ากันได้ - รันไทม์ Swift ที่ใช้ร่วมกัน (
OpenClawKit) ใช้รูปแบบstate/openclaw.sqlite#table/device_identitiesและคีย์แถวเดียวกันสำหรับข้อมูลประจำตัว อุปกรณ์ ไฟล์เดิมในคอนเทนเนอร์ของ Apple จะถูกนำเข้าโดยเจ้าของการย้ายข้อมูล Swift เนื่องจาก Doctor ของ TypeScript ไม่สามารถเข้าถึงคอนเทนเนอร์เหล่านั้นได้ การยืนยันตัวตน อุปกรณ์ของ Swift ยังคงใช้ไฟล์เป็นที่เก็บสำหรับงานติดตามผลด้านการยืนยันตัวตนที่ประสานงานกันไว้ - ข้อมูลประจำตัวอุปกรณ์ Android และการยืนยันตัวตนอุปกรณ์ที่แคชไว้ยังคงอยู่ในที่เก็บ ภายในแอป โดยต้องมีการย้ายข้อมูลแยกต่างหากที่ Android เป็นเจ้าของ การอ้างสิทธิ์ SQLite ของโฮสต์ไม่ได้อธิบายพฤติกรรม Android ในปัจจุบัน
- ประวัติแพ็กเกจล่าสุดของการแจ้งเตือน Android ใช้แถว
android_notification_recent_packagesแบบมีชนิด ขณะรันจะไม่ย้ายข้อมูลหรือ อ่านคีย์ CSV ของ SharedPreferences แบบเก่าอีกต่อไป - การสร้างข้อมูลประจำตัวอุปกรณ์จะล้มเหลวแบบปิดเมื่อมี
identity/device.jsonเดิมอยู่ เมื่อแถวข้อมูลประจำตัวใน SQLite ไม่ถูกต้อง หรือเมื่อไม่สามารถเปิด ที่เก็บข้อมูลประจำตัวใน SQLite ได้ Doctor จะนำเข้าและลบไฟล์นั้นก่อน เพื่อไม่ให้การเริ่มต้น ขณะรันหมุนเวียนข้อมูลประจำตัวสำหรับการจับคู่โดยไม่มีการแจ้งเตือนก่อนการย้ายข้อมูล - การเลือกข้อมูลประจำตัวอุปกรณ์เป็นคีย์แถวใน SQLite ไม่ใช่ตัวระบุตำแหน่งไฟล์ JSON การทดสอบ
และตัวช่วย Gateway จะส่งคีย์ข้อมูลประจำตัวอย่างชัดเจน เฉพาะการย้ายข้อมูลของ doctor และ
เกตเริ่มต้นแบบล้มเหลวปิดเท่านั้นที่รู้จักชื่อไฟล์
identity/device.jsonที่เลิกใช้แล้ว - ความเข้ากันได้สำหรับการรีเซ็ตเซสชันอยู่ในการย้ายการกำหนดค่าของ doctor แล้ว:
session.idleMinutesถูกย้ายไปยังsession.reset.idleMinutes,session.resetByType.dmถูกย้ายไปยังsession.resetByType.directและนโยบาย รีเซ็ตขณะรันจะอ่านเฉพาะคีย์รีเซ็ตแบบมาตรฐาน - ความเข้ากันได้ของการกำหนดค่าเดิมอยู่ภายใต้
src/commands/doctor/แล้ว การตรวจสอบreadConfigFileSnapshot()ตามปกติจะไม่นำเข้าตัวตรวจจับข้อมูลเดิมของ doctor หรือกำกับปัญหาข้อมูลเดิม ส่วนrunDoctorConfigPreflight()จะเพิ่มปัญหาเหล่านั้นสำหรับ การซ่อมแซม/การรายงานของ doctor ขั้นตอนการกำหนดค่าของ doctor จะนำเข้าsrc/commands/doctor/legacy-config.tsและการซ่อมแซมรหัสโปรไฟล์ OAuth แบบเก่าจะอยู่ ภายใต้src/commands/doctor/legacy/oauth-profile-ids.ts - คำสั่งที่ไม่ใช่ doctor จะไม่เรียกใช้การซ่อมแซมการกำหนดค่าเดิมโดยอัตโนมัติ ตัวอย่างเช่น
ขณะนี้
openclaw update --channelจะล้มเหลวเมื่อพบการกำหนดค่าเดิมที่ไม่ถูกต้อง และขอให้ ผู้ใช้เรียกใช้ doctor แทนการนำเข้าโค้ดการย้ายข้อมูลของ doctor โดยไม่มีการแจ้งเตือน - ขณะนี้ Web push, APNs, Voice Wake, การตรวจสอบการอัปเดต และสุขภาพการกำหนดค่าใช้ตาราง SQLite แบบมีชนิดที่ใช้ร่วมกันสำหรับการสมัครรับข้อมูล คีย์ VAPID การลงทะเบียน Node แถวทริกเกอร์ แถวการกำหนดเส้นทาง สถานะการแจ้งเตือนการอัปเดต และรายการสุขภาพการกำหนดค่า แทน บล็อบ JSON ทึบแสงทั้งก้อน การเขียนของ Web Push และ APNs จะ upsert เฉพาะแถว คีย์หลักที่ได้รับผลกระทบ ส่วนสุขภาพการกำหนดค่าจะปรับข้อมูลให้สอดคล้องตามพาธการกำหนดค่า โมดูล ขณะรันของส่วนเหล่านี้ยังคงแยกจากตัวช่วยนำเข้า JSON เดิมที่ใช้เฉพาะ Doctor
- ขณะรัน APNs จะอ่านและเขียนเฉพาะ
apns_registrationsopenclaw doctor --fixที่เรียกใช้อย่างชัดเจนจะนำเข้าpush/apns-registrations.jsonที่เลิกใช้แล้วอย่างเคร่งครัด รักษาแถวแบบมาตรฐานที่มีอยู่ ตรวจสอบ ธุรกรรม บันทึกใบรับรอง และลบ JSON ที่มีข้อมูลลับ การลองใหม่ที่อ้างอิงใบรับรองจะดำเนินการเฉพาะการทำความสะอาด ขณะที่apns_registration_tombstonesครอบคลุมการทำให้ใช้ไม่ได้ก่อนการซ่อมแซมครั้งแรก เพื่อไม่ให้ สิทธิ์อนุญาตรีเลย์หรือโทเค็นอุปกรณ์ที่ล้าสมัยกลับมาทำงานได้อีก - ขณะนี้การกำหนดค่าโฮสต์ Node ใช้แถวซิงเกิลตันแบบมีชนิดในฐานข้อมูล SQLite ที่ใช้ร่วมกัน
ขณะรันจะล้มเหลวแบบปิดตราบใดที่ยังมีไฟล์
node.jsonเก่าหรือการเข้าครอบครอง ที่ถูกขัดจังหวะอยู่ ส่วนopenclaw doctor --fixที่เรียกใช้อย่างชัดเจนจะนำเข้าและลบไฟล์ดังกล่าว อย่างเคร่งครัดก่อนการใช้งานขณะรันตามปกติ - ขณะนี้การจับคู่อุปกรณ์/Node การจับคู่ช่องทาง รายการอนุญาตของช่องทาง และสถานะบูตสแตรป
ใช้แถว SQLite แบบมีชนิดแทนบล็อบ JSON ทึบแสงทั้งก้อน การอนุมัติการผูก Plugin
และสถานะงาน Cron ใช้การแบ่งแบบเดียวกัน กล่าวคือ โมดูลขณะรันจะเปิดเผย
การดำเนินการที่ใช้ SQLite เป็นที่เก็บและตัวช่วยสแนปช็อตที่เป็นกลาง และการเขียนสแนปช็อต
สำหรับการจับคู่/บูตสแตรป รวมถึงการอนุมัติการผูก Plugin จะปรับแถวให้สอดคล้องตามคีย์หลัก
แทนการตัดข้อมูลในตาราง ขณะที่ doctor นำเข้า/ลบไฟล์ JSON เก่าผ่านโมดูล
src/commands/doctor/legacy/* - ขณะนี้ระเบียน Plugin ที่ติดตั้งแล้วอยู่ในดัชนี Plugin ที่ติดตั้งของ SQLite
การอ่าน/เขียนการกำหนดค่าขณะรันจะไม่ย้ายหรือเก็บรักษาข้อมูลการกำหนดค่าที่สร้างขึ้นแบบเก่า
ใน
plugins.installsอีกต่อไป โดย doctor จะนำเข้ารูปแบบการกำหนดค่าเดิมดังกล่าว ไปยัง SQLite ก่อนการใช้งานขณะรันตามปกติ - ขณะนี้สแนปช็อตการกู้คืนข้อมูลรับรอง QQBot อยู่ในสถานะ Plugin ของ SQLite ภายใต้
qqbot/credential-backupsขณะรันจะไม่เขียนqqbot/data/credential-backup*.jsonอีกต่อไป สัญญา doctor ของ QQBot จะนำเข้าและ เก็บถาวรไฟล์สำรองเดิมเหล่านั้นจากไดเรกทอรีสถานะที่ใช้งานอยู่ - การวางแผนโหลด Gateway ใหม่จะเปรียบเทียบสแนปช็อตดัชนี Plugin ที่ติดตั้งใน SQLite ภายใต้
เนมสเปซ diff ภายใน
installedPluginIndex.installRecords.*การตัดสินใจ โหลดใหม่ขณะรันจะไม่ห่อแถวเหล่านั้นด้วยออบเจ็กต์การกำหนดค่าplugins.installsปลอมอีกต่อไป - ขณะนี้ข้อมูลรับรองบัญชี Matrix อยู่ในสถานะ Plugin ของ SQLite ขณะรันจะอ่าน
เฉพาะที่เก็บแบบมาตรฐานดังกล่าว ส่วน Doctor จะนำเข้า ตรวจสอบ และเก็บถาวรไฟล์
credentials/matrix/credentials*.jsonที่เลิกใช้แล้วเมื่อสามารถระบุบัญชีของไฟล์เหล่านั้นได้ - โมดูลขณะรันสำหรับการจับคู่หลักและ Cron จะไม่ใช้ตัวสร้างพาธ JSON เดิมอีกต่อไป
ตัวช่วย SDK สำหรับพาธการจับคู่ที่เลิกใช้แล้วยังคงมีไว้เพื่อความเข้ากันได้สำหรับการย้ายข้อมูลเท่านั้น
การย้ายสถานะของ doctor เป็นเจ้าของการอ่านและนำเข้าไฟล์ดังกล่าว โมดูลข้อมูลเดิมที่ doctor
เป็นเจ้าของจะสร้างพาธต้นทาง
pending.json,paired.json,bootstrap.jsonและcron/jobs.jsonสำหรับการทดสอบการนำเข้าและการย้ายข้อมูลเท่านั้น การปรับรูปแบบงาน Cron เดิมให้เป็นมาตรฐานและการนำเข้าประวัติ JSONL อยู่ภายใต้src/commands/doctor/cron/ส่วนการทำให้ประวัติ SQLite เดิมเสร็จสมบูรณ์จะทำงานระหว่าง การเปิดฐานข้อมูลสถานะ src/commands/doctor/legacy/runtime-state.tsนำเข้าไฟล์สถานะ JSON เดิม รวมถึงการกำหนดค่าโฮสต์ Node ไปยัง SQLite จาก doctor ตัวนำเข้าไฟล์เดิมใหม่ จะอยู่ภายใต้src/commands/doctor/legacy/src/commands/doctor/state-migrations.tsนำเข้าบทถอดความsessions.jsonและ*.jsonlเดิมไปยัง SQLite โดยตรง และลบแหล่งข้อมูลที่นำเข้าสำเร็จ โดยจะไม่พักบทถอดความเดิมระดับรูทผ่านagents/<agentId>/sessions/*.jsonlหรือสร้างเป้าหมาย JSONL แบบมาตรฐานก่อน การนำเข้าอีกต่อไป- การตรวจสอบความสมบูรณ์ของสถานะโดย doctor จะไม่สแกนไดเรกทอรีเซสชันเดิมหรือ เสนอให้ลบ JSONL กำพร้าอีกต่อไป ไฟล์บทถอดความเดิมเป็นเพียงข้อมูลนำเข้าสำหรับการย้ายข้อมูล และขั้นตอนการย้ายข้อมูลเป็นเจ้าของทั้งการนำเข้าและการลบแหล่งข้อมูล
- การนำเข้ารีจิสทรี sandbox เดิมอยู่ภายใต้
src/commands/doctor/legacy/sandbox-registry.tsส่วนการอ่านและเขียนรีจิสทรี sandbox ที่ใช้งานอยู่จะยังคงใช้ SQLite เท่านั้น - การซ่อมแซมสุขภาพ/การนำเข้าบทถอดความเซสชันเดิมอยู่ภายใต้
src/commands/doctor/legacy/session-transcript-health.tsโมดูลคำสั่งขณะรัน จะไม่มีโค้ดแยกวิเคราะห์บทถอดความ JSONL หรือซ่อมแซมสาขาที่ใช้งานอยู่อีกต่อไป
ไฮไลต์ของการรวมและการลบที่เสร็จสมบูรณ์:
- สถานะ Plugin ใช้ฐานข้อมูล
state/openclaw.sqliteที่ใช้ร่วมกันแล้ว ตัวนำเข้า sidecar แบบplugin-state/state.sqliteเฉพาะ branch เดิมถูกนำออก เนื่องจากโครงสร้าง SQLite ดังกล่าวไม่เคยเผยแพร่ ตัวช่วย probe/test รายงานdatabasePathที่ใช้ร่วมกันแทนการเปิดเผยพาธ SQLite เฉพาะสำหรับสถานะ Plugin - ตารางรันไทม์ของงานและ Task Flow อยู่ในฐานข้อมูล
state/openclaw.sqliteที่ใช้ร่วมกันแล้ว แทนtasks/runs.sqliteและtasks/flows/registry.sqlite; ตัวนำเข้า sidecar เดิมถูกนำออกด้วยเหตุผลเดียวกันคือโครงสร้างดังกล่าวไม่เคยเผยแพร่ src/config/sessions/store.tsไม่ต้องใช้storePathสำหรับเมทาดาทาขาเข้า การอัปเดตเส้นทาง หรือการอ่านเวลาอัปเดตล่าสุดอีกต่อไป การคงอยู่ของคำสั่ง การล้างเซสชัน CLI ความลึกของ subagent การแทนที่ค่าการยืนยันตัวตน และข้อมูลประจำตัวของเซสชัน transcript ใช้ API แถวของเอเจนต์/เซสชัน การเขียนถูกนำไปใช้เป็นแพตช์แถว SQLite พร้อมลองใหม่เมื่อเกิดข้อขัดแย้งแบบ optimistic- การแก้ไขเป้าหมายเซสชันเปิดเผยเป้าหมายฐานข้อมูลแยกตามเอเจนต์แล้ว ไม่ใช่พาธ
sessions.jsonแบบเดิม Gateway ที่ใช้ร่วมกัน เมทาดาทา ACP การซ่อมแซมเส้นทางของ doctor และopenclaw sessionsแจกแจงagent_databasesรวมถึงเอเจนต์ที่กำหนดค่าไว้ - การกำหนดเส้นทางเซสชันของ Gateway ใช้
resolveGatewaySessionDatabaseTargetแล้ว; เป้าหมายที่ส่งกลับมีdatabasePathและคีย์แถว SQLite ที่เป็นไปได้ แทนพาธไฟล์ที่เก็บเซสชันแบบเดิม - ชนิดรันไทม์เซสชันของช่องทางเปิดเผย
{agentId, sessionKey}สำหรับการอ่านเวลาอัปเดตล่าสุด เมทาดาทาขาเข้า และการอัปเดตเส้นทางล่าสุดแล้ว ชนิดความเข้ากันได้saveSessionStore(storePath, store)แบบเดิมถูกนำออกแล้ว - พื้นผิวเซสชันของรันไทม์ Plugin, API ส่วนขยาย และ SDK ของ Plugin เปิดเผยตัวช่วยแถวเซสชันที่มี SQLite รองรับแล้ว แทนตัวช่วยความเข้ากันได้แบบทั้งพื้นที่จัดเก็บ/ไฟล์ของเซสชันที่ใช้งานอยู่ การส่งออกความเข้ากันได้ของไลบรารีรากยังคงใช้ได้เฉพาะภายนอก SDK ของ Plugin สำหรับผู้เรียกใช้ภายในแบบเดิมและผู้เรียกใช้การย้ายข้อมูล ตัวช่วย
resolveLegacySessionStorePathแบบเดิมถูกนำออกแล้ว; การสร้างพาธsessions.jsonแบบเดิมอยู่เฉพาะในการย้ายข้อมูลและฟิกซ์เจอร์ทดสอบแล้ว src/config/sessions/session-entries.sqlite.tsจัดเก็บรายการเซสชันมาตรฐานในฐานข้อมูลแยกตามเอเจนต์แล้ว และรองรับแพตช์การอ่าน/upsert/ลบระดับแถว การ upsert/แพตช์/ลบขณะรันไทม์จะไม่สแกนหารูปแบบตัวพิมพ์ที่แตกต่างกันหรือตัดคีย์นามแฝงแบบเดิมอีกต่อไป; doctor เป็นเจ้าของการทำให้เป็นมาตรฐาน ตัวช่วยนำเข้า JSON แบบแยกเดี่ยวถูกนำออกแล้ว และการย้ายข้อมูลจะผสานโดย upsert แถวที่ใหม่กว่าแทนการแทนที่ตารางเซสชันทั้งหมด ตัวช่วยอ่าน/แสดงรายการ/โหลดสาธารณะฉายเมทาดาทาเซสชันที่ใช้งานบ่อยจากแถวsessionsและconversationsที่มีชนิด;entry_jsonเป็นเงาสำหรับความเข้ากันได้/การดีบัก และอาจเก่าหรือไม่ถูกต้องได้โดยไม่ทำให้ข้อมูลประจำตัวของเซสชันหรือบริบทการส่งที่มีชนิดสูญหายsrc/config/sessions/delivery-info.tsแก้ไขบริบทการส่งจากแถวsessions+conversations+session_conversationsแยกตามเอเจนต์ที่มีชนิดแล้ว โดยจะไม่สร้างข้อมูลประจำตัวการส่งขณะรันไทม์ขึ้นใหม่จากsession_entries.entry_jsonอีกต่อไป; การไม่มีแถวการสนทนาที่มีชนิดเป็นปัญหาการย้ายข้อมูล/ซ่อมแซมของ doctor ไม่ใช่ fallback ขณะรันไทม์- การตัดสินใจรีเซ็ตเซสชันที่จัดเก็บไว้ให้ความสำคัญกับเมทาดาทา
sessions.session_scope,sessions.chat_typeและsessions.channelที่มีชนิดแล้ว การแยกวิเคราะห์sessionKeyยังคงมีไว้เฉพาะสำหรับส่วนต่อท้ายเธรด/หัวข้อที่ระบุอย่างชัดเจนบนเป้าหมายคำสั่ง; การจำแนกการรีเซ็ตแบบกลุ่มเทียบกับแบบโดยตรงจะไม่ได้มาจากรูปทรงของคีย์อีกต่อไป - การจำแนกการแสดงรายการ/สถานะเซสชันใช้เมทาดาทาแชตที่มีชนิดและชนิดเซสชันของ Gateway แล้ว โดยจะไม่ถือว่าสตริงย่อย
:group:หรือ:channel:ภายในsession_keyเป็นข้อเท็จจริงถาวรว่าเป็นกลุ่ม/โดยตรงอีกต่อไป - การเลือกนโยบายการตอบกลับแบบเงียบใช้เฉพาะชนิดการสนทนาหรือเมทาดาทาพื้นผิวที่ระบุอย่างชัดเจนแล้ว โดยจะไม่คาดเดานโยบายแบบโดยตรง/กลุ่มจากสตริงย่อย
session_keyอีกต่อไป - การแก้ไขโมเดลการแสดงเซสชันรับรหัสเอเจนต์จากเป้าหมายฐานข้อมูลเซสชัน SQLite แล้ว แทนการแยกออกจาก
session_key - การเติมข้อมูลเป้าหมายประกาศระหว่างเอเจนต์ใช้เฉพาะ
sessions.listdeliveryContextที่มีชนิดแล้ว โดยจะไม่กู้คืนการกำหนดเส้นทางช่องทาง/บัญชี/เธรดจากoriginแบบเดิม ฟิลด์เงาlast*หรือรูปทรงsession_keyอีกต่อไป - การปฏิเสธเป้าหมายเธรดของ
sessions_sendอ่านเมทาดาทาการกำหนดเส้นทาง SQLite ที่มีชนิดแล้ว โดยจะไม่ปฏิเสธหรือยอมรับเป้าหมายด้วยการแยกวิเคราะห์ส่วนต่อท้ายเธรดออกจากคีย์เป้าหมายอีกต่อไป - การตรวจสอบนโยบายเครื่องมือที่มีขอบเขตระดับกลุ่มอ่านการกำหนดเส้นทางการสนทนา SQLite ที่มีชนิดสำหรับเซสชันปัจจุบันหรือเซสชันที่สร้างขึ้นแล้ว โดยจะไม่เชื่อถือข้อมูลประจำตัวของกลุ่ม/ช่องทางจากการถอดรหัส
sessionKeyอีกต่อไป; รหัสกลุ่มที่ผู้เรียกใช้ระบุจะถูกละทิ้งเมื่อไม่มีแถวเซสชันที่มีชนิดรับรอง - การจับคู่การแทนที่โมเดลของช่องทางใช้เมทาดาทาการสนทนาแบบกลุ่มและแบบแม่ที่ระบุอย่างชัดเจนแล้ว โดยจะไม่ถอดรหัสรหัสการสนทนาแม่จาก
parentSessionKeyอีกต่อไป - การสืบทอดการแทนที่โมเดลที่จัดเก็บไว้ต้องมีคีย์เซสชันแม่ที่ระบุอย่างชัดเจนจากบริบทเซสชันที่มีชนิดแล้ว โดยจะไม่อนุมานการแทนที่จากเซสชันแม่จากส่วนต่อท้าย
:thread:หรือ:topic:ในsessionKeyอีกต่อไป - ตัวห่อข้อมูลเธรดเซสชันแบบเดิมและตัวแยกวิเคราะห์เธรดของ Plugin ที่โหลดแล้วถูกนำออก; ไม่มีโค้ดรันไทม์ใดนำเข้า
config/sessions/thread-info - ตัวช่วยการสนทนาของช่องทางไม่เปิดเผยบริดจ์การแยกวิเคราะห์คีย์เซสชันแบบเต็มอีกต่อไป Core ยังคงทำให้รหัสการสนทนาดิบที่ผู้ให้บริการเป็นเจ้าของเป็นมาตรฐานผ่าน
resolveSessionConversation(...)แต่จะไม่สร้างข้อเท็จจริงของเส้นทางขึ้นใหม่จากsessionKey - การส่งผลลัพธ์เมื่อเสร็จสิ้น นโยบายการส่ง และการบำรุงรักษางานจะไม่อนุมานชนิดแชตจากรูปทรง
session_keyอีกต่อไป ตัวแยกวิเคราะห์คีย์ชนิดแชตแบบเดิมถูกลบแล้ว; เส้นทางเหล่านี้ต้องใช้เมทาดาทาเซสชันที่มีชนิด บริบทการส่งที่มีชนิด หรือคำศัพท์เป้าหมายการส่งที่ระบุอย่างชัดเจน - รายการ/สถานะเซสชัน การวินิจฉัย การผูกบัญชีการอนุมัติ การกรอง Heartbeat ของ TUI และสรุปการใช้งานจะไม่ขุดค้น
SessionEntry.originเพื่อหาการกำหนดเส้นทางผู้ให้บริการ/บัญชี/เธรด/การแสดงผลอีกต่อไป การอ่านoriginขณะรันไทม์ที่เหลืออยู่มีเฉพาะแนวคิดที่ไม่ใช่เซสชันหรือออบเจ็กต์การส่งของเทิร์นปัจจุบัน - การค้นหาการสนทนาแบบเนทีฟสำหรับคำขออนุมัติอ่านแถวการกำหนดเส้นทางเซสชันแยกตามเอเจนต์ที่มีชนิดแล้ว โดยจะไม่แยกวิเคราะห์ข้อมูลประจำตัวการสนทนาแบบช่องทาง/กลุ่ม/เธรดจาก
sessionKeyอีกต่อไป; การไม่มีเมทาดาทาที่มีชนิดเป็นปัญหาการย้ายข้อมูล/ซ่อมแซม - เพย์โหลดเหตุการณ์เซสชันเปลี่ยนแปลง/แชต/เซสชันของ Gateway จะไม่สะท้อนเงาเส้นทาง
SessionEntry.originหรือlast*อีกต่อไป; ไคลเอนต์ได้รับchannel,chatTypeและdeliveryContextที่มีชนิด - การแก้ไขการส่ง Heartbeat สามารถรับ
deliveryContextของ SQLite ที่มีชนิดได้โดยตรงแล้ว และรันไทม์ Heartbeat ส่งแถวการส่งของเซสชันแยกตามเอเจนต์ แทนการพึ่งพาเงาความเข้ากันได้session_entriesสำหรับการกำหนดเส้นทางปัจจุบัน - การแก้ไขเป้าหมายการส่งของเอเจนต์แยกของ Cron ยังเติมข้อมูลเส้นทางปัจจุบันจากแถวการส่งเซสชันแยกตามเอเจนต์ที่มีชนิด ก่อน fallback ไปยังเพย์โหลดรายการความเข้ากันได้
- การแก้ไขต้นทางประกาศของ subagent ส่งต่อบริบทการส่งของเซสชันผู้ร้องขอที่มีชนิดผ่าน
loadRequesterSessionEntryแล้ว และให้ความสำคัญกับแถวดังกล่าวเหนือเงาความเข้ากันได้last*/deliveryContext - การอัปเดตเมทาดาทาเซสชันขาเข้าผสานกับแถวการส่งแยกตามเอเจนต์ที่มีชนิดก่อน; ฟิลด์การส่ง
SessionEntryแบบเดิมเป็นเพียง fallback เมื่อไม่มีแถวการสนทนาที่มีชนิด - การแยกข้อมูลการส่งสำหรับการรีสตาร์ต/อัปเดตให้
threadIdการส่งของ SQLite ที่มีชนิดมีลำดับความสำคัญเหนือส่วนย่อยหัวข้อ/เธรดที่แยกวิเคราะห์จากsessionKey; การแยกวิเคราะห์เป็นเพียง fallback สำหรับคีย์รูปทรงเธรดแบบเดิม - รหัสช่องทางของบริบทเอเจนต์ใน hook ให้ความสำคัญกับข้อมูลประจำตัวการสนทนา SQLite ที่มีชนิด แล้วจึงใช้เมทาดาทาข้อความที่ระบุอย่างชัดเจน โดยจะไม่แยกวิเคราะห์ส่วนย่อยผู้ให้บริการ/กลุ่ม/ช่องทางจาก
sessionKeyอีกต่อไป - การสืบทอดเส้นทางภายนอกของ
chat.sendใน Gateway อ่านเมทาดาทาการกำหนดเส้นทางเซสชัน SQLite ที่มีชนิดแล้ว แทนการอนุมานขอบเขตช่องทาง/โดยตรง/กลุ่มจากส่วนประกอบsessionKeyเซสชันที่มีขอบเขตระดับช่องทางจะสืบทอดเฉพาะเมื่อช่องทางเซสชันและชนิดแชตที่มีชนิดตรงกับบริบทการส่งที่จัดเก็บไว้; เซสชันหลักที่ใช้ร่วมกันยังคงกฎ CLI/ไม่มีเมทาดาทาไคลเอนต์ที่เข้มงวดกว่า - การปลุกด้วย restart sentinel และการกำหนดเส้นทางต่อเนื่องอ่านแถวการส่ง/การกำหนดเส้นทาง SQLite ที่มีชนิดแล้ว ก่อนเข้าคิวการปลุก Heartbeat หรือการดำเนินเทิร์นของเอเจนต์ต่อที่มีการกำหนดเส้นทาง โดยจะไม่สร้างบริบทการส่งขึ้นใหม่จากเงา JSON ของรายการเซสชันอีกต่อไป
- การแก้ไขบริบท
tools.effectiveของ Gateway อ่านแถวการส่ง/การกำหนดเส้นทาง SQLite ที่มีชนิดสำหรับอินพุตผู้ให้บริการ บัญชี เป้าหมาย เธรด และโหมดตอบกลับแล้ว โดยจะไม่กู้คืนฟิลด์การกำหนดเส้นทางที่ใช้งานบ่อยเหล่านั้นจากเงาต้นทางsession_entries.entry_jsonที่เก่าอีกต่อไป - การกำหนดเส้นทางการปรึกษาด้วยเสียงแบบเรียลไทม์แก้ไขการส่งของเซสชันแม่/การโทรจากแถวเซสชัน SQLite แยกตามเอเจนต์ที่มีชนิดแล้ว โดยจะไม่ fallback ไปยังเงาความเข้ากันได้
SessionEntry.deliveryContextอีกต่อไป เมื่อเลือกเส้นทางข้อความของเอเจนต์แบบฝัง - รีเลย์ Heartbeat สำหรับการสร้าง ACP และการกำหนดเส้นทางสตรีมแม่อ่านการส่งของเซสชันแม่จากแถวเซสชัน SQLite ที่มีชนิดแล้ว โดยจะไม่สร้างบริบทการส่งของเซสชันแม่ขึ้นใหม่จากเงารายการเซสชันเพื่อความเข้ากันได้อีกต่อไป
- การรักษาเส้นทางการส่งของเซสชันเป็นไปตามเมทาดาทาแชตที่มีชนิดและคอลัมน์การส่งที่คงอยู่แล้ว โดยจะไม่แยกคำใบ้ช่องทาง เครื่องหมายโดยตรง/หลัก หรือรูปทรงเธรดจาก
sessionKeyอีกต่อไป; เส้นทางเว็บแชตภายในจะสืบทอดเป้าหมายภายนอกเฉพาะเมื่อ SQLite มีข้อมูลประจำตัวการส่งที่มีชนิด/คงอยู่สำหรับเซสชันอยู่แล้ว - การแยกข้อมูลการส่งของเซสชันทั่วไปอ่านเฉพาะแถวการส่งเซสชัน SQLite ที่มีชนิดและตรงกันทุกประการ โดยจะไม่แยกวิเคราะห์ส่วนต่อท้ายเธรด/หัวข้อหรือ fallback จากคีย์รูปทรงเธรดไปยังคีย์เซสชันฐานอีกต่อไป
- การส่งต่อการตอบกลับ การกู้คืน restart sentinel และการกำหนดเส้นทางการปรึกษาด้วยเสียงแบบเรียลไทม์ใช้แถวเซสชัน/การสนทนา SQLite ที่มีชนิดและตรงกันทุกประการสำหรับการกำหนดเส้นทางเธรดแล้ว โดยจะไม่กู้คืนรหัสเธรดหรือบริบทการส่งของเซสชันฐานด้วยการแยกวิเคราะห์คีย์เซสชันรูปทรงเธรดอีกต่อไป
- การจำกัดประวัติ PI แบบฝังใช้การฉายการกำหนดเส้นทางเซสชัน SQLite ที่มีชนิด (
sessions+conversationsหลัก) สำหรับผู้ให้บริการ ชนิดแชต และข้อมูลประจำตัวเพียร์แล้ว โดยจะไม่แยกวิเคราะห์รูปทรงผู้ให้บริการ DM กลุ่ม หรือเธรดออกจากsessionKeyอีกต่อไป - การอนุมานการส่งของเครื่องมือ Cron ใช้การส่งที่ระบุอย่างชัดเจนหรือเฉพาะบริบทการส่งปัจจุบันที่มีชนิดแล้ว โดยจะไม่ถอดรหัสเป้าหมายช่องทาง เพียร์ บัญชี หรือเธรดจาก
agentSessionKeyอีกต่อไป - แถวเซสชันขณะรันไทม์ไม่มีนามแฝงเส้นทาง
lastProviderแบบเดิมอีกต่อไป ตัวช่วยและการทดสอบใช้ฟิลด์lastChannelและdeliveryContextที่มีชนิด; การย้ายข้อมูลของ doctor เป็นเพียงที่เดียวที่ควรแปลงนามแฝงเส้นทางเก่าหรือเงาoriginที่คงอยู่ - เหตุการณ์ transcript แถว VFS และแถวอาร์ติแฟกต์เครื่องมือเขียนลงฐานข้อมูลแยกตามเอเจนต์แล้ว ตารางการแมปไฟล์ transcript ส่วนกลางที่ไม่เคยเผยแพร่ถูกนำออก; doctor บันทึกพาธต้นทางแบบเดิมในแถวการย้ายข้อมูลถาวรแทน
- การค้นหา transcript ขณะรันไทม์จะไม่สแกนออฟเซ็ตไบต์ JSONL หรือตรวจหาไฟล์ transcript แบบเดิมอีกต่อไป เส้นทางแชต/สื่อ/ประวัติของ Gateway อ่านแถว transcript จาก SQLite; JSONL ของเซสชันเป็นเพียงอินพุตแบบเดิมของ doctor แล้ว ไม่ใช่สถานะขณะรันไทม์หรือรูปแบบการส่งออก
- ความสัมพันธ์ระหว่างเซสชันแม่และ branch ของ transcript ใช้เมทาดาทา
parentTranscriptScope: {agentId, sessionId}แบบมีโครงสร้างในส่วนหัว transcript ของ SQLite ไม่ใช่สตริงตัวระบุตำแหน่งagent-db:...transcript_events...ที่มีลักษณะคล้ายพาธ - สัญญาของตัวจัดการ transcript ไม่เปิดเผยคอนสตรักเตอร์
create(cwd)หรือcontinueRecent(cwd)ที่คงอยู่โดยปริยายอีกต่อไป ตัวจัดการ transcript ที่คงอยู่จะเปิดด้วยขอบเขต{agentId, sessionId}ที่ระบุอย่างชัดเจน; เฉพาะ ตัวจัดการในหน่วยความจำยังคงไม่ผูกกับขอบเขตสำหรับการทดสอบและการแปลงทรานสคริปต์แบบบริสุทธิ์ - API ของที่เก็บทรานสคริปต์ขณะรันไทม์จะระบุขอบเขต SQLite ไม่ใช่พาธระบบไฟล์ ตัวช่วย
resolve...ForPathเดิมและตัวเลือกการเขียนtranscriptPathที่ไม่ได้ใช้ ถูกนำออกจากผู้เรียกขณะรันไทม์แล้ว - ขณะนี้การระบุเซสชันขณะรันไทม์ใช้
{agentId, sessionId}และต้องไม่สร้าง สตริงsqlite-transcript://<agent>/<session>สำหรับขอบเขตภายนอก พาธ JSONL แบบสัมบูรณ์รุ่นเก่าเป็นอินพุตสำหรับการย้ายข้อมูลของ doctor เท่านั้น - ขณะนี้ระเบียน direct-bridge ของรีเลย์ฮุกแบบเนทีฟอยู่ในแถว
native_hook_relay_bridgesที่ใช้ร่วมกันแบบมีชนิดข้อมูล โดยกำหนดคีย์ตามรหัสรีเลย์ รันไทม์จะไม่เขียนรีจิสทรี JSON/tmpหรือระเบียนทั่วไปแบบทึบสำหรับระเบียนบริดจ์อายุสั้นเหล่านั้นอีกต่อไป runEmbeddedPiAgent(...)ไม่มีพารามิเตอร์ตัวระบุตำแหน่งทรานสคริปต์อีกต่อไป ตัวอธิบายเวิร์กเกอร์ที่เตรียมไว้ก็ละเว้นตัวระบุตำแหน่งทรานสคริปต์เช่นกัน สถานะเซสชันขณะรันไทม์ และการรันติดตามผลที่อยู่ในคิวจะเก็บ{agentId, sessionId}แทน แฮนเดิลทรานสคริปต์ที่สร้างขึ้น- ขณะนี้ Compaction แบบฝังตัวรับขอบเขต SQLite จาก
agentIdและsessionIdฮุก Compaction, การเรียกเอนจินบริบท, การมอบหมาย CLI และการตอบกลับของโปรโตคอล ต้องไม่ได้รับแฮนเดิลsqlite-transcript://...ที่สร้างขึ้น โค้ดส่งออก/ดีบัก สามารถสร้างอาร์ติแฟกต์ผู้ใช้ที่ระบุชัดเจนจากแถวได้ แต่จะไม่จัดเตรียม พาธส่งออก JSONL ของเซสชันแบบทั่วไปหรือส่งชื่อไฟล์กลับเข้าไปเป็นข้อมูลระบุตัวตน ของรันไทม์ /export-sessionอ่านแถวทรานสคริปต์จาก SQLite และเขียนเฉพาะมุมมอง HTML แบบสแตนด์อโลนที่ร้องขอเท่านั้น ตัวแสดงผลแบบฝังตัวจะไม่สร้างหรือ ดาวน์โหลด JSONL ของเซสชันจากแถวเหล่านั้นอีกต่อไป- การมอบหมายไปยังเอนจินบริบทจะไม่แยกวิเคราะห์ตัวระบุตำแหน่งทรานสคริปต์เพื่อกู้คืน
ข้อมูลระบุตัวตนของเอเจนต์อีกต่อไป บริบทรันไทม์ที่เตรียมไว้จะส่ง
agentIdที่ระบุแล้วไปยังอะแดปเตอร์ Compaction ในตัว - ขณะนี้การเขียนทรานสคริปต์ใหม่และการตัดผลลัพธ์เครื่องมือแบบสดจะอ่านและคงสถานะ
ทรานสคริปต์ตาม
{agentId, sessionId}และไม่สร้างตัวระบุตำแหน่งชั่วคราว สำหรับเพย์โหลดเหตุการณ์อัปเดตทรานสคริปต์ - พื้นผิวตัวช่วยสถานะทรานสคริปต์ไม่มีตัวแปรแบบอิงตัวระบุตำแหน่ง
readTranscriptState,replaceTranscriptStateEventsหรือpersistTranscriptStateMutationอีกต่อไป ผู้เรียกขณะรันไทม์ต้องใช้ API{agentId, sessionId}การนำเข้าของ doctor จะอ่านไฟล์รุ่นเก่าด้วยพาธไฟล์ที่ระบุชัดเจน และเขียนแถว SQLite โดยจะไม่ย้ายสตริงตัวระบุตำแหน่ง - สัญญาตัวจัดการเซสชันขณะรันไทม์จะไม่เปิดเผย
open(locator),forkFrom(locator)หรือsetTranscriptLocator(...)อีกต่อไป ตัวจัดการเซสชัน แบบคงอยู่จะเปิดด้วย{agentId, sessionId}เท่านั้น ตัวช่วยแสดงรายการ/ฟอร์กอยู่ใน API เซสชันและเช็กพอยต์แบบมุ่งเน้นแถว แทนที่จะอยู่ในฟาซาดตัวจัดการทรานสคริปต์ - API ตัวอ่านทรานสคริปต์ของ Gateway ให้ความสำคัญกับขอบเขตก่อน โดยรับ
{agentId, sessionId}และไม่รับตัวระบุตำแหน่งทรานสคริปต์แบบตำแหน่งที่อาจ กลายเป็นข้อมูลระบุตัวตนของรันไทม์โดยไม่ตั้งใจ การแยกวิเคราะห์ตัวระบุตำแหน่งทรานสคริปต์ที่ใช้งานอยู่ ถูกนำออกแล้ว พาธต้นทางรุ่นเก่าจะอ่านโดยโค้ดนำเข้าของ doctor เท่านั้น - เหตุการณ์อัปเดตทรานสคริปต์ให้ความสำคัญกับขอบเขตก่อนเช่นกัน
emitSessionTranscriptUpdateจะไม่รับสตริงตัวระบุตำแหน่งเปล่าอีกต่อไป และตัวฟังจะกำหนดเส้นทางตาม{agentId, sessionId}โดยไม่แยกวิเคราะห์แฮนเดิล - การบรอดแคสต์ข้อความเซสชันของ Gateway จะระบุคีย์เซสชันจากขอบเขตเอเจนต์/เซสชัน ไม่ใช่จากตัวระบุตำแหน่งทรานสคริปต์ ตัวระบุ/แคชแบบเดิมที่แปลงตัวระบุตำแหน่งทรานสคริปต์ เป็นคีย์เซสชันถูกนำออกแล้ว
- ตัวกรอง SSE ของประวัติเซสชัน Gateway จะกรองการอัปเดตแบบสดตามขอบเขตเอเจนต์/เซสชัน โดยจะไม่ ทำตัวเลือกตัวระบุตำแหน่งทรานสคริปต์ พาธจริง หรือข้อมูลระบุตัวตนทรานสคริปต์ ที่มีรูปแบบเหมือนไฟล์ให้เป็นรูปแบบมาตรฐานอีกต่อไป เพื่อตัดสินใจว่าสตรีมควรได้รับการอัปเดตหรือไม่
- ฮุกวงจรชีวิตเซสชันจะไม่สร้างหรือเปิดเผยตัวระบุตำแหน่งทรานสคริปต์บน
session_endอีกต่อไป ผู้ใช้ฮุกจะได้รับsessionId,sessionKey, รหัสเซสชัน ถัดไป และบริบทเอเจนต์ โดยไฟล์ทรานสคริปต์ไม่เป็นส่วนหนึ่งของสัญญาวงจรชีวิต - ฮุกรีเซ็ตจะไม่สร้างหรือเปิดเผยตัวระบุตำแหน่งทรานสคริปต์เช่นกัน
เพย์โหลด
before_resetจะเก็บข้อความ SQLite ที่กู้คืนพร้อมเหตุผลในการรีเซ็ต ขณะที่ข้อมูลระบุตัวตนของเซสชันยังคงอยู่ในบริบทฮุก - การรีเซ็ตชุดทดสอบเอเจนต์จะไม่รับตัวระบุตำแหน่งทรานสคริปต์อีกต่อไป การส่งรีเซ็ต
จะกำหนดขอบเขตด้วย
sessionId/sessionKeyพร้อมเหตุผล - ชนิดเซสชันของส่วนขยายเอเจนต์จะไม่เปิดเผย
transcriptLocatorอีกต่อไป ส่วนขยาย ควรใช้บริบทเซสชันและ API ขณะรันไทม์ แทนการเข้าถึงข้อมูลระบุตัวตนทรานสคริปต์ ที่มีรูปแบบเหมือนไฟล์ - ฮุก Compaction ของ Plugin จะไม่เปิดเผยตัวระบุตำแหน่งทรานสคริปต์อีกต่อไป บริบทฮุก มีข้อมูลระบุตัวตนของเซสชันอยู่แล้ว และการอ่านทรานสคริปต์ต้องดำเนินการผ่าน API ที่รับรู้ขอบเขต SQLite แทนแฮนเดิลที่มีรูปแบบเหมือนไฟล์
- ฮุก
before_agent_finalizeจะไม่เปิดเผยtranscriptPathอีกต่อไป รวมถึง เพย์โหลดรีเลย์ฮุกแบบเนทีฟ ฮุกการปิดท้ายใช้เฉพาะบริบทเซสชัน - การตอบกลับการรีเซ็ตของ Gateway จะไม่สังเคราะห์ตัวระบุตำแหน่งทรานสคริปต์บนรายการ ที่ส่งคืนอีกต่อไป การรีเซ็ตจะสร้างแถวทรานสคริปต์ SQLite ส่งคืนรายการเซสชัน ที่สะอาด และปล่อยให้การเข้าถึงทรานสคริปต์เป็นหน้าที่ของตัวอ่านที่รับรู้ขอบเขต
- ผลลัพธ์การรันและ Compaction แบบฝังตัวจะไม่แสดงตัวระบุตำแหน่งทรานสคริปต์สำหรับ
การทำบัญชีเซสชันอีกต่อไป Compaction อัตโนมัติจะอัปเดตเฉพาะ
sessionIdที่ใช้งานอยู่ ตัวนับ Compaction และเมทาดาทาโทเค็น - ผลลัพธ์ความพยายามแบบฝังตัวจะไม่ส่งคืน
transcriptLocatorUsedอีกต่อไป และ ผลลัพธ์compact()ของเอนจินบริบทจะไม่ส่งคืนตัวระบุตำแหน่งทรานสคริปต์อีกต่อไป ลูปลองใหม่ขณะรันไทม์จะรับเฉพาะsessionIdตัวถัดไป - ผลลัพธ์การผนวกทรานสคริปต์ของมิเรอร์การส่งจะไม่ส่งคืนตัวระบุตำแหน่ง
ทรานสคริปต์อีกต่อไป ผู้เรียกจะได้รับ
messageIdที่ผนวกแล้ว สัญญาณอัปเดตทรานสคริปต์ใช้ ขอบเขต SQLite - ตัวช่วยฟอร์กเซสชันแม่จะส่งคืนเฉพาะ
sessionIdที่ฟอร์กแล้ว การเตรียมซับเอเจนต์ จะส่งขอบเขตเอเจนต์/เซสชันลูกไปยังเอนจิน - พารามิเตอร์ตัวรัน CLI และการเพาะประวัติใหม่จะไม่รับตัวระบุตำแหน่งทรานสคริปต์อีกต่อไป
การอ่านประวัติ CLI จะระบุขอบเขตทรานสคริปต์ SQLite จาก
{agentId, sessionId}และบริบทคีย์เซสชัน - ขณะนี้ฟิกซ์เจอร์การทดสอบ CLI และตัวรันแบบฝังตัวจะเพาะและอ่านแถวทรานสคริปต์ SQLite
ตามรหัสเซสชัน แทนการสมมติว่าเซสชันที่ใช้งานอยู่เป็นไฟล์
*.jsonlหรือ ส่งสตริงsqlite-transcript://...ผ่านพารามิเตอร์ขณะรันไทม์ - เหตุการณ์ตัวป้องกันผลลัพธ์เครื่องมือเซสชันจะปล่อยจากขอบเขตเซสชันที่ทราบ แม้ว่า
ตัวจัดการในหน่วยความจำจะไม่มีตัวระบุตำแหน่งที่สร้างขึ้น การทดสอบจะไม่จำลองไฟล์ทรานสคริปต์
/tmp/*.jsonlที่ใช้งานอยู่อีกต่อไป - ขณะนี้ตัวช่วย BTW และเช็กพอยต์ Compaction จะอ่านและฟอร์กแถวทรานสคริปต์ตาม ขอบเขต SQLite เมทาดาทาเช็กพอยต์จะเก็บเฉพาะรหัสเซสชันและรหัสลีฟ/รายการ โดยจะไม่เขียนตัวระบุตำแหน่งที่สร้างขึ้นลงในเพย์โหลดเช็กพอยต์อีกต่อไป
- การค้นหาคีย์ทรานสคริปต์ของ Gateway ใช้ขอบเขตทรานสคริปต์ SQLite ที่ขอบเขต โปรโตคอล และจะไม่หาพาธจริงหรือตรวจสอบสถานะชื่อไฟล์ทรานสคริปต์อีกต่อไป
- การหมุนเวียนทรานสคริปต์สำหรับ Compaction อัตโนมัติจะเขียนแถวทรานสคริปต์ถัดไป โดยตรงผ่านที่เก็บทรานสคริปต์ SQLite แถวเซสชันจะเก็บเฉพาะข้อมูลระบุตัวตนของเซสชัน ถัดไป ไม่ใช่พาธ JSONL แบบถาวรหรือตัวระบุตำแหน่งที่คงอยู่
- Compaction ของเอนจินบริบทแบบฝังตัวใช้ตัวช่วยหมุนเวียนทรานสคริปต์ ที่ตั้งชื่อตาม SQLite การทดสอบการหมุนเวียนจะไม่สร้างพาธ JSONL ถัดไปหรือ จำลองเซสชันที่ใช้งานอยู่เป็นไฟล์อีกต่อไป
- การเก็บรักษารูปภาพขาออกแบบจัดการจะกำหนดคีย์แคชข้อความทรานสคริปต์จาก สถิติทรานสคริปต์ SQLite แทนการเรียกตรวจสอบสถานะระบบไฟล์
- ล็อกเซสชันขณะรันไทม์และช่องทาง doctor
.jsonl.lockรุ่นเก่าแบบสแตนด์อโลน ถูกนำออกแล้ว - บาร์เรลรันไทม์ Microsoft Teams และ SDK Plugin สาธารณะจะไม่ส่งออกซ้ำ ตัวช่วยล็อกไฟล์แบบเก่าอีกต่อไป พาธสถานะ Plugin แบบถาวรรองรับด้วย SQLite
- การตัดเซสชันตามอายุ/จำนวนและการล้างเซสชันแบบชัดเจนถูกนำออกแล้ว doctor เป็นเจ้าของการนำเข้ารุ่นเก่า เซสชันที่ล้าสมัยจะถูกรีเซ็ตหรือลบอย่างชัดเจน
- การตรวจสอบความสมบูรณ์ของ doctor จะไม่นับไฟล์ JSONL รุ่นเก่าเป็นทรานสคริปต์ ที่ใช้งานอยู่และถูกต้องสำหรับแถวเซสชัน SQLite อีกต่อไป สุขภาพทรานสคริปต์ที่ใช้งานอยู่ขึ้นอยู่กับ SQLite เท่านั้น ไฟล์ JSONL รุ่นเก่าจะถูกรายงานเป็นอินพุตสำหรับการย้ายข้อมูล/การล้างออร์แฟน
- doctor จะไม่ถือว่า
agents/<agent>/sessions/เป็นสถานะขณะรันไทม์ ที่จำเป็นอีกต่อไป โดยจะสแกนไดเรกทอรีนั้นเฉพาะเมื่อมีอยู่แล้วเท่านั้น เพื่อใช้เป็นอินพุต สำหรับการนำเข้ารุ่นเก่าหรือการล้างออร์แฟน - Gateway
sessions.resolve, พาธแพตช์/รีเซ็ต/Compaction ของเซสชัน, การสร้าง ซับเอเจนต์, การยกเลิกอย่างรวดเร็ว, เมทาดาทา ACP, เซสชันที่แยกจาก Heartbeat และการแพตช์ TUI จะไม่ย้ายหรือตัดคีย์เซสชันรุ่นเก่าเป็นผลข้างเคียงของงานรันไทม์ปกติอีกต่อไป - ขณะนี้การระบุเซสชันคำสั่ง CLI จะส่งคืน
agentIdเจ้าของ แทนstorePathและจะไม่คัดลอกแถวเซสชันหลักรุ่นเก่าระหว่างการระบุ--toหรือ--session-idตามปกติอีกต่อไป การทำแถวหลักรุ่นเก่าให้เป็นรูปแบบมาตรฐาน เป็นหน้าที่ของ doctor เท่านั้น - การระบุความลึกซับเอเจนต์ขณะรันไทม์จะไม่อ่าน
sessions.jsonหรือที่เก็บเซสชัน JSON5 อีกต่อไป โดยจะอ่านsession_entriesของ SQLite ตามรหัสเอเจนต์ และเมทาดาทา ความลึก/เซสชันรุ่นเก่าจะเข้ามาได้ผ่านพาธนำเข้าของ doctor เท่านั้น - การแทนที่เซสชันโปรไฟล์การยืนยันตัวตนจะคงอยู่ผ่านการ upsert แถว
{agentId, sessionKey}โดยตรง แทนการโหลดรันไทม์ที่เก็บเซสชันรูปแบบไฟล์แบบล่าช้า - ขณะนี้การควบคุมแบบละเอียดของการตอบกลับอัตโนมัติและตัวช่วยอัปเดตเซสชันจะอ่าน/upsert แถวเซสชัน SQLite ตามข้อมูลระบุตัวตนของเซสชัน และไม่ต้องมีพาธที่เก็บรุ่นเก่าก่อน เข้าถึงสถานะแถวที่คงอยู่อีกต่อไป
- ขณะนี้ตัวช่วยเมทาดาทาเซสชันการรันคำสั่งใช้ชื่อและพาธโมดูล
ที่มุ่งเน้นรายการ พื้นผิวตัวช่วยคำสั่ง
session-storeแบบเก่าถูกนำออกแล้ว - ขณะนี้การเพาะส่วนหัวบูตสแตรปและการเสริมความแข็งแกร่งของขอบเขต Compaction ด้วยตนเองจะแก้ไข
แถวทรานสคริปต์ SQLite โดยตรง ผู้เรียกขณะรันไทม์จะส่งข้อมูลระบุตัวตนของเซสชัน ไม่ใช่
พาธ
.jsonlที่เขียนได้ - การเล่นซ้ำการหมุนเวียนเซสชันแบบเงียบจะคัดลอกเทิร์นล่าสุดของผู้ใช้/ผู้ช่วยตาม
{agentId, sessionId}จากแถวทรานสคริปต์ SQLite โดยจะไม่รับ ตัวระบุตำแหน่งทรานสคริปต์ต้นทางหรือปลายทางอีกต่อไป - แถวเซสชันรันไทม์ใหม่จะไม่เก็บตัวระบุตำแหน่งทรานสคริปต์อีกต่อไป ผู้เรียกใช้
{agentId, sessionId}โดยตรง คำสั่งส่งออก/ดีบักสามารถเลือกชื่อไฟล์เอาต์พุต เมื่อสร้างแถวเป็นไฟล์ได้ - ขณะนี้การเริ่มเซสชันทรานสคริปต์แบบคงอยู่ใหม่จะเปิดแถว SQLite ตาม ขอบเขตเสมอ ตัวจัดการเซสชันจะไม่นำพาธหรือตัวระบุตำแหน่งทรานสคริปต์ จากยุคไฟล์ก่อนหน้ามาใช้ซ้ำเป็นข้อมูลระบุตัวตนของเซสชันใหม่อีกต่อไป
- เซสชันทรานสคริปต์แบบคงอยู่ใช้ API
openTranscriptSessionManagerForSession({agentId, sessionId})ที่ระบุชัดเจน ฟาซาดแบบสแตติกSessionManager.create/openForSession/list/forkFromSessionเดิมถูกนำออกแล้ว เพื่อไม่ให้การทดสอบและโค้ดรันไทม์สร้างการค้นพบเซสชันจากยุคไฟล์ขึ้นใหม่โดยไม่ตั้งใจ - รันไทม์ Plugin จะไม่เปิดเผย
api.runtime.agent.session.resolveTranscriptLocatorPathอีกต่อไป โค้ด Plugin ใช้ตัวช่วยแถว SQLite และค่าขอบเขต - ขณะนี้พื้นผิว SDK
session-store-runtimeสาธารณะส่งออกเฉพาะตัวช่วยแถวเซสชัน และแถวทรานสคริปต์ ตัวช่วยสคีมา/พาธ/ธุรกรรม SQLite ที่มุ่งเน้น อยู่ในsqlite-runtimeตัวช่วยเปิด/ปิด/รีเซ็ตดิบยังคงเป็นแบบภายในเท่านั้นสำหรับ การทดสอบของบุคคลที่หนึ่ง - ขณะนี้ตัวจำแนกชื่อไฟล์วิถี/เช็กพอยต์
.jsonlรุ่นเก่าอยู่ใน โมดูลไฟล์เซสชันรุ่นเก่าของ doctor การตรวจสอบเซสชันหลักจะไม่นำเข้า ตัวช่วยอาร์ติแฟกต์ไฟล์เพื่อตัดสินรหัสเซสชัน SQLite ปกติอีกต่อไป - การรันซับเอเจนต์แบบบล็อกของ Active Memory ใช้แถวทรานสคริปต์ SQLite แทน
การสร้างไฟล์
session.jsonlชั่วคราวหรือแบบคงอยู่ภายใต้สถานะ Plugin ตัวเลือกtranscriptDirแบบเก่าถูกนำออกแล้ว - การสร้าง slug แบบครั้งเดียวและการรันตัววางแผนเอเจนต์ระบบใช้แถวทรานสคริปต์ SQLite
แทนการสร้างไฟล์
session.jsonlชั่วคราว llm-taskการทำงานของตัวช่วยและการแยก commitment ที่ซ่อนไว้ก็ใช้แถว transcript ใน SQLite เช่นกัน ดังนั้นเซสชันตัวช่วยสำหรับโมเดลเท่านั้นเหล่านี้จึงไม่สร้างไฟล์ transcript JSON/JSONL ชั่วคราวอีกต่อไปTranscriptSessionManagerตอนนี้เป็นเพียงขอบเขต transcript ของ SQLite ที่เปิดอยู่ โค้ดรันไทม์เปิดด้วยopenTranscriptSessionManagerForSession({agentId, sessionId}); ขั้นตอนการสร้าง การแตกแขนง การดำเนินการต่อ การแสดงรายการ และการ fork อยู่ในตัวช่วยแถว SQLite ที่เป็นเจ้าของ แทน facade ของตัวจัดการแบบ static โค้ด Doctor/import/debug จัดการไฟล์ต้นทางแบบเดิมที่ระบุอย่างชัดเจนนอกตัวจัดการเซสชันรันไทม์- เมธอด facade
SessionManager.newSession()และSessionManager.createBranchedSession()ที่ล้าสมัยถูกนำออกแล้ว เซสชันใหม่ และรายการสืบทอดของ transcript ถูกสร้างโดยเวิร์กโฟลว์ SQLite ที่เป็นเจ้าของ แทนการเปลี่ยนตัวจัดการที่เปิดอยู่แล้วให้กลายเป็นเซสชันถาวรอื่น - การตัดสินใจ fork transcript แม่และการสร้าง fork ไม่รับ
storePathหรือsessionsDirอีกต่อไป แต่ใช้ขอบเขต transcript SQLite{agentId, sessionId}แทนเมทาดาทาพาธระบบไฟล์ที่เก็บไว้ - Memory-host ไม่ส่งออกตัวช่วยจำแนก transcript ตามไดเรกทอรีเซสชันที่ไม่ทำงานอีกต่อไป การกรอง transcript ตอนนี้อนุมานจากเมทาดาทาแถว SQLite ระหว่างการสร้างรายการ
- การทดสอบการส่งออกเซสชันของ Memory-host และ QMD ใช้ขอบเขต transcript ของ SQLite พาธ
agents/<agentId>/sessions/*.jsonlแบบเก่ายังคงครอบคลุมเฉพาะกรณีที่การทดสอบตั้งใจพิสูจน์ความเข้ากันได้ของ doctor/import/export - การตรวจสอบเซสชันดิบของ QA-lab ตอนนี้ใช้
sessions.listผ่าน Gateway แทนการอ่านagents/qa/sessions/sessions.json; ข้อเสนอแนะของ MSteams ผนวกไปยัง transcript ใน SQLite โดยตรงโดยไม่สร้างพาธ JSONL ปลอม - รอบข้อความขาเข้าของช่องทางที่ใช้ร่วมกันตอนนี้ส่ง
{agentId, sessionKey}แทนstorePathแบบเดิม พาธการบันทึกของ LINE, WhatsApp, Slack, Discord, Telegram, Matrix, Signal, iMessage, BlueBubbles, Feishu, Google Chat, IRC, Nextcloud Talk, Zalo, Zalo Personal, QA Channel, Microsoft Teams, Mattermost, Synology Chat, Tlon, Twitch และ QQBot ตอนนี้อ่านเมทาดาทาเวลาอัปเดตล่าสุด และบันทึกแถวเซสชันขาเข้าผ่านข้อมูลประจำตัว SQLite - การคงอยู่ของตัวระบุตำแหน่ง transcript ถูกนำออกจากแถวเซสชันที่ใช้งานอยู่
resolveSessionTranscriptTargetส่งคืนagentId,sessionIdและเมทาดาทาหัวข้อที่ไม่บังคับ; doctor เป็นโค้ดเดียวที่นำเข้าชื่อไฟล์ transcript แบบเดิม - ส่วนหัว transcript ของรันไทม์เริ่มที่ SQLite เวอร์ชัน
1การอัปเกรดรูปแบบ JSONL V1/V2/V3 เก่าอยู่เฉพาะในการนำเข้าของ doctor และปรับส่วนหัวที่นำเข้าให้เป็นเวอร์ชัน transcript SQLite ปัจจุบันก่อนจัดเก็บแถว - ตัวป้องกันแบบยึดฐานข้อมูลเป็นหลักตอนนี้ห้าม
SessionManager.listAllและSessionManager.forkFromSession; เวิร์กโฟลว์การแสดงรายการเซสชันและ fork/restore ต้องใช้ API SQLite แบบแถว/มีขอบเขตเท่านั้น - ตัวป้องกันยังห้ามชื่อตัวช่วยแยกวิเคราะห์ JSONL transcript แบบเดิม/ซ่อมแซมสาขาที่ใช้งานอยู่นอกโค้ด doctor/import เพื่อไม่ให้รันไทม์เพิ่มเส้นทางการย้าย transcript แบบเดิมเส้นทางที่สอง
- การทำงานของ PI แบบฝังตัวปฏิเสธแฮนเดิล transcript ที่ส่งเข้ามา โดยใช้ข้อมูลประจำตัว
SQLite
{agentId, sessionId}ก่อนเริ่ม worker และอีกครั้งก่อนที่ความพยายามจะเข้าถึงสถานะ transcript อินพุต/tmp/*.jsonlที่ล้าสมัยไม่สามารถเลือกเป้าหมายการเขียนของรันไทม์ได้ - ระเบียน cache trace, เพย์โหลด Anthropic, สตรีมดิบ และไทม์ไลน์การวินิจฉัย
ตอนนี้เขียนลงในแถว SQLite
diagnostic_eventsแบบมีชนิด บันเดิลความเสถียรของ Gateway ตอนนี้เขียนลงในแถว SQLitediagnostic_stability_bundlesแบบมีชนิด พาธ override JSONL เก่าdiagnostics.cacheTrace.filePath,OPENCLAW_CACHE_TRACE_FILE,OPENCLAW_ANTHROPIC_PAYLOAD_LOG_FILEและOPENCLAW_DIAGNOSTICS_TIMELINE_PATHถูกนำออกแล้ว และการเก็บข้อมูลความเสถียรตามปกติไม่เขียนไฟล์logs/stability/*.jsonอีกต่อไป - การคงอยู่ของ Cron ตอนนี้ปรับกระทบยอดแถว SQLite
cron_jobsแทน การลบ/แทรกตารางงานทั้งหมดใหม่ทุกครั้งที่บันทึก การเขียนกลับเป้าหมาย Plugin อัปเดตแถว cron ที่ตรงกันโดยตรง และเก็บสถานะ cron ของรันไทม์ไว้ในธุรกรรมฐานข้อมูลสถานะเดียวกัน - ตัวเรียก Cron ของรันไทม์ตอนนี้ใช้คีย์ที่เก็บ cron ของ SQLite ที่เสถียร พาธ
cron.storeแบบเดิมเป็นเพียงอินพุตนำเข้าของ doctor; Gateway ฝั่งใช้งานจริง การบำรุงรักษางาน สถานะ ประวัติการทำงาน และพาธการเขียนกลับเป้าหมาย Telegram ใช้resolveCronStoreKeyและไม่ปรับพาธของคีย์ให้อยู่ในรูปแบบมาตรฐานอีกต่อไป ตอนนี้สถานะ Cron รายงานstoreKeyแทนฟิลด์storePathแบบเก่าที่มีรูปแบบเหมือนไฟล์ - การโหลดและจัดกำหนดการ Cron ของรันไทม์ไม่ปรับรูปแบบงานถาวรแบบเดิมให้เป็นมาตรฐานอีกต่อไป เช่น
jobId,schedule.cron,atMsแบบตัวเลข, ค่าบูลีนแบบสตริง หรือsessionTargetที่ขาดหายไป การนำเข้าข้อมูลเดิมของ Doctor เป็นเจ้าของการซ่อมแซมเหล่านั้นก่อนแทรกแถวลงใน SQLite - การ spawn ของ ACP ไม่แก้ไขหรือคงพาธไฟล์ transcript JSONL อีกต่อไป การตั้งค่า spawn และการผูกเธรดจะคงแถวเซสชัน SQLite โดยตรง และเก็บรหัสเซสชันไว้เป็นข้อมูลประจำตัว transcript
- API เมทาดาทาเซสชัน ACP ตอนนี้อ่าน/แสดงรายการ/upsert แถว SQLite ตาม
agentIdและ ไม่เปิดเผยstorePathเป็นส่วนหนึ่งของสัญญารายการเซสชัน ACP อีกต่อไป - การคำนวณการใช้งานเซสชันและการรวมการใช้งานของ Gateway ตอนนี้แก้ไข transcript
ด้วย
{agentId, sessionId}เท่านั้น แคชต้นทุน/การใช้งานและข้อมูลสรุปเซสชันที่ค้นพบ ไม่สร้างหรือส่งคืนสตริงตัวระบุตำแหน่ง transcript อีกต่อไป - การผนวกแชตของ Gateway, การคงสถานะบางส่วนเมื่อยกเลิก,
/sessions.sendและ การเขียนสื่อ webchat ลง transcript จะผนวกโดยตรงผ่านขอบเขต transcript ของ SQLite ตัวช่วยฉีด transcript ของ Gateway ไม่รับพารามิเตอร์transcriptLocatorอีกต่อไป - การค้นหา transcript ของ SQLite ตอนนี้แสดงเฉพาะขอบเขตและสถิติของ transcript:
{agentId, sessionId, updatedAt, eventCount}ตัวช่วยความเข้ากันได้listSqliteSessionTranscriptLocatorsที่เลิกใช้แล้วและฟิลด์ต่อแถวlocatorถูกนำออกแล้ว - รันไทม์ซ่อมแซม transcript ตอนนี้เปิดเผยเฉพาะ
repairTranscriptSessionStateIfNeeded({agentId, sessionId})ตัวช่วยซ่อมแซมแบบอิงตัวระบุตำแหน่งเดิมถูกลบแล้ว; โค้ด doctor/debug อ่านพาธไฟล์ต้นทางที่ระบุชัดเจน และไม่ย้ายสตริงตัวระบุตำแหน่ง - รันไทม์บัญชีแยกประเภทการเล่นซ้ำของ ACP ตอนนี้จัดเก็บแถวการเล่นซ้ำต่อเซสชันในฐานข้อมูลสถานะ SQLite ที่ใช้ร่วมกันแทน
acp/event-ledger.json; doctor นำเข้าและลบไฟล์แบบเดิม - ตอนนี้ตัวช่วยอ่าน transcript ของ Gateway อยู่ใน
src/gateway/session-transcript-readers.tsแทนชื่อโมดูลเก่าsession-utils.fsการตรวจสอบประวัติการลองใหม่สำรองตั้งชื่อตามเนื้อหา transcript ของ SQLite แทนพื้นผิวตัวช่วยไฟล์แบบเก่า - ตัวช่วยแชตที่ฉีดเข้า Gateway และ Compaction ตอนนี้ส่งขอบเขต transcript ของ SQLite ผ่าน API ตัวช่วยภายใน แทนการตั้งชื่อค่าเป็นพาธ transcript หรือไฟล์ต้นทาง
- การตรวจจับการดำเนินการ bootstrap ต่อ ตอนนี้ตรวจสอบแถว transcript ของ SQLite ผ่าน
hasCompletedBootstrapTranscriptTurn; และไม่เปิดเผยชื่อตัวช่วยที่มีรูปแบบเหมือนไฟล์อีกต่อไป - การทดสอบ embedded-runner ตอนนี้ใช้ข้อมูลประจำตัว transcript ของ SQLite และการเปิดตัวจัดการ transcript ใหม่
ต้องมี
sessionIdที่ระบุอย่างชัดเจนเสมอ - ตัวช่วยจัดทำดัชนีหน่วยความจำตอนนี้ใช้คำศัพท์ transcript ของ SQLite ตั้งแต่ต้นจนจบ:
host ส่งออก
listSessionTranscriptScopesForAgentและsessionTranscriptKeyForScope, คิวซิงค์แบบเจาะจงใช้sessionTranscripts, ผลลัพธ์การค้นหาเซสชันสาธารณะเปิดเผยพาธทึบแสงtranscript:<agent>:<session>, และคีย์ต้นทาง DB ภายในคือsession:<session>ภายใต้source_kind='sessions'แทนพาธไฟล์ปลอม - ตัวช่วย persistent-dedupe ทั่วไปของ SDK สำหรับ Plugin ไม่เปิดเผยตัวเลือกที่มีรูปแบบเหมือนไฟล์อีกต่อไป ผู้เรียกให้คีย์ขอบเขต SQLite และแถว dedupe ถาวรอยู่ในสถานะ Plugin ที่ใช้ร่วมกัน
- โทเค็น SSO ของ Microsoft Teams ย้ายจากไฟล์ JSON ที่ล็อกไว้ไปยังสถานะ Plugin ใน SQLite
Doctor นำเข้า
msteams-sso-tokens.json, สร้างคีย์โทเค็น SSO มาตรฐานใหม่จากเพย์โหลด และลบไฟล์ต้นทาง โทเค็น OAuth ที่มอบหมายยังคงอยู่บนขอบเขตไฟล์ข้อมูลประจำตัวส่วนตัวเดิม - สถานะแคชการซิงค์ Matrix ย้ายจาก
bot-storage.jsonไปยังสถานะ Plugin ใน SQLite Doctor นำเข้าเพย์โหลดการซิงค์ดิบหรือแบบห่อหุ้มเดิม และลบไฟล์ต้นทาง ไคลเอนต์อะแดปเตอร์ Matrix ที่ใช้งานอยู่และ QA Lab Matrix ส่งไดเรกทอรีรากของที่เก็บการซิงค์ SQLite ไม่ใช่พาธsync-store.jsonหรือbot-storage.jsonปลอม - สถานะการย้ายการเข้ารหัสแบบเดิมของ Matrix ย้ายจาก
legacy-crypto-migration.jsonไปยังสถานะ Plugin ใน SQLite Doctor นำเข้า ไฟล์สถานะเก่า; สแนปช็อต IndexedDB ของ Matrix SDK ย้ายจากcrypto-idb-snapshot.jsonไปยัง blob ของ Plugin ใน SQLite คีย์การกู้คืนและข้อมูลประจำตัวของ Matrix เป็นแถวสถานะ Plugin ใน SQLite; ไฟล์ JSON เก่าของรายการเหล่านี้เป็นเพียงอินพุตการย้ายของ doctor - บันทึกกิจกรรมของ Memory Wiki ตอนนี้ใช้สถานะ Plugin ใน SQLite แทน
.openclaw-wiki/log.jsonlผู้ให้บริการย้ายข้อมูล Memory Wiki นำเข้า บันทึก JSONL เก่า; markdown ของวิกิและเนื้อหา vault ของผู้ใช้ยังคงมีไฟล์รองรับเป็นเนื้อหาของ workspace - Memory Wiki ไม่สร้าง
.openclaw-wiki/state.jsonหรือไดเรกทอรี.openclaw-wiki/locksที่ไม่ได้ใช้อีกต่อไป ผู้ให้บริการย้ายข้อมูลจะลบไฟล์เมทาดาทา Plugin ที่เลิกใช้เหล่านั้น หาก vault เก่ายังคงมีไฟล์ดังกล่าว - รายการตรวจสอบของ system-agent ตอนนี้ใช้สถานะ Plugin หลักใน SQLite แทน
audit/crestodian.jsonlDoctor นำเข้าบันทึกการตรวจสอบ JSONL แบบเดิมและลบออกหลังจากนำเข้าสำเร็จ - รายการตรวจสอบการเขียน/สังเกต config ตอนนี้ใช้สถานะ Plugin หลักใน SQLite แทน
logs/config-audit.jsonlDoctor นำเข้าบันทึกการตรวจสอบ JSONL แบบเดิมและลบออกหลังจากนำเข้าสำเร็จ - แอปคู่หู macOS ไม่เขียน sidecar
logs/config-audit.jsonlหรือlogs/config-health.jsonภายในแอปขณะแก้ไขopenclaw.jsonอีกต่อไป ไฟล์ config ยังคงมีไฟล์รองรับ สแนปช็อตการกู้คืนยังคงอยู่ข้างไฟล์ config และสถานะการตรวจสอบ/สุขภาพของ config แบบถาวรอยู่ในที่เก็บ SQLite ของ Gateway - การอนุมัติที่รอดำเนินการสำหรับการกู้คืนของ system-agent ตอนนี้ใช้สถานะ Plugin หลักใน SQLite แทน
crestodian/rescue-pending/*.jsonหรือopenclaw/rescue-pending/*.jsonความสามารถด้านความปลอดภัยอายุสั้นเหล่านี้จะไม่ถูกนำเข้า; doctor ละทิ้งไดเรกทอรีที่เลิกใช้ทั้งสอง เพื่อไม่ให้การอัปเกรดเปิดใช้งานการเขียนที่ล้าสมัยอีกครั้ง - สถานะ arm ชั่วคราวของ Phone Control ตอนนี้ใช้สถานะ Plugin ใน SQLite แทน
plugins/phone-control/armed.jsonDoctor นำเข้าไฟล์ armed-state แบบเดิม ไปยัง namespacephone-control/arm-stateและลบไฟล์ - Doctor ไม่ซ่อมแซม transcript JSONL ในตำแหน่งเดิมหรือสร้างไฟล์ JSONL สำรองอีกต่อไป แต่จะนำเข้าสาขาที่ใช้งานอยู่ไปยัง SQLite และลบต้นทางแบบเดิม
- การค้นหา transcript ของ hook session-memory ใช้การอ่าน SQLite เฉพาะขอบเขต
{agentId, sessionId}ตัวช่วยไม่รับหรืออนุมานตัวระบุตำแหน่ง transcript, การอ่านไฟล์แบบเดิม หรือตัวเลือกการเขียนไฟล์ใหม่อีกต่อไป - การผูกการสนทนาของ Codex app-server ตอนนี้กำหนดคีย์สถานะ Plugin ใน SQLite ตามคีย์เซสชัน OpenClaw หรือขอบเขต
{agentId, sessionId}ที่ระบุชัดเจน และต้องไม่เก็บการผูกสำรองที่อิงพาธ transcript - การอ่านประวัติที่ทำสำเนาของ Codex app-server ใช้เฉพาะขอบเขต transcript ของ SQLite; และต้องไม่กู้คืนข้อมูลประจำตัวจากพาธไฟล์ transcript
- พาธการจัดลำดับบทบาทและการรีเซ็ต Compaction ไม่ unlink ไฟล์ transcript เก่าอีกต่อไป; การรีเซ็ตจะหมุนเฉพาะแถวเซสชัน SQLite และข้อมูลประจำตัว transcript
- การตอบกลับการรีเซ็ตและ checkpoint ของ Gateway ส่งคืนแถวเซสชันที่สะอาดพร้อมรหัสเซสชัน และไม่สร้างตัวระบุตำแหน่ง transcript ของ SQLite สำหรับไคลเอนต์อีกต่อไป
- Dreaming ของ memory-core ไม่ล้างแถวเซสชันโดยตรวจหาไฟล์ JSONL ที่หายไปอีกต่อไป การล้างข้อมูล subagent ดำเนินการผ่าน API รันไทม์เซสชันแทนการตรวจสอบการมีอยู่ในระบบไฟล์ การทดสอบการนำเข้า transcript จะป้อนแถว SQLite โดยตรงแทนการสร้าง fixture
agents/<id>/sessionsหรือตัวยึดตำแหน่ง - การจัดทำดัชนี transcript ของหน่วยความจำอาจเปิดเผย
transcript:<agentId>:<sessionId>เป็น พาธผลลัพธ์การค้นหาเสมือนสำหรับตัวช่วยการอ้างอิง/การอ่าน ต้นทางดัชนีถาวรเป็นแบบเชิงสัมพันธ์ (source_kind='sessions',source_key='session:<sessionId>',session_id=<sessionId>) ดังนั้นค่านี้จึงไม่ใช่ตัวระบุตำแหน่งทรานสคริปต์ของรันไทม์ ไม่ใช่พาธระบบไฟล์ และต้องไม่ส่งกลับไปยัง API รันไทม์ของเซสชันโดยเด็ดขาด - สถานะหน่วยความจำของ Gateway doctor อ่านจำนวนการเรียกคืนระยะสั้นและสัญญาณเฟส
จากแถวสถานะ Plugin ใน SQLite แทน
memory/.dreams/*.json; ขณะนี้เอาต์พุตของ CLI และ doctor ระบุที่จัดเก็บนั้นว่าเป็นที่จัดเก็บ SQLite ไม่ใช่พาธ - รันไทม์ memory-core, สถานะ CLI, เมธอด Gateway doctor และ facade ของ SDK
สำหรับ Plugin จะไม่ตรวจสอบหรือเก็บถาวรไฟล์
.dreams/session-corpusแบบเดิมอีกต่อไป ไฟล์เหล่านั้นเป็นเพียงอินพุตสำหรับการย้ายข้อมูล โดย doctor จะนำเข้าไฟล์เหล่านั้นไปยัง SQLite และ ลบต้นทางหลังจากตรวจสอบแล้ว ขณะนี้แถวหลักฐานการนำเข้าเซสชันที่ใช้งานอยู่ ใช้พาธ SQLite เสมือนmemory/session-ingestion/<day>.txt; รันไทม์ จะไม่เขียนหรืออนุมานสถานะจาก.dreams/session-corpusโดยเด็ดขาด - อาร์ติแฟกต์สาธารณะของ memory-core เปิดเผยเหตุการณ์โฮสต์ SQLite เป็นอาร์ติแฟกต์ JSON เสมือน
memory/events/memory-host-events.json; โดยจะไม่ใช้พาธต้นทาง.dreams/events.jsonlแบบเดิมซ้ำอีกต่อไป - ขณะนี้รีจิสทรีคอนเทนเนอร์/เบราว์เซอร์ของแซนด์บ็อกซ์ใช้ตาราง SQLite
sandbox_registry_entriesที่ใช้ร่วมกัน โดยมีคอลัมน์แบบมีชนิดสำหรับเซสชัน อิมเมจ การประทับเวลา แบ็กเอนด์/การกำหนดค่า และพอร์ตเบราว์เซอร์ Doctor นำเข้าไฟล์รีจิสทรี JSON แบบรวมไฟล์เดียวและ แบบแบ่งชาร์ดที่เป็นระบบเดิม แล้วลบต้นทางที่นำเข้าสำเร็จ การอ่านของรันไทม์ใช้ คอลัมน์แถวแบบมีชนิดเป็นแหล่งข้อมูลจริง ส่วนentry_jsonเป็นเพียงสำเนา สำหรับเล่นซ้ำ/ดีบัก - ขณะนี้ข้อผูกพันใช้ตาราง
commitmentsแบบมีชนิดที่ใช้ร่วมกัน แทน บล็อบ JSON ของที่จัดเก็บทั้งหมด รันไทม์ใช้คิวรีที่มีดัชนีสำหรับขอบเขต หน้าต่างการส่ง ขีดจำกัดแบบเลื่อน สถานะ และความพยายาม รวมถึงทรานแซกชัน SQLite แบบซิงโครนัส ส่วนrecord_jsonเป็นเพียงสำเนาสำหรับเล่นซ้ำ/ดีบัก การซ่อมแซมโดย doctor ที่สั่งอย่างชัดเจนจะตรวจสอบcommitments.jsonแบบเดิมทั้งหมด เก็บแถว SQLite ที่ใหม่กว่าไว้ ตรวจสอบ ผลลัพธ์ และหลังจากนั้นจึงลบต้นทางที่ไม่เปลี่ยนแปลง รันไทม์จะไม่อ่านหรือ เขียนไฟล์ที่เลิกใช้แล้วโดยเด็ดขาด - ขณะนี้การสมัครรับ Web Push และข้อมูลประจำตัว VAPID ที่สร้างขึ้นใช้แถว
web_push_subscriptionsและweb_push_vapid_keysแบบมีชนิดที่ใช้ร่วมกัน การลงทะเบียนของรันไทม์ การล้างข้อมูลที่หมดอายุ และการสร้างคีย์เมื่อใช้งานครั้งแรกใช้ทรานแซกชัน SQLite ระดับแถว การซ่อมแซมโดย Doctor ที่สั่งอย่างชัดเจนจะตรวจสอบที่จัดเก็บ JSON ที่เลิกใช้แล้วทั้งสองรายการ อ้างสิทธิ์รายการเหล่านั้นก่อนเขียน SQLite นำเข้าแบบอะตอมมิก ปฏิเสธ ข้อมูลประจำตัว VAPID ที่ขัดแย้งกัน ตรวจสอบผลลัพธ์ และหลังจากนั้นจึงลบ การอ้างสิทธิ์ Doctor จะถือล็อกการบำรุงรักษาไดเรกทอรีสถานะตลอดการ นำเข้า เพื่อไม่ให้ Gateway รุ่นเก่าสร้างไฟล์ที่เลิกใช้แล้วขึ้นมาใหม่ การลงทะเบียน การส่ง การลบ และการแก้ไขคีย์จะปฏิเสธการทำงานจนกว่า Doctor จะแก้ไข ต้นทางแบบเดิมที่ค้างอยู่หรือการอ้างสิทธิ์ที่ถูกขัดจังหวะ - ข้อกำหนดงาน Cron, สถานะกำหนดการ และประวัติการเรียกใช้ไม่มีตัวเขียน
หรือตัวอ่าน JSON ในรันไทม์อีกต่อไป รันไทม์ใช้แถว
cron_jobsที่มีคอลัมน์แบบมีชนิดสำหรับกำหนดการ เพย์โหลด การส่ง การแจ้งเตือนความล้มเหลว เซสชัน สถานะ และสถานะรันไทม์ รวมถึง รายละเอียดtask_runsที่ Cron เป็นเจ้าของ สำหรับการวินิจฉัย การส่ง เซสชัน/การเรียกใช้ โมเดล และยอดรวมโทเค็นjob_jsonเป็นเพียงสำเนาสำหรับเล่นซ้ำ/ดีบัก ส่วนstate_jsonเก็บ การวินิจฉัยรันไทม์แบบซ้อนที่ยังไม่มีฟิลด์คิวรีเส้นทางด่วน ขณะที่รันไทม์ เติมสถานะฟิลด์เส้นทางด่วนกลับจากคอลัมน์แบบมีชนิด Doctor นำเข้า ไฟล์jobs.json,jobs-state.jsonและruns/*.jsonlแบบเดิม แล้วลบ ต้นทางที่นำเข้า การเขียนค่ากลับของเป้าหมาย Plugin จะอัปเดตแถวcron_jobsที่ตรงกัน แทนการโหลดและแทนที่ที่จัดเก็บ Cron ทั้งหมด - การเริ่มต้น Gateway จะไม่สนใจมาร์กเกอร์
notify: trueแบบเดิมในการฉายภาพ รันไทม์ Doctor อ่านcron.webhookดิบที่เลิกใช้แล้วเฉพาะระหว่างแปล มาร์กเกอร์เหล่านั้นเป็นการส่งผ่าน SQLite อย่างชัดเจน จากนั้นจึงลบคีย์การกำหนดค่า - ขณะนี้คิวการส่งขาออกและการส่งของเซสชันจัดเก็บสถานะคิว ชนิดรายการ
คีย์เซสชัน ช่องทาง เป้าหมาย รหัสบัญชี จำนวนการลองใหม่ ความพยายาม/ข้อผิดพลาดล่าสุด
สถานะการกู้คืน และมาร์กเกอร์การส่งของแพลตฟอร์มเป็นคอลัมน์แบบมีชนิดในตาราง
delivery_queue_entriesที่ใช้ร่วมกัน การกู้คืนของรันไทม์อ่านฟิลด์เส้นทางด่วนเหล่านั้นจาก คอลัมน์แบบมีชนิด และการเปลี่ยนแปลงสำหรับการลองใหม่/กู้คืนจะอัปเดตคอลัมน์เหล่านั้นโดยตรง โดยไม่เขียน JSON สำหรับเล่นซ้ำใหม่ เพย์โหลด JSON ทั้งหมดยังคงอยู่เพียงในฐานะ บล็อบสำหรับเล่นซ้ำ/ดีบักสำหรับเนื้อหาข้อความและข้อมูลเล่นซ้ำที่ไม่ได้ใช้บ่อยอื่น ๆ - ขณะนี้ระเบียนอิมเมจขาออกที่มีการจัดการใช้แถว
managed_outgoing_image_recordsแบบมีชนิดที่ใช้ร่วมกัน รันไทม์อ่านเฉพาะคอลัมน์แบบมีชนิด ส่วน คอลัมน์ JSON เป็นสำเนาสำหรับเล่นซ้ำ/ดีบัก ไบต์อิมเมจต้นฉบับยังคงเป็น อาร์ติแฟกต์ไฟล์แนบที่มีชื่อในไดเรกทอรีสื่อที่มีการจัดการ - ขณะนี้ค่ากำหนดตัวเลือกโมเดลของ Discord, แฮชการปรับใช้คำสั่ง และการผูกเธรด ใช้สถานะ Plugin ของ SQLite ที่ใช้ร่วมกัน แผนการนำเข้า JSON แบบเดิมของรายการเหล่านี้อยู่ใน พื้นผิวการย้ายข้อมูลสำหรับการตั้งค่า/doctor ของ Plugin Discord ไม่ใช่ในโค้ดการย้ายข้อมูลหลัก
- ตัวตรวจจับการนำเข้าระบบเดิมของ Plugin ใช้โมดูลที่ตั้งชื่อตาม doctor เช่น
doctor-legacy-state.tsหรือdoctor-state-imports.ts; โมดูลรันไทม์ช่องทางปกติ ต้องไม่นำเข้าตัวตรวจจับ JSON แบบเดิม - ขณะนี้เคอร์เซอร์การติดตามข้อมูลย้อนหลังและมาร์กเกอร์ป้องกันข้อมูลขาเข้าซ้ำของ BlueBubbles ใช้สถานะ Plugin ของ SQLite ที่ใช้ร่วมกัน แผนการนำเข้า JSON แบบเดิมของรายการเหล่านี้อยู่ในพื้นผิวการย้ายข้อมูล สำหรับการตั้งค่า/doctor ของ Plugin BlueBubbles ไม่ใช่ในโค้ดการย้ายข้อมูลหลัก
- ขณะนี้ออฟเซ็ตการอัปเดต แถวแคชสติกเกอร์ แถวแคชข้อความที่ส่ง แถวแคชชื่อหัวข้อ และการผูกเธรดของ Telegram ใช้สถานะ Plugin ของ SQLite ที่ใช้ร่วมกัน แผนการนำเข้า JSON แบบเดิมของรายการเหล่านี้อยู่ในพื้นผิวการย้ายข้อมูล สำหรับการตั้งค่า/doctor ของ Plugin Telegram ไม่ใช่ในโค้ดการย้ายข้อมูลหลัก
- ขณะนี้เคอร์เซอร์การติดตามข้อมูลย้อนหลัง การแมปรหัสย่อการตอบกลับ และแถวป้องกันเอคโคข้อความที่ส่งซ้ำ
ของ iMessage ใช้สถานะ Plugin ของ SQLite ที่ใช้ร่วมกัน ไฟล์เก่า
imessage/catchup/*.json,imessage/reply-cache.jsonlและimessage/sent-echoes.jsonlเป็นเพียงอินพุตสำหรับ doctor - ขณะนี้แถวป้องกันข้อความซ้ำของ Feishu ใช้ระบบป้องกันข้อมูลซ้ำแบบอ้างสิทธิ์ได้ของแกนหลัก
(เนมสเปซ
feishu.dedup.*ในสถานะ Plugin ของ SQLite ที่ใช้ร่วมกัน) แทน ไฟล์feishu/dedup/*.jsonหรือที่จัดเก็บdedup.*ที่สร้างขึ้นเองและเลิกใช้แล้ว โดย ไม่มีการนำเข้าระบบเดิม เนื่องจากแคชป้องกันการเล่นซ้ำจะสร้างใหม่หลังการอัปเกรด - ขณะนี้การสนทนา แบบสำรวจ บัฟเฟอร์อัปโหลดที่ค้างอยู่ และข้อมูลการเรียนรู้จากข้อเสนอแนะ
ของ Microsoft Teams ใช้ตารางสถานะ/บล็อบ Plugin ของ SQLite ที่ใช้ร่วมกัน พาธการอัปโหลดที่ค้างอยู่
ใช้
plugin_blob_entriesเพื่อให้บัฟเฟอร์สื่อจัดเก็บเป็น SQLite BLOB แทน JSON แบบ base64 ขณะนี้ชื่อเฮลเปอร์รันไทม์ใช้การตั้งชื่อตาม SQLite/สถานะ แทนการตั้งชื่อตามที่จัดเก็บไฟล์*-fsและชิมเก่าstorePathถูกนำออก จากที่จัดเก็บเหล่านี้แล้ว แผนการนำเข้า JSON แบบเดิมอยู่ในพื้นผิวการย้ายข้อมูล สำหรับการตั้งค่า/doctor ของ Plugin Microsoft Teams - ขณะนี้สื่อขาออกที่โฮสต์โดย Zalo ใช้
plugin_blob_entriesของ SQLite ที่ใช้ร่วมกัน แทนไซด์คาร์ชั่วคราว JSON/binopenclaw-zalo-outbound-media - ขณะนี้ HTML และเมทาดาทาของตัวดูส่วนต่างใช้
plugin_blob_entriesของ SQLite ที่ใช้ร่วมกัน แทนไฟล์ชั่วคราวmeta.json/viewer.htmlHTML ของตัวดูถูกจัดเก็บเป็น บล็อบ gzip และจะคงอยู่เฉพาะแฮชโทเค็น URL เอาต์พุต PNG/PDF ที่เรนเดอร์แล้ว ยังคงเป็นไฟล์ชั่วคราวที่สร้างขึ้น เนื่องจากการส่งผ่านช่องทางยังต้องใช้พาธไฟล์ เมทาดาทาการหมดอายุของไฟล์เหล่านั้นอยู่ภายใต้การจัดการของ SQLite โดยไม่มีไซด์คาร์ JSON - ขณะนี้เอกสารที่มีการจัดการของ Canvas ใช้
plugin_blob_entriesของ SQLite ที่ใช้ร่วมกัน แทน ไดเรกทอรีเริ่มต้นstate/canvas/documentsโฮสต์ Canvas ให้บริการบล็อบเหล่านั้น โดยตรง โดยจะสร้างไฟล์ภายในเครื่องเฉพาะสำหรับเนื้อหาของผู้ปฏิบัติงานhost.rootที่ระบุอย่างชัดเจน หรือการสร้างไฟล์ชั่วคราวเมื่อเครื่องมืออ่านสื่อปลายทาง ต้องใช้พาธ - ขณะนี้การตัดสินใจตรวจสอบ File Transfer ใช้
plugin_state_entriesของ SQLite ที่ใช้ร่วมกัน แทนบันทึกรันไทม์audit/file-transfer.jsonlที่ไม่มีขอบเขตจำกัด Doctor นำเข้าไฟล์ตรวจสอบ JSONL แบบเดิมเข้าสู่สถานะ Plugin และลบต้นทาง หลังจากนำเข้าอย่างสมบูรณ์ - ขณะนี้ลีสกระบวนการ ACPX และข้อมูลประจำตัวอินสแตนซ์ Gateway ใช้สถานะ Plugin
ของ SQLite ที่ใช้ร่วมกัน Doctor นำเข้าไฟล์
gateway-instance-idแบบเดิมเข้าสู่สถานะ Plugin และลบต้นทาง - สคริปต์ตัวห่อหุ้มที่ ACPX สร้างขึ้นและโฮม Codex ที่แยกออกมาเป็นการสร้างไฟล์
ชั่วคราวภายใต้รูทชั่วคราวของ OpenClaw ไม่ใช่สถานะถาวรของ OpenClaw ระเบียน
รันไทม์ ACPX แบบถาวรคือแถวลีสและอินสแตนซ์ Gateway ใน SQLite
พื้นผิวการกำหนดค่า ACPX เก่า
stateDirถูกนำออก เนื่องจากไม่มีการเขียนสถานะรันไทม์ ที่นั่นอีกต่อไป - ขณะนี้ไฟล์แนบสื่อของ Gateway ใช้ตาราง SQLite
media_blobsที่ใช้ร่วมกันเป็น ที่จัดเก็บไบต์หลัก พาธภายในเครื่องที่ส่งคืนไปยังพื้นผิวความเข้ากันได้ของช่องทางและ แซนด์บ็อกซ์เป็นไฟล์ชั่วคราวที่สร้างจากแถวฐานข้อมูล ไม่ใช่ ที่จัดเก็บสื่อถาวร รายการอนุญาตสื่อของรันไทม์จะไม่รวมรูท$OPENCLAW_STATE_DIR/mediaแบบเดิมหรือmediaของไดเรกทอรีการกำหนดค่าอีกต่อไป ไดเรกทอรีเหล่านั้นเป็น เพียงต้นทางสำหรับการนำเข้าของ doctor - การเติมคำสั่งเชลล์จะไม่เขียนไฟล์แคช
$OPENCLAW_STATE_DIR/completions/*อีกต่อไป พาธการติดตั้ง doctor การอัปเดต และการทดสอบควันของรีลีส ใช้เอาต์พุตการเติมคำสั่งที่สร้างขึ้นหรือการโหลดจากโปรไฟล์ แทนไฟล์แคช การเติมคำสั่งแบบถาวร - ขณะนี้พื้นที่พักการอัปโหลด Skills ของ Gateway ใช้แถว
skill_uploadsและskill_upload_chunksที่ใช้ร่วมกัน แต่ละส่วนยังคงทำทรานแซกชันแยกกันระหว่าง การอัปโหลด จากนั้นเมื่อคอมมิต ระบบจะประกอบเป็น BLOB อาร์ไคฟ์เดียวที่ผ่านการตรวจสอบและลบแถว ของส่วนต่าง ๆ ตัวติดตั้งจะได้รับเฉพาะพาธอาร์ไคฟ์ชั่วคราวที่สร้างขึ้นระหว่าง การติดตั้งเท่านั้น Doctor จะทิ้งโครงสร้างพื้นที่พักในระบบไฟล์อายุหนึ่งชั่วโมงที่เลิกใช้แล้ว แทนการนำเข้าการอัปโหลดชั่วคราว - ไฟล์แนบแบบอินไลน์ของเอเจนต์ย่อยจะไม่สร้างไฟล์ภายใต้
.openclaw/attachments/*ของเวิร์กสเปซอีกต่อไป พาธการสร้างจะเตรียมรายการเมล็ด VFS ของ SQLite การเรียกใช้แบบอินไลน์จะใส่รายการเหล่านั้นลงในเนมสเปซพื้นที่ชั่วคราวของรันไทม์ต่อเอเจนต์ และเครื่องมือที่ใช้ดิสก์จะวางพื้นที่ชั่วคราว SQLite นั้นทับสำหรับพาธไฟล์แนบ คอลัมน์รีจิสทรีไดเรกทอรีไฟล์แนบสำหรับการเรียกใช้เอเจนต์ย่อยและฮุกล้างข้อมูลแบบเก่าถูกนำออกแล้ว - การเติมข้อมูลอิมเมจของ CLI จะไม่ดูแลไฟล์แคช
openclaw-cli-imagesแบบคงที่อีกต่อไป แบ็กเอนด์ CLI ภายนอกยังคงได้รับพาธไฟล์ แต่พาธเหล่านั้นเป็น ไฟล์ชั่วคราวที่สร้างต่อการเรียกใช้พร้อมการล้างข้อมูล - ขณะนี้การวินิจฉัยการติดตามแคช การวินิจฉัยเพย์โหลด Anthropic สตรีมโมเดลดิบ
เหตุการณ์ไทม์ไลน์การวินิจฉัย และชุดข้อมูลเสถียรภาพของ Gateway
เขียนแถว SQLite แทนไฟล์
logs/*.jsonlหรือlogs/stability/*.jsonแฟล็กและตัวแปรสภาพแวดล้อมสำหรับเขียนทับพาธรันไทม์ถูกนำออกแล้ว คำสั่งส่งออก/ดีบัก สามารถสร้างไฟล์จากแถวฐานข้อมูลอย่างชัดเจน - แอปคู่หู macOS ไม่มีตัวเขียน
diagnostics.jsonlแบบเลื่อนอีกต่อไป บันทึก ของแอปไปยังระบบบันทึกแบบรวม และการวินิจฉัย Gateway แบบถาวรยังคงใช้ SQLite - ขณะนี้รายการระเบียนผู้พิทักษ์พอร์ตของ macOS ใช้แถว
macos_port_guardian_recordsแบบมีชนิดของ SQLite ที่ใช้ร่วมกัน แทนไฟล์ JSON ใน Application Support หรือบล็อบซิงเกิลตันแบบทึบ โปรไฟล์แอป macOS ทั้งหมดใช้ฐานข้อมูลเนทีฟส่วนกลางของโฮสต์ เดียวกัน เนื่องจากต้องประสานงานพอร์ตภายในเครื่อง การดำเนินการกับบัญชีแยกประเภททุกครั้ง จะถูกบล็อกขณะที่สำเนาแอปรุ่นเก่าที่ยังเขียน JSON กำลังทำงาน การย้ายข้อมูลจะเข้าร่วมโปรโตคอล ล็อกไฟล์แบบเสถียรของบัญชีแยกประเภทเดิมเฉพาะเพื่อสร้างสแนปช็อตและตรวจสอบต้นทางซ้ำ ในภายหลัง ระบบจะแก้ไขทุกแถวแบบเดิมจากข้อเท็จจริงของคำสั่งสดและเวลาเริ่มกระบวนการ โดยไม่ถือล็อกนั้น จากนั้นอ่านแถว SQLite ที่เชื่อถือได้อีกครั้ง ใช้แผน ตรวจสอบใบรับทุกรายการ และลบต้นทาง การลองลบใหม่จะวางแผนแถวที่ขาดหายอีกครั้ง เพื่อไม่ให้ใบรับเก่าที่เลิกใช้แล้วฟื้นกลับมา ล็อกมีอายุสั้น เพื่อไม่ให้ตัวเขียนรุ่นเก่าค้างหลังจาก SSH สร้างกระบวนการแล้ว การเปลี่ยนผ่าน เป็นแบบทางเดียวโดยเจตนา กล่าวคือรันไทม์ในสภาวะปกติจะไม่อ่าน ฉายภาพ หรือเขียน JSON โดยเด็ดขาด และการย้อนกลับไปยังบิลด์ที่ใช้เฉพาะ JSON จะไม่รักษาใบรับ SQLite ที่ใหม่กว่า - ขณะนี้ล็อกซิงเกิลตันของ Gateway ใช้แถว
state_leasesแบบมีชนิดของ SQLite ที่ใช้ร่วมกัน ภายใต้ ขอบเขตgateway_locksแทนไฟล์ล็อกในไดเรกทอรีชั่วคราว เอกสารการแก้ไขปัญหา Fly และ OAuth ชี้ไปยังลีส SQLite/ล็อกการรีเฟรชการรับรองความถูกต้อง แทน การล้างไฟล์ล็อกที่ล้าสมัย - ขณะนี้สถานะ sentinel สำหรับการรีสตาร์ต Gateway ใช้แถว SQLite แบบใช้ร่วมกันที่มีชนิดข้อมูล
gateway_restart_sentinelแทนrestart-sentinel.json; รันไทม์ อ่านชนิด สถานะ การกำหนดเส้นทาง ข้อความ การดำเนินการต่อ และสถิติของ sentinel จาก คอลัมน์ที่มีชนิดข้อมูล คอลัมน์เหล่านั้นเป็นข้อมูลอ้างอิงหลัก;payload_jsonเป็นเพียง เงาสำหรับการเล่นซ้ำ/ดีบัก เส้นทางการอ่าน เขียน และล้างข้อมูลของรันไทม์ใช้ SQLite เท่านั้น โมดูลย้ายสถานะแบบจำกัดขอบเขตหนึ่งโมดูลทำงานระหว่างการเริ่มต้นและ Doctor เพื่อนำเข้า sentinel หลังการอัปเดตรุ่นเก่าที่ผ่านการตรวจสอบก่อนการกู้คืนจากการรีสตาร์ตตามปกติ ตรวจสอบ แถวที่มีชนิดข้อมูล และลบไฟล์ต้นทาง ไม่มีโมดูลรันไทม์ในสภาวะคงตัวใด อ่าน เขียน หรือล้างไฟล์เดิม - ขณะนี้เจตนาการรีสตาร์ต Gateway และสถานะการส่งมอบให้ supervisor ใช้แถว
SQLite แบบใช้ร่วมกันที่มีชนิดข้อมูล
gateway_restart_intentและgateway_restart_handoffแทน sidecargateway-restart-intent.jsonและgateway-supervisor-restart-handoff.json - ขณะนี้การประสานงาน singleton ของ Gateway ใช้แถว
state_leasesที่มีชนิดข้อมูลภายใต้gateway_locksแทนการเขียนไฟล์gateway.<hash>.lockแถว lease เป็นเจ้าของข้อมูลเจ้าของล็อก เวลาหมดอายุ heartbeat และเพย์โหลดดีบัก; SQLite เป็นเจ้าของ ขอบเขตการรับ/ปล่อยแบบอะตอม ตัวเลือกไดเรกทอรีล็อกไฟล์ที่เลิกใช้แล้ว ถูกนำออก; การทดสอบใช้ข้อมูลประจำตัวของแถว SQLite โดยตรง - ลบตัวช่วยรายงานการใช้งาน Cron รุ่นเก่าที่ไม่มีการอ้างอิงและสแกนไฟล์
cron/runs/*.jsonlแล้ว รายงานประวัติการทำงานของ Cron อ่านแถวtask_runsที่ Cron เป็นเจ้าของ - ขณะนี้การกู้คืนจากการรีสตาร์ตของเซสชันหลักค้นหาเอเจนต์ที่เป็นไปได้ผ่านรีจิสทรี
SQLite
agent_databasesแทนการสแกนไดเรกทอรีagents/*/sessions - ขณะนี้การกู้คืนความเสียหายของเซสชัน Gemini ลบเฉพาะแถวเซสชันใน SQLite;
ไม่ต้องใช้เกต
storePathเดิมอีกต่อไป และไม่พยายามยกเลิกการเชื่อมโยง พาธ JSONL ของทรานสคริปต์ที่ได้จากการคำนวณ - ขณะนี้การจัดการการแทนที่พาธถือว่าค่าสภาพแวดล้อมแบบลิเทอรัล
undefined/nullไม่ได้ตั้งค่า เพื่อป้องกันการสร้างฐานข้อมูลundefined/state/*.sqliteที่รากรีโพโดยไม่ตั้งใจ ระหว่างการทดสอบหรือการส่งมอบผ่านเชลล์ - ขณะนี้ลายนิ้วมือสถานะความสมบูรณ์ของการกำหนดค่าใช้แถว SQLite แบบใช้ร่วมกันที่มีชนิดข้อมูล
config_health_entriesแทนlogs/config-health.jsonทำให้ไฟล์การกำหนดค่าปกติเป็น เอกสารการกำหนดค่าที่ไม่ใช่ข้อมูลประจำตัวเพียงรายการเดียว แอปคู่หู macOS เก็บเฉพาะ สถานะความสมบูรณ์ภายในโปรเซสและไม่สร้าง sidecar JSON เดิมขึ้นใหม่ - รันไทม์โปรไฟล์การยืนยันตัวตนไม่นำเข้าหรือเขียนไฟล์ JSON ข้อมูลประจำตัวอีกต่อไป
ที่จัดเก็บข้อมูลประจำตัวหลักคือ SQLite;
auth-profiles.json,auth.jsonต่อเอเจนต์ และcredentials/oauth.jsonแบบใช้ร่วมกันเป็นอินพุตการย้ายข้อมูลของ doctor ซึ่งจะถูกลบหลังการนำเข้า - ขณะนี้การทดสอบการบันทึก/สถานะโปรไฟล์การยืนยันตัวตนตรวจสอบตารางการยืนยันตัวตน SQLite ที่มีชนิดข้อมูลโดยตรง และใช้ชื่อไฟล์โปรไฟล์การยืนยันตัวตนเดิมเฉพาะเป็นอินพุตการย้ายข้อมูลของ doctor
openclaw secrets applyล้างเฉพาะไฟล์การกำหนดค่า ไฟล์ env และที่จัดเก็บ โปรไฟล์การยืนยันตัวตน SQLite เท่านั้น ไม่รวมตรรกะความเข้ากันได้ที่แก้ไขauth.jsonต่อเอเจนต์ที่เลิกใช้แล้วอีกต่อไป; doctor เป็นเจ้าของการนำเข้าและลบไฟล์นั้น- แผนการย้ายข้อมูลลับของ Hermes นำไปใช้และนำเข้าโปรไฟล์คีย์ API โดยตรง
สู่ที่จัดเก็บโปรไฟล์การยืนยันตัวตน SQLite ไม่เขียนหรือตรวจสอบ
auth-profiles.jsonเป็นเป้าหมายขั้นกลางอีกต่อไป - ขณะนี้เอกสารการยืนยันตัวตนสำหรับผู้ใช้อธิบาย
state/openclaw.sqlite#table/auth_profile_stores/<agentDir>แทน การบอกให้ผู้ใช้ตรวจสอบหรือคัดลอกauth-profiles.json; ชื่อ JSON ของ OAuth/การยืนยันตัวตน เดิมยังคงมีบันทึกไว้เฉพาะในฐานะอินพุตการนำเข้าของ doctor - ขณะนี้เซสชัน OAuth ของ MCP ใช้แถว
mcp_oauth_storesที่มีการกำหนดเวอร์ชันในstate/openclaw.sqliteแบบใช้ร่วมกัน ออบเจ็กต์โทเค็น การลงทะเบียนไคลเอ็นต์ และการค้นหา ที่ SDK เป็นเจ้าของยังคงเป็นเพย์โหลด JSON ที่ผ่านการตรวจสอบหนึ่งรายการ เพื่อให้ฟิลด์ส่วนขยายของการพึ่งพา ยังคงอยู่ ขณะที่การอ่าน/แก้ไข/เขียนทุกครั้งคอมมิตในธุรกรรม Kysely ระยะสั้นหนึ่งรายการ lease SQLite แบบใช้ร่วมกันหนึ่งรายการทำให้การรีเฟรช ล็อกอิน และล็อกเอาต์ทำงานตามลำดับ; ทรานสปอร์ต MCP แบบฝังไม่อนุญาตให้ MCP SDK รีเฟรชนอก lease นั้นอีกต่อไป Doctor เป็นผู้นำเข้าและลบที่จัดเก็บmcp-oauth/*.jsonที่เลิกใช้แล้วแต่เพียงผู้เดียวพร้อมใบรับต้นทาง และรันไทม์ไม่มีทางเลือกสำรองแบบไฟล์ - ตัวช่วยพาธสถานะของคอร์ไม่เปิดเผยไฟล์
credentials/oauth.jsonที่เลิกใช้แล้วอีกต่อไป ชื่อไฟล์เดิมอยู่เฉพาะในพาธนำเข้าการยืนยันตัวตนของ doctor - ขณะนี้เอกสารการติดตั้ง ความปลอดภัย การเริ่มต้นใช้งาน การยืนยันตัวตนโมเดล และ SecretRef อธิบาย แถวโปรไฟล์การยืนยันตัวตน SQLite และการสำรองข้อมูล/ย้ายข้อมูลทั้งสถานะ แทน ไฟล์ JSON โปรไฟล์การยืนยันตัวตนต่อเอเจนต์
- ขณะนี้การค้นหาโมเดล PI ส่งข้อมูลประจำตัวหลักไปยังที่จัดเก็บการยืนยันตัวตน
pi-coding-agentในหน่วยความจำ ไม่สร้าง ล้าง หรือเขียนauth.jsonต่อเอเจนต์ระหว่างการค้นหาอีกต่อไป - ขณะนี้การตั้งค่าทริกเกอร์และการกำหนดเส้นทาง Voice Wake ใช้ตาราง SQLite แบบใช้ร่วมกันที่มีชนิดข้อมูล
แทน
settings/voicewake.json,settings/voicewake-routing.jsonหรือ แถวทั่วไปแบบทึบ; doctor นำเข้าไฟล์ JSON เดิมและลบไฟล์เหล่านั้นหลัง การย้ายข้อมูลสำเร็จ - ขณะนี้สถานะการตรวจสอบการอัปเดตใช้แถว
update_check_stateแบบใช้ร่วมกันที่มีชนิดข้อมูลแทนupdate-check.jsonหรือบล็อบทั่วไปแบบทึบ; doctor นำเข้า ไฟล์ JSON เดิมและลบไฟล์หลังการย้ายข้อมูลสำเร็จ - ขณะนี้สถานะความสมบูรณ์ของการกำหนดค่าใช้แถว
config_health_entriesแบบใช้ร่วมกันที่มีชนิดข้อมูลแทนlogs/config-health.jsonหรือบล็อบทั่วไปแบบทึบ; doctor นำเข้าไฟล์ JSON เดิมและลบไฟล์หลังการย้ายข้อมูลสำเร็จ - ขณะนี้การอนุมัติการผูกการสนทนาของ Plugin ใช้แถว
plugin_binding_approvalsที่มีชนิดข้อมูลแทนสถานะ SQLite แบบใช้ร่วมกันที่ทึบหรือplugin-binding-approvals.json; ไฟล์เดิมเป็นอินพุตการย้ายข้อมูลของ doctor - ขณะนี้การผูกการสนทนาปัจจุบันแบบทั่วไปจัดเก็บแถว
current_conversation_bindingsที่มีชนิดข้อมูลแทนการเขียนbindings/current-conversations.jsonใหม่; doctor นำเข้าไฟล์ JSON เดิมและ ลบไฟล์หลังการย้ายข้อมูลสำเร็จ - ขณะนี้บัญชีแยกประเภทการซิงค์แหล่งข้อมูลที่นำเข้าของ Memory Wiki จัดเก็บแถวสถานะ Plugin ใน SQLite หนึ่งแถว
ต่อคีย์ vault/แหล่งข้อมูล แทนการเขียน
.openclaw-wiki/source-sync.jsonใหม่; ผู้ให้บริการการย้ายข้อมูลนำเข้าและลบบัญชีแยกประเภท JSON เดิม - ขณะนี้ระเบียนการทำงานนำเข้า ChatGPT ของ Memory Wiki จัดเก็บแถวสถานะ Plugin ใน SQLite หนึ่งแถว
ต่อ id ของ vault/การทำงาน แทนการเขียน
.openclaw-wiki/import-runs/*.jsonสแนปช็อตสำหรับย้อนกลับยังคงเป็นไฟล์ vault ที่ระบุชัดเจน จนกว่าการเก็บถาวรสแนปช็อต ของการทำงานนำเข้าจะถูกย้ายไปยังที่จัดเก็บบล็อบ - ขณะนี้ไดเจสต์ที่คอมไพล์ของ Memory Wiki จัดเก็บแถวบล็อบ Plugin ใน SQLite แบบบีบอัด
แทนการเขียน
.openclaw-wiki/cache/agent-digest.jsonและ.openclaw-wiki/cache/claims.jsonlแคชสามารถสร้างใหม่ได้ ดังนั้น doctor จึงลบไฟล์แคชเก่าโดยไม่นำเข้า - ขณะนี้การติดตามการติดตั้ง Skills ของ ClawHub จัดเก็บแถวสถานะ Plugin ใน SQLite หนึ่งแถวต่อ
เวิร์กสเปซ/Skills แทนการเขียนหรืออ่าน sidecar
.clawhub/lock.jsonและ.clawhub/origin.jsonขณะรันไทม์ โค้ดรันไทม์ใช้ออบเจ็กต์สถานะการติดตั้งที่ติดตาม แทนนามธรรม lockfile/origin ที่มีรูปแบบเหมือนไฟล์ Doctor นำเข้า sidecar เดิมจากเวิร์กสเปซเอเจนต์ที่กำหนดค่าไว้และลบออก หลังการนำเข้าที่สมบูรณ์ - ขณะนี้ดัชนี Plugin ที่ติดตั้งอ่านและเขียนแถว singleton
SQLite แบบใช้ร่วมกันที่มีชนิดข้อมูล
installed_plugin_indexแทนplugins/installs.json; ไฟล์ JSON เดิมเป็นเพียงอินพุตการย้ายข้อมูลของ doctor และจะถูกลบหลังการนำเข้า - ขณะนี้ตัวช่วยพาธ
plugins/installs.jsonเดิมอยู่ในโค้ดเดิมของ doctor โมดูลดัชนี Plugin ของรันไทม์เปิดเผยเฉพาะตัวเลือกการคงข้อมูลที่รองรับโดย SQLite ไม่ใช่พาธไฟล์ JSON - ขณะนี้ sentinel การรีสตาร์ต Gateway เจตนาการรีสตาร์ต และสถานะการส่งมอบให้ supervisor ใช้
แถว SQLite แบบใช้ร่วมกันที่มีชนิดข้อมูล (
gateway_restart_sentinel,gateway_restart_intentและgateway_restart_handoff) แทนบล็อบทั่วไป แบบทึบ โค้ดรีสตาร์ตของรันไทม์ไม่มีสัญญา sentinel/intent/handoff ที่มีรูปแบบเหมือนไฟล์ - ขณะนี้แคชการซิงค์ Matrix เมทาดาทาของที่จัดเก็บ การผูกเธรด เครื่องหมายขจัดข้อมูลซ้ำขาเข้า
สถานะช่วงพักหลังการตรวจสอบเมื่อเริ่มต้น สแนปช็อตคริปโต IndexedDB ของ SDK
ข้อมูลประจำตัว และคีย์กู้คืน ใช้ตารางสถานะ/บล็อบ Plugin ใน SQLite แบบใช้ร่วมกัน
โครงสร้างพาธของรันไทม์ไม่เปิดเผยพาธเมทาดาทา
storage-meta.jsonอีกต่อไป; ชื่อไฟล์นั้นเป็นเพียงอินพุตการย้ายข้อมูลเดิม แผนการนำเข้า JSON เดิม อยู่ในพื้นผิวการย้ายข้อมูลการตั้งค่า/doctor ของ Plugin Matrix เครื่องหมาย ขจัดข้อมูลซ้ำขาเข้าใช้ระบบขจัดข้อมูลซ้ำแบบอ้างสิทธิ์ได้ของคอร์ (เนมสเปซmatrix.inbound-dedupe.*ในฐานข้อมูลสถานะแบบใช้ร่วมกัน); การย้ายสถานะของ doctor สำหรับ Matrix นำเข้า แถวinbound-dedupeต่อรากที่เลิกใช้แล้วและinbound-dedupe.jsonหนึ่งครั้ง จากนั้นรันไทม์จะอ่านเฉพาะที่จัดเก็บการขจัดข้อมูลซ้ำแบบอ้างสิทธิ์ได้ - การเริ่มต้น Matrix ไม่สแกน รายงาน หรือดำเนินการสถานะไฟล์ Matrix เดิมให้เสร็จสิ้น อีกต่อไป การตรวจหาไฟล์ Matrix การสร้างสแนปช็อตคริปโตเดิม สถานะการย้าย การกู้คืนคีย์ห้อง การนำเข้า และการลบต้นทาง ล้วนเป็นของ doctor
- นำ barrel การย้ายข้อมูลรันไทม์ Matrix ออกแล้ว ตัวช่วยตรวจหา และแก้ไขสถานะ/คริปโตเดิมถูกนำเข้าโดย doctor ของ Matrix โดยตรง แทนการเป็น ส่วนหนึ่งของพื้นผิว API ของรันไทม์
- ขณะนี้เครื่องหมายการนำสแนปช็อตการย้ายข้อมูล Matrix กลับมาใช้ใหม่อยู่ในสถานะ Plugin ของ SQLite
แทน
matrix/migration-snapshot.json; doctor ยังคงนำไฟล์เก็บถาวรก่อนการย้ายข้อมูล ที่ผ่านการตรวจสอบเดียวกันกลับมาใช้ใหม่ได้โดยไม่เขียนไฟล์สถานะ sidecar - ขณะนี้เคอร์เซอร์บัส Nostr และสถานะการเผยแพร่โปรไฟล์ใช้สถานะ Plugin ใน SQLite แบบใช้ร่วมกัน แผนการนำเข้า JSON เดิมอยู่ในพื้นผิวการย้ายข้อมูล การตั้งค่า/doctor ของ Plugin Nostr
- ขณะนี้สวิตช์เปิด/ปิดเซสชัน Active Memory ใช้สถานะ Plugin ใน SQLite แบบใช้ร่วมกันแทน
session-toggles.json; การเปิดหน่วยความจำกลับมาจะลบแถวแทน การเขียนออบเจ็กต์ JSON ใหม่ - ขณะนี้ข้อเสนอและตัวนับการรีวิวของ Skill Workshop ใช้สถานะ Plugin ใน SQLite
แบบใช้ร่วมกันแทนที่จัดเก็บ
skill-workshop/<workspace>.jsonต่อเวิร์กสเปซ ข้อเสนอแต่ละรายการ เป็นแถวแยกภายใต้skill-workshop/proposalsและตัวนับการรีวิว เป็นแถวแยกภายใต้skill-workshop/reviews - ขณะนี้การทำงานของเอเจนต์ย่อยผู้รีวิว Skill Workshop ใช้ตัวแก้ไขทรานสคริปต์เซสชัน
ของรันไทม์ แทนการสร้างพาธเซสชัน sidecar
skill-workshop/<sessionId>.json - ขณะนี้ lease ของโปรเซส ACPX ใช้สถานะ Plugin ใน SQLite แบบใช้ร่วมกันภายใต้
acpx/process-leasesแทนรีจิสทรีทั้งไฟล์process-leases.jsonแต่ละ lease ถูกจัดเก็บเป็นแถวของตนเอง โดยยังคงการกำจัดโปรเซสค้าง เมื่อเริ่มต้นโดยไม่มีพาธเขียน JSON ใหม่ของรันไทม์ - สคริปต์ตัวห่อ ACPX และโฮม Codex แบบแยกส่วนถูกสร้างใน รากชั่วคราวของ OpenClaw โดยจะถูกสร้างใหม่ตามต้องการและไม่ใช่อินพุต สำหรับการสำรองข้อมูลหรือการย้ายข้อมูล
- การคงข้อมูลรีจิสทรีการทำงานของเอเจนต์ย่อยใช้แถว
subagent_runsแบบใช้ร่วมกันที่มีชนิดข้อมูล ขณะนี้พาธsubagents/runs.jsonเดิมเป็นเพียงอินพุตการล้างข้อมูลของ Doctor เท่านั้น Doctor อ้างสิทธิ์พาธดังกล่าวภายใต้ล็อกการบำรุงรักษาสถานะ บันทึกการตัดสินใจทิ้งข้อมูลใน SQLite และลบออกโดยไม่นำเข้าสถานะการทำงานชั่วคราว ไม่มีตัวอ่าน ตัวเขียน แคช หรือทางเลือกสำรอง JSON ของรันไทม์เหลืออยู่; ไม่รองรับการกู้คืนข้ามเวอร์ชัน ของการทำงานที่กำลังดำเนินการซึ่งมีเฉพาะในไฟล์โดยเจตนา ณ ขอบเขตการเลิกใช้นี้ การทดสอบรันไทม์ไม่สร้างฟิกซ์เจอร์runs.jsonที่ไม่ถูกต้องหรือว่างเปล่าเพื่อพิสูจน์ พฤติกรรมของรีจิสทรีอีกต่อไป; แต่จะตั้งต้น/อ่านแถว SQLite โดยตรง - การสำรองข้อมูลจัดเตรียมไดเรกทอรีสถานะก่อนเก็บถาวร คัดลอกไฟล์ที่ไม่ใช่ฐานข้อมูล
สร้างสแนปช็อตฐานข้อมูลด้วย
VACUUM INTOไม่รวม sidecar WAL/SHM ที่กำลังใช้งาน บันทึก เมทาดาทาสแนปช็อตในแมนิเฟสต์ของไฟล์เก็บถาวร และบันทึก การทำงานสำรองข้อมูลที่เสร็จสมบูรณ์ใน SQLite พร้อมแมนิเฟสต์ของไฟล์เก็บถาวรopenclaw backup createตรวจสอบไฟล์เก็บถาวรที่เขียนแล้วโดยค่าเริ่มต้น;--no-verifyคือ พาธด่วนที่ระบุอย่างชัดเจน openclaw backup restoreตรวจสอบไฟล์เก็บถาวรก่อนแตกไฟล์ นำแมนิเฟสต์ที่ปรับให้อยู่ในรูปแบบมาตรฐาน ของตัวตรวจสอบกลับมาใช้ใหม่ และคืนค่าแอสเซ็ตในแมนิเฟสต์ที่ผ่านการตรวจสอบไปยัง พาธต้นทางที่บันทึกไว้ ต้องใช้--yesสำหรับการเขียนและรองรับ--dry-runสำหรับแผนการคืนค่า- ลบตัวกรองพาธชั่วคราวของการสำรองข้อมูลรุ่นเก่าแล้ว การสำรองข้อมูลไม่ต้องใช้ รายการข้ามสำหรับ tar แบบสดสำหรับไฟล์ JSON/JSONL ของเซสชันหรือ Cron รุ่นเก่าอีกต่อไป เพราะสแนปช็อต SQLite ถูกจัดเตรียมก่อนสร้างไฟล์เก็บถาวร
- การตั้งค่าแบบปกติและการเตรียมพื้นที่ทำงานสำหรับการเริ่มต้นใช้งานจะไม่สร้างไดเรกทอรี
agents/<agentId>/sessions/อีกต่อไป โดยจะสร้างเฉพาะการกำหนดค่า/พื้นที่ทำงานเท่านั้น แถวเซสชันและแถวบทสนทนาใน SQLite จะถูกสร้างตามความต้องการใน ฐานข้อมูลของแต่ละเอเจนต์ - ขณะนี้การซ่อมแซมสิทธิ์ด้านความปลอดภัยมุ่งเป้าไปที่ฐานข้อมูล SQLite ส่วนกลางและของแต่ละเอเจนต์
รวมถึงไฟล์เสริม WAL/SHM แทน
sessions.jsonและไฟล์บทสนทนา JSONL - ขณะนี้ชื่อรันไทม์ของรีจิสทรี Sandbox อธิบายชนิดของรีจิสทรี SQLite โดยตรง แทนการใช้คำศัพท์รีจิสทรี JSON แบบเดิมต่อไปในที่เก็บข้อมูลที่ใช้งานอยู่
openclaw reset --scope config+creds+sessionsจะลบฐานข้อมูลopenclaw-agent.sqliteของแต่ละเอเจนต์พร้อมไฟล์เสริม WAL/SHM ไม่ใช่เพียง ไดเรกทอรีsessions/แบบเดิม- ขณะนี้ตัวช่วยเซสชันรวมของ Gateway ใช้ชื่อที่เน้นรายการ:
loadCombinedSessionEntriesForGatewayส่งคืน{ databasePath, entries }ชื่อแบบเก่าที่อ้างถึงที่เก็บข้อมูลแบบรวมถูกนำออกจากผู้เรียกใช้ในรันไทม์แล้ว - ขณะนี้การเตรียมข้อมูลเริ่มต้นให้ช่องทาง MCP ของ Docker จะเขียนแถวเซสชันหลักและเหตุการณ์บทสนทนา
ลงในฐานข้อมูล SQLite ของแต่ละเอเจนต์ แทนการสร้าง
sessions.jsonและบทสนทนา JSONL - ขณะนี้ฮุกหน่วยความจำเซสชันที่รวมมาให้จะค้นหาบริบทของเซสชันก่อนหน้าจาก
SQLite ด้วย
{agentId, sessionId}โดยจะไม่สแกน จัดเก็บ หรือสังเคราะห์ พาธบทสนทนาหรือไดเรกทอรีworkspace/sessionsอีกต่อไป - ขณะนี้ฮุกบันทึกคำสั่งที่รวมมาให้จะเขียนแถวการตรวจสอบคำสั่งลงในตาราง
command_log_entriesของ SQLite ที่ใช้ร่วมกัน แทนการต่อท้ายlogs/commands.log - ขณะนี้รายการอนุญาตสำหรับการจับคู่ช่องทางเปิดเผยเฉพาะตัวช่วยอ่าน/เขียนที่รองรับด้วย SQLite ในรันไทม์ ตัวแก้พาธของ SDK สำหรับ Plugin ที่เลิกใช้แล้วยังคงอยู่เพื่อความเข้ากันได้ ในการย้ายข้อมูล ส่วนตัวอ่านไฟล์จะอยู่เฉพาะในโค้ดย้ายสถานะของ doctor เท่านั้น
migration_runsบันทึกการดำเนินการย้ายสถานะแบบเดิม พร้อมสถานะ การประทับเวลา และรายงาน JSONmigration_sourcesบันทึกแหล่งที่มาของไฟล์แบบเดิมแต่ละไฟล์ที่นำเข้า พร้อมแฮช ขนาด จำนวนระเบียน ตารางเป้าหมาย รหัสการดำเนินการ สถานะ และสถานะการนำแหล่งที่มาออกbackup_runsบันทึกพาธไฟล์เก็บถาวรสำรอง สถานะ และแมนิเฟสต์ JSON- สคีมาส่วนกลางจะไม่เก็บตารางรีจิสทรี
agentsที่ไม่ได้ใช้ การค้นหา ฐานข้อมูลเอเจนต์คือรีจิสทรีagent_databasesมาตรฐาน จนกว่ารันไทม์ จะมีเจ้าของระเบียนเอเจนต์จริง - การกำหนดค่าแค็ตตาล็อกโมเดลที่สร้างขึ้นจะถูกจัดเก็บในแถว
agent_model_catalogsของ SQLite ส่วนกลางแบบมีชนิด โดยใช้ไดเรกทอรีเอเจนต์เป็นคีย์ ผู้เรียกใช้ในรันไทม์ใช้ensureOpenClawModelCatalog; ไม่มี API ความเข้ากันได้models.jsonใน โค้ดรันไทม์ การใช้งานจะเขียนลง SQLite และรีจิสทรี PI แบบฝังตัวจะได้รับข้อมูล จากเพย์โหลดที่จัดเก็บไว้โดยไม่สร้างไฟล์models.json - การส่งออก
memory.qmd.sessionsซึ่งเป็นทางเลือก จะอ่านแถวบทสนทนามาตรฐานจาก ฐานข้อมูลของแต่ละเอเจนต์ และสร้าง Markdown ที่ผ่านการทำให้ปลอดภัยภายใต้โฮมของ QMD เพื่อเป็นอาร์ติแฟกต์อินพุต QMD อย่างชัดเจน ดังนั้นคอลเลกชันเซสชัน QMD และการแมป ข้อมูลประจำตัวของอาร์ติแฟกต์จึงยังคงเป็นส่วนหนึ่งของบริดจ์เครื่องมือภายนอกที่กำหนดค่าไว้ ไม่ใช่ที่เก็บบทสนทนามาตรฐานชุดที่สอง index.sqliteของ QMD เอง การกำหนดค่าคอลเลกชัน YAML และการดาวน์โหลดโมเดลยังคงเป็น อาร์ติแฟกต์ของเครื่องมือภายนอกภายใต้~/.openclaw/agents/<agentId>/qmd; โดยจะไม่ถูก ทำสำเนาลงในplugin_blob_entriesการประสานงาน QMD ที่ OpenClaw เป็นเจ้าของ ใช้ฐานข้อมูลเป็นหลัก:state_leasesที่ใช้ร่วมกันจะจัดลำดับการฝังข้อมูลส่วนกลาง และstate_leasesของแต่ละเอเจนต์จะจัดลำดับตัวเขียนคอลเลกชัน/การอัปเดต/การฝังข้อมูล รันไทม์จะไม่สร้าง ไฟล์เสริมล็อก QMD- Plugin
memory-lancedbซึ่งเป็นทางเลือกจะไม่สร้าง~/.openclaw/memory/lancedbเป็นที่เก็บข้อมูลโดยนัยที่ OpenClaw จัดการอีกต่อไป โดยเป็น แบ็กเอนด์ LanceDB ภายนอกและจะยังคงปิดใช้งานจนกว่าผู้ดำเนินการจะกำหนดค่าdbPathอย่างชัดเจน check:database-first-legacy-storesจะทำให้ซอร์สรันไทม์ใหม่ที่จับคู่ ชื่อที่เก็บข้อมูลแบบเดิมกับ API ระบบไฟล์แบบเขียนล้มเหลว และยังทำให้ซอร์สรันไทม์ ที่นำเครื่องหมายบริดจ์บทสนทนาที่เลิกใช้แล้วกลับมา ได้แก่transcriptLocatorหรือsqlite-transcript://...ล้มเหลวด้วย โค้ดสำหรับการย้ายข้อมูล doctor การนำเข้า และการส่งออกที่ไม่ใช่เซสชันอย่างชัดเจนยังคงได้รับอนุญาต ชื่อสัญญาแบบเดิมที่กว้างกว่า เช่นsessionFile,storePathและฟาซาดจากยุคไฟล์SessionManagerแบบเก่า ยังคงมีเจ้าของปัจจุบันและต้องมีงานตัวป้องกันการย้ายข้อมูลแยกต่างหาก ก่อนจะกลายเป็นการตรวจสอบล่วงหน้าที่จำเป็น ขณะนี้ตัวป้องกันยังครอบคลุม ที่เก็บcache/*.jsonในรันไทม์ ไฟล์เสริมthread-bindings.jsonทั่วไป สถานะ Cron/JSON บันทึกการทำงาน JSON สถานะการกำหนดค่า ไฟล์เสริมการรีสตาร์ตและล็อก การตั้งค่า Voice Wake การอนุมัติการผูก Plugin JSON ดัชนี Plugin ที่ติดตั้ง JSONL การตรวจสอบ File Transfer บันทึกกิจกรรม Memory Wiki บันทึกข้อความcommand-loggerแบบเก่าที่รวมมาให้ และตัวเลือกการวินิจฉัย JSONL สตรีมดิบของ pi-mono นอกจากนี้ยังห้ามชื่อโมดูล doctor แบบเดิมที่ระดับราก เพื่อให้โค้ดความเข้ากันได้คงอยู่ภายใต้src/commands/doctor/ตัวจัดการดีบักของ Android ยังใช้ logcat/เอาต์พุตในหน่วยความจำแทนการพักไฟล์แคชcamera_debug.logหรือdebug_logs.txtด้วย
รูปแบบสคีมาเป้าหมาย
กำหนดสคีมาไว้อย่างชัดเจน สถานะรันไทม์ที่โฮสต์เป็นเจ้าของใช้ตารางที่มีชนิดข้อมูล สถานะทึบแสงที่ Plugin เป็นเจ้าของ
ใช้ plugin_state_entries / plugin_blob_entries; ไม่มีตาราง
kv แบบทั่วไปของโฮสต์
ฐานข้อมูลส่วนกลาง:
state_leases(scope, lease_key, owner, expires_at, heartbeat_at, payload_json, created_at, updated_at)exec_approvals_config(config_key, raw_json, socket_path, has_socket_token, default_security, default_ask, default_ask_fallback, auto_allow_skills, agent_count, allowlist_count, updated_at_ms)schema_meta(meta_key, role, schema_version, agent_id, app_version, created_at, updated_at)agent_databases(agent_id, path, schema_version, last_seen_at, size_bytes)task_runs(...)task_delivery_state(...)flow_runs(...)subagent_runs(run_id, child_session_key, requester_session_key, controller_session_key, created_at, ended_at, cleanup_handled, payload_json)current_conversation_bindings(binding_key, binding_id, target_agent_id, target_session_id, target_session_key, channel, account_id, conversation_kind, parent_conversation_id, conversation_id, target_kind, status, bound_at, expires_at, metadata_json, updated_at)plugin_binding_approvals(plugin_root, channel, account_id, plugin_id, plugin_name, approved_at)tui_last_sessions(scope_key, session_key, updated_at)plugin_state_entries(plugin_id, namespace, entry_key, value_json, created_at, expires_at)plugin_blob_entries(plugin_id, namespace, entry_key, metadata_json, blob, created_at, expires_at)media_blobs(subdir, id, content_type, size_bytes, blob, created_at, updated_at)skill_uploads(upload_id, kind, slug, force, size_bytes, sha256, actual_sha256, received_bytes, archive_blob, created_at, expires_at, committed, committed_at, idempotency_key_hash)skill_upload_chunks(upload_id, byte_offset, size_bytes, chunk_blob)web_push_subscriptions(endpoint_hash, subscription_id, endpoint, p256dh, auth, created_at_ms, updated_at_ms)web_push_vapid_keys(key_id, public_key, private_key, subject, updated_at_ms)apns_registrations(node_id, transport, token, relay_handle, send_grant, installation_id, relay_origin, topic, environment, distribution, token_debug_suffix, updated_at_ms)apns_registration_tombstones(node_id, deleted_at_ms)node_host_config(config_key, version, node_id, token, display_name, gateway_host, gateway_port, gateway_tls, gateway_tls_fingerprint, gateway_context_path, updated_at_ms)device_identities(identity_key, device_id, public_key_pem, private_key_pem, created_at_ms, updated_at_ms)device_auth_tokens(device_id, role, token, scopes_json, updated_at_ms)macos_port_guardian_records(pid, port, command, mode, timestamp)workspace_setup_state(workspace_key, workspace_path, version, bootstrap_seeded_at, setup_completed_at, updated_at)workspace_path_aliases(alias_key, alias_path, workspace_key, workspace_path, updated_at_ms)workspace_attestations(workspace_key, attested_at_ms, updated_at_ms)workspace_generated_bootstrap_hashes(workspace_key, filename, sha256)native_hook_relay_bridges(relay_id, pid, hostname, port, token, expires_at_ms, updated_at_ms)model_capability_cache(provider_id, model_id, name, input_text, input_image, reasoning, supports_tools, context_window, max_tokens, cost_input, cost_output, cost_cache_read, cost_cache_write, updated_at_ms)agent_model_catalogs(catalog_key, agent_dir, raw_json, updated_at)managed_outgoing_image_records(attachment_id, session_key, agent_id, message_id, created_at, updated_at, retention_class, alt, original_media_id, original_media_subdir, original_content_type, original_width, original_height, original_size_bytes, original_filename, record_json, cleanup_pending)gateway_restart_sentinel(sentinel_key, version, kind, status, ts, session_key, thread_id, delivery_channel, delivery_to, delivery_account_id, message, continuation_json, doctor_hint, stats_json, payload_json, updated_at_ms)channel_pairing_requests(channel_key, account_id, request_id, code, created_at, last_seen_at, meta_json)channel_pairing_allow_entries(channel_key, account_id, entry, sort_order, updated_at)voicewake_triggers(config_key, position, trigger, updated_at_ms)voicewake_routing_config(config_key, version, default_target_mode, default_target_agent_id, default_target_session_key, updated_at_ms)voicewake_routing_routes(config_key, position, trigger, target_mode, target_agent_id, target_session_key, updated_at_ms)update_check_state(state_key, last_checked_at, last_notified_version, last_notified_tag, last_available_version, last_available_tag, auto_install_id, auto_first_seen_version, auto_first_seen_tag, auto_first_seen_at, auto_last_attempt_version, auto_last_attempt_at, auto_last_success_version, auto_last_success_at, updated_at_ms)config_health_entries(config_path, last_known_good_json, last_promoted_good_json, last_observed_suspicious_signature, updated_at_ms)sandbox_registry_entries(registry_kind, container_name, session_key, backend_id, runtime_label, image, created_at_ms, last_used_at_ms, config_label_kind, config_hash, cdp_port, no_vnc_port, entry_json, updated_at)cron_jobs(store_key, job_id, name, description, enabled, delete_after_run, created_at_ms, agent_id, session_key, schedule_kind, schedule_expr, schedule_tz, every_ms, anchor_ms, at, stagger_ms, session_target, wake_mode, payload_kind, payload_message, payload_model, payload_fallbacks_json, payload_thinking, payload_timeout_seconds, payload_allow_unsafe_external_content, payload_external_content_source_json, payload_light_context, payload_tools_allow_json, delivery_mode, delivery_channel, delivery_to, delivery_thread_id, delivery_account_id, delivery_best_effort, failure_delivery_mode, failure_delivery_channel, failure_delivery_to, failure_delivery_account_id, failure_alert_disabled, failure_alert_after, failure_alert_channel, failure_alert_to, failure_alert_cooldown_ms, failure_alert_include_skipped, failure_alert_mode, failure_alert_account_id, next_run_at_ms, running_at_ms, last_run_at_ms, last_run_status, last_error, last_duration_ms, consecutive_errors, consecutive_skipped, schedule_error_count, last_delivery_status, last_delivery_error, last_delivered, last_failure_alert_at_ms, job_json, state_json, runtime_updated_at_ms, schedule_identity, sort_order, updated_at)delivery_queue_entries(queue_name, id, status, entry_kind, session_key, channel, target, account_id, retry_count, last_attempt_at, last_error, recovery_state, platform_send_started_at, entry_json, enqueued_at, updated_at, failed_at)commitments(id, agent_id, session_key, channel, account_id, recipient_id, thread_id, sender_id, kind, sensitivity, source, status, reason, suggested_text, dedupe_key, confidence, due_earliest_ms, due_latest_ms, due_timezone, source_message_id, source_run_id, created_at_ms, updated_at_ms, attempts, last_attempt_at_ms, sent_at_ms, dismissed_at_ms, snoozed_until_ms, expired_at_ms, record_json)migration_runs(id, started_at, finished_at, status, report_json)migration_sources(source_key, migration_kind, source_path, target_table, source_sha256, source_size_bytes, source_record_count, last_run_id, status, imported_at, removed_source, report_json)backup_runs(id, created_at, archive_path, status, manifest_json)ฐานข้อมูลเอเจนต์:
schema_meta(meta_key, role, schema_version, agent_id, app_version, created_at, updated_at)sessions(session_id, session_key, session_scope, created_at, updated_at, started_at, ended_at, status, chat_type, channel, account_id, primary_conversation_id, model_provider, model, agent_harness_id, parent_session_key, spawned_by, display_name)conversations(conversation_id, channel, account_id, kind, peer_id, parent_conversation_id, thread_id, native_channel_id, native_direct_user_id, label, metadata_json, created_at, updated_at)session_conversations(session_id, conversation_id, role, first_seen_at, last_seen_at)session_routes(session_key, session_id, updated_at)session_entries(session_id, session_key, entry_json, updated_at)transcript_events(session_id, seq, event_json, created_at)transcript_event_identities(session_id, event_id, seq, event_type, has_parent, parent_id, message_idempotency_key, created_at)transcript_snapshots(session_id, snapshot_id, reason, event_count, created_at, metadata_json)vfs_entries(namespace, path, kind, content_blob, metadata_json, updated_at)tool_artifacts(run_id, artifact_id, kind, metadata_json, blob, created_at)run_artifacts(run_id, path, kind, metadata_json, blob, created_at)trajectory_runtime_events(session_id, run_id, seq, event_json, created_at)memory_index_meta(key, value)memory_index_sources(id, path, source, hash, mtime, size)memory_index_chunks(id, path, source, start_line, end_line, hash, model, text, embedding, updated_at)memory_embedding_cache(provider, model, provider_key, hash, embedding, dims, updated_at)memory_index_state(id, revision)cache_entries(scope, key, value_json, blob, expires_at, updated_at)memory_index_sources.id คือคีย์หลักจำนวนเต็มที่มีความเสถียร; (path, source) ยังคงไม่ซ้ำกัน
การค้นหาในอนาคตสามารถเพิ่มตาราง FTS ได้โดยไม่ต้องเปลี่ยนตารางเหตุการณ์หลัก:
transcript_events_fts(session_id, seq, text)vfs_entries_fts(namespace, path, text)ค่าขนาดใหญ่ควรใช้คอลัมน์ blob ไม่ใช่การเข้ารหัสเป็นสตริง JSON ให้คง
value_json ไว้สำหรับข้อมูลแบบมีโครงสร้างขนาดเล็กที่ต้องยังตรวจสอบได้ด้วยเครื่องมือ
SQLite ทั่วไป
agent_databases คือรีจิสทรีหลักสำหรับสาขานี้ อย่าเพิ่มตาราง
agents จนกว่าจะมีเจ้าของระเบียนเอเจนต์จริง; การกำหนดค่าเอเจนต์ยังคงอยู่ใน
openclaw.json
รูปแบบการย้ายข้อมูลของ Doctor
Doctor ควรเรียกขั้นตอนการย้ายข้อมูลที่ชัดเจนเพียงขั้นตอนเดียว ซึ่งรายงานผลได้และ เรียกซ้ำได้อย่างปลอดภัย:
openclaw doctor --fixopenclaw doctor --fix เรียกใช้การนำการย้ายสถานะไปใช้หลังจาก
การตรวจสอบเบื้องต้นของการกำหนดค่าตามปกติ และสร้างข้อมูลสำรองที่ผ่านการตรวจสอบก่อนนำเข้า การเริ่มต้น
รันไทม์และ openclaw migrate ต้องไม่นำเข้าไฟล์สถานะ OpenClaw แบบเดิม
คุณสมบัติของการย้ายข้อมูล:
- การย้ายข้อมูลหนึ่งรอบค้นหาแหล่งไฟล์แบบเดิมทั้งหมดและสร้างแผน ก่อนเปลี่ยนแปลงสิ่งใด
- Doctor สร้างไฟล์เก็บถาวรสำรองก่อนการย้ายข้อมูลที่ผ่านการตรวจสอบแล้วก่อนนำเข้า ไฟล์แบบเดิม
- การนำเข้าสามารถทำซ้ำได้โดยให้ผลเดิม และกำหนดคีย์ด้วยพาธต้นทาง, mtime, ขนาด, แฮช และตาราง เป้าหมาย
- ไฟล์ต้นทางที่ดำเนินการสำเร็จจะถูกลบหรือเก็บถาวรหลังจากฐานข้อมูลเป้าหมาย คอมมิตแล้ว
- การนำเข้าที่ล้มเหลวจะไม่เปลี่ยนแปลงต้นทาง และบันทึกคำเตือนไว้ใน
migration_runs - โค้ดรันไทม์อ่านจาก SQLite เท่านั้นหลังจากมีการย้ายข้อมูลแล้ว
- ไม่จำเป็นต้องมีพาธสำหรับดาวน์เกรดหรือส่งออกกลับไปเป็นไฟล์รันไทม์
รายการสิ่งที่ต้องย้ายข้อมูล
ย้ายรายการเหล่านี้ไปยังฐานข้อมูลส่วนกลาง:
- ขณะนี้การเขียนข้อมูลขณะรันไทม์ของรีจิสทรีงานใช้ฐานข้อมูลที่ใช้ร่วมกันแล้ว และได้ลบตัวนำเข้า sidecar
tasks/runs.sqliteที่ยังไม่เคยเผยแพร่แล้ว การบันทึกสแนปช็อตจะ upsert ตาม id งาน และลบเฉพาะแถวงาน/การส่งมอบที่หายไป - ขณะนี้การเขียนข้อมูลขณะรันไทม์ของ Task Flow ใช้ฐานข้อมูลที่ใช้ร่วมกันแล้ว และได้ลบตัวนำเข้า sidecar
tasks/flows/registry.sqliteที่ยังไม่เคยเผยแพร่แล้ว การบันทึกสแนปช็อต จะ upsert ตาม id โฟลว์ และลบเฉพาะแถวโฟลว์ที่หายไป - ขณะนี้การเขียนข้อมูลขณะรันไทม์ของสถานะ Plugin ใช้ฐานข้อมูลที่ใช้ร่วมกันแล้ว และได้ลบตัวนำเข้า sidecar
plugin-state/state.sqliteที่ยังไม่เคยเผยแพร่แล้ว - การค้นหาหน่วยความจำในตัวจะไม่ใช้
memory/<agentId>.sqliteเป็นค่าเริ่มต้นอีกต่อไป โดยตารางดัชนี อยู่ในฐานข้อมูลของเอเจนต์เจ้าของ และได้เลิกใช้การเลือกใช้ sidecarmemorySearch.store.pathแบบชัดแจ้งแล้ว โดยย้ายไปยังการย้ายข้อมูลการกำหนดค่าของ doctor - การสร้างดัชนีหน่วยความจำในตัวใหม่จะรีเซ็ตเฉพาะตารางที่หน่วยความจำเป็นเจ้าของในฐานข้อมูลเอเจนต์ ห้ามแทนที่ไฟล์ SQLite ทั้งไฟล์ เนื่องจากฐานข้อมูลเดียวกันนี้เป็นเจ้าของ เซสชัน ทรานสคริปต์ แถว VFS อาร์ติแฟกต์ และแคชขณะรันไทม์
- รีจิสทรีคอนเทนเนอร์/เบราว์เซอร์ของแซนด์บ็อกซ์จาก JSON แบบรวมศูนย์และแบบแบ่งส่วน ขณะนี้ การเขียนข้อมูลขณะรันไทม์ใช้ฐานข้อมูลที่ใช้ร่วมกันแล้ว และยังคงรองรับการนำเข้า JSON เดิม
- ขณะนี้คำจำกัดความงาน Cron สถานะกำหนดเวลา และประวัติการรันใช้ SQLite ที่ใช้ร่วมกัน
โดย doctor จะนำเข้า/ลบไฟล์
jobs.json,jobs-state.jsonและcron/runs/*.jsonlเดิม - ข้อมูลประจำตัว/การยืนยันตัวตนของอุปกรณ์ การพุช การตรวจสอบการอัปเดต ข้อผูกมัด แคชโมเดล OpenRouter ดัชนี Plugin ที่ติดตั้ง และการผูกเซิร์ฟเวอร์แอป
- ขณะนี้ระเบียนการจับคู่อุปกรณ์/โหนดและการบูตสแตรปใช้ตาราง SQLite แบบมีชนิด
- ขณะนี้สมาชิกที่รับการแจ้งเตือนการจับคู่อุปกรณ์และตัวทำเครื่องหมายคำขอที่ส่งแล้วใช้ตารางสถานะ Plugin
SQLite ที่ใช้ร่วมกันแทน
device-pair-notify.json - ขณะนี้ระเบียนการโทรแบบเสียงใช้ตารางสถานะ Plugin SQLite ที่ใช้ร่วมกันภายใต้เนมสเปซ
voice-call/callsแทนcalls.jsonlโดย CLI ของ Plugin จะติดตามและสรุปประวัติการโทรที่รองรับด้วย SQLite - ขณะนี้เซสชัน Gateway ของ QQBot ระเบียนผู้ใช้ที่รู้จัก และแคชคำพูดอ้างอิงของดัชนีการอ้างอิงใช้
สถานะ Plugin SQLite ภายใต้เนมสเปซ
qqbot(gateway-sessions,known-users,ref-index) แทนsession-*.json,known-users.jsonและref-index.jsonlไฟล์เดิมเหล่านั้นเป็นแคชและจะไม่ถูกย้ายข้อมูล - ขณะนี้การกำหนดค่าตัวเลือกโมเดลของ Discord แฮชการปรับใช้คำสั่ง และการผูกเธรด
ใช้สถานะ Plugin SQLite ภายใต้เนมสเปซ
discord(model-picker-preferences,command-deploy-hashes,thread-bindings) แทนmodel-picker-preferences.json,command-deploy-cache.jsonและthread-bindings.jsonโดยการย้ายข้อมูล doctor/การตั้งค่าของ Discord จะนำเข้าและ ลบไฟล์เดิม - ขณะนี้เคอร์เซอร์การตามข้อมูลย้อนหลังและตัวทำเครื่องหมายการขจัดข้อมูลซ้ำขาเข้าของ BlueBubbles ใช้สถานะ Plugin
SQLite ภายใต้เนมสเปซ
bluebubbles(catchup-cursors,inbound-dedupe) แทนbluebubbles/catchup/*.jsonและbluebubbles/inbound-dedupe/*.jsonโดยการย้ายข้อมูล doctor/การตั้งค่าของ BlueBubbles จะนำเข้าและลบไฟล์เดิม - ขณะนี้ออฟเซ็ตการอัปเดต รายการแคชสติกเกอร์ รายการแคชข้อความในสายการตอบกลับ
รายการแคชข้อความที่ส่ง รายการแคชชื่อหัวข้อ และการผูกเธรดของ Telegram
ใช้สถานะ Plugin SQLite ภายใต้เนมสเปซ
telegram(update-offsets,sticker-cache,message-cache,sent-messages,topic-names,thread-bindings) แทนupdate-offset-*.json,sticker-cache.json,*.telegram-messages.json,*.telegram-sent-messages.json,*.telegram-topic-names.jsonและthread-bindings-*.jsonโดยการย้ายข้อมูล doctor/การตั้งค่าของ Telegram จะนำเข้าและ ลบไฟล์เดิม - ขณะนี้เคอร์เซอร์การตามข้อมูลย้อนหลัง การแมป short-id ของการตอบกลับ และแถวขจัดเสียงสะท้อนของข้อความที่ส่งซ้ำ
ของ iMessage ใช้สถานะ Plugin SQLite ภายใต้เนมสเปซ
imessage(catchup-cursors,reply-cache,sent-echoes) แทนimessage/catchup/*.json,imessage/reply-cache.jsonlและimessage/sent-echoes.jsonlโดยการย้ายข้อมูล doctor/การตั้งค่าของ iMessage จะนำเข้าและลบไฟล์เดิม - ขณะนี้การสนทนา โพล โทเค็น SSO และข้อมูลการเรียนรู้จากข้อเสนอแนะของ Microsoft Teams
ใช้เนมสเปซสถานะ Plugin SQLite (
conversations,polls,sso-tokens,feedback-learnings) แทนmsteams-conversations.json,msteams-polls.json,msteams-sso-tokens.jsonและ*.learnings.jsonโดยการย้ายข้อมูล doctor/การตั้งค่าของ Microsoft Teams จะนำเข้าและเก็บไฟล์เดิมเข้าคลัง การอัปโหลดที่รอดำเนินการเป็นแคช SQLite อายุสั้น และไฟล์แคช JSON เก่า จะไม่ถูกย้ายข้อมูล - ขณะนี้แคชการซิงค์ เมทาดาทาพื้นที่จัดเก็บ การผูกเธรด ตัวทำเครื่องหมายการขจัดข้อมูลซ้ำขาเข้า
สถานะช่วงพักการตรวจสอบเมื่อเริ่มต้น ข้อมูลรับรอง คีย์การกู้คืน และสแนปช็อตการเข้ารหัส IndexedDB
ของ SDK สำหรับ Matrix ใช้เนมสเปซสถานะ/บล็อบของ Plugin SQLite ภายใต้
matrix(sync-store,storage-meta,thread-bindings,matrix.inbound-dedupe.*ผ่านการขจัดข้อมูลซ้ำแบบอ้างสิทธิ์ได้ของคอร์startup-verification,credentials,recovery-key,idb-snapshots) แทนbot-storage.json,storage-meta.json,thread-bindings.json,inbound-dedupe.json,startup-verification.json,credentials.json,recovery-key.jsonและcrypto-idb-snapshot.jsonโดยการย้ายข้อมูล doctor/การตั้งค่า ของ Matrix จะนำเข้าและลบไฟล์เดิมเหล่านั้น (รวมถึงแถว SQLiteinbound-dedupeแบบต่อรากที่เลิกใช้แล้ว) จากรากพื้นที่จัดเก็บ Matrix ที่กำหนดขอบเขตตามบัญชี - ขณะนี้เคอร์เซอร์บัสและสถานะการเผยแพร่โปรไฟล์ของ Nostr ใช้สถานะ Plugin SQLite ภายใต้
เนมสเปซ
nostr(bus-state,profile-state) แทนbus-state-*.jsonและprofile-state-*.jsonโดยการย้ายข้อมูล doctor/การตั้งค่า ของ Nostr จะนำเข้าและลบไฟล์เดิม - ขณะนี้ตัวสลับเซสชัน Active Memory ใช้สถานะ Plugin SQLite ภายใต้
active-memory/session-togglesแทนsession-toggles.json - ขณะนี้คิวข้อเสนอและตัวนับการรีวิวของ Skill Workshop ใช้สถานะ Plugin SQLite
ภายใต้
skill-workshop/proposalsและskill-workshop/reviewsแทน ไฟล์skill-workshop/<workspace>.jsonแบบต่อเวิร์กสเปซ - ขณะนี้คิวการส่งมอบขาออกและการส่งมอบเซสชันใช้ตาราง SQLite ส่วนกลาง
delivery_queue_entriesร่วมกันภายใต้ชื่อคิวที่แยกกัน (outbound-delivery,session-delivery) แทนไฟล์ถาวรdelivery-queue/*.json,delivery-queue/failed/*.jsonและsession-delivery-queue/*.jsonขั้นตอนสถานะเดิมของ doctor จะนำเข้า แถวที่รอดำเนินการและล้มเหลว ลบตัวทำเครื่องหมายการส่งแล้วที่ล้าสมัย และลบไฟล์ JSON เก่าหลังการนำเข้า ฟิลด์การกำหนดเส้นทางแบบทันทีและการลองใหม่เป็นคอลัมน์แบบมีชนิด ส่วนเพย์โหลด JSON จะเก็บไว้เฉพาะสำหรับการเล่นซ้ำ/ดีบัก - ขณะนี้ลีสกระบวนการ ACPX ใช้สถานะ Plugin SQLite ภายใต้
acpx/process-leasesแทนprocess-leases.json - เมทาดาทาการรันการสำรองข้อมูลและการย้ายข้อมูล
ย้ายรายการต่อไปนี้ไปยังฐานข้อมูลเอเจนต์:
- รากเซสชันของเอเจนต์และเพย์โหลดรายการเซสชันที่มีรูปแบบเพื่อความเข้ากันได้ ดำเนินการแล้วสำหรับ
การเขียนข้อมูลขณะรันไทม์: สามารถสืบค้นเมทาดาทาเซสชันที่ใช้งานบ่อยได้ใน
sessionsขณะที่ เพย์โหลดSessionEntryแบบเต็มที่มีรูปแบบเดิมยังคงอยู่ในsession_entries - เหตุการณ์ทรานสคริปต์ของเอเจนต์ ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์
- เช็กพอยต์ Compaction และสแนปช็อตทรานสคริปต์ ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์:
สำเนาทรานสคริปต์ของเช็กพอยต์เป็นแถวทรานสคริปต์ SQLite และเมทาดาทาเช็กพอยต์
ถูกบันทึกใน
transcript_snapshotsขณะนี้ตัวช่วยเช็กพอยต์ของ Gateway เรียกค่าเหล่านี้ว่าสแนปช็อตทรานสคริปต์แทนไฟล์ต้นทาง - เนมสเปซพื้นที่ชั่วคราว/เวิร์กสเปซ VFS ของเอเจนต์ ดำเนินการแล้วสำหรับการเขียน VFS ขณะรันไทม์
- เพย์โหลดไฟล์แนบของเอเจนต์ย่อย ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์: รายการเหล่านี้เป็นรายการตั้งต้น VFS ของ SQLite และไม่เป็นไฟล์เวิร์กสเปซถาวร
- อาร์ติแฟกต์ของเครื่องมือ ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์
- อาร์ติแฟกต์การรัน ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์ของเวิร์กเกอร์ผ่านตาราง
run_artifactsแบบต่อเอเจนต์ - แคชขณะรันไทม์ภายในเอเจนต์ ดำเนินการแล้วสำหรับการเขียนแคชที่กำหนดขอบเขตขณะรันไทม์ของเวิร์กเกอร์ผ่าน
ตาราง
cache_entriesแบบต่อเอเจนต์ แคชโมเดลทั่วทั้ง Gateway ยังคงอยู่ใน ฐานข้อมูลส่วนกลาง เว้นแต่จะกลายเป็นข้อมูลเฉพาะเอเจนต์ - บันทึกสตรีมหลักของ ACP ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์
- เซสชันบัญชีแยกประเภทการเล่นซ้ำของ ACP ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์ผ่าน
acp_replay_sessionsและacp_replay_eventsส่วนacp/event-ledger.jsonเดิม ยังคงใช้เป็นข้อมูลนำเข้าของ doctor เท่านั้น - เมทาดาทาเซสชัน ACP ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์ผ่าน
acp_sessionsส่วนบล็อกentry.acpเดิมในsessions.jsonเป็นเพียงข้อมูลนำเข้าสำหรับการย้ายข้อมูลของ doctor - sidecar ของวิถีการทำงานเมื่อไม่ใช่ไฟล์ส่งออกโดยชัดแจ้ง ดำเนินการแล้วสำหรับการเขียนข้อมูล
ขณะรันไทม์: การบันทึกวิถีการทำงานเขียนแถว
trajectory_runtime_eventsในฐานข้อมูลเอเจนต์ และทำมิเรอร์อาร์ติแฟกต์ที่กำหนดขอบเขตตามการรันไปยัง SQLite sidecar เดิมเป็นเพียง ข้อมูลนำเข้าสำหรับ doctor ส่วนการส่งออกสามารถสร้างเอาต์พุตชุดข้อมูลสนับสนุน JSONL ใหม่ แต่จะไม่อ่านหรือย้ายข้อมูล sidecar ของวิถีการทำงาน/ทรานสคริปต์เก่าขณะรันไทม์ การบันทึกวิถีการทำงานขณะรันไทม์เปิดเผยขอบเขต SQLite ส่วนตัวช่วยพาธ JSONL แยกไว้สำหรับการรองรับการส่งออก/ดีบัก และไม่ได้ส่งออกซ้ำจากโมดูลขณะรันไทม์ เมทาดาทาวิถีการทำงานของตัวรันแบบฝังจะบันทึกข้อมูลประจำตัว{agentId, sessionId, sessionKey}แทนการจัดเก็บตัวระบุตำแหน่งทรานสคริปต์แบบถาวร
คงรายการต่อไปนี้ให้รองรับด้วยไฟล์ไว้ก่อน:
openclaw.json- ไฟล์ข้อมูลรับรองของผู้ให้บริการหรือ CLI
- ไฟล์แมนิเฟสต์ของ Plugin/แพ็กเกจ
- เวิร์กสเปซผู้ใช้และรีโพซิทอรี Git เมื่อเลือกโหมดดิสก์
- บันทึกที่มีไว้ให้ผู้ปฏิบัติงานติดตาม เว้นแต่จะมีการย้ายพื้นผิวบันทึกเฉพาะรายการ
แผนการย้ายข้อมูล
ระยะที่ 0: ตรึงขอบเขต
กำหนดขอบเขตสถานะถาวรให้ชัดเจนก่อนย้ายแถวเพิ่มเติม:
- เพิ่มตาราง
migration_runsไปยังฐานข้อมูลส่วนกลาง ดำเนินการแล้วสำหรับรายงานการดำเนินการย้ายข้อมูลสถานะเดิม - เพิ่มบริการย้ายข้อมูลสถานะจากไฟล์ไปยังฐานข้อมูลเพียงรายการเดียวซึ่ง doctor เป็นเจ้าของ
ดำเนินการแล้ว:
openclaw doctor --fixใช้การติดตั้งใช้งานการย้ายข้อมูลสถานะเดิม - กำหนดให้
planเป็นแบบอ่านอย่างเดียว และให้applyสร้างข้อมูลสำรอง นำเข้า ตรวจสอบ แล้วจึงลบหรือกักกันไฟล์เก่า ดำเนินการแล้ว: doctor สร้างข้อมูลสำรองก่อนย้ายข้อมูลที่ผ่านการตรวจสอบ ส่งพาธข้อมูลสำรอง ไปยังmigration_runsและใช้พาธตัวนำเข้า/การลบซ้ำ - เพิ่มข้อห้ามแบบสแตติกเพื่อไม่ให้โค้ดขณะรันไทม์ใหม่เขียนไฟล์สถานะเดิม ขณะที่ โค้ดการย้ายข้อมูลและการทดสอบยังคงสร้างข้อมูลตั้งต้น/อ่านไฟล์เหล่านั้นได้ ดำเนินการแล้วสำหรับพื้นที่จัดเก็บเดิมที่ย้ายข้อมูลในปัจจุบัน โดยตัวป้องกันจะสแกน การทดสอบที่ซ้อนกันเพื่อหาสัญญาตัวระบุตำแหน่งทรานสคริปต์ขณะรันไทม์ที่ต้องห้ามด้วย
ระยะที่ 1: ทำระนาบควบคุมส่วนกลางให้เสร็จสมบูรณ์
เก็บสถานะการประสานงานที่ใช้ร่วมกันไว้ใน state/openclaw.sqlite:
- เอเจนต์และรีจิสทรีฐานข้อมูลเอเจนต์
- บัญชีแยกประเภทงานและ Task Flow
- สถานะ Plugin
- รีจิสทรีคอนเทนเนอร์/เบราว์เซอร์ของแซนด์บ็อกซ์
- ประวัติการรัน Cron/ตัวกำหนดเวลา
- การจับคู่ อุปกรณ์ การพุช การตรวจสอบการอัปเดต TUI แคช OpenRouter/โมเดล และสถานะ ขณะรันไทม์ขนาดเล็กอื่นๆ ที่กำหนดขอบเขตตาม Gateway
- เมทาดาทาการสำรองข้อมูลและการย้ายข้อมูล
- ไบต์ไฟล์แนบสื่อของ Gateway ดำเนินการแล้วสำหรับการเขียนข้อมูลขณะรันไทม์ โดยพาธไฟล์โดยตรง
เป็นการสร้างไฟล์ชั่วคราวเพื่อให้เข้ากันได้กับตัวส่งของช่องทางและการจัดเตรียม
แซนด์บ็อกซ์ รายการอนุญาตขณะรันไทม์ยอมรับพาธการสร้างไฟล์จาก SQLite ไม่ใช่ราก
สื่อสถานะ/การกำหนดค่าเดิม doctor จะนำเข้าไฟล์สื่อเดิมไปยัง
media_blobsและลบไฟล์ต้นทางหลังเขียนแถวสำเร็จ - เซสชัน เหตุการณ์ และบล็อบเพย์โหลดของการบันทึกพร็อกซีดีบัก ดำเนินการแล้ว: ข้อมูลที่บันทึก
อยู่ในฐานข้อมูลสถานะที่ใช้ร่วมกัน และเปิดผ่านการบูตสแตรป สคีมา
WAL และการตั้งค่าเวลารอเมื่อไม่ว่างของฐานข้อมูลสถานะที่ใช้ร่วมกัน ไบต์เพย์โหลดถูกบีบอัดด้วย gzip ใน
capture_blobs.dataไม่มีการแทนที่ฐานข้อมูล sidecar ขณะรันไทม์ของพร็อกซีดีบัก ไดเรกทอรีบล็อบ หรือเป้าหมายสคีมา/การสร้างโค้ดที่สร้างขึ้นเฉพาะการบันทึกพร็อกซี การย้ายข้อมูลของ doctor/การเริ่มต้นจะนำเข้าแถวdebug-proxy/capture.sqliteที่เผยแพร่แล้ว และบล็อบเพย์โหลดที่อ้างอิง รวมถึงการแทนที่สภาพแวดล้อมฐานข้อมูล/บล็อบเดิมที่ใช้งานอยู่ จากนั้นเก็บแหล่งข้อมูลเหล่านั้นเข้าคลังโดยคงใบรับรอง CA ไว้ดังเดิม
ระยะนี้ยังลบตัวเปิด sidecar ที่ซ้ำกัน ตัวช่วยด้านสิทธิ์ การตั้งค่า WAL การตัดแต่งระบบไฟล์ และตัวเขียนเพื่อความเข้ากันได้ออกจากระบบย่อยเหล่านั้นด้วย
ระยะที่ 2: เริ่มใช้ฐานข้อมูลแยกตามเอเจนต์
สร้างฐานข้อมูลหนึ่งชุดต่อเอเจนต์ และลงทะเบียนจากฐานข้อมูลส่วนกลาง:
~/.openclaw/state/openclaw.sqlite~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqliteแถว agent_databases ส่วนกลางเก็บพาธ เวอร์ชันสคีมา การประทับเวลา
ที่พบล่าสุด และข้อมูลเมตาพื้นฐานด้านขนาด/ความสมบูรณ์ โค้ดรันไทม์จะขอ
ฐานข้อมูลเอเจนต์จากรีจิสทรี แทนการคำนวณพาธไฟล์โดยตรง
ฐานข้อมูลเอเจนต์เป็นเจ้าของ:
sessionsเป็นรากเซสชันมาตรฐาน โดยมีsession_entriesเป็น ตารางเพย์โหลดที่มีรูปแบบเพื่อความเข้ากันได้ซึ่งเชื่อมกับรากนั้น และsession_routesเป็นการค้นหาsession_keyที่ใช้งานอยู่ซึ่งไม่ซ้ำกันconversationsและsession_conversationsเป็นข้อมูลประจำตัวการกำหนดเส้นทาง ผู้ให้บริการแบบปรับให้อยู่ในรูปมาตรฐานซึ่งเชื่อมกับเซสชันtranscript_events- สแนปช็อตทรานสคริปต์และเช็กพอยต์ Compaction ดำเนินการแล้วสำหรับการเขียนของรันไทม์
vfs_entriestool_artifactsและอาร์ติแฟกต์การรัน- แถวรันไทม์/แคชภายในเอเจนต์ ดำเนินการแล้วสำหรับแคชที่จำกัดขอบเขตตามเวิร์กเกอร์
- เหตุการณ์สตรีมแม่ของ ACP
- เหตุการณ์รันไทม์ของวิถีการทำงาน เมื่อไม่ได้เป็นอาร์ติแฟกต์ส่งออกที่ระบุไว้อย่างชัดเจน
ระยะที่ 3: แทนที่ API ของที่เก็บเซสชัน
ดำเนินการแล้วสำหรับรันไทม์ พื้นผิวที่เก็บเซสชันในรูปแบบไฟล์ไม่ใช่ สัญญารันไทม์ที่ใช้งานอยู่:
- รันไทม์ไม่เรียก
loadSessionStore(storePath)หรือถือว่าstorePathเป็น ข้อมูลประจำตัวเซสชันอีกต่อไป - การดำเนินการกับแถวของรันไทม์คือ
getSessionEntry,upsertSessionEntry,patchSessionEntry,deleteSessionEntryและlistSessionEntries - ตัวช่วยเขียนที่เก็บใหม่ทั้งชุด ตัวเขียนไฟล์ การทดสอบคิว การตัดแต่งนามแฝง และ พารามิเตอร์การลบคีย์แบบเดิมถูกนำออกจากรันไทม์แล้ว
- การส่งออกเพื่อความเข้ากันได้จากแพ็กเกจรากที่เลิกแนะนำแล้วยังคงปรับ
พาธ
sessions.jsonมาตรฐานให้เข้ากับ API แถวของ SQLite - การแยกวิเคราะห์
sessions.jsonคงอยู่เฉพาะในโค้ดย้ายข้อมูล/นำเข้าของ doctor และ การทดสอบ doctor - การอ่านสำรองของวงจรชีวิตรันไทม์จะอ่านส่วนหัวทรานสคริปต์ของ SQLite ไม่ใช่ บรรทัดแรกของ JSONL
ให้ลบทุกสิ่งที่นำพารามิเตอร์ล็อกไฟล์ คำศัพท์การตัดแต่ง/ตัดทอนในฐานะการบำรุงรักษาไฟล์ ข้อมูลประจำตัวจากพาธที่เก็บ หรือการทดสอบ ที่ยืนยันเพียงการคงอยู่ของ JSON กลับมาใช้อีก
ระยะที่ 4: ย้ายทรานสคริปต์ สตรีม ACP วิถีการทำงาน และ VFS
ทำให้ทุกสตรีมข้อมูลของเอเจนต์ทำงานบนฐานข้อมูลโดยตรง:
- การเขียนแบบต่อท้ายทรานสคริปต์ดำเนินการผ่านธุรกรรม SQLite หนึ่งรายการ ซึ่งรับรองว่า
มีส่วนหัวเซสชัน ตรวจสอบความเป็น idempotent ของข้อความ เลือกส่วนท้ายของแม่ แทรก
ลงใน
transcript_eventsและบันทึกข้อมูลเมตาข้อมูลประจำตัวที่สืบค้นได้ในtranscript_event_identitiesดำเนินการแล้วสำหรับการต่อท้ายข้อความทรานสคริปต์โดยตรงและ การต่อท้ายTranscriptSessionManagerแบบคงอยู่ตามปกติ การดำเนินการกับกิ่งที่ระบุชัดเจน จะยังคงใช้ตัวเลือกแม่ที่ระบุชัดเจน และยังเขียนแถว SQLite โดยไม่คำนวณตัวระบุตำแหน่งไฟล์ใดๆ - บันทึกสตรีมแม่ของ ACP เปลี่ยนเป็นแถว ไม่ใช่ไฟล์
.acp-stream.jsonlดำเนินการแล้ว - การตั้งค่าการสร้าง ACP ไม่คงพาธ JSONL ของทรานสคริปต์อีกต่อไป ดำเนินการแล้ว
- การบันทึกวิถีการทำงานของรันไทม์เขียนแถวเหตุการณ์/อาร์ติแฟกต์โดยตรง คำสั่ง สนับสนุน/ส่งออกที่ระบุชัดเจนยังคงสร้างอาร์ติแฟกต์ JSONL ของชุดข้อมูลสนับสนุนเป็น รูปแบบส่งออกได้ แต่การส่งออกเซสชันจะไม่สร้าง JSONL ของเซสชันขึ้นใหม่ ดำเนินการแล้ว
- พื้นที่ทำงานบนดิสก์จะคงอยู่บนดิสก์เมื่อกำหนดค่าเป็นโหมดดิสก์
- พื้นที่ชั่วคราวของ VFS และโหมดพื้นที่ทำงานเฉพาะ VFS แบบทดลองใช้ฐานข้อมูลเอเจนต์
การย้ายข้อมูลจะนำเข้าไฟล์ JSONL เก่าเพียงครั้งเดียว บันทึกจำนวน/แฮชไว้ใน
migration_runs และลบไฟล์ที่นำเข้าแล้วหลังการตรวจสอบความสมบูรณ์
ระยะที่ 5: สำรองข้อมูล กู้คืน Vacuum และตรวจสอบ
ข้อมูลสำรองยังคงเป็นไฟล์เก็บถาวรหนึ่งไฟล์:
- สร้างเช็กพอยต์ให้ฐานข้อมูลส่วนกลางและฐานข้อมูลเอเจนต์ทุกชุด
- สร้างสแนปช็อตของแต่ละฐานข้อมูลด้วยความหมายการสำรองข้อมูลของ SQLite หรือ
VACUUM INTO - เก็บสแนปช็อตฐานข้อมูลแบบกะทัดรัด การกำหนดค่า ข้อมูลประจำตัวภายนอก และการส่งออก พื้นที่ทำงานที่ร้องขอไว้ในไฟล์เก็บถาวร
- ไม่รวมไฟล์สดดิบ
*.sqlite-walและ*.sqlite-shm - ตรวจสอบโดยเปิดสแนปช็อตฐานข้อมูลทุกชุดและเรียกใช้
PRAGMA integrity_checkopenclaw backup createจะตรวจสอบไฟล์เก็บถาวรนี้โดยค่าเริ่มต้น--no-verifyจะข้ามเฉพาะขั้นตอนตรวจสอบไฟล์เก็บถาวรหลังการเขียน ไม่ใช่การตรวจสอบ ความสมบูรณ์ของการสร้างสแนปช็อต - การกู้คืนจะคัดลอกสแนปช็อตกลับไปยังพาธเป้าหมาย ฐานข้อมูลส่วนกลางที่กู้คืนใช้
เวอร์ชัน
1; ฐานข้อมูลแยกตามเอเจนต์ที่กู้คืนใช้เวอร์ชัน2โดยสแนปช็อตเวอร์ชัน1จะได้รับการอัปเกรดแบบอะตอมเมื่อเปิด
ระยะที่ 6: รันไทม์เวิร์กเกอร์
คงโหมดเวิร์กเกอร์ไว้เป็นฟีเจอร์ทดลองระหว่างการนำการแยกฐานข้อมูลมาใช้:
- เวิร์กเกอร์จะได้รับรหัสเอเจนต์ รหัสการรัน โหมดระบบไฟล์ และข้อมูลประจำตัวรีจิสทรีฐานข้อมูล
- เวิร์กเกอร์แต่ละตัวเปิดการเชื่อมต่อ SQLite ของตนเอง
- แม่ยังคงมีอำนาจในการส่งผ่านช่องทาง การอนุมัติ การกำหนดค่า และการยกเลิก
- เริ่มจากเวิร์กเกอร์หนึ่งตัวต่อการรันที่ใช้งานอยู่ เพิ่มพูลหลังจากความเป็นเจ้าของ วงจรชีวิตและการเชื่อมต่อฐานข้อมูลมีเสถียรภาพแล้วเท่านั้น
ระยะที่ 7: ลบโลกแบบเก่า
ดำเนินการแล้วสำหรับการจัดการเซสชันของรันไทม์ โลกแบบเก่าอนุญาตให้ใช้ได้เฉพาะเป็น อินพุตของ doctor หรือเอาต์พุตการสนับสนุน/ส่งออกที่ระบุชัดเจน:
- ไม่มีการเขียน
sessions.jsonของรันไทม์, JSONL ของทรานสคริปต์, JSON ของรีจิสทรีแซนด์บ็อกซ์, SQLite แบบ sidecar ของงาน หรือ SQLite แบบ sidecar ของสถานะ Plugin - ไม่มีการตัดแต่งไฟล์ JSON/เซสชัน การตัดทอนไฟล์ทรานสคริปต์ ล็อกไฟล์เซสชัน หรือการทดสอบเซสชันที่มีรูปแบบเป็นล็อก
- ไม่มีการส่งออกเพื่อความเข้ากันได้ของรันไทม์ที่มีจุดประสงค์เพื่อทำให้ไฟล์เซสชันเก่า เป็นปัจจุบันอยู่เสมอ
- การส่งออกข้อมูลสนับสนุนที่ระบุชัดเจนยังคงเป็นรูปแบบไฟล์เก็บถาวร/การทำให้เป็นรูปธรรม ที่ผู้ใช้ร้องขอ และต้องไม่ส่งชื่อไฟล์กลับเข้าไปในข้อมูลประจำตัวของรันไทม์
การสำรองและกู้คืน
ข้อมูลสำรองควรเป็นไฟล์เก็บถาวรหนึ่งไฟล์ แต่การบันทึกฐานข้อมูลควรใช้ กลไกของ SQLite โดยตรง:
- หยุดกิจกรรมการเขียนที่ใช้เวลานาน หรือเข้าสู่แนวกั้นการสำรองข้อมูลช่วงสั้นๆ
- เรียกใช้เช็กพอยต์สำหรับฐานข้อมูลส่วนกลางและฐานข้อมูลเอเจนต์ทุกชุด
- สร้างสแนปช็อตฐานข้อมูลด้วย
VACUUM INTOลงในไดเรกทอรีสำรองข้อมูลชั่วคราว สคีมา Plugin ที่ต้องใช้ความสามารถ SQLite ซึ่งเจ้าของกำหนดจะปฏิเสธการทำงานโดยค่าเริ่มต้น จนกว่าเจ้าของจะจัดทำสัญญาสแนปช็อตที่ปลอดภัย - เก็บสแนปช็อตฐานข้อมูล ไฟล์การกำหนดค่า ไดเรกทอรีข้อมูลประจำตัว พื้นที่ทำงาน ที่เลือก และไฟล์รายการไว้ในไฟล์เก็บถาวร
- ตรวจสอบรูปแบบไฟล์ของสแนปช็อต SQLite ทุกชุด จากนั้นเปิดฐานข้อมูล OpenClaw
มาตรฐานและเรียกใช้
PRAGMA integrity_checkพร้อมการตรวจสอบบทบาท สคีมา Plugin แบบเฉพาะยังคงเป็นแบบทึบ เว้นแต่เจ้าของจะจัดเตรียมตัวตรวจสอบopenclaw backup createจะดำเนินการนี้โดยค่าเริ่มต้น ส่วน--no-verifyใช้เฉพาะ เมื่อตั้งใจข้ามขั้นตอนตรวจสอบไฟล์เก็บถาวรหลังการเขียน
อย่าใช้สำเนาไฟล์สดดิบ *.sqlite, *.sqlite-wal และ *.sqlite-shm
เป็นรูปแบบสำรองข้อมูลหลัก ไฟล์รายการของไฟล์เก็บถาวรควรบันทึกบทบาทฐานข้อมูล
รหัสเอเจนต์ เวอร์ชันสคีมา พาธต้นทาง พาธสแนปช็อต ขนาดเป็นไบต์ และสถานะ
ความสมบูรณ์
การกู้คืนควรสร้างไฟล์ฐานข้อมูลส่วนกลางและฐานข้อมูลเอเจนต์ขึ้นใหม่จาก
สแนปช็อตในไฟล์เก็บถาวร สคีมาส่วนกลางยังคงเป็นเวอร์ชัน 1; สแนปช็อตแยกตามเอเจนต์เวอร์ชัน 1
จะได้รับการอัปเกรดรันไทม์แบบจำกัดขอบเขตเป็นเวอร์ชัน 2 Doctor ยังคงเป็น
เจ้าของเพียงรายเดียวของการนำเข้าจากไฟล์สู่ฐานข้อมูล คำสั่งกู้คืนจะตรวจสอบ
ไฟล์เก็บถาวรก่อน จากนั้นแทนที่แอสเซ็ตแต่ละรายการในไฟล์รายการด้วยเพย์โหลด
ที่แตกไฟล์และผ่านการตรวจสอบแล้ว
แผนปรับโครงสร้างรันไทม์
-
เพิ่ม API รีจิสทรีฐานข้อมูล
- แก้ไขพาธฐานข้อมูลส่วนกลางและฐานข้อมูลแยกตามเอเจนต์
- คงสคีมาส่วนกลางไว้ที่
user_version = 1ฐานข้อมูลแยกตามเอเจนต์ใช้เวอร์ชัน2พร้อมการย้ายข้อมูลแบบอะตอมหนึ่งครั้งจากรูปแบบแหล่งข้อมูลหน่วยความจำเวอร์ชัน1ที่เผยแพร่แล้ว - เพิ่มตัวช่วยปิด/เช็กพอยต์/ตรวจสอบความสมบูรณ์ที่ใช้โดยการทดสอบ การสำรองข้อมูล และ doctor
-
รวมที่เก็บ SQLite แบบ sidecar
- ย้ายตารางสถานะ Plugin ไปยังฐานข้อมูลส่วนกลาง ดำเนินการแล้วสำหรับการเขียนของรันไทม์ ตัวนำเข้า sidecar แบบเดิมที่ยังไม่เผยแพร่ถูกลบแล้ว
- ย้ายตารางรีจิสทรีงานไปยังฐานข้อมูลส่วนกลาง ดำเนินการแล้วสำหรับการเขียนของรันไทม์ ตัวนำเข้า sidecar แบบเดิมที่ยังไม่เผยแพร่ถูกลบแล้ว
- ย้ายตาราง Task Flow ไปยังฐานข้อมูลส่วนกลาง ดำเนินการแล้วสำหรับการเขียนของรันไทม์ ตัวนำเข้า sidecar แบบเดิมที่ยังไม่เผยแพร่ถูกลบแล้ว
- ย้ายตารางค้นหาหน่วยความจำในตัวไปยังฐานข้อมูลเอเจนต์แต่ละชุด ดำเนินการแล้ว; ตอนนี้ doctor
จะนำ
memorySearch.store.pathแบบกำหนดเองที่ระบุชัดเจนออกผ่านการย้ายข้อมูลการกำหนดค่า การทำดัชนีใหม่ทั้งหมดทำงานกับตารางหน่วยความจำโดยตรงเท่านั้น พาธสลับไฟล์ทั้งชุด แบบเก่าและตัวช่วยสลับดัชนี sidecar ถูกลบแล้ว - ลบตัวเปิดฐานข้อมูล การตั้งค่า WAL ตัวช่วยด้านสิทธิ์ และ พาธการปิดที่ซ้ำกันออกจากระบบย่อยเหล่านั้น
-
ย้ายตารางที่เอเจนต์เป็นเจ้าของไปยังฐานข้อมูลแยกตามเอเจนต์
- สร้างฐานข้อมูลเอเจนต์ตามความต้องการผ่านรีจิสทรีฐานข้อมูลส่วนกลาง ดำเนินการแล้ว
- ย้ายรายการเซสชันรันไทม์ เหตุการณ์ทรานสคริปต์ แถว VFS และอาร์ติแฟกต์เครื่องมือ ไปยังฐานข้อมูลเอเจนต์ ดำเนินการแล้ว
- อย่าย้ายรายการเซสชัน เหตุการณ์ทรานสคริปต์ แถว VFS หรืออาร์ติแฟกต์เครื่องมือ ในฐานข้อมูลร่วมเฉพาะกิ่ง เพราะเลย์เอาต์นั้นไม่เคยเผยแพร่ ให้คงไว้เฉพาะ การนำเข้าจากไฟล์สู่ฐานข้อมูลแบบเดิมใน doctor
-
แทนที่ API ของที่เก็บเซสชัน
- นำ
storePathออกจากการเป็นข้อมูลประจำตัวรันไทม์ ดำเนินการแล้วสำหรับรันไทม์และมีcheck:database-first-legacy-storesป้องกันไว้: ข้อมูลเมตาเซสชัน การอัปเดตเส้นทาง การคงคำสั่ง การล้างเซสชันของ CLI ตัวอย่างการให้เหตุผลของ Feishu การคงสถานะทรานสคริปต์ ความลึกของเอเจนต์ย่อย การเขียนทับเซสชันของโปรไฟล์ การยืนยันตัวตน ตรรกะการแยกกิ่งจากแม่ และการตรวจสอบ QA-lab ขณะนี้แก้ไข ฐานข้อมูลจากคีย์เอเจนต์/เซสชันมาตรฐาน การตอบกลับรายการเซสชันของ Gateway/TUI/UI/macOS แสดงdatabasePathแทนpathแบบเดิมแล้ว ส่วนพื้นผิวดีบักของ macOS แสดงฐานข้อมูลแยกตามเอเจนต์ เป็นสถานะแบบอ่านอย่างเดียว แทนการเขียนการกำหนดค่าsession.store/statusการส่งออกวิถีการทำงานที่ขับเคลื่อนด้วยแชต และพร็อกซีการขึ้นต่อกันของ CLI ไม่เผยแพร่พาธที่เก็บแบบเดิมอีกต่อไป การอ่านสำรองการใช้งานทรานสคริปต์จะอ่าน SQLite ตามข้อมูลประจำตัวเอเจนต์/เซสชัน การทดสอบรันไทม์และบริดจ์ไม่แสดงstorePathอีกต่อไป อินพุต doctor/การย้ายข้อมูลเป็นเจ้าของชื่อฟิลด์แบบเดิมนั้น การโหลดเซสชันรวมของ Gateway ไม่มีกิ่งรันไทม์พิเศษสำหรับค่าsession.storeที่ไม่ได้ใช้เทมเพลตอีกต่อไป แต่จะรวมแถว SQLite แยกตามเอเจนต์ เลน doctor สำหรับล็อกเซสชันแบบเดิมและตัวช่วยล้างข้อมูล.jsonl.lockถูกนำออกแล้ว ขณะนี้ SQLite เป็นขอบเขตการทำงานพร้อมกันของเซสชัน จุดเรียกใช้รันไทม์ที่ใช้บ่อยใช้ชื่อตัวช่วยแบบแถว เช่นresolveSessionRowEntry; นามแฝงเพื่อความเข้ากันได้resolveSessionStoreEntryแบบเก่า ถูกนำออกจากการส่งออกรันไทม์และ Plugin SDK แล้ว
- นำ
- ใช้การดำเนินการแถว
{ agentId, sessionKey }ดำเนินการแล้ว:getSessionEntry,upsertSessionEntry,deleteSessionEntry,patchSessionEntryและlistSessionEntriesเป็น API ที่ใช้ SQLite ก่อน ซึ่ง ไม่ต้องใช้พาธที่เก็บเซสชัน สรุปสถานะ สถานะเอเจนต์ภายในเครื่อง สถานภาพ และคำสั่งแสดงรายการopenclaw sessionsจะอ่านแถวแยกตามเอเจนต์โดยตรง และแสดงพาธฐานข้อมูล SQLite แยกตามเอเจนต์ แทนพาธsessions.json - แทนที่การลบ/แทรกทั้งที่เก็บด้วย
upsertSessionEntry,deleteSessionEntry,listSessionEntriesและคิวรีล้างข้อมูล SQL ดำเนินการแล้วสำหรับรันไทม์: ขณะนี้พาธที่ใช้บ่อยใช้ API แถวและแพตช์แถวที่ลองใหม่ เมื่อเกิดข้อขัดแย้ง ส่วนตัวช่วยนำเข้า/แทนที่ทั้งที่เก็บที่เหลือจำกัดไว้เฉพาะ โค้ดนำเข้าการย้ายข้อมูลและการทดสอบแบ็กเอนด์ SQLite- ลบ
store-writer.tsและการทดสอบคิวตัวเขียน ดำเนินการแล้ว - ลบการตัดแต่งคีย์แบบเดิมของรันไทม์และพารามิเตอร์ลบนามแฝงออกจากการ upsert/แพตช์แถวเซสชัน ดำเนินการแล้ว
- ลบ
- ลบพฤติกรรมรีจิสทรี JSON ขณะรันไทม์
- กำหนดให้การอ่านและเขียนรีจิสทรี sandbox ใช้ SQLite เท่านั้น เสร็จแล้ว
- นำเข้า JSON แบบไฟล์เดียวและแบบแบ่งส่วนเฉพาะจากขั้นตอนการย้ายข้อมูลเท่านั้น เสร็จแล้ว
- ลบล็อกของรีจิสทรีแบบแบ่งส่วนและการเขียน JSON เสร็จแล้ว
- ใช้ตารางรีจิสทรีแบบมีชนิดเพียงตารางเดียว แทนการจัดเก็บแถวรีจิสทรีเป็น JSON ทั่วไป ที่ไม่เปิดเผยโครงสร้าง หากรูปแบบดังกล่าวยังคงเป็นสถานะการทำงานในเส้นทางประมวลผลสำคัญ เสร็จแล้ว
-
ลบการเปลี่ยนแปลงเซสชันที่มีรูปแบบคล้ายการล็อกไฟล์
- เสร็จแล้วสำหรับการสร้างล็อกขณะรันไทม์และ API ล็อกขณะรันไทม์
- ลบช่องทางการล้างข้อมูล doctor แบบดั้งเดิม
.jsonl.lockที่แยกต่างหากแล้ว - การตรวจสอบความสมบูรณ์ของสถานะไม่มีเส้นทางแยกต่างหากสำหรับตัดไฟล์ทรานสคริปต์ ที่ไม่มีเจ้าของอีกต่อไป การย้ายข้อมูลของ doctor จะนำเข้า/ลบแหล่งข้อมูล JSONL แบบดั้งเดิมในจุดเดียว
- การประสานงานอินสแตนซ์เดี่ยวของ Gateway ใช้แถว SQLite แบบมีชนิด
state_leasesภายใต้gateway_locksและไม่เปิดเผยจุดเชื่อมต่อไดเรกทอรีล็อกไฟล์อีกต่อไป - การคงสถานะการขจัดข้อมูลซ้ำของ plugin SDK ทั่วไปไม่ใช้ล็อกไฟล์หรือไฟล์ JSON อีกต่อไป แต่เขียนแถวสถานะ Plugin ลงใน SQLite ที่ใช้ร่วมกัน เสร็จแล้ว
- การประสานงาน QMD ใช้ลีส SQLite ที่ใช้ร่วมกันสำหรับการฝังข้อมูล และลีส
SQLite ต่อเอเจนต์สำหรับตัวเขียนคอลเลกชัน/การอัปเดต/การฝังข้อมูลทุกรายการ รันไทม์ไม่สร้าง
qmd/embed.lock.lockหรือagents/<agentId>/qmd-write.lock.lockอีกต่อไป Doctor จะลบเฉพาะไฟล์ข้างเคียงที่เลิกใช้แล้วและเก่าแน่นอนเท่านั้น เสร็จแล้ว
-
ทำให้เวิร์กเกอร์รับรู้ฐานข้อมูล
- เวิร์กเกอร์เปิดการเชื่อมต่อ SQLite ของตนเอง
- โพรเซสแม่เป็นเจ้าของการส่งมอบ คอลแบ็กของช่องทาง และการกำหนดค่า
- เวิร์กเกอร์รับรหัสเอเจนต์ รหัสการรัน โหมดระบบไฟล์ และข้อมูลประจำตัวรีจิสทรี DB ไม่ใช่แฮนเดิลที่กำลังใช้งาน
vfs-onlyยังคงเป็นคุณสมบัติทดลองและใช้ฐานข้อมูลเอเจนต์เป็นรากของพื้นที่จัดเก็บ- เริ่มต้นด้วยเวิร์กเกอร์หนึ่งตัวต่อการรันที่ทำงานอยู่ การทำพูลรอได้จนกว่าอายุการใช้งาน การเชื่อมต่อ DB และพฤติกรรมการยกเลิกจะไม่มีความซับซ้อน
-
การผสานรวมการสำรองข้อมูล
- ทำให้ระบบสำรองข้อมูลสามารถสร้างสแนปช็อตฐานข้อมูลส่วนกลาง ฐานข้อมูลเอเจนต์ และฐานข้อมูล Plugin
ด้วย
VACUUM INTOเสร็จแล้วสำหรับไฟล์*.sqliteที่ค้นพบภายใต้แอสเซ็ตสถานะ ส่วนสคีมา Plugin ที่ต้องใช้ความสามารถของเจ้าของซึ่งไม่มีอยู่จะหยุดทำงานแบบปิดเพื่อความปลอดภัย - เพิ่มการตรวจสอบข้อมูลสำรองสำหรับความสมบูรณ์และข้อมูลประจำตัวสคีมาของ SQLite มาตรฐาน รวมถึงการตรวจสอบรูปแบบไฟล์ทั่วไปสำหรับสแนปช็อต Plugin แบบเฉพาะ เสร็จแล้วสำหรับ การสร้างข้อมูลสำรองและการตรวจสอบอาร์ไคฟ์เริ่มต้น
- บันทึกข้อมูลเมตาของการรันสำรองข้อมูลใน SQLite เสร็จแล้วผ่านตาราง
backup_runsที่ใช้ร่วมกัน พร้อมพาธอาร์ไคฟ์ สถานะ และ JSON ของไฟล์กำกับ - เพิ่มการคืนค่าจากสแนปช็อตอาร์ไคฟ์ที่ผ่านการตรวจสอบ เสร็จแล้ว:
openclaw backup restoreตรวจสอบก่อนแตกไฟล์ ใช้ไฟล์กำกับ ที่ทำให้เป็นมาตรฐานแล้วจากตัวตรวจสอบ รองรับ--dry-runและต้องมี--yesก่อนแทนที่ พาธต้นทางที่บันทึกไว้ - รวมการส่งออก VFS/พื้นที่ทำงานเฉพาะเมื่อมีการร้องขอเท่านั้น ห้ามส่งออก ข้อมูลภายในเซสชันเป็น JSON หรือ JSONL
- ทำให้ระบบสำรองข้อมูลสามารถสร้างสแนปช็อตฐานข้อมูลส่วนกลาง ฐานข้อมูลเอเจนต์ และฐานข้อมูล Plugin
ด้วย
-
ลบการทดสอบและโค้ดที่ล้าสมัย เสร็จแล้วสำหรับพื้นผิวเซสชันรันไทม์ที่ทราบ
-
ลบการทดสอบที่ยืนยันว่ารันไทม์สร้าง
sessions.jsonหรือไฟล์ทรานสคริปต์ JSONL เสร็จแล้วสำหรับพื้นที่จัดเก็บเซสชันหลัก แชต เหตุการณ์ทรานสคริปต์ของ Gateway การแสดงตัวอย่าง วงจรชีวิต การอัปเดตรายการเซสชันของคำสั่ง การรีเซ็ต/ติดตามการตอบกลับอัตโนมัติ และ ฟิกซ์เจอร์ Dreaming ของแกนหน่วยความจำ การกำหนดเส้นทางเป้าหมายการอนุมัติ การซ่อมแซมทรานสคริปต์ เซสชัน การซ่อมแซมสิทธิ์ความปลอดภัย การส่งออกวิถี และการส่งออกเซสชัน ขณะนี้การทดสอบทรานสคริปต์ Active Memory ตรวจสอบขอบเขต SQLite และยืนยันว่าไม่มีการสร้าง ไฟล์ JSONL ชั่วคราวหรือถาวร ลบการทดสอบถดถอยแบบเก่าของ Heartbeat สำหรับการตัดทรานสคริปต์แล้ว เนื่องจาก รันไทม์ไม่ตัดทอนทรานสคริปต์ JSONL อีกต่อไป การทดสอบเครื่องมือรายการเซสชันของเอเจนต์ไม่จำลองพาธsessions.jsonแบบดั้งเดิม เป็นรูปแบบการตอบกลับของ Gateway อีกต่อไป การทดสอบแอป/UI/macOS ใช้databasePathขณะนี้การทดสอบการใช้งานทรานสคริปต์/statusเติมแถวทรานสคริปต์ SQLite โดยตรง แทนการเขียนไฟล์ JSONL ขณะนี้การทดสอบวงจรชีวิตเซสชันของ Gateway ใช้ตัวช่วยเติมข้อมูลทรานสคริปต์ SQLite โดยตรง รูปแบบฟิกซ์เจอร์ไฟล์เซสชันบรรทัดเดียวแบบเก่าถูกลบออกจากความครอบคลุม การรีเซ็ตและการลบแล้วsessions.deleteไม่ส่งคืนฟิลด์archived: []จากยุคไฟล์อีกต่อไป การลบ รายงานเฉพาะผลการเปลี่ยนแปลงแถว ตัวเลือกdeleteTranscriptแบบเก่าก็ถูกลบแล้ว: การลบเซสชันจะลบรากsessionsมาตรฐาน และปล่อยให้ SQLite ลบแถวทรานสคริปต์ สแนปช็อต และวิถีที่เซสชันเป็นเจ้าของแบบต่อเนื่อง ดังนั้นจึงไม่มีผู้เรียกใดทิ้งทรานสคริปต์ ที่ไม่มีเจ้าของไว้เบื้องหลังหรือลืมแขนงการล้างข้อมูลได้ ขณะนี้การทดสอบการบันทึกวิถีของกลไกบริบทอ่านแถวtrajectory_runtime_eventsจากฐานข้อมูลเอเจนต์ที่แยกต่างหาก แทนการอ่านsession.trajectory.jsonlขณะนี้สคริปต์เติมข้อมูลช่องทาง Docker MCP เติมแถว SQLite โดยตรง การเขียนsessions.jsonโดยตรงจำกัดไว้เฉพาะฟิกซ์เจอร์ doctor E2E ของ Tool Search Gateway อ่านหลักฐานการเรียกเครื่องมือจากแถวทรานสคริปต์ SQLite แทนการสแกนไฟล์agents/<agentId>/sessions/*.jsonlขณะนี้เหตุการณ์โฮสต์และแถวชั่วคราวของคลังเซสชันในแกนหน่วยความจำอยู่ในสถานะ Plugin ของ SQLite ที่ใช้ร่วมกัน โดยevents.jsonlและsession-corpus/*.txtเป็นเพียงอินพุต การย้ายข้อมูล doctor แบบดั้งเดิมเท่านั้น แถวที่ใช้งานอยู่ใช้พาธเสมือนmemory/session-ingestion/ไม่ใช่.dreams/session-corpusโมดูลซ่อมแซม Dreaming ของแกนหน่วยความจำแบบเก่า และการทดสอบ CLI/Gateway ของโมดูลนั้นถูกลบแล้ว เนื่องจากรันไทม์ไม่ได้เป็นเจ้าของ การซ่อมแซมอาร์ไคฟ์ไฟล์สำหรับคลังดังกล่าวอีกต่อไป การทดสอบบริดจ์/อาร์ติแฟกต์สาธารณะ ของแกนหน่วยความจำไม่แสดง.dreams/events.jsonlอีกต่อไป แต่ใช้ชื่ออาร์ติแฟกต์ JSON เสมือน ที่มี SQLite เป็นแบ็กเอนด์ ขณะนี้เอกสารการทดสอบ SDK/Codex สาธารณะระบุว่าสถานะเซสชัน SQLite แทนไฟล์เซสชัน และตัวอย่างรอบการทำงานของช่องทางไม่เปิดเผยอาร์กิวเมนต์storePathอีกต่อไป ขณะนี้สถานะการซิงค์ Matrix ใช้พื้นที่จัดเก็บสถานะ Plugin ของ SQLite โดยตรง สัญญา ไคลเอ็นต์/รันไทม์ที่ใช้งานอยู่ส่งรากพื้นที่จัดเก็บของบัญชี ไม่ใช่พาธbot-storage.jsonและ doctor จะนำเข้าbot-storage.jsonแบบดั้งเดิมลงใน SQLite ก่อนลบต้นทาง ขณะนี้สถานการณ์การรีสตาร์ต/ทำลายข้อมูล Matrix ใน QA Lab เปลี่ยนแปลงแถวการซิงค์ SQLite โดยตรง แทนการสร้างหรือลบไฟล์bot-storage.jsonปลอม และชั้นพื้นฐาน E2EE ส่งราก พื้นที่จัดเก็บการซิงค์แทนพาธsync-store.jsonปลอม การเลือกรากพื้นที่จัดเก็บ Matrix ไม่ให้คะแนนรากตามไฟล์ JSON การซิงค์/เธรดแบบดั้งเดิม อีกต่อไป แต่ใช้ข้อมูลเมตาของรากที่คงทนร่วมกับสถานะการเข้ารหัสจริง ชุดทดสอบแบ็กเอนด์เซสชัน SQLite ขณะรันไทม์ไม่สร้างsessions.jsonปลอมอีกต่อไป ขณะนี้ฟิกซ์เจอร์ต้นทางแบบดั้งเดิมอยู่ในการทดสอบ doctor ที่นำเข้าฟิกซ์เจอร์เหล่านั้น การทดสอบเซสชัน Gateway ไม่เปิดเผยตัวช่วยcreateSessionStoreDirหรือการตั้งค่าพาธ พื้นที่จัดเก็บเซสชันชั่วคราวที่ไม่ได้ใช้อีกต่อไป ไดเรกทอรีฟิกซ์เจอร์ระบุอย่างชัดเจน และการตั้งค่าแถวโดยตรงใช้การตั้งชื่อแถวเซสชัน SQLite ย้ายความครอบคลุมตัวแยกวิเคราะห์พื้นที่จัดเก็บเซสชัน JSON5 ที่ใช้เฉพาะ doctor ออกจากการทดสอบโครงสร้างพื้นฐานไปยังการทดสอบการย้ายข้อมูล doctor แล้ว ดังนั้น ชุดทดสอบรันไทม์จึงไม่เป็นเจ้าของการแยกวิเคราะห์ไฟล์เซสชันแบบดั้งเดิมอีกต่อไป การทดสอบ SSO/การอัปโหลดที่รอดำเนินการขณะรันไทม์ของ Microsoft Teams ไม่พกฟิกซ์เจอร์ หรือโปรแกรมแยกวิเคราะห์ไฟล์ JSON ข้างเคียงอีกต่อไป การแยกวิเคราะห์โทเค็น SSO แบบดั้งเดิม อยู่เฉพาะในโมดูลการย้ายข้อมูลของ Plugin การทดสอบ Telegram ไม่เติมพาธพื้นที่จัดเก็บ/tmp/*.jsonปลอมอีกต่อไป แต่รีเซ็ตแคชข้อความที่มี SQLite เป็นแบ็กเอนด์โดยตรง ตัวช่วยสถานะการทดสอบทั่วไปของ OpenClaw ไม่เปิดเผยตัวเขียนauth-profiles.jsonแบบดั้งเดิมอีกต่อไป โดยการทดสอบการย้ายข้อมูลการยืนยันตัวตนของ doctor เป็นเจ้าของ ฟิกซ์เจอร์ดังกล่าวภายใน การทดสอบรันไทม์สำหรับตัวชี้เซสชันล่าสุดของ TUI การอนุมัติการดำเนินการ สวิตช์ Active Memory การตรวจสอบการขจัดข้อมูลซ้ำ/การเริ่มต้นของ Matrix การซิงค์ต้นทาง Memory Wiki การผูกการสนทนาปัจจุบัน การยืนยันตัวตนระหว่างการเริ่มใช้งาน และการนำเข้าข้อมูลลับ Hermes ไม่สร้างไฟล์ข้างเคียงแบบเก่าหรือยืนยันว่าชื่อไฟล์เก่าไม่มีอยู่อีกต่อไป แต่พิสูจน์พฤติกรรม ผ่านแถว SQLite และ API พื้นที่จัดเก็บสาธารณะ การทดสอบ doctor/การย้ายข้อมูลเป็นเพียง ตำแหน่งเดียวที่ควรมีชื่อไฟล์ต้นทางแบบดั้งเดิม การทดสอบรันไทม์สำหรับการจับคู่อุปกรณ์/Node, allowFrom ของช่องทาง, เจตนาการรีสตาร์ต, การส่งต่อเมื่อรีสตาร์ต, รายการคิวส่งมอบเซสชัน, สถานะการกำหนดค่า, แคช iMessage, งาน Cron, ส่วนหัวทรานสคริปต์ PI, รีจิสทรีซับเอเจนต์ และไฟล์แนบรูปภาพที่มีการจัดการ ก็ไม่สร้างไฟล์ JSON/JSONL ที่เลิกใช้แล้วเพียงเพื่อพิสูจน์ว่าไฟล์เหล่านั้นถูกละเว้น หรือไม่มีอยู่อีกต่อไป การกู้คืน PI จากข้อมูลล้นไม่มีทางเลือกสำรองในการเขียนใหม่/ตัดทอนด้วย SessionManager อีกต่อไป การตัดทอนผลลัพธ์เครื่องมือและการเขียนทรานสคริปต์ใหม่ของกลไกบริบทจะเปลี่ยนแปลง แถวทรานสคริปต์ SQLite แล้วรีเฟรชสถานะพรอมต์ที่ใช้งานอยู่จากฐานข้อมูล การเพิ่มข้อความถาวรของ SessionManager มอบหมายให้ตัวช่วยเพิ่มทรานสคริปต์ SQLite แบบอะตอมจัดการการเลือกพาเรนต์และความสามารถในการทำซ้ำโดยไม่เกิดผลข้างเคียง การเพิ่มรายการเมตาดาต้า/กำหนดเองตามปกติจะเลือกพาเรนต์ปัจจุบันภายใน SQLite เช่นกัน เพื่อให้อินสแตนซ์ตัวจัดการที่ล้าสมัยไม่ทำให้การแข่งขันในเชนพาเรนต์ก่อน SQLite กลับมาอีก ขณะนี้การล้างส่วนท้าย PI สังเคราะห์สำหรับการตรวจสอบก่อนระหว่างรอบและsessions_yieldตัดสถานะทรานสคริปต์ SQLite โดยตรง บริดจ์ลบส่วนท้ายของ SessionManager แบบเก่า และการทดสอบของบริดจ์ถูกลบแล้ว การบันทึกจุดตรวจสอบ Compaction ก็สร้างสแนปช็อตจาก SQLite เท่านั้น ผู้เรียกไม่ส่ง SessionManager ที่กำลังใช้งานเป็นแหล่งทรานสคริปต์ทางเลือกอีกต่อไป -
เก็บการทดสอบที่เติมไฟล์แบบดั้งเดิมไว้เฉพาะสำหรับการย้ายข้อมูล
-
แทนที่หลักฐานจากไฟล์ JSON ด้วยหลักฐานจากแถว SQL สำหรับพื้นผิวรันไทม์ ที่ใช้งานอยู่แล้ว
-
เพิ่มข้อห้ามแบบคงที่สำหรับการเขียนขณะรันไทม์ไปยังพาธ JSON ของเซสชัน/แคชแบบดั้งเดิม เสร็จแล้วสำหรับตัวป้องกันของรีโพ
- ทำให้รายงานการย้ายข้อมูลตรวจสอบย้อนหลังได้
- บันทึกการรันการย้ายข้อมูลใน SQLite พร้อมเวลาประทับเริ่มต้น/สิ้นสุด พาธต้นทาง
แฮชต้นทาง จำนวน คำเตือน และพาธข้อมูลสำรอง
เสร็จแล้ว: ขณะนี้การดำเนินการย้ายสถานะแบบดั้งเดิมบันทึกรายงาน
migration_runsอย่างถาวร พร้อมบัญชีรายการพาธ/ตารางต้นทาง, SHA-256 ของไฟล์ต้นทาง, ขนาด, จำนวนเรคคอร์ด, คำเตือน และพาธข้อมูลสำรอง เสร็จแล้ว: การดำเนินการย้ายสถานะแบบดั้งเดิมยังบันทึกแถวmigration_sourcesอย่างถาวร เพื่อการตรวจสอบระดับต้นทางและการตัดสินใจข้าม/เติมย้อนหลังในอนาคต - ทำให้การนำไปใช้สามารถทำซ้ำได้โดยไม่เกิดผลข้างเคียง การรันซ้ำหลังจากนำเข้าเพียงบางส่วน ควรข้ามต้นทางที่นำเข้าแล้วหรือผสานตามคีย์ที่เสถียร เสร็จแล้ว: ดัชนีเซสชัน ทรานสคริปต์ คิวส่งมอบ สถานะ Plugin บัญชีแยกประเภทงาน และแถว SQLite ส่วนกลางที่เอเจนต์เป็นเจ้าของ จะนำเข้าผ่านคีย์ที่เสถียรหรือ ความหมายแบบ upsert/replace ดังนั้นการรันซ้ำจึงผสานโดยไม่สร้างแถวถาวรซ้ำ
- การนำเข้าที่ล้มเหลวต้องเก็บไฟล์ต้นทางเดิมไว้ที่ตำแหน่งเดิม
เสร็จแล้ว: ขณะนี้การนำเข้าทรานสคริปต์ที่ล้มเหลวจะคงต้นทาง JSONL เดิมไว้ที่
พาธที่ตรวจพบ และ
migration_sourcesจะบันทึกต้นทางเป็นwarningพร้อมremoved_source=0สำหรับการรัน doctor ครั้งถัดไป
- บันทึกการรันการย้ายข้อมูลใน SQLite พร้อมเวลาประทับเริ่มต้น/สิ้นสุด พาธต้นทาง
แฮชต้นทาง จำนวน คำเตือน และพาธข้อมูลสำรอง
เสร็จแล้ว: ขณะนี้การดำเนินการย้ายสถานะแบบดั้งเดิมบันทึกรายงาน
กฎด้านประสิทธิภาพ
- ใช้การเชื่อมต่อหนึ่งรายการต่อเธรด/โพรเซสได้ ห้ามใช้แฮนเดิลร่วมกันระหว่าง เวิร์กเกอร์
- ใช้ WAL,
foreign_keys=ON, ระยะหมดเวลารอเมื่อไม่ว่าง 5 วินาที และทรานแซกชันการเขียนBEGIN IMMEDIATEแบบสั้น ห้ามวางการลองล็อกซ้ำแบบซิงโครนัสซ้อนเหนือการรอเมื่อไม่ว่าง เพียงครั้งเดียวของ SQLite - ให้ตัวช่วยทรานแซกชันการเขียนทำงานแบบซิงโครนัสต่อไป เว้นแต่/จนกว่า API ทรานแซกชัน แบบอะซิงโครนัสจะเพิ่มความหมายของมิวเท็กซ์/แรงดันย้อนกลับอย่างชัดเจน
- รักษาการเขียนการส่งมอบของโพรเซสแม่ให้มีขนาดเล็กและอยู่ภายในทรานแซกชัน
- หลีกเลี่ยงการเขียนพื้นที่จัดเก็บทั้งหมดใหม่ ให้ใช้ upsert/delete ระดับแถว
- เพิ่มดัชนีสำหรับพาธการแสดงรายการตามเอเจนต์ การแสดงรายการตามเซสชัน เวลาที่อัปเดต รหัสการรัน และการหมดอายุ ก่อนย้ายโค้ดในเส้นทางประมวลผลสำคัญ
- จัดเก็บอาร์ติแฟกต์ขนาดใหญ่ สื่อ และเวกเตอร์เป็น BLOB หรือแถว BLOB แบบแบ่งส่วน ไม่ใช่ JSON แบบ base64 หรืออาร์เรย์ตัวเลข
- เก็บรายการสถานะ Plugin ที่ไม่เปิดเผยโครงสร้างให้มีขนาดเล็กและมีขอบเขตจำกัด
- เพิ่มการล้างข้อมูลด้วย SQL สำหรับ TTL/การหมดอายุแทนการตัดแต่งระบบไฟล์ เสร็จแล้วสำหรับพื้นที่จัดเก็บรันไทม์ที่ฐานข้อมูลเป็นเจ้าของ: สื่อ สถานะ Plugin, BLOB ของ Plugin, การขจัดข้อมูลซ้ำแบบถาวร และแคชเอเจนต์ ทั้งหมดหมดอายุผ่านแถว SQLite การล้างระบบไฟล์ ที่เหลือจำกัดไว้เฉพาะการสร้างไฟล์ชั่วคราวหรือคำสั่งลบที่ระบุอย่างชัดเจน
ข้อห้ามแบบคงที่
เพิ่มการตรวจสอบรีโพที่ล้มเหลวเมื่อมีการเขียนขณะรันไทม์ใหม่ไปยังพาธสถานะแบบดั้งเดิม:
sessions.json*.trajectory.jsonlยกเว้นเอาต์พุตชุดข้อมูลสนับสนุนที่สร้างขึ้นจริง.acp-stream.jsonlacp/event-ledger.jsoncache/*.jsonไฟล์แคชรันไทม์agents/<agentId>/agent/auth.jsonagents/<agentId>/agent/models.jsoncredentials/oauth.jsongithub-copilot.token.jsonopenrouter-models.jsonauth-profiles.jsonauth-state.jsonexec-approvals.jsonopenclaw-workspace-state.jsonworkspace-state.jsonworkspace-attestations/*.attested- รายการระดับเดียวกัน
<workspace>.attested - Matrix
credentials*.jsonและrecovery-key.json cron/runs/*.jsonlcron/jobs.jsonjobs-state.jsondevice-pair-notify.jsondevices/pending.json/devices/paired.json/devices/bootstrap.json(เลิกใช้เมื่อ 2026.7: ที่เก็บรันไทม์คือdevice_pairing_*/device_bootstrap_tokensในฐานข้อมูลสถานะที่ใช้ร่วมกัน; ระเบียนที่จับคู่จะถูกนำเข้าเมื่อ Gateway เริ่มทำงาน ส่วนแถว pending/bootstrap ชั่วคราวจะถูกทิ้ง)nodes/pending.json/nodes/paired.json(เลิกใช้เมื่อ 2026.7: รวมไว้ในระเบียนอุปกรณ์ที่จับคู่เมื่อ Gateway เริ่มทำงาน)identity/device.jsonidentity/device-auth.jsonpush/web-push-subscriptions.json(เลิกใช้แล้ว; นำเข้าเฉพาะผ่าน Doctor ไปยังweb_push_subscriptions)push/vapid-keys.json(เลิกใช้แล้ว; นำเข้าเฉพาะผ่าน Doctor ไปยังweb_push_vapid_keys)push/apns-registrations.json(เลิกใช้แล้ว; นำเข้าเฉพาะผ่าน Doctor ไปยังapns_registrations)process-leases.jsongateway-instance-idsession-toggles.json- Memory-core
.dreams/events.jsonl - Memory-core
.dreams/session-corpus/ - Memory-core
.dreams/daily-ingestion.json - Memory-core
.dreams/session-ingestion.json - Memory-core
.dreams/short-term-recall.json - Memory-core
.dreams/phase-signals.json - Memory-core
.dreams/short-term-promotion.lock - Skill Workshop
skill-workshop/<workspace>.json - Skill Workshop
skill-workshop/skill-workshop-review-*.json - Nostr
bus-state-*.json - Nostr
profile-state-*.json calls.jsonlknown-users.jsonref-index.jsonl- QQBot
session-*.json - BlueBubbles
bluebubbles/catchup/*.json - BlueBubbles
bluebubbles/inbound-dedupe/*.json - Telegram
update-offset-*.json - Telegram
sticker-cache.json - Telegram
*.telegram-messages.json - Telegram
*.telegram-sent-messages.json - Telegram
*.telegram-topic-names.json - Telegram
thread-bindings-*.json - iMessage
catchup/*.json - iMessage
reply-cache.jsonl - iMessage
sent-echoes.jsonl - Microsoft Teams
msteams-conversations.json - Microsoft Teams
msteams-polls.json - Microsoft Teams
msteams-sso-tokens.json - Microsoft Teams
*.learnings.json - Matrix
bot-storage.json - Matrix
sync-store.json - Matrix
thread-bindings.json - Matrix
inbound-dedupe.json - Matrix
startup-verification.json - Matrix
storage-meta.json - Matrix
crypto-idb-snapshot.json - Discord
model-picker-preferences.json - Discord
command-deploy-cache.json - ไฟล์ JSON ของชาร์ดรีจิสทรีแซนด์บ็อกซ์
plugin-state/state.sqlite- ไฟล์ประกอบรันไทม์
openclaw-state.sqliteแบบเฉพาะกิจ tasks/runs.sqlitetasks/flows/registry.sqlitebindings/current-conversations.jsonrestart-sentinel.jsongateway-restart-intent.jsongateway-supervisor-restart-handoff.jsongateway.<hash>.lockqmd/embed.lock.lockagents/<agentId>/qmd-write.lock.lockcommands.logconfig-health.jsonport-guard.jsonsettings/voicewake.jsonsettings/voicewake-routing.jsonplugin-binding-approvals.jsonplugins/installs.jsonaudit/file-transfer.jsonlaudit/crestodian.jsonlcrestodian/rescue-pending/*.jsonopenclaw/rescue-pending/*.jsonplugins/phone-control/armed.json- Memory Wiki
.openclaw-wiki/log.jsonl - Memory Wiki
.openclaw-wiki/state.json - Memory Wiki
.openclaw-wiki/locks/ - Memory Wiki
.openclaw-wiki/source-sync.json - Memory Wiki
.openclaw-wiki/import-runs/*.json - Memory Wiki
.openclaw-wiki/cache/agent-digest.json - Memory Wiki
.openclaw-wiki/cache/claims.jsonl - ClawHub
.clawhub/lock.json - ClawHub
.clawhub/origin.json - การตกแต่งโปรไฟล์เบราว์เซอร์
.openclaw-profile-decorated SessionManager.open(...)ตัวเปิดเซสชันที่ใช้ไฟล์เป็นแหล่งจัดเก็บSessionManager.listAll(...)และTranscriptSessionManager.listAll(...)ฟาซาดสำหรับแสดงรายการบทถอดเสียงSessionManager.forkFromSession(...)และTranscriptSessionManager.forkFromSession(...)ฟาซาดสำหรับแยกแขนงบทถอดเสียงSessionManager.newSession(...)และTranscriptSessionManager.newSession(...)ฟาซาดสำหรับแทนที่เซสชันแบบแก้ไขได้SessionManager.createBranchedSession(...)และTranscriptSessionManager.createBranchedSession(...)ฟาซาดสำหรับเซสชันแขนง
ข้อห้ามควรอนุญาตให้การทดสอบสร้างฟิกซ์เจอร์แบบเดิม และอนุญาตให้โค้ดการย้ายข้อมูล อ่าน/นำเข้า/ลบแหล่งไฟล์แบบเดิมได้ ส่วนไฟล์ประกอบ SQLite ที่ยังไม่เคยเผยแพร่ยังคงถูกห้าม และไม่ได้รับข้อยกเว้นให้ Doctor นำเข้า
เกณฑ์การเสร็จสมบูรณ์
- การเขียนข้อมูลรันไทม์และแคชส่งไปยังฐานข้อมูล SQLite ส่วนกลางหรือของเอเจนต์
- รันไทม์ไม่เขียนดัชนีเซสชัน, JSONL ของบทถอดเสียง, JSON ของรีจิสทรี แซนด์บ็อกซ์, SQLite ไฟล์ประกอบของงาน หรือ SQLite ไฟล์ประกอบของสถานะ Plugin อีกต่อไป ตัวนำเข้า SQLite ไฟล์ประกอบ ของงานและสถานะ Plugin ที่ยังไม่เคยเผยแพร่จะถูกลบ
- การนำเข้าไฟล์แบบเดิมทำได้ผ่าน Doctor เท่านั้น
- การสำรองข้อมูลสร้างไฟล์เก็บถาวรหนึ่งไฟล์ที่มีสแนปช็อต SQLite แบบกระชับและหลักฐานยืนยันความสมบูรณ์
- เวิร์กเกอร์เอเจนต์สามารถทำงานโดยใช้ดิสก์, พื้นที่ชั่วคราว VFS หรือพื้นที่จัดเก็บ แบบทดลองที่ใช้ VFS เท่านั้น
- ไฟล์การกำหนดค่าและไฟล์ข้อมูลรับรองที่ระบุอย่างชัดเจนยังคงเป็นไฟล์ควบคุมถาวร ที่ไม่ใช่ฐานข้อมูลเพียงประเภทเดียวที่คาดว่าจะมี
- การตรวจสอบรีโปป้องกันไม่ให้นำที่เก็บไฟล์รันไทม์แบบเดิมกลับมาอีก