Rails
There is no Railtie and nothing to configure. The generators write plain code into your app, and the stores and sinks duck-type into any Rails version.
Sessions in your tables
$ bin/rails generate mistri:install AgentEntryThis writes a migration and a model with the name you chose. Then:
require "mistri/stores/active_record"
store = Mistri::Stores::ActiveRecord.new(AgentEntry)session = Mistri::Session.new(store:, id: params[:session_id])Every turn is a row. Approvals, resumes, and steering are session writes, so they work from controllers, jobs, and the console alike.
Streaming to the browser
Sinks bridge the event stream to a transport and compose as blocks:
cable = Mistri::Sinks::ActionCable.new("agent_#{session.id}")sink = Mistri::Sinks::Coalesced.new(cable) # merge token bursts
agent.run(input, &sink)Mistri::Sinks::SSE.new(response.stream) does the same inside
ActionController::Live.
The shape of an integration
A typical setup is three small pieces: a job that runs the agent, a channel (or SSE action) that streams it, and a controller action that writes approvals and steers. Nothing needs to share memory; the session in your database is the only coordination point.
Deploying with a browser
If your agent drives a browser through the Playwright MCP server, the
container needs Chromium: npx playwright install --with-deps chromium in
the image, or point the client at a remote browser endpoint instead.