control board: show the model each seat is running (#1503)

Jason asked for the running model (sonnet, opus, gpt-6-astra) on the
board. readSession keeps model and provider from the log's latest
model_change entry or assistant turn, whichever is later, so a /model
switch shows on the next scan; scanAgent exposes both; the page shows the
model under the agent name with the provider in the hover and a Model
detail row. Blank when the log names none.

Live check on a scratch board against the real data root: all 42 rows
carried a model. Board 91/91. Sonnet review caught a double-escaped hover
title; fixed.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
2026-09-12 11:13:32 -05:00
co-authored by Claude Fable 5.1
parent d0fb5b0f20
commit 0bed9ba3db
8 changed files with 99 additions and 4 deletions
+8
View File
@@ -113,6 +113,12 @@ tmux, else shown as the word "unknown", never guessed:
tmux could not be asked, the `cwd` from the session log. The record says
which one it used (`workspaceSource`: `tmux-pane` or `session-cwd`).
- **Model** (under the agent name, and a detail row with the provider) —
the model the seat is running, from the log's latest `model_change` entry
or assistant turn, whichever is later, so a `/model` switch mid-session
shows up on the next scan. Blank until the log names one; a seat with no
pi log (rocko) has none.
A seat started through `scripts/mosaic launch <seat>` (see
`packages/seat/README.md`, #1504) has a registration at
`<dataRoot>/seats/<layout>/<seat>/registration.json`. The scan reads every one of
@@ -166,6 +172,8 @@ values), the scan refuses rather than silently dropping every mark.
"registered": null,
"lastActivity": "2026-09-12T15:04:33.000Z",
"ageSeconds": 42,
"model": "gpt-6-astra",
"provider": "openai-codex",
"lastAssistantText": "Ready for the next step whenever you are.",
"lastError": null,
"skippedLines": 0,