github Gaurav-Gosain/tuios v0.11.0

2 hours ago

tuios 0.11.0 turns the Inbox into a cockpit for your agents. You see every agent on every machine in one screen. You read its real conversation, with its edits as diffs, and the forms and pictures it showed you. You start a new agent, or a fan of attempts, from one sheet. Agents now get the mail that other agents send them. Lock mode gives every key to the pane, as zellij does. Plugins install from git, and a native plugin runs only after you approve it. The Mermaid renderer draws all 33 diagram types of pele 1.9.0, as a picture or as text. sketch, tplot and tml also ship as small commands of their own.

This release also fixes a permission bypass, GHSA-78rj-pghh-vh42. One pane could answer the prompt of another pane's agent. It affects v0.10.1 and earlier. Read Security and Upgrading before you update.

The full list is at tuios.dev/releases.

Highlights

  • The agent cockpit. ctrl+b i opens one screen for every agent. You read each thread with diffs and Markdown, and the new Artifacts tab shows the forms and screenshots the agent showed you. n starts a new agent or a fan of up to 8 attempts, and c compares the attempts. See The agent cockpit.
  • Forms and dashboards with TML. A script or an agent shows you a form, a table or a question with tuios tml show FILE --wait, and gets your answer back. Text fields now take typed and pasted text. ctrl+b t f docks a popup as a pane and floats it again. See TML surfaces.
  • Lock mode. With lock = true under [keybindings], every key but the leader goes to the pane. alt+1, ctrl+p and the other tuios chords reach your program. The zellij preset turns it on, with ctrl+g as the leader. See Lock mode.
  • Mail that agents read. An agent hears about its unread mail from its hooks, and an agent at rest gets one line that tells it to read the mail. Two agents that ask the same agent now take turns. See Agents that work together.
  • Plugins from git, approved by you. tuios plugins install owner/repo builds a plugin and pins it in plugins.lock. A native plugin runs only after you type allow in its approval dialog, and only with the grants it names. See Plugins.
  • Pictures and the scrollback. kitten icat works in a pane on another machine. tuios clear-history and the clear_scrollback action clear a pane's history, as Cmd+K does in other terminals. notifications.bell = "forward" sends a pane's bell to your terminal. See Panes and the terminal.

Install

brew install tuios                     # Homebrew (macOS, Linux)
yay -S tuios-bin                       # AUR (tuios-web-bin for the web server)
nix run github:Gaurav-Gosain/tuios     # Nix
curl -fsSL https://raw.githubusercontent.com/Gaurav-Gosain/tuios/main/install.sh | bash
go install github.com/Gaurav-Gosain/tuios/cmd/tuios@v0.11.0
docker run -it --rm ghcr.io/gaurav-gosain/tuios:v0.11.0

A binary installed by the script or from an archive updates with tuios update. Then run tuios restart-server to move the daemon to the new build.

In case you missed v0.10.1

v0.10.1 came out on October 17 as a patch release, but it added a lot. Its notes have the details.

  • The reply editor. A reply to an agent can have many lines, paste blocks of up to 8 MB, history and @ mentions. ctrl+g opens it in your $EDITOR.
  • Image paste. ctrl+v attaches the image on your clipboard to a reply, with a preview.
  • The theme editor. Change the colours of a theme in a side sheet while the whole screen shows the result. Light and dark pairs, border gradients, title styles and rail styles are settings now.
  • tuios look. Apply a setup that someone shared, see each change first, and remove it with one command.
  • Keybind presets. keybindings.preset = "tmux", "screen" or "zellij" gives you the keys you know.
  • An idle tuios sleeps. No timer runs in the client or the daemon while nothing changes. One idle client went from 0.20% CPU to 0.05%.

