Then build an orchestrator that runs several coding agents side by side in tmux. libtmux drives a real tmux server from code. It gives you objects for the server, its sessions, windows and panes. Documentation for every language is at https://libtmux.org/en/. Language: C# Package: LibTmux (NuGet) Repository: https://github.com/libtmux/libtmux-dotnet Read these before writing code: - https://libtmux.org/en/csharp/latest/llms.txt every page for C#, as a list - https://libtmux.org/en/csharp/latest/docs.json the same list with headings, as JSON - https://libtmux.org/en/csharp/latest/reference/ the C# API reference If you cannot fetch URLs, clone the repository above and read its README and examples instead, or ask me to paste those pages in. Set up first: 1. Report the tmux version with `tmux -V`. libtmux drives a real tmux, so nothing below works without one. Stop and tell me if it is missing. 2. If this directory is not a C# project yet, start one: dotnet new console Skip this in a project that already exists, and match what is here. 3. Add the dependency. LibTmux has no stable release. 0.0.0-alpha.21 is the newest prerelease on NuGet, and the command below names it because the resolver skips prereleases otherwise. dotnet add package LibTmux --version 0.0.0-alpha.21 Check https://www.nuget.org/packages/LibTmux for a newer version, and prefer a stable release over this one if there now is any. 4. Write the smallest program that proves the install works: connect to a tmux server, create a session, confirm it is there, then kill it. Give that server a socket of its own rather than using the default one, so this never touches a tmux I am already running. Run it, and show me the output and the files you added. Rules for everything below: - Use the reference above rather than guessing names. The ten libtmux ports do not share spellings, and a name from another language will look plausible and not exist. - If the reference does not have something you expected, say so instead of writing a call that does not exist. - Follow the conventions already in this repository. Agent orchestrator What it does: - Takes a list of tasks and starts one agent per task, each in its own pane of a dedicated session, so I can watch all of them at once. - Streams each pane's output as it arrives rather than polling on a timer. - Detects when an agent has finished or gone quiet, and reports which task that was. Say in a comment how you decide "finished", because the agent's exit and the shell's prompt returning are different events. - Lets me attach to the session and take over any pane by hand. Constraints: - Do not block the whole orchestrator on one pane. If this language has an async or streaming API, use it, and say why you picked the API you did. - Send input as data, not as shell text the pane will re-parse. Task text can contain quotes, newlines and semicolons. - Tear down cleanly on interrupt, and leave no stray server behind. - Keep a task's output attributable to that task. Interleaved output nobody can attribute is the failure mode here. Anchor it in these pages: - https://libtmux.org/en/tmux/guides/sending-keys/ sending keys - https://libtmux.org/en/tmux/guides/capturing-output/ capturing output - https://libtmux.org/en/tmux/concepts/transports/ transports