A card in the session's panel said "background command" under every description -- and for Codex, which names a terminal by a process id and gives no description at all, that phrase was the whole of every card. Both halves of the answer are in the transcript rather than in what the provider says: a driver now reports which tool call its task belongs to (Claude's `task_started` carries the `tool_use_id`, Codex's terminal list the `itemId`), and `LiveSession::background_tasks` resolves those ids against the transcript into a sequence number and, where the provider said nothing, the command the call was made with. So the card draws the command, and the kind shrinks to a mark beside it whose name is what a screen reader is given. Tapping one goes to that call in the transcript, opened, which is where a backgrounded command's output already lands -- rather than drawing a second copy of it beside the panel. The journey is the one a reopened session already makes to put a reader back where they stopped, now one function (`travelTo`). It has to release the held backlog first: events arriving while the reader is away from the newest end are held rather than applied, so a task started since they scrolled back was in no row at all and the tap looked like it had done nothing. Verified against the sandbox on the emulator: the panel draws `sleep 120 && echo done` for an echo session's `/background`, and tapping it lands on that Bash card with its output showing.
89 lines
3.9 KiB
Bash
Executable File
89 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Rebuilds androidApp/src/main/res/font/nerd_icons.ttf.
|
|
#
|
|
# The app draws a handful of icons -- a cog, a refresh arrow, send, stop --
|
|
# as text in a Nerd Fonts glyph rather than as vector assets or as ordinary
|
|
# Unicode. Unicode has no character for most of these, and the ones it does
|
|
# have are not reliably in an Android system font, so they land as tofu
|
|
# boxes on somebody's phone. Shipping the subset removes the hope: the
|
|
# glyph is in the APK.
|
|
#
|
|
# The whole symbols font is 3 MB for the handful below, so what is
|
|
# committed is a subset. Add a codepoint to GLYPHS below and to NerdIcons.kt
|
|
# (the two lists have to agree -- a codepoint in the Kotlin but not here is
|
|
# a glyph that silently doesn't exist), then run this and commit the result.
|
|
#
|
|
# Needs python3 and network access; fontTools is fetched into a temporary
|
|
# venv, so nothing has to be installed on the machine.
|
|
#
|
|
# Copied from dev-updater's script of the same name rather than shared
|
|
# through wg-app-link, for the reason Theme.kt gives about the palette: the
|
|
# link is the tunnel, the pinned CA and enrollment, and an icon set is a
|
|
# preference rather than part of that contract.
|
|
set -euo pipefail
|
|
|
|
# Codepoint, then the Nerd Fonts glyph name it came from. Material Design
|
|
# Icons bar one, so they read as one family -- and the first two are
|
|
# deliberately the same two dev-updater uses, since a cog and a refresh
|
|
# arrow mean the same thing in both apps. The exception is noted on its
|
|
# own line, as dev-updater's script does with its two.
|
|
GLYPHS=(
|
|
U+F0493 # md-cog
|
|
U+F0450 # md-refresh
|
|
U+F048A # md-send
|
|
U+F04DB # md-stop
|
|
U+F03E4 # md-pause
|
|
U+F040A # md-play
|
|
U+F1163 # md-send_clock
|
|
U+F0156 # md-close
|
|
U+F004D # md-arrow_left
|
|
U+F009A # md-bell
|
|
U+F04C5 # md-speedometer
|
|
U+F024B # md-folder -- dev-updater's too; a folder means the same in both
|
|
U+F0415 # md-plus -- likewise
|
|
U+F03EB # md-pencil
|
|
U+F0193 # md-content_save
|
|
U+F0224 # md-file_outline
|
|
U+F201 # fa-line_chart -- Font Awesome's, asked for by name
|
|
U+F035C # md-menu -- the burger, as a row's drag handle
|
|
U+F07B7 # md-console_line -- a backgrounded command
|
|
U+F06A9 # md-robot -- a subagent
|
|
U+F04AA # md-sitemap -- a workflow
|
|
U+F0625 # md-help_circle_outline -- a background task of a kind this build does not know
|
|
)
|
|
|
|
url=https://github.com/ryanoasis/nerd-fonts/releases/latest/download/NerdFontsSymbolsOnly.zip
|
|
out="$(cd "$(dirname "$0")" && pwd)/androidApp/src/main/res/font/nerd_icons.ttf"
|
|
work="$(mktemp -d)"
|
|
trap 'rm -rf "$work"' EXIT
|
|
|
|
echo "Fetching $url"
|
|
curl -fsSL -o "$work/nf.zip" "$url"
|
|
python3 -c 'import sys,zipfile; zipfile.ZipFile(sys.argv[1]).extractall(sys.argv[2])' "$work/nf.zip" "$work"
|
|
|
|
python3 -m venv "$work/venv"
|
|
"$work/venv/bin/pip" -q install fonttools
|
|
|
|
unicodes="$(IFS=,; echo "${GLYPHS[*]}")"
|
|
mkdir -p "$(dirname "$out")"
|
|
# The Mono face rather than the proportional one, which this used until
|
|
# 2026-08-30. Every glyph in it is one em wide and one em tall, so two
|
|
# icons drawn at the same size are the same size -- which is what makes two
|
|
# icon buttons beside each other match without either of them being told a
|
|
# width. In the proportional face the advances run from 0.46 em (play) to
|
|
# 0.92 em (line chart), so the composer's Send button came out visibly wider
|
|
# than the Stop button next to it, and any fix at the call site would have
|
|
# been one measurement hardcoded per pair.
|
|
#
|
|
# The trade is the one the old comment named: an icon inline beside text is
|
|
# padded out to a cell. That is worth it, and it is also why GLYPH_SIZE in
|
|
# NerdIcons.kt came down when this changed -- a glyph that fills its em
|
|
# draws bigger at the same point size than one that does not.
|
|
"$work/venv/bin/pyftsubset" "$work/SymbolsNerdFontMono-Regular.ttf" \
|
|
--unicodes="$unicodes" \
|
|
--layout-features= \
|
|
--drop-tables+=DSIG \
|
|
--output-file="$out"
|
|
|
|
echo "Wrote $out ($(stat -c %s "$out") bytes) with ${#GLYPHS[@]} glyphs"
|