The agent cockpit and the Inbox

  • One screen for every agent. ctrl+b i opens a full-screen agents view. The agents are in groups: Needs you, Ready for review, Working and Idle. Each row has two lines, and the mouse works on every part (#884). Docs
  • The thread. The selected agent shows its conversation as cards. Its edits show as diffs with line numbers and changed words. Reads and searches fold, and the plan and failed commands get cards of their own (#886).
  • Replies as Markdown. Agent replies show headings, lists, tables, links and highlighted code. This costs about 94 KB of binary (#913).
  • Threads for eight harnesses. Before, only Claude Code had a thread. Codex, Gemini CLI, Qwen Code, Copilot CLI, Amp, opencode and Cursor Agent have one now (#900, #901, #903, #905). You can also answer Kimi Code CLI and Gemini CLI prompts from the Inbox (#904).
  • The side tabs. The tabs are Thread, Changes, Checkpoints, Artifacts and Pane. Pane shows the live pane. Changes shows the files of the last turn (#889, #960).
  • Artifacts. The Artifacts tab lists the TML documents the agent opened and the screenshots it took, newest first. An open document is live. o or a click gives it the keys, and esc gives them back. A closed one shows its last state and your answer. A document from another agent puts a ● new artifact chip on its row, and a popup moves the row to Needs you (#1082).
  • The reply area. You write a reply under the thread. A pasted image opens full screen, with zoom, save and copy (#887).
  • Start an agent. n opens the New agent sheet. Type the task, then pick the agent, the model, the machine and the folder. In a repository the agent starts in a new worktree by default. You can ask for 1 to 8 attempts. esc keeps the sheet as a draft (#912). Docs
  • Machines. With linked hosts, each row names its machine. The Machines block lists each machine with its agent count, its load and its link. A click on a machine shows only its agents. The New agent sheet ranks machines by their free cores (#960, #961, #986).
  • Fans. The attempts of a fan show under one row with the fan's task. A review row shows the branch, the pull request and its checks (#960).
  • Compare and judge. c on an attempt shows all the attempts side by side. Each column shows the time, the diff, the checks, the cost and the first changed lines. j starts a judge agent that can only read the attempts and record a verdict. k keeps one attempt, and first lists the ignored files that a keep deletes (#962).
  • Restart the daemon from tuios. tuios restart-server shows what stops and what comes back, and asks first. Then it starts the daemon on the newest tuios you have. The app offers the same from the version notice, the palette and the settings. Every client attached to the daemon waits and attaches again by itself (#888, #890, #891, #934). Docs
  • Mail. The mail editor gets @ mentions and image previews. The empty Inbox points to the agents view (#881).
  • Worktree sessions clean up. Close a session that lives in a worktree, and the dialog offers "Delete worktree too". It says what the delete takes first. Uncommitted changes go to git stash, and the branch stays. The quit menu's "Delete worktree and quit" (w) opens the same dialog. Thanks to @vvicaretti (#973).

Agents that work together

  • Agents read their mail. Before, no agent read the mail that other agents sent it. Now the Claude Code and Codex hooks add one line to the agent's context when it has unread mail, with the command that reads it. A compacted or resumed conversation hears again about mail that is still unread (#1062).
  • An agent at rest wakes up. An idle agent runs no hooks. When its mail stays unread for 5 seconds, tuios types one line into it through the delivery queue. The line never goes into a pane on a prompt, and a burst of mail gives one line. [agents.mail] wake = false turns it off (#1065).
  • Mail carries no instructions. The hook line holds only the count, the sender names and the command. The wake line holds no sender text at all. A wake carries the grants of the caller that sent the mail, so a pane that may not type into the agent cannot wake it.
  • Asks take turns. Two agents can now ask one agent at the same time. The second ask-agent waits for its turn and does not fail with not_ready. Before, two asks that came together typed into one line and read each other's answers (#1063).
  • Errors that name the next command. The common agent mistakes now get an error with the exact next command, with the session in it. A wrong window name lists each window once, as name (id) (#1066).
  • A pane's own session. A command in a pane without -s now acts on that pane's session (#1073).
  • Typing that aims. From a pane, send-text and send-keys need -w. They and paste-buffer refuse a pane on a prompt unless you pass --allow-blocked (#1075).
  • Wait for new output. tuios wait-for window-output --new matches only output that comes after the wait starts. A marker from an earlier run no longer matches at once (#1074).
  • Short captures. tuios capture-pane --scrollback keeps the last 3 commands, in at most 2000 lines. --commands N keeps the last N. --lines 0 gives the whole history (#1076).
  • A question shows on the pane. While ask-human waits, the pane shows needs_input with the question. A question over 160 bytes gets an error that tells the agent how to send the details first (#1077).
  • The skill. tuios --skill is rewritten as tasks. Every error code has a fix, and there are recipes for many agents (#1061, #1067, #1068).
  • Agents resume at the prompt. After a restart, resume_agents = "auto" waits for the shell's prompt before it resumes an agent. A slow shell start, such as fastfetch, no longer eats the resume. Thanks to @AdrielVelazquez (#1029).

Lock mode

Discussion #850 asked for zellij's locked mode. Thanks to @gozes for the request (#1081).

[keybindings]
lock = true
  • In terminal mode every key goes to the pane, except the leader. alt+1 to alt+9, alt+n, ctrl+p and shift+up reach your program.
  • The leader unlocks for one action, then tuios locks again. Under the zellij preset the leader is ctrl+g, as in zellij.
  • A move that repeats, such as a focus move or a resize step, keeps its menu open. The open menu takes only the moves that repeat. esc closes it and locks. Any other key closes it, locks and goes to the pane.
  • The dock shows a lock while tuios is locked, and an open lock while a menu waits. Without Nerd Fonts it shows LOCK and UNLOCK.
  • The mouse, window mode and copy mode do not change.

Panes and the terminal

  • Kitty images on another machine. A program in a pane on a linked machine (new-window --host) can show a kitty image that it names by path. kitten icat --transfer-mode=file and --transfer-mode=memory work there. The far machine reads only the files that the link may read (#1086).
  • Clear the scrollback. The clear_scrollback action clears the focused pane's history, as Cmd+K does in Ghostty and iTerm2. The prompt moves to the top, and the shell does not redraw. It has no default key. Bind it to super+k, or use "Clear the scrollback" in the palette. tuios clear-history does the same from a script, and the tmux shim answers clear-history (#1104).
  • Bells reach your terminal. notifications.bell = "forward" sends a pane's bell to the terminal that tuios runs in. "both" also keeps the dock message, "toast" is the default, and "off" does neither. Over tuios ssh and tuios-web the bell goes to that client (#1100).
  • Edit the scrollback in your editor. ctrl+g in copy mode, or ctrl+b E, opens the pane's whole history in your editor, at the line of the copy cursor. tuios removes the file when the editor exits. EDITOR="code --wait" works (#1083).
  • Smooth slides. Tiled panes slide from where they are drawn, in one move. A new pane no longer makes the first pane flash. The keyboard swap now slides too (#1070).

Plugins

  • Install from git. tuios plugins install owner/repo gets a plugin from GitHub, any git URL or a folder. It shows what the plugin runs, builds it and turns it on. Each install builds into a new folder, so a failed build never touches the plugin that runs (#877). Docs
  • Pinned. plugins.lock pins each plugin at a commit. Keep it with your dotfiles. tuios plugins install with no source installs every plugin that the lock pins (#877).
  • Native plugins. A plugin with a tuios-plugin.toml names the grants it needs, such as read. tuios holds every process that the plugin starts to those grants. A plugin with only read cannot type into your panes. Native plugins run on Linux and macOS (#956).
  • You approve each native plugin first. A native plugin runs only after you approve it on this machine. tuios plugins install asks you in the terminal. A plugin that comes another way stays off: tuios plugins link DIR adds it, and tuios plugins enable ID turns it on. Then an attached client shows a dialog with the source of the plugin, what it runs and each grant in plain words. To allow it, type allow and press enter. No single key or click allows a plugin. tuios plugins approve ID asks the same question in a terminal (#1006).
  • A change asks again. The approval covers the manifest and the files that its commands name. A changed manifest asks again. tuios plugins list shows "waiting for approval" or "denied" (#1006).
  • admin stays yours. Only you can give a plugin admin, with --grant admin. A plugin process can never act as you (#959).
  • herdr plugins. herdr plugins run unchanged. They can report for a pane from outside the pane, so clauth, herdr-mirror and herdr-board work. env on the create verbs, plugin action keys and herdr 0.9.5 work too (#878, #879).
  • herdr-sidebar. tuios plugins install alexarthurs/herdr-sidebar/plugins/herdr-sidebar installs the file explorer. A click on a file opens its preview (#1088).

sketch, tplot and tml as commands

Three tuios libraries now come with a command of their own. You do not need tuios or Go to use them.

  • sketch draws Mermaid diagrams. It reads a .mmd file, each Mermaid block of a Markdown file, or standard input. In a terminal it writes the text drawing. In a pipe it writes SVG. -o writes SVG or PNG, and -f kitty shows the picture in a terminal with kitty graphics (#1031).
  • tplot draws a chart from CSV, TSV, JSON or plain numbers. --kind picks bar, column, line, area, spark, hist, heatmap, pie, donut, gauge or map. The chart takes the 16 colours of your terminal's theme (#1036, #1040).
  • tml checks a TML document and opens it full screen, with keys and the mouse. A close action prints its value as JSON, so answer=$(tml confirm.tml) works (#1036).

Install them from a package, from the release archives or with Go:

brew install gaurav-gosain/tap/tuios-sketch   # also tuios-plot and tuios-tml
yay -S tuios-sketch-bin                       # also tuios-plot-bin and tuios-tml-bin
go install tuios.dev/sketch/cmd/sketch@latest
go install tuios.dev/plot/cmd/tplot@latest
go install tuios.dev/loom/cmd/tml@latest

Each release now has sketch, tplot and tml archives for Linux, macOS, Windows and FreeBSD, on amd64 and arm64 (#1037). The tuios-plot packages install the tplot command, because GNU plotutils already has a plot.

TML surfaces in tuios

  • tuios tml show puts a TML document on screen as a popup or a pane, in your theme. Use it for a dashboard, a test result or a yes or no question (#944). Docs
  • --wait gives the answer back to your script. --events keeps the surface open, and tuios tml patch changes it (#945).
  • A surface that an agent opens can only do what that agent may do. tuios asks you before a surface first types into a pane (#947).
  • A TML popup is a dialog with one thin frame. The owner and the title are in the top border, and the screen behind it is dimmed (#976).
  • Text fields take typed text and a paste, in a popup, a pane and the agents view. tab or a click goes into a field, and esc leaves it. enter submits the form (#1092).
  • You choose where a document sits. ctrl+b t f docks a popup as a pane and floats it again. The dock control on the popup's border does the same. The surface keeps its state, and a patch from the agent does not move it back (#1082).
  • What an agent shows also appears on its Artifacts tab in the agents view (#1082).
  • tuios --skill tml teaches an agent to write valid TML (#947).
  • An idle surface uses no timer and no redraw.

The libraries

All of these are Go modules in this repository. None of them imports tuios. See tuios.dev/docs/libraries.

  • tuios.dev/tml v0.1.0 is the TML language. It parses, prints, checks and evaluates documents in XML or JSON, with 54 components (#893).
  • tuios.dev/loom draws TML into cells, with flex layout and a palette for each colour depth. Its text fields now take typed text (#909, #1053, #1092).
  • tuios.dev/plot v0.2.1 draws bar, line, area, sparkline, gauge, histogram, heatmap, pie, mirrored and inline bar charts, and a world map, as cells (#908, #940, #942, #943, #983).
  • tuios.dev/sketch is a pure Go port of pele, the Mermaid renderer by kepano. See the next section.
  • tuios.dev/vt v0.3.0 sends the mode 2031 notice on every palette change (#883).

sketch and pele 1.9.0

  • Mermaid in the terminal. tuios mermaid draws a diagram as a picture where the terminal shows images, and as text everywhere else. --watch draws it again each time you save, with motion between layouts (#919, #920). Docs
  • All 33 diagram types. sketch now draws every type that pele draws. New since v0.10.1: XY charts, timelines, quadrant charts, user journeys, kanban boards, git graphs, sankey, block, architecture, requirement, C4, packet, radar, treemap, info, tree view, Ishikawa, Cynefin, event model, Venn, Wardley map, railroad, use case, agent flow and swimlane diagrams (#948, #949, #954, #955, #957, #958).
  • Follows pele 1.9.0. All 522 corpus pictures match pele 1.9.0 (#988, #992, #993, #1091).
    • Labels take <sub>, <sup>, <code>, <kbd> and other text tags. Text such as List<T> stays as it is.
    • A label can break at a zero-width space or a soft hyphen.
    • Class diagrams wrap into rows. Sankey links get gradients, and state diagrams follow flowchart.curve.
    • Edges into and out of subgraphs cross less.
    • Bold and italic carry across a line break.
    • $$...$$ math labels work for a program that gives a math renderer. tuios mermaid shows the TeX source.
    • Output is the same on arm64 and amd64 (#1004).
  • Faster. Renders are about 30% faster, and start about 1 ms sooner (#928). A flowchart with 20,000 stepped edges takes 0.42 s, down from 2.7 s (#1005).
  • Text drawings for every type. Each type now has a text drawing, not only flowcharts and sequence diagrams (#951).

The redesigned text drawings

The text drawings now look like their diagrams at 80 columns (#1009, #1028).

  • A pie chart is a disc of half blocks, with a legend of labels and shares.
  • A radar chart is drawn in braille dots, with one colour for each curve.
  • XY chart bars stand on the axis and end at their values.
  • An Ishikawa diagram stays a fishbone, a Venn diagram shows its circles, and a treemap shows its boxes.
  • An event model shows its lanes, and the big flows of a sankey diagram are heavy lines.
  • Edges that arrive on one side of a node join into one arrow.
  • Node shapes share one family of lines, so their strokes join.
  • Charts draw through tuios.dev/plot, so they take your theme's colours.
  • Without colour, or at 40 columns or fewer, a chart is a table or a list of bars.
  • A long sequence message wraps. All 38 sequence diagrams of the corpus fit in 80 columns, up from 31 (#1005).

Try every type in the sketch playground. All credit for the design goes to pele and kepano. pele is under the MIT licence.

Looks

  • Take over your settings. Before, a key that config.toml sets hid the same key of a look. tuios look apply now lists those keys and asks if the look can set them. Your values are saved, and tuios look remove puts them back. --take-over answers yes (#1034).
  • Choose a look from a list. tuios look pick shows the looks of the gallery, with the name, the author and the theme colours. enter applies the look, with the same questions. tuios look list prints the list, and the palette has "Choose a look" (#1035).
  • Dim behind a popup. appearance.popup_dim dims the screen behind a focused popup, from 0 to 90 percent. tuios popup --dim N sets it for one popup. A TML popup uses appearance.modal_dim, as the other dialogs do (#979). Thanks to @syz51.
  • The dock. appearance.dock_mode_split_letter = false hides the V or H in the mode pill, so the workspace tabs stay still when you press the leader. A number-only workspace tab shows the workspace name on hover (#969, #970).
  • A border for each mode. appearance.border_focused_color_window and appearance.border_focused_color_terminal set the focused border for each mode. With neither set, the terminal mode border is now a step darker on most themes, so you can tell the modes apart (#1099).
  • Dialogs follow your border style. The rename, confirm and new space dialogs draw their frame in appearance.border_style. appearance.frame_panels = true frames the palette, the switchers, the agents view and the settings page in it too. Thanks to @abhijit-s (#965).
  • The rail's cursor row. The cursor row of the rail is now bold and underlined, so it shows on a see-through terminal. appearance.sidebar.cursor_background sets its background. When no terminals row shows the focused pane, its agents row carries the focus mark (#1101, #1105, #1114).
  • Theme sync. A program with mode 2031 on gets a notice on every palette change. Neovim and opencode now follow a switch between two dark themes (#883). The new after-theme-change hook gives other tools the theme id, the background and whether it is light (#885).

The tuios.dev docs site

  • Every tuios theme. The site can take any of the 344 tuios themes. Open the picker from the palette button or with ctrl+b t.
  • Library pages. Each library page opens with a picture that its own code drew, and a quickstart with real output.
  • The sketch playground. It runs sketch in your browser, with all 33 diagram types and their text drawings. You can copy the PNG. The site's own Mermaid diagrams are drawn by sketch.
  • New pages. Restarting the daemon, starting an agent, plugins, and the Neovim plugins of the community.
  • Blog posts. Plugins that ask before they act, TML surfaces, Mermaid diagrams in the terminal, and restarting the daemon. See tuios.dev/blog.
  • In the wild shows posts and videos about tuios.
  • The landing page shows an exploded view of a real tuios frame. Wide content stays inside the column on a phone.
  • Learn tuios in the browser answers a key in one frame, and its download is 27% smaller. Each lesson now stops the one before it (#867, #868, #869).
  • Official sources. tuios lives only at tuios.dev and in this repository. It has no X or Twitter account. An account that offers a tuios token is not this project. The README now says so (#1056, #1057).
  • Shell completions are in the README. Thanks to @noelmiller (#1080).

Security

A pane could answer another agent's prompt

v0.11.0 fixes GHSA-78rj-pghh-vh42, "set-agent-state lets a pane answer another agent's prompt". Its severity is medium. It affects v0.10.1 and earlier. Thanks to @NotAFlightRisk for the report.

  • In the default open mode, a pane needs the respond grant to type into a pane that waits on an agent prompt.
  • set-agent-state did not check that the caller ran in the pane it named. So a pane could set another pane's state to working first. Then it could type into that prompt and answer it without respond.
  • A process in one pane, such as an agent that followed injected instructions, could approve the permission prompts of other agents on the same daemon.
  • Now a pane sets the agent state only of its own window. A report about another pane needs respond. When a report from outside a pane moves it off its prompt, tuios still treats the pane as on its prompt (#1054).

Read Agent state from another pane for what this changes.

Other hardening

  • Fans. A pane could join a fan that it was not part of by giving the same name. Joining a fan is now explicit, with tuios fan --join SESSION (#972). A fan holds its lead by session ID, so a new session with the old lead's name reaches nothing. A fan name can only have plain letters, digits and / . _ -, so one fan cannot look like another (#978, #984).
  • The link plane. A linked machine stays inside the files that its rules allow. A folder copy leaves out denied entries (#926). The deny list now also covers the snap and flatpak browser folders, Thunderbird, Signal, Discord, Slack, Telegram, VS Code and common crypto wallets (#1086).
  • Agent gates. A config reload can only narrow the approval rules. A risk mark stays until its prompt closes (#925).
  • tuios-web. tuios-web refuses --no-auth on an address that listens on every interface, and binds the address it checked. It moves to sip v0.9.4 (#924, #936).
  • The opencode reader sends the service password only to a socket that this user owns (#918, #933).
  • Plugins. A process that a herdr plugin leaves behind can no longer act as you. Every herdr socket method now names its check (#956, #959).
  • Typing into prompts. A pane with respond no longer types into another agent's prompt by mistake. It must pass --allow-blocked (#1075).
  • Reports. Send a security report through GitHub private reporting. The address in the old policy did not work (#1030).
  • Go 1.26.10. tuios is built with Go 1.26.10, a security release for crypto/x509. The Nix build uses it too (#939, #987).

Contributors

Thank you to everyone who sent a pull request for this release:

  • @abhijit-s:
    • The go-to picker. ctrl+b G lists every agent, session, workspace and pane, and enter goes there. With nothing typed, enter goes back to the place you were last (#964).
    • enter on an action in a # search of the palette runs it, and ctrl+e rebinds it (#967).
    • ctrl+alt+N (ctrl+opt+N on macOS) sends a pane to workspace N and keeps you where you are (#971).
    • ctrl+u clears the rename dialog, and ctrl+c clears it or closes it (#963).
    • A workspace number follows its place when you move or close a workspace (#875).
    • Agent rows that clear when the harness exits or a program leaves the pane (#873, #874, #929, #953, #990, #997, #1008).
    • Kitty images sent by file, and the cell of a pane nobody is attached to (#906, #930).
    • The pane menu over programs that track the mouse (#907), the Changes tab (#985), and the first step of live daemon upgrades (#876).
    • Dialogs and panels that follow the pane border style (#965).
    • A paste that goes into every input box and never reaches the pane under it (#1044).
    • More agent rows that clear on time, and a held state that no longer comes back after the agent left (#1041, #1042, #1043, #1051), and steadier tests (#974, #1050, #1052).
  • @davidreuss: each workspace keeps its own layout mode (#712).
  • @SugarHashira: menus declared in config under [keybindings.menus.NAME], opened with open_menu:NAME (#719).
  • @syz51: the dim behind a popup (#979), and its request (#977). The fix for extra cursor marks in Neovim redraws (#1049, which fixes #1048).
  • @vvicaretti: the startup layout for worktree sessions made from the rail (#914), and the worktree delete when you close its session (#973).
  • @adestis-bm: the version of a go install build (#938, which fixes #937).
  • @LeeSamuel14: the keybind commands in their own file (#899).
  • @AdrielVelazquez: agents that resume at the first shell prompt after a restart (#1029).
  • @Ian-q: review that never reads an untracked file past max_untracked_mb (#1079, which fixes #1078).
  • @Louranicas: the Codex 0.164 folder trust prompt (#1095).
  • @noelmiller: shell completions in the README (#1080).

And thanks to @NotAFlightRisk for the security report, @MunsuBahk for the Codex report (#852), @LovesAsuna for the input method report (#649), @reflog for the mouse lag report (#1058), @nkapila6 for the help report (#1085), @farangkao for the rail cursor request (discussion #1094), and @gozes and everyone in discussion #850 for lock mode, the scrollback clear, the bell and the mode borders.

Fixes

  • Snap left. Dragging a floating pane to the left edge broke the screen when another pane tracked the mouse in pixels. The pointer past the edge came in as typed keys (#950).
  • Input methods. The candidate window of an input method opens at the caret (#897).
  • Codex in another terminal. A Codex conversation in another terminal no longer takes over a pane's row, Inbox items and notifications (#882).
  • Alt keys in Windows Terminal. alt+1 to alt+9 and the other Alt keys now work in window mode (#995).
  • The scrolling layout. A new pane opens after the focused column, also in a daemon session (#968).
  • Agent state after an exit. A pane no longer shows an agent after the agent exits. A program such as mise in that pane no longer reads as an agent (#997, #1008). Thanks to @abhijit-s.
  • Renamed sessions. An agent in a session with a new name reports its state again (#990). Thanks to @abhijit-s.
  • Background sessions. A harness that runs outside the pane no longer reports for it. Claude Code's background sessions made phantom agent rows (#874). Thanks to @abhijit-s.
  • The leader key. A prefix binding on the leader key runs when you press the leader two times (#911).
  • The navigator keeps a finished pane of another session marked as seen (#910).
  • The pane menu opens on a right-click in window mode over a program that tracks the mouse (#907). Thanks to @abhijit-s.
  • Kitty images sent by file and placed past the pane edge crop at their own scale (#906, #930). Thanks to @abhijit-s.
  • Worktree sessions made from the rail use your startup layout (#914). Thanks to @vvicaretti.
  • tuios --version shows the module version for a go install build, not dev (#938). Thanks to @adestis-bm.
  • The exit. tuios gives the host terminal its own kitty keyboard flags back when it exits (#987, #1022).
  • Wide characters in TML. A row with overlapping wide characters keeps its full width (#1053).
  • Paste in input boxes. A paste into the palette, the help search, the session switcher, the settings or a rename no longer goes to the shell under it. Before, the shell ran each pasted line as a command. The window and workspace renames now take a paste (#1044). Thanks to @abhijit-s.
  • Mouse lag on a wide screen. Hover drew one whole frame for each mouse report, so on a wide screen it trailed the pointer by up to two seconds. Motion now draws at most once per frame (#1059, which fixes #1058).
  • Cursor marks in Neovim. Extra block cursors no longer flash while Neovim redraws, local or over SSH (#1049). Thanks to @syz51.
  • Review and Git LFS. Review never reads an untracked file larger than [agents.checkpoints] max_untracked_mb. Before, each review could copy large LFS files into .git/lfs/objects (#1079). Thanks to @Ian-q.
  • Codex 0.164. tuios sees the new "Trust this folder?" prompt as a prompt that needs you (#1095). Thanks to @Louranicas.
  • Agent rows. A pane whose agent ended no longer stays in list-agents at its shell. A pane no longer goes back to idle after its agent left (#1041, #1042, #1043, #1051). Thanks to @abhijit-s.
  • The help overlay lists workspace keys from every section of the config (#1098, which fixes #1085).
  • Fans. The New agent sheet checks a fan name as git does, before the start. A machine that cannot read its load shows it as unknown, not as idle (#989).

Performance and size

  • An idle TML surface uses no timer and no redraw. A plugin's process watcher wakes only when a process ends (#944, #959).
  • sketch renders about 30% faster (#928).
  • The hosts page no longer reads the whole config file on every frame. That was 16% of the client's CPU during a mouse sweep (#1059).
  • The bundled harness manifests ship as one compressed archive of 24 KB, down from 99 KB (#871).
  • The linux/amd64 binary is 46.9 MB, up from 37.7 MB in v0.10.1. The cockpit, seven more threads, Markdown, the restart, tuios mermaid with its fonts and 33 types, TML surfaces and plugins take the difference. The ceiling is now 50 MB. Each raise is in docs/perf.md with its reason.

Upgrading

Restart the daemon

The cockpit, the threads, TML surfaces, native plugins, mail, kitty images over links and the security fixes need the new daemon. After you update, run:

tuios restart-server

It shows which programs stop and what comes back, and asks first. Each session comes back with its layout, its pane history and new shells. tuios offers to resume the agents that can resume. A daemon older than v0.11.0 does not tell its clients that it stops. Its clients wait 6 seconds and then quit, so attach again after that. From v0.11.0 on, clients attach again by themselves. See Restarting the daemon.

Agent state from another pane

A pane sets the agent state only of its own window. A report about another pane needs the respond grant. This covers set-agent-state, set-agent-meta, set-agent-session, report-agent-activity, ask-human and request-approval. A hook or another program that tuios starts outside every pane reports for no pane. You can still set the state of any pane from your own terminal outside tuios.

A command under [hooks] in your config that calls set-agent-state is now refused. tuios runs that command outside every pane.

A command in a pane without -s

A tuios command that runs inside a pane and leaves out -s now acts on the pane's own session. Before, it acted on the most recently active session, which can be another session. Commands that you run outside every pane do not change. A script in a pane that relied on the old default must pass -s with the session it wants.

Typing from a pane

From inside a pane, send-text and send-keys need -w. Before, they typed into the pane that you have in focus.

From inside a pane, these two commands and paste-buffer also refuse a target pane on needs_input, with the error agent_blocked. This holds a pane with the respond grant too. To answer the prompt, pass --allow-blocked. A tmux script that runs through the tmux shim and types into a waiting pane is refused the same way. Commands that you run outside every pane do not change.

A pane that asks the person shows needs_input

While ask-human from inside a pane waits, that pane shows needs_input with the question as its note. When the call returns, the pane shows its earlier state again. A script that waits for needs_input now also wakes on such a question. To tell the two apart, read list-attention: the question is an item of kind ask.

capture-pane --scrollback keeps the last 3 commands

tuios capture-pane --scrollback without --lines now keeps the last 3 commands of the history, in at most 2000 lines. A long output keeps its start and its end, and one line replaces the middle. A shell that sends no OSC 133 marks gives the last 2000 lines. A note on stderr says what the capture left out. The JSON gives the count in lines_omitted. A script that reads the whole history must add --lines 0. The capture also drops the blank rows below the cursor, as --lines always did.

Mail wakes an agent at rest

An idle agent with unread mail now gets one line typed into it after 5 seconds. The line tells it to read the mail. To stop this, set wake = false under [agents.mail]. A change to true waits for tuios config apply from outside tuios.

Asks of one agent take turns

A second ask-agent to a busy agent now waits for its turn, up to its --timeout. Before, it failed with not_ready after --ready-timeout. The CLI no longer stops a default ask after 10 seconds.

The agents view replaces the Inbox panel

ctrl+b i opens the full-screen agents view. The Inbox items are its Needs you group. Some keys moved:

  • n opens the New agent sheet. Reject with a reason is now R.
  • x marks an agent for a bulk answer. Before, it was space, which is now peek.
  • f steps through the items, then each kind, then every agent.
  • The tab "Live" is now "Pane".

Every key is a binding in [keybindings.inbox].

Plugins

  • A native plugin waits for your approval on each machine, also when it comes from plugins.lock. Approve it in the dialog or with tuios plugins approve ID.
  • tuios plugins approve and tuios plugins install --grant admin need a running tuios daemon.
  • A process that a plugin started cannot turn a plugin on or off. Do that from a terminal outside tuios.
  • The tuios plugins commands that change plugins (install, link, unlink, enable, disable and build) are refused inside a tuios pane. Run them from a terminal outside tuios.
  • herdr plugins keep the default pane grants of [agents.permissions]. To give one fewer grants, add a tuios-plugin.toml with [herdr] manifest = "herdr-plugin.toml" and the grants it needs. Then install it again.

Workspaces

  • A workspace number is now its place. Move a workspace, and its number changes with it. Close workspace 2 of 3, and workspace 3 becomes 2 (#875).
  • Each workspace keeps the layout mode that you chose on it. A workspace with no choice uses startup.layout (#712).
  • ctrl+alt+1 to 9 (ctrl+opt+1 to 9 on macOS) now send the focused pane to a workspace. A config that already binds those keys keeps them. tuios keybinds doctor then lists send_to_workspace_N with no key (#971).

Lock mode and the zellij preset

The zellij preset now turns lock mode on. Every key but ctrl+g goes to the pane. To use alt+1 to alt+9 and the other tuios chords again, set lock = false under [keybindings] (#1081).

Looks

  • With no focused border colour set, the terminal mode border is now a step darker than the window mode border on most themes. To keep one colour for both, set appearance.border_focused_color.
  • The small dialogs now draw their frame in your appearance.border_style. Before, they were always rounded.
  • The rail's cursor row is now bold and underlined at 256 colours and truecolor.

Worktree sessions

The quit menu's "Delete worktree and quit" (w) now opens the close dialog first. A worktree with commits that no branch, tag or remote holds is refused with worktree_detached.

Fans

A fan with the name of a fan that exists is refused with fan_exists. To add attempts to a fan, use tuios fan --join SESSION. A fan with no name gets a free name, such as -2 after the name (#972).

tuios-web

  • tuios-web refuses --no-auth with --host 0.0.0.0, :: and the other addresses that listen on every interface. Bind to localhost, give one interface address, or set a password with --random-password or --password-file. A container with a published port needs a password.
  • tuios-web resolves a --host name once and binds that address. It refuses a name with both loopback and other addresses, and a name that resolves to a link-local address.
  • On Windows, tuios-web refuses a password file that another account owns or can read. The error shows the icacls command that fixes the file.
  • tuios-web refuses a --host with a port, such as --host 10.0.0.1:7708. Give the port with --port.

Agent approvals

A config reload can now only narrow [agents.approvals]. A rule that the file drops stays in force until you run tuios config apply from outside tuios or restart the daemon. panes_may_allow stays off until then too. The Inbox shows a "config.toml change waits" item. A rule that the file adds applies at once.

Files over a link

A linked machine can no longer read ~/.gitconfig, ~/.config/git, your shell start files, ~/.config/environment.d and other files that hold credentials. A folder copy over a link leaves those entries out. tuios cp then says how many items it did not copy, and exits with status 3. .pub keys stay readable.

The list now also covers the snap and flatpak browser folders, Thunderbird, Signal, Discord, Slack, Telegram, VS Code and common crypto wallets. A kitty image that a pane on a linked machine names by path follows the same rules.

Session names

tuios refuses a session name of dots only, a name that ends in a dot, and the Windows device names (con, prn, aux, nul, com1 to com9, lpt1 to lpt9). This applies on every system, so a saved session can move between machines. An old saved session named con still loads outside Windows.

Keyboard flags at exit

tuios now pushes its kitty keyboard flags at start and pops them at exit. Your terminal gets its own flags back. Before, tuios set the flags to 0 at exit.

Theme notice

A program that turns on mode 2031 now gets the notice on every palette change, not only on a switch between dark and light.

New config keys

[keybindings]
lock = false                          # true gives every key but the leader to the pane

[notifications]
bell = "toast"                        # "forward", "both" or "off"

[appearance]
border_focused_color_window = ""      # the focused border in window mode
border_focused_color_terminal = ""    # the focused border in terminal mode
frame_panels = false                  # frame the palette and other panels in border_style
popup_dim = 0                         # dim behind a focused tuios popup, 0 to 90
dock_mode_split_letter = true         # false hides the V or H in the mode pill

[appearance.sidebar]
cursor_background = ""                # the background of the rail's cursor row

[agents.mail]
wake = true                           # type one line into an idle agent with unread mail

For developers

  • go install of tuios needs Go 1.26.8 or newer.
  • New modules in go.work: tml, loom, plot and sketch.
  • vt.SetReportColors(fg, bg, pal) replaces SetReportPalette in tuios.dev/vt v0.3.0.
  • A harness manifest can set shared_server, session_file and by_session. A [transcript] block names the transcript format.

Full Changelog: v0.10.1...v0.11.0


Full Changelog: v0.10.1...v0.11.0

Don't miss a new tuios release

NewReleases is sending notifications on new releases.