Skip to content

feat(cec): the access list owns live state; Forget also disconnects#44

Merged
mrjeeves merged 3 commits into
mainfrom
claude/cec-allmystuff-ui-updates-64yqt3
Jul 17, 2026
Merged

feat(cec): the access list owns live state; Forget also disconnects#44
mrjeeves merged 3 commits into
mainfrom
claude/cec-allmystuff-ui-updates-64yqt3

Conversation

@mrjeeves

Copy link
Copy Markdown
Owner

What changed

One place for connection truth. The separate "‹Tech› is connected — viewing your screen" banner (with its own Disconnect button) is gone. "Who can connect to your computer" now carries everything:

  • a status dot above the Forget button per technician: green glow = connected right now, amber pulse = connecting, hollow = not connected. A session that is merely requested (approval prompt still up) no longer reads as connected — the old banner got this wrong, which is why it "didn't have a clue".
  • a green "Viewing your screen" chip (or "Controlling your screen" for a control session) to the right of the remaining-time chip, pulsing slowly and subtly while the session is active (prefers-reduced-motion disables the animation).
  • a live session whose grant event hasn't landed yet still synthesizes a row, so the "someone is on your screen" signal can never render nowhere.

Forget = disconnect + revoke. store.forget() first ends any live session with that technician, then revokes the grant and drops the node. One button, one outcome. The store's separate disconnect() is deleted.

Chat looks like a button. The invisible speech-bubble icon next to the tech's name is now a proper bordered button labeled Chat (icon + text + unread badge).

? instead of footer text. The access list's explanatory paragraph moved into a ? next to the title — tooltip on hover, tap to pin open.

KVM & Claiming card follows the moment. Idle front door (no hand up, nobody connected, no grants): bottom of the left column. Hand raised / session live / grants outstanding: bottom of the right rail, returning left once everything clears and the access section hides itself.

Board row is raw. Shows the node's board field verbatim, no more product || board fallback (pairs with mrjeeves/allmystuff's collector change making board the unparsed system value).

Copy pass. Emdashes removed from every user-visible string (components, toasts, placeholders, CLI help). The contact card's long explanations are one short line each with the detail in tooltips.

Verification

  • svelte-check: 106 files, 0 errors, 0 warnings
  • pnpm build: clean
  • cargo check --workspace (light workspace): clean
  • Remaining emdash grep hits are HTML/CSS comments only (never rendered)

Notes for review

  • liveSessions now excludes requested state — that also means the approve-modal flow no longer shows a phantom "connected" row behind the modal.
  • Deleted gui/src/ui/ConnectedBanner.svelte; README updated to match the new flow.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YYdqmManehKSKxwzcfeeU4


Generated by Claude Code

claude added 3 commits July 17, 2026 06:10
- Fold the Connected banner into "Who can connect to your computer":
  each technician row carries a status dot above Forget (connected /
  connecting / not connected) and, while a session is active, a green
  "Viewing your screen" / "Controlling your screen" chip that pulses
  gently next to the grant countdown. A session still in "requested"
  no longer reads as connected (the old banner said "connected" while
  the approval prompt was still up), and a live session whose grant
  event hasn't landed yet still gets a row - the signal can't vanish.
- Forget is the one kill-switch: it ends any live session with that
  technician, then revokes and drops the node. The separate Disconnect
  button (and the banner) are gone.
- The chat door next to the name is a real button that says "Chat",
  keeping the unread badge.
- The access list's footer paragraph now lives behind a ? next to the
  title: tooltip on hover, tap to pin open.
- The KVM & Claiming card moves with the moment: bottom-left on the
  quiet front door; bottom-right while the hand is up, a session is
  live, or grants stand; back left once everything clears and those
  sections hide themselves.
- The Board row shows the node's raw board field only, no product
  fallback (paired with the AllMyStuff collector change).
- Copy pass: emdashes removed from every user-visible string (UI,
  toasts, CLI help), and the contact card's explanations shortened
  with the detail moved into tooltips.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YYdqmManehKSKxwzcfeeU4
A fleetless customer never saw a plugged-in claimable KVM unless they
first made a fleet or opened the AllMyStuff app — the KVM was in the
node's snapshot, but the card's reachability cross-check culled it.

Root cause: a claimable is genuinely `active` on the full-mesh
local-claim network (the daemon auto-dials discovered peers), but it
reads `sighted`/`handshaking` for the first second or two while that
link is dialing. Our `reachable` set was a single point-in-time
active/shelved check taken at bring-up, which races that dial-up and
drops the KVM — and nothing re-sampled it, so it stayed hidden. The
AllMyStuff app shows the same KVM because it keeps a 45s grace on
"recently live" and re-polls, riding over the dial-up and routine ICE
churn.

Mirror that here, keeping active/shelved as the base status (loosening
it to "any non-terminal status" would resurrect the old bug where an
offline claimable lingers forever from the sticky presence advert):

- Add a 45s reachability grace (`lastReachableAt` + `REACHABLE_GRACE_MS`)
  seeded from active/shelved sightings across every joined network;
  an explicit offline/error clears it at once, so a powered-off KVM
  still drops within one refresh.
- Sample reachability across the dial-up window at bring-up (fire the
  same short refresh burst a claim/attach uses) instead of once, so the
  just-joined local-claim link is caught the moment it goes active.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YYdqmManehKSKxwzcfeeU4
Bump the AllMyStuff pin to pick up the CEC-side changes that landed for
this update pass: the raw Board field in the inventory collector and the
hand-raise console/Site buttons in the AllMyStuff GUI.

- `.allmystuff-rev` v0.2.44 -> v0.2.45 (the rev build.rs fetches the
  `allmystuff-serve` node binary by).
- `gui/src-tauri/Cargo.toml`: the three AllMyStuff git deps
  (allmystuff-node, -cec-protocol, -cec-consent) tag v0.2.44 -> v0.2.45.

gui/src-tauri/Cargo.lock is intentionally left as-is: it can only be
regenerated once the v0.2.45 tag is published (the git deps don't
resolve until then), and the lock is already carried behind the toml in
this repo because CI never builds the Tauri backend (its AllMyStuff git
deps resolve only after the sibling branch ships). The lock refreshes on
the next `pnpm tauri build` / release once the tag exists.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YYdqmManehKSKxwzcfeeU4
@mrjeeves
mrjeeves merged commit ff8d8ed into main Jul 17, 2026
4 checks passed
@mrjeeves
mrjeeves deleted the claude/cec-allmystuff-ui-updates-64yqt3 branch July 17, 2026 08:32
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