@cordfuse/llmux 0.12.2 → 0.12.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,18 +1,14 @@
1
1
  # llmux
2
2
 
3
- You have Claude Code in one terminal, Codex in another, Aider in a third, and
4
- OpenCode in a fourth. They're all live, all mid-conversation, all costing
5
- nothing to keep open. But to fire a prompt at one of them you have to find the
6
- right window, click in, and type. To do anything from your phone? Forget it.
7
-
8
- llmux turns every agent CLI into a named tmux session you can drive from
9
- anywhere. Spawn `claude`, `codex`, `agy`, `gemini`, `qwen`, `opencode`, `amp`,
10
- `grok`, `aider`, `continue`, `kiro`, `cursor`, `plandex`, `goose`, or
11
- `gh copilot` once. Then fire prompts at any of them by name, from a CLI, from
12
- a REST call, or from a browser on your phone over Tailscale. Past
13
- conversations are browsable and resumable. The agents keep running.
14
-
15
- > **Status:** v0.12.2 — daemon + CLI client consolidated into one binary
3
+ Run every AI agent CLI under a single daemon. One named tmux session per
4
+ agent. Drive any of them from a terminal (`llmux session attach`), a REST or
5
+ WebSocket API, or a phone browser over Tailscale.
6
+
7
+ Each agent runs unmodified — llmux just brokers I/O. Sessions survive
8
+ restarts, attach is raw-TTY, and Claude Code conversations are resumable
9
+ from any client.
10
+
11
+ > **Status:** v0.12.3 daemon + CLI client consolidated into one binary
16
12
  > (`llmux`). Auth, tokens, mobile picker, conversation resume, Claude Code
17
13
  > history adapter shipped. See [CHANGELOG.md](./CHANGELOG.md).
18
14
 
@@ -22,8 +18,11 @@ conversations are browsable and resumable. The agents keep running.
22
18
  <img src="https://raw.githubusercontent.com/cordfuse/llmux/main/docs/screenshots/chat.jpg" width="32%" alt="phone chat — xterm.js with soft-keyboard toolbar attached to an OpenCode session">
23
19
  </p>
24
20
 
25
- > Browser picker, edit form, and attached terminal — all on a phone over
26
- > Tailscale HTTPS.
21
+ > Above: picker, edit form, and attached terminal — phone, over Tailscale
22
+ > HTTPS. The same surfaces are available from any terminal via
23
+ > **`llmux session attach <name>`** (raw TTY pass-through over WebSocket;
24
+ > Ctrl+] to detach). Pick whichever fits the task — the browser is for
25
+ > drive-by phone use, the terminal is for everything else.
27
26
 
28
27
  ## Install
29
28
 
@@ -67,7 +66,7 @@ The same binary is the client. Set `--server` (or `LLMUX_SERVER` env) on any
67
66
  session/agent verb and it routes over HTTP instead of operating locally:
68
67
 
69
68
  ```bash
70
- export LLMUX_SERVER=http://100.105.221.46:3030
69
+ export LLMUX_SERVER=http://192.0.2.10:3030 # or https://<host>.tailnet.ts.net
71
70
  export LLMUX_TOKEN=sas_… # mint with `llmux token create`
72
71
 
73
72
  llmux session list
package/dist/index.js CHANGED
@@ -3373,6 +3373,11 @@ var attach = {
3373
3373
  stdin.removeAllListeners("data");
3374
3374
  process.removeAllListeners("SIGWINCH");
3375
3375
  ws?.close();
3376
+ stdin.pause();
3377
+ try {
3378
+ stdin.unref();
3379
+ } catch {
3380
+ }
3376
3381
  }
3377
3382
  function sendResize() {
3378
3383
  if (!stdout.isTTY) return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cordfuse/llmux",
3
- "version": "0.12.2",
3
+ "version": "0.12.4",
4
4
  "description": "tmux-based AI agent dispatcher — REST/WS daemon + CLI client in one binary",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -603,6 +603,9 @@ const attach: ClientCommand = {
603
603
  stdin.removeAllListeners('data');
604
604
  process.removeAllListeners('SIGWINCH');
605
605
  ws?.close();
606
+ // Release stdin from holding the event loop open.
607
+ stdin.pause();
608
+ try { stdin.unref(); } catch {}
606
609
  }
607
610
 
608
611
  function sendResize(): void {