6.4 KiB
6.4 KiB
Changelog
0.0.1.alpha9 - 2026-07-20
Bumped
- Runtime dependency
opencode-rubypinned to= 0.0.1.alpha9, carrying the hardened SSE framing parser while retaining the alpha7 subscribe-before- prompt and at-most-once reconnect contract.
Fixed
- Keep transform destination filenames out of the agent-authored identity attachment path and require transforms to verify trust explicitly.
- Anchor uploads to an opened sandbox directory across path swaps, replace
destination symlinks without following them, and validate bounded reads from
the opened sandbox file. Upload copying now requires a traversable
/proc/self/fdor/dev/fddescriptor filesystem and fails closed without it. - Reject hard-linked sandbox artifacts and open files with nonblocking, no-follow descriptor checks so FIFO, socket, symlink, and device swaps fail closed without hanging artifact collection.
- Make the reference integration deny every OpenCode tool by default and require project-local OpenCode configuration to be disabled at server startup. Hosts must add their own OS or container boundary before allowing filesystem tools.
- Load every runtime standard library explicitly and align the shipped permissions, observer, Turn, prompt, and instrumentation examples with the actual APIs.
Changed
- Gate release on tests plus exact local package installation across Ruby 3.2, 3.3, 3.4, and 4.0 in a read-only verification job.
- Pin every third-party CI and release action to an exact reviewed commit and use Ruby 4.0 for release builds.
- Fail the trusted-publishing job before release when the pushed tag does not
match
Opencode::RAILS_VERSION. - Refuse to publish Rails until the RubyGems client package exists and loads with the locally built Rails package in an isolated gem repository.
0.0.1.alpha8 - 2026-07-20
Unpublished
- Superseded after the unrepaired
opencode-rubyalpha8 package was yanked. Noopencode-railsalpha8 package was published; use the alpha9 lockstep tuple.
0.0.1.alpha7 - 2026-07-18
Fixed
- Make
Opencode::Turnsubmitprompt_asyncthrough the transport's at-most-onceon_subscribedcallback, afterserver.connectedproves the SSE listener is ready. Reconnects reopen only SSE and never replay the user prompt. - Fail the turn directly when subscription setup or the prompt POST fails before a turn is confirmed started. The recovery path no longer risks finalizing stale exchange text after a pre-turn failure.
- Add a gem-level behavioral regression for the cross-gem ordering contract, including reconnect and ambiguous prompt timeout cases.
Bumped
- Runtime dependency
opencode-rubypinned to= 0.0.1.alpha7.
0.0.1.alpha6 - 2026-07-18
Bumped
- Runtime dependency
opencode-rubypinned to= 0.0.1.alpha6. This exposed subscribe-before-prompt throughClient#stream, but the lower-levelOpencode::Turnpath still sent beforestream_events; that orchestration gap is fixed in alpha7.
0.0.1.alpha5 - 2026-07-15
Bumped
- Runtime dependency
opencode-rubypinned to= 0.0.1.alpha5, exposing native parent-linked and configured session creation to Rails hosts.
0.0.1.alpha4 - 2026-07-12
Bumped
- Runtime dependency
opencode-rubypinned to= 0.0.1.alpha4, adding currentsession.statusidle handling and correct multi-assistant tool-loop finalization for Rails turns.
0.0.1.alpha3 - 2026-07-10
Bumped
- Runtime dependency
opencode-rubypinned to= 0.0.1.alpha3, exposing the session permission PATCH primitive to Rails host applications while leaving reconciliation policy in each host.
0.0.1.alpha2 — 2026-05-20
Changed
Opencode::Exchangenow emitsopencode.apply_patch.artifacts_droppedvia the newOpencode::Instrumentation.notifyfire-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-rubypinned 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 transitionsOpencode::Exchange— domain object over a turn's message array; emitsopencode.apply_patch.artifacts_droppedwhen post-write file content is unavailableOpencode::Artifact— value-object (filename + content + content_type + trust metadata), idempotent attachOpencode::MessageArtifacts— ActiveStorage-aware artifact attachment pipeline with transform supportOpencode::Sandbox— disk-backed sandbox reader, returnsArtifactlistOpencode::SandboxFile— single-file value object (pathname → bytes/content-type)Opencode::Transform— base class for content-rewriting transformsOpencode::Impostor— ActiveStorage download/upload round-trip helperOpencode::UploadedFilesPrompt— user-prompt prefix builder listing uploaded files, sandbox-path inverted (injection-based, noOpencode::Permissionsreference)Opencode::ToolDisplay— view-model for tool-call hashes (Turbo Stream-friendly)Opencode::ErrorReporter— pluggable adapter mirroring theOpencode::Instrumentationpattern
Runtime dependencies:
opencode-ruby ~> 0.0.1.alpha1(wire client + Reply state machine)activerecord >= 7.1, < 9.0activestorage >= 7.1, < 9.0activesupport >= 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_droppedinstrumentation 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.