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.
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.1A 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
A linked machine could read and overwrite files
v0.11.1 fixes GHSA-5q2q-f2hv-wf4h. Its severity is high. It affects v0.8.0 to v0.11.0. Thanks to @Gsirawan for the report.
- A linked machine or a paired phone with only the
listormailclass could read any file on this machine throughstash-put. - With only
list, it could overwrite a file with a pane's screen text through theoutpath ofscreenshot. For example, it could replace~/.ssh/authorized_keys. - With only
list, it could read the changed lines of fan worktrees throughcompare-fanwithdetail. These can hold secrets, such as a.envfile. - Now a linked machine sends stash content as bytes. It cannot choose a screenshot path, and the picture goes under
screenshot.directory. It needswritefor the changed lines of a fan. A test holds everylistandmailverb 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. Its severity is high. It affects v0.8.0 to v0.11.0. Thanks to @Gsirawan for the report.
- 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/hooksand.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-diffand--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 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 shipand the other ship commands that you run yourself keep the repository's config and hooks. A call from inside a pane does not.
Text in a pane could type a command at the prompt
v0.11.1 fixes GHSA-5cvj-c8rj-c749. Its severity is high. It affects tuios v0.7.0 to v0.11.0, and tuios.dev/vt v0.3.1 and earlier. Thanks to @Gsirawan for the report.
- 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/vtkeeps only the selection namesc,p,q,sand0to7, 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.
Fixes
- Floating panes in tiling mode. An
altdrag 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_unfocusednow dims text in the default colour, with the colours your terminal reports. A translucent terminal shows no opaque block. The focused and unfocused borders are now easy to tell apart, on no theme and on the shipped themes (#1146). - 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).
- Mermaid in TML. A
mermaidelement in a TML surface now draws the diagram, not its source. A longkvvalue wraps (#1147). - Read a TML surface as text.
tuios capture-paneon a TML pane prints the surface as drawn.tuios tml render FILEprints a document as text and opens nothing. So an agent can read a surface before and after it shows it (#1148). - 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).
tuios mermaidin a pane. Diagrams stack in a pane without cuts, at the size of the terminal's text.--background nonedraws a picture on the terminal's own background (#1132).- A new worktree from a pane.
ctrl+b Umakes a worktree of the focused pane's repository, with a new branch and a session in it. The action isnew_worktree(#1161). Thanks to @Soleone for the request. - The gilt theme.
theme = "gilt"is a dark theme of obsidian, parchment and gold (#1159). Thanks to @Soleone. - 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 withagent_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
/treeselects. 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
FocusLostnow 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
tuiosstarts 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).
- Plugins.
tuios plugins uninstall IDremoves a plugin (#1125). - sketch and pele 1.10.0.
tuios mermaidfollows 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. In my test with 50 MiB of output, the page's main thread went from 6,788 ms to 10 ms, and the longest frame gap went from 250 ms to 16.8 ms. The default is unchanged. To try it, open the page with
?renderer=engine, or set Renderer to engine in the settings panel (#1162).
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.
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).
Full Changelog: v0.11.0...v0.11.1