Files
kilocode/specs/storage/remove-opencode-db.md
T
Johnny Eric Amancio ef6b152ff8 OpenCode v1.16.2 (#12088)
* feat(worktree): add managed workspace cloning (#30117)

* test(tui): skip crashing keymap textarea renderer

* fix(core): allow skipping migration execution

* fix(opencode): remove automatic full session diffs (#30127)

* chore: generate

* refactor(worktree): move project out of repository

* zen: deepseek flash

* fix(tui): remount session view on session switch (#30129)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>

* go: minimax m3

* refactor(opencode): inline local provider helpers (#30169)

* refactor(opencode): simplify provider setup flow (#30173)

* fix(app): show project sessions before path sync resolves (#30167)

Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com>

* fix(core): preserve session metadata migration identity (#30176)

* refactor(session): align namespace imports and inline trivial helpers (#30180)

* opencode(run): add queued prompt management (#30103)

Direct run mode previously made submitted follow-up prompts irrevocable while a response was still running. Let users edit or remove queued prompts before dispatch without interrupting the active turn.

* chore: generate

* fix(acp): honor session/cancel by aborting the running turn (#30145)

Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>

* fix(tui): prevent prompt corruption when pasting near wide characters (#29710)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Simon Klee <hello@simonklee.dk>

* fix(opencode): avoid nullable webfetch format schema (#30215)

* chore: generate

* fix(core): contain lsp warmup defects (#30226)

* add run --replay mode (#30239)

* chore: generate

* chore: update nix node_modules hashes

* fix(stats): restore leaderboard spacing

* fix(stats): center top models dot grid

* fix(stats): stabilize top models hover

* fix(stats): align big-pickle provider resolution (#30274)

* feat(app): v2 desktop UI improvements (#29689)

Co-authored-by: Brendan Allan <git@brendonovich.dev>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>

* chore: generate

* fix(tui): clarify inline subagent rows (#30051)

* fix(tui): handle events across workspaces (#30281)

* feat(core): update Copilot for token-based billing (#30181)

* fix(tui): keep background marker with subagent label (#30271)

* fix(tui): keep retry attempt before message (#30275)

* chore: generate

* fix(opencode): enforce storage path invariants (#29666)

* chore: generate

* feat(core): add location-based permission service (#30287)

* chore: generate

* fix(tui): preserve live parts during session hydration (#30300)

* fix(app): restore deferred MCP status updates (#30220)

* fix: export v2 stylesheets and declare core node types (#30312)

* chore: update nix node_modules hashes

* fix(app): avoid suspending on pending child path (#30314)

* fix(opencode): remove sunsetted gpt-5.2 and gpt-5.3-codex from allowed models for codex subscriptions (#30316)

* chore: generate

* feat(core): expose session location

* chore: generate

* fix(opencode): preserve websocket api errors (#30321)

* refactor(core): simplify session pagination

* feat(core): add location filesystem contract

* feat(core): add dummy location filesystem layer

* chore: generate

* feat(opencode): add filesystem read and list routes

* chore: generate

* infra: stats

* sync

* feat(app): inset new layout session panels (#30342)

* fix(app): tab title truncation and close button positioning (#30349)

* tui: show model context in run footer (#30380)

* tui: revert OpenTUI upgrade to 0.2.16 (#30383)

* chore: update nix node_modules hashes

* feat(core): add managed repository cache (#30408)

* chore: generate

* chore: generate

* sync

* feat(stats): add cache ratio section

* feat(core): add flagged project references (#30414)

* chore: generate

* feat(core): support named migrations (#30418)

* fix(stats): clean retired provider rows during sync (#30420)

* fix(stats): mention opencode go in top models copy

* feat(core): expose project reference filesystem access (#30423)

* chore: generate

* sync

* fix(tui): scope diff viewer to session directory (#30426)

* test: widen provider header timeout margin (#30427)

* fix(plugin): restore private git install fallback (#30430)

* fix(stats): remove leaderboard nav link

* chore(opencode): remove scout agent (#30435)

* chore: generate

* feat(stats): improve cache ratio chart

* chore: generate

* fix(effect-drizzle-sqlite): preserve transaction begin errors (#30448)

* chore: bump effect beta to 74 (#30449)

* Revert "tui: revert OpenTUI upgrade to 0.2.16 (#30383)" (#30452)

* chore: update nix node_modules hashes

* refactor(opencode): improve startup time by 38% (#30453)

Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box>

* chore: generate

* fix(opencode): patch empty Gemini replay messages (#30463)

* chore: generate

* refactor(core): consolidate filesystem services (#30447)

* chore: generate

* run: enable interactive replay by default (#30465)

* chore: update nix node_modules hashes

* refactor(opencode): remove JSON storage migration (#30461)

* chore: generate

* chore: update nix node_modules hashes

* fix(tui): stop idle background task spinner (#30484)

* refactor(core): move v1 schemas into core (#30473)

* chore: generate

* fix: task id passed to background job for continuation (#30485)

* chore: generate

* feat(core): project copying and tracking directories (#30139)

* chore: generate

* fix(opencode): preserve signed thinking during anthropic reorder (#30182)

* Revert "fix(opencode): preserve signed thinking during anthropic reorder" (#30502)

* fix: rm tool reorder logic from old bug (#30483)

* chore: generate

* feat(app): polish home projects list UI (#30436)

* feat(app): polish select-v2 component (#30446)

Co-authored-by: Brendan Allan <git@brendonovich.dev>

* fix(github): enforce existing git author identity (#30507)

* feat(app): new update button  (#30460)

Co-authored-by: Brendan Allan <git@brendonovich.dev>

* fix(opencode): fallback to sh for curl upgrade (#30499)

Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>

* fix(ui): render whole-file patches as complete diffs (#30516)

* chore: generate

* feat(app): add servers tab to settings dialog (#29675)

* refactor(core): consolidate pty service (#30537)

* chore: generate

* tui: truncate sidebar file paths (#30531)

* chore: update nix node_modules hashes

* feat(stats): add geo breakdown (#30456)

* chore: generate

* chore: update nix node_modules hashes

* fix(acp): classify apply_patch as edit (#30564)

* fix(acp): classify task as think (#30565)

* fix(acp): include external directory permission context (#30567)

* fix(acp): clean read tool display content (#30569)

* fix(tui): route question responses by session directory (#30578)

* fix(stats): serve stats og image from banner

* docs(go): add Qwen3.7 Plus model (#30594)

* fix(openai): preserve websocket idle state (#30586)

* refactor(core): remove ai sdk option fields (#30581)

* chore: generate

* test(core): cover v1 provider option lowering (#30599)

* chore: generate

* refactor(core): nest model api id (#30603)

* fix(core): expose azure openai xhigh efforts (#30620)

* feat(core): add skill registry and file agent loading (#30617)

* chore: generate

* chore: update nix node_modules hashes

* fix(stats): count all go usage

* chore: remove zed extension and automation (#30628)

* fix(opencode): preserve variant for delegated tasks (#30630)

* zen: update nvidia tos

* fix(opencode): route SAP AI Core reasoning variants through modelParams (#30482)

* chore: generate

* fix(app): hide unavailable titlebar update (#30642)

* feat(app): v2 thinking level selector (#30646)

* fix(app,ui): session review reactivity and VCS query cache (#30660)

* feat(core): add embedded v2 session runtime and tool foundation (#30632)

* chore: generate

* chore: update nix node_modules hashes

* docs: correct compaction prune default (#30670)

* fix(opencode): avoid shell cancel race (#30641)

* feat: bump bedrock and add proper mantle support for openai models through aws bedrock (#30464)

* test: wait for shell truncation readiness (#30679)

* chore: update nix node_modules hashes

* refactor(opencode): clean up task tool prompts (#30687)

* feat(core): add command registry (#30624)

* chore: generate

* fix(acp): replay loaded session transcript (#30645)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>

* fix(core): reset pre-launch session projections (#30728)

* feat(tui): improve experimental session switcher (#30738)

* fix(opencode): respect disabled auto compaction on overflow (#30749)

* zen: nemotron 3 ultra

* fix(enterprise): install hono standard validator peer (#30740)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>

* fix build

* chore: update nix node_modules hashes

* make scripts executable

* fix(tui): show toast when variant_list keybind used with no variants (#30724)

* fix(opencode): `ACP.loadSession` should replay all messages (#30761)

Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>

* fix(opencode): attribute task child agent on creation (#30786)

* fix(tui): add Vue syntax highlighting (#30802)

* fix: bump @openrouter/ai-sdk-provider to 2.9.0 (#30800)

* feat(core): moving sessions (#30640)

* chore: generate

* tweak: background agent prompting to avoid polling issues (#30790)

* upgrade opentui to 0.3.2 (#30748)

* chore: update nix node_modules hashes

* feat(desktop): surface local server startup failures (#30822)

* ci: publish

* refactor(core): make v2 session inputs event sourced (#30785)

* chore: generate

* fix(llm): normalize OpenAI function tool schemas

* chore: generate

* feat(stats): refresh stats routes and homepage (#30419)

* fix(stats): sort metric charts by top usage

* feat(core): add public native API (#30828)

* chore: generate

* feat(app): color themes (#30824)

Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com>

* chore: generate

* sync release versions for v1.16.0

* feat(core): attach global native tools (#30832)

* chore: generate

* feat(core): add Snowflake Cortex provider (#29901)

Co-authored-by: Cortex Code <noreply@snowflake.com>

* chore: generate

* feat(core): persist v2 session context epochs (#30789)

* chore: generate

* feat(tui): allow backgrounding synchronous subagents (#30488)

* fix(app): improve tab handling (#30669)

* chore: generate

* fix(tui): prioritize models slash autocomplete (#30848)

* fix(tui): route permission replies to session directory (#30851)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>

* fix(cli): harden daemon lifecycle (#30844)

* chore: generate

* feat(app): improve desktop multi-server support (#30678)

Co-authored-by: Brendan Allan <git@brendonovich.dev>

* chore: generate

* fix(app): handle tab overflow and scrolling in titlebar (#30886)

* fix(app): tab overflow (#30894)

* tui: guard path formatting inputs (#30469)

Fixes #27726, #25216, #24856, #24294, #17071, #29164, #24837, #16865, #14279, #29895

* opencode/run: refresh themes after terminal reloads (#30917)

* chore: generate

* fix(tui): fall back to local cwd when editor spawns in attach mode (#30583)

* docs: update Go Qwen tiered pricing (#30936)

* chore: generate

* feat(tui): add diff hunk navigation (#30935)

* chore: rm fuzzy search on references (#30931)

* fix: use mapError instead of orDie for context snapshot decoding (#30905)

Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>

* fix(core): recover corrupted models cache (#30947)

* chore: bun install (#30968)

* fix(opencode): resolve Bedrock hang by using node build conditions (#30873)

* fix(workflows): retry nix-hashes compute-hash on transient failure (#30743)

* fix(stats): scroll model charts to latest on mobile

* fix(opencode): prevent destructive edit matches (#30932)

* chore: generate

* fix(core): respect v2 default agents (#30969)

* chore: generate

* test(opencode): remove disposal event wait race (#30971)

* test(opencode): remove shell timeout output race (#30974)

* fix(opencode): gate reasoning summaries by provider (#30973)

* feat(core): admit v2 skill guidance (#30843)

* fix(workflows): serialize desktop release uploads (#30978)

* fix(stats): add mobile chart end spacing

* release: v1.16.2

* refactor: kilo compat for v1.16.2

* fix(opencode): address v1.16.2 merge regressions

* chore: update kilo-vscode visual regression baselines

* fix(opencode): restore Kilo behavior after v1.16.2 merge

* fix(opencode): retry Windows migration cleanup

* test(opencode): restore clone and macOS watcher coverage

* fix(opencode): address second-pass review for #12099

Preserve imported usage and retry partial JSON migrations. Refresh active dependency patches, remove the obsolete GCP patch, and regenerate Kilo HttpApi branding.

---------

Co-authored-by: Dax <mail@thdxr.com>
Co-authored-by: Dax Raad <d@ironbay.co>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Frank <frank@anoma.ly>
Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: Michael Hart <mhart@cloudflare.com>
Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com>
Co-authored-by: Simon Klee <hello@simonklee.dk>
Co-authored-by: smagnuso <smagnuso@gmail.com>
Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>
Co-authored-by: Orca丶 <93272799+dauphinYan@users.noreply.github.com>
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com>
Co-authored-by: Brendan Allan <git@brendonovich.dev>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Kit Langton <kit.langton@gmail.com>
Co-authored-by: James Long <longster@gmail.com>
Co-authored-by: Dustin Deus <deusdustin@gmail.com>
Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box>
Co-authored-by: Ulises Jeremias <ulisescf.24@gmail.com>
Co-authored-by: Jack <jack@anoma.ly>
Co-authored-by: Jérôme Benoit <jerome.benoit@sap.com>
Co-authored-by: Ariane Emory <97994360+ariane-emory@users.noreply.github.com>
Co-authored-by: LIU Xinyu <contact@lxy.cc>
Co-authored-by: Colin McDonnell <colinmcd94@gmail.com>
Co-authored-by: Sebastian <hasta84@gmail.com>
Co-authored-by: opencode <opencode@sst.dev>
Co-authored-by: Kamesh Sampath <kamesh.sampath@hotmail.com>
Co-authored-by: Cortex Code <noreply@snowflake.com>
Co-authored-by: pcadena-lila <pcadena@lila.ai>
Co-authored-by: weiconghe <46336277+weiconghe@users.noreply.github.com>
Co-authored-by: alberto <914199+alblez@users.noreply.github.com>
Co-authored-by: kilo-maintainer[bot] <kilo-maintainer[bot]@users.noreply.github.com>
2026-07-13 18:00:35 +02:00

12 KiB

Remove packages/opencode/src/storage/db.ts

Goal

Remove all production usages of the legacy packages/opencode/src/storage/db.ts module.

This means eliminating imports from @/storage/db or ./storage/db, including:

  • Database.use(...)
  • Database.transaction(...)
  • Database.effect(...)
  • Database.Client()
  • Database.getPath()
  • Database.TxOrDb / Database.Transaction
  • drizzle helpers re-exported from @/storage/db, such as eq

This does not mean removing SQLite or Drizzle everywhere in one step. The smaller target is deleting the opencode legacy wrapper by moving call sites onto deeper modules or onto the core/effect database adapter directly.

Current Inventory

Production imports from packages/opencode/src/storage/db.ts are concentrated in 22 source files:

  • packages/opencode/src/account/repo.ts
  • packages/opencode/src/cli/cmd/db.ts
  • packages/opencode/src/cli/cmd/import.ts
  • packages/opencode/src/cli/cmd/stats.ts
  • packages/opencode/src/control-plane/workspace.ts
  • packages/opencode/src/index.ts
  • packages/opencode/src/node.ts
  • packages/opencode/src/permission/index.ts
  • packages/opencode/src/project/project.ts
  • packages/opencode/src/server/projectors.ts
  • packages/opencode/src/server/routes/instance/httpapi/handlers/sync.ts
  • packages/opencode/src/server/shared/fence.ts
  • packages/opencode/src/session/message-v2.ts
  • packages/opencode/src/session/projectors.ts
  • packages/opencode/src/session/prompt.ts
  • packages/opencode/src/session/session.ts
  • packages/opencode/src/session/todo.ts
  • packages/opencode/src/share/share-next.ts
  • packages/opencode/src/storage/db.ts
  • packages/opencode/src/sync/index.ts
  • packages/opencode/src/worktree/index.ts

There are 65 direct API/type references in those files. The references fall into the groups below.

Group 1: Database Runtime And Startup

Status: Completed. Startup, the public node export, and database CLI tooling no longer import the legacy opencode database wrapper; packages/opencode/src/storage/db.ts has been deleted.

Files:

  • packages/opencode/src/storage/db.ts
  • packages/opencode/src/index.ts
  • packages/opencode/src/node.ts
  • packages/opencode/src/cli/cmd/db.ts

Current usage:

  • storage/db.ts opens the singleton database, applies pragmas, exposes callback-style access, holds ambient transaction context, and queues post-commit effects.
  • index.ts no longer performs the removed JSON-to-SQLite migration during startup.
  • node.ts publicly re-exports Database from the legacy module.
  • cli/cmd/db.ts uses Database.getPath() to print the path, open a readonly Bun SQLite handle, run sqlite3, and vacuum.

Why this group comes first:

  • These call sites define the seam currently used by every other group.
  • Deleting storage/db.ts requires an explicit replacement for database path, client acquisition, migration startup, and close/finalization.

Target shape:

  • Move database path and client startup behind the core/effect database module rather than the opencode wrapper.
  • Replace Database.Client() with an Effect-provided database service or a narrow startup-only adapter.
  • Replace the public node.ts re-export with either no export or a stable non-legacy database capability.
  • Keep cli/cmd/db.ts as an admin/raw SQLite tool, but make it ask the replacement database path provider instead of importing @/storage/db.

Group 2: Sync Event Transaction Boundary

Status: Completed. SyncEvent and the opencode projector boundary were removed; session/message event projection now lives in core EventV2/projector infrastructure.

Files:

  • packages/opencode/src/sync/index.ts
  • packages/opencode/src/session/projectors.ts
  • packages/opencode/src/server/projectors.ts

Current usage:

  • SyncEvent.run uses Database.transaction(..., { behavior: "immediate" }) to allocate event sequence numbers safely.
  • SyncEvent.process wraps projector execution, event sequence writes, event log writes, and post-commit publishing in Database.transaction(...).
  • Database.effect(...) queues publish side effects until after the transaction commits.
  • Projector functions accept Database.TxOrDb so they can write through either a root client or the active transaction.

Why this group is critical:

  • It depends on the most non-obvious legacy behavior: nested Database.use inside a transaction must see the active transaction, and Database.effect must not publish until commit.
  • It is the central seam for session, message, permission, workspace, and server projection writes.

Target shape:

  • Replace Database.TxOrDb with an explicit projector transaction type from the replacement database adapter.
  • Move transaction context and after-commit behavior into an Effect-native sync event implementation.
  • Preserve immediate transaction behavior for sequence allocation.
  • Convert projector registration to accept the new transaction interface before converting every projector body.

Suggested first step:

  • Create a narrow internal module for sync projection execution, then migrate SyncEvent.project(...) and projector type signatures to that module. Keep the implementation backed by the new database adapter until all projector users are moved.

Group 3: Domain Repositories Already Behind Services

Status: Completed. These services no longer import the legacy opencode database wrapper.

Files:

  • packages/opencode/src/account/repo.ts
  • packages/opencode/src/project/project.ts
  • packages/opencode/src/control-plane/workspace.ts
  • packages/opencode/src/share/share-next.ts

Current usage:

  • These modules already expose Effect services or Effect functions, but internally wrap Database.use with local db(...) helpers or Effect.try.
  • account/repo.ts uses both Database.use and Database.transaction through a repository interface.
  • project/project.ts has the largest mixed usage: Effect service methods use a local db(...) helper, while legacy top-level functions still call Database.use directly.
  • control-plane/workspace.ts and share/share-next.ts have local Effect wrappers around Database.use.

Why this group is tractable:

  • The public interfaces are already deeper than the database calls.
  • Most callers should not need to know whether these modules use Drizzle, files, or core services internally.

Target shape:

  • Inject the replacement database service into each Effect layer and yield Effect Drizzle queries directly.
  • Replace local callback wrappers with direct Effect queries.
  • Move remaining synchronous top-level helpers either behind the existing service interface or onto core modules.

Suggested order:

  • Start with account/repo.ts; it has a clear repository interface and few call sites.
  • Then migrate share/share-next.ts and control-plane/workspace.ts local wrappers.
  • Leave project/project.ts for last in this group because it mixes project resolution, VCS, global bus emission, migration, and legacy top-level helpers.

Group 4: Session And Message Read Models

Status: Completed. Session/message reads and projector writes have moved off the legacy opencode database wrapper.

Files:

  • packages/opencode/src/session/session.ts
  • packages/opencode/src/session/message-v2.ts
  • packages/opencode/src/session/prompt.ts
  • packages/opencode/src/session/todo.ts
  • packages/opencode/src/session/projectors.ts

Current usage:

  • session/session.ts uses Database.use for session reads, list queries, children, part lookup, and global list helpers.
  • session/message-v2.ts uses Database.use to page messages, hydrate parts, fetch one message, and fetch parts.
  • session/prompt.ts imports eq from @/storage/db and reads current prompt-related session/message rows directly.
  • session/todo.ts uses Database.transaction for todo replacement and Database.use for list reads.
  • session/projectors.ts uses TxOrDb for session/message usage projection helpers.

Why this group should be split:

  • Reads can move independently from projector writes.
  • Message hydration is used by model prompt construction and session APIs, so changing it without a stable read module would spread query details across callers.
  • Projector writes are tied to Group 2's transaction type.

Target shape:

  • Create or use a session/message read module with Effect-native methods for get, list, page, parts, and prompt assembly reads.
  • Move todo persistence either into a session todo repository or into the sync event projection path.
  • Convert session/projectors.ts only after Group 2 defines the replacement projector transaction type.

Suggested order:

  • Migrate session/message-v2.ts reads first because the module already centralizes message pagination and hydration.
  • Migrate session/session.ts read helpers next.
  • Migrate session/prompt.ts after message/session reads exist, and import drizzle operators from drizzle-orm if any direct SQL remains temporarily.
  • Migrate session/todo.ts writes with the sync transaction work or move them behind a repository.

Group 5: Legacy CLI And One-Off Admin Reads

Status: Completed. Remaining one-off CLI/admin reads and writes now use core database services or domain services instead of the legacy opencode database wrapper.

Files:

  • packages/opencode/src/cli/cmd/import.ts
  • packages/opencode/src/cli/cmd/stats.ts
  • packages/opencode/src/server/shared/fence.ts
  • packages/opencode/src/server/routes/instance/httpapi/handlers/sync.ts
  • packages/opencode/src/worktree/index.ts
  • packages/opencode/src/permission/index.ts

Current usage:

  • cli/cmd/import.ts writes imported sessions/messages/parts directly with Database.use.
  • cli/cmd/stats.ts reads all sessions directly.
  • server/shared/fence.ts queries sessions for fence context.
  • handlers/sync.ts reads event rows for HTTP sync endpoints.
  • worktree/index.ts looks up a project row for worktree behavior.
  • permission/index.ts reads permission rows directly.

Why this group is mostly cleanup:

  • Most usages are small and can either call an existing domain service or be given a narrow query function.
  • They are not defining shared transaction semantics.

Target shape:

  • Replace direct database reads with existing services where possible.
  • For admin/import commands, prefer dedicated import/stat modules rather than direct database access from command handlers.
  • For HTTP sync reads, move the event log query behind the sync event module.
  • For permission and worktree reads, call the permission/project services if available; otherwise add narrow repository methods.

All migration groups are complete or superseded. packages/opencode/src/storage/db.ts has been deleted.

Superseded: Data Migrations

Status: Superseded. No opencode data-migration group remains.

The previous opencode data-migration.ts service only backfilled session usage from message rows. That work is now covered by core database migration packages/core/src/database/migration/20260510033149_session_usage.ts, so there is no separate opencode data-migration group.

Invariants To Preserve

  • Nested reads inside a transaction must use the active transaction, not the root client.
  • SyncEvent.run sequence allocation must keep immediate transaction behavior.
  • Post-commit publish effects must not run before the transaction commits.
  • Existing schema ownership remains in packages/core/src/**/*.sql.ts; do not move table definitions back into packages/opencode.

Verification Commands

  • rg "@/storage/db|./storage/db|Database\.(use|transaction|effect|Client|getPath)|\bTxOrDb\b|\bTransaction\b" packages/opencode/src
  • bun typecheck from packages/opencode
  • Relevant package tests from packages/opencode, not the repo root