Skip to content

v0.1.6 — named agents: the staff pattern

Choose a tag to compare

@danielstpaul danielstpaul released this 20 Jul 22:43

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