Skip to content

feat(nodes): make computer.act eligibility capability-based for desktop nodes#112107

Merged
steipete merged 1 commit into
mainfrom
claude/computer-use-windows-linux-f2cacf
Jul 21, 2026
Merged

feat(nodes): make computer.act eligibility capability-based for desktop nodes#112107
steipete merged 1 commit into
mainfrom
claude/computer-use-windows-linux-f2cacf

Conversation

@steipete

Copy link
Copy Markdown
Contributor

What Problem This Solves

The computer agent tool and the computer.act node command are hard-gated to macOS by platform-name checks, even though the documented contract says any node may fulfill computer.act without 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:

  • isEligibleComputerNode now requires a connected node advertising both computer.act and screen.snapshot — the screenshot requirement is functional (frame-authorized coordinates need capture), replacing the platform gate with the real invariant.
  • PLATFORM_DEFAULTS for windows and linux may now declare computer.act at pairing, mirroring macOS exactly: dangerous, approved once at pairing, excluded from the runtime allowlist until explicitly armed.
  • Error messages/comments are platform-neutral; docs state the capability contract honestly (macOS app remains the only shipped fulfiller today).

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.act at pairing but nothing fulfills it yet, and it stays disarmed by default.

Evidence

  • Focused tests: 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).
  • Ancestry proof of unshipped status: git merge-base --is-ancestor f8dbd34a v2026.7.1 fails; first containing tag v2026.7.2-beta.1.
  • The test previously pinning macOS-only pairing declarability ("keeps computer.act declarable through the macOS pairing allowlist only") is deliberately rewritten: it protected the behavior this PR removes; mobile platforms still cannot declare it.

@steipete
steipete marked this pull request as ready for review July 21, 2026 05:50
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation gateway Gateway runtime agents Agent runtime and tooling plugin: file-transfer size: S maintainer Maintainer-authored PR labels Jul 21, 2026
@clawsweeper

clawsweeper Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

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.

@steipete

Copy link
Copy Markdown
Contributor Author

Land-ready verification (maintainer-directed landing):

Work done: capability-based computer.act eligibility (requires computer.act + screen.snapshot advertised, platform-string gate removed); windows/linux platform defaults may declare computer.act at pairing (unchanged dangerous/disarmed-until-armed semantics; linux also gains screen.snapshot declarability, required for the pair); platform-neutral errors; docs updated honestly (macOS app remains the only shipped fulfiller).

Local proof (trusted source, focused):

  • node scripts/run-vitest.mjs src/agents/tools/computer-tool.test.ts — 68 passed
  • node scripts/run-vitest.mjs src/gateway/node-command-policy.test.ts — 29 passed
  • node scripts/run-vitest.mjs src/agents/openclaw-tools.computer.test.ts — 3 passed
  • post-rebase rerun of both primary shards — green; git diff --check clean
  • structured autoreview (Codex, gpt-5.6-sol): clean, no accepted/actionable findings

Hosted proof: full CI green on head dfa8018d0d7e09a13b7387fcd39d89f410e0b5a2 including openclaw/ci-gate; scripts/pr prepare-run (OPENCLAW_TESTBOX=1) completed with prep head == PR head.

Known proof gap: the ClawSweeper review worker's lease (run 29805195969) expired at 06:34Z without replacing its placeholder, so no review/rank-up moves were posted for this head. Not merging past any posted moves — none exist; if a late review lands with moves, they will be handled as follow-ups.

@steipete
steipete merged commit 40f28f8 into main Jul 21, 2026
211 of 216 checks passed
@steipete
steipete deleted the claude/computer-use-windows-linux-f2cacf branch July 21, 2026 07:04
@steipete

Copy link
Copy Markdown
Contributor Author

Merged via squash.

vincentkoc added a commit that referenced this pull request Jul 21, 2026
* 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)
  ...
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling docs Improvements or additions to documentation gateway Gateway runtime maintainer Maintainer-authored PR plugin: file-transfer size: S

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant