An account on X called @tuiosdev is pretending to be tuios. It is not this project. tuios has no X account and no token. Learn more

All releases

latest release8 min read

v0.11.1

Fixes three security problems that @Gsirawan reported: GHSA-5q2q-f2hv-wf4h, GHSA-qcx6-vr32-xr8q and GHSA-5cvj-c8rj-c749. Also a new worktree key, the gilt theme, Mermaid in TML surfaces, tuios tml render, calmer dim and borders with no theme, and an opt-in worker engine for tuios-web.

GGGaurav Gosain

tuios 0.11.1 fixes three security problems. All three were found and reported by @Gsirawan, and I am very grateful for the careful reports. Please update, then restart the daemon with tuios restart-server. The fixes are in the daemon, so an old daemon keeps the old behaviour.

This release also has the fixes that landed after v0.11.0: floating panes in tiling mode, a calmer cursor while an agent works, the dim and borders with no theme, Mermaid in TML surfaces, and more. Read Security first.

The full list is at tuios.dev/releases.

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.1
docker run -it --rm ghcr.io/gaurav-gosain/tuios:v0.11.1

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.

Security

All three advisories are rated high. Thanks again to @Gsirawan for each report.

A linked machine could read and overwrite files

v0.11.1 fixes GHSA-5q2q-f2hv-wf4h. It affects v0.8.0 to v0.11.0.

  • A linked machine or a paired phone with only the list or mail class could read any file on this machine through stash-put.
  • With only list, it could overwrite a file with a pane's screen text through the out path of screenshot. For example, it could replace ~/.ssh/authorized_keys.
  • With only list, it could read the changed lines of fan worktrees through compare-fan with detail. These can hold secrets, such as a .env file.
  • Now a linked machine sends stash content as bytes. It cannot choose a screenshot path, and the picture goes under screenshot.directory. It needs write for the changed lines of a fan. A test holds every list and mail verb to the same rule (#1163).

What you notice: nothing, in normal use. tuios stash put to another machine already sends bytes. Commands that you run on this machine do not change.

A repository could run its own programs outside the pane

v0.11.1 fixes GHSA-qcx6-vr32-xr8q. It affects v0.8.0 to v0.11.0.

  • tuios runs git in a pane's repository for checkpoints, reviews, counts and new worktrees. A program in the pane can change that repository, including .git/hooks and .git/config.
  • So the repository could name a hook, a filter or a textconv program that the daemon ran. The program ran outside the pane, and outside any sandbox that the pane's agent ran in. A checkpoint at the end of an agent's turn was enough, with no action from you.
  • Text shown in a pane could also set the folder that the New agent sheet used, so the sheet could run git in another repository.
  • Now tuios runs its own git with no hooks. A filter, textconv or diff program that only the repository's own config names does not run. diff, log and show get --no-ext-diff and --no-textconv. The New agent sheet, the sidebar git section and the daemon use the folder the pane's shell is in, not the folder that the pane reports (#1164).

What you notice:

  • A worktree that tuios makes no longer runs your post-checkout hook. Run it yourself in the new worktree if you need it.
  • A filter from your global git config, such as Git LFS, still runs.
  • In a repository with its own filter, such as git-crypt, checkpoints and reviews read the files as they are on disk.
  • tuios ship and the other ship commands that you run yourself keep the repository's config and hooks. A call from inside a pane does not, so tuios ship commit from a pane runs no pre-commit hook.

Text in a pane could type a command at the prompt

v0.11.1 fixes GHSA-5cvj-c8rj-c749. It affects tuios v0.7.0 to v0.11.0, and tuios.dev/vt v0.3.1 and earlier.

  • A program asks for the clipboard with an OSC 52 query. The terminal writes the answer to the pane's input, as if you typed it.
  • The answer copied the selection field of the query as it was. So text in a file that you cat, a log line or the output of an ssh session could put a command on your shell prompt. One Enter ran it.
  • A program in the pane could also set the pane's copy of the clipboard with OSC 52 and then ask for it, to put its own text on the prompt.
  • Now tuios.dev/vt keeps only the selection names c, p, q, s and 0 to 7, as xterm does. A pane keeps no copy of the clipboard, and an OSC 52 query gets empty content back, as in xterm (#1165).

What you notice: a program that reads the clipboard with an OSC 52 query gets empty content. A program that sets the clipboard with OSC 52 works as before, under appearance.selection.osc52_write. If you use tuios.dev/vt in your own program, update it to v0.3.2.

New in this release

  • A new worktree from a pane. ctrl+b U makes a worktree of the focused pane's repository, with a new branch and a session in it. The action is new_worktree, and the command palette has it too (#1161). Thanks to @Soleone for the request. See Worktrees.
  • The gilt theme. theme = "gilt" is a dark theme of obsidian, parchment and gold (#1159). Thanks to @Soleone.
  • Mermaid in TML. A mermaid element in a TML surface now draws the diagram, not its source. A long kv value wraps (#1147). See tml.
  • Read a TML surface as text. tuios capture-pane on a TML pane prints the surface as drawn. tuios tml render FILE prints a document as text and opens nothing. So an agent can read a surface before and after it shows it (#1148). See tml.
  • Long TML documents. A document taller than its pane scrolls as a page, with a scroll bar. A TML popup minimizes to the dock (#1130).
  • Plugins. tuios plugins uninstall ID removes a plugin (#1125).

Fixes

  • Floating panes in tiling mode. An alt drag on a floating pane resizes it at once, and the tiled panes behind it keep their size. A press on a floating pane's edge grabs the edge (#1150).
  • The cursor while an agent works. The rail shimmer drew 15 frames a second, and each frame moved the cursor to the rail and back. It now draws 8 frames a second, and draws nothing when pane output drew a frame already. With one working agent, tuios sends about half as many frames (#1155, which fixes #1140). Thanks to @Soleone for the report.
  • Hover on a wide or busy screen. Hover over the settings could still trail the pointer on a wide screen or a loaded machine. The motion budget now counts from the end of the frame's write (#1123, #1137, which fix #1058).
  • Dim and borders with no theme. With theme = "none", dim_unfocused now dims text in the default colour, with the colours your terminal reports. A translucent terminal shows no opaque block. The unfocused border with no theme is now a neutral grey, and the focused and unfocused borders are easy to tell apart, on no theme and on the shipped themes (#1146). See Dim the panes you are not in.
  • Stale Pi rows. When you quit Pi soon after it started, its agent row could stay in the rail. A late hook no longer keeps the row (#1149).
  • tuios mermaid in a pane. Diagrams stack in a pane without cuts, at the size of the terminal's text. --background none draws a picture on the terminal's own background (#1132).
  • A settings crash. tuios no longer panics when appearance.scroll_column_max = 20 (#1153, which fixes #1152). Thanks to @z10-arch.
  • herdr agent.prompt. The herdr compat API now types a prompt into a working agent, as herdr 0.9.5 does. A blocked agent is refused with agent_blocked (#1142, which fixes #1138). Thanks to @chambers75 for the report.
  • Pi threads. The Inbox reads transcripts of newer Pi versions, and follows the entry that /tree selects. A tool result that arrives late now updates the card that was drawn already (#1120, #1134, #1135). Thanks to @AdrielVelazquez.
  • Focus reports. A program in a pane hears when the host terminal loses focus and gets it back. Neovim's FocusLost now fires when you switch to another application (#1131).
  • Session size. Under window_size = latest, a session that you leave and come back to keeps its size (#1072, which fixes #1071). Thanks to @udiNur.
  • The first session. A bare tuios starts a new default session in the folder you run it from (#1122, which fixes #1112). Thanks to @agammann.
  • The first prompt. A new agent started with a task gets the task. Claude Code no longer leaves it unsent in its input box (#1126).
  • Pasted images. An image pasted into a reply shows its picture at once (#1127). The @ list in a reply works as a menu (#1129).
  • The files section. The rail's files section is a tree that scrolls with the cursor (#1124).
  • sketch and pele 1.10.0. tuios mermaid follows pele 1.10.0 (#1156). A narrow label breaks at a hyphen or a space before it breaks inside a word (#1089). Thanks to @shubham-tomar.

Performance

  • Pane output memory. Each daemon pane's output queue in the client starts empty and grows with its backlog. Before, each pane reserved about 229 KB when it opened (#1160). Thanks to @Gsirawan.

tuios-web

  • The worker engine, opt in. tuios-web moves to sip v0.10.0, which has a new renderer. It runs the terminal and the connection in Web Workers, so a flood of output does not freeze the page. With 50 MiB of cat in a tuios pane, the page's main thread went from 2,767 ms to 18 ms, and the longest frame gap went from about 200 ms to 16.8 ms. The default is unchanged. To try it, open the page with ?renderer=engine, or pick Worker engine (experimental) under Renderer in the settings panel. A browser that cannot run it gets the default client (#1162). See The worker engine.

Upgrading

Run tuios restart-server after you update. The security fixes are in the daemon. The command shows which programs stop and what comes back, and asks first. See Restarting the daemon.

Three things behave differently after the security fixes:

  • A program that reads the clipboard with an OSC 52 query gets empty content.
  • tuios runs its own git with no hooks, and with no filter, textconv or diff program that only the repository's own config names. A worktree that tuios makes runs no post-checkout hook.
  • tuios ship from inside a pane runs no hooks. Run it from your own terminal to keep them.

Contributors

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

  • @Gsirawan: the three security reports, and the pane output queue (#1160).
  • @AdrielVelazquez: Pi threads in the Inbox (#1120, #1134, #1135).
  • @Soleone: the gilt theme (#1159).
  • @z10-arch: the settings meter fix (#1153).
  • @udiNur: the session size under window_size = latest (#1072).
  • @agammann: the folder of the first session (#1117, landed as #1122).
  • @shubham-tomar: label breaks in sketch (#1089).

And thanks to @Soleone for the cursor report and the worktree request, @chambers75 for the herdr report, @MunsuBahk for the first session report, @reflog for the mouse lag report, and @srackham for the focus report (discussion #1128).