feat(nodes): make computer.act eligibility capability-based for desktop nodes#112107
Conversation
|
ClawSweeper status: review started. I am starting a fresh review of this pull request: feat(nodes): make computer.act eligibility capability-based for desktop nodes This is item 1/1 in the current shard. Shard 0/1. This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking. Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted. |
|
Land-ready verification (maintainer-directed landing): Work done: capability-based Local proof (trusted source, focused):
Hosted proof: full CI green on head Known proof gap: the ClawSweeper review worker's lease ( |
|
Merged via squash.
|
* origin/main: (24 commits) fix(agents): keep compaction on live session model (#95713) fix(plugin-sdk): guard provider catalog live URL parsing against malformed responses (#109986) chore(cli): drop dead classifiers and single-use wrappers left by fallback removal (#112191) feat(ui): expand the lobster pet's random universe (#112073) chore(ci): audit dependency fingerprint exports (#112190) fix(ui): preserve graphemes in provider icons (#109509) fix(ui): align settings search with navigation rows (#112172) fix(agents): allow configless gateway rebind to activate standalone owner (#111841) fix(secrets): register secret targets for installed-origin plugins (#104347) improve(ui): show real machine identity in the place picker (#112162) fix: webChat scrollback history is too limited — older assistant replies and tool outputs disappear when scrolling… (#104250) test(ui): run DOM-free suites in Node (#112031) feat(nodes): make computer.act eligibility capability-based for desktop nodes (#112107) fix(apps): harden mobile gateway and watch state fix(ci): restore Z.AI API Platform validation (#112171) fix(ui): prevent Logs controls from overlapping (#112170) fix #95291: message tool fails to deliver files/images on Feishu (400 volc-dcdn / write ECONNRESET) while same Lark SDK upload succeeds standalone (#95514) refactor(cli)!: remove automatic gateway→embedded fallback from openclaw agent (#112074) refactor: move provider transports into packages/ai behind a typed host port (#111669) fix(anthropic): complete transcript reverse-scan windows across short reads (#109431) ...
What Problem This Solves
The
computeragent tool and thecomputer.actnode command are hard-gated to macOS by platform-name checks, even though the documented contract says any node may fulfillcomputer.actwithout changing the agent-facing contract. Neither surface has shipped in a stable release (first appearance is v2026.7.2-beta.1; v2026.7.1 does not contain it), so this is the last cheap moment to make eligibility capability-based before the contract freezes.Why This Change Was Made
Windows and Linux desktop-control fulfillers (planned on a supervised cua-driver executor behind the same node contract) need the gateway and tool core to select nodes by what they advertise, not by platform string:
isEligibleComputerNodenow requires a connected node advertising bothcomputer.actandscreen.snapshot— the screenshot requirement is functional (frame-authorized coordinates need capture), replacing the platform gate with the real invariant.PLATFORM_DEFAULTSforwindowsandlinuxmay now declarecomputer.actat pairing, mirroring macOS exactly: dangerous, approved once at pairing, excluded from the runtime allowlist until explicitly armed.Safety posture is unchanged: arming, frame binding (
frameId/displayFrameId), serialization, idempotency, and cancellation behavior are untouched. A Windows/Linux node that does not advertise the commands sees no behavior change; one that advertises without fulfilling fails at invoke exactly as before.User Impact
No stable-user impact (feature is beta-only). Beta users: node eligibility errors now name the required commands instead of "a macOS node". Windows/Linux nodes can declare
computer.actat pairing but nothing fulfills it yet, and it stays disarmed by default.Evidence
node scripts/run-vitest.mjs src/agents/tools/computer-tool.test.ts src/gateway/node-command-policy.test.ts src/agents/openclaw-tools.computer.test.ts(results in PR checks + below).git merge-base --is-ancestor f8dbd34a v2026.7.1fails; first containing tagv2026.7.2-beta.1.