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: Scala Package: io.github.libtmux:libtmux-scala_3 (Maven Central) Repository: https://github.com/libtmux/libtmux-java Read these before writing code: - https://libtmux.org/en/scala/latest/llms.txt every page for Scala, as a list - https://libtmux.org/en/scala/latest/docs.json the same list with headings, as JSON - https://libtmux.org/en/scala/latest/reference/ the Scala API reference - https://javadoc.io/doc/io.github.libtmux/libtmux-scala_3 Scala reference on Scaladoc 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 Scala project yet, start one: sbt new scala/scala3.g8 Skip this in a project that already exists, and match what is here. 3. Add the dependency. io.github.libtmux:libtmux-scala_3 has no stable release. 0.0.1-alpha.17 is the newest prerelease on Maven Central, and the command below names it because the resolver skips prereleases otherwise. libraryDependencies += "io.github.libtmux" %% "libtmux-scala" % "0.0.1-alpha.17" Check https://central.sonatype.com/artifact/io.github.libtmux/libtmux-scala_3 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