feat(cec): tech Site door + help-card action rows; truthful Viewing chip signal#186
Merged
Merged
Conversation
The customer GUI's "Viewing your screen" chip keyed on session state, but a session outlives the console on purpose (chat rides it) - so the chip stayed lit after the technician closed the remote-control console. Nothing told the customer's GUI what the technician's routes were actually doing. - The consent sweep now derives, every pass, a per-technician map of what their LIVE routes carry - screen (display/video route) and control (input route) - and emits it as cec://viewing whenever it changes (and once at startup, so a GUI that hydrated first gets its baseline). Routes this pass is tearing down for lapsed consent don't count. - New cec_viewing command: the pull twin for GUI hydrate, so an app that starts mid-session paints the chip without waiting for a transition. - The sweep's is_technician early-out is gone: the role flips permanently on the first dial, so a DUAL-ROLE node (dialed someone once, yet also reachable as a customer) skipped consent enforcement entirely - and would have skipped this signal too. On a pure technician node the body still no-ops via knows_technician. cargo test --lib: 154 passed. fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YYdqmManehKSKxwzcfeeU4
The manufacturer web Site button never showed for a help technician:
kvmTwin gated on kvmAllowed (ours / co-fleet / shared), and a tech is
none of those for a customer's appliance - so the feature's whole
point (the tech opening the KVM's own web UI) never fired. And the
sidebar squeezed its doors in as icons beside the name, with nowhere
to grow and no status while a connect was pending.
- kvmTwin authorizes EITHER side of the tech/owner divide now: ours /
co-fleet as before, or a dialed CEC customer (mirroring
capabilitiesFor's isCec arm). Queue rows pass { raisedHand: true },
which skips the ACL entirely - the hand-raise IS the ask, a beacon
the customer deliberately lit, and the KVM itself still authorizes
the actual tunnel by its mesh roster. The gate here only decides
whether the button shows.
- Help-sidebar cards restructured: identity on top, one action row
along the bottom (Answer / Open / Reconnect, then the row's doors),
with room for more buttons as they earn a spot. Site is a labeled
button now, not a bare globe.
- A KVM's row offers its Site and no Chat, in both the sidebar and the
settings console panel - a KVM appliance isn't someone to chat with.
- Inline connect status: while a dial to a row is in flight
("Connecting…") or the customer's approve prompt is up ("Waiting for
them to approve…"), that row's action row becomes a pulsing status
line + Stop. The sidebar has no status strip like the settings
panel, so the card itself says what's happening. New cecDialingNode
tracks WHICH row a by-node dial targets (those never set
cecDialingNumber), and cecWaitPhase() classifies the two phases.
svelte-check 152 files 0 errors; pnpm build clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YYdqmManehKSKxwzcfeeU4
This was referenced Jul 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Two commits, three user-facing fixes on the CEC technician/customer surfaces.
The manufacturer Site button finally shows for a help tech
kvmTwingated onkvmAllowed(ours / co‑fleet / shared) — and a help technician is none of those for a customer's appliance, so the Site button (the feature's whole point) never rendered in either the help sidebar or the settings console panel. Now:kvmTwinauthorizes either side of the tech/owner divide: ours/co‑fleet as before, or a dialed CEC customer (mirroringcapabilitiesFor'sisCecarm).{ raisedHand: true }, which skips the ACL entirely — the hand‑raise IS the ask, a beacon the customer deliberately lit. The KVM still authorizes the actual tunnel by its mesh roster; the gate only decides whether the button shows.Help-sidebar cards: identity on top, an action row along the bottom
🌐 Sitebutton, not a bare globe.cecDialingNodepins the status to the row a by‑node dial targeted (those never setcecDialingNumber);cecWaitPhase()classifies the two phases.cec://viewing— the customer learns what routes actually carryThe CEC Support app's "Viewing your screen" chip keyed on session state, but a session outlives the console by design (chat rides it) — so the chip stayed lit after the tech closed the console. The consent sweep now derives a per‑technician map of what their live routes carry (screen / control), emits
cec://viewingon every change, and answers a newcec_viewingcommand for GUI hydrate. The sweep'sis_technicianearly‑out is gone: the role flips permanently on first dial, so a dual‑role node (dialed once, yet also reachable as a customer) skipped consent enforcement entirely — and would have skipped this signal too. Pure technician nodes still no‑op viaknows_technician.Consumer side lands in mrjeeves/CECSupport#45 (chip keys on
viewing.screen/viewing.control).Verification
cargo test --lib(node): 154 passed;cargo fmt --check+cargo clippy --all-targetsclean.svelte-check: 152 files, 0 errors;pnpm buildclean.🌐 Siteon a raised‑hand KVM row; KVM rows show no Chat; Answer shows "Connecting…" then "Waiting for them to approve…" with a working Stop; customer's chip clears within ~2s of the tech closing the console, and never shows for chat‑only.🤖 Generated with Claude Code
https://claude.ai/code/session_01YYdqmManehKSKxwzcfeeU4
Generated by Claude Code