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.
35 lines
1.2 KiB
Ruby
35 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Opencode
|
|
# Pluggable error-reporter adapter. opencode-rails ships with zero
|
|
# dependency on Honeybadger, Sentry, Bugsnag, Rollbar, or any specific
|
|
# error-tracking library. Host apps plug their own adapter in:
|
|
#
|
|
# # config/initializers/opencode.rb
|
|
# Opencode::ErrorReporter.adapter = ->(error, **opts) {
|
|
# Rails.error.report(error, **opts)
|
|
# }
|
|
#
|
|
# When no adapter is set (default), `.report` is a silent no-op. This
|
|
# lets the gem be used outside Rails-style apps without forcing a
|
|
# dependency on any specific error reporter, while keeping the option
|
|
# to route errors anywhere the host wants when the gem ships in a
|
|
# Rails context.
|
|
#
|
|
# Semantics mirror Rails.error.report (handled:, severity:, context:)
|
|
# but the gem doesn't enforce any specific kwarg vocabulary — whatever
|
|
# the gem code passes is forwarded verbatim to the adapter.
|
|
module ErrorReporter
|
|
class << self
|
|
attr_accessor :adapter
|
|
end
|
|
|
|
# Report an error to the configured adapter, or no-op if none set.
|
|
# Returns the adapter's return value (typically the error itself for
|
|
# `Rails.error.report`).
|
|
def self.report(error, **opts)
|
|
adapter&.call(error, **opts)
|
|
end
|
|
end
|
|
end
|