# agor-pty — PTY Multiplexer Daemon

Standalone Rust daemon that manages terminal sessions via Unix socket IPC.
Portable across Tauri and Electrobun frontends.

## Architecture

```
Frontend (Electrobun/Tauri)
    ↕ Unix Socket IPC (JSON-framed)
agor-ptyd (Rust daemon)
    ↕ PTY master FDs
Shell processes (/bin/bash, etc.)
```

## Features

- **PTY multiplexing**: single daemon manages all terminal sessions
- **Session persistence**: sessions survive frontend disconnects/restarts
- **Multi-client**: multiple frontends can connect and subscribe to session output
- **Auth**: 256-bit token authentication per connection
- **Output fanout**: PTY output fanned to all subscribed clients (non-blocking)
- **Graceful shutdown**: SIGTERM/SIGINT cleanup

## Usage

```bash
# Build
cd agor-pty && cargo build --release

# Run daemon
./target/release/agor-ptyd --verbose

# Custom socket directory
./target/release/agor-ptyd --socket-dir /tmp/agor-test

# Custom default shell
./target/release/agor-ptyd --shell /bin/zsh
```

## IPC Protocol

JSON messages over Unix socket, newline-delimited.

### Client → Daemon
- `Auth { token }` — authenticate (must be first message)
- `CreateSession { id, shell, cwd, env, cols, rows }` — spawn shell
- `WriteInput { session_id, data }` — send input to PTY
- `Resize { session_id, cols, rows }` — resize terminal
- `Subscribe { session_id }` — receive output from session
- `Unsubscribe { session_id }` — stop receiving output
- `CloseSession { session_id }` — kill session
- `ListSessions` — get all active sessions
- `Ping` — keepalive

### Daemon → Client
- `AuthResult { ok }` — auth response
- `SessionCreated { session_id, pid }` — session spawned
- `SessionOutput { session_id, data }` — PTY output (base64)
- `SessionClosed { session_id, exit_code }` — session ended
- `SessionList { sessions }` — list response
- `Pong` — keepalive response
- `Error { message }` — error

## Integration

### As library (for Tauri)
```rust
use agor_pty::protocol::{ClientMessage, DaemonMessage};
```

### TypeScript client (for Electrobun)
See `clients/ts/` for the IPC client module.

## Directory Structure

```
agor-pty/
├── Cargo.toml
├── README.md
├── src/
│   ├── main.rs        — daemon entry, CLI, signals
│   ├── lib.rs         — library re-exports
│   ├── protocol.rs    — IPC message types
│   ├── session.rs     — PTY session management
│   ├── daemon.rs      — Unix socket server
│   └── auth.rs        — token authentication
└── clients/
    └── ts/            — TypeScript IPC client (for Electrobun/Bun)
```
