sofle/rev1:copilot — what the OLED shows

A line-for-line port of the firmware's oled_task_user(). Both halves drive 5-character × 16-line vertical displays; the master syncs agent status to the right half over the split link. One keyboard serves GitHub Copilot and Claude Code — pick a scenario; the toggles behave like the real keys on the Copilot layer.

Left half (master) — 128×32 rotated 270°
Right half — the mascot watches you type (try it!), agent slots below

Scenario

Which agent is running

Permission request — answer it from the keyboard

Focused app (the bridge watches your windows)

Copilot-layer toggle keys

Reading the display

PILOT
active layer — inverted while the Copilot layer is on
ASK?
an agent is blocked waiting on you, with the tool it wants beneath. Enter the Copilot layer and the banner flips to ^ OK — the arrow thumb caps are armed: allows, denies. Ignore it and it falls through to the agent's own prompt.
VOICE
mic is hot — shows inverted while push-to-talk (left knob) is held
VSC
the focused app, watched by the bridge: VSC/JB for editors (also sets the chord flavor), TEAMS, OTLK, EDGE. Context changes the controls: in Teams the knobs become call controls — left press mutes your mic (⌘⇧M), right press toggles your camera (⌘⇧O); in Edge the right knob cycles tabs; in Outlook it walks the message list. Leaving the editor stands the Copilot layer down — unless an agent is waiting on you, when it holds so you can answer. OS (MAC/WIN) below is USB-detected.
CAPS
appears while caps lock is on; shows WORD during Caps Word (double-tap shift to capitalize one word)
14:37
local time from the bridge — --:-- means the bridge is off (the right screen's AGENT header goes ----- too)
2·bash
live session count with the latest activity beneath it
RUN
how long the current agent run has been going — appears only while a slot is spinning
CLAUDE
the active agent's name on the right screen, under its mascot. Six and seven letters don't fit a five-glyph line, so both are drawn as 3×5 bitmaps.
26%
Claude's five-hour session limit over the countdown to its reset — read from Claude Code's statusline, the only place a local client can get it. Blank for Copilot, which has no equivalent.
AGENT
three slots on the right screen, one icon per agent, synced over the TRRS link

Agent icons

session idle working (spins) turn done error waiting on you
The bridge listens for hook events on localhost from both agents — Copilot CLI, VS Code Copilot Chat and Claude Code. Their event names differ only in casing, so one listener serves all three: prompt submitted / tool running → spinner, permission request → !, turn finished → ✓, error → ✗, open idle session → ring. Each session claims a slot, and the mascot follows whichever agent went last. If the bridge goes quiet for 90 s the firmware falls back to -----.
The permission hook is synchronous, so the bridge holds it open while the keyboard decides and answers with the agent's own verdict shape. Nothing is invented if you walk away: after --ask-timeout the hook returns empty and the agent prompts you itself, exactly as it would with no keyboard attached.

Layers — click one to preview it on the OLED

dashed = transparent (falls through to Base) · faint = unassigned · red = Copilot / layer keys · circles = knob presses