# src/multiplexer/tmux/ ## Responsibility - Provide tmux-specific pane orchestration for attaching OpenCode child sessions to a split pane beside the current pane. - Handle lifecycle of spawned panes (create, rename, layout rebalancing, graceful close). - Resolve and cache tmux executable location for repeated operations. ## Design - `TmuxMultiplexer` in `index.ts` implements `Multiplexer`. - `findBinary` uses platform command (`which` or `where`) and validates the binary via `-V`. - `isAvailable` caches `binaryPath` and `hasChecked` to avoid repeated lookups. - `targetPane` captures `process.env.TMUX_PANE` and is reused as `targetArgs()` for scoped tmux actions. - Command execution is performed with `crossSpawn` to support both Bun and Node process interfaces. - `quoteShellArg` provides shell-safe quoting used for directory/URL/session injection in `opencode` commands. ## Flow - `spawnPane(sessionId, description, serverUrl, directory)`: - ensure binary through `getBinary()` - build command: `opencode attach --session --dir ` - execute `tmux split-window -h -d -P -F '#{pane_id}' ...` with optional `-t ` - on success: - rename pane with `select-pane -T` using first 30 chars of `description` - call `applyLayout(storedLayout, storedMainPaneSize)`. - `applyLayout(layout, mainPaneSize)`: - `select-layout` on current target - for `main-*` layouts, update `main-pane-height|width` and re-select layout for deterministic size. - `closePane(paneId)`: - `send-keys -t C-c` - wait 250ms - `kill-pane -t ` - on success, re-run `applyLayout` to rebalance panes. ## Integration - Selected when `multiplexerConfig.type === 'tmux'` or auto mode resolves to tmux (`process.env.TMUX`). - Consumed by `MultiplexerSessionManager` for `session.created` spawn and completion cleanup. - Uses `ctx.directory` as working directory, OpenCode API URL as `serverUrl`, and session id as `opencode attach --session` target.