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

Terminal window
$ bin/rails generate mistri:install AgentEntry

This 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.