Skip to content

feat(native-chat): read OpenCode transcripts from its SQLite session store - #15026

Closed
xodmd45-ctrl wants to merge 2 commits into
stablyai:mainfrom
xodmd45-ctrl:feat/opencode-native-chat
Closed

xodmd45-ctrl wants to merge 2 commits into
stablyai:mainfrom
xodmd45-ctrl:feat/opencode-native-chat

Conversation

@xodmd45-ctrl

@xodmd45-ctrl xodmd45-ctrl commented Aug 17, 2026 •

Copy link
Copy Markdown
Contributor

ELI5

OpenCode keeps its chat history in a SQLite database instead of the JSONL files other agents use, so Orca's native Chat UI showed nothing for OpenCode sessions. This PR teaches Orca to read that database — on a background worker thread, with the same paging and live-update behavior Claude/Codex already have.

What Changed

  • SQLite transcript reader (transcript-opencode-sqlite-query.ts): rowid-cursored backward/forward pages that count the page limit in renderable messages (batching past step-start-only rows), overshoot-trim cursors that re-read trimmed messages instead of skipping them, and a cheap count/max change signal.
  • Part-to-block mapping (transcript-opencode-part-blocks.ts): text/reasoning/tool parts, synthetic-text filtering, and file parts mapped to image refs (data:/http url, file:// decoded to a local path, plain path).
  • Adapters (transcript-opencode.ts): DB discovery reusing listOpenCodeDatabases (honors OPENCODE_DB/XDG env, sibling opencode-*.db, WSL gate) — no per-session file to resolve, so the mtime file cache is bypassed by design; tail/full/watch contracts implemented via signal polling (SQLite has no fs events).
  • Orchestration worker read (worker-transcript-read-opencode.ts): rowid-offset continuation mirroring the JSONL byte-offset semantics, incl. source_changed guards for rebuilt DBs; test deps namespaced per agent ({ opencode?: ... }) so the agent-generic signature stays generic.
  • Worker dispatchers split (session-scanner-opencode-sqlite-native-chat-dispatch.ts): native-chat reads ride the existing shared SQLite worker client; the dispatch module keeps the client file under the max-lines cap without any eslint-disable.
  • Registries: NATIVE_CHAT_SUPPORTED_AGENTS, agent profiles, slash commands, and the session options catalog wire OpenCode the same way grok/cursor are wired.

All five native-chat entry points (full reader, tail reader, cached read, watcher, orchestration worker read) route through the same resolveNativeChatTranscriptAgent(agent) === 'opencode' guard, matching how claude/codex/grok/omp branch today.

Why

Implements the desktop half of OpenCode native-chat support. OpenCode 1.17+ persists sessions in one opencode.db (message/part rows with JSON payloads), so the JSONL decoders can never find a transcript. Riding the existing AI-Vault SQLite worker keeps node:sqlite off the main process and reuses its FIFO/timeout/respawn lifecycle.

Linked Issue

Fixes #9307

Also covers most of #9308 (mobile eligibility flows through the same shared support set and main-process read path), though mobile renderer verification was not performed here.

Visual Proof

N/A — main-process transcript plumbing; no UI markup/styling changed. The user-visible effect (OpenCode sessions now render in the existing Chat UI) is covered by the transcript tests below.

Testing

  • New suites: transcript-opencode.test.ts (discovery, tail/full/watch incl. poll-gap bridging, cap hold-back, pending settle, error recovery), transcript-opencode-sqlite-query.test.ts (paging cursors, overshoot-trim re-read, sparse walks, signal, part mapping incl. image/file parts), worker-transcript-read.test.ts opencode cases (initial window, continuation, pinned boundaries, source_changed, stat-failure identity, worker-failure mapping), agent-session-option-catalog-opencode.test.ts, plus opencode subscribe-routing cases in transcript-watch.test.ts.

  • Updated: transcript-read-cache.test.ts (opencode routing bypasses the file resolver), orchestration-worker-output.test.ts (DB discovery stubbed for hermeticity), shared registry suites.

  • Branch rebased onto origin/main and squashed to a single commit. Gates: tsc --noEmit -p config/tsconfig.node.json clean; targeted vitest 79/79 across the three opencode suites; changed-code quality gate 0 new findings; max-lines ratchet OK; oxfmt clean on touched files.

  • Blind review loop (three independent lanes — orchestration cursor, watcher/tail, test adequacy — five rounds): every must-fix triaged against the code and applied; the final round returned "no must-fix found" from all three lanes.

  • E2E (Windows, headless, SKIP_BUILD=1 on a --mode e2e build, no pnpm): native-chat-first-flush-race ([Bug]: Native chat "No transcript found" on a just-created session that is actually alive #8401 pending-settle path) and orchestration-worker-transcript-providers (shared worker path) pass. native-chat-history-prepend-anchor times out at the 120s per-test budget on this desktop (twice, same Load earlier messages click step) while the failure snapshot shows a correctly rendered transcript — it seeds a claude JSONL session and touches no code this PR changes (renderer untouched; shared reader diffs are opencode-gated branches plus a value-identical constant extraction), so this reads as a slow-runner timeout, not a regression. CI verdict pending.

  • CodeRabbit review (2026-09-13): post-read DB identity attestation applied with test (c457f4a); payload-bounding cursor comment declined for JSONL-reader parity (replies posted on both threads).

  • I manually tested these changes locally

  • Automated tests added/updated, or explained why not below

AI Disclosure

Developed with AI (OhMyOpenCode orchestration): implementation, test authoring, and five rounds of blind AI code review (fresh reviewers, code-only, no design claims shared) with all valid must-fix findings applied.

Review

  • Security: DB opened read-only (query_only pragma); no injection surface (prepared statements only); capability tokens redacted in fallback terminal output (pre-existing, covered by test).
  • Cross-platform: file:// URLs decode per-platform with an opaque-ref fallback; paths via Node/Electron utilities; Windows-specific test behavior guarded.
  • Remote SSH: DB discovery follows the same host-scoped resolution as the AI-Vault scanner; transcriptPath deliberately ignored (DB discovery is owned by the reader).
  • Mobile: eligibility via shared set — noted above.
  • Backwards compat: no wire/RPC changes; new worker request kinds are additive union members.
  • Performance: all SQLite I/O on the shared worker thread; no main-process blocking.

Checklist

  • This PR is small and focused
  • I explained what changed and why (including ELI5)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

@coderabbitai

coderabbitai Bot commented Aug 17, 2026 •

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Added OpenCode support to native chat through SQLite transcript reads. The change adds transcript part decoding, backward and forward pagination, row-based cursors, change signals, fingerprints, and worker-backed access. It routes OpenCode reads and polling through dedicated paths, handles missing or remote transcripts, and adds model catalogs, slash commands, profiles, and session support. Tests cover pagination, rendering, polling, error recovery, cursor consistency, and routing.

Priority: ➖ Normal

Severity of issue fixed: Medium

Merge Risk: 🟡 Moderate · up to 764e0

OpenCode transcript pagination can return mixed-source data or permanently omit large messages. These issues should be fixed before merge.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.29% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 59 functions across 28 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR meets the coding objectives in #9307. It registers opencode as a native-chat agent and requires a local readable transcript. It adds SQLite database discovery, historical pagination, live pol…
Out of Scope Changes check ✅ Passed The changes remain within #9307. Worker protocol updates, database queries, transcript caching, watcher routing, agent profiles, session options, slash commands, and legacy-import guards support OpenC…
Title check ✅ Passed The title clearly and concisely describes the main change: native-chat support now reads OpenCode transcripts from the SQLite session store.
Description check ✅ Passed The description is complete and follows the repository template. It explains the change and rationale, links issue #9307, documents visual proof as not applicable, lists testing and platform considera…

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (5)
src/shared/agent-session-option-catalog-opencode.ts (1)

5-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Condense the new rationale comments.

Keep the non-obvious rationale, but reduce each block to one concise sentence. The current blocks restate catalog behavior and implementation flow.

As per coding guidelines, “Comments must be concise, non-obvious, and brief—prefer one line; do not explain obvious behavior or walk through code.”

Also applies to: 17-22, 25-27, 42-53

Source: Coding guidelines

src/main/native-chat/transcript-opencode-part-blocks.ts (1)

104-115: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Keep the tool error text in the result block.

When state.output is absent and state.error holds a message, the block is emitted with output: ''. The user then sees an errored tool with no reason. Use the error string as the output when no output exists.

♻️ Proposed change
   blocks.push({
     type: 'tool-result',
-    output: typeof output === 'string' ? output : '',
+    output:
+      typeof output === 'string'
+        ? output
+        : typeof error === 'string'
+          ? error
+          : error != null
+            ? JSON.stringify(error)
+            : '',
     ...(error != null ? { isError: true } : {})
   })
src/main/ai-vault/session-scanner-opencode-sqlite-worker-spawn.ts (1)

88-121: 🚀 Performance & Scalability | 🔵 Trivial

Consider queue priority for live chat reads on the shared client.

The shared client is single-flight FIFO. A vault scan can enqueue many parse calls at once. A live-chat signal poll or page read enqueued behind them waits for the whole burst, so transcript updates can lag during a scan. Options: give native-chat requests queue priority, or use a second client instance for native chat.

src/main/native-chat/transcript-read-cache.test.ts (1)

20-24: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Spread the original module in the mock factory.

The factory replaces every export of ./transcript-opencode with one function. Today the graph pulls only readOpenCodeNativeChatTranscriptFull, so it works. If a transitively imported module later needs readOpenCodeNativeChatTranscriptTail or subscribeOpenCodeNativeChatTranscript, the import fails. orchestration-worker-output.test.ts already uses the importOriginal pattern.

♻️ Proposed change
-vi.mock('./transcript-opencode', () => ({
-  readOpenCodeNativeChatTranscriptFull: vi.fn(async () => ({ error: 'opencode-routed' }))
-}))
+vi.mock('./transcript-opencode', async (importOriginal) => ({
+  ...(await importOriginal<object>()),
+  readOpenCodeNativeChatTranscriptFull: vi.fn(async () => ({ error: 'opencode-routed' }))
+}))
src/main/native-chat/transcript-read-cache.ts (1)

105-112: 🚀 Performance & Scalability | 🔵 Trivial

Consider a signal-keyed cache entry for OpenCode later.

Each readNativeChatTranscriptCached('opencode', …) call now pages the whole session over the worker, so repeated reads pay full cost. readOpenCodeTranscriptSignal already returns a cheap change fingerprint that could serve as the invalidation key in place of mtime. No change is required in this PR.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1da1a860-c242-4ed3-9619-76b609c9ae71

📥 Commits

Reviewing files that changed from the base of the PR and between 81d7f9b and 1c2feb74565c0d861e5163b9d68ba25550dfc7d6.

📒 Files selected for processing (31)
  • src/main/ai-vault/session-scanner-opencode-sqlite-native-chat-dispatch.ts
  • src/main/ai-vault/session-scanner-opencode-sqlite-worker-client.ts
  • src/main/ai-vault/session-scanner-opencode-sqlite-worker-entry.ts
  • src/main/ai-vault/session-scanner-opencode-sqlite-worker-protocol.ts
  • src/main/ai-vault/session-scanner-opencode-sqlite-worker-spawn.ts
  • src/main/ipc/native-chat.ts
  • src/main/native-chat/session-file-resolver.ts
  • src/main/native-chat/transcript-opencode-part-blocks.ts
  • src/main/native-chat/transcript-opencode-sqlite-query.test.ts
  • src/main/native-chat/transcript-opencode-sqlite-query.ts
  • src/main/native-chat/transcript-opencode.test.ts
  • src/main/native-chat/transcript-opencode.ts
  • src/main/native-chat/transcript-read-cache.test.ts
  • src/main/native-chat/transcript-read-cache.ts
  • src/main/native-chat/transcript-reader.ts
  • src/main/native-chat/transcript-tail-reader.ts
  • src/main/native-chat/transcript-watch-contract.ts
  • src/main/native-chat/transcript-watch.ts
  • src/main/runtime/orchestration/worker-transcript-read-opencode.ts
  • src/main/runtime/orchestration/worker-transcript-read.test.ts
  • src/main/runtime/orchestration/worker-transcript-read.ts
  • src/main/runtime/rpc/methods/orchestration-worker-output.test.ts
  • src/shared/agent-session-option-catalog-opencode.test.ts
  • src/shared/agent-session-option-catalog-opencode.ts
  • src/shared/agent-session-option-catalog.ts
  • src/shared/native-chat-agent-profiles.test.ts
  • src/shared/native-chat-agent-profiles.ts
  • src/shared/native-chat-agent-support.test.ts
  • src/shared/native-chat-agent-support.ts
  • src/shared/native-chat-slash-commands.test.ts
  • src/shared/native-chat-slash-commands.ts

Included review availability: Your plan includes up to 10 reviews per rolling hour; 9 remain after this review.

Comment thread src/main/native-chat/transcript-opencode.ts Outdated
Comment thread src/main/native-chat/transcript-opencode.ts Outdated
Comment thread src/main/native-chat/transcript-tail-reader.ts Outdated
Comment thread src/main/runtime/orchestration/worker-transcript-read-opencode.ts
@xodmd45-ctrl

xodmd45-ctrl commented Aug 21, 2026 •

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review — all four inline findings were real bugs and are fixed in ecdae70f:

Finding Fix
Watcher latches lastSignal before the page read Fingerprint is now latched only after a successful read, so a failed first snapshot retries instead of stalling
Rows appended beyond the 100-row diff window are dropped A zero-overlap window now falls back to the wider replace read
Initial worker cursor can re-deliver a row interleaved between signal and page nextOffset = Math.max(signal.maxMessageRowId, page.items.at(-1)?.rowid ?? 0) + interleaving regression test
OpenCode tail branch ignores AbortSignal throwIfAborted() after the read, matching the JSONL path

Nitpicks: adopted the tool-error-as-output mapping, the importOriginal mock spread, and condensed the catalog comments. Deferred the two performance suggestions — queue priority for live chat reads on the shared SQLite worker client, and a signal-keyed cache entry for repeated full reads — as follow-up material: both are architecture changes rather than defects, and the cache-entry suggestion itself notes no change is required in this PR.

Each fix ships with a regression test (first-page retry, window-overflow replace, cursor interleaving, tool-error output); typecheck:node, oxlint, and the max-lines ratchet all pass.

Also — thanks for turning me on to a genuinely great PR reviewer. The signal-vs-page interleaving catch in particular was subtle and easy to miss. 🙇

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/native-chat/transcript-opencode.ts (1)

238-267: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Latch lastSignal only after replacement succeeds.

Line 240 stores the fingerprint before replaceWithInitialWindow completes. If the replacement read returns null or throws, no replacement frame is emitted. The next poll sees the same fingerprint and skips the retry at Lines 220-223. The UI can then retain stale content or miss an overflow replacement until another transcript change occurs.

Make replaceWithInitialWindow return success. Keep the prior fingerprint when it fails. Add a regression test for a successful diff read followed by a failed replacement read.

Proposed fix
-      lastSignal = fingerprint
       if (firstSnapshot) {
+        lastSignal = fingerprint
         rememberItems(page.items)
         args.onInitialSnapshot?.(
           page.items.map((item) => item.message),
@@
       if (changed) {
-        await replaceWithInitialWindow(dbPath)
+        if (await replaceWithInitialWindow(dbPath)) {
+          lastSignal = fingerprint
+        }
         scheduleTick()
         return
       }
@@
       if (appended.length > 0 && appended.length === page.items.length && page.hasMore) {
-        await replaceWithInitialWindow(dbPath)
+        if (await replaceWithInitialWindow(dbPath)) {
+          lastSignal = fingerprint
+        }
         scheduleTick()
         return
       }
+      lastSignal = fingerprint

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2fa69022-99c8-46a7-9a69-275078b4e923

📥 Commits

Reviewing files that changed from the base of the PR and between 1c2feb74565c0d861e5163b9d68ba25550dfc7d6 and ecdae70f6b2ed05e5a843c127da7d686f54e01bd.

📒 Files selected for processing (9)
  • src/main/native-chat/transcript-opencode-part-blocks.ts
  • src/main/native-chat/transcript-opencode-sqlite-query.test.ts
  • src/main/native-chat/transcript-opencode.test.ts
  • src/main/native-chat/transcript-opencode.ts
  • src/main/native-chat/transcript-read-cache.test.ts
  • src/main/native-chat/transcript-tail-reader.ts
  • src/main/runtime/orchestration/worker-transcript-read-opencode.ts
  • src/main/runtime/orchestration/worker-transcript-read.test.ts
  • src/shared/agent-session-option-catalog-opencode.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/shared/agent-session-option-catalog-opencode.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c777fc4f-f939-485a-b6ab-2245063caf87

📥 Commits

Reviewing files that changed from the base of the PR and between ecdae70f6b2ed05e5a843c127da7d686f54e01bd and 514f7e01953687e60ef6f7d9cd2266f2c080619f.

📒 Files selected for processing (2)
  • src/main/native-chat/transcript-opencode.test.ts
  • src/main/native-chat/transcript-opencode.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.

Comment thread src/main/native-chat/transcript-opencode.test.ts Outdated
@GOI17

GOI17 commented Aug 31, 2026

Copy link
Copy Markdown

any updates on this 👀

@andyranitzsch

Copy link
Copy Markdown

any updates?

@xodmd45-ctrl
xodmd45-ctrl force-pushed the feat/opencode-native-chat branch from f38fcf1 to 764e064 Compare September 13, 2026 13:25

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 64b224d4-a753-4635-8635-88c1183471ff

📥 Commits

Reviewing files that changed from the base of the PR and between f38fcf1d39ad958f35c60d0e7e57be12d8ebea14 and 764e0642076dd65bbd51c4f704c754c8449d2bd6.

📒 Files selected for processing (23)
  • src/main/ai-vault/session-scanner-opencode-sqlite-worker-client.ts
  • src/main/ipc/native-chat.ts
  • src/main/native-chat/agent-session-journal/journal-legacy-import.ts
  • src/main/native-chat/session-file-resolver.ts
  • src/main/native-chat/transcript-opencode-part-blocks.ts
  • src/main/native-chat/transcript-opencode.test.ts
  • src/main/native-chat/transcript-opencode.ts
  • src/main/native-chat/transcript-read-cache.test.ts
  • src/main/native-chat/transcript-read-cache.ts
  • src/main/native-chat/transcript-tail-reader.ts
  • src/main/native-chat/transcript-watch-contract.ts
  • src/main/native-chat/transcript-watch.test.ts
  • src/main/native-chat/transcript-watch.ts
  • src/main/runtime/orchestration/worker-transcript-read-opencode.ts
  • src/main/runtime/orchestration/worker-transcript-read.test.ts
  • src/main/runtime/orchestration/worker-transcript-read.ts
  • src/main/runtime/rpc/methods/orchestration/worker/worker-output.test.ts
  • src/shared/agent-session-option-catalog-opencode.ts
  • src/shared/native-chat-agent-profiles.test.ts
  • src/shared/native-chat-agent-profiles.ts
  • src/shared/native-chat-agent-support.ts
  • src/shared/native-chat-slash-commands.test.ts
  • src/shared/native-chat-slash-commands.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Comment thread src/main/runtime/orchestration/worker-transcript-read-opencode.ts
Comment thread src/main/runtime/orchestration/worker-transcript-read-opencode.ts
@justeozan

Copy link
Copy Markdown

Hey @xodmd45-ctrl — are you still iterating on this? The approach looks promising and it's the most recent one. Happy to help get it out of conflict + green CI, or take over if stalled. Coordinating on #9307 first: #9307 (comment)

@xodmd45-ctrl
xodmd45-ctrl force-pushed the feat/opencode-native-chat branch from c457f4a to 9100b97 Compare September 24, 2026 15:48
…store

- DB discovery reuses listOpenCodeDatabases; SQLite worker dispatch extracted to its own module (file-size ratchet)

- chronological (oldest-first) page ordering with overshoot-trim cursor

- watcher diffs a bounded window; bridges poll-gap bursts and holds back instead of dropping rows past the cap

- pending-settle parity for sessions that have not flushed yet (stablyai#8401)

- orchestration cursor: rowid boundary-checkpoint, max-rowid rebuild guard, and dev/ino file-identity fingerprint for same-path replacements

- remote/WSL opencode workers fall back to the terminal
…ipt reads

- same-path replacement between the pre-read stat and the page read served the new DB's rows under the old fingerprint; both success branches now re-attest and report source_changed on mismatch

- covered by 'reports source_changed when the DB file is replaced between the stat and the page read'; vitest 24/24, tsc node clean, oxlint/oxfmt clean (CodeRabbit 2026-09-13 stablyai#1)
@xodmd45-ctrl
xodmd45-ctrl force-pushed the feat/opencode-native-chat branch from 9100b97 to 2bd3a4c Compare September 25, 2026 15:16
@xodmd45-ctrl

xodmd45-ctrl commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor Author

@justeozan I've sent you a collaborator invite to the fork (xodmd45-ctrl/orca) — once you accept, feel free to push

@brennanb2025

Copy link
Copy Markdown
Contributor

Thanks for the thorough contribution! OpenCode SQLite history, live updates and native Chat support landed in #24647, with reasoning and patch rendering completed in #24790. Those changes incorporate and credit this work, so we can close this PR as superseded.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Desktop: support OpenCode in native Chat UI

8 participants