Export and display Remote Braille through the reader

A controlled reader renders accepted application frames in a new
virtual-only cthulhu-braille mode at the controller's width and applies
its pan and route gestures; reader UI, flashes and secure frames are
never exported, and hidden frames are unroutable. A controller reader
reports its display width, shows peer cells as an untranslated raw
frame and forwards local pan and routing keys. The physical helper now
reports its width and edge pans.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Chase CichorzandClaude Opus 5.5 committed 2026-11-06 16:06:38 -05:00
1 parent 2651b5e9bd
commit 551ef86d5f
16 files changed
+925 -13

No files matched your search

+39
View File
@@ -22,3 +22,42 @@ frame only. `Session.EnableRemoteBraille`, `PublishRemoteBraille`, the Go
`valid_remote_braille_request` validators implement the contract. Go/Python
SDK-process tests cover each direction, role denial, invalid values,
saturation and revocation.
## Reader owners
`start_remote_braille` attaches an owner for sessions installed with
`braille-stream`, from local launch and managed startup.
**Controlled computer.** A `size` request starts `cthulhu-braille --virtual`,
a helper mode that opens no display and reuses the physical helper's
viewport, liblouis translation, wrapping, panning and routing maps. The owner
installs an exporter on the Braille worker that receives only accepted
application frames. Reader UI, flashed messages and secure-input frames are
never exported. A frame stored while reader UI, a protected confirmation or a
peer's cells hide it is exported with ID 0 so it cannot be routed. Rendered
cells become `cells` events. Gestures pan the virtual viewport or route a cell;
a route reaches the application only if it names the frame currently shown
here, so a stale or hidden frame is ignored.
Ordinary frames have no BRLTTY to translate them, so the virtual helper uses an
explicit table, `en-us-comp8.ctb` (computer Braille); contracted frames keep the
user's configured table. The cursor is a static dots-7-8 overlay, not BRLTTY's
configured cursor shape or blink.
**Controller.** The physical helper now reports its width in its ready line
(`ready N`; a bare `ready` is still accepted), answering `geometry`. Peer
`cells` are shown as Unicode Braille runes in a raw frame, sent without
contraction or word wrap so the helper writes the exact dots. They take the
place of the application frame, which keeps updating underneath; reader UI and
flashed messages still take precedence and restore to the peer's cells. The
helper now also reports a pan key that cannot move the local viewport; on a
peer frame that, and a routing key, become `gesture` events. Revocation, lock
or handoff restores the application frame.
Tests: liblouis-backed virtual helper tests (computer Braille, cursor overlay,
pan and pan-back, routing, contracted table, invalid input); a smoke run of the
built helper; and app tests with a fake helper and a real Go SDK child for both
roles: application-only export, unroutable frames under reader UI, routing to
the application, gesture forwarding, peer cells overriding local frames,
stale-route rejection and restoration on revocation. No physical display was
used.