Files
opencode-rails/CHANGELOG.md
Ajay Krishnan 9b0c4cd3cd
Some checks failed
Test / test (3.2) (push) Failing after 9m43s
Test / test (3.3) (push) Failing after 10m0s
Test / test (3.4) (push) Failing after 10m0s
Initial public release v0.0.1.alpha2
opencode-rails — production-grade Rails integration for OpenCode.

Rails companion to opencode-ruby. ActiveRecord-aware session lifecycle
(idempotent ensure!/recreate!/abort! with row-level locks), a Turn
orchestrator driving the Reply state machine and recovering from
session-not-found, an artifact pipeline backed by ActiveStorage,
sandbox seeding, and tool-display value objects for Turbo Stream
broadcasts. Drop into any Rails 7.1+ app that wants production-grade
OpenCode streaming without rolling boilerplate.

What this version ships:
  - Opencode::Session (AR-coupled lifecycle, row-level locks)
  - Opencode::Turn (Reply state machine, session-not-found recovery)
  - Opencode::Exchange (one turn = one request/response unit)
  - Opencode::Impostor (deterministic mock for tests)
  - Opencode::Sandbox / SandboxFile (per-session FS scratch space)
  - Opencode::Transform (host-rendered artifact pipeline)
  - Opencode::Artifact / MessageArtifacts (ActiveStorage-backed)
  - Opencode::UploadedFilesPrompt (system-prompt builder)
  - Opencode::ToolDisplay (Turbo Stream value objects)
  - Opencode::ErrorReporter (pluggable adapter — Honeybadger/Sentry/etc.)
  - examples/rails_integration.rb — canonical wiring blueprint

53 smoke tests. CI on Ruby 3.2/3.3/3.4.

Ruby >= 3.2. Runtime deps: opencode-ruby = 0.0.1.alpha2,
activerecord/activestorage/activesupport >= 7.1, < 9.0.

See CHANGELOG.md for the alpha1 -> alpha2 delta.
2026-05-25 06:49:09 -07:00

2.8 KiB

Changelog

0.0.1.alpha2 — 2026-05-20

Changed

  • Opencode::Exchange now emits opencode.apply_patch.artifacts_dropped via the new Opencode::Instrumentation.notify fire-and-forget API (introduced in opencode-ruby v0.0.1.alpha2) instead of .instrument(name, payload) { } with an empty block. Cleaner read at the call site; identical semantics on the wire (same event name, same payload).

Bumped

  • Runtime dependency opencode-ruby pinned to = 0.0.1.alpha2 (was = 0.0.1.alpha1). Versions stay in lockstep during alpha.

0.0.1.alpha1 — 2026-05-20

Initial public alpha. Extracted from a production Rails app where these objects shipped as in-tree library code before being carved out into a standalone gem.

Includes:

  • Opencode::Session — AR-coupled, row-level-locked session lifecycle (ensure!, recreate!, abort!)
  • Opencode::Turn — orchestrator covering send → stream → recover → finalize, with CAS-safe message terminal-state transitions
  • Opencode::Exchange — domain object over a turn's message array; emits opencode.apply_patch.artifacts_dropped when post-write file content is unavailable
  • Opencode::Artifact — value-object (filename + content + content_type + trust metadata), idempotent attach
  • Opencode::MessageArtifacts — ActiveStorage-aware artifact attachment pipeline with transform support
  • Opencode::Sandbox — disk-backed sandbox reader, returns Artifact list
  • Opencode::SandboxFile — single-file value object (pathname → bytes/content-type)
  • Opencode::Transform — base class for content-rewriting transforms
  • Opencode::Impostor — ActiveStorage download/upload round-trip helper
  • Opencode::UploadedFilesPrompt — user-prompt prefix builder listing uploaded files, sandbox-path inverted (injection-based, no Opencode::Permissions reference)
  • Opencode::ToolDisplay — view-model for tool-call hashes (Turbo Stream-friendly)
  • Opencode::ErrorReporter — pluggable adapter mirroring the Opencode::Instrumentation pattern

Runtime dependencies:

  • opencode-ruby ~> 0.0.1.alpha1 (wire client + Reply state machine)
  • activerecord >= 7.1, < 9.0
  • activestorage >= 7.1, < 9.0
  • activesupport >= 7.1, < 9.0

Known limitations (alpha):

  • Apply-patch tool's post-write file content is not extracted (wire-format limitation in OpenCode v1.15+); affected files surface via the opencode.apply_patch.artifacts_dropped instrumentation event. Future work: optional sandbox-read fallback path.
  • Smoke tests only inside the gem. Behavioral coverage currently lives in the host app that produced this code. A standalone gem-side test suite using Combustion is open work.
  • No generator (rails g opencode:install) yet.
  • No Rails Engine integration — require "opencode-rails" is sufficient.