Skip to content

Dictation in the terminal, from prism-term-core (#162) - #163

Merged
Maxaubert merged 5 commits into
mainfrom
feat/160-dictation
Sep 19, 2026
Merged

Maxaubert merged 5 commits into
mainfrom
feat/160-dictation

Conversation

@Maxaubert

@Maxaubert Maxaubert commented Sep 19, 2026 •

Copy link
Copy Markdown
Owner

Closes #162. Closes #164. Prism's half of PrismTerminal#13 (its PR: Maxaubert/PrismTerminal#22). Owner, 2026-09-19: "make sure this feature is synced and part of the core and should be the same in normal Prism, with dictation as its own tab there too."

What a user gets

Settings > Dictation (its own page under Behaviour). Switch it on, download a model, then hold Right Alt over a terminal, speak, let go: the words are pasted at the shell's cursor, never sent. A pill over the terminal shows a live level meter and the text as you speak; the tab wears a mic mark. Transcribed on this PC by whisper.cpp; audio never leaves the machine. Off by default.

It is the SAME feature as Prism Terminal's, because it is the same code: prism-term-core. The models and the NVIDIA engine live in %LOCALAPPDATA%\PrismDictation, shared by both apps, so a model downloaded in one is installed in the other. Settings VALUES stay per app.

What is Prism's own

  • A media viewer first: App arms the core only with a terminal that is SHOWING. With no terminal up, Right Alt does nothing (asserted: no pill, no process).
  • The engine ships in the installer: npm run fetch:whisper runs the core's own script into vendor/whisper, packaged as resources/bin/whisper (11 MB, with Microsoft's C++ runtime app-local and the MIT notice).
  • The microphone permission: main grants media for audio only, to Prism's own windows; the camera is refused. Everything else keeps Electron's default, deliberately.
  • The pill sits in TermDock, the mic mark in TabStrip; both read the dictation store themselves, so speaking re-renders neither App nor the strip.

Pin

prism-term-core#core-v0.2.0-rc.6. It becomes core-v0.2.0 once PrismTerminal#22 merges; merge that one first, then I repoint this and re-run the gate.

The terminal gate now runs in CI (#164, rides in this PR)

Owner, 2026-09-19: "we need automated tests to confirm it never conflicts. that's important." npm run e2e:terminal, the required gate for any core pin bump, ran only on the owner's machine. New workflow terminal-gate.yml runs it on a GitHub Windows runner, on any PR that moves the pin or touches the terminal's wiring. Measured: green 4 runs of 4, 173 checks, 4 to 6 minutes, the real dictation scenario included. It is what lets PrismTerminal's core-release workflow open a bump PR that proves itself (PrismTerminal#24).

Running it on a runner for the first time found three real things:

  • the speech-engine fetch failed when started from PowerShell 7, which is how every runner starts it, so it would have broken this repo's RELEASE build (fixed in the core, rc.6);
  • the terminal scenario waited sixty seconds for a real claude CLI a runner does not have (now skipped, loudly, where absent);
  • the tabs scenario asserted /Users/ and called it "the user folder", which only ever passed because the owner's repo lives under the Users folder (it now asserts the folder the profile is actually seeded with).

Verification

  • typecheck 0 errors, lint 0 errors, 1476 unit tests.
  • npm run e2e:terminal (the required gate for a pin bump): 11 scenarios green, now including dictation and dictationPage.
  • dictation is REAL end to end in Prism: Chromium's fake microphone plays a known clip, the real bundled engine hears it with the Tiny model, and "ask not what your country can do for you" must land on the prompt line with no new prompt after it.
  • Full npm run e2e: 775 checks pass; rowPaste (real clipboard, flaky on main too) timed out once in the full run and passed alone.
  • Version 0.54.0. NOT yet installed over the owner's Prism: waiting for the go, since Prism may be in use.

🤖 Generated with Claude Code

…, transcribed on this PC (#162)

Hold Right Alt over a showing terminal, speak, release: the words are pasted at
the cursor and never sent. The feature is the core's, the same one Prism
Terminal has; this is Prism's wiring: the pin, the bundled engine, the
microphone permission (audio only), a Dictation page of its own in Settings,
and the e2e. With no terminal showing the key does nothing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Maxaubert

Copy link
Copy Markdown
Owner Author

Installed 0.54.0 on the owner's machine (Prism was not running): exe timestamp 18:14:32 -> 20:37:48, engine folder present (18 files).

Maxaubert and others added 4 commits September 19, 2026 20:51
)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Found by running it on a GitHub runner: the real-Claude-CLI checks are skipped,
loudly, where no claude is installed; and the new-tab check asserts the folder
the profile is seeded with, not /Users/, which only ever passed because the
owner's repo lives under C:\Users.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ve itself (#164)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Maxaubert

Copy link
Copy Markdown
Owner Author

Merging at the owner's word (2026-09-19), pinned to core-v0.2.0-rc.6 rather than waiting for PrismTerminal#22: the rc is the same core code and a permanent tag. The move to the final core-v0.2.0 follows #22's merge (by the bump workflow once PRISM_BUMP_TOKEN exists, by hand otherwise).

@Maxaubert
Maxaubert merged commit fa82f8d into main Sep 19, 2026
3 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.

Run the terminal gate in CI, so a core bump can prove itself Dictation in the terminal, from prism-term-core

1 participant