Get started
Refactor van toestand met database als uitgangspunt
Database-First State-refactor
Besluit
Gebruik een SQLite-indeling met twee niveaus:
- Globale database:
~/.openclaw/state/openclaw.sqlite - Agentdatabase: één SQLite-database per agent voor agentbeheerde werkruimte, transcript, VFS, artifact en grote runtime-state per agent
- Configuratie blijft bestandsgebaseerd:
openclaw.jsonblijft buiten de database. Runtime-authprofielen verhuizen naar SQLite; externe provider- of CLI-referentiebestanden blijven door de eigenaar beheerd buiten de database van OpenClaw.
De globale database is de control-plane-database. Deze beheert agentdetectie, gedeelde Gateway-state, koppeling, apparaat-/node-state, taak- en flowgrootboeken, Plugin state, scheduler-runtime-state, back-upmetadata en migratiestate.
De agentdatabase is de data-plane-database. Deze beheert de sessiemetadata van de agent, de transcript-eventstream, VFS-werkruimte of scratch-namespace, tool artifacts, run-artifacts en doorzoekbare/indexeerbare agentlokale cachedata.
Dit geeft één duurzame globale weergave zonder grote agentwerkruimten, transcripten en binaire scratchdata in de gedeelde Gateway-schrijfbaan te dwingen.
Hard Contract
Deze migratie heeft één canonieke runtime-vorm:
- Sessierijen bewaren alleen sessiemetadata. Ze mogen geen
transcriptLocator, transcriptbestandspaden, naastliggende JSONL-paden, lockpaden, pruning-metadata of compatibiliteitspointers uit het bestandstijdperk bewaren. - Transcriptidentiteit is altijd SQLite-identiteit:
{agentId, sessionId}plus optionele topicmetadata waar het protocol die nodig heeft. sqlite-transcript://...is geen runtime- of protocolidentiteit. Nieuwe code mag geen transcriptlocators afleiden, bewaren, doorgeven, parsen of migreren. Runtime en tests mogen helemaal geen pseudolocators bevatten; docs mogen de tekenreeks alleen vermelden om die te verbieden.- Legacy
sessions.json, transcript-JSONL,.jsonl.lock, pruning, truncation en oude sessiepadlogica horen alleen in het doctor-migratie-/importpad. - Legacy sessieconfiguratie-aliassen horen alleen in doctor-migratie. Runtime
interpreteert
session.idleMinutes,session.resetByType.dmof cross-agentagent:main:*main-session-aliassen voor een andere geconfigureerde agent niet. - Sessierouteringsidentiteit is getypte relationele state. Hot runtime- en UI-paden
moeten
sessions.session_scope,sessions.account_id,sessions.primary_conversation_id,conversationsensession_conversationslezen; ze mogensession_keyniet parsen ofsession_entries.entry_jsondoorzoeken op provideridentiteit, behalve als compatibiliteitsschaduw terwijl oude callsites worden verwijderd. - Channel-level direct-message-markeringen zoals
dmversusdirectzijn routeringsvocabulaire, geen transcriptlocators of compatibiliteitshandles voor bestandsopslag. - Legacy hookhandlerconfiguratie hoort alleen in doctor-waarschuwings-/migratiesurfaces.
Runtime mag
hooks.internal.handlersniet laden; hooks draaien alleen via ontdekte hookdirectories enHOOK.md-metadata. - Runtime-opstart, hot reply-paden, Compaction, reset, herstel, diagnostics,
TTS, memory hooks, subagents, Plugin-commandoroutering, protocolgrenzen en
hooks moeten
{agentId, sessionId}door de runtime doorgeven. - Tests moeten SQLite-transcriptrijen seeden en asserten via
{agentId, sessionId}. Tests die alleen JSONL-paddoorsturen, behoud van door de caller aangeleverde locator of transcriptbestandcompatibiliteit bewijzen, moeten worden verwijderd tenzij ze doctor-import, niet-sessiegebonden support-/debugmaterialisatie of protocolvorm dekken. runEmbeddedPiAgent(...), voorbereide workerruns en de interne embedded poging mogen geen transcriptlocators accepteren. Ze openen de SQLite-transcriptmanager via{agentId, sessionId}en geven die manager door aan de geïnternaliseerde PI-compatibele agentsessie, zodat verouderde callers de runner geen JSON/JSONL-transcripten kunnen laten schrijven.- Runnerdiagnostics moeten runtime-/cache-/payload-tracerecords in SQLite opslaan. Runtime-diagnostics mogen geen JSONL-bestandsoverrideknoppen of generieke exporthelpers voor transcript-JSONL blootstellen; gebruikersgerichte exports kunnen expliciete artifacts uit databaserijen materialiseren zonder bestandsnamen terug de runtime in te voeren.
- Raw stream logging gebruikt
OPENCLAW_RAW_STREAM=1plus SQLite-diagnosticsrijen. Het oude pi-monoPI_RAW_STREAM,PI_RAW_STREAM_PATHenraw-openai-completions.jsonl-bestandsloggercontract maakt geen deel uit van OpenClaw-runtime of tests. - QMD-geheugenindexering mag SQLite-transcripten niet naar markdownbestanden exporteren. QMD indexeert alleen geconfigureerde geheugenbestanden; zoekfunctionaliteit voor sessietranscripten blijft SQLite-backed.
- Het QMD SDK-subpad is alleen voor QMD voor nieuwe code. SQLite-indexeringshelpers
voor sessietranscripten staan op
memory-core-host-engine-session-transcripts; elke QMD-re-export is alleen compatibiliteit en mag niet door runtimecode worden gebruikt. - Ingebouwde geheugenindexen leven in de database van de eigenaar-agent. Runtimeconfiguratie en
opgeloste runtimecontracten mogen
memorySearch.store.pathniet blootstellen; doctor verwijdert die legacy config key en huidige code geeft intern de agentdatabasePathdoor.
Implementatiewerk moet code blijven verwijderen totdat deze uitspraken waar zijn zonder uitzonderingen buiten doctor-/import-/export-/debuggrenzen.
Doelstatus en voortgang
Hard doel
- Eén globale SQLite-database beheert control-plane-state:
state/openclaw.sqlite. - Eén SQLite-database per agent beheert data-plane-state:
agents/<agentId>/agent/openclaw-agent.sqlite. - Config blijft bestandsgebaseerd.
openclaw.jsonmaakt geen deel uit van deze database-refactor. - Legacy bestanden zijn alleen doctor-migratie-inputs.
- Runtime schrijft of leest nooit sessie- of transcript-JSONL als actieve state.
Doelstatussen
not-started: runtimecode uit het bestandstijdperk schrijft nog actieve state.migrating: doctor-/importcode kan bestandsdata naar SQLite verplaatsen.dual-read: tijdelijke brug leest zowel SQLite als legacy bestanden. Deze status is verboden voor deze refactor tenzij die expliciet als alleen-doctor is gedocumenteerd.sqlite-runtime: runtime leest en schrijft alleen SQLite.clean: legacy runtime-API's en tests zijn verwijderd, en de guard voorkomt regressies.done: docs, tests, back-up, doctor-migratie en gewijzigde checks bewijzen de clean state.
Huidige status
- Sessies:
cleanvoor runtime. Sessierijen leven in de database per agent, runtime-API's gebruiken{agentId, sessionId}of{agentId, sessionKey}, ensessions.jsonis legacy input alleen voor doctor. - Transcripten:
cleanvoor runtime. Transcript-events, identiteiten, snapshots en trajectory-runtime-events leven in de database per agent. Runtime accepteert geen transcriptlocators of JSONL-transcriptpaden meer. - PI embedded runner:
clean. Embedded PI-runs, voorbereide workers, Compaction en retryloops gebruiken SQLite-sessiescope en weigeren verouderde transcripthandles. - Cron:
cleanvoor runtime. Runtime gebruiktcron_jobsencron_run_logs; runtime-tests gebruiken SQLite-storeKey-naamgeving, en cronpaden uit het bestandstijdperk blijven alleen in doctor-legacy-migratietests. - Taakregister:
clean. Runtime-rijen voor taak en Task Flow leven instate/openclaw.sqlite; niet-uitgebrachte sidecar-SQLite-importers zijn verwijderd. - Plugin state:
clean. Plugin state-/blobrijen leven in de gedeelde globale database; oude sidecar-SQLite-helpers voor Plugin state worden bewaakt. - Geheugen:
sqlite-runtimevoor ingebouwd geheugen en indexering van sessietranscripten. Geheugenindextabellen leven in de database per agent, Plugin-geheugenstate gebruikt gedeelde Plugin state-rijen, en legacy geheugenbestanden zijn doctor-migratie-inputs of gebruikerswerkruimtecontent. - Back-up:
sqlite-runtime. Back-upstages comprimeren SQLite-snapshots, laten live WAL/SHM-sidecars weg, verifiëren SQLite-integriteit en registreren back-upruns in de globale database. - Doctor-migratie:
migrating, opzettelijk. Doctor importeert legacy JSON, JSONL en uitgefaseerde sidecarstores naar SQLite, registreert migratieruns/-bronnen en verwijdert geslaagde bronnen. - E2E-scripts:
cleanvoor runtime-dekking. Docker MCP-seeding schrijft SQLite-rijen. Het runtime-context-Docker-script maakt legacy JSONL alleen binnen de doctor-migratieseed en benoemt het legacy sessie-indexpad expliciet.
Resterend werk
- [x] Hernoem cron runtime-test-storevariabelen weg van
storePath, tenzij ze doctor legacy inputs zijn. Bestanden: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. Bewijs:pnpm check:database-first-legacy-stores;rg -n 'storePath' src/cron --glob '!**/commands/doctor/**'. - [x] Verwijder of hernoem verouderde exporttestmocks uit het bestandstijdperk.
Bestand:
src/auto-reply/reply/commands-export-test-mocks.ts. Bewijs:rg -n 'resolveSessionFilePath|sessionFile|storePath|transcriptLocator' src/auto-reply/reply. - [x] Maak de Docker runtime-context legacy JSONL-seed duidelijk doctor-only.
Bestand:
scripts/e2e/session-runtime-context-docker-client.ts. Bewijs:rg -n 'sessions\\.json|sessionFile|\\.jsonl' scripts/e2e/session-runtime-context-docker-client.tstoont alleenseedBrokenLegacySessionForDoctorMigration. - [x] Houd Kysely-gegenereerde types uitgelijnd na elke schemawijziging.
Bestanden:
src/state/openclaw-state-schema.sql,src/state/openclaw-agent-schema.sql,src/state/*generated*. Bewijs: geen schemawijziging in deze pass;pnpm db:kysely:check;pnpm lint:kysely. - [x] Draai gerichte tests opnieuw voor aangeraakte stores, commands en scripts.
Bewijs:
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] Voer vóór het verklaren van
donede changed gate of remote brede proof uit. Bewijs:pnpm check:changed --timed -- <changed extension paths>geslaagd op Hetzner Crabbox-runrun_3f1cabf6b25cna tijdelijke Node 24-/pnpm-setup en expliciete padrouting voor de gesynchroniseerde werkruimte zonder.git.
Niet terugvallen
- Geen transcriptlocators.
- Geen actieve sessiebestanden.
- Geen nep-JSONL-testfixtures behalve doctor-legacy-migratietests.
- Geen raw SQLite-toegang waar Kysely wordt verwacht.
- Geen nieuwe legacy DB-migraties. Deze indeling is niet uitgebracht; houd de schemaversie
op
1tenzij er een sterke reden is.
Code-Read-aannames
Geen vervolgproductbeslissingen blokkeren dit plan. De implementatie moet doorgaan met deze aannames:
- Gebruik
node:sqliterechtstreeks en vereis de Node 22+-runtime voor dit opslagpad. - Houd precies één normaal configuratiebestand. Verplaats config, pluginmanifests of Git-workspaces niet naar SQLite in deze refactor.
- Runtime-compatibiliteitsbestanden zijn niet vereist. Verouderde JSON- en JSONL-bestanden zijn alleen migratie-invoer. De branch-lokale SQLite-sidecars zijn nooit uitgebracht en worden verwijderd in plaats van geïmporteerd.
openclaw doctor --fixis eigenaar van de migratiestap van verouderde bestanden naar de database. Runtime-startup enopenclaw migratemogen geen verouderde OpenClaw-database-upgradepaden bevatten.- Compatibiliteit van referenties volgt dezelfde regel: runtimereferenties leven in SQLite. Oude
auth-profiles.json, per-agentauth.jsonen gedeeldecredentials/oauth.json-bestanden zijn doctor-migratie-invoer en worden na import verwijderd. - Gegenereerde modelcatalogusstatus wordt door de database ondersteund. Runtimecode mag geen
agents/<agentId>/agent/models.jsonschrijven; bestaandemodels.json-bestanden zijn verouderde doctor-invoer en worden verwijderd na import inagent_model_catalogs. - Runtime mag transcriptlocators niet migreren, normaliseren of overbruggen. Actieve transcriptidentiteit is
{agentId, sessionId}in SQLite. Bestandspaden zijn alleen verouderde doctor-invoer, ensqlite-transcript://...moet verdwijnen uit runtime-, protocol-, hook- en pluginoppervlakken in plaats van als grenshandle te worden behandeld. - Runtime SQLite-transcriptlezingen voeren geen oude JSONL entry-shape-migraties uit en herschrijven geen volledige transcripts voor compatibiliteit. Verouderde entry-normalisatie blijft in expliciete doctor-/importhulpprogramma's. Doctor normaliseert verouderde JSONL-transcriptbestanden voordat SQLite-rijen worden ingevoegd; huidige runtimerijen zijn al geschreven in het huidige transcriptschema. Trajectory-/sessie-export leest die rijen zoals ze zijn en mag geen verouderde migraties tijdens export uitvoeren.
- Verouderde parse-/migratiehelpers voor transcript-JSONL zijn alleen voor doctor. Runtimecode voor transcriptindeling bouwt alleen huidige SQLite-transcriptcontext; doctor is eigenaar van oude JSONL-entry-upgrades voordat rijen worden ingevoegd.
- De oude runtime-eigen JSONL-helper voor transcriptstreaming is verwijderd. Doctor-importcode is eigenaar van expliciete lezingen van verouderde bestanden; runtime-sessiegeschiedenis leest SQLite-rijen.
- Codex app-server-bindings gebruiken de OpenClaw
sessionIdals de canonieke sleutel in de Codex plugin-state-namespace.sessionKeyis metadata voor routering/weergave en mag de duurzame sessie-id niet vervangen of transcriptbestandsidentiteit opnieuw introduceren. - Context-engines ontvangen het huidige runtimecontract rechtstreeks. Het register mag engines niet omwikkelen met retry-shims die
sessionKey,transcriptScopeofpromptverwijderen; engines die de huidige database-first parameters niet kunnen accepteren, moeten duidelijk falen in plaats van te worden overbrugd. - Back-upuitvoer moet één archiefbestand blijven. Database-inhoud moet dat archief ingaan als compacte SQLite-snapshots, niet als ruwe live WAL-sidecars.
- Transcriptzoeken is nuttig maar niet vereist voor de eerste database-first stap. Ontwerp het schema zodat FTS later kan worden toegevoegd.
- Worker-uitvoering moet experimenteel blijven achter instellingen terwijl de databasegrens stabiliseert.
Bevindingen uit codelezing
De huidige branch is de proof-of-conceptfase al voorbij. De gedeelde database bestaat, Node node:sqlite is via een kleine runtimehelper aangesloten, en eerdere stores schrijven nu naar state/openclaw.sqlite of de eigenaarsdatabase openclaw-agent.sqlite.
Het resterende werk is niet SQLite kiezen; het is de nieuwe grens schoon houden en alle compatibiliteitsvormige interfaces verwijderen die nog lijken op de oude bestandswereld:
- Sessie-
storePathis niet langer een runtime-identiteit, testfixtureshape of statuspayloadveld. Runtime- en bridgetests bevatten de contractnaamstorePathniet meer; doctor-/migratiecode is eigenaar van die verouderde woordenschat. - Sessieschrijfacties lopen niet langer via de oude in-process
store-writer.ts-wachtrij. SQLite-patchschrijfacties gebruiken in plaats daarvan conflictdetectie en begrensde retries. - Verouderde paddetectie heeft nog geldige migratietoepassingen, maar runtimecode moet stoppen met
sessions.jsonen transcript-JSONL-bestanden te behandelen als mogelijke schrijfdoelen. - Agent-eigen tabellen leven in per-agent SQLite-databases. De globale DB bewaart registry-/control-plane-rijen; transcriptidentiteit is
{agentId, sessionId}in de per-agent transcriptrijen. Runtimecode mag geen transcriptbestandspaden persistent maken of transcriptlocators migreren. - Doctor importeert al verschillende verouderde bestanden. De cleanup is om daarvan één expliciete migratie-implementatie te maken die doctor aanroept, met een duurzaam migratierapport.
Geen aanvullende productvragen blokkeren de implementatie.
Huidige codevorm
De branch heeft al een echte gedeelde SQLite-basis:
- De runtime-ondergrens is nu Node 22+:
package.json, de CLI-runtimecontrole, installerstandaarden, macOS-runtimezoeker, CI en openbare installatiedocs zijn allemaal consistent. De oude Node 22-compatibiliteitslane is verwijderd. src/state/openclaw-state-db.tsopentopenclaw.sqlite, stelt WAL in,synchronous=NORMAL,busy_timeout=30000,foreign_keys=ON, en past de gegenereerde schemamodule toe die is afgeleid vansrc/state/openclaw-state-schema.sql.- Kysely-tabeltypen en runtimeschemamodules worden gegenereerd vanuit wegwerpbare
SQLite-databases die uit de gecommitte
.sql-bestanden zijn gemaakt; runtimecode bewaart niet langer gekopieerde schemastrings voor globale, per-agent- of proxy capture-databases. - Runtimestores leiden geselecteerde en ingevoegde rijtypen af van die gegenereerde
Kysely-
DB-interfaces in plaats van SQLite-rijvormen handmatig te schaduwen. Raw SQL blijft beperkt tot schematoepassing, pragma's en alleen-migratie-DDL. - De SQLite-schema's zijn teruggebracht tot
user_version = 1omdat deze databaselay-out nog niet is uitgebracht. Runtime-openers maken alleen het huidige schema aan; import van bestand naar database blijft in doctor-code, en branchlokale database-upgradehelpers zijn verwijderd. - Relationeel eigendom wordt afgedwongen waar de eigendomsgrens canoniek is:
bronmigratierijen cascaderen vanuit
migration_runs, taakafleveringsstatus cascadeert vanuittask_runs, en transcriptidentiteitsrijen cascaderen vanuit transcriptgebeurtenissen. - Huidige gedeelde tabellen omvatten
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_runsenbackup_runs. - Willekeurige Plugin-eigen status krijgt geen host-eigen getypeerde tabellen.
Geinstalleerde plugins gebruiken
plugin_state_entriesvoor geversioneerde JSON-payloads enplugin_blob_entriesvoor bytes, met namespace/key-eigendom, TTL-opschoning, back-up en Plugin-migratierecords. Host-eigen Plugin-orkestratiestatus kan nog steeds getypeerde tabellen hebben wanneer de host eigenaar is van het querycontract, zoalsplugin_binding_approvals. - Plugin-migraties zijn datamigraties over Plugin-eigen namespaces, geen
hostschemamigraties. Een Plugin kan zijn eigen geversioneerde status/blob-entries
migreren via een migratieprovider, en de host registreert bron-/runstatus in
het normale migratielogboek. Nieuwe Plugin-installaties vereisen geen wijziging
van
openclaw-state-schema.sql, tenzij de host zelf eigenaar wordt van een nieuw cross-Plugin-contract. src/state/openclaw-agent-db.tsopentagents/<agentId>/agent/openclaw-agent.sqlite, registreert de database in de globale DB, en beheert agentlokale sessie-, transcript-, VFS-, artefact-, cache- en geheugenindextabellen. Gedeelde runtime-discovery leest nu het gegenereerd-getypeerdeagent_databases-register in plaats van die query op elke callsite opnieuw te implementeren.- Globale en per-agent-databases registreren een
schema_meta-rij met databaserol, schemaversie, tijdstempels en agent-id voor agentdatabases. De lay-out blijft nog steeds opuser_version = 1omdat dit SQLite-schema nog niet is uitgebracht. - Per-agent-sessie-identiteit heeft nu een canonieke
sessions-roottabel met sleutelsession_id, metsession_key,session_scope,account_id,primary_conversation_id, tijdstempels, weergavevelden, modelmetadata, harness-id en parent/spawn-koppeling als querybare kolommen.session_routesis de unieke actieve route-index vansession_keynaar de huidigesession_id, zodat een routesleutel naar een nieuwe duurzame sessie kan verhuizen zonder dat hot reads moeten kiezen tussen dubbelesessions.session_key-rijen. De oude compatibiliteitsvormige payloadsession_entries.entry_jsonhangt via een foreign key aan de duurzamesession_id-root; dit is niet langer de enige schemaniveau-representatie van een sessie. - Per-agent-externe gespreksidentiteit is ook relationeel:
conversationsslaat genormaliseerde provider-/account-/gespreksidentiteit op, ensession_conversationskoppelt een OpenClaw-sessie aan een of meer externe gesprekken. Dit dekt gedeelde hoofd-DM-sessies waarbij meerdere peers bewust aan een sessie kunnen worden gekoppeld zonder te liegen insession_key. SQLite dwingt ook uniciteit af voor de natuurlijke provideridentiteit, zodat dezelfde channel/account/kind/peer/thread-tuple niet over gespreks-id's kan vertakken. Gedeelde hoofd-directe peers worden gekoppeld met eenparticipant-rol, zodat een OpenClaw-sessie meerdere externe DM-peers kan vertegenwoordigen zonder oudere peers te degraderen tot vage gerelateerde rijen.sessions.primary_conversation_idwijst nog steeds naar het huidige getypeerde afleverdoel. Gesloten routing-/statuskolommen worden afgedwongen met SQLite-CHECK-constraints in plaats van alleen op TypeScript-unions te vertrouwen. Runtime-sessieprojectie wist compatibiliteitsroutingschaduwen uitsession_entries.entry_jsonvoordat getypeerde sessie-/gesprekskolommen worden toegepast, zodat verouderde JSON-payloads geen afleverdoelen kunnen laten herleven. Subagent-aankondigingsrouting vereist eveneens de getypeerde SQLite-aflevercontext; die valt niet langer terug op compatibiliteits-SessionEntry-routevelden. Gatewaychat.sendexpliciete afleverovererving leest de getypeerde SQLite- aflevercontext in plaats vanorigin/last*-compatibiliteitsvelden.tools.effectiveleidt provider-/account-/threadcontext eveneens af uit getypeerde SQLite-aflever-/routingrijen, niet uit verouderdelast*-session-entry-schaduwen. Promptcontext voor systeemgebeurtenissen bouwt channel/to/account/thread-velden opnieuw op uit getypeerde aflevervelden in plaats vanorigin-schaduwen. De gedeeldedeliveryContextFromSession-helper en session-to-conversation-mapper negerenSessionEntry.originnu volledig; alleen getypeerde aflevervelden en relationele gespreksrijen kunnen hot route-identiteit maken. Runtime-sessie-entry-normalisatie verwijdertoriginvoordatentry_jsonwordt gepersisteerd of geprojecteerd, en inkomende metadata schrijft getypeerde channel/chat-velden plus relationele gespreksrijen in plaats van nieuwe origin-schaduwen te maken. - Transcriptgebeurtenissen, transcriptsnapshots en traject-runtimegebeurtenissen
verwijzen nu naar de canonieke per-agent-
sessions-root en cascaderen bij sessieverwijdering. Transcriptidentiteits-/idempotentierijen blijven cascaderen vanuit de exacte transcriptgebeurtenisrij. - Memory-core-indexen gebruiken nu expliciete agentdatabasetabellen
memory_index_meta,memory_index_sources,memory_index_chunksenmemory_embedding_cache, waarbijmemory_index_staterevisiewijzigingen bijhoudt. Optionele FTS-/vectorzij-indexen hetenmemory_index_chunks_ftsenmemory_index_chunks_vecin plaats van generieke tabellenmeta,files,chunks,chunks_ftsofchunks_vec. De canonieke namen behouden de huidige pad-/bronrijvorm en compatibiliteit met geserialiseerde embeddings. Deze tabellen zijn afgeleide/zoekcache, geen canonieke transcriptopslag; ze kunnen worden verwijderd en opnieuw opgebouwd vanuit geheugenwerkruimtebestanden en geconfigureerde bronnen. Het openen van een uitgebrachte geheugenindex met generieke naam migreert de metadata, bronnen, chunks en embeddingcache naar de canonieke tabellen; afgeleide FTS-/vectortabellen worden opnieuw opgebouwd onder hun canonieke namen. - Herstelstatus voor subagent-runs leeft nu in getypeerde gedeelde
subagent_runs-rijen met geindexeerde child-, requester- en controller-sessiesleutels. Het oudesubagents/runs.json-bestand is alleen doctor-migratie-invoer. - Huidige gespreksbindingen leven nu in getypeerde gedeelde
current_conversation_bindings-rijen met sleutel op genormaliseerd gespreks-id, met doelagent-/sessiekolommen, gesprekssoort, status, vervaldatum en metadata opgeslagen als relationele kolommen in plaats van een gedupliceerd opaak bindingrecord. De duurzame bindingsleutel bevat de genormaliseerde gesprekssoort, zodat direct/group/channel-refs niet kunnen botsen, en SQLite weigert ongeldige waarden voor bindingsoort/status. Het oudebindings/current-conversations.json-bestand is alleen doctor-migratie-invoer. - Herstel van de afleverqueue legt nu getypeerde queuekolommen voor channel, doel,
account, sessie, retry, fout, platform-send en herstelstatus over de replay-JSON.
entry_jsonbewaart de replay-payloads, hooks en formattingpayload, maar getypeerde kolommen zijn gezaghebbend voor hot queue-routing/status. - TUI-laatste-sessie-herstelwijzers leven nu in getypeerde gedeelde
tui_last_sessions-rijen met sleutel op de gehashte TUI-verbindings-/sessiescope. Het oude TUI-JSON-bestand is alleen doctor-migratie-invoer. - Standaard-TTS-voorkeuren leven nu in gedeelde Plugin-status-SQLite-rijen met sleutel
onder de
speech-core-Plugin. Het oudesettings/tts.json-bestand is alleen doctor-migratie-invoer; runtime leest of schrijft niet langer TTS-voorkeuren-JSON-bestanden, en de legacy-padresolver leeft in de doctor-migratiemodule. - Metadata voor geheime doelen spreekt nu over stores in plaats van te doen alsof elk
credential-doel een configuratiebestand is.
openclaw.jsonblijft de configuratiestore; auth-profile-doelen gebruiken getypeerde SQLite-auth_profile_stores-rijen met provider-vormige credentials bewaard als JSON-payloads. - Secretaudit scant niet langer gepensioneerde per-agent-
auth.json-bestanden. Doctor beheert waarschuwingen over, import van en verwijdering van dat legacy-bestand. - Legacy-auth-profielpadhelpers leven nu in doctor-legacycode. Core-auth-profielpadhelpers
tonen SQLite-auth-store-identiteit en weergavelocaties, niet
auth-profiles.json- ofauth-state.json-runtimepaden. - Runtime-modules voor subagent-runherstel en OpenRouter-modelcapaciteitscache houden
SQLite-snapshotlezers/-schrijvers nu gescheiden van alleen-doctor legacy-JSON-
importhelpers. OpenRouter-capaciteiten gebruiken de getypeerde generieke
model_capability_cache-rijen onderprovider_id = "openrouter"in plaats van een opake cacheblob of een provider-specifieke hosttabel. Subagent-runtaskNamewordt opgeslagen in de getypeerde kolomsubagent_runs.task_name; depayload_json-kopie is replay-/debugdata, niet de bron voor hot weergave- of lookupvelden. src/agents/filesystem/virtual-agent-fs.sqlite.tsimplementeert een SQLite-VFS over de agentdatabasetabelvfs_entries. Directoryreads, recursieve exports, deletes en renames gebruiken geindexeerde(namespace, path)-prefixbereiken in plaats van een hele namespace te scannen of opLIKE-padmatching te vertrouwen.src/agents/runtime-worker.entry.tsmaakt per-run SQLite-VFS-, toolartefact-, runartefact- en scoped cache-stores voor workers.- Voltooiingsmarkeringen voor workspace-bootstrap leven nu in getypeerde gedeelde
workspace_setup_state-rijen met sleutel op het resolved workspace-pad in plaats van.openclaw/workspace-state.json; runtime leest of herschrijft de legacy workspace- markering niet langer, en helper-API's geven niet langer een nep.openclaw/setup-state-pad door alleen om opslagidentiteit af te leiden. - Exec-goedkeuringen leven nu in de getypeerde gedeelde SQLite-
exec_approvals_config- singletonrij. Doctor importeert legacy~/.openclaw/exec-approvals.json; runtimewrites maken, herschrijven of rapporteren dat bestand niet langer als de actieve storelocatie. De macOS-companion leest en schrijft dezelfdestate/openclaw.sqlite-tabelrij; hij bewaart alleen de Unix-promptsocket op schijf omdat dat IPC is, geen duurzame runtimestatus. - Device-identiteit, device-auth en bootstrap-runtimemodules houden hun SQLite-
snapshotlezers/-schrijvers nu gescheiden van alleen-doctor legacy-JSON-importhelpers.
Device-identiteit gebruikt getypeerde
device_identities-rijen en device-auth-tokens gebruiken getypeerdedevice_auth_tokens-rijen. Device-auth-writes reconciliëren rijen per device/role in plaats van de tokentabel af te kappen, en runtime routeert single-token-updates niet langer via de oude whole-store-adapter. De legacy versie-1 JSON-payloads bestaan alleen als doctor-import-/exportvormen. - De GitHub Copilot-cache voor tokenuitwisseling gebruikt de gedeelde SQLite-tabel voor Plugin-status
onder
github-copilot/token-cache/default. Dit is cache-status die eigendom is van de provider, dus voegt deze bewust geen host-schematabel toe. - GitHub Copilot Compaction schrijft geen
openclaw-compaction-*.jsonworkspace-sidecars meer. De harness roept de SDK-history-Compaction-RPC aan voor de bijgehouden SDK-sessie, en OpenClaw bewaart duurzame sessie-/transcriptstatus in SQLite in plaats van compatibiliteitsmarkeringsbestanden. - De gedeelde Swift-runtime (
OpenClawKit) gebruikt dezelfdestate/openclaw.sqlite-rijen voor apparaatidentiteit en apparaatauthenticatie. macOS-apphelpers importeren de gedeelde SQLite-helpers in plaats van eigenaar te zijn van een tweede JSON- of SQLite-pad. Een achtergebleven legacyidentity/device.jsonblokkeert het aanmaken van identiteit totdat doctor het in SQLite importeert, overeenkomstig de TypeScript- en Android- opstartpoort. - Android-apparaatidentiteit gebruikt hetzelfde TypeScript-compatibele sleutelmateriaal
dat is opgeslagen in getypeerde
state/openclaw.sqlite#table/device_identities-rijen. Deze leest of schrijft nooitopenclaw/identity/device.json; een achtergebleven legacy-bestand blokkeert het opstarten totdat doctor het in SQLite importeert. - Android-gecachete apparaatauthenticatietokens gebruiken ook getypeerde
state/openclaw.sqlite#table/device_auth_tokens-rijen en delen dezelfde versie-1 tokensemantiek als TypeScript en Swift. De runtime leest geenSecurePrefsgateway.deviceToken*-compatibiliteitssleutels meer; die horen alleen bij migratie-/doctor- logica. - De recente-pakkettenhistorie van Android-meldingen gebruikt getypeerde
android_notification_recent_packages-rijen. De runtime migreert of leest de oude SharedPreferences CSV-sleutels niet meer. - Het aanmaken van apparaatidentiteit faalt fail-closed wanneer legacy
identity/device.jsonbestaat, wanneer de SQLite-identiteitsrij ongeldig is, of wanneer de SQLite-identiteitsopslag niet kan worden geopend. Doctor importeert en verwijdert dat bestand eerst, zodat de runtime- opstart de koppelingsidentiteit niet stilzwijgend kan roteren vóór migratie. - Selectie van apparaatidentiteit is een SQLite-rijsleutel, geen JSON-bestandslocator. Tests
en Gateway-helpers geven expliciete identiteitssleutels door; alleen doctor-migratie en de
fail-closed opstartpoort kennen de buiten gebruik gestelde bestandsnaam
identity/device.json. - Compatibiliteit voor sessiereset leeft nu in doctor-configmigratie:
session.idleMinuteswordt verplaatst naarsession.reset.idleMinutes,session.resetByType.dmwordt verplaatst naarsession.resetByType.direct, en het runtime-resetbeleid leest alleen canonieke resetsleutels. - Legacy-configcompatibiliteit leeft nu onder
src/commands/doctor/. NormalereadConfigFileSnapshot()-validatie importeert geen doctor-legacydetectors of annoteert geen legacy-problemen;runDoctorConfigPreflight()voegt die problemen toe voor doctor-reparatie/-rapportage. De doctor-configflow importeertsrc/commands/doctor/legacy-config.ts, en oude OAuth-profiel-id-reparatie leeft ondersrc/commands/doctor/legacy/oauth-profile-ids.ts. - Niet-doctor-commando's voeren legacy-configreparatie niet automatisch uit. Bijvoorbeeld:
openclaw update --channelfaalt nu bij ongeldige legacy-config en vraagt de gebruiker doctor uit te voeren, in plaats van stilzwijgend doctor-migratiecode te importeren. - Web push, APNs, Voice Wake, updatecontroles en configgezondheid gebruiken nu getypeerde gedeelde SQLite- tabellen voor abonnementen, VAPID-sleutels, node-registraties, triggerrijen, routeringsrijen, update-meldingsstatus en configgezondheidsvermeldingen in plaats van volledige ondoorzichtige JSON-blobs. Snapshot-schrijfacties voor Web push en APNs stemmen abonnementen/registraties nu af op basis van primaire sleutel in plaats van hun tabellen leeg te maken; configgezondheid doet hetzelfde op basis van configpad. Hun runtimemodules houden SQLite-snapshotlezers/-schrijvers gescheiden van doctor-only legacy JSON-importhelpers.
- Node-hostconfig gebruikt nu een getypeerde singleton-rij in de gedeelde SQLite-database;
doctor importeert het oude
node.json-bestand vóór normaal runtimegebruik. - Apparaat-/node-koppeling, kanaalkoppeling, kanaal-allowlists en bootstrapstatus
gebruiken nu getypeerde SQLite-rijen in plaats van volledige ondoorzichtige JSON-blobs. Plugin-binding-
goedkeuringen en cronjobstatus volgen dezelfde splitsing: runtimemodules stellen
SQLite-backed bewerkingen en neutrale snapshothelpers beschikbaar, en koppelings-/bootstrap-
plus Plugin-bindinggoedkeurings-snapshot-schrijfacties stemmen rijen af op primaire sleutel
in plaats van tabellen af te kappen, terwijl doctor de oude JSON-bestanden importeert/verwijdert via
src/commands/doctor/legacy/*-modules. - Geïnstalleerde Plugin-records leven nu in de SQLite-index voor geïnstalleerde Plugins.
Runtime-config lezen/schrijven migreert of bewaart oude
plugins.installsauthored-configgegevens niet meer; doctor importeert die legacy-configvorm in SQLite vóór normaal runtimegebruik. - QQBot-snapshots voor herstel van referenties leven nu in SQLite Plugin-status onder
qqbot/credential-backups. De runtime schrijft geenqqbot/data/credential-backup*.jsonmeer; het QQBot-doctorcontract importeert en archiveert die legacy-back-upbestanden vanuit de actieve statusdirectory. - Gateway-herlaadplanning vergelijkt SQLite-indexsnapshots van geïnstalleerde Plugins onder
een interne
installedPluginIndex.installRecords.*-diffnamespace. Runtime- herlaadbeslissingen verpakken die rijen niet meer in neppeplugins.installs-configobjecten. - Matrix-upgrade van named-account-referenties gebeurt niet meer tijdens runtime-
leesacties. Doctor is eigenaar van de oude hernoeming van top-level
credentials/matrix/credentials.jsonwanneer een enkel/default Matrix-account kan worden opgelost. - Core-koppelings- en cron-runtimemodules exporteren geen legacy JSON-padbouwers
meer. Legacy-modules die eigendom zijn van doctor construeren
pending.json,paired.json,bootstrap.jsonencron/jobs.json-bronpaden alleen voor importtests en migratie. Normalisatie van legacy cronjobvormen en import van cron-runlogs leven ondersrc/commands/doctor/legacy/cron*.ts. src/commands/doctor/legacy/runtime-state.tsimporteert legacy JSON-status- bestanden, inclusief node-hostconfig, vanuit doctor in SQLite. Nieuwe legacy-bestands- importers blijven ondersrc/commands/doctor/legacy/.src/commands/doctor/state-migrations.tsimporteert legacysessions.jsonen*.jsonl-transcripten direct in SQLite en verwijdert succesvolle bronnen. Deze staget root-legacytranscripten niet meer viaagents/<agentId>/sessions/*.jsonlen maakt geen canoniek JSONL-doel meer aan vóór import.- Doctor-controles voor statusintegriteit scannen geen legacy-sessiedirectory's meer en bieden geen verwijdering van verweesde JSONL-bestanden meer aan. Legacy-transcriptbestanden zijn alleen migratie-invoer, en de migratiestap is eigenaar van import plus bronverwijdering.
- Legacy-import van sandboxregister leeft onder
src/commands/doctor/legacy/sandbox-registry.ts; actieve sandboxregister- lees- en schrijfwerkzaamheden blijven alleen SQLite. - De legacy-reparatie voor sessietranscriptgezondheid/import leeft onder
src/commands/doctor/legacy/session-transcript-health.ts; runtimecommando- modules dragen geen JSONL-transcriptparsing of active-branch-reparatiecode meer.
Hoogtepunten van voltooide consolidatie/verwijdering:
- Pluginstatus gebruikt nu de gedeelde database
state/openclaw.sqlite. De oude branch-lokale sidecar-importerplugin-state/state.sqliteis verwijderd omdat die SQLite-indeling nooit is uitgebracht. Probe-/testhelpers rapporteren het gedeeldedatabasePathin plaats van een plugin-state-specifiek SQLite-pad beschikbaar te maken. Voorbereide workerbeschrijvingen laten ook transcriptlocators weg. Runtime-sessie state en wachtrijgeplaatste vervolgruns dragen{agentId, sessionId}in plaats van afgeleide transcripthandles. - Ingebedde Compaction haalt SQLite-scope nu uit
agentIdensessionId. Compaction-hooks, context-engine-aanroepen, CLI-delegatie en protocolantwoorden mogen geen afgeleidesqlite-transcript://...-handles ontvangen. Export-/debugcode kan expliciete gebruikersartefacten uit rijen materialiseren, maar biedt geen generiek JSONL-exportpad voor sessies en voert bestandsnamen niet terug in runtime- identiteit. /export-sessionleest transcriptrijen uit SQLite en schrijft alleen de gevraagde zelfstandige HTML-weergave. De ingebedde viewer reconstrueert of downloadt geen sessie-JSONL meer uit die rijen.- Context-engine-delegatie parseert geen transcriptlocator meer om
agentidentiteit te herstellen. De voorbereide runtimecontext draagt de opgeloste
agentIdmee naar de ingebouwde Compaction-adapter. - Transcript herschrijven en live truncatie van toolresultaten lezen en bewaren
transcriptstate nu op
{agentId, sessionId}en leiden geen tijdelijke locators af voor payloads van transcript-update-events. - Het hulpoppervlak voor transcriptstate heeft geen locator-gebaseerde
varianten van
readTranscriptState,replaceTranscriptStateEventsofpersistTranscriptStateMutationmeer. Runtime-aanroepers moeten de{agentId, sessionId}-API's gebruiken. Doctor-import leest legacy-bestanden via een expliciet bestandspad en schrijft SQLite-rijen; het migreert geen locatorstrings. - Het contract van de runtime-session-manager exposeert geen
open(locator),forkFrom(locator)ofsetTranscriptLocator(...)meer. Persisted session managers openen alleen via{agentId, sessionId}; list-/fork-helpers leven op rijgerichte sessie- en checkpoint-API's in plaats van op de transcript-manager- facade. - Gateway-API's voor transcriptlezers zijn scope-eerst. Ze nemen
{agentId, sessionId}en accepteren geen positionele transcriptlocator die per ongeluk runtime-identiteit zou kunnen worden. Parsing van actieve transcriptlocators is verdwenen; legacy-bronpaden worden alleen door doctor-importcode gelezen. - Transcript-update-events zijn ook scope-eerst.
emitSessionTranscriptUpdateaccepteert geen losse locatorstring meer, en listeners routeren op{agentId, sessionId}zonder een handle te parsen. - Gateway-broadcast van sessieberichten lost sessiesleutels op uit agent-/sessiescope, niet uit een transcriptlocator. De oude resolver/cache van transcriptlocator naar sessiesleutel is verdwenen.
- Gateway session-history SSE filtert live-updates op agent-/sessiescope. Het canonicaliseert geen kandidaten voor transcriptlocators, realpaths of bestandsvormige transcriptidentiteiten meer om te bepalen of een stream een update moet ontvangen.
- Sessielevenscyclus-hooks leiden geen transcriptlocators meer af en exposen ze niet meer op
session_end. Hook-consumenten krijgensessionId,sessionKey, volgende-sessie- id's en agentcontext; transcriptbestanden maken geen deel uit van het levenscyclus- contract. - Reset-hooks leiden ook geen transcriptlocators meer af en exposen ze niet meer. De
before_reset-payload draagt herstelde SQLite-berichten plus de resetreden, terwijl sessie-identiteit in de hookcontext blijft. - Agent-harness-reset accepteert geen transcriptlocator meer. Reset-dispatch is
gescopeerd op
sessionId/sessionKeyplus reden. - Sessietypen voor agentextensies exposen
transcriptLocatorniet meer; extensies moeten sessiecontext en runtime-API's gebruiken in plaats van naar een bestandsvormige transcriptidentiteit te grijpen. - Plugin Compaction-hooks exposen geen transcriptlocators meer. Hookcontext draagt al sessie-identiteit, en transcriptlezingen moeten via SQLite- scopebewuste API's gaan in plaats van via bestandsvormige handles.
before_agent_finalize-hooks exposentranscriptPathniet meer, inclusief native hook-relay-payloads. Finalisatiehooks gebruiken alleen sessiecontext.- Gateway-resetantwoorden synthetiseren geen transcriptlocator meer op de geretourneerde entry. De reset maakt SQLite-transcriptrijen, retourneert de schone sessie-entry en laat transcripttoegang over aan scopebewuste lezers.
- Resultaten van ingebedde runs en Compaction tonen geen transcriptlocators meer voor
sessieboekhouding. Automatische Compaction werkt alleen de actieve
sessionId, Compaction-tellers en tokenmetadata bij. - Resultaten van ingebedde pogingen retourneren geen
transcriptLocatorUsedmeer, en resultaten van context-enginecompact()retourneren geen transcriptlocators meer. Runtime-retryloops accepteren alleen een opvolgendesessionId. - Delivery-mirror-resultaten voor toevoegen aan transcript retourneren geen
transcriptlocators meer. Aanroepers krijgen de toegevoegde
messageId; transcriptupdatesignalen gebruiken SQLite-scope. - Parent-session fork-helpers retourneren alleen de geforkte
sessionId. Subagent- voorbereiding geeft de scope van de child-agent/-sessie door aan engines. - CLI-runnerparameters en opnieuw seeden van geschiedenis accepteren geen transcriptlocators meer.
CLI-geschiedenislezingen lossen de SQLite-transcriptscope op uit
{agentId, sessionId}en sessiesleutelcontext. - CLI- en embedded-runner-testfixtures seeden en lezen SQLite-transcriptrijen nu
op sessie-id in plaats van te doen alsof actieve sessies
*.jsonl-bestanden zijn of eensqlite-transcript://...-string via runtimeparameters door te geven. - Guard-events voor sessietoolresultaten emitten vanuit bekende sessiescope, zelfs wanneer een
in-memory manager geen afgeleide locator heeft. De tests faken geen actieve
/tmp/*.jsonl-transcriptbestanden meer. - BTW- en compaction-checkpoint-helpers lezen en forken transcriptrijen nu op SQLite-scope. Checkpointmetadata bewaart nu alleen sessie-id's en leaf-/entry-id's; afgeleide locators worden niet meer in checkpointpayloads geschreven.
- Gateway transcript-key lookup gebruikt SQLite-transcriptscope aan protocolgrenzen en voert geen realpath of stat meer uit op transcriptbestandsnamen.
- Automatische Compaction-transcriptrotatie schrijft opvolgende transcriptrijen direct via de SQLite-transcriptstore. Sessierijen bewaren alleen de opvolgende sessie-identiteit, geen duurzaam JSONL-pad of persisted locator.
- Ingebedde context-engine-Compaction gebruikt SQLite-genoemde helpers voor transcriptrotatie. De rotatietests construeren geen JSONL-opvolgerpaden meer en modelleren actieve sessies niet meer als bestanden.
- Beheerde retentie van uitgaande afbeeldingen baseert de sleutel voor de transcriptberichtencache op SQLite-transcriptstatistieken in plaats van filesystem-stat-aanroepen.
- Runtime-sessielocks en de zelfstandige legacy
.jsonl.lockdoctor- lane zijn verwijderd. - De Microsoft Teams-runtime-barrel en openbare Plugin-SDK re-exporteren de oude file-lock-helper niet meer; duurzame Plugin-statepaden worden door SQLite ondersteund.
- Snoeien op sessieleeftijd/-aantal en expliciete sessieopschoning zijn verwijderd. Doctor is eigenaar van legacy-import; verouderde sessies worden expliciet gereset of verwijderd.
- Doctor-integriteitscontroles tellen een legacy JSONL-bestand niet meer als geldig actief transcript voor een SQLite-sessierij. Gezondheid van actieve transcripts is alleen SQLite; legacy JSONL-bestanden worden gerapporteerd als invoer voor migratie/orphan-cleanup.
- Doctor behandelt
agents/<agent>/sessions/niet meer als vereiste runtime- state. Het scant die directory alleen wanneer die al bestaat, als legacy-import of invoer voor orphan-cleanup. - Gateway
sessions.resolve, sessie patch-/reset-/compact-paden, subagent- spawning, snelle abort, ACP-metadata, Heartbeat-geisoleerde sessies en TUI- patching migreren of snoeien legacy-sessiesleutels niet meer als neveneffect van normaal runtimewerk. - CLI-resolutie van commandsessies retourneert nu de eigenaar-
agentIdin plaats van eenstorePath, en kopieert geen legacy main-session-rijen meer tijdens normale--to- of--session-id-resolutie. Legacy canonicalisatie van main-rijen hoort alleen bij doctor. - Runtime-resolutie van subagentdiepte leest geen
sessions.jsonof JSON5- sessiestores meer. Het leest SQLitesession_entriesop agent-id, en legacy diepte-/sessiemetadata kunnen alleen via het doctor-importpad binnenkomen. - Sessie-overrides voor authprofielen blijven bestaan via directe
{agentId, sessionKey}- rij-upserts in plaats van lazy-loading van een bestandsvormige session-store-runtime. - Verbose gating voor auto-reply en sessie-updatehelpers lezen/upserten nu SQLite- sessierijen op sessie-identiteit en vereisen geen legacy storepad meer voordat persisted rijstate wordt aangeraakt.
- Helpers voor command-run-sessiemetadata gebruiken nu entry-gerichte namen en module-
paden; het oude
session-storecommand-helperoppervlak is verwijderd. - Bootstrap-header-seeding en hardening van handmatige Compaction-grenzen muteren nu
SQLite-transcriptrijen direct. Runtime-aanroepers geven sessie-identiteit door, geen
schrijfbare
.jsonl-paden. - Stille replay van sessierotatie kopieert recente user-/assistant-beurten op
{agentId, sessionId}uit SQLite-transcriptrijen. Het accepteert geen bron- of doeltranscriptlocators meer. - Nieuwe runtime-sessierijen bewaren geen transcriptlocators meer. Aanroepers gebruiken
{agentId, sessionId}direct; export-/debugcommands kunnen uitvoerbestandsnamen kiezen wanneer ze rijen materialiseren. - Een nieuwe persisted transcriptsessie starten opent SQLite-rijen nu altijd op scope. De session manager hergebruikt geen eerder transcriptpad of locator uit het bestandstijdperk meer als identiteit voor de nieuwe sessie.
- Persisted transcriptsessies gebruiken de expliciete
openTranscriptSessionManagerForSession({agentId, sessionId})-API. De oude statischeSessionManager.create/openForSession/list/forkFromSession-facades zijn verdwenen zodat tests en runtimecode niet per ongeluk sessiedetectie uit het bestandstijdperk kunnen recreëren. - Plugin-runtime exposeert
api.runtime.agent.session.resolveTranscriptLocatorPathniet meer; Plugincode gebruikt SQLite-rijhelpers en scopewaarden. - Het openbare
session-store-runtime-SDK-oppervlak exporteert nu alleen helpers voor sessierijen en transcriptrijen. Gerichte SQLite-schema-/pad-/transactiehelpers leven insqlite-runtime; raw open-/close-/reset-helpers blijven lokaal alleen voor first-party tests. - Legacy
.jsonl-classifiers voor traject-/checkpointbestandsnamen leven nu in de doctor-module voor legacy sessiebestanden. Core-sessievalidering importeert geen helpers voor bestandsartefacten meer om normale SQLite-sessie-id's te bepalen. - Active Memory-blokkerende subagentruns gebruiken SQLite-transcriptrijen in plaats van
tijdelijke of persisted
session.jsonl-bestanden onder Plugin-state te maken. De oudetranscriptDir-optie is verwijderd. - Eenmalige sluggeneratie en Crestodian-plannerruns gebruiken SQLite-transcriptrijen
in plaats van tijdelijke
session.jsonl-bestanden te maken. llm-task-helperruns en verborgen commitment-extractie gebruiken ook SQLite- transcriptrijen, zodat deze model-only helpersessies geen tijdelijke JSON/JSONL- transcriptbestanden meer maken.TranscriptSessionManageris nu alleen een geopende SQLite-transcriptscope. Runtimecode opent die metopenTranscriptSessionManagerForSession({agentId, sessionId}); create-, branch-, continue-, list- en fork-flows leven in hun eigenaar-SQLite-rijhelpers in plaats van in statische managerfacades. Doctor-/import-/debugcode behandelt expliciete legacy-bronbestanden buiten de runtime-session-manager.- De verouderde facade-methoden
SessionManager.newSession()enSessionManager.createBranchedSession()zijn verwijderd. Nieuwe sessies en transcriptdescendants worden gemaakt door hun eigenaar-SQLite- workflow in plaats van een al geopende manager naar een andere persisted sessie te muteren. - Beslissingen over parent-transcript-forks en forkcreatie accepteren geen
storePathofsessionsDirmeer; ze gebruiken{agentId, sessionId}SQLite- transcriptscope in plaats van bewaarde filesystem-padmetadata. - Memory-host exporteert geen no-op helpers voor transcriptclassificatie van sessie- directory's meer; transcriptfiltering wordt nu afgeleid uit SQLite-rijmetadata tijdens entryconstructie.
- Memory-host- en QMD-tests voor sessie-export gebruiken SQLite-transcriptscopes. Oude
agents/<agentId>/sessions/*.jsonl-paden blijven alleen gedekt waar een test bewust doctor-/import-/exportcompatibiliteit bewijst. - Raw sessie-inspectie in QA-lab gebruikt nu
sessions.listvia de Gateway in plaats vanagents/qa/sessions/sessions.jsonte lezen; MSteams-feedback voegt rechtstreeks toe aan SQLite-transcripten zonder een JSONL-pad te verzinnen. - Gedeelde inkomende kanaalbeurten dragen nu
{agentId, sessionKey}in plaats van een verouderdestorePath. 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 en QQBot-opnamepaden lezen nu bijgewerkte-op-metadata en leggen inkomende sessierijen vast via SQLite-identiteit. - Persistentie van transcriptlocators is verwijderd uit actieve sessierijen.
resolveSessionTranscriptTargetretourneertagentId,sessionIden optionele topicmetadata; doctor is de enige code die verouderde transcriptbestandsnamen importeert. - Runtime-transcriptheaders beginnen bij SQLite-versie
1. Oude JSONL V1/V2/V3 vormupgrades leven alleen in doctor-import en normaliseren geïmporteerde headers naar de huidige SQLite-transcriptversie voordat rijen worden opgeslagen. - De database-first guard verbiedt nu
SessionManager.listAllenSessionManager.forkFromSession; workflows voor sessielijsten en fork/herstel moeten op rij-/scoped SQLite-API's blijven. - De guard verbiedt ook verouderde helpernamen voor transcript-JSONL-parse/actieve-branch-reparatie buiten doctor-/importcode, zodat runtime geen tweede verouderd transcriptmigratiepad kan krijgen.
- Ingebedde PI-runs weigeren inkomende transcripthandles. Ze gebruiken de SQLite
{agentId, sessionId}-identiteit vóór workerstart en opnieuw voordat de poging transcriptstatus raakt. Een verouderde/tmp/*.jsonl-invoer kan geen runtime-schrijfdoel selecteren. - Cachetrace-, Anthropic-payload-, raw stream- en diagnostische tijdlijnrecords
schrijven nu naar getypeerde SQLite-
diagnostic_events-rijen. Gateway-stabiliteitsbundels schrijven nu naar getypeerde SQLite-diagnostic_stability_bundles-rijen. De oudediagnostics.cacheTrace.filePath,OPENCLAW_CACHE_TRACE_FILE,OPENCLAW_ANTHROPIC_PAYLOAD_LOG_FILEenOPENCLAW_DIAGNOSTICS_TIMELINE_PATHJSONL-overridepaden zijn verwijderd, en normale stabiliteitsvastlegging schrijft niet langerlogs/stability/*.json-bestanden. - Cron-persistentie verzoent nu SQLite-
cron_jobs-rijen in plaats van de hele jobtabel bij elke opslag te verwijderen en opnieuw in te voegen. Plugin-doel writebacks werken overeenkomende Cron-rijen rechtstreeks bij en houden runtime-Cron-status in dezelfde statusdatabasetransactie. - Cron-runtimecallers gebruiken nu een stabiele SQLite Cron-store-sleutel. Verouderde
cron.store-paden zijn alleen doctor-importinvoer; productie-Gateway, taakonderhoud, status, run-log en Telegram-doelwritebackpaden gebruikenresolveCronStoreKeyen normaliseren de sleutel niet langer als pad. Cron-status meldt nustoreKeyin plaats van het oude bestandsvormigestorePath-veld. - Cron-runtimelading en planning normaliseren niet langer verouderde persistente jobvormen
zoals
jobId,schedule.cron, numeriekeatMs, stringbooleans of ontbrekendesessionTarget. Doctor legacy-import bezit die reparaties voordat rijen in SQLite worden ingevoegd. - ACP-spawn lost geen transcript-JSONL-bestandspaden meer op en persisteert die niet. Spawn- en thread-bindconfiguratie persisteren de SQLite-sessierij rechtstreeks en behouden de sessie-id als de bewaarde transcriptidentiteit.
- ACP-sessiemetadata-API's lezen/lijsten/upserten nu SQLite-rijen per
agentIden stellenstorePathniet langer bloot als onderdeel van het ACP-sessie-entrycontract. - Sessiegebruiksboekhouding en Gateway-gebruiksaggregatie lossen transcripten nu
alleen op via
{agentId, sessionId}. De kosten-/gebruikscache en ontdekte-sessiesamenvattingen synthetiseren of retourneren geen transcriptlocatorstrings meer. - Gateway-chatappend, abort-partial-persistentie,
/sessions.senden webchat-mediatranscriptschrijfacties voegen rechtstreeks toe via SQLite-transcriptscope. De Gateway-transcriptinjectiehelper accepteert niet langer eentranscriptLocator-parameter. - SQLite-transcriptontdekking vermeldt nu alleen transcriptscopes en statistieken:
{agentId, sessionId, updatedAt, eventCount}. De dode compatibiliteitshelperlistSqliteSessionTranscriptLocatorsen het per-rijlocator-veld zijn verdwenen. - Transcriptreparatieruntime stelt nu alleen
repairTranscriptSessionStateIfNeeded({agentId, sessionId})bloot. De oude locatorgebaseerde reparatiehelper is verwijderd; doctor-/debugcode leest expliciete bronbestandspaden en migreert nooit locatorstrings. - ACP-replay-ledger-runtime slaat per-sessie replayrijen nu op in de gedeelde
SQLite-statusdatabase in plaats van
acp/event-ledger.json; doctor importeert en verwijdert het verouderde bestand. - Gateway-transcriptlezerhelpers leven nu in
src/gateway/session-transcript-readers.tsin plaats van de oude modulenaamsession-utils.fs. De fallbackcontrole voor opnieuw-proberen-geschiedenis is genoemd naar SQLite-transcriptinhoud in plaats van het oude file-helper-oppervlak. - Gateway injected-chat- en compaction-helpers geven nu SQLite-transcriptscope door via interne helper-API's in plaats van waarden transcriptpaden of bronbestanden te noemen.
- Bootstrap-voortzettingsdetectie controleert nu SQLite-transcriptrijen via
hasCompletedBootstrapTranscriptTurn; ze stelt niet langer een bestandsvormige helpernaam bloot. - Embedded-runner-tests gebruiken nu SQLite-transcriptidentiteit, en het openen van een nieuwe
transcriptmanager vereist altijd een expliciete
sessionId. - Geheugenindexeringshelpers gebruiken nu van begin tot eind SQLite-transcriptterminologie:
host exporteert
listSessionTranscriptScopesForAgentensessionTranscriptKeyForScope, gerichte synchronisatiewachtrijensessionTranscripts, publieke sessiezoekhits tonen opaquetranscript:<agent>:<session>-paden, en de interne DB-bronsleutel issession:<session>ondersource_kind='sessions'in plaats van een nepbestandspad. - De generieke Plugin SDK persistent-dedupe-helper stelt geen bestandsvormige opties meer bloot. Callers leveren SQLite-scopesleutels en duurzame dedupe-rijen leven in gedeelde Plugin-status.
- Microsoft Teams SSO-tokens zijn verplaatst van vergrendelde JSON-bestanden naar SQLite Plugin-status.
Doctor importeert
msteams-sso-tokens.json, herbouwt canonieke SSO-tokensleutels uit payloads en verwijdert het bronbestand. Gedelegeerde OAuth-tokens blijven op hun bestaande private credential-file boundary. - Matrix-synccachestatus is verplaatst van
bot-storage.jsonnaar SQLite Plugin-status. Doctor importeert verouderde raw of gewrapte syncpayloads en verwijdert het bronbestand. Actieve Matrix- en QA Matrix-clients geven een SQLite sync-store-rootdirectory door, geen nepsync-store.json- ofbot-storage.json-pad. - Matrix legacy crypto-migratiestatus is verplaatst van
legacy-crypto-migration.jsonnaar SQLite Plugin-status. Doctor importeert het oude statusbestand; Matrix SDK IndexedDB-snapshots zijn verplaatst vancrypto-idb-snapshot.jsonnaar SQLite Plugin-blobs. Matrix-herstelsleutels en credentials zijn SQLite Plugin-statusrijen; hun oude JSON-bestanden zijn alleen doctor-migratie-invoer. - Memory Wiki-activiteitslogs gebruiken nu SQLite Plugin-status in plaats van
.openclaw-wiki/log.jsonl. De Memory Wiki-migratieprovider importeert oude JSONL-logs; wiki-markdown en gebruikerskluisinhoud blijven file-backed als workspace-inhoud. - Memory Wiki maakt niet langer
.openclaw-wiki/state.jsonof de ongebruikte directory.openclaw-wiki/locksaan. De migratieprovider verwijdert die gepensioneerde Plugin-metadatabestanden als een oudere kluis ze nog heeft. - Crestodian-audititems gebruiken nu core SQLite Plugin-status in plaats van
audit/crestodian.jsonl. Doctor importeert de verouderde JSONL-auditlog en verwijdert die na succesvolle import. - Config schrijf-/observe-audititems gebruiken nu core SQLite Plugin-status in plaats
van
logs/config-audit.jsonl. Doctor importeert de verouderde JSONL-auditlog en verwijdert die na succesvolle import. - De macOS companion schrijft niet langer app-lokale
logs/config-audit.jsonl- oflogs/config-health.json-sidecars terwijlopenclaw.jsonwordt bewerkt. Het configbestand blijft file-backed, herstelsnapshots blijven naast het configbestand, en duurzame config-audit-/healthstatus hoort bij de Gateway SQLite-store. - Crestodian rescue-wachtende goedkeuringen gebruiken nu core SQLite Plugin-status in plaats
van
crestodian/rescue-pending/*.json. Doctor importeert verouderde wachtende-goedkeuringsbestanden en verwijdert ze na succesvolle import. - Phone Control tijdelijke arm-status gebruikt nu SQLite Plugin-status in plaats van
plugins/phone-control/armed.json. Doctor importeert het verouderde armed-state-bestand in de namespacephone-control/arm-stateen verwijdert het bestand. - Doctor repareert JSONL-transcripten niet langer in-place en maakt geen back-up-JSONL-bestanden meer aan. Het importeert de actieve branch in SQLite en verwijdert de verouderde bron.
- Transcriptopzoeking van de session-memory-hook gebruikt alleen scoped SQLite-lezingen
met
{agentId, sessionId}. De helper accepteert of deriveert niet langer transcriptlocators, verouderde bestandslezingen of opties voor bestands-herschrijven. - Codex app-server-conversatiebindingen keyen SQLite Plugin-status nu op
OpenClaw-sessiesleutel of expliciete
{agentId, sessionId}-scope. Ze mogen geen fallbackbindingen op basis van transcriptpaden bewaren. - Codex app-server mirrored-history-lezingen gebruiken alleen de SQLite-transcriptscope; ze mogen identiteit niet herstellen uit transcriptbestandspaden.
- Role-ordering- en compaction-resetpaden unlinken oude transcriptbestanden niet langer; reset roteert alleen de SQLite-sessierij en transcriptidentiteit.
- Gateway-reset- en checkpointreacties retourneren schone sessierijen plus sessie-id's. Ze synthetiseren niet langer SQLite-transcriptlocators voor clients.
- Memory-core dreaming snoeit sessierijen niet langer door te peilen naar ontbrekende
JSONL-bestanden. Subagent-opruiming loopt via de sessieruntime-API in plaats van
filesystem-existence-controles. De transcript-ingestion-tests seeden SQLite-rijen
rechtstreeks in plaats van
agents/<id>/sessions-fixtures of locatorplaceholders aan te maken. - Geheugentranscriptindexering mag
transcript:<agentId>:<sessionId>tonen als een virtueel zoekhitpad voor citation-/leeshelpers. De duurzame indexbron is relationeel (source_kind='sessions',source_key='session:<sessionId>',session_id=<sessionId>), dus de waarde is geen runtime-transcriptlocator, geen bestandssysteempad en mag nooit terug worden doorgegeven aan sessieruntime-API's. - Gateway doctor-geheugenstatus leest short-term recall- en phase-signal-aantallen
uit SQLite Plugin-statusrijen in plaats van
memory/.dreams/*.json; CLI- en doctoruitvoer labelen die opslag nu als een SQLite-store, niet als een pad. - Memory-core-runtime, CLI-status, Gateway doctor-methoden en Plugin SDK-facades
auditen of archiveren geen verouderde
.dreams/session-corpus-bestanden meer. Die bestanden zijn alleen migratie-invoer; doctor importeert ze in SQLite en verwijdert de bron na verificatie. Actieve session-ingestion-bewijsrijen gebruiken nu het virtuele SQLite-padmemory/session-ingestion/<day>.txt; runtime schrijft nooit status naar of leidt status af uit.dreams/session-corpus. - Memory-core publieke artefacten tonen SQLite-hostevents als het virtuele JSON-artefact
memory/events/memory-host-events.json; ze hergebruiken niet langer het verouderde bronpad.dreams/events.jsonl. - Sandbox-container-/browserregistries gebruiken nu de gedeelde
SQLite-tabel
sandbox_registry_entriesmet getypeerde kolommen voor sessie, image, timestamp, backend/config en browserpoort. Doctor importeert verouderde monolithische en gesharde JSON-registerbestanden en verwijdert succesvolle bronnen. Runtimelezingen gebruiken de getypeerde rijkolommen als source of truth;entry_jsonis alleen een replay-/debugkopie. - Commitments gebruiken nu een getypeerde gedeelde tabel
commitmentsin plaats van een JSON-blob voor de hele store. Snapshotopslagen upserten per commitment-id en verwijderen alleen ontbrekende rijen in plaats van de tabel leeg te maken en opnieuw in te voegen. Runtimeladingen laden commitments uit getypeerde scope-, delivery-window-, status-, attempt- en tekstkolommen;record_jsonis alleen een replay-/debugkopie. Doctor importeert verouderdecommitments.jsonen verwijdert het na een succesvolle import. - Cron-jobdefinities, planningsstatus en uitvoeringsgeschiedenis hebben niet langer runtime
JSON-schrijvers of -lezers. Runtime gebruikt
cron_jobs-rijen met getypeerde planning, payload-, delivery-, failure-alert-, session-, status- en runtime-state-kolommen plus getypeerdecron_run_logs-metadata voor status, diagnostische samenvatting, afleverstatus/-fout, session/run, model en tokentotalen.job_jsonis alleen een replay-/debugkopie;state_jsonbewaart geneste runtime-diagnostiek die nog geen hot-queryvelden heeft, terwijl de runtime hot statusvelden opnieuw hydrateert vanuit getypeerde kolommen. Doctor importeert verouderdejobs.json-,jobs-state.json- enruns/*.jsonl-bestanden en verwijdert de geïmporteerde bronnen. Plugin-target-terugschrijvingen werken overeenkomendecron_jobs- rijen bij in plaats van de hele cron-store te laden en te vervangen. - Gateway-opstart negeert verouderde
notify: true-markeringen in de runtime- projectie. Doctor vertaalt ze naar expliciete SQLite-aflevering wanneercron.webhookgeldig is, verwijdert inerte markeringen wanneer die niet is ingesteld, en behoudt ze met een waarschuwing wanneer de geconfigureerde webhook ongeldig is. - Uitgaande en session-afleverwachtrijen slaan nu wachtrijstatus, itemsoort,
session-sleutel, kanaal, target, account-id, aantal nieuwe pogingen, laatste poging/fout,
herstelstatus en platform-send-markeringen op als getypeerde kolommen in de gedeelde
delivery_queue_entries-tabel. Runtime-herstel leest die hot velden uit de getypeerde kolommen, en retry-/herstelmutaties werken die kolommen direct bij zonder replay-JSON te herschrijven. De volledige JSON-payload blijft alleen bestaan als de replay-/debugblob voor berichtinhoud en andere koude replaygegevens. - Beheerde uitgaande afbeeldingsrecords gebruiken nu getypeerde gedeelde
managed_outgoing_image_records-rijen, terwijl mediabytes nog steeds worden opgeslagen inmedia_blobs. Het JSON-record blijft alleen bestaan als replay-/debugkopie. - Discord-modelkiezer-voorkeuren, command-deploy-hashes en threadbindingen gebruiken nu gedeelde SQLite-Plugin-status. Hun verouderde JSON-importplannen bevinden zich in het Discord-Plugin setup-/doctor-migratieoppervlak, niet in core-migratiecode.
- Verouderde Plugin-importdetectors gebruiken door doctor benoemde modules zoals
doctor-legacy-state.tsofdoctor-state-imports.ts; normale channel-runtime- modules mogen geen verouderde JSON-detectors importeren. - BlueBubbles-catchup-cursors en inbound-dedupe-markeringen gebruiken nu gedeelde SQLite- Plugin-status. Hun verouderde JSON-importplannen bevinden zich in het BlueBubbles-Plugin setup-/doctor-migratieoppervlak, niet in core-migratiecode.
- Telegram-update-offsets, stickercache-rijen, sent-message-cache-rijen, topic-name-cache-rijen en threadbindingen gebruiken nu gedeelde SQLite-Plugin- status. Hun verouderde JSON-importplannen bevinden zich in het Telegram-Plugin setup-/doctor-migratieoppervlak, niet in core-migratiecode.
- iMessage-catchup-cursors, reply short-id-mappings en sent-echo-dedupe-rijen
gebruiken nu gedeelde SQLite-Plugin-status. De oude
imessage/catchup/*.json-,imessage/reply-cache.jsonl- enimessage/sent-echoes.jsonl-bestanden zijn alleen doctor-inputs. - Feishu-berichtdedupe-rijen gebruiken nu gedeelde SQLite-Plugin-status in plaats van
feishu/dedup/*.json-bestanden. Het verouderde JSON-importplan bevindt zich in het Feishu- Plugin setup-/doctor-migratieoppervlak, niet in core-migratiecode. - Microsoft Teams-gesprekken, polls, pending upload-buffers en feedback-
learnings gebruiken nu gedeelde SQLite-Plugin-status-/blobtabellen. Het pending upload-
pad gebruikt
plugin_blob_entries, zodat mediabuffers worden opgeslagen als SQLite BLOBs in plaats van base64-JSON. De namen van de runtime-helpers gebruiken nu SQLite-/state-naamgeving in plaats van*-fs-file-store-naamgeving, en de oudestorePath-shim is verdwenen uit deze stores. Het verouderde JSON-importplan bevindt zich in het Microsoft Teams- Plugin setup-/doctor-migratieoppervlak. - Door Zalo gehoste outbound media gebruikt nu gedeelde SQLite
plugin_blob_entriesin plaats vanopenclaw-zalo-outbound-mediaJSON/bin tijdelijke sidecars. - Diffs viewer-HTML en metadata gebruiken nu gedeelde SQLite
plugin_blob_entriesin plaats van tijdelijkemeta.json-/viewer.html-bestanden. Gerenderde PNG-/PDF-uitvoer blijft tijdelijke materialisaties omdat channel-aflevering nog steeds een bestandspad nodig heeft. - Door Canvas beheerde documenten gebruiken nu gedeelde SQLite
plugin_blob_entriesin plaats van een standaardmapstate/canvas/documents. De Canvas-host serveert die blobs direct; lokale bestanden worden alleen gemaakt voor explicietehost.root- operatorinhoud of tijdelijke materialisatie wanneer een downstream medialeezer een pad vereist. - File Transfer-auditbeslissingen gebruiken nu gedeelde SQLite
plugin_state_entriesin plaats van het onbegrensdeaudit/file-transfer.jsonlruntime-log. Doctor importeert het verouderde JSONL-auditbestand in Plugin-status en verwijdert de bron na een schone import. - ACPX-procesleases en Gateway-instantie-identiteit gebruiken nu gedeelde SQLite-Plugin-
status. Doctor importeert het verouderde
gateway-instance-id-bestand in Plugin-status en verwijdert de bron. - Door ACPX gegenereerde wrapper-scripts en de geïsoleerde Codex-home zijn tijdelijke
materialisatie onder de OpenClaw-temp-root, geen duurzame OpenClaw-status. De
duurzame ACPX-runtime-records zijn de SQLite-lease- en gateway-instance-rijen;
het oude ACPX
stateDir-configoppervlak is verwijderd omdat daar geen runtime-status meer wordt geschreven. - Gateway-media-bijlagen gebruiken nu de gedeelde SQLite-tabel
media_blobsals canonieke byte-store. Lokale paden die aan channel- en sandbox- compatibiliteitsoppervlakken worden teruggegeven, zijn tijdelijke materialisaties van de databaserij, niet de duurzame media-store. Runtime-media-allowlists bevatten niet langer verouderde$OPENCLAW_STATE_DIR/media- of config-dirmedia-roots; die mappen zijn alleen doctor-importbronnen. - Shell completion schrijft niet langer
$OPENCLAW_STATE_DIR/completions/*cache- bestanden. Install-, doctor-, update- en release-smoke-paden gebruiken gegenereerde completion-uitvoer of profile sourcing in plaats van duurzame completion-cache- bestanden. - Gateway skill-upload-staging gebruikt nu gedeelde
skill_uploads-rijen. Upload- metadata, idempotency-sleutels en archiefbytes staan in SQLite; de installer ontvangt alleen een tijdelijk gematerialiseerd archiefpad terwijl een installatie draait. - Inline-bijlagen van subagents worden niet langer gematerialiseerd onder workspace
.openclaw/attachments/*. Het spawn-pad bereidt SQLite VFS-seed-items voor, inline-runs seeden die items in de per-agent runtime scratch-namespace, en disk-backed tools leggen die SQLite scratch als overlay voor bijlagepaden. De oude registry-kolommen en cleanup-hooks voor subagent-run attachment-dir zijn verdwenen. - CLI-afbeeldingshydratie onderhoudt niet langer stabiele
openclaw-cli-imagescache- bestanden. Externe CLI-backends ontvangen nog steeds bestandspaden, maar die paden zijn tijdelijke materialisaties per run met cleanup. - Cache-trace-diagnostiek, Anthropic-payloaddiagnostiek, raw model stream-
diagnostiek, diagnostische timeline-events en Gateway-stabiliteitsbundels schrijven nu
SQLite-rijen in plaats van
logs/*.jsonl- oflogs/stability/*.json-bestanden. Runtime path override-flags en env vars zijn verwijderd; export-/debug- commando's kunnen bestanden expliciet materialiseren vanuit databaserijen. - De macOS-companion heeft niet langer een rollende
diagnostics.jsonl-writer. App- logs gaan naar unified logging, en duurzame Gateway-diagnostiek blijft SQLite-backed. - De macOS port-guardian-recordlijst gebruikt nu getypeerde gedeelde SQLite
macos_port_guardian_records-rijen in plaats van een Application Support-JSON-bestand of opaque singleton-blob. - Gateway singleton-locks gebruiken nu getypeerde gedeelde SQLite
state_leases-rijen onder degateway_locks-scope in plaats van lockbestanden in de temp-dir. Fly- en OAuth- troubleshootingdocumentatie verwijst nu naar de SQLite lease/auth refresh-lock in plaats van verouderde file-lock-cleanup. - Gateway restart sentinel-status gebruikt nu getypeerde gedeelde SQLite
gateway_restart_sentinel-rijen in plaats vanrestart-sentinel.json; runtime leest sentinelsoort, status, routing, bericht, continuation en statistieken uit getypeerde kolommen.payload_jsonis alleen een replay-/debugkopie. Runtime-code wist de SQLite-rij direct en draagt geen file cleanup-plumbing meer mee. - Gateway restart intent- en supervisor handoff-status gebruiken nu getypeerde gedeelde
SQLite
gateway_restart_intent- engateway_restart_handoff-rijen in plaats vangateway-restart-intent.json- engateway-supervisor-restart-handoff.json-sidecars. - Gateway singleton-coördinatie gebruikt nu getypeerde
state_leases-rijen ondergateway_locksin plaats vangateway.<hash>.lock-bestanden te schrijven. De lease-rij bezit de lock owner, expiry, heartbeat en debug-payload; SQLite bezit de atomische acquire/release-grens. De uitgefaseerde file-lock-directory-optie is verdwenen; tests gebruiken de SQLite-rijidentiteit direct. - De oude niet-gerefereerde cron usage-report-helper die
cron/runs/*.jsonl- bestanden scande, is verwijderd. Cron run-history-rapporten moeten de getypeerdecron_run_logsSQLite-rijen lezen. - Main-session restart-herstel ontdekt candidate-agents nu via de
SQLite
agent_databases-registry in plaats vanagents/*/sessions- mappen te scannen. - Gemini session-corruption-herstel verwijdert nu alleen de SQLite session-rij;
het heeft niet langer een verouderde
storePath-gate nodig en probeert geen afgeleid transcript-JSONL-pad te unlinken. - Path override-afhandeling behandelt letterlijke
undefined-/null-environment- waarden nu als unset, waardoor onbedoelde repo-rootundefined/state/*.sqlite- databases tijdens tests of shell-handoffs worden voorkomen. - Config health-fingerprints gebruiken nu getypeerde gedeelde SQLite
config_health_entries- rijen in plaats vanlogs/config-health.json, waardoor het normale configbestand het enige niet-credential configuratiedocument blijft. De macOS-companion houdt alleen proceslokale health-status bij en maakt de oude JSON-sidecar niet opnieuw aan. - Auth profile-runtime importeert of schrijft niet langer credential-JSON-bestanden. De
canonieke credential-store is SQLite;
auth-profiles.json, per-agentauth.jsonen gedeeldecredentials/oauth.jsonzijn doctor-migratie-inputs die na import worden verwijderd. - Auth profile-save-/state-tests controleren nu direct getypeerde SQLite-auth-tabellen en gebruiken verouderde auth-profile-bestandsnamen alleen voor doctor-migratie-inputs.
openclaw secrets applyscrubt alleen het configbestand, env-bestand en de SQLite auth-profile-store. Het draagt niet langer compatibiliteitslogica die uitgefaseerde per-agentauth.jsonbewerkt; doctor bezit het importeren en verwijderen van dat bestand.- Hermes-geheimmigratieplannen en applies importeerden API-key-profielen direct
in de SQLite auth-profile-store. Het schrijft of verifieert niet langer
auth-profiles.jsonals tussendoel. - Gebruikersgerichte auth-documentatie beschrijft nu
state/openclaw.sqlite#table/auth_profile_stores/<agentDir>in plaats van gebruikers te vertellenauth-profiles.jsonte inspecteren of te kopiëren; verouderde OAuth-/auth-JSON- namen blijven alleen gedocumenteerd als doctor-import-inputs. - Core state-path-helpers stellen het uitgefaseerde
credentials/oauth.json- bestand niet langer beschikbaar. De verouderde bestandsnaam is lokaal voor het doctor auth-importpad. - Install-, security-, onboarding-, model-auth- en SecretRef-documentatie beschrijft nu SQLite auth-profile-rijen en whole-state backup/migratie in plaats van per-agent auth-profile-JSON-bestanden.
- PI-modeldiscovery geeft nu canonieke credentials door aan in-memory
pi-coding-agentauth-opslag. Het maakt, scrubt of schrijft niet langer per-agentauth.jsontijdens discovery. - Voice Wake-trigger- en routeringsinstellingen gebruiken nu getypeerde gedeelde SQLite-tabellen
in plaats van
settings/voicewake.json,settings/voicewake-routing.jsonof opaque generieke rijen; doctor importeert de verouderde JSON-bestanden en verwijdert ze na een geslaagde migratie. - Update-check-status gebruikt nu een getypeerde gedeelde
update_check_state-rij in plaats vanupdate-check.jsonof een opaque generieke blob; doctor importeert het verouderde JSON-bestand en verwijdert het na een geslaagde migratie. - Config health-status gebruikt nu getypeerde gedeelde
config_health_entries-rijen in plaats vanlogs/config-health.jsonof een opaque generieke blob; doctor importeert het verouderde JSON-bestand en verwijdert het na een geslaagde migratie. - Goedkeuringen voor Plugin-conversation-bindingen gebruiken nu getypeerde
plugin_binding_approvals-rijen in plaats van opaque gedeelde SQLite-status ofplugin-binding-approvals.json; het legacybestand is invoer voor een doctormigratie. - Generieke bindingen voor huidige gesprekken slaan nu getypeerde
current_conversation_bindings-rijen op in plaats vanbindings/current-conversations.jsonte herschrijven; doctor importeert het legacy-JSON-bestand en verwijdert het na een geslaagde migratie. - Memory Wiki-ledgers voor geïmporteerde-bronsynchronisatie slaan nu één SQLite-rij voor pluginstatus op
per kluis-/bronsleutel in plaats van
.openclaw-wiki/source-sync.jsonte herschrijven; de migratieprovider importeert en verwijdert het legacy-JSON-ledger. - Memory Wiki ChatGPT-records voor importruns slaan nu één SQLite-rij voor pluginstatus op
per kluis-/run-id in plaats van
.openclaw-wiki/import-runs/*.jsonte schrijven. Rollback-snapshots blijven expliciete kluisbestanden totdat archivering van importrun-snapshots naar blobopslag is verplaatst. - Gecompileerde digests van Memory Wiki slaan nu SQLite-pluginblobrijen op in plaats van
.openclaw-wiki/cache/agent-digest.jsonen.openclaw-wiki/cache/claims.jsonlte schrijven. De migratieprovider importeert oude cachebestanden en verwijdert de cachemap wanneer die leeg wordt. - ClawHub-tracking van Skill-installaties slaat nu één SQLite-rij voor pluginstatus op per
werkruimte/skill in plaats van
.clawhub/lock.jsonen.clawhub/origin.json-sidecars tijdens runtime te schrijven of te lezen. Runtimecode gebruikt statusobjecten voor bijgehouden installaties in plaats van lockfile-/origin-abstracties met bestandsvorm. Doctor importeert de legacy-sidecars uit geconfigureerde agentwerkruimten en verwijdert ze na een schone import. - De geïnstalleerde-pluginindex leest en schrijft nu de getypeerde gedeelde SQLite
installed_plugin_index-singletonrij in plaats vanplugins/installs.json; het legacy-JSON-bestand is alleen invoer voor een doctormigratie en wordt na import verwijderd. - De legacy
plugins/installs.json-padhulp leeft nu in legacycode van doctor. Runtime-pluginindexmodules bieden alleen SQLite-ondersteunde persistentieopties, geen JSON-bestandspad. - Gateway-herstartsentinel, herstartintentie en supervisor-overdrachtstatus gebruiken nu
getypeerde gedeelde SQLite-rijen (
gateway_restart_sentinel,gateway_restart_intentengateway_restart_handoff) in plaats van generieke ondoorzichtige blobs. Runtime-herstartcode heeft geen sentinel-/intentie-/overdrachtcontract met bestandsvorm. - Matrix-synchronisatiecache, opslagmetadata, threadbindingen, inbound deduplicatiemarkeringen,
cooldownstatus voor opstartverificatie, SDK IndexedDB-cryptosnapshots,
referenties en herstelsleutels gebruiken nu gedeelde SQLite-pluginstatus-/blobtabellen.
Runtime-padstructs tonen niet langer een
storage-meta.json-metadatapad; die bestandsnaam is alleen invoer voor legacy-migratie. Hun legacy-JSON-importplan leeft in het setup-/doctormigratieoppervlak van de Matrix-plugin. - Matrix-opstart scant, rapporteert of voltooit legacy Matrix-bestandsstatus niet meer. Matrix-bestandsdetectie, aanmaak van legacy-cryptosnapshots, migratiestatus voor room-key-herstel, import en bronverwijdering zijn allemaal eigendom van doctor.
- Matrix-runtime-migratiebarrels zijn verwijderd. Legacy-status-/cryptodetectie en mutatiehelpers worden rechtstreeks door Matrix-doctor geïmporteerd in plaats van deel uit te maken van het runtime-API-oppervlak.
- Markeringen voor hergebruik van Matrix-migratiesnapshots leven nu in SQLite-pluginstatus
in plaats van
matrix/migration-snapshot.json; doctor kan nog steeds hetzelfde geverifieerde premigratiearchief hergebruiken zonder een sidecar-statusbestand te schrijven. - Nostr-buscursors en publicatiestatus van profielen gebruiken nu gedeelde SQLite-pluginstatus. Hun legacy-JSON-importplan leeft in het setup-/doctormigratieoppervlak van de Nostr-plugin.
- Active Memory-sessieschakelaars gebruiken nu gedeelde SQLite-pluginstatus in plaats van
session-toggles.json; geheugen weer inschakelen verwijdert de rij in plaats van een JSON-object te herschrijven. - Skill Workshop-voorstellen en reviewtellers gebruiken nu gedeelde SQLite-pluginstatus
in plaats van
skill-workshop/<workspace>.json-opslag per werkruimte. Elk voorstel is een aparte rij onderskill-workshop/proposals, en de reviewteller is een aparte rij onderskill-workshop/reviews. - Skill Workshop-reviewer-subagentruns gebruiken nu de transcriptresolver voor runtimesessies
in plaats van
skill-workshop/<sessionId>.json-sidecarpaden voor sessies te maken. - ACPX-procesleases gebruiken nu gedeelde SQLite-pluginstatus onder
acpx/process-leasesin plaats van een volledigprocess-leases.json-registerbestand. Elke lease wordt als eigen rij opgeslagen, waardoor het opruimen van verouderde processen bij opstart behouden blijft zonder runtimepad dat JSON herschrijft. - ACPX-wrapperscripts en de geïsoleerde Codex-home worden gegenereerd in de tijdelijke root van OpenClaw. Ze worden opnieuw aangemaakt wanneer nodig en zijn geen backup- of migratie-invoer.
- Persistentie van het subagentrunregister gebruikt getypeerde gedeelde
subagent_runs-rijen. Het oudesubagents/runs.json-pad is nu alleen invoer voor een doctormigratie, en namen van runtimehelpers beschrijven de statuslaag niet langer als schijfondersteund. Runtimetests maken niet langer ongeldige of legeruns.json-fixtures aan om registergedrag te bewijzen; ze seeden/lezen SQLite-rijen rechtstreeks. - Backup staged de statusmap vóór archivering, kopieert niet-databasebestanden,
maakt snapshots van
*.sqlite-databases metVACUUM INTO, laat live WAL/SHM- sidecars weg, registreert snapshotmetadata in het archiefmanifest en registreert voltooide backupruns in SQLite met het archiefmanifest.openclaw backup createvalideert het geschreven archief standaard;--no-verifyis het expliciete snelle pad. openclaw backup restorevalideert het archief vóór extractie, hergebruikt het genormaliseerde manifest van de verifier en herstelt geverifieerde manifestassets naar hun geregistreerde bronpaden. Het vereist--yesvoor schrijfacties en ondersteunt--dry-runvoor een herstelplan.- Het oude backupfilter voor vluchtige paden is verwijderd. Backup heeft geen live-tar-oversla-lijst meer nodig voor legacy sessie- of cron-JSON/JSONL-bestanden omdat SQLite- snapshots vóór archiefaanmaak worden gestaged.
- Eenvoudige setup en onboarding-werkruimtevoorbereiding maken niet langer
agents/<agentId>/sessions/-mappen aan. Ze maken alleen configuratie/werkruimte aan; SQLite-sessierijen en transcriptrijen worden op aanvraag gemaakt in de database per agent. - Reparatie van beveiligingsrechten richt zich nu op de globale en per-agent SQLite-
databases plus WAL/SHM-sidecars in plaats van
sessions.jsonen transcript- JSONL-bestanden. - Runtime-namen van het sandboxregister beschrijven nu SQLite-registertypen rechtstreeks in plaats van legacy-JSON-registerterminologie door de actieve opslag mee te dragen.
openclaw reset --scope config+creds+sessionsverwijdert per-agentopenclaw-agent.sqlite-databases plus WAL/SHM-sidecars, niet alleen legacysessions/-mappen.- Gateway-helpers voor geaggregeerde sessies gebruiken nu invoergerichte namen:
loadCombinedSessionEntriesForGatewayretourneert{ databasePath, entries }. De oude naamgeving voor gecombineerde opslag is verwijderd uit runtime-aanroepers. - Docker MCP-kanaalseeding schrijft nu de hoofd-sessierij en transcriptevents
naar de per-agent SQLite-database in plaats van
sessions.jsonen een JSONL-transcript aan te maken. - De gebundelde sessiegeheugen-hook resolveert nu vorige-sessiecontext uit
SQLite via
{agentId, sessionId}. Hij scant, bewaart of synthetiseert niet langer transcriptpaden ofworkspace/sessions-mappen. - De gebundelde command-logger-hook schrijft nu commando-auditrijen naar de gedeelde
SQLite-tabel
command_log_entriesin plaats van aanlogs/commands.logtoe te voegen. - Allowlists voor kanaalkoppeling tonen nu alleen SQLite-ondersteunde lees-/schrijfhelpers tijdens
runtime en in de plugin-SDK. De oude
*-allowFrom.json-padresolver en bestandlezer leven alleen onder doctor-legacy-importcode. migration_runsregistreert uitvoeringen van legacy-statusmigraties met status, tijdstempels en JSON-rapporten.migration_sourcesregistreert elke geïmporteerde legacy-bestandsbron met hash, grootte, recordaantal, doeltabel, run-id, status en bronverwijderingsstatus.backup_runsregistreert backup-archiefpaden, status en JSON-manifesten.- Het globale schema houdt geen ongebruikte
agents-registertabel bij. Agent- databasedetectie is het canoniekeagent_databases-register totdat runtime een echte eigenaar voor agentrecords heeft. - Gegenereerde configuratie voor modelcatalogi wordt opgeslagen in getypeerde globale SQLite-
agent_model_catalogs-rijen, gesleuteld op agentmap. Runtime-aanroepers gebruikenensureOpenClawModelCatalog; er is geenmodels.json-compatibiliteits-API in runtimecode. De implementatie schrijft SQLite en het ingebedde PI-register wordt gehydrateerd vanuit die opgeslagen payload zonder eenmodels.json-bestand te maken. - QMD-markdownexport van sessietranscripten en
memory.qmd.sessions-configuratie zijn verwijderd. Er is geen QMD-transcriptverzameling, geenqmd/sessions*-runtimepad en geen bestandsgebaseerde brug voor sessiegeheugen. - Memory-core-runtime importeert SQLite-transcriptindexeringshelpers uit
openclaw/plugin-sdk/memory-core-host-engine-session-transcripts, niet het QMD-SDK-subpad. Het QMD-subpad behoudt alleen een compatibiliteits-re-export voor externe aanroepers totdat een grote SDK-opschoning die kan verwijderen. - QMD's eigen
index.sqliteis nu een tijdelijke runtime-materialisatie, ondersteund door de hoofd-SQLite-tabelplugin_blob_entries. Runtime maakt niet langer een duurzame~/.openclaw/agents/<agentId>/qmd-sidecar aan. - De optionele
memory-lancedb-plugin maakt niet langer~/.openclaw/memory/lancedbaan als impliciete door OpenClaw beheerde opslag. Het is een externe LanceDB-backend en blijft uitgeschakeld totdat de operator een explicietedbPathconfigureert. check:database-first-legacy-storesfaalt nieuwe runtimebron die legacy-opslagnamen koppelt aan schrijfachtige bestandssysteem-API's. Het faalt ook runtimebron die de gepensioneerde transcriptbrugmarkeringentranscriptLocatorofsqlite-transcript://...opnieuw introduceert. Migratie, doctor, import en expliciete niet-sessie-exportcode blijven toegestaan. Bredere legacycontract- namen zoalssessionFile,storePathen oudeSessionManager-facades uit het bestandstijdperk hebben nog huidige eigenaars en hebben apart werk voor migratiebewaking nodig voordat ze een vereiste preflightcheck kunnen worden. De guard dekt nu ook runtime-cache/*.json-opslag, generiekethread-bindings.json-sidecars, cron-status-/run-log-JSON, JSON voor configuratiegezondheid, herstart- en lock-sidecars, Voice Wake-instellingen, pluginbindinggoedkeuringen, JSON voor geïnstalleerde-pluginindex, File Transfer-audit-JSONL, Memory Wiki-activiteitslogs, het oude gebundeldecommand-logger-tekstlog en pi-mono raw-stream JSONL- diagnoseknoppen. Hij verbiedt ook oude root-level legacy-modulenamen van doctor zodat compatibiliteitscode ondersrc/commands/doctor/blijft. Android-debughandlers gebruiken ook logcat-/in-memory-uitvoer in plaats vancamera_debug.log- ofdebug_logs.txt-cachebestanden te stagen.
Doelschemavorm
Houd schema's expliciet. Runtime-status die eigendom is van de host gebruikt getypeerde tabellen. Ondoorzichtige status die eigendom is van Plugins gebruikt plugin_state_entries / plugin_blob_entries; er is geen generieke hosttabel kv.
Globale database:
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)Agentdatabase:
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)Toekomstig zoeken kan FTS-tabellen toevoegen zonder de canonieke gebeurtenistabellen te wijzigen:
transcript_events_fts(session_id, seq, text)vfs_entries_fts(namespace, path, text)Grote waarden moeten blob-kolommen gebruiken, geen JSON-stringcodering. Houd value_json voor kleine gestructureerde gegevens die inspecteerbaar moeten blijven met gewone SQLite-tools.
agent_databases is het canonieke register voor deze branch. Voeg geen tabel agents toe totdat er een echte eigenaar van agentrecords bestaat; agentconfiguratie blijft in openclaw.json.
Vorm van Doctor-migratie
Doctor moet een expliciete migratiestap aanroepen die rapporteerbaar is en veilig opnieuw kan worden uitgevoerd:
openclaw doctor --fixopenclaw doctor --fix roept de statusmigratie-implementatie aan na de gewone configuratiepreflight en maakt een geverifieerde back-up vóór import. Runtime-startup en openclaw migrate mogen geen verouderde OpenClaw-statusbestanden importeren.
Migratie-eigenschappen:
- Eén migratiepassage ontdekt alle verouderde bestandsbronnen en maakt een plan voordat er iets wordt gewijzigd.
- Doctor maakt een geverifieerd pre-migratieback-uparchief voordat verouderde bestanden worden geïmporteerd.
- Imports zijn idempotent en worden gekoppeld aan bronpad, mtime, grootte, hash en doeltabel.
- Succesvolle bronbestanden worden verwijderd of gearchiveerd nadat de doeldatabase heeft gecommit.
- Mislukte imports laten de bron ongemoeid en registreren een waarschuwing in
migration_runs. - Runtime-code leest alleen SQLite nadat de migratie bestaat.
- Er is geen downgrade- of export-naar-runtime-bestandenpad vereist.
Migratie-inventaris
Verplaats deze naar de globale database:
- Runtime-schrijfacties voor het taakregister gebruiken nu de gedeelde database; de niet-uitgebrachte
tasks/runs.sqlite-sidecar-importer is verwijderd. Snapshot-opslagen voeren een upsert uit op taak- id en verwijderen alleen ontbrekende taak-/bezorgingsrijen. - Runtime-schrijfacties voor Task Flow gebruiken nu de gedeelde database; de niet-uitgebrachte
tasks/flows/registry.sqlite-sidecar-importer is verwijderd. Snapshot-opslagen voeren een upsert uit op flow-id en verwijderen alleen ontbrekende flowrijen. - Runtime-schrijfacties voor Plugin-status gebruiken nu de gedeelde database; de niet-uitgebrachte
plugin-state/state.sqlite-sidecar-importer is verwijderd. - Ingebouwd geheugen zoeken gebruikt niet langer standaard
memory/<agentId>.sqlite; de indextabellen staan in de database van de eigenaar-agent, en de explicietememorySearch.store.path-sidecar-opt-in is verplaatst naar doctor-configuratiemigratie. - Ingebouwd geheugen opnieuw indexeren reset alleen geheugeneigen tabellen in de agentdatabase. Het mag niet het hele SQLite-bestand vervangen, omdat dezelfde database ook sessies, transcripties, VFS-rijen, artefacten en runtimecaches bezit.
- Sandbox-container-/browserregisters uit monolithische en geshardede JSON. Runtime- schrijfacties gebruiken nu de gedeelde database; import van verouderde JSON blijft bestaan.
- Cron-taakdefinities, planningsstatus en uitvoeringsgeschiedenis gebruiken nu gedeelde SQLite;
doctor importeert/verwijdert verouderde
jobs.json-,jobs-state.json- encron/runs/*.jsonl-bestanden - Apparaatidentiteit/auth, push, updatecontrole, commitments, OpenRouter-model- cache, index van geïnstalleerde plugins en app-serverbindingen
- Apparaat-/Node-koppeling en bootstrap-records gebruiken nu getypeerde SQLite-tabellen
- Device-pair-meldingsabonnees en markers voor geleverde verzoeken gebruiken nu de
gedeelde SQLite-plugin-statustabel in plaats van
device-pair-notify.json. - Gespreksrecords voor spraakoproepen gebruiken nu de gedeelde SQLite-plugin-statustabel onder de
voice-call/calls-namespace in plaats vancalls.jsonl; de Plugin-CLI volgt en vat SQLite-ondersteunde gespreksgeschiedenis samen. - QQBot Gateway-sessies, bekende-gebruiker-records en ref-index-citaatcache gebruiken nu
SQLite-pluginstatus onder
qqbot-namespaces (gateway-sessions,known-users,ref-index) in plaats vansession-*.json,known-users.jsonenref-index.jsonl. Die verouderde bestanden zijn caches en worden niet gemigreerd. - Discord-modelkiezer-voorkeuren, command-deploy-hashes en threadbindingen
gebruiken nu SQLite-pluginstatus onder
discord-namespaces (model-picker-preferences,command-deploy-hashes,thread-bindings) in plaats vanmodel-picker-preferences.json,command-deploy-cache.jsonenthread-bindings.json; de Discord doctor/setup-migratie importeert en verwijdert de verouderde bestanden. - BlueBubbles-catchup-cursors en inkomende dedupe-markers gebruiken nu SQLite-pluginstatus
onder
bluebubbles-namespaces (catchup-cursors,inbound-dedupe) in plaats vanbluebubbles/catchup/*.jsonenbluebubbles/inbound-dedupe/*.json; de BlueBubbles doctor/setup-migratie importeert en verwijdert de verouderde bestanden. - Telegram-update-offsets, stickercache-items, berichtcache-items voor antwoordketens,
verzonden-berichtcache-items, onderwerpnaamcache-items en threadbindingen
gebruiken nu SQLite-pluginstatus onder
telegram-namespaces (update-offsets,sticker-cache,message-cache,sent-messages,topic-names,thread-bindings) in plaats vanupdate-offset-*.json,sticker-cache.json,*.telegram-messages.json,*.telegram-sent-messages.json,*.telegram-topic-names.jsonenthread-bindings-*.json; de Telegram doctor/setup-migratie importeert en verwijdert de verouderde bestanden. - iMessage-catchup-cursors, mappings voor korte antwoord-id's en dedupe-rijen voor verzonden echo's
gebruiken nu SQLite-pluginstatus onder
imessage-namespaces (catchup-cursors,reply-cache,sent-echoes) in plaats vanimessage/catchup/*.json,imessage/reply-cache.jsonlenimessage/sent-echoes.jsonl; de iMessage doctor/setup-migratie importeert en verwijdert de verouderde bestanden. - Microsoft Teams-gesprekken, polls, SSO-tokens en feedbacklearnings gebruiken nu
SQLite-pluginstatusnamespaces (
conversations,polls,sso-tokens,feedback-learnings) in plaats vanmsteams-conversations.json,msteams-polls.json,msteams-sso-tokens.jsonen*.learnings.json; de Microsoft Teams doctor/setup-migratie importeert en archiveert de verouderde bestanden. Wachtende uploads zijn een kortlevende SQLite-cache en oude JSON-cachebestanden worden niet gemigreerd. - Matrix-synccache, opslagmetadata, threadbindingen, inkomende dedupe-markers,
cooldownstatus voor opstartverificatie, referenties, herstelsleutels en SDK
IndexedDB-cryptosnapshots gebruiken nu SQLite-pluginstatus-/blobnamespaces onder
matrix(sync-store,storage-meta,thread-bindings,inbound-dedupe,startup-verification,credentials,recovery-key,idb-snapshots) in plaats vanbot-storage.json,storage-meta.json,thread-bindings.json,inbound-dedupe.json,startup-verification.json,credentials.json,recovery-key.jsonencrypto-idb-snapshot.json; de Matrix doctor/setup- migratie importeert en verwijdert die verouderde bestanden uit accountgebonden Matrix- opslagroots. - Nostr-buscursors en publicatiestatus van profielen gebruiken nu SQLite-pluginstatus onder
nostr-namespaces (bus-state,profile-state) in plaats vanbus-state-*.jsonenprofile-state-*.json; de Nostr doctor/setup- migratie importeert en verwijdert de verouderde bestanden. - Active Memory-sessietoggles gebruiken nu SQLite-pluginstatus onder
active-memory/session-togglesin plaats vansession-toggles.json. - Skill Workshop-voorstelwachtrijen en reviewtellers gebruiken nu SQLite-pluginstatus
onder
skill-workshop/proposalsenskill-workshop/reviewsin plaats van per-workspaceskill-workshop/<workspace>.json-bestanden. - Wachtrijen voor uitgaande bezorging en sessiebezorging delen nu de globale SQLite-
delivery_queue_entries-tabel onder afzonderlijke wachtrijnamen (outbound-delivery,session-delivery) in plaats van duurzamedelivery-queue/*.json,delivery-queue/failed/*.jsonensession-delivery-queue/*.json-bestanden. De doctor legacy-state-stap importeert wachtende en mislukte rijen, verwijdert verouderde geleverde markers en verwijdert de oude JSON-bestanden na import. Hot-routing- en retryvelden zijn getypeerde kolommen; de JSON-payload blijft alleen behouden voor replay/debug. - ACPX-procesleases gebruiken nu SQLite-pluginstatus onder
acpx/process-leasesin plaats vanprocess-leases.json. - Metadata van back-up- en migratieruns
Verplaats deze naar agentdatabases:
- Agent-sessieroots en compatibiliteitsvormige session-entry-payloads. Gereed voor
runtime-schrijfacties: hot sessiemetadata is opvraagbaar in
sessions, terwijl de volledige verouderd gevormdeSessionEntry-payload insession_entriesblijft. - Agent-transcriptiegebeurtenissen. Gereed voor runtime-schrijfacties.
- Compaction-checkpoints en transcriptiesnapshots. Gereed voor runtime-schrijfacties:
checkpoint-transcriptiekopieën zijn SQLite-transcriptierijen en checkpoint-
metadata wordt vastgelegd in
transcript_snapshots. Gateway-checkpointhelpers noemen deze waarden nu transcriptiesnapshots in plaats van bronbestanden. - Agent-VFS-scratch-/workspace-namespaces. Gereed voor runtime-VFS-schrijfacties.
- Subagent-bijlagepayloads. Gereed voor runtime-schrijfacties: het zijn SQLite-VFS- seed-items en nooit duurzame workspacebestanden.
- Toolartefacten. Gereed voor runtime-schrijfacties.
- Runartefacten. Gereed voor worker-runtime-schrijfacties via de per-agent
run_artifacts-tabel. - Agent-lokale runtimecaches. Gereed voor worker-runtime-scoped cache-schrijfacties via
de per-agent
cache_entries-tabel. Gateway-brede modelcaches blijven in de globale database tenzij ze agent-specifiek worden. - ACP-parentstreamlogs. Gereed voor runtime-schrijfacties.
- ACP-replay-ledgersessies. Gereed voor runtime-schrijfacties via
acp_replay_sessionsenacp_replay_events; verouderdeacp/event-ledger.jsonblijft alleen als doctor-input bestaan. - ACP-sessiemetadata. Gereed voor runtime-schrijfacties via
acp_sessions; verouderdeentry.acp-blokken insessions.jsonzijn alleen input voor doctor-migratie. - Trajectory-sidecars wanneer het geen expliciete exportbestanden zijn. Gereed voor runtime-
schrijfacties: trajectory-capture schrijft agentdatabase-
trajectory_runtime_events- rijen en spiegelt run-scoped artefacten naar SQLite. Verouderde sidecars zijn alleen doctor-importinput; export kan verse JSONL-supportbundeloutputs materialiseren maar leest of migreert oude trajectory-/transcriptiesidecars niet tijdens runtime. Runtime-trajectory-capture stelt SQLite-scope beschikbaar; JSONL-padhelpers zijn geïsoleerd tot export-/debugondersteuning en worden niet opnieuw geëxporteerd vanuit de runtimemodule. Embedded-runner-trajectorymetadata registreert{agentId, sessionId, sessionKey}- identiteit in plaats van een transcriptielocator te bewaren.
Houd deze voorlopig bestandsgebaseerd:
openclaw.json- provider- of CLI-referentiebestanden
- plugin-/pakketmanifests
- gebruikersworkspaces en Git-repositories wanneer schijfmodus is geselecteerd
- logs bedoeld voor operator-tailing, tenzij een specifiek logoppervlak wordt verplaatst
Migratieplan
Fase 0: De grens bevriezen
Maak de duurzame-statusgrens expliciet voordat meer rijen worden verplaatst:
- Voeg een
migration_runs-tabel toe aan de globale database. Gereed voor uitvoeringsrapporten van legacy-state-migraties. - Voeg één doctor-eigen statusmigratieservice toe voor import van bestand naar database.
Gereed:
openclaw doctor --fixgebruikt de legacy-state-migratie-implementatie. - Maak
planalleen-lezen en laatapplyeen back-up maken, importeren, verifiëren en daarna oude bestanden verwijderen of in quarantaine plaatsen. Gereed: doctor maakt een geverifieerde pre-migratieback-up, geeft het back-uppad door aanmigration_runsen hergebruikt de importer-/verwijderpaden. - Voeg statische verboden toe zodat nieuwe runtimecode geen verouderde statusbestanden kan schrijven terwijl migratiecode en tests ze nog steeds kunnen seeden/lezen. Gereed voor de momenteel gemigreerde verouderde stores; de guard scant ook geneste tests op verboden runtime-transcriptielocatorcontracten.
Fase 1: Het globale control plane afronden
Houd gedeelde coördinatiestatus in state/openclaw.sqlite:
- Agents en agentdatabaseregister
- Task- en Task Flow-ledgers
- Pluginstatus
- Sandbox-container-/browserregister
- Cron-/scheduler-uitvoeringsgeschiedenis
- Koppeling, apparaat, push, updatecontrole, TUI, OpenRouter-/modelcaches en andere kleine Gateway-scoped runtime-status
- Back-up- en migratiemetadata
- Gateway-mediabijlagebytes. Gereed voor runtime-schrijfacties; directe bestandspaden
zijn tijdelijke materialisaties voor compatibiliteit met kanaalverzenders en sandbox-
staging. Runtime-allowlists accepteren SQLite-materialisatiepaden, niet verouderde
state-/config-mediaroots. Doctor importeert verouderde mediabestanden naar
media_blobsen verwijdert de bronbestanden na geslaagde rijschrijfacties. - Debugproxy-capturesessies, gebeurtenissen en payloadblobs. Gereed: captures leven
in de gedeelde status-DB en openen via de bootstrap, het schema, WAL en de
busy-timeout-instellingen van de gedeelde status-DB. Payloadbytes zijn gzip-gecomprimeerd in
capture_blobs.data; er is geen runtime-sidecar-DB-override voor debugproxy, blobdirectory of proxy-capture-only gegenereerd schema/codegen-target. Doctor-/opstartmigratie importeert verzondendebug-proxy/capture.sqlite-rijen en gerefereerde payloadblobs, inclusief actieve verouderde DB-/blobomgevings- overrides, en archiveert daarna die bronnen terwijl CA-certificaten intact blijven.
Deze fase verwijdert ook dubbele sidecar-openers, permissiehelpers, WAL- setup, bestandssysteemopschoning en compatibiliteitsschrijvers uit die subsystemen.
Fase 2: Per-agent-databases introduceren
Maak één database per agent en registreer die vanuit de globale DB:
~/.openclaw/state/openclaw.sqlite~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqliteDe globale agent_databases-rij bewaart het pad, de schemaversie, de last-seen-
tijdstempel en basismetadata voor grootte/integriteit. Runtimecode vraagt het register om
de agent-DB in plaats van bestandspaden direct af te leiden.
De agent-DB bezit:
sessionsals de canonieke sessieroot, metsession_entriesals de compatibel gevormde payloadtabel die aan die root is gekoppeld, ensession_routesals de unieke actievesession_key-lookupconversationsensession_conversationsals de genormaliseerde provider- routeringsidentiteit die aan sessies is gekoppeldtranscript_events- transcriptsnapshots en Compaction-checkpoints. Voltooid voor runtime-writes.
vfs_entriestool_artifactsen run-artefacten- agent-lokale runtime-/cacherijen. Voltooid voor worker-scoped caches.
- ACP-parentstreamevents
- trajectory-runtime-events wanneer ze geen expliciete exportartefacten zijn
Fase 3: Vervang Session Store-API's
Voltooid voor runtime. Het bestandsvormige session store-oppervlak is geen actief runtimecontract:
- Runtime roept
loadSessionStore(storePath)niet meer aan en behandeltstorePathniet als sessie-identiteit. - Runtime-rijbewerkingen zijn
getSessionEntry,upsertSessionEntry,patchSessionEntry,deleteSessionEntryenlistSessionEntries. - Helpers voor herschrijven van de hele store, bestandswriters, queue-tests, aliasopschoning en parameters voor legacy-keyverwijdering zijn uit runtime verdwenen.
- Verouderde compatibiliteitsexports van het rootpakket passen canonieke
sessions.json-paden nog steeds aan op de SQLite-rij-API's. sessions.json-parsing blijft alleen in doctor-migratie-/importcode en doctor-tests.- Runtime-lifecyclefallbacks lezen SQLite-transcriptheaders, niet de eerste JSONL-regels.
Blijf alles verwijderen dat bestandslockparameters, vocabulaire rond opschonen/afkappen-als-bestandsonderhoud, store-path-identiteit of tests opnieuw introduceert waarvan de enige assertie JSON-persistentie is.
Fase 4: Verplaats transcripts, ACP-streams, trajectories en VFS
Maak elke agentdatastream database-native:
- Transcript-append-writes lopen via één SQLite-transactie die de sessieheader
waarborgt, bericht-idempotentie controleert, de parent-tail selecteert, invoegt
in
transcript_eventsen doorzoekbare identiteitsmetadata vastlegt intranscript_event_identities. Voltooid voor directe transcriptbericht-appends en normale persistenteTranscriptSessionManager-appends; expliciete branchbewerkingen behouden hun expliciete parentkeuze en schrijven nog steeds SQLite-rijen zonder een bestandslocator af te leiden. - ACP-parentstreamlogs worden rijen, geen
.acp-stream.jsonl-bestanden. Voltooid. - ACP-spawnsetup persisteert geen transcript-JSONL-paden meer. Voltooid.
- Runtime-trajectorycapture schrijft eventrijen/artefacten direct. De expliciete support-/exportopdracht kan nog steeds support-bundle-JSONL-artefacten als exportformaat produceren, maar sessie-export maakt geen sessie-JSONL opnieuw aan. Voltooid.
- Schijfworkspaces blijven op schijf wanneer ze als schijfmodus zijn geconfigureerd.
- VFS-scratch en experimentele VFS-only-workspacemodus gebruiken de agent-DB.
De migratie importeert oude JSONL-bestanden één keer, legt aantallen/hashes vast
in migration_runs en verwijdert geïmporteerde bestanden na
integriteitscontroles.
Fase 5: Back-up, herstel, vacuum en verificatie
Back-ups blijven één archiefbestand:
- Checkpoint elke globale en agentdatabase.
- Snapshot elke DB met SQLite-back-upsemantiek of
VACUUM INTO. - Archiveer compacte DB-snapshots, configuratie, externe credentials en aangevraagde workspace-exports.
- Laat ruwe live
*.sqlite-wal- en*.sqlite-shm-bestanden weg. - Verifieer door elke DB-snapshot te openen en
PRAGMA integrity_checkuit te voeren.openclaw backup createdoet deze archiefverificatie standaard;--no-verifyslaat alleen de archiefpass na het schrijven over, niet de integriteitscontrole bij het maken van de snapshot. - Herstel kopieert snapshots terug naar hun doelpaden. Deze branch reset de
niet-verzonden SQLite-layout naar
user_version = 1; toekomstige verzonden schemawijzigingen kunnen expliciete migraties toevoegen wanneer die nodig zijn.
Fase 6: Worker-runtime
Houd workermodus experimenteel terwijl de databasesplitsing landt:
- Workers ontvangen agent-id, run-id, bestandssysteemmodus en DB-registry-identiteit.
- Elke worker opent zijn eigen SQLite-verbinding.
- Parent behoudt autoriteit over kanaallevering, approvals, configuratie en annulering.
- Begin met één worker per actieve run; voeg pooling pas toe nadat lifecycle en eigenaarschap van DB-verbindingen stabiel zijn.
Fase 7: Verwijder de oude wereld
Voltooid voor runtime-sessiebeheer. De oude wereld is alleen toegestaan als expliciete doctor-input of support-/exportoutput:
- Geen runtime-writes naar
sessions.json, transcript-JSONL, sandboxregistry-JSON, taak-sidecar-SQLite of plugin-state-sidecar-SQLite. - Geen JSON-/sessiebestandopschoning, transcriptbestand-afkapping, sessiebestandslocks of lockvormige sessietests.
- Geen runtime-compatibiliteitsexports waarvan het doel is oude sessiebestanden actueel te houden.
- Expliciete supportexports blijven door de gebruiker aangevraagde archief-/materialisatieformaten en mogen bestandsnamen niet terugvoeren naar runtime-identiteit.
Back-up en herstel
Back-ups moeten één archiefbestand zijn, maar databasecapture moet SQLite-native zijn:
- Stop langdurige write-activiteit of ga een korte back-upbarrière in.
- Voer voor elke globale en agentdatabase een checkpoint uit.
- Maak een snapshot van elke database met SQLite-back-upsemantiek of
VACUUM INTOnaar een tijdelijke back-updirectory. - Archiveer de gecompacteerde databasesnapshots, het configuratiebestand, de credentialsdirectory, geselecteerde workspaces en een manifest.
- Verifieer het archief door elke opgenomen SQLite-snapshot te openen en
PRAGMA integrity_checkuit te voeren.openclaw backup createdoet dit standaard;--no-verifyis alleen bedoeld om bewust de archiefpass na het schrijven over te slaan.
Vertrouw niet op ruwe live kopieën van *.sqlite, *.sqlite-wal en
*.sqlite-shm als primair back-upformaat. Het archiefmanifest moet
databaserol, agent-id, schemaversie, bronpad, snapshotpad, bytegrootte en
integriteitsstatus vastleggen.
Herstel moet de globale database- en agentdatabasebestanden opnieuw opbouwen vanuit de archiefsnapshots. Omdat de SQLite-layout nog niet is verzonden, behoudt deze refactor alleen het versie-1-schema plus doctor-import van bestand naar database. De herstelopdracht valideert eerst het archief en vervangt daarna elk manifestasset vanuit de geverifieerde uitgepakte payload.
Runtime-refactorplan
-
Voeg database-registry-API's toe.
- Los globale DB- en per-agent-DB-paden op.
- Houd de niet-verzonden schema's op
user_version = 1; voeg geen schemamigratierunnercode toe totdat een verzonden schema die nodig heeft. - Voeg close-/checkpoint-/integriteitshelpers toe die door tests, back-up en doctor worden gebruikt.
-
Vouw sidecar-SQLite-stores samen.
- Verplaats plugin-statetabellen naar de globale database. Voltooid voor runtime-writes; de niet-verzonden legacy-sidecarimporter is verwijderd.
- Verplaats taakregistrytabellen naar de globale database. Voltooid voor runtime-writes; de niet-verzonden legacy-sidecarimporter is verwijderd.
- Verplaats Task Flow-tabellen naar de globale database. Voltooid voor runtime-writes; de niet-verzonden legacy-sidecarimporter is verwijderd.
- Verplaats ingebouwde memory-search-tabellen naar elke agentdatabase.
Voltooid; expliciete aangepaste
memorySearch.store.pathwordt nu verwijderd door doctor-configuratiemigratie. Volledige herindexering draait in place alleen tegen memorytabellen; het oude pad voor whole-file swap en de sidecar-indexswaphelper zijn verwijderd. - Verwijder dubbele database-openers, WAL-setup, permissionhelpers en close-paden uit die subsystemen.
-
Verplaats agent-owned tabellen naar per-agent-databases.
- Maak agent-DB on demand aan via de globale databaseregistry. Voltooid.
- Verplaats runtime-sessie-items, transcriptevents, VFS-rijen en toolartefacten naar agent-DB's. Voltooid.
- Migreer geen branch-lokale shared-DB-sessie-items, transcriptevents, VFS-rijen of toolartefacten; die layout is nooit verzonden. Behoud alleen legacy import van bestand naar database in doctor.
-
Vervang session store-API's.
- Verwijder
storePathals runtime-identiteit. Voltooid voor runtime en bewaakt doorcheck:database-first-legacy-stores: sessiemetadata, route-updates, commandopersistentie, CLI-sessieopschoning, Feishu-reasoningpreviews, transcript-statepersistentie, subagentdiepte, sessieoverrides voor authprofielen, parent-forklogica en QA-lab-inspectie lossen de database nu op vanuit canonieke agent-/sessiesleutels. Gateway-/TUI-/UI-/macOS-sessielijstresponses tonen nudatabasePathin plaats van legacypath; macOS-debugoppervlakken tonen de per-agentdatabase als read-only state in plaats vansession.store-configuratie te schrijven./status, chatgestuurde trajectory-export en CLI-dependencyproxies geven legacy store-paden niet meer door; transcriptgebruiksfallback leest SQLite via agent-/sessie-identiteit. Runtime- en bridgetests tonenstorePathniet meer; doctor-/migratie-inputs bezitten die legacy-veldnaam. Gateway combined-session loading heeft geen speciale runtimebranch meer voor niet-getemplatiseerdesession.store-waarden; het aggregeert per-agent-SQLite-rijen. De legacy doctor-lane voor session locks en de bijbehorende.jsonl.lock-opschoonhelper zijn verwijderd; SQLite is nu de sessie-concurrencygrens. Hot runtime-call sites gebruiken rijgerichte helpernamen zoalsresolveSessionRowEntry; de ouderesolveSessionStoreEntry-compatibiliteitsalias is verwijderd uit runtime en Plugin SDK-exports.
- Verwijder
- Gebruik
{ agentId, sessionKey }-rijbewerkingen. Voltooid:getSessionEntry,upsertSessionEntry,deleteSessionEntry,patchSessionEntryenlistSessionEntrieszijn SQLite-first API's die geen session store-pad vereisen. Statussamenvatting, lokale agentstatus, health en de listingopdrachtopenclaw sessionslezen nu rechtstreeks per-agent-rijen en tonen per-agent-SQLite-databasepaden in plaats vansessions.json-paden. - Vervang whole-store delete/insert door
upsertSessionEntry,deleteSessionEntry,listSessionEntriesen SQL-cleanupqueries. Voltooid voor runtime: hot paths gebruiken nu rij-API's en conflict-retried rijpatches; overgebleven whole-store-import-/replacehelpers zijn beperkt tot migratie-importcode en SQLite-backendtests.- Verwijder
store-writer.tsen writer-queue-tests. Voltooid. - Verwijder runtime legacy-keyopschoning en alias-deleteparameters uit sessie-row-upserts/-patches. Voltooid.
- Verwijder
- Verwijder runtime-JSON-registrygedrag.
- Maak sandboxregistry reads en writes alleen SQLite. Voltooid.
- Importeer monolithische en sharded JSON alleen vanuit de migratiestap. Voltooid.
- Verwijder sharded registry-locks en JSON-writes. Voltooid.
- Behoud één getypeerde registrytabel in plaats van registryrijen als generieke opaque JSON op te slaan als de vorm hot-path operationele state blijft. Voltooid.
-
Verwijder bestandslockvormige sessiemutatie.
- Voltooid voor runtime-lockaanmaak en runtime-lock-API's.
- De standalone legacy
.jsonl.lock-doctoropschoonlane is verwijderd. session.writeLockis door doctor gemigreerde legacyconfiguratie, geen getypeerde runtime-instelling.- State-integriteit heeft geen apart pad meer voor het opschonen van orphan transcriptbestanden; doctor-migratie importeert/verwijdert legacy JSONL-bronnen op één plek.
- Gateway-singletoncoördinatie gebruikt getypeerde SQLite-
state_leases-rijen ondergateway_locksen toont geen bestandslockdirectory-seam meer. - Generieke Plugin SDK-dedupepersistentie gebruikt geen bestandslocks of JSON-bestanden meer; het schrijft gedeelde SQLite-plugin-state-rijen. Voltooid.
- QMD-embedcoördinatie gebruikt een SQLite-state lease in plaats van
qmd/embed.lock. Voltooid.
-
Maak workers database-aware.
- Workers openen hun eigen SQLite-verbindingen.
- Parent bezit delivery, channel callbacks en configuratie.
- Worker ontvangt agent-id, run-id, bestandssysteemmodus en DB-registry-identiteit, geen live handles.
vfs-onlyblijft experimenteel en gebruikt de agentdatabase als zijn storageroot.- Houd eerst één worker per actieve run. Pooling kan wachten totdat de levensduur van DB-verbindingen en annuleringsgedrag stabiel zijn.
-
Back-upintegratie.
- Leer back-up globale en agentdatabases vast te leggen via SQLite-back-up of
VACUUM INTO. Gedaan voor ontdekte*.sqlite-bestanden onder het state-asset. - Voeg back-upverificatie toe voor SQLite-integriteit en schemaversie. Gedaan voor integriteitscontroles bij back-upcreatie en standaard archiefverificatie.
- Registreer metadata van back-upruns in SQLite. Gedaan via de gedeelde
backup_runs-tabel met archiefpad, status en manifest-JSON. - Voeg herstel uit geverifieerde archiefmomentopnamen toe. Gedaan:
openclaw backup restorevalideert vóór extractie, gebruikt het genormaliseerde manifest van de verifier, ondersteunt--dry-run, en vereist--yesvoordat geregistreerde bronpaden worden vervangen. - Neem VFS-/werkruimte-export alleen op wanneer daarom wordt gevraagd; exporteer sessie- internals niet als JSON of JSONL.
- Leer back-up globale en agentdatabases vast te leggen via SQLite-back-up of
-
Verwijder verouderde tests en code. Gedaan voor de bekende runtime-sessiesurfaces.
-
Verwijder tests die runtime-creatie van
sessions.jsonof transcript- JSONL-bestanden afdwingen. Gedaan voor core-sessieopslag, chat, Gateway-transcriptgebeurtenissen, preview, levenscyclus, commandosessie-entry-updates, auto-reply reset/trace, en memory-core dreaming-fixtures, approval-targetrouting, sessietranscript- reparatie, beveiligingsmachtigingsreparatie, trajectexport en sessie-export. Active-memory-transcripttests controleren nu SQLite-scopes en dat er geen tijdelijke of gepersisteerde JSONL-bestanden worden aangemaakt. De oude Heartbeat-regressie voor transcript-pruning is verwijderd omdat runtime JSONL-transcripten niet langer afkapt. Tests voor de agent session-list-tool modelleren legacysessions.json-paden niet langer als de Gateway-responsvorm; app-/UI-/macOS-tests gebruikendatabasePath./status-tests voor transcriptgebruik seeden nu direct SQLite-transcriptrijen in plaats van JSONL-bestanden te schrijven. Gateway-tests voor sessielevenscyclus gebruiken nu direct SQLite-transcriptseedinghelpers; de oude single-line sessiebestand-fixturevorm is verdwenen uit reset- en delete-dekking.sessions.deleteretourneert niet langer een bestandsperiodeveldarchived: []; verwijdering rapporteert alleen het resultaat van de rijmutatie. De oude optiedeleteTranscriptis ook verdwenen: het verwijderen van een sessie verwijdert de canoniekesessions-root en laat SQLite sessie-eigen transcript-, snapshot- en trajectrijen cascaderen, zodat geen aanroeper transcriptwezen kan achterlaten of een cleanup-branch kan vergeten. Tests voor context-engine-trajectcapture lezen nutrajectory_runtime_events- rijen uit een geïsoleerde agentdatabase in plaats vansession.trajectory.jsonlte lezen. Docker MCP-channel seed-scripts seeden nu direct SQLite-rijen. Directesessions.json-writes zijn beperkt tot doctor-fixtures. Tool Search Gateway E2E leest tool-call-bewijs uit SQLite-transcriptrijen in plaats vanagents/<agentId>/sessions/*.jsonl-bestanden te scannen. Memory-core host events en session-corpus scratch-rijen leven nu in gedeelde SQLite plugin-state;events.jsonlensession-corpus/*.txtzijn alleen legacy doctor-migratie-invoer. Actieve rijen gebruiken virtuele padenmemory/session-ingestion/, niet.dreams/session-corpus. De oude memory-core dreaming- reparatiemodule en de CLI-/Gateway-tests ervan zijn verwijderd omdat runtime niet langer bestandarchiefreparatie voor die corpus bezit. Memory-core bridge-/public-artifact-tests tonen.dreams/events.jsonlniet langer; ze gebruiken de door SQLite ondersteunde virtuele JSON-artefactnaam. Public SDK-/Codex-testdocumentatie zegt nu SQLite-sessiestatus in plaats van sessie- bestanden, en het channel-turn-voorbeeld toont niet langer eenstorePath-argument. Matrix-syncstatus gebruikt nu direct de SQLite plugin-state store. Actieve client-/runtimecontracten geven een accountopslagroot door, geenbot-storage.json- pad, en doctor importeert legacybot-storage.jsonin SQLite voordat de bron wordt verwijderd. QA Matrix restart/destructive-scenario's muteren nu direct de SQLite-sync- rij in plaats van neppebot-storage.json-bestanden te maken of te verwijderen, en het E2EE-substraat geeft een sync-store-root door in plaats van een nepsync-store.json-pad. Matrix-selectie van storage-root scoort roots niet langer op legacy sync-/thread-JSON- bestanden; deze gebruikt duurzame rootmetadata plus echte cryptostatus. De runtime SQLite-sessiebackend-testsuite fabriceert niet langer eensessions.json; legacy bron-fixtures leven nu in de doctor- tests die ze importeren. Gateway-sessietests tonen niet langer eencreateSessionStoreDir-helper of ongebruikte temp session-store-padsetup; fixturemappen zijn expliciet, en directe rijsetup gebruikt SQLite session-row-naamgeving. Doctor-only JSON5 parserdekking voor session-store is verplaatst uit infratests naar doctor-migratietests, zodat runtime-testsuites niet langer legacy sessiebestandparsing bezitten. Microsoft Teams runtime SSO-/pending-upload-tests dragen niet langer JSON-sidecar- fixtures of parsers; legacy SSO-tokenparsing leeft alleen in de Plugin- migratiemodule. Telegram-tests seeden niet langer neppe/tmp/*.jsonstore- paden; ze resetten direct de door SQLite ondersteunde berichtcache. De generieke OpenClaw test-state-helper exposeert niet langer een legacyauth-profiles.json- writer; doctor-authmigratietests bezitten die fixture lokaal. Runtime-tests voor TUI last-session-pointers, exec approvals, active-memory- toggles, Matrix-dedupe-/startupverificatie, Memory Wiki-bronsync, current-conversation-bindings, onboarding-auth en Hermes-secretimports produceren niet langer oude sidecar-bestanden of controleren dat oude bestandsnamen afwezig zijn. Ze bewijzen gedrag via SQLite-rijen en publieke store-API's; doctor-/migratie- tests zijn de enige plaats waar legacy bronbestandsnamen thuishoren. Runtime-tests voor device-/node-pairing, channel allowFrom, restart intents, restart handoff, sessie-delivery-queue-entries, config health, iMessage- caches, Cron-taken, PI-transcriptheaders, subagent-registries en beheerde afbeeldingsbijlagen maken ook niet langer gepensioneerde JSON-/JSONL-bestanden alleen om te bewijzen dat ze worden genegeerd of afwezig zijn. PI-overflowherstel heeft niet langer een SessionManager rewrite-/truncation- fallback: tool-result-truncation en context-engine transcript-rewrites muteren SQLite-transcriptrijen en verversen daarna actieve promptstatus vanuit de database. Gepersisteerde SessionManager-berichtappends delegeren naar de atomische SQLite transcript-appendhelper voor ouderselectie en idempotentie. Normale metadata-/custom-entry-appends selecteren ook de huidige ouder binnen SQLite, zodat verouderde managerinstances geen pre-SQLite parent-chain-races laten herleven. Synthetische PI-tail-cleanup voor mid-turn-prechecks ensessions_yieldtrimt nu direct SQLite-transcriptstatus; de oude SessionManager tail-removal- bridge en de tests ervan zijn verwijderd. Compaction-checkpointcapture maakt ook alleen snapshots vanuit SQLite; aanroepers geven niet langer een live SessionManager door als alternatieve transcriptbron. -
Behoud tests die legacy-bestanden seeden alleen voor migratie.
-
JSON-bestandsbewijs is vervangen door SQL-rijbewijs voor actieve runtime- surfaces.
-
Voeg statische verboden toe voor runtime-writes naar legacy sessie-/cache-JSON-paden. Gedaan voor de repo-guard.
- Maak het migratierapport controleerbaar.
- Registreer migratieruns in SQLite met start-/eindtijdstempels, bron-
paden, bronhashes, aantallen, waarschuwingen en back-uppad.
Gedaan: legacy-state-migratieuitvoeringen persisteren nu een
migration_runs- rapport met bronpad-/tabelinventaris, SHA-256 van bronbestand, groottes, recordaantallen, waarschuwingen en back-uppad. Gedaan: legacy-state-migratieuitvoeringen persisteren ookmigration_sources- rijen voor audit op bronniveau en toekomstige skip-/backfill-beslissingen. - Maak apply idempotent. Opnieuw uitvoeren na een gedeeltelijke import moet ofwel een al geïmporteerde bron overslaan of mergen op stabiele sleutel. Gedaan: sessie-indexen, transcripten, delivery queues, plugin-state, task- ledgers en agent-eigen globale SQLite-rijen importeren via stabiele sleutels of upsert-/replace-semantiek, zodat heruitvoeringen mergen zonder duurzame rijen te dupliceren.
- Mislukte imports moeten het oorspronkelijke bronbestand laten staan.
Gedaan: mislukte transcriptimports laten nu de oorspronkelijke JSONL-bron op
het gedetecteerde pad staan, en
migration_sourcesregistreert de bron alswarningmetremoved_source=0voor de volgende doctor-run.
- Registreer migratieruns in SQLite met start-/eindtijdstempels, bron-
paden, bronhashes, aantallen, waarschuwingen en back-uppad.
Gedaan: legacy-state-migratieuitvoeringen persisteren nu een
Prestatieregels
- Eén verbinding per thread/proces is prima; deel handles niet tussen workers.
- Gebruik WAL,
foreign_keys=ON, een busy-timeout van 30 s en korteBEGIN IMMEDIATE- schrijfacties. - Houd helpers voor schrijftransacties synchroon tenzij/totdat een async transaction- API expliciete mutex-/backpressure-semantiek toevoegt.
- Houd parent-delivery-writes klein en transactioneel.
- Vermijd herschrijven van de hele store; gebruik upsert/delete op rijniveau.
- Voeg indexen toe voor list-by-agent, list-by-session, updated-at, run-id en expiration-paden voordat hot code wordt verplaatst.
- Sla grote artefacten, media en vectoren op als BLOB's of gechunkte BLOB-rijen, niet als base64 of numeric-array JSON.
- Houd opaque plugin-state-entries klein en gescoped.
- Voeg SQL-cleanup toe voor TTL/expiration in plaats van filesystem-pruning. Gedaan voor database-eigen runtime-stores: media, plugin state, plugin blobs, persistent dedupe en agentcache verlopen allemaal via SQLite-rijen. Resterende filesystem-cleanup is beperkt tot tijdelijke materialisaties of expliciete verwijdercommando's.
Statische verboden
Voeg een repocontrole toe die faalt op nieuwe runtime-writes naar legacy state-paden:
sessions.json*.trajectory.jsonlbehalve gematerialiseerde support-bundle-uitvoer.acp-stream.jsonlacp/event-ledger.jsoncache/*.jsonruntime-cachebestandenagents/<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*.jsonenrecovery-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 - JSON-bestanden voor sandbox-registershards
- JSON-bestanden voor native hook relay
/tmp-bridge plugin-state/state.sqlite- ad-hoc
openclaw-state.sqliteruntime-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 - Browserprofieldecoratie
.openclaw-profile-decorated SessionManager.open(...)bestandsgebaseerde sessie-openersSessionManager.listAll(...)enTranscriptSessionManager.listAll(...)transcriptlijstfacadesSessionManager.forkFromSession(...)enTranscriptSessionManager.forkFromSession(...)transcriptforkfacadesSessionManager.newSession(...)enTranscriptSessionManager.newSession(...)facades voor vervanging van muteerbare sessiesSessionManager.createBranchedSession(...)enTranscriptSessionManager.createBranchedSession(...)branchsessie-facades
Het verbod moet toestaan dat tests verouderde fixtures maken en dat migratiecode verouderde bestandsbronnen leest/importeert/verwijdert. Niet-uitgebrachte SQLite-sidecars blijven verboden en krijgen geen doctor-importtoestemmingen.
Criteria voor voltooiing
- Runtimegegevens en cache-schrijfbewerkingen gaan naar de globale of agent-SQLite-database.
- Runtime schrijft niet langer sessie-indexen, transcript-JSONL, sandboxregister- JSON, taaksidecar-SQLite of plugin-state-sidecar-SQLite. De niet-uitgebrachte importers voor taak- en plugin-state-sidecar-SQLite worden verwijderd.
- Import van verouderde bestanden is alleen voor doctor.
- Back-up produceert één archief met compacte SQLite-snapshots en integriteitsbewijs.
- Agent-workers kunnen draaien met schijfopslag, VFS-scratch of experimentele opslag met alleen VFS.
- Configuratie en expliciete referentiebestanden blijven de enige verwachte persistente niet-database-controlebestanden.
- Repocontroles voorkomen dat verouderde runtime-bestandsopslag opnieuw wordt geïntroduceerd.