v0.1.6 — named agents: the staff pattern
Named agents. One app can now employ several top-level agents, each with its own room:
app/agents/
clerk/
instructions.md
agent.yml
tools/
skills/
Silas.agent(:clerk).start(input: "File March's reports.")Sessions are stamped with the agent's name, and every turn — crash resumes included — runs under that agent's own scope (tools, skills, instructions, definitions digest): a rescued staff member can never wake up holding another agent's tools. The inbox gains per-agent filter chips; bin/rails silas:chat AGENT=clerk talks to one staff member. The root app/agent/ is unchanged and remains the default.
Concurrency hardening. Scope switching no longer mutates global config — scopes live in ActiveSupport::IsolatedExecutionState (per-thread and per-fiber; Falcon-safe), nestable. Fixes two latent bugs: concurrent Solid Queue threads racing scope config, and crashed subagent turns resuming under the root agent's scope.
Also: approval lambdas now receive indifferent-access input (jsonb string-key footgun); the installer never touches an existing config/initializers/ruby_llm.rb (brownfield-safe); the hermetic sandbox drop-in (config.sandbox = Hermetic.gvisor(...)) is documented and spec-covered.
177 examples, 0 failures. gem install silas · 0.1.6