e0e362d700
SDK Tests / SDK CI (push) Blocked by required conditions
SDK Tests / changes (push) Successful in 2m29s
Real E2E Tests / changes (push) Successful in 2m29s
SDK Tests / Python SDK Tests (sandbox) (push) Waiting to run
SDK Tests / CLI Quality (push) Waiting to run
SDK Tests / CLI Tests (push) Waiting to run
SDK Tests / Python SDK Quality (code-interpreter) (push) Waiting to run
SDK Tests / Python SDK Quality (sandbox) (push) Waiting to run
SDK Tests / Python SDK Tests (code-interpreter) (push) Waiting to run
SDK Tests / JavaScript SDK Quality And Tests (code-interpreter) (push) Waiting to run
SDK Tests / JavaScript SDK Quality And Tests (sandbox) (push) Waiting to run
SDK Tests / Kotlin SDK Quality And Tests (sandbox) (push) Waiting to run
SDK Tests / Kotlin SDK Quality And Tests (code-interpreter) (push) Waiting to run
SDK Tests / C# SDK Quality And Tests (code-interpreter) (push) Waiting to run
SDK Tests / C# SDK Quality And Tests (sandbox) (push) Waiting to run
SDK Tests / Go SDK Quality And Tests (push) Waiting to run
Deploy Docs Pages / build (push) Has been cancelled
Deploy Docs Pages / deploy (push) Has been cancelled
Real E2E Tests / JavaScript E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Python E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Java E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / C# E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Go E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Real E2E CI (push) Has been cancelled
43 lines
2.3 KiB
Markdown
43 lines
2.3 KiB
Markdown
# Interactive PTY sessions
|
||
|
||
Use this when you need a **long-lived Bash** driven over **WebSocket**: PTY mode behaves like a real terminal (colors, `stty`, resize); **pipe mode** (`pty=0`) splits stdout/stderr without a TTY. **Unix/macOS/Linux only** — not supported on Windows.
|
||
|
||
## Typical usage
|
||
|
||
1. **Create a session** (shell starts on the first WebSocket, not here):
|
||
|
||
```bash
|
||
curl -s -X POST http://127.0.0.1:44772/pty \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{"cwd":"/tmp"}'
|
||
# → { "session_id": "<id>" }
|
||
```
|
||
|
||
2. **Open WebSocket** — default is PTY mode:
|
||
|
||
```
|
||
ws://127.0.0.1:44772/pty/<session_id>/ws
|
||
```
|
||
|
||
| Query | Use |
|
||
|-------|-----|
|
||
| `pty=0` | Pipe mode instead of PTY |
|
||
| `since=<offset>` | After reconnect, replay from byte offset (use `output_offset` from `GET /pty/:id`) |
|
||
| `takeover=1` | Evict the current holder instead of getting **409**, then attach to the same shell (combine with `since=` to replay scrollback) |
|
||
|
||
3. **Traffic** — after a JSON `connected` frame, the server sends **binary** chunks: first byte is the channel (`0x01` stdout, `0x02` stderr in pipe mode only, `0x03` replay with an 8-byte offset header). Send **stdin** as binary: `0x00` + raw bytes. For **resize** / **signals** / **ping**, send **JSON text** frames, e.g. `{"type":"resize","cols":120,"rows":40}`, `{"type":"signal","signal":"SIGINT"}`, `{"type":"ping"}`.
|
||
|
||
4. **One WebSocket per session** — a second connection gets **409** until the first closes, unless it passes **`?takeover=1`**: the current holder is then closed with WebSocket code **4001** (reason `TAKEN_OVER`) and the new connection takes over the **same** shell. This lets a session move between clients/devices without restarting Bash.
|
||
|
||
5. **End** — when Bash exits, you get a JSON `exit` frame with `exit_code` and the socket closes. Use **`DELETE /pty/:id`** to tear down the session from the server side.
|
||
|
||
## Modes
|
||
|
||
- **PTY (default)** — ANSI and TTY-aware tools work as usual.
|
||
- **Pipe** — `?pty=0`; stderr is separate binary frames. Good when you do not need a TTY.
|
||
|
||
## Notes
|
||
|
||
- Output is also buffered for **replay**; reconnect with `since=` to catch up.
|
||
- In PTY streams, **shell echo** may appear before your command’s real output, so avoid matching only on text that also appears in the typed line.
|