Repository navigation
feat: hide Computer Use and Browser Use with a patched managed runtime (ADR 19) - #49
Merged
Merged
Conversation
ZCode's official computer-use plugin is visible to provider sessions, because the provider shares ~/.zcode with ZCode Desktop, but it cannot work there: - The public source ships @zcode/zcode-cua as a placeholder, so the managed runtime never starts a Computer Use Helper. - Desktop's node_repl SDK launches the installed Helper, which refuses the launcher because it is not a code-signed ZCode process. The first real call times out after 60 seconds. Record the evidence and the investigated ways to disable it. Two official switches stop execution: ZCODE_CUA_PRODUCT_HELPER=0 on the Server and a per-turn toolDisallowlist. Neither can hide the skills.
Computer Use and Browser Use cannot run in the provider's standalone ZCode Server. The CUA Helper accepts only the signed Desktop app, and only the Desktop host supplies browsers. The skills that Desktop installed into the shared ~/.zcode were still offered to the model, and no official switch can hide them per process. ADR 19 (amends ADR 15) therefore allows minimal build-time patches to the managed runtime. - patches/zcode/0001-hide-suppressed-official-plugins.patch makes plugin discovery skip official plugin IDs listed in PASEO_ZCODE_SUPPRESSED_PLUGINS, reusing the existing suppressedBuiltins check. Nothing is written back to configuration, so Desktop is unaffected. - scripts/apply-zcode-patches.mjs checks every patch before applying any, refuses a dirty checkout and, at packaging time, verifies that only the patches modify the source. CI checks that they apply to the pinned source. - The release workflow applies the patches before the official build. The archive ships the patches and records them with their SHA-256 in BUILD-INFO.json (modified: true). Releases are named zcode-runtime-v<version>-paseo.<n>. pins.ts still pins the unmodified 3.14.3 release until the patched one is published. - The bridge always starts the Server with ZCODE_CUA_PRODUCT_HELPER=0 and the suppressed plugin list. Every input hides mcp__node_repl__js through toolDisallowlist. Both stay for unpatched PASEO_ZCODE_RUNTIME runtimes. - test:stdio-runtime places Computer Use, Browser Use and a control plugin in the isolated plugin cache. On a runtime that lists the patch in BUILD-INFO.json, it requires the first two to be hidden from discovery and the model; on an unpatched runtime, it requires them to stay visible. The shared tool must be hidden on both. Update AGENTS.md, the development guide, README, NOTICE, the remaining work list and the verification record for the new policy.
This was referenced Oct 9, 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.
Problem
ZCode Desktop installs official plugins into
~/.zcode/cli/plugins. The provider shares that storage, so provider sessions offer thecomputer-use,control-browserandweb-gui-testerskills and themcp__node_repl__jstool to the model. Neither capability can work in the provider's standalone Server:node_replSDK launches the installedZCode Computer Use.app. The Helper refuses with--launcher-pid did not verify as a code-signed ZCode process, and the call times out after 60 s. The public source also ships@zcode/zcode-cuaonly as a placeholder.browserControlExecutor, so the Server always answersbrowsers: [].Two official switches stop execution:
ZCODE_CUA_PRODUCT_HELPER=0and a per-turntoolDisallowlist. Nothing official can hide the skills per process:app-servertakes no config arguments, and env config covers only storage, network, logging and concurrency.ZCODE_CUA_PRODUCT_HELPERsuppression set inresolveOfficialPluginRootsis built but never used.ZCODE_STORAGE_DIRdrops every Desktop-bundled plugin. They cannot be reinstalled because they are not public or in the CDN marketplace.Decision
ADR 19 amends ADR 15. It allows minimal build-time patches to the managed runtime under these conditions:
git applywithout fuzz.Changes
patches/zcode/0001-hide-suppressed-official-plugins.patch(+8/−1 inNodePluginAdapter.discoverPluginsSync) skips the official plugin IDs listed inPASEO_ZCODE_SUPPRESSED_PLUGINS. It reuses the existingsuppressedBuiltinscheck and writes no configuration, so Desktop is unaffected. With both plugins skipped, ZCode does not registernode_repleither.scripts/apply-zcode-patches.mjschecks all patches before applying any and refuses a dirty checkout. At packaging time it verifies that only the patches modify the source.npm run check:zcode-patchesruns it read-only, and CI runs that on the pinned source.patches/and records them with their SHA-256 inBUILD-INFO.json(modified: true).zcode-runtime-v<version>-paseo.<n>. The existingzcode-runtime-v3.14.3release stays unmodified.server/unsupported-capabilities.tsholds both settings below. Both also cover unpatchedPASEO_ZCODE_RUNTIMEruntimes.ZCODE_CUA_PRODUCT_HELPER=0and the suppressed plugin list. Callers cannot override them.toolDisallowlist: ["mcp__node_repl__js"].pins.tsnow builds the URL from a release name. It still pins the unmodified 3.14.3 archive until the patched one is published.docs/todo.mdanddocs/verification.mdare updated.Verification (macOS arm64)
typecheck,test(22 files, 201 tests),build,format:checkandadrs doctorpass. The doctor reports only the existing warning on ADR 1.npm run check:zcode-patchespasses against29628c9.test:stdio-runtimeon the unmodified managed 3.14.3: all existing checks pass. Also,mcp__node_repl__jsis absent from the model request, and the Computer Use and Browser Use fixtures stay visible.test:stdio-runtimeon a local stand-in for the patched runtime: this is a copy of 3.14.3 with the same line replaced inagent/zcode.cjsand the patch recorded inBUILD-INFO.json. All checks pass, both fixtures are hidden from discovery and from the model's skill list, and the control fixture stays visible.computer-use,control-browserandweb-gui-testerdisappear from the skill catalog. Docs/PDF/slides/sheets, zcode-guide, skill-creator, plugin-creator, video2code and user skills remain.computer-useis listed only assource: "missing", because Desktop'senabledPluginsnames it.Not verified yet
node_replnot being registered.url2videoandvideo2fullstackassume Browser Use and remain listed.After merge
zcode-runtime-v3.14.3-paseo.1to publish the patched runtime.server/runtime/pins.ts. The same change updates the README runtime line and the Runtime tab hint, which still describe the unmodified 3.14.3.