liminal-cli 0.3.27

The liminal command: serve the network, maintain its stores, or serve its discovery MCP over stdio
Documentation
# liminal-cli

The `liminal` command serves a seat's discovery and service MCP over stdio.
The seat's host runs `liminal mcp --config <seat.toml>`, or names the seat
by flags alone (below).

Install the command with `cargo install liminal-cli`. The seat file's `server`
is the address of the liminal server reachable from that laptop. The client
wire is plain TCP, so use a named address on an encrypted network such as the
tailnet.

```toml
server = "100.64.0.1:7600"
channel = "agents"

[lys]
issuer = "https://lys.example"

[limits]
frame_bytes = 1048576
record_bytes = 1048576
reply_timeout_ms = 30000
flow_steps = 32
request_bytes = 1048576
```

When Lys starts the host, it supplies `LYS_AGENT` and `LYS_AGENT_PASS`.
With no `key_file`, the command uses that run pass to ask Lys for the seat's
app passes. It holds each until its expiry and asks again when needed.
The run pass and app passes are never printed or written to the seat file.

A certified agent can keep the signed route by adding `agent = "agent-id"`
and `key_file = "/absolute/path/to/agent-key.pem"` to `[lys]`. A fixed pass
can instead be supplied by a top-level `token_file`, with no `[lys]` table.

### One registration, the identity at run time

A seat needs no file of its own. `liminal mcp` takes the seat from flags, and
with no `--config` the channel (`console.topology`) and limits are those
`liminal seat init` writes. One registration line serves every person and
agent on an exchange, and only the identity differs:

- Open exchange: `liminal mcp --server 100.64.0.1:7600 --as <name>`. The name
  is declared as `open:<name>`, and its first listen places `agents.<name>`.
  Off loopback the seat reaches the network, as `seat init --open` writes it.
- Lys exchange: `liminal mcp --agent <agent-id> --key-file /path/to/agent-key.pem`
  (and `--server` when it is not the central exchange). The key is the
  identity; nothing is claimed by name.

`--channel` sets the channel. Beside `--config` each flag wins over the
file's value. The seat's kind never changes by flag: `--as` beside `[lys]` or
`token_file` is refused, `--agent` beside `[open]` is refused, and `--agent`
and `--key-file` are refused alone. No error shows a key's or a pass's bytes.

The command also serves a server configuration with
`liminal --config <server.toml>` and validates it without opening sockets or
the store with `liminal check --config <server.toml>`. A server may declare
`extra_listen_addresses = ["100.64.0.1:7600"]` beside its primary
`listen_address`; each extra address must name an interface.