Skip to content

YALTI Prompter 1.1.1: voice works again after idle, model loading indicator, light-theme contrast - #4

Merged
silent-diffusion merged 4 commits into
mainfrom
claude/trusting-heisenberg-3nbssm
Oct 4, 2026
Merged

silent-diffusion merged 4 commits into
mainfrom
claude/trusting-heisenberg-3nbssm

Conversation

@silent-diffusion

Copy link
Copy Markdown
Owner

What does this change?

Release 1.1.1: version bumped and changelog dated. Each change is its own commit.

  • Fix: voice tracking heard nothing after a few idle minutes.
    • The speech engine unloads itself three minutes after listening stops. VoiceInput kept its port to the old engine, still thought it was ready, and never asked for a new one.
    • Pressing play after any longer pause therefore showed "Listening" while all audio went to a dead port.
    • Now every start drops the old port and connects afresh, which restarts the engine when needed.
  • Speech model loading indicator beside the microphone indicator: a ring and percentage while the model loads.
    • Reading the model files is measured, using the new warmModel() in the worker.
    • The recognizer's own blocking load is estimated from how long it took last time (kept in state.json), and the indicator only reaches 100% when the engine is ready.
  • High-contrast controls on light island colors such as the Paper theme.
    • core/contrast.js picks light or dark ink by WCAG contrast, and the prompter sets body.light-surface.
    • On-surface elements use --ui-rgb instead of hard-coded white, and the status colors get darker shades that reach at least 4.5:1 on Paper and white.
    • Dark themes are unchanged.
  • CLAUDE.md: release every finished change, using the workflow-based steps (agent sessions can't push tags).

How was it tested?

  • npm test: 44 pass, including the new contrast and warmModel tests. document.test.js and tracker.test.js need marked, which the development container couldn't install, so CI runs them.
  • npm run test:speech: runs in CI.
  • Renderer checked in Chromium with a stubbed preload bridge:
    • The idle bug was reproduced first: the second start never reconnected and speech didn't register. After the fix, it reconnects and speech registers.
    • The loading indicator was driven through start, file read, initialization and ready.
    • Paper and Classic themes were screenshotted before and after, and switching themes live flips the controls both ways.
  • npm run check-licenses: no dependency changes.

Checklist

  • No network requests, telemetry or cloud services added
  • New dependencies/assets are open source and listed in THIRD_PARTY_NOTICES.md: none
  • Docs updated where relevant (user guide, architecture, changelog)

🤖 Generated with Claude Code

https://claude.ai/code/session_0126UMfoxDDotUBepqCxe8xs


Generated by Claude Code

claude added 4 commits October 4, 2026 23:06
The speech engine unloads itself three minutes after voice tracking
stops, to free memory. VoiceInput kept its MessagePort to the old engine
and still thought the engine was ready, and _connectEngine() returned
early when a port existed. So pressing play after a pause of more than
three minutes showed "Listening" while every chunk of audio went into a
dead port: nothing was ever recognized, and the engine was never
started again.

Every start now drops the old port and asks for a new one, which also
starts the engine again when it was unloaded; reconnect() closes the
old port too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126UMfoxDDotUBepqCxe8xs
Starting voice tracking after the model was unloaded (or for the first
time) takes a few seconds, with only a short "Loading speech model…"
hint to show for it.

The worker now reads the model files once before creating the
recognizer (warmModel() in engine.cjs) and reports real progress while
doing so. On a cold start that read is most of the waiting, and it
leaves the files cached for the recognizer's own blocking load.
SpeechHost relays the progress in its status. For the last step, which
can't be measured, it passes how long initializing took the previous
time (remembered in state.json), so the indicator keeps moving and only
reaches 100% when the engine is ready.

The prompter shows a pill with a progress ring and percentage next to
the microphone indicator (or in its place when that is turned off) and
fades it out once the engine is ready. The loading hint is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126UMfoxDDotUBepqCxe8xs
Everything drawn on the island surface was hard-coded white: on a light
background such as the Paper theme the controls, progress text, play
button, compact title, status dot, help overlay, resize grips, empty
state, toast and drop overlay were close to invisible.

core/contrast.js picks the ink (light or dark) with the better WCAG
contrast against the island color, and the prompter sets
body.light-surface accordingly; prompter.css now draws those elements
with --ui-rgb / --ui-inverse-rgb and uses darker status colors
(--ok, --warn, --bad) on light islands, all at least 4.5:1 against
Paper and white. The floating dark chips (hint, jump back, loading)
keep their own background. Dark islands look exactly as before.

Also documents the loading indicator and adds the unreleased changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126UMfoxDDotUBepqCxe8xs
Also adds CLAUDE.md: the maintainer wants every finished change released,
and agent sessions can't push tags, so it lists the workflow-based
release steps (and the limits of a cloud container).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126UMfoxDDotUBepqCxe8xs
@silent-diffusion
silent-diffusion merged commit d313add into main Oct 4, 2026
1 check 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.

2 participants