v0.2.7
Smith v0.2.7
Smith 0.2.7 makes a session identifiable from outside its own window, and
fixes two places where the interface described state it did not have.
Added: the terminal window is named after the session
Nothing in Smith wrote a window title, so the shell's last title stood for the
life of the TUI and several concurrent sessions left several identical tabs.
The data that tells them apart was already on screen, in the status model the
header renders from.
The TUI now sets the window or tab title to smith · <project> · <model>,
appending a short activity label while a turn or a child wait is actually in
flight. The title is written only when the rendered text changes, so a busy
redraw loop is not a stream of escape sequences, and it is cleared once when
the session ends. Restoring the title the shell had before Smith started is
deliberately not attempted: reading a title back is not portable across
terminals, and the shell's own prompt hook reasserts its title on the next
prompt.
A project name comes from the filesystem and a model id from configuration, so
neither is Smith's own text. Both are sanitized before they enter the escape
sequence — control characters, Trojan-Source bidi and invisible formatting
codepoints, collapsed whitespace, and a bounded length — and the write is
guarded by a terminal check. Piped stdout and smith -p receive no title
bytes; the latter is not wired to the title at all.
Fixed: installed coding agents resolve to a usable model
The selection inventory knew only explicit, trusted, and catalog origins, and
installed coding agents declare none of those. A profile naming
cli/<kind>/<model> was therefore reported as failing to resolve to a usable
provider and model pair, contradicting the zero-declaration contract those
agents are built on. The inventory now falls back to the built-in CLI
bookkeeping limits under their own BuiltIn provenance, and an explicit
[models] table still wins over it.
Previews had a second problem: they carried the active profile's
request-output and reserve values across as hard constraints, which disabled
every candidate with a smaller ceiling even though those values would not
survive the switch. Profile-scoped budgets no longer apply when previewing
another candidate. Values from layers that do survive a switch — environment,
flags, session overrides — still apply, and still disable a conflicting
candidate with a stated reason.
Fixed: the cursor sits where wide characters actually end
The composer reported the cursor as a character count while the renderer
placed it as a display column. On any line holding double-width text the two
disagreed: four CJK characters occupy eight columns and reported four, so the
cursor drew mid-glyph and drifted further with every wide character typed.
Cursor position and the position-to-index mapping are both measured in display
columns now, and remain inverses of each other.
Upgrading
Existing configuration, sessions, and protected checkpoints remain compatible.
The pinned Agent Runtime revision is unchanged from 0.2.6. The window title
needs no configuration and has no opt-out key; a terminal that ignores OSC 0
is unaffected.
Full Changelog: v0.2.6...v0.2.7