Get started
डेटाबेस-प्रथम स्थिति रिफैक्टर
डेटाबेस-प्रथम स्टेट रिफैक्टर
निर्णय
दो-स्तरीय SQLite लेआउट का उपयोग करें:
- वैश्विक डेटाबेस:
~/.openclaw/state/openclaw.sqlite - एजेंट डेटाबेस: एजेंट-स्वामित्व वाले वर्कस्पेस, ट्रांसक्रिप्ट, VFS, आर्टिफैक्ट, और बड़े प्रति-एजेंट रनटाइम स्टेट के लिए प्रति एजेंट एक SQLite डेटाबेस
- कॉन्फ़िगरेशन फ़ाइल-समर्थित रहता है:
openclaw.jsonडेटाबेस से बाहर रहता है। रनटाइम auth प्रोफ़ाइल SQLite में जाती हैं; बाहरी प्रदाता या CLI क्रेडेंशियल फ़ाइलें OpenClaw के डेटाबेस से बाहर, स्वामी-प्रबंधित रहती हैं।
वैश्विक डेटाबेस नियंत्रण-प्लेन डेटाबेस है। यह एजेंट डिस्कवरी, साझा Gateway स्टेट, पेयरिंग, डिवाइस/नोड स्टेट, टास्क और फ्लो लेजर, Plugin स्टेट, शेड्यूलर रनटाइम स्टेट, बैकअप मेटाडेटा, और माइग्रेशन स्टेट का स्वामी है।
एजेंट डेटाबेस डेटा-प्लेन डेटाबेस है। यह एजेंट के सत्र मेटाडेटा, ट्रांसक्रिप्ट इवेंट स्ट्रीम, VFS वर्कस्पेस या स्क्रैच नेमस्पेस, टूल आर्टिफैक्ट, रन आर्टिफैक्ट, और खोजने/इंडेक्स करने योग्य एजेंट-स्थानीय कैश डेटा का स्वामी है।
इससे एक टिकाऊ वैश्विक दृश्य मिलता है, बिना बड़े एजेंट वर्कस्पेस, ट्रांसक्रिप्ट, और बाइनरी स्क्रैच डेटा को साझा Gateway राइट लेन में धकेले।
कठोर अनुबंध
इस माइग्रेशन का एक ही कैननिकल रनटाइम आकार है:
- सत्र पंक्तियां केवल सत्र मेटाडेटा को स्थायी रखें। उन्हें
transcriptLocator, ट्रांसक्रिप्ट फ़ाइल पाथ, sibling JSONL पाथ, लॉक पाथ, pruning मेटाडेटा, या फ़ाइल-युग संगतता पॉइंटर स्थायी नहीं रखने चाहिए। - ट्रांसक्रिप्ट पहचान हमेशा SQLite पहचान है:
{agentId, sessionId}और जहां प्रोटोकॉल को आवश्यकता हो वहां वैकल्पिक topic मेटाडेटा। sqlite-transcript://...रनटाइम या प्रोटोकॉल पहचान नहीं है। नए कोड को ट्रांसक्रिप्ट लोकेटर derive, persist, pass, parse, या migrate नहीं करने चाहिए। रनटाइम और टेस्ट में pseudo-locator बिल्कुल नहीं होने चाहिए; docs इस स्ट्रिंग का उल्लेख केवल इसे प्रतिबंधित करने के लिए कर सकते हैं।- Legacy
sessions.json, ट्रांसक्रिप्ट JSONL,.jsonl.lock, pruning, truncation, और पुराना session-path लॉजिक केवल doctor migration/import पाथ में ही आते हैं। - Legacy session config aliases केवल doctor migration में आते हैं। रनटाइम
session.idleMinutes,session.resetByType.dm, या किसी दूसरे configured agent के लिए cross-agentagent:main:*main-session aliases की व्याख्या नहीं करता। - Session routing identity typed relational state है। Hot runtime और UI paths को
sessions.session_scope,sessions.account_id,sessions.primary_conversation_id,conversations, औरsession_conversationsपढ़ने चाहिए; उन्हें provider identity के लिएsession_keyparse नहीं करना चाहिए याsession_entries.entry_jsonmine नहीं करना चाहिए, सिवाय compatibility shadow के जब पुराने call sites हटाए जा रहे हों। - Channel-level direct-message markers जैसे
dmबनामdirectrouting vocabulary हैं, transcript locators या file-store compatibility handles नहीं। - Legacy hook handler config केवल doctor warning/migration surfaces में आता है।
रनटाइम को
hooks.internal.handlersलोड नहीं करना चाहिए; hooks केवल discovered hook directories औरHOOK.mdmetadata के जरिए चलते हैं। - Runtime startup, hot reply paths, compaction, reset, recovery, diagnostics,
TTS, memory hooks, subagents, Plugin command routing, protocol boundaries, और
hooks को रनटाइम में
{agentId, sessionId}pass करना होगा। - टेस्ट को
{agentId, sessionId}के जरिए SQLite transcript rows seed और assert करनी चाहिए। जो टेस्ट केवल JSONL path forwarding, caller-supplied locator preservation, या transcript-file compatibility साबित करते हैं, उन्हें हटाया जाना चाहिए, जब तक वे doctor import, non-session support/debug materialization, या protocol shape को cover न करते हों। runEmbeddedPiAgent(...), prepared worker runs, और inner embedded attempt को transcript locators स्वीकार नहीं करने चाहिए। वे{agentId, sessionId}से SQLite transcript manager खोलते हैं और उस manager को internalized PI-compatible agent session को pass करते हैं, ताकि stale callers runner से JSON/JSONL transcripts न लिखवा सकें।- Runner diagnostics को runtime/cache/payload trace records SQLite में store करने चाहिए। Runtime diagnostics को JSONL file override knobs या generic transcript JSONL export helpers expose नहीं करने चाहिए; user-facing exports database rows से explicit artifacts materialize कर सकते हैं, बिना file names को runtime में वापस feed किए।
- Raw stream logging
OPENCLAW_RAW_STREAM=1और SQLite diagnostics rows का उपयोग करती है। पुराना pi-monoPI_RAW_STREAM,PI_RAW_STREAM_PATH, औरraw-openai-completions.jsonlfile logger contract OpenClaw runtime या tests का हिस्सा नहीं है। - QMD memory indexing को SQLite transcripts को markdown files में export नहीं करना चाहिए। QMD केवल configured memory files को index करता है; session transcript search SQLite-backed रहती है।
- नए code के लिए QMD SDK subpath केवल QMD-only है। SQLite session transcript
indexing helpers
memory-core-host-engine-session-transcriptsपर रहते हैं; कोई भी QMD re-export केवल compatibility है और runtime code द्वारा उपयोग नहीं किया जाना चाहिए। - Built-in memory indexes owning agent database में रहते हैं। Runtime config और
resolved runtime contracts को
memorySearch.store.pathexpose नहीं करना चाहिए; doctor उस legacy config key को delete करता है और current code agentdatabasePathको internally pass करता है।
Implementation work को code delete करते रहना चाहिए जब तक ये statements doctor/import/export/debug boundaries के बाहर बिना exceptions true न हो जाएं।
लक्ष्य स्थिति और प्रगति
कठोर लक्ष्य
- एक global SQLite database control-plane state का स्वामी है:
state/openclaw.sqlite. - एक per-agent SQLite database data-plane state का स्वामी है:
agents/<agentId>/agent/openclaw-agent.sqlite. - Config file-backed रहता है।
openclaw.jsonइस database refactor का हिस्सा नहीं है। - Legacy files केवल doctor migration inputs हैं।
- Runtime active state के रूप में session या transcript JSONL कभी write या read नहीं करता।
लक्ष्य स्थितियां
not-started: file-era runtime code अभी भी active state लिखता है।migrating: doctor/import code file data को SQLite में move कर सकता है।dual-read: temporary bridge SQLite और legacy files दोनों पढ़ता है। इस refactor के लिए यह state forbidden है, जब तक इसे explicitly doctor-only के रूप में documented न किया गया हो।sqlite-runtime: runtime केवल SQLite पढ़ता और लिखता है।clean: legacy runtime APIs और tests हटाए गए हैं, और guard regressions रोकता है।done: docs, tests, backup, doctor migration, और changed checks clean state साबित करते हैं।
वर्तमान स्थिति
- Sessions: runtime के लिए
clean। Session rows per-agent database में रहती हैं, runtime APIs{agentId, sessionId}या{agentId, sessionKey}का उपयोग करते हैं, औरsessions.jsonकेवल doctor-only legacy input है। - Transcripts: runtime के लिए
clean। Transcript events, identities, snapshots, और trajectory runtime events per-agent database में रहते हैं। Runtime अब transcript locators या JSONL transcript paths स्वीकार नहीं करता। - PI embedded runner:
clean। Embedded PI runs, prepared workers, compaction, और retry loops SQLite session scope का उपयोग करते हैं और stale transcript handles reject करते हैं। - Cron: runtime के लिए
clean। Runtimecron_jobsऔरcron_run_logsका उपयोग करता है; runtime tests SQLitestoreKeynaming का उपयोग करते हैं, और file-era cron paths केवल doctor legacy migration tests में रहते हैं। - Task registry:
clean। Task और Task Flow runtime rowsstate/openclaw.sqliteमें रहते हैं; unshipped sidecar SQLite importers delete कर दिए गए हैं। - Plugin state:
clean। Plugin state/blob rows shared global database में रहते हैं; पुराने plugin-state sidecar SQLite helpers guard किए गए हैं। - Memory: built-in memory और session transcript indexing के लिए
sqlite-runtime। Memory index tables per-agent database में रहते हैं, plugin memory state shared plugin-state rows का उपयोग करता है, और legacy memory files doctor migration inputs या user workspace content हैं। - Backup:
sqlite-runtime। Backup stages SQLite snapshots compact करते हैं, live WAL/SHM sidecars omit करते हैं, SQLite integrity verify करते हैं, और backup runs को global database में record करते हैं। - Doctor migration:
migrating, जानबूझकर। Doctor legacy JSON, JSONL, और retired sidecar stores को SQLite में import करता है, migration runs/sources record करता है, और successful sources remove करता है। - E2E scripts: runtime coverage के लिए
clean। Docker MCP seeding SQLite rows लिखती है। runtime-context Docker script legacy JSONL केवल doctor migration seed के अंदर create करती है और legacy session index path को explicitly name करती है।
शेष कार्य
- [x] Cron runtime-test store variables को
storePathसे दूर rename करें, जब तक वे doctor legacy inputs न हों। Files: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. Proof:pnpm check:database-first-legacy-stores;rg -n 'storePath' src/cron --glob '!**/commands/doctor/**'. - [x] अप्रचलित file-era export test mocks हटाएं या rename करें।
File:
src/auto-reply/reply/commands-export-test-mocks.ts. Proof:rg -n 'resolveSessionFilePath|sessionFile|storePath|transcriptLocator' src/auto-reply/reply. - [x] Docker runtime-context legacy JSONL seed को स्पष्ट रूप से doctor-only बनाएं।
File:
scripts/e2e/session-runtime-context-docker-client.ts. Proof:rg -n 'sessions\\.json|sessionFile|\\.jsonl' scripts/e2e/session-runtime-context-docker-client.tsकेवलseedBrokenLegacySessionForDoctorMigrationदिखाता है। - [x] किसी भी schema change के बाद Kysely generated types को aligned रखें।
Files:
src/state/openclaw-state-schema.sql,src/state/openclaw-agent-schema.sql,src/state/*generated*. Proof: इस pass में कोई schema change नहीं;pnpm db:kysely:check;pnpm lint:kysely. - [x] touched stores, commands, और scripts के लिए focused tests फिर से run करें।
Proof:
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-trajectory.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घोषित करने से पहले, changed gate या remote broad proof run करें। Proof:pnpm check:changed --timed -- <changed extension paths>passed on Hetzner Crabbox runrun_3f1cabf6b25cafter temporary Node 24/pnpm setup and explicit path routing for the synced no-.gitworkspace.
Regression न करें
- कोई transcript locators नहीं।
- कोई active session files नहीं।
- doctor legacy migration tests को छोड़कर कोई fake JSONL test fixtures नहीं।
- जहां Kysely expected है वहां कोई raw SQLite access नहीं।
- कोई नए legacy DB migrations नहीं। यह layout shipped नहीं हुआ है; schema version
1पर रखें जब तक कोई strong reason न हो।
कोड-पठन अनुमानों
कोई follow-up product decisions इस plan को block नहीं कर रहे। Implementation को इन assumptions के साथ आगे बढ़ना चाहिए:
- इस स्टोरेज पथ के लिए सीधे
node:sqliteका उपयोग करें और Node 22+ runtime आवश्यक रखें। - ठीक एक सामान्य कॉन्फ़िगरेशन फ़ाइल रखें। इस refactor में config, plugin manifests, या Git workspaces को SQLite में न ले जाएँ।
- Runtime compatibility फ़ाइलों की आवश्यकता नहीं है। Legacy JSON और JSONL फ़ाइलें केवल migration inputs हैं। Branch-local SQLite sidecars कभी shipped नहीं हुए और import करने के बजाय delete किए जाते हैं।
openclaw doctor --fixlegacy file-to-database migration step का स्वामी है। Runtime startup औरopenclaw migrateको legacy OpenClaw database-upgrade paths नहीं रखने चाहिए।- Credential compatibility भी इसी नियम का पालन करती है: runtime credentials
SQLite में रहते हैं। पुराने
auth-profiles.json, per-agentauth.json, और sharedcredentials/oauth.jsonफ़ाइलें doctor migration inputs हैं, फिर import के बाद हटा दी जाती हैं। - Generated model catalog state database-backed है। Runtime code को
agents/<agentId>/agent/models.jsonनहीं लिखना चाहिए; मौजूदाmodels.jsonफ़ाइलें legacy doctor inputs हैं औरagent_model_catalogsमें import के बाद हटा दी जाती हैं। - Runtime को transcript locators migrate, normalize, या bridge नहीं करने चाहिए। Active
transcript identity SQLite में
{agentId, sessionId}है। File paths केवल legacy doctor inputs हैं, औरsqlite-transcript://...को boundary handle की तरह treat करने के बजाय runtime, protocol, hook, और plugin surfaces से हट जाना चाहिए। - Runtime SQLite transcript reads पुरानी JSONL entry-shape migrations नहीं चलाते या compatibility के लिए whole transcripts rewrite नहीं करते। Legacy entry normalization explicit doctor/import utilities में रहती है। Doctor legacy JSONL transcript फ़ाइलों को SQLite rows insert करने से पहले normalize करता है; current runtime rows पहले से current transcript schema में लिखी जाती हैं। Trajectory/session export उन rows को as-is पढ़ता है और export-time legacy migrations नहीं करनी चाहिए।
- Legacy transcript JSONL parse/migration helpers केवल doctor-only हैं। Runtime transcript format code केवल current SQLite transcript context बनाता है; doctor rows insert करने से पहले old JSONL entry upgrades का स्वामी है।
- पुराना runtime-owned JSONL transcript streaming helper delete कर दिया गया था। Doctor import code explicit legacy file reads का स्वामी है; runtime session history SQLite rows पढ़ती है।
- Codex app-server bindings Codex plugin-state namespace में OpenClaw
sessionIdको canonical key के रूप में उपयोग करते हैं।sessionKeyrouting/display के लिए metadata है और durable session id को replace नहीं करना चाहिए या transcript-file identity को resurrect नहीं करना चाहिए। - Context engines को current runtime contract सीधे मिलता है। Registry को
ऐसे retry shims से engines wrap नहीं करने चाहिए जो
sessionKey,transcriptScope, याpromptdelete करते हैं; जो engines current database-first params accept नहीं कर सकते, उन्हें bridge किए जाने के बजाय loudly fail करना चाहिए। - Backup output एक archive file ही रहना चाहिए। Database contents उस archive में compact SQLite snapshots के रूप में जाने चाहिए, raw live WAL sidecars के रूप में नहीं।
- Transcript search उपयोगी है लेकिन पहले database-first cut के लिए आवश्यक नहीं है। Schema ऐसा design करें कि FTS बाद में जोड़ा जा सके।
- Worker execution को database boundary settle होने तक settings के पीछे experimental रहना चाहिए।
Code-Read Findings
Current branch proof-of-concept stage से आगे निकल चुकी है। Shared
database मौजूद है, Node node:sqlite एक छोटे runtime helper के माध्यम से wired है, और
पूर्व stores अब state/openclaw.sqlite या owning
openclaw-agent.sqlite database में लिखते हैं।
बाकी काम SQLite चुनना नहीं है; यह new boundary को clean रखना और किसी भी compatibility-shaped interfaces को delete करना है जो अभी भी पुराने file world जैसे दिखते हैं:
- Session
storePathअब runtime identity, test fixture shape, या status payload field नहीं है। Runtime और bridge tests में अबstorePathcontract name नहीं है; doctor/migration code उस legacy vocabulary का स्वामी है। - Session writes अब पुराने in-process
store-writer.tsqueue से होकर नहीं गुजरतीं। SQLite patch writes इसके बजाय conflict detection और bounded retry use करती हैं। - Legacy path discovery के अब भी valid migration uses हैं, लेकिन runtime code को
sessions.jsonऔर transcript JSONL files को possible write targets की तरह treat करना बंद करना चाहिए। - Agent-owned tables per-agent SQLite databases में रहती हैं। Global DB
registry/control-plane rows रखता है; transcript identity per-agent transcript rows में
{agentId, sessionId}है। Runtime code को transcript file paths persist नहीं करने चाहिए या transcript locators migrate नहीं करने चाहिए। - Doctor पहले से कई legacy files import करता है। Cleanup यह है कि इसे एक single explicit migration implementation बनाया जाए जिसे doctor call करे, durable migration report के साथ।
कोई additional product questions implementation को block नहीं कर रहे हैं।
Current Code Shape
Branch में पहले से एक real shared SQLite base है:
- रनटाइम फ्लोर अब Node 22+ है:
package.json, CLI रनटाइम गार्ड, इंस्टॉलर डिफॉल्ट, macOS रनटाइम लोकेटर, CI, और सार्वजनिक इंस्टॉल दस्तावेज़ सभी सहमत हैं। पुरानी Node 22 संगतता लेन हटा दी गई है। src/state/openclaw-state-db.tsopenclaw.sqliteखोलता है, WAL सेट करता है,synchronous=NORMAL,busy_timeout=30000,foreign_keys=ON, औरsrc/state/openclaw-state-schema.sqlसे व्युत्पन्न जनरेटेड स्कीमा मॉड्यूल लागू करता है।- Kysely टेबल प्रकार और रनटाइम स्कीमा मॉड्यूल प्रतिबद्ध
.sqlफ़ाइलों से बनाए गए डिस्पोजेबल SQLite डेटाबेस से जनरेट किए जाते हैं; रनटाइम कोड अब ग्लोबल, प्रति-एजेंट, या प्रॉक्सी कैप्चर डेटाबेस के लिए कॉपी-पेस्ट किए गए स्कीमा स्ट्रिंग नहीं रखता। - रनटाइम स्टोर हाथ से SQLite पंक्ति आकारों की छाया बनाने के बजाय उन जनरेटेड
Kysely
DBइंटरफ़ेस से चुने गए और सम्मिलित पंक्ति प्रकार व्युत्पन्न करते हैं। Raw SQL स्कीमा लागू करने, प्रैग्मा, और केवल-माइग्रेशन DDL तक सीमित रहता है। - SQLite स्कीमा
user_version = 1पर समेटे गए हैं क्योंकि यह डेटाबेस लेआउट अभी शिप नहीं हुआ है। रनटाइम ओपनर केवल वर्तमान स्कीमा बनाते हैं; फ़ाइल-से-डेटाबेस इम्पोर्ट डॉक्टर कोड में रहता है, और ब्रांच-लोकल डेटाबेस अपग्रेड हेल्पर हटा दिए गए हैं। - जहाँ स्वामित्व सीमा कैनॉनिकल है वहाँ रिलेशनल स्वामित्व लागू किया जाता है:
सोर्स माइग्रेशन पंक्तियाँ
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_run_logs,cron_jobs,commitments,delivery_queue_entries,model_capability_cache,workspace_setup_state,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-स्वामित्व वाली स्थिति को होस्ट-स्वामित्व वाली टाइप्ड टेबल नहीं मिलतीं। इंस्टॉल किए गए
plugins संस्करणित JSON पेलोड के लिए
plugin_state_entriesऔर बाइट्स के लिएplugin_blob_entriesका उपयोग करते हैं, जिसमें नेमस्पेस/की स्वामित्व, TTL क्लीनअप, बैकअप, और Plugin माइग्रेशन रिकॉर्ड होते हैं। होस्ट-स्वामित्व वाली Plugin ऑर्केस्ट्रेशन स्थिति में तब भी टाइप्ड टेबल हो सकती हैं जब होस्ट क्वेरी कॉन्ट्रैक्ट का मालिक हो, जैसेplugin_binding_approvals। - Plugin माइग्रेशन Plugin-स्वामित्व वाले नेमस्पेस पर डेटा माइग्रेशन हैं, होस्ट
स्कीमा माइग्रेशन नहीं। कोई Plugin अपने संस्करणित स्टेट/ब्लॉब एंट्री को
माइग्रेशन प्रोवाइडर के माध्यम से माइग्रेट कर सकता है, और होस्ट सामान्य
माइग्रेशन लेजर में सोर्स/रन स्थिति रिकॉर्ड करता है। नए Plugin इंस्टॉल के लिए
openclaw-state-schema.sqlबदलने की आवश्यकता नहीं होती जब तक होस्ट स्वयं किसी नए क्रॉस-Plugin कॉन्ट्रैक्ट का स्वामित्व नहीं ले रहा हो। src/state/openclaw-agent-db.tsagents/<agentId>/agent/openclaw-agent.sqliteखोलता है, डेटाबेस को ग्लोबल DB में रजिस्टर करता है, और एजेंट-लोकल सेशन, ट्रांसक्रिप्ट, VFS, आर्टिफैक्ट, कैश, और मेमोरी-इंडेक्स टेबल का मालिक है। साझा रनटाइम डिस्कवरी अब हर कॉल साइट पर उस क्वेरी को दोबारा लागू करने के बजाय जनरेटेड-टाइप्डagent_databasesरजिस्ट्री पढ़ती है।- ग्लोबल और प्रति-एजेंट डेटाबेस डेटाबेस भूमिका,
स्कीमा संस्करण, टाइमस्टैम्प, और एजेंट डेटाबेस के लिए एजेंट id के साथ
schema_metaपंक्ति रिकॉर्ड करते हैं। लेआउट अभी भीuser_version = 1पर रहता है क्योंकि यह SQLite स्कीमा अभी शिप नहीं हुआ है। - प्रति-एजेंट सेशन पहचान में अब
session_idसे की की गई कैनॉनिकलsessionsरूट टेबल है, जिसमेंsession_key,session_scope,account_id,primary_conversation_id, टाइमस्टैम्प, डिस्प्ले फ़ील्ड, मॉडल मेटाडेटा, हार्नेस id, और पैरेंट/स्पॉन लिंकज क्वेरी योग्य कॉलम के रूप में हैं।session_routessession_keyसे वर्तमानsession_idतक का अद्वितीय सक्रिय रूट इंडेक्स है, इसलिए कोई रूट की ताज़े टिकाऊ सेशन में जा सकती है बिना हॉट रीड्स को डुप्लिकेटsessions.session_keyपंक्तियों के बीच चुनने पर मजबूर किए। पुरानाsession_entries.entry_jsonसंगतता-आकार का पेलोड टिकाऊsession_idरूट से फ़ॉरेन की द्वारा जुड़ा है; अब यह सेशन का एकमात्र स्कीमा-स्तरीय निरूपण नहीं है। - प्रति-एजेंट बाहरी बातचीत पहचान भी रिलेशनल है:
conversationsसामान्यीकृत प्रोवाइडर/अकाउंट/बातचीत पहचान स्टोर करता है, औरsession_conversationsएक OpenClaw सेशन को एक या अधिक बाहरी बातचीत से जोड़ता है। यह साझा-मुख्य DM सेशन को कवर करता है जहाँ कई पीयर जानबूझकर एक सेशन पर मैप हो सकते हैं बिनाsession_keyमें गलत प्रस्तुति किए। SQLite प्राकृतिक प्रोवाइडर पहचान के लिए विशिष्टता भी लागू करता है ताकि वही चैनल/अकाउंट/काइंड/पीयर/थ्रेड टपल बातचीत ids में विभाजित न हो सके। साझा-मुख्य डायरेक्ट पीयरparticipantभूमिका से लिंक किए जाते हैं, ताकि एक OpenClaw सेशन कई बाहरी DM पीयर का प्रतिनिधित्व कर सके बिना पुराने पीयर को अस्पष्ट संबंधित पंक्तियों में घटाए।sessions.primary_conversation_idअभी भी वर्तमान टाइप्ड डिलीवरी लक्ष्य की ओर इशारा करता है। बंद रूटिंग/स्थिति कॉलम केवल TypeScript यूनियन पर निर्भर रहने के बजाय SQLiteCHECKconstraints से लागू होते हैं। रनटाइम सेशन प्रोजेक्शन टाइप्ड सेशन/बातचीत कॉलम लागू करने से पहलेsession_entries.entry_jsonसे संगतता रूटिंग शैडो साफ करता है, इसलिए पुराने JSON पेलोड डिलीवरी लक्ष्यों को फिर से जीवित नहीं कर सकते। Subagent announce रूटिंग भी टाइप्ड SQLite डिलीवरी संदर्भ की मांग करती है; यह अब संगतताSessionEntryरूट फ़ील्ड पर वापस नहीं जाती। Gatewaychat.sendस्पष्ट डिलीवरी इनहेरिटेंसorigin/last*संगतता फ़ील्ड के बजाय टाइप्ड SQLite डिलीवरी संदर्भ पढ़ता है।tools.effectiveभी प्रोवाइडर/अकाउंट/थ्रेड संदर्भ टाइप्ड SQLite डिलीवरी/रूटिंग पंक्तियों से व्युत्पन्न करता है, पुरानेlast*सेशन-एंट्री शैडो से नहीं। सिस्टम-इवेंट प्रॉम्प्ट संदर्भoriginशैडो के बजाय टाइप्ड डिलीवरी फ़ील्ड से चैनल/to/अकाउंट/थ्रेड फ़ील्ड फिर से बनाता है। साझाdeliveryContextFromSessionहेल्पर और सेशन-से-बातचीत मैपर अबSessionEntry.originको पूरी तरह अनदेखा करते हैं; केवल टाइप्ड डिलीवरी फ़ील्ड और रिलेशनल बातचीत पंक्तियाँ हॉट रूट पहचान बना सकती हैं। रनटाइम सेशन एंट्री सामान्यीकरणentry_jsonको पर्सिस्ट या प्रोजेक्ट करने से पहलेoriginहटाता है, और इनबाउंड मेटाडेटा नए origin शैडो बनाने के बजाय टाइप्ड चैनल/चैट फ़ील्ड और रिलेशनल बातचीत पंक्तियाँ लिखता है। - ट्रांसक्रिप्ट इवेंट, ट्रांसक्रिप्ट स्नैपशॉट, और ट्रैजेक्टरी रनटाइम इवेंट अब
कैनॉनिकल प्रति-एजेंट
sessionsरूट को संदर्भित करते हैं और सेशन हटाने पर कैस्केड होते हैं। ट्रांसक्रिप्ट पहचान/idempotency पंक्तियाँ ठीक ट्रांसक्रिप्ट इवेंट पंक्ति से कैस्केड होती रहती हैं। - Memory-core इंडेक्स अब स्पष्ट एजेंट-डेटाबेस टेबल
memory_index_meta,memory_index_sources,memory_index_chunks, औरmemory_embedding_cacheका उपयोग करते हैं, जहाँmemory_index_stateरिविज़न बदलाव ट्रैक करता है। वैकल्पिक FTS/वेक्टर साइड इंडेक्स सामान्यmeta,files,chunks,chunks_fts, याchunks_vecटेबल के बजायmemory_index_chunks_ftsऔरmemory_index_chunks_vecनामित हैं। कैनॉनिकल नाम वर्तमान path/source पंक्ति आकार और serialized embedding संगतता बनाए रखते हैं। ये टेबल व्युत्पन्न/सर्च कैश हैं, कैनॉनिकल ट्रांसक्रिप्ट स्टोरेज नहीं; इन्हें मेमोरी वर्कस्पेस फ़ाइलों और कॉन्फ़िगर किए गए सोर्स से हटाकर फिर से बनाया जा सकता है। शिप किए गए generic-name मेमोरी इंडेक्स को खोलना उसके मेटाडेटा, सोर्स, chunks, और embedding cache को कैनॉनिकल टेबल में माइग्रेट करता है; व्युत्पन्न FTS/vector टेबल उनके कैनॉनिकल नामों के तहत फिर से बनाई जाती हैं। - Subagent रन रिकवरी स्थिति अब टाइप्ड साझा
subagent_runsपंक्तियों में रहती है जिसमें इंडेक्स किए गए चाइल्ड, रिक्वेस्टर, और कंट्रोलर सेशन की हैं। पुरानीsubagents/runs.jsonफ़ाइल केवल डॉक्टर माइग्रेशन इनपुट है। - वर्तमान बातचीत बाइंडिंग अब सामान्यीकृत बातचीत id से की की गई टाइप्ड साझा
current_conversation_bindingsपंक्तियों में रहती हैं, जिनमें लक्ष्य एजेंट/सेशन कॉलम, बातचीत काइंड, स्थिति, एक्सपायरी, और मेटाडेटा डुप्लिकेट अपारदर्शी बाइंडिंग रिकॉर्ड के बजाय रिलेशनल कॉलम के रूप में स्टोर होते हैं। टिकाऊ बाइंडिंग की में सामान्यीकृत बातचीत काइंड शामिल है ताकि direct/group/channel refs टकरा न सकें, और SQLite अमान्य बाइंडिंग काइंड/स्थिति मान अस्वीकार करता है। पुरानीbindings/current-conversations.jsonफ़ाइल केवल डॉक्टर माइग्रेशन इनपुट है। - डिलीवरी क्यू रिकवरी अब replay JSON पर चैनल, लक्ष्य,
अकाउंट, सेशन, retry, error, platform-send, और recovery state के लिए टाइप्ड क्यू कॉलम ओवरले करती है।
entry_jsonreplay पेलोड, hooks, और formatting पेलोड रखता है, लेकिन हॉट क्यू रूटिंग/स्थिति के लिए टाइप्ड कॉलम अधिकृत हैं। - TUI last-session restore pointers अब hashed TUI connection/session scope से की की गई टाइप्ड साझा
tui_last_sessionsपंक्तियों में रहते हैं। पुरानी TUI JSON फ़ाइल केवल डॉक्टर माइग्रेशन इनपुट है। - डिफॉल्ट TTS prefs अब
speech-corePlugin के तहत की की गई साझा Plugin-state SQLite पंक्तियों में रहते हैं। पुरानीsettings/tts.jsonफ़ाइल केवल डॉक्टर माइग्रेशन इनपुट है; रनटाइम अब TTS prefs JSON फ़ाइलें न पढ़ता है न लिखता है, और legacy path resolver डॉक्टर माइग्रेशन मॉड्यूल में रहता है। - सीक्रेट लक्ष्य मेटाडेटा अब हर
क्रेडेंशियल लक्ष्य को config file बताने का दिखावा करने के बजाय स्टोर के बारे में बात करता है।
openclaw.jsonconfig store ही रहता है; auth-profile लक्ष्य टाइप्ड SQLiteauth_profile_storesपंक्तियों का उपयोग करते हैं, जिनमें प्रोवाइडर-आकार के credentials JSON पेलोड के रूप में रखे जाते हैं। - सीक्रेट ऑडिट अब सेवानिवृत्त प्रति-एजेंट
auth.jsonफ़ाइलों को स्कैन नहीं करता। डॉक्टर उस legacy फ़ाइल के बारे में चेतावनी देने, इम्पोर्ट करने, और हटाने का मालिक है। - Legacy auth profile path helpers अब डॉक्टर legacy code में रहते हैं। Core auth
profile path helpers SQLite auth-store पहचान और display locations उजागर करते हैं,
auth-profiles.jsonयाauth-state.jsonruntime paths नहीं। - Subagent run recovery और OpenRouter model capability cache runtime modules
अब SQLite snapshot readers/writers को doctor-only legacy JSON
import helpers से अलग रखते हैं। OpenRouter capabilities टाइप्ड generic
model_capability_cacheपंक्तियों का उपयोगprovider_id = "openrouter"के तहत करते हैं, किसी एक opaque cache blob या provider-specific host table के बजाय। Subagent runtaskNameटाइप्डsubagent_runs.task_nameकॉलम में स्टोर होता है;payload_jsonकॉपी replay/debug डेटा है, hot display या lookup fields का स्रोत नहीं। src/agents/filesystem/virtual-agent-fs.sqlite.tsएजेंट डेटाबेसvfs_entriesटेबल पर SQLite VFS लागू करता है। Directory reads, recursive exports, deletes, और renames पूरे namespace को scan करने याLIKEpath matching पर निर्भर रहने के बजाय indexed(namespace, path)prefix ranges का उपयोग करते हैं।src/agents/runtime-worker.entry.tsworkers के लिए per-run SQLite VFS, tool artifact, run artifact, और scoped cache stores बनाता है।- Workspace bootstrap completion markers अब resolved workspace path से की की गई टाइप्ड साझा
workspace_setup_stateपंक्तियों में रहते हैं,.openclaw/workspace-state.jsonके बजाय; runtime अब legacy workspace marker को न पढ़ता है न rewrite करता है, और helper APIs अब storage identity derive करने के लिए fake.openclaw/setup-statepath को इधर-उधर pass नहीं करते। - Exec approvals अब टाइप्ड साझा SQLite
exec_approvals_configsingleton row में रहते हैं। Doctor legacy~/.openclaw/exec-approvals.jsonimport करता है; runtime writes अब उस file को active store location के रूप में create, rewrite, या report नहीं करते। macOS companion वहीstate/openclaw.sqlitetable row पढ़ता और लिखता है; वह disk पर केवल Unix prompt socket रखता है क्योंकि वह IPC है, durable runtime state नहीं। - Device identity, device auth, और bootstrap runtime modules अब अपने
SQLite snapshot readers/writers को doctor-only legacy JSON import
helpers से अलग रखते हैं। Device identity टाइप्ड
device_identitiesrows का उपयोग करती है और device auth tokens टाइप्डdevice_auth_tokensrows का उपयोग करते हैं। Device auth writes token table को truncate करने के बजाय device/role के अनुसार rows reconcile करती हैं, और runtime अब single-token updates को पुराने whole-store adapter के माध्यम से route नहीं करता। Legacy version-1 JSON पेलोड केवल doctor import/export आकारों के रूप में मौजूद हैं। - GitHub Copilot token exchange cache साझा SQLite plugin-state तालिका का उपयोग करता है
github-copilot/token-cache/defaultके अंतर्गत। यह provider-owned cache state है, इसलिए यह जानबूझकर कोई host schema table नहीं जोड़ता। - GitHub Copilot compaction अब
openclaw-compaction-*.jsonworkspace sidecars नहीं लिखता। harness tracked SDK session के लिए SDK history compaction RPC को कॉल करता है, और OpenClaw compatibility marker files के बजाय टिकाऊ session/transcript state SQLite में रखता है। - साझा Swift runtime (
OpenClawKit) device identity और device auth के लिए वहीstate/openclaw.sqliterows उपयोग करता है। macOS app helpers दूसरी JSON या SQLite path के मालिक होने के बजाय साझा SQLite helpers import करते हैं। बची हुई legacyidentity/device.jsonidentity creation को तब तक रोकती है जब तक doctor उसे SQLite में import नहीं कर देता, TypeScript और Android startup gate से मेल खाते हुए। - Android device identity वही TypeScript-compatible key material उपयोग करती है
जो typed
state/openclaw.sqlite#table/device_identitiesrows में stored है। यह कभीopenclaw/identity/device.jsonपढ़ती या लिखती नहीं; बची हुई legacy file startup को तब तक रोकती है जब तक doctor उसे SQLite में import नहीं कर देता। - Android cached device auth tokens भी typed
state/openclaw.sqlite#table/device_auth_tokensrows उपयोग करते हैं और TypeScript तथा Swift जैसी वही version-1 token semantics साझा करते हैं। Runtime अबSecurePrefsgateway.deviceToken*compatibility keys नहीं पढ़ता; वे केवल migration/doctor logic से संबंधित हैं। - Android notification recent-package history typed
android_notification_recent_packagesrows उपयोग करती है। Runtime अब पुराने SharedPreferences CSV keys को migrate या read नहीं करता। - Device identity creation fail closed होती है जब legacy
identity/device.jsonमौजूद हो, जब SQLite identity row invalid हो, या जब SQLite identity store खोला न जा सके। Doctor पहले उस file को import और remove करता है, इसलिए runtime startup migration से पहले pairing identity को चुपचाप rotate नहीं कर सकता। - Device identity selection एक SQLite row key है, JSON file locator नहीं। Tests
और gateway helpers explicit identity keys pass करते हैं; केवल doctor migration और
fail-closed startup gate retired
identity/device.jsonfilename जानते हैं। - Session reset compatibility अब doctor config migration में रहती है:
session.idleMinutesकोsession.reset.idleMinutesमें move किया जाता है,session.resetByType.dmकोsession.resetByType.directमें move किया जाता है, और runtime reset policy केवल canonical reset keys पढ़ती है। - Legacy config compatibility अब
src/commands/doctor/के अंतर्गत रहती है। सामान्यreadConfigFileSnapshot()validation doctor legacy detectors import नहीं करता या legacy issues annotate नहीं करता;runDoctorConfigPreflight()doctor repair/reporting के लिए वे issues जोड़ता है। doctor config flowsrc/commands/doctor/legacy-config.tsimport करता है, और पुराना OAuth profile-id repairsrc/commands/doctor/legacy/oauth-profile-ids.tsके अंतर्गत रहता है। - Non-doctor commands legacy config repair auto-run नहीं करते। उदाहरण के लिए,
openclaw update --channelअब invalid legacy config पर fail होता है और user से doctor चलाने को कहता है, doctor migration code को चुपचाप import करने के बजाय। - Web push, APNs, Voice Wake, update checks, और config health अब subscriptions, VAPID keys, node registrations, trigger rows, routing rows, update-notification state, और config health entries के लिए whole opaque JSON blobs के बजाय typed shared SQLite tables उपयोग करते हैं। Web push और APNs snapshot writes अब subscriptions/registrations को tables clear करने के बजाय primary key से reconcile करते हैं; config health config path से ऐसा ही करता है। उनके runtime modules SQLite snapshot readers/writers को doctor-only legacy JSON import helpers से अलग रखते हैं।
- Node-host config अब shared SQLite database में typed singleton row उपयोग करता है;
doctor सामान्य runtime use से पहले पुरानी
node.jsonfile import करता है। - Device/node pairing, channel pairing, channel allowlists, और bootstrap state
अब whole opaque JSON blobs के बजाय typed SQLite rows उपयोग करते हैं। Plugin binding
approvals और cron job state वही split follow करते हैं: runtime modules
SQLite-backed operations और neutral snapshot helpers expose करते हैं, और pairing/bootstrap
plus plugin binding approval snapshot writes tables truncate करने के बजाय rows को primary key से reconcile करते हैं, जबकि doctor पुरानी JSON files को
src/commands/doctor/legacy/*modules के माध्यम से import/remove करता है। - Installed plugin records अब SQLite installed-plugin index में रहते हैं।
Runtime config read/write अब पुराने
plugins.installsauthored-config data को migrate या preserve नहीं करता; doctor सामान्य runtime use से पहले उस legacy config shape को SQLite में import करता है। - QQBot credential recovery snapshots अब SQLite plugin state में
qqbot/credential-backupsके अंतर्गत रहते हैं। Runtime अबqqbot/data/credential-backup*.jsonनहीं लिखता; doctor उन legacy backup files को अन्य QQBot state inputs के साथ import और remove करता है। - Gateway reload planning SQLite installed-plugin index snapshots की तुलना
internal
installedPluginIndex.installRecords.*diff namespace के अंतर्गत करता है। Runtime reload decisions अब उन rows को fakeplugins.installsconfig objects में wrap नहीं करते। - Matrix named-account credential upgrade अब runtime
reads के दौरान नहीं होता। Doctor पुराने top-level
credentials/matrix/credentials.jsonrename का मालिक है जब single/default Matrix account resolve किया जा सकता है। - Core pairing और cron runtime modules अब legacy JSON path
builders export नहीं करते। Doctor-owned legacy modules import tests और
migration के लिए
pending.json,paired.json,bootstrap.json, औरcron/jobs.jsonsource paths construct करते हैं। Legacy cron job-shape normalization और cron run-log importsrc/commands/doctor/legacy/cron*.tsके अंतर्गत रहते हैं। src/commands/doctor/legacy/runtime-state.tsdoctor से SQLite में node host config सहित legacy JSON state files import करता है। नई legacy file importerssrc/commands/doctor/legacy/के अंतर्गत ही रहती हैं।src/commands/doctor/state-migrations.tslegacysessions.jsonऔर*.jsonltranscripts को सीधे SQLite में import करता है और successful sources हटाता है। यह अब root legacy transcripts कोagents/<agentId>/sessions/*.jsonlके माध्यम से stage नहीं करता या import से पहले canonical JSONL target create नहीं करता।- State integrity doctor checks अब legacy session directories scan नहीं करते या orphan JSONL deletion offer नहीं करते। Legacy transcript files केवल migration inputs हैं, और migration step import plus source removal का मालिक है।
- Legacy sandbox registry import
src/commands/doctor/legacy/sandbox-registry.tsके अंतर्गत रहता है; active sandbox registry reads और writes SQLite-only रहते हैं। - Legacy session transcript health/import repair
src/commands/doctor/legacy/session-transcript-health.tsके अंतर्गत रहता है; runtime command modules अब JSONL transcript parsing या active-branch repair code नहीं रखते।
पूर्ण किए गए समेकन/हटाने की मुख्य बातें:
- Plugin स्थिति अब साझा
state/openclaw.sqliteडेटाबेस का उपयोग करती है। पुराना शाखा-स्थानीयplugin-state/state.sqliteसाइडकार आयातक हटा दिया गया है क्योंकि वह SQLite लेआउट कभी शिप नहीं हुआ। प्रोब/परीक्षण सहायक Plugin-स्थिति-विशिष्ट SQLite पथ उजागर करने के बजाय साझाdatabasePathरिपोर्ट करते हैं। - कार्य और कार्य प्रवाह रनटाइम तालिकाएं अब
tasks/runs.sqliteऔरtasks/flows/registry.sqliteके बजाय साझाstate/openclaw.sqliteडेटाबेस में रहती हैं; उसी अशिप्ड-लेआउट कारण से पुराने साइडकार आयातक हटा दिए गए हैं। src/config/sessions/store.tsको अब इनबाउंड मेटाडेटा, रूट अपडेट, या updated-at पढ़ने के लिएstorePathकी जरूरत नहीं है। कमांड स्थायित्व, CLI सत्र सफाई, उप-एजेंट गहराई, प्रमाणीकरण ओवरराइड, और ट्रांसक्रिप्ट सत्र पहचान एजेंट/सत्र पंक्ति API का उपयोग करते हैं। लेखन आशावादी संघर्ष पुनःप्रयास के साथ SQLite पंक्ति पैच के रूप में लागू किए जाते हैं।- सत्र लक्ष्य समाधान अब लेगेसी
sessions.jsonपथों के बजाय प्रति-एजेंट डेटाबेस लक्ष्य उजागर करता है। साझा Gateway, ACP मेटाडेटा, doctor रूट मरम्मत, औरopenclaw sessionsagent_databasesके साथ कॉन्फिगर किए गए एजेंटों की गणना करते हैं। - Gateway सत्र रूटिंग अब
resolveGatewaySessionDatabaseTargetका उपयोग करती है; लौटाया गया लक्ष्य किसी लेगेसी सत्र-स्टोर फ़ाइल पथ के बजायdatabasePathऔर उम्मीदवार SQLite पंक्ति कुंजियां रखता है। - चैनल सत्र रनटाइम प्रकार अब updated-at पढ़ने, इनबाउंड मेटाडेटा, और अंतिम-रूट अपडेट के लिए
{agentId, sessionKey}उजागर करते हैं। पुरानाsaveSessionStore(storePath, store)संगतता प्रकार चला गया है। - Plugin रनटाइम, एक्सटेंशन API, और
config/sessionsबैरल सतहें अब Plugin कोड को SQLite-समर्थित सत्र पंक्ति सहायकों की ओर ले जाती हैं। रूट लाइब्रेरी संगतता निर्यात (loadSessionStore,saveSessionStore,resolveStorePath) मौजूदा उपभोक्ताओं के लिए अप्रचलित शिम के रूप में बने रहते हैं। पुरानाresolveLegacySessionStorePathसहायक चला गया है; लेगेसीsessions.jsonपथ निर्माण अब माइग्रेशन और परीक्षण फिक्स्चर तक स्थानीय है। src/config/sessions/session-entries.sqlite.tsअब कैनोनिकल सत्र प्रविष्टियां प्रति-एजेंट डेटाबेस में संग्रहीत करता है और इसमें पंक्ति-स्तरीय read/upsert/delete पैच समर्थन है। रनटाइम upsert/patch/delete अब केस वैरिएंट स्कैन नहीं करता या लेगेसी उपनाम कुंजियां प्रून नहीं करता; doctor कैनोनिकलाइज़ेशन का मालिक है। स्वतंत्र JSON आयात सहायक चला गया है, और माइग्रेशन पूरी सत्र तालिका बदलने के बजाय नई पंक्तियों को upsert करके मर्ज करता है। सार्वजनिक read/list/load सहायक टाइप की गईsessionsऔरconversationsपंक्तियों से सक्रिय सत्र मेटाडेटा प्रोजेक्ट करते हैं;entry_jsonएक संगतता/डिबग छाया है और टाइप की गई सत्र पहचान या डिलीवरी संदर्भ खोए बिना पुराना या अमान्य हो सकता है।src/config/sessions/delivery-info.tsअब टाइप की गई प्रति-एजेंटsessions+conversations+session_conversationsपंक्तियों से डिलीवरी संदर्भ हल करता है। यह अबsession_entries.entry_jsonसे रनटाइम डिलीवरी पहचान का पुनर्निर्माण नहीं करता; गुम टाइप की गई conversation पंक्ति एक doctor माइग्रेशन/मरम्मत समस्या है, रनटाइम फॉलबैक नहीं।- संग्रहीत-सत्र रीसेट निर्णय अब टाइप किए गए
sessions.session_scope,sessions.chat_type, औरsessions.channelमेटाडेटा को प्राथमिकता देते हैं।sessionKeyपार्सिंग केवल कमांड लक्ष्यों पर स्पष्ट थ्रेड/टॉपिक प्रत्ययों के लिए बनी रहती है; group बनाम direct रीसेट वर्गीकरण अब कुंजी आकार से नहीं आता। - सत्र सूची/स्थिति प्रदर्शन वर्गीकरण अब टाइप किए गए chat मेटाडेटा और
Gateway सत्र प्रकार का उपयोग करता है। यह अब
session_keyके अंदर:group:या:channel:सबस्ट्रिंग को टिकाऊ group/direct सत्य नहीं मानता। - मौन-उत्तर नीति चयन अब केवल स्पष्ट conversation प्रकार या सतह
मेटाडेटा का उपयोग करता है। यह अब
session_keyसबस्ट्रिंग से direct/group नीति का अनुमान नहीं लगाता। - सत्र प्रदर्शन मॉडल समाधान अब SQLite
सत्र डेटाबेस लक्ष्य से एजेंट id प्राप्त करता है, उसे
session_keyसे अलग नहीं करता। - एजेंट-से-एजेंट घोषणा लक्ष्य हाइड्रेशन अब केवल टाइप किए गए
sessions.listdeliveryContextका उपयोग करता है। यह अब लेगेसीorigin, मिरर किए गएlast*फ़ील्ड, याsession_keyआकार से चैनल/account/thread रूटिंग पुनर्प्राप्त नहीं करता। sessions_sendथ्रेड-लक्ष्य अस्वीकृति अब टाइप किया गया SQLite रूटिंग मेटाडेटा पढ़ती है। यह अब लक्ष्य कुंजी से थ्रेड प्रत्यय पार्स करके लक्ष्यों को अस्वीकार या स्वीकार नहीं करती।- group-स्कोप्ड टूल नीति सत्यापन अब वर्तमान या spawned सत्र के लिए टाइप की गई SQLite conversation
रूटिंग पढ़ता है। यह अब
sessionKeyडिकोड करके group/channel पहचान पर भरोसा नहीं करता; कॉलर-प्रदान group ids तब हटा दिए जाते हैं जब कोई टाइप की गई सत्र पंक्ति उनके लिए पुष्टि नहीं करती। - चैनल मॉडल ओवरराइड मिलान अब स्पष्ट group और parent
conversation मेटाडेटा का उपयोग करता है। यह अब
parentSessionKeyसे parent conversation ids डिकोड नहीं करता। - संग्रहीत मॉडल ओवरराइड इनहेरिटेंस को अब टाइप किए गए सत्र संदर्भ से स्पष्ट parent सत्र कुंजी
चाहिए। यह अब
sessionKeyमें:thread:या:topic:प्रत्ययों से parent ओवरराइड व्युत्पन्न नहीं करता। - पुराना सत्र thread-info wrapper और loaded-Plugin थ्रेड पार्सर चले गए हैं;
कोई रनटाइम कोड
config/sessions/thread-infoआयात नहीं करता। - चैनल conversation सहायक अब पूर्ण-सत्र-कुंजी पार्सिंग
ब्रिज उजागर नहीं करता। core अब भी provider-स्वामित्व वाले raw conversation ids को
resolveSessionConversation(...)के माध्यम से सामान्यीकृत करता है, लेकिन यहsessionKeyसे रूट तथ्यों का पुनर्निर्माण नहीं करता। - Completion डिलीवरी, send नीति, और कार्य रखरखाव अब
session_keyआकार से chat प्रकार व्युत्पन्न नहीं करते। पुराना chat-type कुंजी पार्सर हटा दिया गया है; इन पथों को टाइप किए गए सत्र मेटाडेटा, टाइप किए गए डिलीवरी संदर्भ, या स्पष्ट डिलीवरी लक्ष्य शब्दावली की जरूरत है। - सत्र सूची/स्थिति, डायग्नोस्टिक्स, approval account binding, TUI Heartbeat
फ़िल्टरिंग, और उपयोग सारांश अब provider/account/thread/display रूटिंग के लिए
SessionEntry.originको नहीं खंगालते। केवल बचे हुए रनटाइमoriginreads गैर-सत्र अवधारणाएं या वर्तमान-turn डिलीवरी ऑब्जेक्ट हैं। - approval-request native conversation lookup अब टाइप की गई प्रति-एजेंट सत्र
रूटिंग पंक्तियां पढ़ता है। यह अब
sessionKeyसे channel/group/thread conversation पहचान पार्स नहीं करता; गुम टाइप किया गया मेटाडेटा एक माइग्रेशन/मरम्मत समस्या है। - Gateway सत्र changed/chat/session event payloads अब
SessionEntry.originयाlast*रूट छायाएं echo नहीं करते; क्लाइंट्स को टाइप किए गएchannel,chatType, औरdeliveryContextमिलते हैं। - Heartbeat डिलीवरी समाधान अब टाइप किया गया SQLite
deliveryContextसीधे प्राप्त कर सकता है, और Heartbeat रनटाइम वर्तमान रूटिंग के लिए संगतताsession_entriesछायाओं पर निर्भर रहने के बजाय प्रति-एजेंट सत्र डिलीवरी पंक्ति पास करता है। - Cron isolated-agent डिलीवरी लक्ष्य समाधान भी संगतता entry payload पर fallback करने से पहले अपनी वर्तमान रूट को टाइप की गई प्रति-एजेंट सत्र डिलीवरी पंक्ति से hydrate करता है।
- उप-एजेंट announce origin समाधान अब
loadRequesterSessionEntryके माध्यम से टाइप किया गया requester-session डिलीवरी संदर्भ थ्रेड करता है और उस पंक्ति को संगतताlast*/deliveryContextछायाओं पर प्राथमिकता देता है। - इनबाउंड सत्र मेटाडेटा अपडेट अब पहले टाइप की गई प्रति-एजेंट
डिलीवरी पंक्ति के विरुद्ध मर्ज करते हैं; पुराने
SessionEntryडिलीवरी फ़ील्ड केवल तब fallback हैं जब कोई टाइप की गई conversation पंक्ति मौजूद नहीं होती। - restart/update डिलीवरी extraction अब टाइप किए गए SQLite डिलीवरी
threadIdकोsessionKeyसे पार्स किए गए topic/thread खंडों पर प्राथमिकता देता है; पार्सिंग केवल लेगेसी thread-shaped कुंजियों के लिए fallback है। - Hook agent context channel ids अब टाइप की गई SQLite conversation पहचान को प्राथमिकता देते हैं,
फिर स्पष्ट message मेटाडेटा को। वे अब
sessionKeyसे provider/group/channel खंड पार्स नहीं करते। - Gateway
chat.sendexternal-route inheritance अबsessionKeyटुकड़ों से channel/direct/group scope अनुमानित करने के बजाय टाइप किया गया SQLite सत्र रूटिंग मेटाडेटा पढ़ता है। चैनल-स्कोप्ड सत्र केवल तब inherit करते हैं जब टाइप किया गया सत्र channel और chat type संग्रहीत डिलीवरी संदर्भ से मेल खाते हैं; shared-main सत्र अपना सख्त CLI/no-client-metadata नियम रखते हैं। - Restart-sentinel wake और continuation रूटिंग अब Heartbeat wakes या routed agent-turn continuations queue करने से पहले टाइप की गई SQLite डिलीवरी/रूटिंग पंक्तियां पढ़ती है। यह अब session-entry JSON छाया से डिलीवरी संदर्भ का पुनर्निर्माण नहीं करती।
- Gateway
tools.effectiveसंदर्भ समाधान अब provider, account, target, thread, और reply-mode inputs के लिए टाइप की गई SQLite डिलीवरी/रूटिंग पंक्तियां पढ़ता है। यह अब पुरानेsession_entries.entry_jsonorigin छायाओं से उन सक्रिय रूटिंग फ़ील्ड्स को पुनर्प्राप्त नहीं करता। - Realtime voice consult रूटिंग अब टाइप की गई
प्रति-एजेंट SQLite सत्र पंक्तियों से parent/call डिलीवरी हल करती है। यह अब embedded एजेंट
message route चुनते समय संगतता
SessionEntry.deliveryContextछायाओं पर fallback नहीं करती। - ACP spawn Heartbeat relay और parent-stream रूटिंग अब टाइप की गई SQLite सत्र पंक्तियों से parent delivery पढ़ते हैं। वे अब संगतता session-entry छायाओं से parent delivery संदर्भ का पुनर्निर्माण नहीं करते।
- सत्र डिलीवरी रूट संरक्षण अब टाइप किए गए chat मेटाडेटा और
persisted डिलीवरी कॉलम का पालन करता है। यह अब
sessionKeyसे channel hints, direct/main markers, या thread shape नहीं निकालता; internal webchat routes केवल तब external target inherit करते हैं जब SQLite के पास पहले से सत्र के लिए typed/persisted delivery identity हो। - Generic सत्र डिलीवरी extraction अब केवल exact typed SQLite सत्र डिलीवरी पंक्ति पढ़ता है। यह अब thread/topic प्रत्यय पार्स नहीं करता या thread-shaped कुंजी से base session key पर fallback नहीं करता।
- Reply dispatch, restart sentinel recovery, और realtime voice consult routing अब thread routing के लिए exact typed SQLite session/conversation पंक्तियों का उपयोग करते हैं। वे अब thread-shaped session keys पार्स करके thread ids या base-session delivery context पुनर्प्राप्त नहीं करते।
- Embedded PI history limiting अब provider, chat type,
और peer identity के लिए typed SQLite session routing
projection (
sessions+ primaryconversations) का उपयोग करता है। यह अबsessionKeyसे provider, DM, group, या thread shape पार्स नहीं करता। - Cron tool delivery inference अब केवल स्पष्ट delivery या current typed
delivery context का उपयोग करता है। यह अब
agentSessionKeyसे channel, peer, account, या thread targets डिकोड नहीं करता। - रनटाइम सत्र पंक्तियां अब पुराना
lastProviderroute alias नहीं रखतीं। सहायक और परीक्षण typedlastChannelऔरdeliveryContextफ़ील्ड का उपयोग करते हैं; doctor migration ही एकमात्र जगह है जिसे पुराने route aliases या persistedoriginshadows का अनुवाद करना चाहिए। - Transcript events, VFS rows, और tool artifact rows अब प्रति-एजेंट डेटाबेस में लिखते हैं। अशिप्ड global transcript-file mapping table चली गई है; doctor इसके बजाय durable migration rows में legacy source paths रिकॉर्ड करता है।
- रनटाइम transcript lookup अब JSONL byte offsets स्कैन नहीं करता या legacy transcript files probe नहीं करता। Gateway chat/media/history paths SQLite से transcript rows पढ़ते हैं; session JSONL अब केवल legacy doctor input है, runtime state या export format नहीं।
- Transcript parent और branch relationships SQLite transcript
headers में structured
parentTranscriptScope: {agentId, sessionId}metadata का उपयोग करते हैं, path-likeagent-db:...transcript_events...locator strings का नहीं। - transcript manager contract अब implicit persisted
create(cwd)याcontinueRecent(cwd)constructors उजागर नहीं करता। Persisted transcript managers explicit{agentId, sessionId}scope के साथ खोले जाते हैं; केवल in-memory managers tests और pure transcript transforms के लिए scope-free रहते हैं। - Runtime transcript store APIs SQLite scope हल करते हैं, filesystem paths नहीं। पुराना
resolve...ForPathhelper और unusedtranscriptPathwrite options runtime callers से चले गए हैं। - Runtime session resolution अब
{agentId, sessionId}का उपयोग करता है और external boundaries के लिएsqlite-transcript://<agent>/<session>strings व्युत्पन्न नहीं करना चाहिए। Legacy absolute JSONL paths केवल doctor migration inputs हैं। - Native hook relay direct-bridge records अब relay id से keyed typed shared
native_hook_relay_bridgesrows में रहते हैं। Runtime अब उन अल्पकालिक bridge records के लिए/tmpJSON registry या opaque generic records नहीं लिखता। runEmbeddedPiAgent(...)में अब transcript-locator parameter नहीं है। तैयार worker descriptors भी transcript locators को छोड़ देते हैं। Runtime session state और queued follow-up runs derived transcript handles के बजाय{agentId, sessionId}रखते हैं।- Embedded compaction अब SQLite scope
agentIdऔरsessionIdसे लेता है। Compaction hooks, context-engine calls, CLI delegation, और protocol replies को derivedsqlite-transcript://...handles नहीं मिलने चाहिए। Export/debug code rows से explicit user artifacts materialize कर सकता है, लेकिन वह generic session JSONL export path नहीं देता या file names को runtime identity में वापस feed नहीं करता। /export-sessionSQLite से transcript rows पढ़ता है और केवल requested standalone HTML view लिखता है। Embedded viewer अब उन rows से session JSONL को reconstruct या download नहीं करता।- Context-engine delegation अब agent identity recover करने के लिए transcript
locator parse नहीं करता। Prepared runtime context resolved
agentIdको built-in compaction adapter में carry करता है। - Transcript rewrite और live tool-result truncation अब transcript state को
{agentId, sessionId}से पढ़ते और persist करते हैं और transcript-update event payloads के लिए temporary locators derive नहीं करते। - transcript-state helper surface में अब locator-based
readTranscriptState,replaceTranscriptStateEvents, याpersistTranscriptStateMutationvariants नहीं हैं। Runtime callers को{agentId, sessionId}APIs इस्तेमाल करनी होंगी। Doctor import legacy files को explicit file path से पढ़ता है और SQLite rows लिखता है; वह locator strings migrate नहीं करता। - runtime session-manager contract अब
open(locator),forkFrom(locator), याsetTranscriptLocator(...)expose नहीं करता। Persisted session managers केवल{agentId, sessionId}से open होते हैं; list/fork helpers transcript manager facade के बजाय row-oriented session और checkpoint APIs पर रहते हैं। - Gateway transcript reader APIs scope-first हैं। वे
{agentId, sessionId}लेते हैं और positional transcript locator accept नहीं करते जो गलती से runtime identity बन सकता हो। Active transcript locator parsing हट गई है; legacy source paths केवल doctor import code द्वारा पढ़े जाते हैं। - Transcript update events भी scope-first हैं।
emitSessionTranscriptUpdateअब bare locator string accept नहीं करता, और listeners handle parse किए बिना{agentId, sessionId}से route करते हैं। - Gateway session-message broadcast session keys को agent/session scope से resolve करता है, transcript locator से नहीं। पुराना transcript-locator-to-session key resolver/cache हट गया है।
- Gateway session-history SSE live updates को agent/session scope से filter करता है। यह अब यह तय करने के लिए transcript locator candidates, realpaths, या file-shaped transcript identities canonicalize नहीं करता कि किसी stream को update मिलना चाहिए या नहीं।
- Session lifecycle hooks अब
session_endपर transcript locators derive या expose नहीं करते। Hook consumers कोsessionId,sessionKey, next-session ids, और agent context मिलते हैं; transcript files lifecycle contract का हिस्सा नहीं हैं। - Reset hooks भी अब transcript locators derive या expose नहीं करते।
before_resetpayload recovered SQLite messages और reset reason carry करता है, जबकि session identity hook context में रहती है। - Agent harness reset अब transcript locator accept नहीं करता। Reset dispatch
sessionId/sessionKeyऔर reason से scoped है। - Agent extension session types अब
transcriptLocatorexpose नहीं करते; extensions को file-shaped transcript identity तक पहुंचने के बजाय session context और runtime APIs इस्तेमाल करनी चाहिए। - Plugin compaction hooks अब transcript locators expose नहीं करते। Hook context में पहले से session identity होती है, और transcript reads file-shaped handles के बजाय SQLite scope-aware APIs से होनी चाहिए।
before_agent_finalizehooks अबtranscriptPathexpose नहीं करते, native hook relay payloads सहित। Finalization hooks केवल session context इस्तेमाल करते हैं।- Gateway reset responses अब returned entry पर transcript locator synthesize नहीं करते। Reset SQLite transcript rows बनाता है, clean session entry return करता है, और transcript access को scope-aware readers पर छोड़ता है।
- Embedded run और compaction results अब session accounting के लिए transcript
locators surface नहीं करते। Automatic compaction केवल active
sessionId, compaction counters, और token metadata update करता है। - Embedded attempt results अब
transcriptLocatorUsedreturn नहीं करते, और context-enginecompact()results अब transcript locators return नहीं करते। Runtime retry loops केवल successorsessionIdaccept करते हैं। - Delivery-mirror transcript append results अब transcript locators return नहीं
करते। Callers को appended
messageIdमिलता है; transcript update signals SQLite scope इस्तेमाल करते हैं। - Parent-session fork helpers केवल forked
sessionIdreturn करते हैं। Subagent preparation child agent/session scope को engines में pass करता है। - CLI runner params और history reseeding अब transcript locators accept नहीं
करते। CLI history reads SQLite transcript scope को
{agentId, sessionId}और session key context से resolve करते हैं। - CLI और embedded-runner test fixtures अब active sessions को
*.jsonlfiles pretend करने या runtime params के throughsqlite-transcript://...string pass करने के बजाय session id से SQLite transcript rows seed और read करते हैं। - Session tool-result guard events known session scope से emit करते हैं, तब भी
जब in-memory manager के पास derived locator नहीं होता। इसके tests अब active
/tmp/*.jsonltranscript files fake नहीं करते। - BTW और compaction-checkpoint helpers अब transcript rows को SQLite scope से read और fork करते हैं। Checkpoint metadata अब केवल session ids और leaf/entry ids store करता है; derived locators अब checkpoint payloads में नहीं लिखे जाते।
- Gateway transcript-key lookup protocol boundaries पर SQLite transcript scope इस्तेमाल करता है और अब transcript filenames के realpaths या stats नहीं करता।
- Automatic compaction transcript rotation successor transcript rows को सीधे SQLite transcript store के through लिखता है। Session rows केवल successor session identity रखते हैं, durable JSONL path या persisted locator नहीं।
- Embedded context-engine compaction SQLite-named transcript rotation helpers इस्तेमाल करता है। Rotation tests अब JSONL successor paths construct नहीं करते या active sessions को files की तरह model नहीं करते।
- Managed outgoing image retention अपने transcript-message cache को filesystem stat calls के बजाय SQLite transcript stats से key करता है।
- Runtime session locks और standalone legacy
.jsonl.lockdoctor lane हटा दिए गए हैं। - Microsoft Teams runtime barrel और public plugin SDK अब पुराने file-lock helper को re-export नहीं करते; durable plugin state paths SQLite-backed हैं।
- Session age/count pruning और explicit session cleanup हटा दिए गए हैं। Doctor legacy import का owner है; stale sessions explicit रूप से reset या delete किए जाते हैं।
- Doctor integrity checks अब legacy JSONL file को SQLite session row के लिए valid active transcript के रूप में count नहीं करते। Active transcript health केवल SQLite-only है; legacy JSONL files migration/orphan-cleanup inputs के रूप में report की जाती हैं।
- Doctor अब
agents/<agent>/sessions/को required runtime state नहीं मानता। वह उस directory को केवल तब scan करता है जब वह पहले से मौजूद हो, legacy import या orphan-cleanup input के रूप में। - Gateway
sessions.resolve, session patch/reset/compact paths, subagent spawning, fast abort, ACP metadata, heartbeat-isolated sessions, और TUI patching अब normal runtime work के side effect के रूप में legacy session keys migrate या prune नहीं करते। - CLI command session resolution अब
storePathके बजाय owningagentIdreturn करता है, और normal--toया--session-idresolution के दौरान legacy main-session rows copy नहीं करता। Legacy main-row canonicalization केवल doctor की जिम्मेदारी है। - Runtime subagent depth resolution अब
sessions.jsonया JSON5 session stores नहीं पढ़ता। यह agent id से SQLitesession_entriesपढ़ता है, और legacy depth/session metadata केवल doctor import path से enter कर सकता है। - Auth profile session overrides lazy-loading file-shaped session-store runtime
के बजाय direct
{agentId, sessionKey}row upserts के through persist होते हैं। - Auto-reply verbose gating और session update helpers अब session identity से SQLite session rows read/upsert करते हैं और persisted row state को touch करने से पहले legacy store path की आवश्यकता नहीं रखते।
- Command-run session metadata helpers अब entry-oriented names और module paths
इस्तेमाल करते हैं; पुराना
session-storecommand helper surface हटा दिया गया है। - Bootstrap header seeding और manual compaction boundary hardening अब SQLite
transcript rows को सीधे mutate करते हैं। Runtime callers session identity pass
करते हैं, writable
.jsonlpaths नहीं। - Silent session-rotation replay recent user/assistant turns को SQLite transcript
rows से
{agentId, sessionId}द्वारा copy करता है। यह अब source या target transcript locators accept नहीं करता। - Fresh runtime session rows अब transcript locators store नहीं करते। Callers
सीधे
{agentId, sessionId}इस्तेमाल करते हैं; export/debug commands rows materialize करते समय output file names चुन सकते हैं। - नया persisted transcript session शुरू करना अब हमेशा scope से SQLite rows open करता है। Session manager अब new session की identity के रूप में previous file-era transcript path या locator reuse नहीं करता।
- Persisted transcript sessions explicit
openTranscriptSessionManagerForSession({agentId, sessionId})API इस्तेमाल करते हैं। पुराने staticSessionManager.create/openForSession/list/forkFromSessionfacades हट गए हैं ताकि tests और runtime code गलती से file-era session discovery फिर से create न कर सकें। - Plugin runtime अब
api.runtime.agent.session.resolveTranscriptLocatorPathexpose नहीं करता; plugin code SQLite row helpers और scope values इस्तेमाल करता है। - public
session-store-runtimeSDK surface अब केवल session row और transcript row helpers export करता है। Focused SQLite schema/path/transaction helperssqlite-runtimeमें रहते हैं; raw open/close/reset helpers first-party tests के लिए local-only रहते हैं। - Legacy
.jsonltrajectory/checkpoint filename classifiers अब doctor legacy session-file module में रहते हैं। Core session validation अब normal SQLite session ids तय करने के लिए file-artifact helpers import नहीं करता। - Active Memory blocking subagent runs plugin state के नीचे temporary या persisted
session.jsonlfiles बनाने के बजाय SQLite transcript rows इस्तेमाल करते हैं। पुरानाtranscriptDiroption हटाया गया है। - One-off slug generation और Crestodian planner runs temporary
session.jsonlfiles बनाने के बजाय SQLite transcript rows इस्तेमाल करते हैं। llm-taskhelper runs और hidden commitment extraction भी SQLite transcript rows इस्तेमाल करते हैं, इसलिए ये model-only helper sessions अब temporary JSON/JSONL transcript files नहीं बनाते।TranscriptSessionManagerअब केवल opened SQLite transcript scope है। Runtime code इसेopenTranscriptSessionManagerForSession({agentId, sessionId})से open करता है; create, branch, continue, list, और fork flows static manager facades के बजाय उनके owning SQLite row helpers में रहते हैं। Doctor/import/debug code runtime session manager के बाहर explicit legacy source files handle करता है।- stale
SessionManager.newSession()औरSessionManager.createBranchedSession()facade methods हटाए गए। New sessions और transcript descendants अपने owning SQLite workflow द्वारा create किए जाते हैं, किसी already-open manager को अलग persisted session में mutate करके नहीं। - Parent transcript fork decisions और fork creation अब
storePathयाsessionsDiraccept नहीं करते; वे retained filesystem path metadata के बजाय{agentId, sessionId}SQLite transcript scope इस्तेमाल करते हैं। - Memory-host अब no-op session-directory transcript classification helpers export नहीं करता; transcript filtering अब entry construction के दौरान SQLite row metadata से derive होती है।
- Memory-host और QMD session-export tests SQLite transcript scopes इस्तेमाल करते
हैं। पुराने
agents/<agentId>/sessions/*.jsonlpaths केवल वहीं covered रहते हैं जहां कोई test जानबूझकर doctor/import/export compatibility prove कर रहा हो। - QA-lab raw session inspection अब gateway के through
sessions.listइस्तेमाल करता हैagents/qa/sessions/sessions.jsonपढ़ने के बजाय; MSteams feedback JSONL पथ गढ़े बिना सीधे SQLite transcripts में जोड़ता है। - साझा inbound channel turns अब legacy
storePathके बजाय{agentId, sessionKey}ले जाते हैं। 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 recording paths अब updated-at metadata पढ़ते हैं और SQLite identity के जरिए inbound session rows record करते हैं। - सक्रिय session rows से transcript locator persistence हटा दिया गया है।
resolveSessionTranscriptTargetagentId,sessionId, और वैकल्पिक topic metadata लौटाता है; doctor ही एकमात्र code है जो legacy transcript file names import करता है। - Runtime transcript headers SQLite version
1से शुरू होते हैं। पुराने JSONL V1/V2/V3 shape upgrades केवल doctor import में रहते हैं और rows store होने से पहले imported headers को वर्तमान SQLite transcript version में normalize करते हैं। - database-first guard अब
SessionManager.listAllऔरSessionManager.forkFromSessionको ban करता है; session listing और fork/restore workflows row/scoped SQLite APIs पर ही रहने चाहिए। - guard doctor/import code के बाहर legacy transcript JSONL parse/active-branch repair helper names को भी ban करता है, इसलिए runtime दूसरा legacy transcript migration path नहीं बढ़ा सकता।
- Embedded PI runs incoming transcript handles को reject करते हैं। वे worker launch से पहले
और attempt के transcript state को छूने से पहले फिर से SQLite
{agentId, sessionId}identity का उपयोग करते हैं। stale/tmp/*.jsonlinput runtime write target नहीं चुन सकता। - Cache trace, Anthropic payload, raw stream, और diagnostics timeline records
अब typed SQLite
diagnostic_eventsrows में लिखते हैं। Gateway stability bundles अब typed SQLitediagnostic_stability_bundlesrows में लिखते हैं। पुरानेdiagnostics.cacheTrace.filePath,OPENCLAW_CACHE_TRACE_FILE,OPENCLAW_ANTHROPIC_PAYLOAD_LOG_FILE, औरOPENCLAW_DIAGNOSTICS_TIMELINE_PATHJSONL override paths हटा दिए गए हैं, और सामान्य stability capture अबlogs/stability/*.jsonfiles नहीं लिखता। - Cron persistence अब हर save पर पूरी job table delete/reinsert करने के बजाय
SQLite
cron_jobsrows reconcile करता है। Plugin target writebacks matching cron rows को सीधे update करते हैं और runtime cron state को उसी state-database transaction में रखते हैं। - Cron runtime callers अब stable SQLite cron store key का उपयोग करते हैं। Legacy
cron.storepaths केवल doctor import inputs हैं; production gateway, task maintenance, status, run-log, और Telegram target writeback pathsresolveCronStoreKeyका उपयोग करते हैं और अब key को path-normalize नहीं करते। Cron status अब पुराने file-shapedstorePathfield के बजायstoreKeyreport करता है। - Cron runtime load और scheduling अब legacy persisted job
shapes जैसे
jobId,schedule.cron, numericatMs, string booleans, या missingsessionTargetको normalize नहीं करते। rows SQLite में insert होने से पहले Doctor legacy import उन repairs का owner है। - ACP spawn अब transcript JSONL file paths resolve या persist नहीं करता। Spawn और thread-bind setup SQLite session row को सीधे persist करते हैं और session id को retained transcript identity के रूप में रखते हैं।
- ACP session metadata APIs अब
agentIdसे SQLite rows read/list/upsert करते हैं और ACP session entry contract के हिस्से के रूप मेंstorePathexpose नहीं करते। - Session usage accounting और gateway usage aggregation अब केवल
{agentId, sessionId}से transcripts resolve करते हैं। cost/usage cache और discovered-session summaries अब transcript locator strings synthesize या return नहीं करते। - Gateway chat append, abort-partial persistence,
/sessions.send, और webchat media transcript writes SQLite transcript scope के जरिए सीधे append करते हैं। gateway transcript-injection helper अबtranscriptLocatorparameter accept नहीं करता। - SQLite transcript discovery अब केवल transcript scopes और stats list करता है:
{agentId, sessionId, updatedAt, eventCount}। deadlistSqliteSessionTranscriptLocatorscompatibility helper और per-rowlocatorfield हट गए हैं। - Transcript repair runtime अब केवल
repairTranscriptSessionStateIfNeeded({agentId, sessionId})expose करता है। पुराना locator-based repair helper delete कर दिया गया है; doctor/debug code explicit source file paths पढ़ता है और locator strings कभी migrate नहीं करता। - ACP replay ledger runtime अब
acp/event-ledger.jsonके बजाय shared SQLite state database में per-session replay rows store करता है; doctor legacy file को import और remove करता है। - Gateway transcript reader helpers अब पुराने
session-utils.fsmodule name के बजायsrc/gateway/session-transcript-readers.tsमें रहते हैं। fallback retry history check का नाम पुराने file-helper surface के बजाय SQLite transcript content के लिए रखा गया है। - Gateway injected-chat और compaction helpers अब values को transcript paths या source files नाम देने के बजाय internal helper APIs के जरिए SQLite transcript scope pass करते हैं।
- Bootstrap continuation detection अब
hasCompletedBootstrapTranscriptTurnके जरिए SQLite transcript rows check करता है; यह अब file-shaped helper name expose नहीं करता। - Embedded-runner tests अब SQLite transcript identity का उपयोग करते हैं, और नया
transcript manager खोलने के लिए हमेशा explicit
sessionIdचाहिए। - Memory indexing helpers अब end to end SQLite transcript terminology का उपयोग करते हैं:
host
listSessionTranscriptScopesForAgentऔरsessionTranscriptKeyForScopeexport करता है, targeted sync queuessessionTranscripts, public session-search hits opaquetranscript:<agent>:<session>paths expose करते हैं, और internal DB source key fake file path के बजायsource_kind='sessions'के तहतsession:<session>है। - generic plugin SDK persistent-dedupe helper अब file-shaped options expose नहीं करता। Callers SQLite scope keys provide करते हैं और durable dedupe rows shared plugin state में रहती हैं।
- Microsoft Teams SSO tokens locked JSON files से SQLite plugin
state में moved हो गए हैं। Doctor
msteams-sso-tokens.jsonimport करता है, payloads से canonical SSO token keys rebuild करता है, और source file remove करता है। Delegated OAuth tokens अपनी मौजूदा private credential-file boundary पर रहते हैं। - Matrix sync cache state
bot-storage.jsonसे SQLite plugin state में moved हो गया है। Doctor legacy raw या wrapped sync payloads import करता है और source file remove करता है। Active Matrix और QA Matrix clients SQLite sync-store root directory pass करते हैं, fakesync-store.jsonयाbot-storage.jsonpath नहीं। - Matrix legacy crypto migration status
legacy-crypto-migration.jsonसे SQLite plugin state में moved हो गया है। Doctor old status file import करता है; Matrix SDK IndexedDB snapshotscrypto-idb-snapshot.jsonसे SQLite plugin blobs में moved हो गए। Matrix recovery keys और credentials SQLite plugin-state rows हैं; उनकी पुरानी JSON files केवल doctor migration inputs हैं। - Memory Wiki activity logs अब
.openclaw-wiki/log.jsonlके बजाय SQLite plugin state का उपयोग करते हैं। Memory Wiki migration provider पुराने JSONL logs import करता है; wiki markdown और user vault content workspace content के रूप में file-backed रहते हैं। - Memory Wiki अब
.openclaw-wiki/state.jsonया unused.openclaw-wiki/locksdirectory नहीं बनाता। migration provider उन retired plugin metadata files को remove करता है अगर किसी older vault में वे अभी भी हों। - Crestodian audit entries अब
audit/crestodian.jsonlके बजाय core SQLite plugin state का उपयोग करते हैं। Doctor legacy JSONL audit log import करता है और successful import के बाद उसे remove करता है। - Config write/observe audit entries अब
logs/config-audit.jsonlके बजाय core SQLite plugin state का उपयोग करते हैं। Doctor legacy JSONL audit log import करता है और successful import के बाद उसे remove करता है। - macOS companion अब
openclaw.jsonedit करते समय app-locallogs/config-audit.jsonlयाlogs/config-health.jsonsidecars नहीं लिखता। config file file-backed रहती है, recovery snapshots config file के पास रहते हैं, और durable config audit/health state Gateway SQLite store से संबंधित है। - Crestodian rescue pending approvals अब
crestodian/rescue-pending/*.jsonके बजाय core SQLite plugin state का उपयोग करते हैं। Doctor legacy pending approval files import करता है और successful import के बाद उन्हें remove करता है। - Phone Control temporary arm state अब
plugins/phone-control/armed.jsonके बजाय SQLite plugin state का उपयोग करता है। Doctor legacy armed-state file कोphone-control/arm-statenamespace में import करता है और file remove करता है। - Doctor अब JSONL transcripts को in place repair नहीं करता या backup JSONL files नहीं बनाता। यह active branch को SQLite में import करता है और legacy source remove करता है।
- Session-memory hook transcript lookup
{agentId, sessionId}scope-only SQLite reads का उपयोग करता है। इसका helper अब transcript locators, legacy file reads, या file-rewrite options accept या derive नहीं करता। - Codex app-server conversation bindings अब SQLite plugin state को
OpenClaw session key या explicit
{agentId, sessionId}scope से key करते हैं। उन्हें transcript-path fallback bindings preserve नहीं करनी चाहिए। - Codex app-server mirrored-history reads केवल SQLite transcript scope का उपयोग करते हैं; उन्हें transcript file paths से identity recover नहीं करनी चाहिए।
- Role-ordering और compaction reset paths अब पुराने transcript files unlink नहीं करते; reset केवल SQLite session row और transcript identity rotate करता है।
- Gateway reset और checkpoint responses clean session rows plus session ids return करते हैं। वे अब clients के लिए SQLite transcript locators synthesize नहीं करते।
- Memory-core dreaming अब missing
JSONL files के लिए probe करके session rows prune नहीं करता। Subagent cleanup filesystem existence checks के बजाय
session runtime API के जरिए जाता है। इसके transcript-ingestion tests
agents/<id>/sessionsfixtures या locator placeholders बनाने के बजाय सीधे SQLite rows seed करते हैं। - Memory transcript indexing citation/read helpers के लिए virtual search-hit path के रूप में
transcript:<agentId>:<sessionId>expose कर सकता है। durable index source relational है (source_kind='sessions',source_key='session:<sessionId>',session_id=<sessionId>), इसलिए value runtime transcript locator नहीं है, filesystem path नहीं है, और उसे session runtime APIs में कभी वापस pass नहीं करना चाहिए। - Gateway doctor memory status short-term recall और phase-signal counts
memory/.dreams/*.jsonके बजाय SQLite plugin-state rows से पढ़ता है; CLI और doctor output अब उस storage को path नहीं, SQLite store के रूप में label करते हैं। - Memory-core runtime, CLI status, Gateway doctor methods, और plugin SDK
facades अब legacy
.dreams/session-corpusfiles audit या archive नहीं करते। वे files केवल migration inputs हैं; doctor उन्हें SQLite में import करता है और verification के बाद source delete करता है। Active session-ingestion evidence rows अब virtual SQLite pathmemory/session-ingestion/<day>.txtका उपयोग करते हैं; runtime.dreams/session-corpusसे कभी state नहीं लिखता या derive नहीं करता। - Memory-core public artifacts SQLite host events को virtual JSON
artifact
memory/events/memory-host-events.jsonके रूप में expose करते हैं; वे अब legacy.dreams/events.jsonlsource path reuse नहीं करते। - Sandbox container/browser registries अब typed session, image, timestamp,
backend/config, और browser port columns वाली shared
sandbox_registry_entriesSQLite table का उपयोग करते हैं। Doctor legacy monolithic और sharded JSON registry files import करता है और successful sources remove करता है। Runtime reads source of truth के रूप में typed row columns का उपयोग करते हैं;entry_jsonकेवल replay/debug copy है। - Commitments अब whole-store JSON blob के बजाय typed shared
commitmentstable का उपयोग करते हैं। Snapshot saves commitment id से upsert करते हैं और table को clear और reinsert करने के बजाय केवल missing rows delete करते हैं। Runtime commitments को typed scope, delivery-window, status, attempt, और text columns से load करता है;record_jsonकेवल replay/debug copy है। Doctor legacycommitments.jsonimport करता है और successful import के बाद उसे remove करता है। - Cron job definitions, schedule state, और run history में अब runtime
JSON writers या readers नहीं हैं। Runtime typed schedule वाली
cron_jobsrows का उपयोग करता है, payload, डिलीवरी, विफलता-अलर्ट, सत्र, स्थिति, और रनटाइम-स्थिति कॉलम, साथ ही स्थिति, डायग्नोस्टिक्स सारांश, डिलीवरी स्थिति/त्रुटि, सत्र/रन, मॉडल, और टोकन कुलों के लिए टाइप किया हुआcron_run_logsमेटाडेटा।job_jsonकेवल रीप्ले/डीबग कॉपी है;state_jsonनेस्टेड रनटाइम डायग्नोस्टिक्स रखता है जिनके पास अभी हॉट क्वेरी फ़ील्ड नहीं हैं, जबकि रनटाइम टाइप किए हुए कॉलम से हॉट स्थिति फ़ील्ड दोबारा हाइड्रेट करता है। Doctor पुरानेjobs.json,jobs-state.json, औरruns/*.jsonlफ़ाइलें आयात करता है और आयातित स्रोतों को हटाता है। Plugin लक्ष्य राइटबैक पूरे cron स्टोर को लोड करके बदलने के बजाय मेल खाने वालीcron_jobsपंक्तियों को अपडेट करते हैं। - Gateway स्टार्टअप रनटाइम प्रोजेक्शन में पुराने
notify: trueमार्करों को अनदेखा करता है। Doctor उन्हें स्पष्ट SQLite डिलीवरी में बदलता है जबcron.webhookमान्य हो, सेट न होने पर निष्क्रिय मार्कर हटाता है, और कॉन्फ़िगर किया गया webhook अमान्य होने पर उन्हें चेतावनी के साथ सुरक्षित रखता है। - आउटबाउंड और सत्र डिलीवरी कतारें अब कतार स्थिति, एंट्री प्रकार,
सत्र कुंजी, चैनल, लक्ष्य, अकाउंट id, पुनःप्रयास संख्या, अंतिम प्रयास/त्रुटि,
रिकवरी स्थिति, और प्लेटफ़ॉर्म-भेजें मार्करों को साझा
delivery_queue_entriesतालिका में टाइप किए हुए कॉलम के रूप में संग्रहीत करती हैं। रनटाइम रिकवरी उन हॉट फ़ील्ड को टाइप किए हुए कॉलम से पढ़ती है, और पुनःप्रयास/रिकवरी म्यूटेशन रीप्ले JSON दोबारा लिखे बिना उन कॉलम को सीधे अपडेट करते हैं। पूरा JSON payload केवल संदेश बॉडी और अन्य ठंडे रीप्ले डेटा के लिए रीप्ले/डीबग blob के रूप में रहता है। - प्रबंधित आउटगोइंग इमेज रिकॉर्ड अब टाइप की हुई साझा
managed_outgoing_image_recordsपंक्तियों का उपयोग करते हैं, जबकि मीडिया बाइट अभी भीmedia_blobsमें संग्रहीत रहते हैं। JSON रिकॉर्ड केवल रीप्ले/डीबग कॉपी के रूप में रहता है। - Discord मॉडल-पिकर प्राथमिकताएं, कमांड-डिप्लॉय hash, और थ्रेड बाइंडिंग अब साझा SQLite Plugin स्थिति का उपयोग करते हैं। उनकी पुरानी JSON आयात योजनाएं Discord Plugin सेटअप/doctor माइग्रेशन सतह में रहती हैं, core माइग्रेशन कोड में नहीं।
- Plugin पुराने आयात डिटेक्टर doctor-नामित मॉड्यूल जैसे
doctor-legacy-state.tsयाdoctor-state-imports.tsका उपयोग करते हैं; सामान्य चैनल रनटाइम मॉड्यूल पुराने JSON डिटेक्टर आयात नहीं करने चाहिए। - BlueBubbles catchup cursor और inbound dedupe marker अब साझा SQLite Plugin स्थिति का उपयोग करते हैं। उनकी पुरानी JSON आयात योजनाएं BlueBubbles Plugin सेटअप/doctor माइग्रेशन सतह में रहती हैं, core माइग्रेशन कोड में नहीं।
- Telegram अपडेट offset, sticker cache पंक्तियां, sent-message cache पंक्तियां, topic-name cache पंक्तियां, और thread bindings अब साझा SQLite Plugin स्थिति का उपयोग करते हैं। उनकी पुरानी JSON आयात योजनाएं Telegram Plugin सेटअप/doctor माइग्रेशन सतह में रहती हैं, core माइग्रेशन कोड में नहीं।
- iMessage catchup cursor, reply short-id mapping, और sent-echo dedupe पंक्तियां
अब साझा SQLite Plugin स्थिति का उपयोग करती हैं। पुरानी
imessage/catchup/*.json,imessage/reply-cache.jsonl, औरimessage/sent-echoes.jsonlफ़ाइलें केवल doctor इनपुट हैं। - Feishu संदेश dedupe पंक्तियां अब
feishu/dedup/*.jsonफ़ाइलों के बजाय साझा SQLite Plugin स्थिति का उपयोग करती हैं। इसकी पुरानी JSON आयात योजना Feishu Plugin सेटअप/doctor माइग्रेशन सतह में रहती है, core माइग्रेशन कोड में नहीं। - Microsoft Teams बातचीत, poll, लंबित अपलोड buffer, और feedback
learning अब साझा SQLite Plugin स्थिति/blob तालिकाओं का उपयोग करते हैं। लंबित अपलोड
पथ
plugin_blob_entriesका उपयोग करता है ताकि मीडिया buffer base64 JSON के बजाय SQLite BLOB के रूप में संग्रहीत हों। रनटाइम helper नाम अब*-fsfile-store नामकरण के बजाय SQLite/स्थिति नामकरण का उपयोग करते हैं, और पुरानाstorePathshim इन स्टोर से हटा दिया गया है। इसकी पुरानी JSON आयात योजना Microsoft Teams Plugin सेटअप/doctor माइग्रेशन सतह में रहती है। - Zalo hosted outbound media अब
openclaw-zalo-outbound-mediaJSON/bin temp sidecar के बजाय साझा SQLiteplugin_blob_entriesका उपयोग करता है। - Diffs viewer HTML और metadata अब
meta.json/viewer.htmltemp फ़ाइलों के बजाय साझा SQLiteplugin_blob_entriesका उपयोग करते हैं। रेंडर किए गए PNG/PDF आउटपुट temp materializations बने रहते हैं क्योंकि चैनल डिलीवरी को अभी भी फ़ाइल पथ चाहिए। - Canvas प्रबंधित दस्तावेज़ अब डिफ़ॉल्ट
state/canvas/documentsडायरेक्टरी के बजाय साझा SQLiteplugin_blob_entriesका उपयोग करते हैं। Canvas host उन blobs को सीधे serve करता है; स्थानीय फ़ाइलें केवल स्पष्टhost.rootoperator content या अस्थायी materialization के लिए बनाई जाती हैं जब किसी downstream media reader को पथ चाहिए। - File Transfer audit निर्णय अब असीमित
audit/file-transfer.jsonlरनटाइम log के बजाय साझा SQLiteplugin_state_entriesका उपयोग करते हैं। Doctor पुरानी JSONL audit फ़ाइल को Plugin स्थिति में आयात करता है और साफ़ आयात के बाद स्रोत हटा देता है। - ACPX process lease और gateway instance identity अब साझा SQLite Plugin
स्थिति का उपयोग करते हैं। Doctor पुरानी
gateway-instance-idफ़ाइल को Plugin स्थिति में आयात करता है और स्रोत हटा देता है। - ACPX generated wrapper scripts और isolated Codex home OpenClaw temp root के अंतर्गत अस्थायी
materialization हैं, टिकाऊ OpenClaw स्थिति नहीं। टिकाऊ ACPX रनटाइम रिकॉर्ड SQLite lease और gateway-instance पंक्तियां हैं;
पुराना ACPX
stateDirconfig surface हटा दिया गया है क्योंकि अब वहां कोई रनटाइम स्थिति नहीं लिखी जाती। - Gateway media attachments अब canonical byte store के रूप में साझा
media_blobsSQLite तालिका का उपयोग करते हैं। चैनल और sandbox compatibility सतहों को लौटाए गए स्थानीय पथ database row के temp materializations हैं, टिकाऊ media store नहीं। रनटाइम media allowlist में अब पुराने$OPENCLAW_STATE_DIR/mediaया config-dirmediaroot शामिल नहीं हैं; वे डायरेक्टरी केवल doctor आयात स्रोत हैं। - Shell completion अब
$OPENCLAW_STATE_DIR/completions/*cache फ़ाइलें नहीं लिखता। Install, doctor, update, और release smoke पथ टिकाऊ completion cache फ़ाइलों के बजाय generated completion output या profile sourcing का उपयोग करते हैं। - Gateway skill-upload staging अब साझा
skill_uploadsपंक्तियों का उपयोग करता है। Upload metadata, idempotency keys, और archive bytes SQLite में रहते हैं; installer को install चलते समय केवल एक temporary materialized archive path मिलता है। - Subagent inline attachments अब workspace
.openclaw/attachments/*के अंतर्गत materialize नहीं होते। spawn path SQLite VFS seed entries तैयार करता है, inline runs उन entries को per-agent runtime scratch namespace में seed करते हैं, और disk-backed tools attachment paths के लिए उस SQLite scratch को overlay करते हैं। पुराने subagent-run attachment-dir registry columns और cleanup hooks हट गए हैं। - CLI image hydration अब स्थिर
openclaw-cli-imagescache फ़ाइलें बनाए नहीं रखता। External CLI backends अभी भी file paths प्राप्त करते हैं, लेकिन वे paths cleanup के साथ per-run temp materializations होते हैं। - Cache-trace diagnostics, Anthropic payload diagnostics, raw model stream
diagnostics, diagnostics timeline events, और Gateway stability bundles अब
logs/*.jsonlयाlogs/stability/*.jsonफ़ाइलों के बजाय SQLite rows लिखते हैं। Runtime path override flags और env vars हटा दिए गए हैं; export/debug commands database rows से files स्पष्ट रूप से materialize कर सकते हैं। - macOS companion में अब rolling
diagnostics.jsonlwriter नहीं है। App logs unified logging में जाते हैं, और durable Gateway diagnostics SQLite-backed रहते हैं। - macOS port-guardian record list अब Application Support JSON file
या opaque singleton blob के बजाय typed shared SQLite
macos_port_guardian_recordsrows का उपयोग करती है। - Gateway singleton locks अब temp-dir lock files के बजाय
gateway_locksscope के अंतर्गत typed shared SQLitestate_leasesrows का उपयोग करते हैं। Fly और OAuth troubleshooting docs अब stale file-lock cleanup के बजाय SQLite lease/auth refresh lock की ओर संकेत करते हैं। - Gateway restart sentinel state अब
restart-sentinel.jsonके बजाय typed shared SQLitegateway_restart_sentinelrows का उपयोग करती है; runtime sentinel kind, status, routing, message, continuation, और stats को typed columns से पढ़ता है।payload_jsonकेवल replay/debug copy है। Runtime code SQLite row को सीधे clear करता है और अब file cleanup plumbing नहीं रखता। - Gateway restart intent और supervisor handoff state अब
gateway-restart-intent.jsonऔरgateway-supervisor-restart-handoff.jsonsidecars के बजाय typed shared SQLitegateway_restart_intentऔरgateway_restart_handoffrows का उपयोग करते हैं। - Gateway singleton coordination अब
gateway.<hash>.lockfiles लिखने के बजायgateway_locksके अंतर्गत typedstate_leasesrows का उपयोग करता है। lease row lock owner, expiry, heartbeat, और debug payload को own करता है; SQLite atomic acquire/release boundary को own करता है। retired file-lock directory option हट गया है; tests सीधे SQLite row identity का उपयोग करते हैं। - पुराना unreferenced cron usage-report helper, जो
cron/runs/*.jsonlfiles scan करता था, हटा दिया गया। Cron run history reports को typedcron_run_logsSQLite rows पढ़नी चाहिए। - Main-session restart recovery अब
agents/*/sessionsdirectories scan करने के बजाय SQLiteagent_databasesregistry के माध्यम से candidate agents discover करता है। - Gemini session-corruption recovery अब केवल SQLite session row हटाता है;
उसे अब legacy
storePathgate की आवश्यकता नहीं है या derived transcript JSONL path unlink करने की कोशिश नहीं करता। - Path override handling अब literal
undefined/nullenvironment values को unset मानता है, जिससे tests या shell handoff के दौरान accidental repo-rootundefined/state/*.sqlitedatabases रोके जाते हैं। - Config health fingerprints अब
logs/config-health.jsonके बजाय typed shared SQLiteconfig_health_entriesrows का उपयोग करते हैं, जिससे normal config file ही एकमात्र non-credential configuration document रहती है। macOS companion केवल process-local health state रखता है और पुराना JSON sidecar दोबारा नहीं बनाता। - Auth profile runtime अब credential JSON files आयात या लिखता नहीं है। Canonical credential store SQLite है;
auth-profiles.json, per-agentauth.json, और sharedcredentials/oauth.jsondoctor migration inputs हैं जिन्हें import के बाद हटा दिया जाता है। - Auth profile save/state tests अब typed SQLite auth tables को सीधे assert करते हैं और legacy auth-profile filenames का उपयोग केवल doctor migration inputs के लिए करते हैं।
openclaw secrets applyकेवल config file, env file, और SQLite auth-profile store को scrub करता है। यह अब retired per-agentauth.jsonedit करने वाला compatibility logic नहीं रखता; doctor उस file को import और delete करने का मालिक है।- Hermes secret migration plans और applies imported API-key profiles को सीधे
SQLite auth-profile store में डालते हैं। यह अब intermediate target के रूप में
auth-profiles.jsonलिखता या verify नहीं करता। - User-facing auth docs अब users को
auth-profiles.jsoninspect या copy करने को कहने के बजायstate/openclaw.sqlite#table/auth_profile_stores/<agentDir>का वर्णन करते हैं; legacy OAuth/auth JSON नाम केवल doctor-import inputs के रूप में documented रहते हैं। - Core state-path helpers अब retired
credentials/oauth.jsonfile expose नहीं करते। legacy filename doctor auth import path के लिए local है। - Install, security, onboarding, model-auth, और SecretRef docs अब per-agent auth-profile JSON files के बजाय SQLite auth-profile rows और whole-state backup/migration का वर्णन करते हैं।
- PI model discovery अब canonical credentials को in-memory
pi-coding-agentauth storage में pass करता है। यह discovery के दौरान अब per-agentauth.jsoncreate, scrub, या write नहीं करता। - Voice Wake trigger और routing settings अब
settings/voicewake.json,settings/voicewake-routing.json, या opaque generic rows के बजाय typed shared SQLite tables का उपयोग करते हैं; doctor legacy JSON files import करता है और successful migration के बाद उन्हें हटा देता है। - Update-check state अब
update-check.jsonया opaque generic blob के बजाय typed sharedupdate_check_staterow का उपयोग करती है; doctor legacy JSON file import करता है और successful migration के बाद उसे हटा देता है। - Config health state अब
logs/config-health.jsonया opaque generic blob के बजाय typed sharedconfig_health_entriesrows का उपयोग करती है; doctor legacy JSON file import करता है और successful migration के बाद उसे हटा देता है। - Plugin conversation binding approvals अब opaque shared SQLite state या के बजाय typed
plugin_binding_approvalsrows का उपयोग करते हैंplugin-binding-approvals.json; लेगेसी फ़ाइल doctor माइग्रेशन इनपुट है। - सामान्य वर्तमान-वार्तालाप bindings अब
bindings/current-conversations.jsonको फिर से लिखने के बजाय टाइप की हुईcurrent_conversation_bindingsपंक्तियां संग्रहीत करते हैं; doctor लेगेसी JSON फ़ाइल आयात करता है और सफल माइग्रेशन के बाद उसे हटा देता है। - Memory Wiki imported-source sync ledgers अब
.openclaw-wiki/source-sync.jsonको फिर से लिखने के बजाय प्रति vault/source कुंजी एक SQLite plugin-state पंक्ति संग्रहीत करते हैं; migration provider लेगेसी JSON ledger को आयात और हटा देता है। - Memory Wiki ChatGPT import-run रिकॉर्ड अब
.openclaw-wiki/import-runs/*.jsonलिखने के बजाय प्रति vault/run id एक SQLite plugin-state पंक्ति संग्रहीत करते हैं। Rollback snapshots स्पष्ट vault फ़ाइलें बनी रहती हैं जब तक import-run snapshot archival को blob storage में नहीं ले जाया जाता। - Memory Wiki compiled digests अब
.openclaw-wiki/cache/agent-digest.jsonऔर.openclaw-wiki/cache/claims.jsonlलिखने के बजाय SQLite plugin blob पंक्तियां संग्रहीत करते हैं। Migration provider पुरानी cache फ़ाइलें आयात करता है और cache directory खाली होने पर उसे हटा देता है। - ClawHub skill install tracking अब runtime पर
.clawhub/lock.jsonऔर.clawhub/origin.jsonsidecars लिखने या पढ़ने के बजाय प्रति workspace/skill एक SQLite plugin-state पंक्ति संग्रहीत करता है। Runtime code file-shaped lockfile/origin abstractions के बजाय tracked-install state objects का उपयोग करता है। Doctor configured agent workspaces से legacy sidecars आयात करता है और clean import के बाद उन्हें हटा देता है। - Installed plugin index अब
plugins/installs.jsonके बजाय typed shared SQLiteinstalled_plugin_indexsingleton row पढ़ता और लिखता है; legacy JSON फ़ाइल केवल doctor migration input है और import के बाद हटा दी जाती है। - Legacy
plugins/installs.jsonpath helper अब doctor legacy code में रहता है। Runtime plugin-index modules केवल SQLite-backed persistence options expose करते हैं, JSON file path नहीं। - Gateway restart sentinel, restart intent, और supervisor handoff state अब generic
opaque blobs के बजाय typed shared SQLite rows (
gateway_restart_sentinel,gateway_restart_intent, औरgateway_restart_handoff) का उपयोग करते हैं। Runtime restart code में file-shaped sentinel/intent/handoff contract नहीं है। - Matrix sync cache, storage metadata, thread bindings, inbound dedupe markers,
startup verification cooldown state, SDK IndexedDB crypto snapshots,
credentials, और recovery keys अब shared SQLite plugin state/blob
tables का उपयोग करते हैं। Runtime path structs अब
storage-meta.jsonmetadata path expose नहीं करते; वह filename केवल legacy migration input है। उनका legacy JSON import plan Matrix plugin setup/doctor migration surface में रहता है। - Matrix startup अब legacy Matrix file state को scan, report, या complete नहीं करता। Matrix file detection, legacy crypto snapshot creation, room-key restore migration state, import, और source removal सब doctor-owned हैं।
- Matrix runtime migration barrels हटा दिए गए। Legacy state/crypto detection और mutation helpers Matrix doctor द्वारा सीधे import किए जाते हैं, runtime API surface का हिस्सा होने के बजाय।
- Matrix migration snapshot reuse markers अब
matrix/migration-snapshot.jsonके बजाय SQLite plugin state में रहते हैं; doctor अब भी sidecar state file लिखे बिना वही verified pre-migration archive reuse कर सकता है। - Nostr bus cursors और profile publish state अब shared SQLite plugin state का उपयोग करते हैं। उनका legacy JSON import plan Nostr plugin setup/doctor migration surface में रहता है।
- Active Memory session toggles अब
session-toggles.jsonके बजाय shared SQLite plugin state का उपयोग करते हैं; memory को वापस on toggle करने पर JSON object को फिर से लिखने के बजाय row delete होती है। - Skill Workshop proposals और review counters अब per-workspace
skill-workshop/<workspace>.jsonstores के बजाय shared SQLite plugin state का उपयोग करते हैं। हर proposalskill-workshop/proposalsके तहत अलग row है, और review counterskill-workshop/reviewsके तहत अलग row है। - Skill Workshop reviewer subagent runs अब
skill-workshop/<sessionId>.jsonsidecar session paths बनाने के बजाय runtime session transcript resolver का उपयोग करते हैं। - ACPX process leases अब whole-file
process-leases.jsonregistry के बजायacpx/process-leasesके तहत shared SQLite plugin state का उपयोग करते हैं। हर lease अपनी row के रूप में stored है, जिससे runtime JSON rewrite path के बिना startup stale-process reaping सुरक्षित रहती है। - ACPX wrapper scripts और isolated Codex home OpenClaw temp root में generate होते हैं। उन्हें जरूरत के अनुसार फिर बनाया जाता है और वे backup या migration inputs नहीं हैं।
- Subagent run registry persistence typed shared
subagent_runsrows का उपयोग करता है। पुरानाsubagents/runs.jsonpath अब केवल doctor migration input है, और runtime helper names अब state layer को disk-backed के रूप में वर्णित नहीं करते। Runtime tests अब registry behavior साबित करने के लिए invalid या emptyruns.jsonfixtures नहीं बनाते; वे सीधे SQLite rows seed/read करते हैं। - Backup archive करने से पहले state directory stage करता है, non-database files copy करता है,
VACUUM INTOके साथ*.sqlitedatabases snapshot करता है, live WAL/SHM sidecars छोड़ता है, archive manifest में snapshot metadata record करता है, और completed backup runs को archive manifest के साथ SQLite में record करता है।openclaw backup createलिखे गए archive को default रूप से validate करता है;--no-verifyस्पष्ट fast path है। openclaw backup restoreextraction से पहले archive validate करता है, verifier के normalized manifest को reuse करता है, और verified manifest assets को उनके recorded source paths पर restore करता है। यह writes के लिए--yesमांगता है और restore plan के लिए--dry-runsupport करता है।- पुराना backup volatile-path filter delete कर दिया गया है। Backup को अब legacy session या cron JSON/JSONL files के लिए live-tar skip list की जरूरत नहीं है क्योंकि SQLite snapshots archive creation से पहले staged होते हैं।
- Plain setup और onboarding workspace preparation अब
agents/<agentId>/sessions/directories नहीं बनाते। वे केवल config/workspace बनाते हैं; SQLite session rows और transcript rows demand पर per-agent database में बनाए जाते हैं। - Security permission repair अब
sessions.jsonऔर transcript JSONL files के बजाय global और per-agent SQLite databases plus WAL/SHM sidecars को target करता है। - Sandbox registry runtime names अब active store के जरिए legacy JSON registry terminology carrying करने के बजाय SQLite registry kinds को सीधे describe करते हैं।
openclaw reset --scope config+creds+sessionsper-agentopenclaw-agent.sqlitedatabases plus WAL/SHM sidecars हटाता है, केवल legacysessions/directories नहीं।- Gateway aggregate session helpers अब entry-oriented names का उपयोग करते हैं:
loadCombinedSessionEntriesForGateway{ databasePath, entries }return करता है। पुरानी combined-store naming runtime callers से हटा दी गई है। - Docker MCP channel seeding अब
sessions.jsonऔर JSONL transcript बनाने के बजाय main session row और transcript events को per-agent SQLite database में लिखता है। - Bundled session-memory hook अब previous-session context को
SQLite से
{agentId, sessionId}द्वारा resolve करता है। यह अब transcript paths याworkspace/sessionsdirectories को scan, store, या synthesize नहीं करता। - Bundled command-logger hook अब
logs/commands.logमें append करने के बजाय command audit rows को shared SQLitecommand_log_entriestable में लिखता है। - Channel pairing allowlists अब runtime और plugin SDK में केवल SQLite-backed read/write helpers
expose करते हैं। पुराना
*-allowFrom.jsonpath resolver और file reader केवल doctor legacy import code के तहत रहते हैं। migration_runslegacy-state migration executions को status, timestamps, और JSON reports के साथ record करता है।migration_sourcesहर imported legacy file source को hash, size, record count, target table, run id, status, और source-removal state के साथ record करता है।backup_runsbackup archive paths, status, और JSON manifests record करता है।- Global schema unused
agentsregistry table नहीं रखता। Agent database discovery canonicalagent_databasesregistry है जब तक runtime के पास real agent-record owner नहीं होता। - Generated model catalog config agent directory द्वारा keyed typed global SQLite
agent_model_catalogsrows में stored है। Runtime callersensureOpenClawModelCatalogका उपयोग करते हैं; runtime code में कोईmodels.jsoncompatibility API नहीं है। Implementation SQLite लिखता है और embedded PI registry उस stored payload से hydrated होता है,models.jsonfile बनाए बिना। - QMD session transcript markdown export और
memory.qmd.sessionsconfig हटा दिए गए। कोई QMD transcript collection नहीं है, कोईqmd/sessions*runtime path नहीं है, और कोई file-backed session memory bridge नहीं है। - Memory-core runtime SQLite transcript indexing helpers को
openclaw/plugin-sdk/memory-core-host-engine-session-transcriptsसे import करता है, QMD SDK subpath से नहीं। QMD subpath external callers के लिए compatibility re-export रखता है केवल तब तक जब तक major SDK cleanup उसे हटा नहीं सकता। - QMD का अपना
index.sqliteअब main SQLiteplugin_blob_entriestable द्वारा backed temp runtime materialization है। Runtime अब durable~/.openclaw/agents/<agentId>/qmdsidecar नहीं बनाता। - Optional
memory-lancedbplugin अब~/.openclaw/memory/lancedbको implicit OpenClaw-managed store के रूप में नहीं बनाता। यह एक external LanceDB backend है और तब तक disabled रहता है जब तक operator explicitdbPathconfigure नहीं करता। check:database-first-legacy-storesनए runtime source को fail करता है जो legacy store names को write-style filesystem APIs के साथ pair करता है। यह उस runtime source को भी fail करता है जो retired transcript bridge markerstranscriptLocatorयाsqlite-transcript://...को फिर से introduce करता है। Migration, doctor, import, और explicit non-session export code allowed रहते हैं। Broader legacy contract names जैसेsessionFile,storePath, और पुरानेSessionManagerfile-era facades के अभी current owners हैं और required preflight check बनने से पहले उन्हें separate migration guard work चाहिए। Guard अब runtimecache/*.jsonstores, genericthread-bindings.jsonsidecars, cron state/run-log JSON, config health JSON, restart और lock sidecars, Voice Wake settings, plugin binding approvals, installed plugin index JSON, File Transfer audit JSONL, Memory Wiki activity logs, पुराने bundledcommand-loggertext log, और pi-mono raw-stream JSONL diagnostics knobs को भी cover करता है। यह पुराने root-level doctor legacy module names को भी ban करता है ताकि compatibility codesrc/commands/doctor/के तहत रहे। Android debug handlers भीcamera_debug.logयाdebug_logs.txtcache files stage करने के बजाय logcat/in-memory output का उपयोग करते हैं।
लक्ष्य स्कीमा संरचना
स्कीमा स्पष्ट रखें। होस्ट-स्वामित्व वाली रनटाइम स्थिति टाइप की गई टेबलों का उपयोग करती है। 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)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, topic, environment, distribution, token_debug_suffix, updated_at_ms)node_host_config(config_key, version, node_id, token, display_name, gateway_host, gateway_port, gateway_tls, gateway_tls_fingerprint, 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)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, 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)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_run_logs(store_key, job_id, seq, ts, status, error, summary, diagnostics_summary, delivery_status, delivery_error, delivered, session_id, session_key, run_id, run_at_ms, duration_ms, next_run_at_ms, model, provider, total_tokens, entry_json, created_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(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)भविष्य की खोज कैनॉनिकल इवेंट टेबलों को बदले बिना FTS टेबल जोड़ सकती है:
transcript_events_fts(session_id, seq, text)vfs_entries_fts(namespace, path, text)बड़े मानों को JSON स्ट्रिंग एन्कोडिंग नहीं, बल्कि blob कॉलम का उपयोग करना चाहिए। छोटे संरचित डेटा के लिए
value_json रखें, जिसे सामान्य SQLite टूलिंग से निरीक्षण योग्य बने रहना चाहिए।
agent_databases इस ब्रांच के लिए कैनॉनिकल रजिस्ट्री है। जब तक कोई वास्तविक एजेंट-रिकॉर्ड स्वामी मौजूद न हो,
agents टेबल न जोड़ें; एजेंट कॉन्फ़िगरेशन
openclaw.json में ही रहता है।
डॉक्टर माइग्रेशन संरचना
डॉक्टर को एक स्पष्ट माइग्रेशन चरण कॉल करना चाहिए जो रिपोर्ट किया जा सके और दोबारा चलाने के लिए सुरक्षित हो:
openclaw doctor --fixopenclaw doctor --fix सामान्य कॉन्फ़िगरेशन प्रीफ्लाइट के बाद स्थिति माइग्रेशन कार्यान्वयन को आमंत्रित करता है और इम्पोर्ट से पहले एक सत्यापित बैकअप बनाता है। रनटाइम
स्टार्टअप और openclaw migrate को लेगेसी OpenClaw स्थिति फ़ाइलें इम्पोर्ट नहीं करनी चाहिए।
माइग्रेशन गुण:
- एक माइग्रेशन पास सभी लेगेसी फ़ाइल स्रोतों को खोजता है और कुछ भी बदलने से पहले एक योजना बनाता है।
- डॉक्टर लेगेसी फ़ाइलें इम्पोर्ट करने से पहले एक सत्यापित प्री-माइग्रेशन बैकअप आर्काइव बनाता है।
- इम्पोर्ट idempotent होते हैं और स्रोत पथ, mtime, आकार, हैश, और लक्ष्य टेबल से की किए जाते हैं।
- सफल स्रोत फ़ाइलों को लक्ष्य डेटाबेस के कमिट होने के बाद हटाया या आर्काइव किया जाता है।
- असफल इम्पोर्ट स्रोत को अनछुआ छोड़ते हैं और
migration_runsमें चेतावनी रिकॉर्ड करते हैं। - माइग्रेशन मौजूद होने के बाद रनटाइम कोड केवल SQLite पढ़ता है।
- किसी डाउनग्रेड/एक्सपोर्ट-टू-रनटाइम-फ़ाइल्स पथ की आवश्यकता नहीं है।
माइग्रेशन इन्वेंटरी
इन्हें वैश्विक डेटाबेस में ले जाएँ:
- टास्क रजिस्ट्री रनटाइम राइट्स अब साझा डेटाबेस का उपयोग करते हैं; अनशिप्ड
tasks/runs.sqliteसाइडकार इंपोर्टर हटा दिया गया है। स्नैपशॉट सेव टास्क id के आधार पर अपसर्ट करते हैं और केवल अनुपस्थित टास्क/डिलीवरी पंक्तियां हटाते हैं। - Task Flow रनटाइम राइट्स अब साझा डेटाबेस का उपयोग करते हैं; अनशिप्ड
tasks/flows/registry.sqliteसाइडकार इंपोर्टर हटा दिया गया है। स्नैपशॉट सेव flow id के आधार पर अपसर्ट करते हैं और केवल अनुपस्थित flow पंक्तियां हटाते हैं। - Plugin स्टेट रनटाइम राइट्स अब साझा डेटाबेस का उपयोग करते हैं; अनशिप्ड
plugin-state/state.sqliteसाइडकार इंपोर्टर हटा दिया गया है। - बिल्टइन मेमोरी सर्च अब डिफ़ॉल्ट रूप से
memory/<agentId>.sqliteका उपयोग नहीं करता; इसकी इंडेक्स टेबल्स मालिक एजेंट डेटाबेस में रहती हैं, और स्पष्टmemorySearch.store.pathसाइडकार ऑप्ट-इन को doctor कॉन्फिग माइग्रेशन में रिटायर कर दिया गया है। - बिल्टइन मेमोरी रीइंडेक्स एजेंट डेटाबेस में केवल मेमोरी-स्वामित्व वाली टेबल्स रीसेट करता है। इसे पूरी SQLite फ़ाइल को नहीं बदलना चाहिए, क्योंकि वही डेटाबेस सेशंस, ट्रांसक्रिप्ट्स, VFS पंक्तियां, आर्टिफैक्ट्स, और रनटाइम कैशेज का मालिक है।
- मोनोलिथिक और शार्डेड JSON से sandbox कंटेनर/ब्राउज़र रजिस्ट्रियां। रनटाइम राइट्स अब साझा डेटाबेस का उपयोग करते हैं; legacy JSON इंपोर्ट बना रहता है।
- Cron जॉब परिभाषाएं, शेड्यूल स्टेट, और रन हिस्ट्री अब साझा SQLite का उपयोग करते हैं;
doctor legacy
jobs.json,jobs-state.json, औरcron/runs/*.jsonlफ़ाइलों को इंपोर्ट/हटाता है - डिवाइस आइडेंटिटी/auth, push, अपडेट चेक, commitments, OpenRouter मॉडल कैश, इंस्टॉल्ड Plugin इंडेक्स, और app-server bindings
- डिवाइस/node pairing और bootstrap records अब टाइप्ड SQLite टेबल्स का उपयोग करते हैं
- Device-pair नोटिफिकेशन subscribers और delivered-request markers अब
device-pair-notify.jsonके बजाय साझा SQLite plugin-state टेबल का उपयोग करते हैं। - Voice-call कॉल रिकॉर्ड्स अब
calls.jsonlके बजायvoice-call/callsnamespace के तहत साझा SQLite plugin-state टेबल का उपयोग करते हैं; Plugin CLI SQLite-backed कॉल हिस्ट्री को tail और summarize करता है। - QQBot Gateway सेशंस, known-user records, और ref-index quote cache अब
session-*.json,known-users.json, औरref-index.jsonlके बजायqqbotnamespaces (sessions,known-users,ref-index) के तहत SQLite Plugin state का उपयोग करते हैं; QQBot doctor/setup migration legacy फ़ाइलों को इंपोर्ट और हटाता है। - Discord model-picker preferences, command-deploy hashes, और thread bindings
अब
model-picker-preferences.json,command-deploy-cache.json, औरthread-bindings.jsonके बजायdiscordnamespaces (model-picker-preferences,command-deploy-hashes,thread-bindings) के तहत SQLite Plugin state का उपयोग करते हैं; Discord doctor/setup migration इंपोर्ट करता है और legacy फ़ाइलों को हटाता है। - BlueBubbles catchup cursors और inbound dedupe markers अब
bluebubbles/catchup/*.jsonऔरbluebubbles/inbound-dedupe/*.jsonके बजायbluebubblesnamespaces (catchup-cursors,inbound-dedupe) के तहत SQLite Plugin state का उपयोग करते हैं; BlueBubbles doctor/setup migration legacy फ़ाइलों को इंपोर्ट और हटाता है। - Telegram update offsets, sticker cache entries, reply-chain message cache
entries, sent-message cache entries, topic-name cache entries, और thread
bindings अब
update-offset-*.json,sticker-cache.json,*.telegram-messages.json,*.telegram-sent-messages.json,*.telegram-topic-names.json, औरthread-bindings-*.jsonके बजायtelegramnamespaces (update-offsets,sticker-cache,message-cache,sent-messages,topic-names,thread-bindings) के तहत SQLite Plugin state का उपयोग करते हैं; Telegram doctor/setup migration इंपोर्ट करता है और legacy फ़ाइलों को हटाता है। - iMessage catchup cursors, reply short-id mappings, और sent-echo dedupe rows
अब
imessage/catchup/*.json,imessage/reply-cache.jsonl, औरimessage/sent-echoes.jsonlके बजायimessagenamespaces (catchup-cursors,reply-cache,sent-echoes) के तहत SQLite Plugin state का उपयोग करते हैं; iMessage doctor/setup migration legacy फ़ाइलों को इंपोर्ट और हटाता है। - Microsoft Teams conversations, polls, SSO tokens, और feedback learnings अब
msteams-conversations.json,msteams-polls.json,msteams-sso-tokens.json, और*.learnings.jsonके बजाय SQLite Plugin state namespaces (conversations,polls,sso-tokens,feedback-learnings) का उपयोग करते हैं; Microsoft Teams doctor/setup migration legacy फ़ाइलों को इंपोर्ट और archive करता है। Pending uploads एक short-lived SQLite cache हैं और पुरानी JSON cache files migrate नहीं की जातीं। - Matrix sync cache, storage metadata, thread bindings, inbound dedupe markers,
startup verification cooldown state, credentials, recovery keys, और SDK
IndexedDB crypto snapshots अब
matrix(sync-store,storage-meta,thread-bindings,inbound-dedupe,startup-verification,credentials,recovery-key,idb-snapshots) के तहत SQLite Plugin state/blob namespaces का उपयोग करते हैं,bot-storage.json,storage-meta.json,thread-bindings.json,inbound-dedupe.json,startup-verification.json,credentials.json,recovery-key.json, औरcrypto-idb-snapshot.jsonके बजाय; Matrix doctor/setup migration account-scoped Matrix storage roots से उन legacy फ़ाइलों को इंपोर्ट और हटाता है। - Nostr bus cursors और profile publish state अब
bus-state-*.jsonऔरprofile-state-*.jsonके बजायnostrnamespaces (bus-state,profile-state) के तहत SQLite Plugin state का उपयोग करते हैं; Nostr doctor/setup migration legacy फ़ाइलों को इंपोर्ट और हटाता है। - Active Memory session toggles अब
session-toggles.jsonके बजायactive-memory/session-togglesके तहत SQLite Plugin state का उपयोग करते हैं। - Skill Workshop proposal queues और review counters अब
per-workspace
skill-workshop/<workspace>.jsonfiles के बजायskill-workshop/proposalsऔरskill-workshop/reviewsके तहत SQLite Plugin state का उपयोग करते हैं। - Outbound delivery और session delivery queues अब durable
delivery-queue/*.json,delivery-queue/failed/*.json, औरsession-delivery-queue/*.jsonfiles के बजाय अलग-अलग queue names (outbound-delivery,session-delivery) के तहत global SQLitedelivery_queue_entriestable साझा करते हैं। doctor legacy-state step pending और failed rows को इंपोर्ट करता है, stale delivered markers हटाता है, और import के बाद पुरानी JSON files हटाता है। Hot routing और retry fields typed columns हैं; JSON payload केवल replay/debug के लिए रखा गया है। - ACPX process leases अब
process-leases.jsonके बजायacpx/process-leasesके तहत SQLite Plugin state का उपयोग करते हैं। - Backup और migration run metadata
इन्हें agent databases में ले जाएं:
- Agent session roots और compatibility-shaped session-entry payloads। रनटाइम राइट्स के लिए पूरा:
hot session metadata
sessionsमें queryable है, जबकि legacy-shaped पूराSessionEntrypayloadsession_entriesमें रहता है। - Agent transcript events। रनटाइम राइट्स के लिए पूरा।
- Compaction checkpoints और transcript snapshots। रनटाइम राइट्स के लिए पूरा:
checkpoint transcript copies SQLite transcript rows हैं और checkpoint
metadata
transcript_snapshotsमें रिकॉर्ड किया जाता है। Gateway checkpoint helpers अब इन values को source files के बजाय transcript snapshots के रूप में नाम देते हैं। - Agent VFS scratch/workspace namespaces। रनटाइम VFS राइट्स के लिए पूरा।
- Subagent attachment payloads। रनटाइम राइट्स के लिए पूरा: वे SQLite VFS seed entries हैं और कभी durable workspace files नहीं होते।
- Tool artifacts। रनटाइम राइट्स के लिए पूरा।
- Run artifacts। per-agent
run_artifactstable के माध्यम से worker runtime writes के लिए पूरा। - Agent-local runtime caches। per-agent
cache_entriestable के माध्यम से worker runtime scoped cache writes के लिए पूरा। Gateway-wide model caches global database में रहते हैं जब तक वे agent-specific नहीं बन जाते। - ACP parent stream logs। रनटाइम राइट्स के लिए पूरा।
- ACP replay ledger sessions। रनटाइम राइट्स के लिए पूरा
acp_replay_sessionsऔरacp_replay_eventsके माध्यम से; legacyacp/event-ledger.jsonकेवल doctor input के रूप में रहता है। - ACP session metadata। रनटाइम राइट्स के लिए पूरा
acp_sessionsके माध्यम से; legacyentry.acpblocks insessions.jsonकेवल doctor migration input हैं। - Trajectory sidecars जब वे explicit export files नहीं हैं। रनटाइम
राइट्स के लिए पूरा: trajectory capture agent-database
trajectory_runtime_eventsrows लिखता है और run-scoped artifacts को SQLite में mirror करता है। Legacy sidecars केवल doctor import inputs हैं; export fresh JSONL support-bundle outputs materialize कर सकता है लेकिन runtime पर पुराने trajectory/transcript sidecars को read या migrate नहीं करता। Runtime trajectory capture SQLite scope expose करता है; JSONL path helpers export/debug support तक isolated हैं और runtime module से re-export नहीं किए जाते। Embedded-runner trajectory metadata transcript locator persist करने के बजाय{agentId, sessionId, sessionKey}identity record करता है।
इनको फिलहाल file-backed रखें:
openclaw.json- provider या CLI credential files
- plugin/package manifests
- user workspaces और Git repositories जब disk mode selected हो
- operator tailing के लिए intended logs, जब तक कोई specific log surface moved न हो
Migration Plan
Phase 0: Freeze The Boundary
और rows move करने से पहले durable-state boundary को explicit बनाएं:
- global database में
migration_runstable जोड़ें। legacy-state migration execution reports के लिए पूरा। - file-to-database import के लिए single doctor-owned state migration service जोड़ें।
पूरा:
openclaw doctor --fixlegacy-state migration implementation का उपयोग करता है। planको read-only बनाएं औरapplyसे backup create, import, verify, और फिर old files delete या quarantine करवाएं। पूरा: doctor verified pre-migration backup create करता है, backup path कोmigration_runsमें pass करता है, और importer/removal paths reuse करता है।- Static bans जोड़ें ताकि new runtime code legacy state files न लिख सके जबकि migration code और tests अभी भी उन्हें seed/read कर सकें। currently migrated legacy stores के लिए पूरा; guard forbidden runtime transcript locator contracts के लिए nested tests भी scan करता है।
Phase 1: Finish The Global Control Plane
shared coordination state को state/openclaw.sqlite में रखें:
- Agents और agent database registry
- Task और Task Flow ledgers
- Plugin state
- Sandbox container/browser registry
- Cron/scheduler run history
- Pairing, device, push, update-check, TUI, OpenRouter/model caches, और other small gateway-scoped runtime state
- Backup और migration metadata
- Gateway media attachment bytes। रनटाइम राइट्स के लिए पूरा; direct file paths
channel senders और sandbox staging के साथ compatibility के लिए temp materializations हैं। Runtime allowlists SQLite materialization paths accept करते हैं, legacy
state/config media roots नहीं। Doctor legacy media files को
media_blobsमें import करता है और successful row writes के बाद source files हटाता है। - Debug proxy capture sessions, events, और payload blobs। पूरा: captures
shared state DB में रहते हैं और shared state DB bootstrap, schema,
WAL, और busy-timeout settings के माध्यम से open होते हैं। Payload bytes
capture_blobs.dataमें gzip-compressed हैं; कोई debug proxy runtime sidecar DB override, blob directory, या proxy-capture-only generated schema/codegen target नहीं है। Doctor/startup migration shippeddebug-proxy/capture.sqliterows और referenced payload blobs को import करता है, जिसमें active legacy DB/blob environment overrides भी शामिल हैं, फिर CA certificates intact रखते हुए उन sources को archive करता है।
यह phase उन subsystems से duplicate sidecar openers, permission helpers, WAL setup, filesystem pruning, और compatibility writers भी delete करता है।
Phase 2: Introduce Per-Agent Databases
एक database per agent create करें और global DB से उसे register करें:
~/.openclaw/state/openclaw.sqlite~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqliteglobal agent_databases row path, schema version, last-seen
timestamp, और basic size/integrity metadata store करता है। Runtime code file paths सीधे derive करने के बजाय
agent DB के लिए registry से पूछता है।
agent DB owns:
sessionsको canonical session root के रूप में, जिसमेंsession_entriesउस root से जुड़ी compatibility-shaped payload table है, औरsession_routesunique activesession_keylookup हैconversationsऔरsession_conversationsको sessions से जुड़ी normalized provider routing identity के रूप मेंtranscript_events- transcript snapshots और compaction checkpoints. runtime writes के लिए पूर्ण.
vfs_entriestool_artifactsऔर run artifacts- agent-local runtime/cache rows. worker scoped caches के लिए पूर्ण.
- ACP parent stream events
- trajectory runtime events जब वे explicit export artifacts नहीं हैं
चरण 3: Session Store APIs बदलें
runtime के लिए पूर्ण. file-shaped session store surface active runtime contract नहीं है:
- Runtime अब
loadSessionStore(storePath)को call नहीं करता याstorePathको session identity नहीं मानता. - Runtime row operations हैं
getSessionEntry,upsertSessionEntry,patchSessionEntry,deleteSessionEntry, औरlistSessionEntries. - Whole-store rewrite helpers, file writers, queue tests, alias pruning, और legacy-key deletion parameters runtime से हटा दिए गए हैं.
- Deprecated root-package compatibility exports अभी भी canonical
sessions.jsonpaths को SQLite row APIs पर adapt करते हैं. sessions.jsonparsing केवल doctor migration/import code और doctor tests में बची है.- Runtime lifecycle fallback SQLite transcript headers पढ़ता है, JSONL first lines नहीं.
ऐसी किसी भी चीज़ को हटाते रहें जो file-lock parameters, pruning/truncation-as-file-maintenance vocabulary, store-path identity, या ऐसे tests फिर से लाती हो जिनका केवल assertion JSON persistence है.
चरण 4: Transcripts, ACP Streams, Trajectories, और VFS स्थानांतरित करें
हर agent data stream को database-native बनाएं:
- Transcript append writes एक SQLite transaction से गुजरते हैं जो
session header सुनिश्चित करता है, message idempotency जांचता है, parent tail चुनता है,
transcript_eventsमें insert करता है, और queryable identity metadata कोtranscript_event_identitiesमें record करता है. direct transcript message appends और normal persistedTranscriptSessionManagerappends के लिए पूर्ण; explicit branch operations अपना explicit parent choice रखते हैं और फिर भी कोई file locator derive किए बिना SQLite rows लिखते हैं. - ACP parent stream logs rows बनते हैं,
.acp-stream.jsonlfiles नहीं. पूर्ण. - ACP spawn setup अब transcript JSONL paths persist नहीं करता. पूर्ण.
- Runtime trajectory capture event rows/artifacts सीधे लिखता है. explicit support/export command अभी भी support-bundle JSONL artifacts को export format के रूप में बना सकता है, लेकिन session export session JSONL को दोबारा नहीं बनाता. पूर्ण.
- Disk workspaces configured disk mode में disk पर ही रहते हैं.
- VFS scratch और experimental VFS-only workspace mode agent DB का उपयोग करते हैं.
migration पुराने JSONL files को एक बार import करता है, counts/hashes को
migration_runs में record करता है, और integrity checks के बाद imported files हटाता है.
चरण 5: Backup, Restore, Vacuum, और Verify
Backups एक archive file ही रहते हैं:
- हर global और agent database को checkpoint करें.
- हर DB को SQLite backup semantics या
VACUUM INTOसे snapshot करें. - compact DB snapshots, config, external credentials, और requested workspace exports को archive करें.
- raw live
*.sqlite-walऔर*.sqlite-shmfiles छोड़ दें. - हर DB snapshot खोलकर और
PRAGMA integrity_checkचलाकर verify करें.openclaw backup createdefault रूप से यह archive verification करता है;--no-verifyकेवल post-write archive pass छोड़ता है, snapshot creation integrity check नहीं. - Restore snapshots को उनके target paths पर वापस copy करता है. यह branch
unshipped SQLite layout को
user_version = 1पर reset करता है; भविष्य के shipped schema changes जरूरत पड़ने पर explicit migrations जोड़ सकते हैं.
चरण 6: Worker Runtime
database split land होने तक worker mode को experimental रखें:
- Workers को agent id, run id, filesystem mode, और DB registry identity मिलती है.
- हर worker अपना SQLite connection खोलता है.
- Parent channel delivery, approvals, config, और cancellation authority रखता है.
- हर active run के लिए एक worker से शुरू करें; lifecycle और DB connection ownership stable होने के बाद ही pooling जोड़ें.
चरण 7: पुरानी दुनिया हटाएं
runtime session management के लिए पूर्ण. पुरानी दुनिया केवल explicit doctor input या support/export output के रूप में अनुमत है:
- कोई runtime
sessions.json, transcript JSONL, sandbox registry JSON, task sidecar SQLite, या plugin-state sidecar SQLite writes नहीं. - कोई JSON/session file pruning, file transcript truncation, session file locks, या lock-shaped session tests नहीं.
- कोई runtime compatibility exports नहीं जिनका उद्देश्य पुराने session files को current रखना है.
- Explicit support exports user-requested archive/materialization formats बने रहते हैं और file names को runtime identity में वापस feed नहीं करना चाहिए.
Backup और Restore
Backups एक archive file होने चाहिए, लेकिन database capture SQLite-native होना चाहिए:
- लंबे समय तक चलने वाली write activity रोकें या एक छोटा backup barrier enter करें.
- हर global और agent database के लिए checkpoint चलाएं.
- SQLite backup semantics या
VACUUM INTOका उपयोग करके हर database को temporary backup directory में snapshot करें. - compacted database snapshots, config file, credentials directory, selected workspaces, और manifest को archive करें.
- हर included SQLite snapshot खोलकर और
PRAGMA integrity_checkचलाकर archive verify करें.openclaw backup createdefault रूप से यह करता है;--no-verifyकेवल post-write archive pass को जानबूझकर skip करने के लिए है.
primary backup format के रूप में raw live *.sqlite, *.sqlite-wal, और *.sqlite-shm copies पर
निर्भर न रहें. archive manifest में database role,
agent id, schema version, source path, snapshot path, byte size, और integrity
status record होना चाहिए.
Restore को archive snapshots से global database और agent database files को फिर से बनाना चाहिए. क्योंकि SQLite layout अभी shipped नहीं हुआ है, यह refactor केवल version-1 schema और doctor file-to-database import रखता है. restore command पहले archive validate करता है, फिर verified extracted payload से हर manifest asset replace करता है.
Runtime Refactor Plan
-
database registry APIs जोड़ें.
- global DB और per-agent DB paths resolve करें.
- unshipped schemas को
user_version = 1पर रखें; shipped schema को जरूरत पड़ने तक schema migration runner code न जोड़ें. - tests, backup, और doctor द्वारा उपयोग किए जाने वाले close/checkpoint/integrity helpers जोड़ें.
-
sidecar SQLite stores collapse करें.
- plugin state tables को global database में move करें. runtime writes के लिए पूर्ण; unshipped legacy sidecar importer delete कर दिया गया है.
- task registry tables को global database में move करें. runtime writes के लिए पूर्ण; unshipped legacy sidecar importer delete कर दिया गया है.
- Task Flow tables को global database में move करें. runtime writes के लिए पूर्ण; unshipped legacy sidecar importer delete कर दिया गया है.
- builtin memory-search tables को हर agent database में move करें. पूर्ण; explicit
custom
memorySearch.store.pathअब doctor config migration द्वारा remove किया जाता है. Full reindex केवल memory tables के विरुद्ध in place चलता है; पुराना whole-file swap path और sidecar index swap helper delete कर दिए गए हैं. - उन subsystems से duplicate database openers, WAL setup, permission helpers, और close paths हटाएं.
-
agent-owned tables को per-agent databases में move करें.
- global database registry के माध्यम से demand पर agent DB create करें. पूर्ण.
- runtime session entries, transcript events, VFS rows, और tool artifacts को agent DBs में move करें. पूर्ण.
- branch-local shared-DB session entries, transcript events, VFS rows, या tool artifacts migrate न करें; वह layout कभी shipped नहीं हुआ. केवल legacy file-to-database import doctor में रखें.
-
session store APIs बदलें.
storePathको runtime identity के रूप में हटाएं. runtime के लिए पूर्ण औरcheck:database-first-legacy-storesद्वारा guarded: session metadata, route updates, command persistence, CLI session cleanup, Feishu reasoning previews, transcript-state persistence, subagent depth, auth profile session overrides, parent-fork logic, और QA-lab inspection अब canonical agent/session keys से database resolve करते हैं. Gateway/TUI/UI/macOS session-list responses अब legacypathके बजायdatabasePathexpose करते हैं; macOS debug surfacessession.storeconfig लिखने के बजाय per-agent database को read-only state के रूप में दिखाते हैं./status, chat-driven trajectory export, और CLI dependency proxies अब legacy store paths propagate नहीं करते; transcript usage fallback SQLite को agent/session identity से पढ़ता है. Runtime और bridge tests अबstorePathexpose नहीं करते; doctor/migration inputs उस legacy field name के owner हैं. Gateway combined-session loading में अब non-templatedsession.storevalues के लिए special runtime branch नहीं है; यह per-agent SQLite rows aggregate करता है. legacy session-lock doctor lane और उसका.jsonl.lockcleanup helper remove कर दिया गया; SQLite अब session concurrency boundary है. Hot runtime call sitesresolveSessionRowEntryजैसे row-oriented helper names का उपयोग करते हैं; पुरानाresolveSessionStoreEntrycompatibility alias runtime और plugin SDK exports से हटाया गया है.
{ agentId, sessionKey }row operations का उपयोग करें. पूर्ण:getSessionEntry,upsertSessionEntry,deleteSessionEntry,patchSessionEntry, औरlistSessionEntriesSQLite-first APIs हैं जिन्हें session store path की जरूरत नहीं है. Status summary, local agent status, health, औरopenclaw sessionslisting command अब per-agent rows सीधे पढ़ते हैं औरsessions.jsonpaths के बजाय per-agent SQLite database paths दिखाते हैं.- Whole-store delete/insert को
upsertSessionEntry,deleteSessionEntry,listSessionEntries, और SQL cleanup queries से बदलें. runtime के लिए पूर्ण: hot paths अब row APIs और conflict-retried row patches का उपयोग करते हैं; remaining whole-store import/replace helpers migration import code और SQLite backend tests तक सीमित हैं.store-writer.tsऔर writer-queue tests delete करें. पूर्ण.- session row upserts/patches से runtime legacy-key pruning और alias-delete parameters delete करें. पूर्ण.
- runtime JSON registry behavior delete करें.
- sandbox registry reads और writes को SQLite-only बनाएं. पूर्ण.
- monolithic और sharded JSON को केवल migration step से import करें. पूर्ण.
- sharded registry locks और JSON writes remove करें. पूर्ण.
- registry rows को generic opaque JSON के रूप में store करने के बजाय एक typed registry table रखें यदि shape hot-path operational state बनी रहती है. पूर्ण.
-
file-lock-shaped session mutation delete करें.
- runtime lock creation और runtime lock APIs के लिए पूर्ण.
- standalone legacy
.jsonl.lockdoctor cleanup lane remove कर दी गई है. session.writeLockdoctor-migrated legacy config है, typed runtime setting नहीं.- State integrity में अब अलग orphan transcript-file pruning path नहीं है; doctor migration legacy JSONL sources को एक जगह import/remove करता है.
- Gateway singleton coordination typed SQLite
state_leasesrows का उपयोगgateway_locksके अंतर्गत करता है और अब file-lock directory seam expose नहीं करता. - Generic plugin SDK dedupe persistence अब file locks या JSON files का उपयोग नहीं करता; यह shared SQLite plugin-state rows लिखता है. पूर्ण.
- QMD embed coordination
qmd/embed.lockके बजाय SQLite state lease का उपयोग करता है. पूर्ण.
-
workers को database-aware बनाएं.
- Workers अपने SQLite connections खोलते हैं.
- Parent delivery, channel callbacks, और config own करता है.
- Worker को agent id, run id, filesystem mode, और DB registry identity मिलती है, live handles नहीं.
vfs-onlyexperimental रहता है और agent database को अपने storage root के रूप में उपयोग करता है.- पहले हर active run के लिए एक worker रखें. Pooling तब तक wait कर सकता है जब तक DB connection lifetime और cancellation behavior सामान्य न हो जाए.
-
बैकअप एकीकरण।
- बैकअप को SQLite बैकअप या
VACUUM INTOके ज़रिए वैश्विक और एजेंट डेटाबेस के स्नैपशॉट लेना सिखाएँ। स्टेट एसेट के अंतर्गत खोजी गई*.sqliteफ़ाइलों के लिए पूरा। - SQLite अखंडता और स्कीमा संस्करण के लिए बैकअप सत्यापन जोड़ें। बैकअप निर्माण और डिफ़ॉल्ट आर्काइव सत्यापन अखंडता जाँचों के लिए पूरा।
- बैकअप रन मेटाडेटा SQLite में रिकॉर्ड करें। आर्काइव पथ, स्थिति, और मेनिफ़ेस्ट JSON वाली साझा
backup_runsतालिका के ज़रिए पूरा। - सत्यापित आर्काइव स्नैपशॉट से रिस्टोर जोड़ें। पूरा:
openclaw backup restoreएक्सट्रैक्शन से पहले सत्यापित करता है, सत्यापक के सामान्यीकृत मेनिफ़ेस्ट का उपयोग करता है,--dry-runका समर्थन करता है, और रिकॉर्ड किए गए स्रोत पथों को बदलने से पहले--yesआवश्यक करता है। - VFS/वर्कस्पेस निर्यात केवल अनुरोध किए जाने पर शामिल करें; सत्र इंटरनल्स को JSON या JSONL के रूप में निर्यात न करें।
- बैकअप को SQLite बैकअप या
-
अप्रचलित टेस्ट और कोड हटाएँ। ज्ञात रनटाइम सत्र सतहों के लिए पूरा।
-
वे टेस्ट हटाएँ जो
sessions.jsonया ट्रांसक्रिप्ट JSONL फ़ाइलों के रनटाइम निर्माण का दावा करते हैं। कोर सत्र स्टोर, चैट, Gateway ट्रांसक्रिप्ट इवेंट, प्रीव्यू, लाइफ़साइकल, कमांड सत्र-एंट्री अपडेट, ऑटो-रिप्लाई रीसेट/ट्रेस, और memory-core dreaming फ़िक्स्चर, अप्रूवल टार्गेट रूटिंग, सत्र ट्रांसक्रिप्ट मरम्मत, सुरक्षा अनुमति मरम्मत, ट्रैजेक्टरी निर्यात, और सत्र निर्यात के लिए पूरा। Active-memory ट्रांसक्रिप्ट टेस्ट अब SQLite स्कोप और अस्थायी या स्थायी JSONL फ़ाइल निर्माण न होने का दावा करते हैं। पुराना heartbeat ट्रांसक्रिप्ट-प्रूनिंग रिग्रेशन हटा दिया गया क्योंकि रनटाइम अब JSONL ट्रांसक्रिप्ट को काटता नहीं है। एजेंट सत्र-सूची टूल टेस्ट अब Gateway प्रतिक्रिया आकार के रूप में पुरानेsessions.jsonपथों को मॉडल नहीं करते; ऐप/UI/macOS टेस्टdatabasePathका उपयोग करते हैं।/statusट्रांसक्रिप्ट-उपयोग टेस्ट अब JSONL फ़ाइलें लिखने के बजाय सीधे SQLite ट्रांसक्रिप्ट पंक्तियाँ सीड करते हैं। Gateway सत्र लाइफ़साइकल टेस्ट अब सीधे SQLite ट्रांसक्रिप्ट सीडिंग हेल्पर उपयोग करते हैं; पुराना एक-पंक्ति सत्र-फ़ाइल फ़िक्स्चर आकार रीसेट और डिलीट कवरेज से हट गया है।sessions.deleteअब फ़ाइल-युग काarchived: []फ़ील्ड नहीं लौटाता; डिलीशन केवल पंक्ति म्यूटेशन परिणाम रिपोर्ट करता है। पुरानाdeleteTranscriptविकल्प भी हट गया है: सत्र हटाने से कैनॉनिकलsessionsरूट हटता है और SQLite को सत्र-स्वामित्व वाली ट्रांसक्रिप्ट, स्नैपशॉट, और ट्रैजेक्टरी पंक्तियों को cascade करने देता है, इसलिए कोई कॉलर ट्रांसक्रिप्ट अनाथ नहीं छोड़ सकता या क्लीनअप शाखा भूल नहीं सकता। Context-engine ट्रैजेक्टरी कैप्चर टेस्ट अबsession.trajectory.jsonlपढ़ने के बजाय अलग-थलग एजेंट डेटाबेस सेtrajectory_runtime_eventsपंक्तियाँ पढ़ते हैं। Docker MCP चैनल सीड स्क्रिप्ट अब सीधे SQLite पंक्तियाँ सीड करती हैं। सीधेsessions.jsonलिखना केवल doctor फ़िक्स्चर तक सीमित है। Tool Search Gateway E2Eagents/<agentId>/sessions/*.jsonlफ़ाइलें स्कैन करने के बजाय SQLite ट्रांसक्रिप्ट पंक्तियों से tool-call प्रमाण पढ़ता है। Memory-core होस्ट इवेंट और session-corpus स्क्रैच पंक्तियाँ अब साझा SQLite plugin-state में रहती हैं;events.jsonlऔरsession-corpus/*.txtकेवल legacy doctor माइग्रेशन इनपुट हैं। सक्रिय पंक्तियाँmemory/session-ingestion/वर्चुअल पथ उपयोग करती हैं, न कि.dreams/session-corpus। पुराना memory-core dreaming मरम्मत मॉड्यूल और उसके CLI/Gateway टेस्ट हटा दिए गए क्योंकि रनटाइम अब उस corpus के लिए फ़ाइल आर्काइव मरम्मत का स्वामी नहीं है। Memory-core bridge/public-artifact टेस्ट अब.dreams/events.jsonlसतह पर नहीं लाते; वे SQLite-समर्थित वर्चुअल JSON आर्टिफ़ैक्ट नाम का उपयोग करते हैं। सार्वजनिक SDK/Codex टेस्टिंग डॉक्स अब सत्र फ़ाइलों के बजाय SQLite सत्र स्टेट कहते हैं, और channel-turn उदाहरण अबstorePathआर्ग्युमेंट नहीं दिखाता। Matrix sync स्टेट अब सीधे SQLite plugin-state स्टोर उपयोग करता है। सक्रिय क्लाइंट/रनटाइम कॉन्ट्रैक्टbot-storage.jsonपथ नहीं, बल्कि अकाउंट स्टोरेज रूट पास करते हैं, और doctor स्रोत हटाने से पहले legacybot-storage.jsonको SQLite में इंपोर्ट करता है। QA Matrix रीस्टार्ट/destructive scenarios अब नकलीbot-storage.jsonफ़ाइलें बनाने या हटाने के बजाय सीधे SQLite sync पंक्ति बदलते हैं, और E2EE सब्सट्रेट नकलीsync-store.jsonपथ के बजाय sync-store रूट पास करता है। Matrix storage-root चयन अब legacy sync/thread JSON फ़ाइलों से रूट्स को स्कोर नहीं करता; यह टिकाऊ रूट मेटाडेटा और वास्तविक crypto स्टेट का उपयोग करता है। रनटाइम SQLite सत्र बैकएंड टेस्ट सूट अबsessions.jsonनहीं गढ़ता; legacy स्रोत फ़िक्स्चर अब उन doctor टेस्ट में रहते हैं जो उन्हें इंपोर्ट करते हैं। Gateway सत्र टेस्ट अबcreateSessionStoreDirहेल्पर या अनुपयोगी अस्थायी session-store पथ सेटअप उजागर नहीं करते; फ़िक्स्चर डायरेक्टरी स्पष्ट हैं, और सीधा पंक्ति सेटअप SQLite session-row नामकरण उपयोग करता है। Doctor-only JSON5 session-store पार्सर कवरेज infra टेस्ट से doctor माइग्रेशन टेस्ट में चला गया, इसलिए रनटाइम टेस्ट सूट अब legacy session-file पार्सिंग के स्वामी नहीं हैं। Microsoft Teams रनटाइम SSO/pending-upload टेस्ट अब JSON sidecar फ़िक्स्चर या पार्सर नहीं रखते; legacy SSO token पार्सिंग केवल Plugin माइग्रेशन मॉड्यूल में रहती है। Telegram टेस्ट अब नकली/tmp/*.jsonस्टोर पथ सीड नहीं करते; वे SQLite-समर्थित message cache को सीधे रीसेट करते हैं। जेनेरिक OpenClaw test-state हेल्पर अब legacyauth-profiles.jsonwriter उजागर नहीं करता; doctor auth माइग्रेशन टेस्ट उस फ़िक्स्चर के स्थानीय स्वामी हैं। TUI last-session pointers, exec approvals, active-memory toggles, Matrix dedupe/startup verification, Memory Wiki source sync, current-conversation bindings, onboarding auth, और Hermes secret imports के रनटाइम टेस्ट अब पुरानी sidecar फ़ाइलें नहीं बनाते या पुराने फ़ाइलनाम अनुपस्थित होने का दावा नहीं करते। वे SQLite पंक्तियों और सार्वजनिक store APIs के ज़रिए व्यवहार सिद्ध करते हैं; doctor/migration टेस्ट ही वह जगह हैं जहाँ legacy स्रोत फ़ाइलनाम होने चाहिए। device/node pairing, channel allowFrom, restart intents, restart handoff, session delivery queue entries, config health, iMessage caches, cron jobs, PI transcript headers, subagent registries, और managed image attachments के रनटाइम टेस्ट भी अब retired JSON/JSONL फ़ाइलें केवल यह सिद्ध करने के लिए नहीं बनाते कि उन्हें अनदेखा किया गया है या वे अनुपस्थित हैं। PI overflow recovery में अब SessionManager rewrite/truncation fallback नहीं है: tool-result truncation और context-engine transcript rewrites SQLite transcript पंक्तियाँ बदलते हैं, फिर डेटाबेस से सक्रिय prompt state refresh करते हैं। Persisted SessionManager message appends parent selection और idempotency के लिए atomic SQLite transcript append helper को delegate करते हैं। सामान्य metadata/custom entry appends भी SQLite के अंदर वर्तमान parent चुनते हैं, इसलिए stale manager instances pre-SQLite parent-chain races को फिर से जीवित नहीं करते। Synthetic PI tail cleanup for mid-turn prechecks औरsessions_yieldअब सीधे SQLite transcript state trim करता है; पुराना SessionManager tail-removal bridge और उसके टेस्ट हटा दिए गए हैं। Compaction checkpoint capture भी केवल SQLite से snapshots लेता है; callers अब alternate transcript source के रूप में live SessionManager पास नहीं करते। -
केवल माइग्रेशन के लिए legacy फ़ाइलें सीड करने वाले टेस्ट रखें।
-
सक्रिय रनटाइम सतहों के लिए JSON-file proof को SQL row proof से बदल दिया गया है।
-
legacy session/cache JSON पथों पर रनटाइम writes के लिए static bans जोड़ें। repo guard के लिए पूरा।
- माइग्रेशन रिपोर्ट को audit योग्य बनाएँ।
- माइग्रेशन runs को SQLite में started/finished timestamps, source
paths, source hashes, counts, warnings, और backup path के साथ रिकॉर्ड
करें।
पूरा: legacy-state माइग्रेशन executions अब source path/table inventory,
source file SHA-256, sizes, record counts, warnings, और backup path के साथ
migration_runsरिपोर्ट persist करते हैं। पूरा: legacy-state माइग्रेशन executions source-level audit और future skip/backfill decisions के लिएmigration_sourcesपंक्तियाँ भी persist करते हैं। - apply को idempotent बनाएँ। partial import के बाद दोबारा चलाने पर या तो पहले से imported source skip होना चाहिए या stable key से merge होना चाहिए। पूरा: session indexes, transcripts, delivery queues, plugin state, task ledgers, और agent-owned global SQLite rows stable keys या upsert/replace semantics के ज़रिए import होते हैं, इसलिए reruns durable rows को duplicate किए बिना merge करते हैं।
- असफल imports को मूल source file अपनी जगह रखनी चाहिए।
पूरा: असफल transcript imports अब original JSONL source को उसके detected
path पर छोड़ते हैं, और
migration_sourcessource को अगले doctor run के लिएwarningके रूप मेंremoved_source=0के साथ record करता है।
- माइग्रेशन runs को SQLite में started/finished timestamps, source
paths, source hashes, counts, warnings, और backup path के साथ रिकॉर्ड
करें।
पूरा: legacy-state माइग्रेशन executions अब source path/table inventory,
source file SHA-256, sizes, record counts, warnings, और backup path के साथ
प्रदर्शन नियम
- प्रति thread/process एक connection ठीक है; workers के बीच handles share न करें।
- WAL,
foreign_keys=ON, 30s busy timeout, और छोटेBEGIN IMMEDIATEwrite transactions उपयोग करें। - write transaction helpers को synchronous रखें जब तक/जब तक कोई async transaction API explicit mutex/backpressure semantics न जोड़ दे।
- parent delivery writes को छोटा और transactional रखें।
- whole-store rewrites से बचें; row-level upsert/delete उपयोग करें।
- hot code स्थानांतरित करने से पहले list-by-agent, list-by-session, updated-at, run id, और expiration paths के लिए indexes जोड़ें।
- बड़े artifacts, media, और vectors को base64 या numeric-array JSON नहीं, बल्कि BLOBs या chunked BLOB rows के रूप में store करें।
- opaque plugin-state entries को छोटा और scoped रखें।
- filesystem pruning के बजाय TTL/expiration के लिए SQL cleanup जोड़ें। database-owned runtime stores के लिए पूरा: media, plugin state, plugin blobs, persistent dedupe, और agent cache सभी SQLite rows के ज़रिए expire होते हैं। शेष filesystem cleanup अस्थायी materializations या explicit removal commands तक सीमित है।
Static Bans
legacy state paths पर नए runtime writes को fail करने वाला repo check जोड़ें:
sessions.json- साकार किए गए support-bundle आउटपुट को छोड़कर
*.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.jsonworkspace-state.json- Matrix
credentials*.jsonऔरrecovery-key.json cron/runs/*.jsonlcron/jobs.jsonjobs-state.jsondevice-pair-notify.jsondevices/pending.jsondevices/paired.jsondevices/bootstrap.jsonnodes/pending.jsonnodes/paired.jsonidentity/device.jsonidentity/device-auth.jsonpush/web-push-subscriptions.jsonpush/vapid-keys.jsonpush/apns-registrations.jsonprocess-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 - sandbox registry shard JSON फ़ाइलें
- native hook relay
/tmpbridge JSON फ़ाइलें plugin-state/state.sqlite- तदर्थ
openclaw-state.sqliteरनटाइम sidecars tasks/runs.sqlitetasks/flows/registry.sqlitebindings/current-conversations.jsonrestart-sentinel.jsongateway-restart-intent.jsongateway-supervisor-restart-handoff.jsongateway.<hash>.lockqmd/embed.lockcommands.logconfig-health.jsonport-guard.jsonsettings/voicewake.jsonsettings/voicewake-routing.jsonplugin-binding-approvals.jsonplugins/installs.jsonaudit/file-transfer.jsonlaudit/crestodian.jsonlcrestodian/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 - Browser प्रोफ़ाइल सजावट
.openclaw-profile-decorated SessionManager.open(...)फ़ाइल-समर्थित सेशन ओपनरSessionManager.listAll(...)औरTranscriptSessionManager.listAll(...)ट्रांसक्रिप्ट सूचीकरण facadesSessionManager.forkFromSession(...)औरTranscriptSessionManager.forkFromSession(...)ट्रांसक्रिप्ट fork facadesSessionManager.newSession(...)औरTranscriptSessionManager.newSession(...)परिवर्तनीय सेशन प्रतिस्थापन facadesSessionManager.createBranchedSession(...)औरTranscriptSessionManager.createBranchedSession(...)branch-session facades
प्रतिबंध को परीक्षणों को legacy fixtures बनाने की अनुमति देनी चाहिए और migration कोड को legacy फ़ाइल स्रोतों को पढ़ने/import/remove करने की अनुमति देनी चाहिए। अनशिप्ड SQLite sidecars प्रतिबंधित ही रहते हैं और उन्हें doctor import allowances नहीं मिलतीं।
पूर्णता मानदंड
- रनटाइम डेटा और कैश राइट वैश्विक या एजेंट SQLite डेटाबेस में जाते हैं।
- रनटाइम अब सेशन इंडेक्स, ट्रांसक्रिप्ट JSONL, sandbox registry JSON, task sidecar SQLite, या plugin-state sidecar SQLite नहीं लिखता। अनशिप्ड task और plugin-state sidecar SQLite importers हटाए जाते हैं।
- Legacy फ़ाइल import केवल doctor में है।
- Backup compact SQLite snapshots और integrity proof के साथ एक archive बनाता है।
- Agent workers disk, VFS scratch, या experimental VFS-only storage के साथ चल सकते हैं।
- Config और स्पष्ट credential फ़ाइलें ही एकमात्र अपेक्षित persistent non-database control फ़ाइलें रहती हैं।
- Repo checks legacy runtime file stores को फिर से लाने से रोकते हैं।