ablative docs
↑↓ move↵ openesc close
Stack Notebook ablative.com.au

Host an agent

Run a coding agent as a station on the network, talk to it from the console's assistant panel and approve what it asks for in Lys.

Open .md

Before you begin

The seat is an agent in Lys with its own key, as for the first ticket. The harness is any program that speaks the Agent Client Protocol over standard input and output. Claude Code’s is @agentclientprotocol/claude-agent-acp, run through bunx.

Complete the task

  1. Write the seat configuration. It is a ticket’s seat with a [harness] table: the program, its arguments without a shell, and the working directory. Every queue and size bound has a default, and each one is named in the configuration reference.

    server = "127.0.0.1:7600"
    channel = "console.topology"
    
    [lys]
    issuer = "https://lys.example"
    agent = "agent-3f2a9c41d0b8e7a6c5f4e3d2b1a09876"
    key_file = "/absolute/path/to/agent.key"
    
    [limits]
    frame_bytes = 65536
    record_bytes = 1048576
    reply_timeout_ms = 10000
    flow_steps = 8
    request_bytes = 65536
    
    [harness]
    id = "claude-code"
    program = "/opt/homebrew/bin/bunx"
    args = ["@agentclientprotocol/claude-agent-acp@0.90.0"]
    cwd = "/absolute/path/to/workdir"
  2. Run the host. It signs its own pass with the seat’s key, opens the station and starts the harness.

    liminal agent run --config agent-seat.toml
  3. Open the console and the assistant panel. The panel opens your own agent. A site’s bound builder is never opened as the assistant. If you have several agents, you pick one.

  4. Write to it. Enter sends; a message sent while the agent is busy waits in the queue. The transcript shows its thoughts, tool calls with their input and output, and each turn’s end.

  5. Approve what it asks. A permission the harness asks for appears as a draft in Lys. The answer reaches the harness only when a person decides it, and there is no automatic allow. A draft that cannot be made is answered as refused, never as allowed.

What the panel does

  • History lists the harness’s own sessions and reopens one. If the harness refuses a reopen, the conversation that was showing comes back.
  • Model, mode and effort are the harness’s own options. A refused change is said in words in the panel.
  • New conversation starts a fresh session on the same seat.
  • Cancel ends the current turn.

If something goes wrong

A seat Lys has revoked ends the host with a named exit. A harness that will not start is named with its program, never its arguments.

One seat holds one connection. A second program started on a seat that is held is refused with agent ... is already present on connection ..., held since unix ms ..., which names the holder’s connection and when it was admitted. Give the second program a seat of its own. The seat frees when the holder’s program exits, at once, or, if its machine sleeps or leaves the network, within 80 seconds (30 seconds idle, then five unanswered keepalive probes 10 seconds apart).

If Lys answers AgentSignatureRefused, it does not know the seat’s agent, or the seat’s key has no live certificate. An MCP tool call answers that refusal as its result, and no request reaches the exchange.

Next step

Let the agent build something: Build a service.