Research across OpenHands, cua's computer-server, E2B/envd, AutoGen/CrewAI/LangGraph, and VNC/Guacamole/TeamViewer arbitration models. The striking finding: nobody arbitrates at the daemon — cua's computer-server and E2B's envd are both lockless multi-client free-for-alls; every system that works does exclusivity by scheduling (one selected actor at a time) plus a control-plane lease.
We already have both halves:
- Room turns run one member at a time on the group's threadId
LocalVmLease.claim() already re-claims across bots sharing one threadId — sequential room members would hand the lease along naturally
computer-control.ts holds the human-takeover lease (pause-all is the right interplay, per TeamViewer/Teams' owner-grants-token model)
Remaining design: container named per-room instead of per-bot (follow the existing refuse-and-instruct migration precedent, no auto-migration), surface "who has the computer" in the room header, and the dead-holder path already exists (!isBotBusy(owner) recovery + TTL).
Pairs with #209's shared working folder. Scope: container-computer.ts naming, room turn dispatch mounting the computer, ComputerPanel room view.
🤖 Generated with Claude Code
Research across OpenHands, cua's computer-server, E2B/envd, AutoGen/CrewAI/LangGraph, and VNC/Guacamole/TeamViewer arbitration models. The striking finding: nobody arbitrates at the daemon — cua's computer-server and E2B's envd are both lockless multi-client free-for-alls; every system that works does exclusivity by scheduling (one selected actor at a time) plus a control-plane lease.
We already have both halves:
LocalVmLease.claim()already re-claims across bots sharing one threadId — sequential room members would hand the lease along naturallycomputer-control.tsholds the human-takeover lease (pause-all is the right interplay, per TeamViewer/Teams' owner-grants-token model)Remaining design: container named per-room instead of per-bot (follow the existing refuse-and-instruct migration precedent, no auto-migration), surface "who has the computer" in the room header, and the dead-holder path already exists (
!isBotBusy(owner)recovery + TTL).Pairs with #209's shared working folder. Scope: container-computer.ts naming, room turn dispatch mounting the computer, ComputerPanel room view.
🤖 Generated with Claude Code