Skip to content

Combined merge: desktop model spotlight, engine lock wait, and fixes from the live scenarios - #1107

Merged
sosidudku1 merged 24 commits into
rel/xp-buildfrom
int/r071-xp
Nov 9, 2026
Merged

sosidudku1 merged 24 commits into
rel/xp-buildfrom
int/r071-xp

Conversation

@sosidudku1

Copy link
Copy Markdown
Collaborator

Combined merge of #1101 (one-click card for a newly launched local model) and #1105 (wait out a held engine lock in the launch and setup installs), each kept as its own merge commit, with main brought in, plus the fixes from running the live scenarios from #1104.

Product fixes from those runs:

  • The app no longer starts Atomic Chat Core at launch just to read the Studio output folder. Core could be left running after quit.
  • A press in Settings no longer loses its click when the window repaints.
  • A script that only prints a sign-in link is no longer refused by the browser guard.

Scenario fixes: folded turns and closed Details are opened before reading them, the terminal scenarios run on a real pseudo-terminal, atag calls no longer block the scripted model, the session title counts as a side call, and the save sheet is reached on macOS 26.

Checked on the Mac test machines at this head: build, lint, desktop build, lint and unit tests, all 15 live scenarios, and desktop smoke (930 passed, 0 failed). The full test suite, imports and typecheck:tests last ran just before the live-scenario fixes.

Not exercised: the overnight soak and the release exam on a real model.

sosidudku1 and others added 24 commits November 9, 2026 14:26
Add an optional `spotlight` flag on catalog entries for a model launch.
When a flagged model fits the machine and is not on disk yet, the TUI
shows one startup hint, at most once per model id.

Add `models pull <id> --run`, which downloads the model, makes it active
and starts it, including the vision projector the TUI fetches by default.

No catalog entry sets the flag, so nothing changes for users until a
launch adds one.
Add an optional `spotlight` flag on the vendored catalog rows. A flagged
model that fits the machine gets a card with one button that downloads
the weights and the vision projector, then switches to the model. A
running turn is not interrupted, and a failed projector does not switch.

No row sets the flag, so the card stays hidden until a launch adds one.
…talls

models update never waits for the engine operation lock. At launch the
Studio shell's first call can hold it while starting or installing Core,
so the launch install failed within seconds and left a red Download
failed card until Retry, with the model not started.

The launch's and the setup's install now retry while the refusal is the
lock, for up to five minutes. Settings still answers at once.
A finished turn folds into one summary line and its cards are only drawn
once that line is opened, so the scenario waited for a card that was never
in the page. Open it with a real click; the masking checks are unchanged
and now also scan the expanded cards.
The fan-out card carries "2 tasks to 2 workers" as its reason, which is
drawn under Details. innerText skips a closed <details>, so the check could
never see it. Open Details with a real click and keep the same assertion.
A cloud side call answers through one synthetic emit_* function, so the
scripted model took the title request for an agent step: L10 counted a fifth
call after the budget stop, and in L09 it would drain the step queue. L10 now
asserts that the naming call is the only other model call, so a side call
cannot hide after the stop.
The browser guard matched "open https://" anywhere in a script's text, so a
script that only prints "To sign in, open https://... and enter the code"
was refused at every approval level. That is the device sign-in the agent is
meant to run and hand over. A quoted echo/printf with nothing taking its
output is now left out of the line-level rules; a piped or redirected one,
and a real open, are still refused.
… scenarios

Node's stdio pipe is a socket, and macOS script(1) exits at once when its
stdin answers tcgetattr with anything but ENOTTY. L07 and L15 therefore never
started the terminal app. Carry the keyboard through a shell pipe instead, and
build L07's wait message when it fails, so it shows what was on screen.
The scenario ran atag doctor with spawnSync. The scripted model lives in the
same Node process, so it could not answer doctor's health probe and the
engine check correctly reported that nothing answered.
Settings rebuilds its whole window on every repaint, so a press that a repaint
landed in was released on a different node and never became a click. Hold the
rebuild until the press ends.
… helper

L13 looked for the file name box and main buttons as direct children of the
sheet, which macOS 26 no longer guarantees. Type the name into the box that
holds the focus and fall back to Return; the file written and the confirmation
are still what is checked. L14's lastMatch passed non-global patterns to
matchAll, which throws.
…olders

The window asks for the output folders at every launch. Answering went
through ready(), which installs Core when missing and starts it as a
detached daemon, so every launch started Core even if Studio was never
opened. The live L07 run caught it: its run is long enough for Core to come
up, and the daemon was still alive after the app closed.

Now only a Core this app already configured is asked; otherwise the answer
is the chosen or default folder, the same value configure() gives Core.

The live harness also prints a leftover's whole command line, since the
120-character cut hid which binary it was.
@sosidudku1
sosidudku1 merged commit d25ff0b into rel/xp-build Nov 9, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant