machine-bridge-mcp 2.0.0 → 3.0.0-beta.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1142 -0
- package/CONTRIBUTING.md +23 -25
- package/GOVERNANCE.md +2 -2
- package/README.md +58 -20
- package/SECURITY.md +161 -120
- package/SUPPORT.md +1 -1
- package/browser-extension/broker-auth.js +83 -0
- package/browser-extension/broker-liveness.js +35 -0
- package/browser-extension/browser-error-boundary.js +96 -0
- package/browser-extension/browser-operations.js +1456 -101
- package/browser-extension/devtools-input.js +195 -34
- package/browser-extension/devtools-observation.js +429 -0
- package/browser-extension/devtools-session.js +48 -0
- package/browser-extension/manifest.json +4 -3
- package/browser-extension/page-automation.js +578 -118
- package/browser-extension/pairing-bootstrap.js +42 -0
- package/browser-extension/pairing.js +28 -12
- package/browser-extension/service-worker.js +126 -106
- package/docs/AGENT_CONTEXT.md +13 -10
- package/docs/ARCHITECTURE.md +159 -67
- package/docs/AUDIT.md +1302 -4
- package/docs/CLIENTS.md +19 -6
- package/docs/COMPUTER_USE.md +297 -0
- package/docs/ENGINEERING.md +72 -13
- package/docs/GETTING_STARTED.md +18 -20
- package/docs/LOCAL_AUTHORIZATION.md +115 -72
- package/docs/LOCAL_AUTOMATION.md +27 -21
- package/docs/LOGGING.md +40 -19
- package/docs/MANAGED_JOBS.md +37 -34
- package/docs/MULTI_ACCOUNT.md +98 -37
- package/docs/OPERATIONS.md +145 -51
- package/docs/OVERVIEW.md +14 -11
- package/docs/POLICY_REFERENCE.md +71 -3
- package/docs/PRIVACY.md +41 -2
- package/docs/PROJECT_STANDARDS.md +29 -6
- package/docs/RELEASING.md +238 -64
- package/docs/TESTING.md +150 -39
- package/docs/THREAT_MODEL.md +164 -67
- package/docs/TOOL_REFERENCE.md +653 -60
- package/docs/UPGRADING.md +78 -18
- package/native/macos/MachineBridgeBackgroundInput.swift +1051 -0
- package/native/macos/MachineBridgeBackgroundInputSmokeFixture.swift +295 -0
- package/native/macos/MachineBridgeTrustBroker.swift +233 -0
- package/package.json +94 -16
- package/scripts/accepted-candidate-tarball.mjs +77 -0
- package/scripts/candidate-runtime-store.mjs +93 -0
- package/scripts/check-plan.mjs +73 -3
- package/scripts/check-runner.mjs +129 -17
- package/scripts/commit-message-check.mjs +5 -2
- package/scripts/consumer-package-security.mjs +293 -0
- package/scripts/coverage-check.mjs +251 -15
- package/scripts/coverage-generation.mjs +41 -0
- package/scripts/coverage-range-merge.mjs +41 -0
- package/scripts/foreground-daemon-recovery.mjs +88 -0
- package/scripts/generate-policy-reference.mjs +28 -5
- package/scripts/generate-tool-reference.mjs +1 -1
- package/scripts/generate-worker-types.mjs +21 -11
- package/scripts/github-backlog.mjs +11 -10
- package/scripts/github-push.mjs +62 -16
- package/scripts/github-release-asset.mjs +58 -0
- package/scripts/github-release.mjs +241 -132
- package/scripts/global-package-installation.mjs +68 -0
- package/scripts/hardened-npm-session.mjs +42 -0
- package/scripts/install-published-prerelease.mjs +198 -0
- package/scripts/local-release-acceptance.mjs +103 -45
- package/scripts/macos-background-input-smoke.mjs +515 -0
- package/scripts/network-retry.mjs +8 -1
- package/scripts/npm-global-prefix.mjs +27 -0
- package/scripts/npm-publication-policy.mjs +17 -0
- package/scripts/official-mcp-conformance.mjs +267 -0
- package/scripts/persistent-activation-process.mjs +101 -0
- package/scripts/prepare-pinned-npm.mjs +12 -69
- package/scripts/prerelease-activation.mjs +160 -0
- package/scripts/privacy-check.mjs +14 -6
- package/scripts/promotion-digest.mjs +128 -0
- package/scripts/publish-npm.mjs +260 -0
- package/scripts/published-release.mjs +132 -0
- package/scripts/release-acceptance.mjs +62 -54
- package/scripts/release-browser-extension-store.mjs +172 -0
- package/scripts/release-candidate-manifest.mjs +52 -0
- package/scripts/release-channel.mjs +106 -0
- package/scripts/release-diagnostic.mjs +41 -0
- package/scripts/release-impact-check.mjs +12 -22
- package/scripts/release-oauth-canary-core.mjs +325 -0
- package/scripts/release-oauth-canary-evidence.mjs +100 -0
- package/scripts/release-oauth-canary.mjs +127 -0
- package/scripts/release-publication-guard.mjs +67 -0
- package/scripts/release-soak.mjs +284 -0
- package/scripts/release-state.mjs +1 -1
- package/scripts/run-checks.mjs +44 -7
- package/scripts/run-worker-dry-run.mjs +21 -0
- package/scripts/sarif-security-gate.mjs +2 -1
- package/scripts/sbom-check.mjs +106 -0
- package/scripts/start-release-candidate.mjs +267 -44
- package/scripts/syntax-check.mjs +36 -14
- package/scripts/verification-generation-guard.mjs +15 -0
- package/scripts/verification-idle-sleep-guard.mjs +37 -0
- package/scripts/verification-state.mjs +108 -0
- package/scripts/wrangler-command-lifecycle.mjs +115 -0
- package/src/local/account-access.mjs +13 -1
- package/src/local/account-admin-response.mjs +92 -0
- package/src/local/account-admin.mjs +52 -19
- package/src/local/agent-context-projection.mjs +26 -7
- package/src/local/agent-context.mjs +88 -49
- package/src/local/agent-skill-discovery.mjs +16 -5
- package/src/local/app-automation-macos-jxa.mjs +350 -0
- package/src/local/app-automation.mjs +873 -163
- package/src/local/application-capability-projection.mjs +24 -0
- package/src/local/authority-context.mjs +106 -0
- package/src/local/autostart-log-maintenance.mjs +36 -0
- package/src/local/browser-bridge-http.mjs +5 -3
- package/src/local/browser-bridge.mjs +109 -31
- package/src/local/browser-broker-auth-http.mjs +67 -0
- package/src/local/browser-broker-auth.mjs +98 -0
- package/src/local/browser-broker-routes.mjs +63 -20
- package/src/local/browser-broker-server.mjs +17 -7
- package/src/local/browser-command.mjs +79 -30
- package/src/local/browser-computer-observation-service.mjs +266 -0
- package/src/local/browser-extension-identity.mjs +50 -0
- package/src/local/browser-extension-path.mjs +22 -0
- package/src/local/browser-extension-protocol.mjs +50 -11
- package/src/local/browser-operation-service.mjs +147 -117
- package/src/local/browser-pairing-grant.mjs +109 -0
- package/src/local/browser-pairing-http.mjs +36 -0
- package/src/local/browser-pairing-launch.mjs +58 -0
- package/src/local/browser-pairing-store.mjs +85 -48
- package/src/local/browser-request-registry.mjs +40 -14
- package/src/local/browser-request-settlement.mjs +78 -0
- package/src/local/browser-resource-input.mjs +74 -0
- package/src/local/browser-trusted-input-health.mjs +63 -0
- package/src/local/call-authority.mjs +21 -0
- package/src/local/call-capacity.mjs +45 -0
- package/src/local/call-registry-drain.mjs +54 -0
- package/src/local/call-registry.mjs +30 -15
- package/src/local/capability-observer.mjs +5 -0
- package/src/local/capability-ranking.mjs +3 -2
- package/src/local/child-process-settlement.mjs +132 -0
- package/src/local/cli-account-admin.mjs +40 -6
- package/src/local/cli-activate.mjs +162 -0
- package/src/local/cli-local-admin.mjs +20 -45
- package/src/local/cli-options.mjs +12 -13
- package/src/local/cli-ready-output.mjs +52 -0
- package/src/local/cli-service.mjs +91 -11
- package/src/local/cli.mjs +232 -150
- package/src/local/computer-use-application-observation.mjs +224 -0
- package/src/local/computer-use-arguments.mjs +270 -0
- package/src/local/computer-use-deadline.mjs +50 -0
- package/src/local/computer-use-dispatch-settlement.mjs +40 -0
- package/src/local/computer-use-expectation.mjs +171 -0
- package/src/local/computer-use-observation.mjs +769 -0
- package/src/local/computer-use-recovery.mjs +82 -0
- package/src/local/computer-use-result-budget.mjs +145 -0
- package/src/local/computer-use-snapshot-store.mjs +67 -0
- package/src/local/computer-use.mjs +2255 -0
- package/src/local/daemon-http-relay-auth.mjs +26 -0
- package/src/local/daemon-http-relay-connection.mjs +298 -0
- package/src/local/daemon-http-relay-request.mjs +64 -0
- package/src/local/daemon-http-relay-sequence.mjs +49 -0
- package/src/local/daemon-process.mjs +40 -7
- package/src/local/delegated-process-sandbox.mjs +148 -0
- package/src/local/device-identity.mjs +156 -49
- package/src/local/device-root-provider.mjs +81 -0
- package/src/local/directory-metadata.mjs +47 -0
- package/src/local/doctor-reporting.mjs +23 -0
- package/src/local/durable-process-spec.mjs +80 -0
- package/src/local/errors.mjs +25 -15
- package/src/local/exclusive-file.mjs +74 -26
- package/src/local/execution-limits.mjs +9 -0
- package/src/local/execution-routing.mjs +276 -0
- package/src/local/execution-surface.mjs +23 -0
- package/src/local/file-mutation-coordinator.mjs +47 -0
- package/src/local/file-snapshot-preservation.mjs +24 -0
- package/src/local/filesystem-identity.mjs +54 -0
- package/src/local/fixed-process-environment.mjs +21 -0
- package/src/local/full-access-test.mjs +31 -13
- package/src/local/git-commit.mjs +69 -0
- package/src/local/git-config-safety.mjs +55 -0
- package/src/local/git-log-parser.mjs +41 -0
- package/src/local/git-metadata-boundary.mjs +77 -0
- package/src/local/git-metadata-tree-safety.mjs +59 -0
- package/src/local/git-operation-state.mjs +19 -0
- package/src/local/git-service.mjs +165 -30
- package/src/local/hardened-npm-download-timeout.mjs +46 -0
- package/src/local/hardened-npm-download.mjs +109 -0
- package/src/local/hardened-npm-extract.mjs +20 -0
- package/src/local/hardened-npm-verification.mjs +104 -0
- package/src/local/hardened-npm.mjs +199 -0
- package/src/local/job-runner.mjs +244 -89
- package/src/local/lifecycle.mjs +6 -0
- package/src/local/log.mjs +19 -45
- package/src/local/macos-background-input.mjs +398 -0
- package/src/local/macos-idle-sleep-assertion.mjs +65 -0
- package/src/local/macos-trust-broker.mjs +404 -0
- package/src/local/managed-job-cancellation.mjs +42 -0
- package/src/local/managed-job-capacity.mjs +16 -0
- package/src/local/managed-job-directory-generation.mjs +60 -0
- package/src/local/managed-job-directory.mjs +75 -0
- package/src/local/managed-job-durable-process.mjs +49 -0
- package/src/local/managed-job-lock.mjs +46 -14
- package/src/local/managed-job-plan.mjs +38 -14
- package/src/local/managed-job-projection.mjs +23 -15
- package/src/local/managed-job-retention.mjs +128 -0
- package/src/local/managed-job-runner-claim.mjs +70 -0
- package/src/local/managed-job-runner.mjs +35 -10
- package/src/local/managed-job-storage.mjs +22 -6
- package/src/local/managed-job-terminal-maintenance.mjs +40 -0
- package/src/local/managed-job-terminal.mjs +150 -0
- package/src/local/managed-jobs.mjs +424 -287
- package/src/local/npm-cli.mjs +42 -0
- package/src/local/npm-environment.mjs +37 -0
- package/src/local/operation-authorization.mjs +68 -324
- package/src/local/operation-risk.mjs +51 -4
- package/src/local/owner-state-lock.mjs +118 -0
- package/src/local/package-identity.mjs +9 -0
- package/src/local/patch.mjs +20 -18
- package/src/local/path-inspection.mjs +23 -0
- package/src/local/policy.mjs +19 -0
- package/src/local/private-toolchain-integrity.mjs +54 -0
- package/src/local/process-execution.mjs +87 -75
- package/src/local/process-foreground-timeout.mjs +50 -0
- package/src/local/process-identity.mjs +41 -7
- package/src/local/process-nonreplayable-settlement.mjs +50 -0
- package/src/local/process-result-projection.mjs +22 -0
- package/src/local/process-session-events.mjs +47 -0
- package/src/local/process-session-remote-activity.mjs +10 -0
- package/src/local/process-session-termination.mjs +73 -0
- package/src/local/process-sessions.mjs +144 -112
- package/src/local/process-tracker.mjs +140 -13
- package/src/local/process-tree-ownership-types.d.ts +37 -0
- package/src/local/process-tree-ownership.mjs +57 -0
- package/src/local/process-tree-signal.mjs +34 -0
- package/src/local/process-tree-snapshot.mjs +77 -0
- package/src/local/process-tree-supervisor.mjs +69 -0
- package/src/local/process-tree.mjs +11 -53
- package/src/local/project-metadata.mjs +19 -6
- package/src/local/relay-call-recovery.mjs +58 -38
- package/src/local/relay-connection-classification.mjs +131 -0
- package/src/local/relay-connection-support.mjs +91 -0
- package/src/local/relay-connection.mjs +179 -272
- package/src/local/relay-diagnostics.mjs +91 -0
- package/src/local/relay-heartbeat.mjs +119 -0
- package/src/local/relay-liveness.mjs +109 -0
- package/src/local/relay-peer-diagnostics.mjs +29 -0
- package/src/local/release-runtime-lock.mjs +18 -0
- package/src/local/remote-activity-idle-sleep-guard.mjs +77 -0
- package/src/local/remote-configuration.mjs +48 -0
- package/src/local/resilient-relay-connection.mjs +178 -0
- package/src/local/resource-admission-diagnostics.mjs +52 -0
- package/src/local/resource-admission-policy.mjs +115 -0
- package/src/local/resource-admission.mjs +339 -0
- package/src/local/resource-build-root.mjs +83 -0
- package/src/local/resource-cargo-concurrency.mjs +38 -0
- package/src/local/resource-cmake-concurrency.mjs +42 -0
- package/src/local/resource-command-concurrency.mjs +37 -0
- package/src/local/resource-command-profile.mjs +176 -0
- package/src/local/resource-coordinator-accounting.mjs +21 -0
- package/src/local/resource-cpu-window.mjs +20 -0
- package/src/local/resource-disk-headroom.mjs +13 -0
- package/src/local/resource-elastic-memory.mjs +19 -0
- package/src/local/resource-elastic-request.mjs +36 -0
- package/src/local/resource-foreground-wait.mjs +29 -0
- package/src/local/resource-go-concurrency.mjs +43 -0
- package/src/local/resource-gradle-concurrency.mjs +57 -0
- package/src/local/resource-host-cache.mjs +39 -0
- package/src/local/resource-host-darwin.mjs +54 -0
- package/src/local/resource-host-linux.mjs +35 -0
- package/src/local/resource-host-sample-file.mjs +23 -0
- package/src/local/resource-host-snapshot.mjs +99 -0
- package/src/local/resource-lease-accounting.mjs +119 -0
- package/src/local/resource-light-command.mjs +6 -0
- package/src/local/resource-make-concurrency.mjs +42 -0
- package/src/local/resource-maven-concurrency.mjs +38 -0
- package/src/local/resource-ninja-command-concurrency.mjs +20 -0
- package/src/local/resource-ninja-concurrency.mjs +28 -0
- package/src/local/resource-operations.mjs +26 -10
- package/src/local/resource-pressure.mjs +67 -0
- package/src/local/resource-probe-command.mjs +35 -0
- package/src/local/resource-process-admission.mjs +59 -0
- package/src/local/resource-process-ancestry-cache.mjs +43 -0
- package/src/local/resource-process-ancestry.mjs +32 -0
- package/src/local/resource-process-priority.mjs +15 -0
- package/src/local/resource-project-key.mjs +53 -0
- package/src/local/resource-pytest-concurrency.mjs +33 -0
- package/src/local/resource-release-control-classification.mjs +14 -0
- package/src/local/resource-release-control-executable.mjs +70 -0
- package/src/local/resource-release-control-workspace.mjs +41 -0
- package/src/local/resource-request-contract.mjs +30 -0
- package/src/local/resource-script-classification.mjs +44 -0
- package/src/local/resource-shell-analysis.mjs +58 -0
- package/src/local/resource-staging-recovery.mjs +97 -0
- package/src/local/resource-swift-concurrency.mjs +31 -0
- package/src/local/resource-transaction-lock.mjs +189 -0
- package/src/local/resource-wait.mjs +48 -0
- package/src/local/resource-waiters.mjs +139 -0
- package/src/local/resource-xcode-command.mjs +7 -0
- package/src/local/resource-xcode-concurrency.mjs +34 -0
- package/src/local/resource-xcode-non-build.mjs +19 -0
- package/src/local/runtime-activation.mjs +700 -0
- package/src/local/runtime-activity-projection.mjs +48 -0
- package/src/local/runtime-capabilities.mjs +48 -15
- package/src/local/runtime-diagnostic-state.mjs +14 -0
- package/src/local/runtime-diagnostics.mjs +40 -13
- package/src/local/runtime-info-projection.mjs +60 -0
- package/src/local/runtime-info-relay-projection.mjs +21 -0
- package/src/local/runtime-paths.mjs +2 -1
- package/src/local/runtime-process-routing.mjs +33 -0
- package/src/local/runtime-relay-connection-options.mjs +44 -0
- package/src/local/runtime-relay-control.mjs +98 -0
- package/src/local/runtime-relay.mjs +26 -50
- package/src/local/runtime-reporting.mjs +37 -21
- package/src/local/runtime-resource-service.mjs +77 -0
- package/src/local/runtime-tool-handlers.mjs +13 -10
- package/src/local/runtime.mjs +244 -208
- package/src/local/secure-file.mjs +73 -20
- package/src/local/security-audit-dispatch.mjs +35 -0
- package/src/local/security-audit-log.mjs +215 -0
- package/src/local/security-audit-state.mjs +139 -0
- package/src/local/security-audit-storage.mjs +135 -0
- package/src/local/security-audit-warning.mjs +31 -0
- package/src/local/security-audit-worker.mjs +87 -0
- package/src/local/service-convergence.mjs +42 -1
- package/src/local/service-definition.mjs +24 -0
- package/src/local/service-environment.mjs +18 -10
- package/src/local/service-owner.mjs +146 -0
- package/src/local/service-ownership.mjs +17 -0
- package/src/local/service-restart-handoff.mjs +64 -0
- package/src/local/service-restart-scheduler.mjs +49 -0
- package/src/local/service-runtime-convergence.mjs +52 -0
- package/src/local/service-runtime.mjs +105 -0
- package/src/local/service-status.mjs +60 -0
- package/src/local/service.mjs +385 -92
- package/src/local/shell.mjs +39 -19
- package/src/local/ssh-key.mjs +158 -42
- package/src/local/state-inventory.mjs +50 -24
- package/src/local/state-owner-lock-inventory.mjs +23 -0
- package/src/local/state-root-owned-namespaces.mjs +83 -0
- package/src/local/state-root-retirement.mjs +89 -0
- package/src/local/state.mjs +386 -96
- package/src/local/stdio.mjs +96 -66
- package/src/local/support-state-projection.mjs +30 -0
- package/src/local/system-network-route.mjs +76 -0
- package/src/local/systemd-removal.mjs +20 -0
- package/src/local/tool-executor.mjs +85 -20
- package/src/local/tool-result-boundary.mjs +51 -0
- package/src/local/toolchain-operation-lock.mjs +41 -0
- package/src/local/tools.mjs +7 -5
- package/src/local/trusted-executable.mjs +53 -0
- package/src/local/trusted-git-executable.mjs +34 -0
- package/src/local/trusted-github-cli.mjs +24 -0
- package/src/local/windows-service-convergence.mjs +49 -0
- package/src/local/windows-service.mjs +52 -45
- package/src/local/worker-deployment-fingerprint.mjs +102 -0
- package/src/local/worker-deployment.mjs +48 -60
- package/src/local/worker-health.mjs +12 -4
- package/src/local/worker-secret-file.mjs +37 -17
- package/src/local/workspace-file-service.mjs +156 -239
- package/src/local/workspace-file-transaction.mjs +189 -0
- package/src/local/workspace-search.mjs +55 -0
- package/src/local/wrangler-toolchain/package-lock.json +1505 -0
- package/src/local/wrangler-toolchain/package.json +23 -0
- package/src/local/wrangler-toolchain-verification.mjs +135 -0
- package/src/local/wrangler-toolchain.mjs +188 -0
- package/src/shared/access-contract.json +7 -1
- package/src/shared/activation-recovery.mjs +49 -0
- package/src/shared/admin-auth.d.mts +2 -1
- package/src/shared/admin-auth.mjs +3 -3
- package/src/shared/authority-revocation.d.mts +9 -0
- package/src/shared/authority-revocation.mjs +28 -0
- package/src/shared/daemon-auth.d.mts +11 -0
- package/src/shared/daemon-auth.mjs +17 -0
- package/src/shared/device-session-auth.d.mts +20 -0
- package/src/shared/device-session-auth.mjs +51 -0
- package/src/shared/foreground-timeout.d.mts +15 -0
- package/src/shared/foreground-timeout.mjs +70 -0
- package/src/shared/log-redaction.d.mts +9 -0
- package/src/shared/log-redaction.mjs +51 -0
- package/src/shared/mcp-protocol.d.mts +27 -0
- package/src/shared/mcp-protocol.mjs +275 -0
- package/src/shared/project-overview-projection.d.mts +4 -0
- package/src/shared/project-overview-projection.mjs +96 -0
- package/src/shared/relay-contract.json +28 -0
- package/src/shared/result-projection.d.mts +2 -1
- package/src/shared/result-projection.mjs +13 -2
- package/src/shared/server-metadata.json +15 -9
- package/src/shared/tool-argument-validation.d.mts +17 -0
- package/src/shared/tool-argument-validation.mjs +325 -0
- package/src/shared/tool-call-capacity.d.mts +41 -0
- package/src/shared/tool-call-capacity.mjs +59 -0
- package/src/shared/tool-catalog.json +626 -57
- package/src/worker/access.ts +12 -0
- package/src/worker/account-admin.ts +55 -33
- package/src/worker/authority-revocations.ts +174 -0
- package/src/worker/authority.ts +52 -6
- package/src/worker/daemon-auth.ts +49 -68
- package/src/worker/daemon-channel.ts +36 -0
- package/src/worker/daemon-http-auth.ts +63 -0
- package/src/worker/daemon-http-channel.ts +120 -0
- package/src/worker/daemon-http-controller.ts +163 -0
- package/src/worker/daemon-http-protocol.ts +62 -0
- package/src/worker/daemon-http-registry.ts +82 -0
- package/src/worker/daemon-last-observation.ts +30 -0
- package/src/worker/daemon-liveness.ts +8 -6
- package/src/worker/daemon-ready-dispatch.ts +17 -0
- package/src/worker/daemon-ready-messages.ts +73 -0
- package/src/worker/daemon-ready-waiters.ts +79 -0
- package/src/worker/daemon-recovery-budget.ts +13 -0
- package/src/worker/daemon-registry.ts +58 -0
- package/src/worker/daemon-relay-diagnostics.ts +127 -0
- package/src/worker/daemon-socket-attachment.ts +55 -0
- package/src/worker/daemon-sockets.ts +72 -62
- package/src/worker/daemon-status.ts +38 -0
- package/src/worker/device-session-verifier.ts +129 -0
- package/src/worker/dpop.ts +157 -0
- package/src/worker/durable-process-timeout.ts +29 -0
- package/src/worker/errors.ts +57 -0
- package/src/worker/http.ts +112 -26
- package/src/worker/index.ts +446 -440
- package/src/worker/mcp-access.ts +57 -0
- package/src/worker/mcp-controller.ts +188 -0
- package/src/worker/mcp-http-accept.ts +11 -0
- package/src/worker/mcp-http-contract.ts +322 -0
- package/src/worker/mcp-initialization-compat.ts +141 -0
- package/src/worker/mcp-jsonrpc.ts +11 -29
- package/src/worker/mcp-removed-protocol.ts +17 -0
- package/src/worker/mcp-response-proxy.ts +135 -0
- package/src/worker/mcp-response-stream.ts +65 -0
- package/src/worker/mcp-stale-schema-compat.ts +57 -0
- package/src/worker/mcp-stream-proxy-contract.ts +48 -0
- package/src/worker/mcp-tool-call-input.ts +23 -0
- package/src/worker/nonce-store.ts +33 -35
- package/src/worker/oauth-authorization-page.ts +21 -1
- package/src/worker/oauth-client-admin.ts +52 -0
- package/src/worker/oauth-client-contract.ts +38 -0
- package/src/worker/oauth-controller.ts +107 -47
- package/src/worker/oauth-field-contract.ts +31 -0
- package/src/worker/oauth-record-contract.ts +7 -0
- package/src/worker/oauth-refresh-authority.ts +27 -0
- package/src/worker/oauth-refresh-exchange.ts +162 -0
- package/src/worker/oauth-refresh-families.ts +130 -27
- package/src/worker/oauth-refresh-persistence.ts +116 -0
- package/src/worker/oauth-state.ts +33 -18
- package/src/worker/oauth-store-validation.ts +131 -0
- package/src/worker/oauth-token-derivation.ts +33 -0
- package/src/worker/oauth-token-issuance.ts +119 -0
- package/src/worker/oauth-tokens.ts +56 -190
- package/src/worker/observability.ts +38 -5
- package/src/worker/pending-admission.ts +15 -0
- package/src/worker/pending-call-capacity.ts +108 -0
- package/src/worker/pending-call-contract.ts +42 -5
- package/src/worker/pending-call-deadlines.ts +75 -0
- package/src/worker/pending-calls.ts +131 -125
- package/src/worker/runtime-alarm-storage.ts +37 -0
- package/src/worker/runtime-alarm.ts +136 -0
- package/src/worker/server-info-activity.ts +36 -0
- package/src/worker/server-info-tool-delivery.ts +15 -0
- package/src/worker/server-info.ts +168 -0
- package/src/worker/tool-catalog.ts +47 -1
- package/src/worker/tool-timeout.ts +75 -14
- package/src/worker/websocket-protocol.ts +26 -2
- package/src/worker/worker-edge-guard.ts +90 -0
- package/src/worker/worker-edge-log.ts +65 -0
- package/src/worker/worker-entry.ts +52 -0
- package/src/worker/worker-mcp-config.ts +23 -0
- package/src/worker/worker-metadata.ts +48 -0
- package/src/worker/worker-rate-limit-key.ts +30 -0
- package/src/worker/worker-runtime-config.ts +20 -0
- package/src/worker/worker-static-routes.ts +54 -0
- package/src/worker/worker-task-lifetime.ts +18 -0
- package/tsconfig.local.json +17 -1
- package/wrangler.jsonc +13 -0
- package/src/local/cli-approval.mjs +0 -117
- package/src/local/operation-state-lock.mjs +0 -92
- package/src/worker/mcp-session.ts +0 -72
package/docs/THREAT_MODEL.md
CHANGED
|
@@ -1,142 +1,239 @@
|
|
|
1
1
|
# Threat model
|
|
2
2
|
|
|
3
|
-
This document defines the security claims Machine Bridge is designed to make and the claims it explicitly does not make. It complements [SECURITY.md](../SECURITY.md) and
|
|
3
|
+
This document defines the security claims Machine Bridge is designed to make and the claims it explicitly does not make. It complements [SECURITY.md](../SECURITY.md), [LOCAL_AUTHORIZATION.md](LOCAL_AUTHORIZATION.md), and [ARCHITECTURE.md](ARCHITECTURE.md).
|
|
4
4
|
|
|
5
5
|
## Scope
|
|
6
6
|
|
|
7
|
-
Machine Bridge combines
|
|
7
|
+
Machine Bridge combines:
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
- a public OAuth and MCP endpoint on a Cloudflare Worker;
|
|
10
|
+
- an authenticated relay to a high-authority local daemon;
|
|
11
|
+
- optional local stdio transport;
|
|
12
|
+
- filesystem, Git, process, browser, and application automation;
|
|
13
|
+
- persistent managed jobs and registered local resources;
|
|
14
|
+
- a browser extension operating in an existing user profile.
|
|
15
|
+
|
|
16
|
+
The local runtime executes as the current OS user. Application policies restrict Machine Bridge behavior, but they do not replace kernel, account, VM, container, browser-profile, or endpoint-security isolation.
|
|
10
17
|
|
|
11
18
|
## Assets
|
|
12
19
|
|
|
13
|
-
|
|
20
|
+
Protected assets include:
|
|
14
21
|
|
|
15
|
-
- workspace and local
|
|
16
|
-
- process execution authority and inherited environment values;
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
- logs and diagnostics that could reveal paths, credentials, arguments, results, or user content.
|
|
22
|
+
- workspace files and other files reachable by the local OS user;
|
|
23
|
+
- process execution authority, process sessions, retained output, and inherited environment values;
|
|
24
|
+
- the device root, root-certified ephemeral session keys, OAuth account password verifiers, authorization codes, access tokens, refresh-token families, DPoP bindings, and trusted-client records;
|
|
25
|
+
- Machine Bridge state, locks, service metadata, native broker files, audit-chain state, registered-resource metadata, and managed-job plans/output;
|
|
26
|
+
- browser pairing state, cookies, authenticated sessions, tabs, page content, form values, screenshots, and upload authority;
|
|
27
|
+
- Worker and Durable Object routing, nonce, account, client, token, and pending-call state;
|
|
28
|
+
- release candidate hashes, package contents, acceptance records, and source-release integrity;
|
|
29
|
+
- logs and diagnostics that could reveal paths, credentials, arguments, output, or user content.
|
|
24
30
|
|
|
25
31
|
## Trust boundaries
|
|
26
32
|
|
|
27
33
|
### Hosted client to Worker
|
|
28
34
|
|
|
29
|
-
The hosted client
|
|
35
|
+
The hosted MCP client, its prompts, tools, extensions, and retrieved content are not automatically trusted. The Worker validates:
|
|
36
|
+
|
|
37
|
+
- OAuth state, PKCE, redirect URI, resource binding, and request size;
|
|
38
|
+
- account status, account version, account role, trusted client binding, token expiry, and refresh-family state;
|
|
39
|
+
- DPoP proof method, target URL, timestamp, unique identifier, access-token hash, and key thumbprint when DPoP is used;
|
|
40
|
+
- Native MCP `2026-07-28` per-request protocol metadata, valid positive `Accept` quality values, actual `/mcp` Origin, header/body consistency for version/method/name/declared primitive parameters, request IDs, role-visible tool exposure, raw argument schemas, and response-stream cancellation. Remote HTTP initialization compatibility is limited to the declared `2025-06-18`/`2025-11-25` dates and the bounded `initialize`/`notifications/initialized`/`ping`/`tools/list`/`tools/call` method set; it dispatches tools only through the current controller and cannot create `Mcp-Session-Id`, recovery/replay state, or a second authorization/session model. Other removed initialization/session requests receive bounded upgrade guidance only.
|
|
41
|
+
- The daemon HTTPS fallback is a transport failover surface, not an MCP endpoint or alternate authority. Each POST is authenticated by the same root-certified ephemeral P-256 device session as the daemon, and its signature binds the fixed route, Worker origin, server/version, a 30-second nonce/timestamp window, and exact body SHA-256. Nonces are one-time and bounded; request/response bodies, queue count/bytes, request frequency, and liveness are bounded independently. The Worker admits the fallback only when no verified-ready WSS exists, preserves the same daemon-instance/pending-call ownership, and does not expose the fallback as ready until the daemon has acknowledged all probing controls and returned the sequenced `https_ready` proof. Bidirectional contiguous transport sequences reject gaps and suppress duplicate delivery before business side effects, so an HTTP response retry does not become a mutation retry.
|
|
42
|
+
|
|
43
|
+
A client registration is not authority. Authority begins only after successful account authorization binds the client to one account and role version.
|
|
44
|
+
|
|
45
|
+
Capability discovery is also an authorization boundary. Task routing and application/browser metadata are built from the effective account/daemon policy intersection, not from the daemon ceiling. Route scores and fallbacks are advisory and cannot manufacture authority; direct Bash remains available only when the effective policy already exposes it. A restricted account must not learn hidden local application inventory or receive names of unavailable execution tools through the resolver.
|
|
46
|
+
|
|
47
|
+
Mirrored MCP headers are an intermediary-routing boundary. The Worker compares every required native current header with the JSON-RPC body before authorization-dependent dispatch; a mismatch fails with `-32020` before the daemon can observe the call. Stateless initialization-compatibility clients may omit the newer method/name/declared-parameter mirrors, but any such current mirror they do send is binding and must match the same JSON-RPC body before compatibility dispatch. The reserved mirror namespace is closed as well: an inapplicable `Mcp-Name` or a `Mcp-Param-*` header that is not declared by the selected tool schema is rejected rather than ignored. Tool schemas are compiled from a bounded JSON Schema 2020-12 subset at startup and runtime traversal charges every array item and own object property to a fixed work budget. Open request metadata/capability JSON also has a fixed structural-node/depth/key budget. This server advertises no change notifications, so `subscriptions/listen` validates and bounds the requested filter, acknowledges an empty supported notification subset, emits the correlated completion result, and closes immediately without retaining subscription state. Unsupported dialects or keywords fail closed, external network `$ref` values are not dereferenced, and validation diagnostics omit argument values and unbounded caller identifiers.
|
|
48
|
+
|
|
49
|
+
Current response-stream cancellation deliberately crosses the OAuth boundary only through an unguessable internal stream capability. The public Worker strips caller-provided control headers before the service binding, the cancellation request contains no bearer token or DPoP proof, and the Durable Object consumes the capability before OAuth only to cancel a currently indexed call. Guessing remains bounded by 256-bit randomness; a compromised service binding or Worker runtime is already inside this trust boundary.
|
|
30
50
|
|
|
31
51
|
### Worker to local daemon
|
|
32
52
|
|
|
33
|
-
The Worker is a relay and authorization layer, not
|
|
53
|
+
The Worker is a relay and authorization layer, not the source of local OS authority.
|
|
54
|
+
|
|
55
|
+
The daemon connection requires:
|
|
56
|
+
|
|
57
|
+
1. a root-signed ephemeral device-session certificate;
|
|
58
|
+
2. a signed, nonce-bound WebSocket preflight using that session key;
|
|
59
|
+
3. a fresh Worker challenge bound to the daemon instance;
|
|
60
|
+
4. version compatibility;
|
|
61
|
+
5. an end-to-end readiness probe delivered through the same result path as real calls.
|
|
62
|
+
|
|
63
|
+
A replacement candidate does not displace a healthy daemon until those checks complete.
|
|
64
|
+
|
|
65
|
+
Each remote tool call carries account ID, account version, OAuth client ID, refresh-family ID, and role. The local runtime recomputes effective authority and applies object ownership and operation classification before dispatch.
|
|
34
66
|
|
|
35
67
|
### MCP host to local stdio process
|
|
36
68
|
|
|
37
|
-
|
|
69
|
+
Stdio is a local-owner transport. It does not use remote OAuth accounts or the relay device root. The local MCP host can invoke every tool allowed by the selected local policy.
|
|
70
|
+
|
|
71
|
+
The host, model output, repository instructions, and retrieved content may be malicious or prompt-injected. A permissive local policy therefore grants meaningful local-user authority.
|
|
38
72
|
|
|
39
73
|
### Local runtime to operating system
|
|
40
74
|
|
|
41
|
-
The runtime relies on
|
|
75
|
+
The runtime relies on OS-user identity, filesystem permissions, process controls, macOS TCC/SIP, Windows ACLs, endpoint controls, and any VM/container boundary.
|
|
76
|
+
|
|
77
|
+
For delegated process execution, Machine Bridge requires a behaviorally verified OS sandbox. If the negative boundary cannot be demonstrated, delegated execution fails closed. Owner execution is not sandboxed by Machine Bridge. Fixed implementation-owned Git operations are not caller-selected process authority: they use code-constructed argv, no shell, literal pathspecs, an isolated minimal environment, bounded deadlines/output, and ordinary cancellation/process tracking. Fixed UI launch/JXA/native-input helpers likewise use code-constructed argv rather than caller-selected script source. For those mutation-capable helpers a failure before process start remains definite; once process start is established, timeout, cancellation, process error, or lost settlement is non-retryable unknown evidence because the UI mutation may already have happened. Before a restricted principal reaches Git, filesystem-first discovery checks metadata roots and recursive alternate stores and rejects symbolic-link/special-file descendants in the metadata trees; repository configuration that can execute helpers, redirect external files, or enable lazy object fetching is rejected. This protects the authenticated principal boundary but is not a hostile same-UID filesystem transaction: another local process with the owner's OS authority can still race metadata after inspection.
|
|
42
78
|
|
|
43
79
|
### Local runtime to browser extension
|
|
44
80
|
|
|
45
|
-
The broker is loopback-only and
|
|
81
|
+
The broker is loopback-only, but loopback is not treated as a per-user authentication boundary. Long-lived extension/runtime tokens stay in owner-only state and serve only as HMAC keys: already-paired clients first prove possession of the role key with an init HMAC before the broker allocates challenge state, then verify a broker proof before WebSocket upgrade and present a five-second one-time role-bound proof. The fixed public pairing URL and HTTP document carry no credential. An explicit pair action first binds a one-shot OS-random loopback listener owned by the current process, then places a 30-second bootstrap only in that temporary URL fragment; the `document_start` content script strips it before page scripts, and the broker must prove knowledge derived from the owner-only extension token before the extension accepts that token. Successful bootstrap exchanges are consumed once. Extension origin, protocol/build version, capabilities, owner/client route, and handshake state are also validated. A same-OS-user malicious process remains outside the repository-only isolation guarantee, and process/URL UI visibility still relies on the operating system and browser boundary.
|
|
82
|
+
|
|
83
|
+
The extension still operates inside a real browser profile. It can reach tabs, authenticated sessions, and origins granted by browser permissions. Only the `owner` role may use browser-session control or export local data into it. Computer Use does not increase that role ceiling: its browser observations bind semantic refs, document/frame epochs, optional screenshot evidence, and private backend-node identity to one bounded snapshot, then consume that snapshot as one-shot mutation authority. Transport loss after a browser mutation is attempted is explicitly unknown and never safe replay evidence. Screenshot-bound point actions additionally require exact current screenshot/viewport/document evidence; callers cannot submit raw CDP methods, backend-node IDs, or coordinates that are not bound to the referenced snapshot.
|
|
46
84
|
|
|
47
85
|
### Local runtime to persistent state
|
|
48
86
|
|
|
49
|
-
State paths, locks, plans, resources, and service definitions are security-sensitive.
|
|
87
|
+
State paths, roots, locks, plans, resources, native broker files, and service definitions are security-sensitive.
|
|
88
|
+
|
|
89
|
+
Machine Bridge uses bounded reads, canonical path resolution, owner-only modes where supported, atomic replacement, process-identity locks, schema validation, and explicit lifecycle transitions. Security/destructive inventory treats only `ENOENT` as absence, refuses symbolic-link profile/job roots before traversal, and treats malformed/wrong-type entries inside reserved `profiles/`, public `job_...`, or retired cleanup namespaces as blockers rather than disposable unknown files. Whole-directory managed-job and state-root deletion is generation-bound: the exact inspected directory is moved to a reserved quarantine namespace, the moved filesystem identity and domain safety evidence are revalidated, and only that generation may be recursively deleted; crash residue is reclaimed only when the encoded generation still matches. Generic path-based tools cannot target Machine Bridge control-plane roots, even under `owner/full`. An authorized owner shell remains equivalent to same-user code execution and is outside that path boundary.
|
|
90
|
+
|
|
91
|
+
### Device root to ephemeral session
|
|
92
|
+
|
|
93
|
+
The default root is portable owner-only P-256 material, including on macOS, and is therefore readable by a determined same-user process. A non-exportable Secure Enclave root is available only through an explicitly configured app-like broker with provisioning-profile-validated Keychain access, a strict Apple code signature, stable Team ID, canonical non-symlink path with no group/other write access, and a successful real key probe. Either root signs one bounded ephemeral session certificate at daemon startup. WebSocket reconnect and account-administration requests use the in-memory session key, not the root.
|
|
94
|
+
|
|
95
|
+
The portable provider stores an exportable private JWK in owner-only state and therefore provides weaker theft resistance. `server_info` reports the provider and exportability.
|
|
96
|
+
|
|
97
|
+
Broker binding detects path, identifier, Team ID, signature, and capability drift. It does not protect against a malicious replacement signed by the same trusted Apple team and identifier. Production broker installations should therefore be root-owned or otherwise non-writable by the daemon user, with signing-key protection and update governance treated as external trust dependencies.
|
|
50
98
|
|
|
51
99
|
### Maintainer to release infrastructure
|
|
52
100
|
|
|
53
|
-
Repository checks reduce
|
|
101
|
+
Repository checks reduce package drift and accidental release mistakes. Source hosting, npm ownership, Apple signing identities, protected environments, maintainer accounts, and independent review remain external trust dependencies.
|
|
102
|
+
|
|
103
|
+
The local signature binds the self-hosted broker bytes used by this installation. Public third-party binary distribution would be a separate trust model and is outside the current package workflow.
|
|
54
104
|
|
|
55
105
|
## Attacker models
|
|
56
106
|
|
|
57
|
-
Machine Bridge considers
|
|
107
|
+
Machine Bridge considers:
|
|
58
108
|
|
|
59
|
-
1. **
|
|
60
|
-
2. **
|
|
61
|
-
3. **Malicious repository content** including instructions, package scripts, Git configuration,
|
|
62
|
-
4. **Malicious
|
|
63
|
-
5. **
|
|
64
|
-
6. **
|
|
65
|
-
7. **
|
|
66
|
-
8. **Operational
|
|
109
|
+
1. **A malicious or compromised hosted MCP client** attempting unauthorized tools, account switching, token theft/replay, OAuth redirect abuse, request duplication, cancellation races, or resource exhaustion.
|
|
110
|
+
2. **A malicious local MCP host or model output** attempting destructive operations, credential access, shell injection, persistence, or data export through an allowed local-owner policy.
|
|
111
|
+
3. **Malicious repository content** including instructions, package scripts, Git hooks/configuration, symlinks, generated metadata, or files designed to influence an agent or execution boundary.
|
|
112
|
+
4. **Malicious web or browser content** attempting prompt injection, deceptive selectors, sensitive-field disclosure, unsafe navigation, ambiguous input dispatch, or extension-protocol abuse.
|
|
113
|
+
5. **A local same-user process** attempting to read state, race locks, replace files, inspect memory, impersonate stale processes, or interfere with loopback services.
|
|
114
|
+
6. **A network attacker or misconfigured proxy** attempting interception, redirect manipulation, stale deployment evidence, connection truncation, replay, or ambiguous timeout outcomes.
|
|
115
|
+
7. **A compromised dependency or build input** attempting package substitution, install-script abuse, workflow mutation, release drift, or sensitive artifact inclusion.
|
|
116
|
+
8. **Operational faults** including abrupt termination, PID reuse, clock anomalies, partial writes, permission errors, Keychain failures, service-manager races, stale extension builds, and daemon replacement during active calls.
|
|
67
117
|
|
|
68
118
|
## Security objectives
|
|
69
119
|
|
|
70
120
|
The implementation aims to preserve these invariants:
|
|
71
121
|
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
122
|
+
- unknown, malformed, stale, replayed, duplicated, unauthorized, and over-limit input is rejected;
|
|
123
|
+
- an intermediary cannot authorize or route one current method/name while the Worker executes another body; mirrored-header mismatch is rejected before dispatch;
|
|
124
|
+
- JSON-RPC request IDs are not global identities across clients sharing one bearer token; response-stream cancellation instead uses a request-scoped unguessable internal capability that is never accepted from the public caller;
|
|
125
|
+
- the stable account-role discovery catalog is not treated as execution authority; every call is intersected with the current end-to-end-ready daemon policy and fails closed when that authority is absent;
|
|
126
|
+
- remote authority is the intersection of daemon policy and account role, never the union;
|
|
127
|
+
- no approval record, token refresh, or local migration state can elevate a delegated role;
|
|
128
|
+
- OAuth clients are bound to one account/version/role and can be revoked independently;
|
|
129
|
+
- long-lived runtime objects are bound to account, account version, OAuth client, and refresh family;
|
|
130
|
+
- generic path-based remote tools cannot target Machine Bridge control-plane state;
|
|
131
|
+
- sensitive paths, persistence targets, browser/desktop control, data export, and persistent job creation are owner-only;
|
|
132
|
+
- delegated process execution is accepted only when an OS sandbox is behaviorally verified;
|
|
133
|
+
- direct argv execution is used unless the explicit shell tool is authorized;
|
|
134
|
+
- confined paths are canonicalized and symbolic-link write escape is rejected;
|
|
135
|
+
- request bodies, files, messages, output, logs, state, retained results, concurrency, and error-cause traversal are bounded; byte limits stop further source consumption rather than merely truncating retained data;
|
|
136
|
+
- cancellation, timeout, disconnect, replacement, revocation, and shutdown have explicit process ownership and cleanup semantics; an asynchronous child `error` does not by itself release tracker/resource ownership before close/exit settlement, post-spawn start failures retain internal ownership until close, and a failed direct termination request cannot be reported as a successful forced kill or completed authority revocation; streamed calls persist ownership and deadlines across Durable Object hibernation, and per-WebSocket generations reject delayed results or close events from an obsolete connection;
|
|
137
|
+
- candidate daemons and browser extensions cannot replace healthy incumbents before compatibility and readiness verification;
|
|
138
|
+
- default logs, audit records, discovery warnings, browser responses, and administration errors omit secrets, arguments, contents, raw paths, form values, raw local exception text, and output;
|
|
139
|
+
- multi-stage mutations are atomic or recoverable and do not silently claim partial success;
|
|
140
|
+
- device-root rotation is two-phase and does not promote an undeployed key;
|
|
141
|
+
- supply-chain actions are pinned, minimally permissioned, reviewed, and separately gated.
|
|
86
142
|
|
|
87
143
|
## Non-goals
|
|
88
144
|
|
|
89
|
-
Machine Bridge does
|
|
145
|
+
Machine Bridge does not claim to provide:
|
|
90
146
|
|
|
91
|
-
- kernel-enforced sandboxing
|
|
92
|
-
-
|
|
147
|
+
- kernel-enforced sandboxing for `owner`, universal syscall filtering, or universal network isolation;
|
|
148
|
+
- OS CPU, memory, disk, or bandwidth quotas;
|
|
149
|
+
- hard multi-tenant isolation between mutually untrusted humans sharing one daemon and OS account;
|
|
93
150
|
- protection from root, an administrator, or a fully compromised same-user account;
|
|
94
|
-
- complete prevention of prompt injection
|
|
151
|
+
- complete prevention of prompt injection when an authorized tool can perform the requested action;
|
|
95
152
|
- semantic detection of every secret, transformed credential, private document, or dangerous command;
|
|
96
|
-
- proof that the browser extension is loaded in
|
|
97
|
-
- rollback of a browser or external-system action after
|
|
153
|
+
- proof that the browser extension is loaded in an isolated profile;
|
|
154
|
+
- rollback of a browser or external-system action after ambiguous dispatch;
|
|
155
|
+
- an atomic rollback transaction spanning Cloudflare Worker deployment and every local service manager;
|
|
156
|
+
- repair or node selection inside a third-party system VPN/TUN;
|
|
98
157
|
- guaranteed cleanup after power loss, kernel failure, filesystem corruption, or an uncooperative external platform;
|
|
99
|
-
-
|
|
100
|
-
-
|
|
158
|
+
- hardware-backed key storage on every operating system;
|
|
159
|
+
- third-party public binary-store identity or independent distributor attestations;
|
|
160
|
+
- independent human review while the project has only one active maintainer.
|
|
101
161
|
|
|
102
162
|
## Residual risks
|
|
103
163
|
|
|
104
|
-
###
|
|
164
|
+
### Owner and canonical `full`
|
|
165
|
+
|
|
166
|
+
`full` intentionally preserves the complete catalog, unrestricted local-user paths, shell execution, parent environment, browser/application authority, managed jobs, and absolute path output.
|
|
167
|
+
|
|
168
|
+
A compromised active owner client can exercise the daemon ceiling without a second per-operation prompt. The design reduces prompt fatigue and avoids insecure copy-and-retry approval ceremonies, but it makes client trust, token protection, DPoP support, account revocation, and endpoint isolation critical.
|
|
105
169
|
|
|
106
|
-
|
|
170
|
+
Use a narrower profile, separate OS account, container, or VM when prompts, repositories, clients, or workloads are mutually untrusted.
|
|
107
171
|
|
|
108
|
-
###
|
|
172
|
+
### Public Worker endpoint and quota guards
|
|
109
173
|
|
|
110
|
-
|
|
174
|
+
The default public endpoint remains the automatically provisioned `workers.dev` origin so ordinary users need no DNS zone or custom domain. The in-Worker Rate Limiting bindings are deliberately Durable Object burst guards, not authentication boundaries or exact global quota accountants. They run after a Worker invocation begins and are scoped by Cloudflare location. A high-capacity route/Worker bucket bounds aggregate stateful pressure, while a lower route/subject bucket isolates a presented credential or an anonymous network identity through an internal truncated SHA-256 key. Raw credentials and addresses are not logged or returned by diagnostics; the network-address hash is a bucketing mechanism, not cryptographic anonymization of low-entropy IP space. Random invalid credentials cannot bypass the aggregate bucket. Distributed traffic can still consume the account-wide Workers request allowance, and a sufficiently concentrated source can exhaust its own local subject bucket. Binding failure is fail-open to avoid turning a quota helper into an account outage. Operators who already control an external edge may add pre-Worker filtering independently, but the public package does not require or assume a private domain.
|
|
111
175
|
|
|
112
|
-
###
|
|
176
|
+
### Bearer clients
|
|
113
177
|
|
|
114
|
-
|
|
178
|
+
DPoP is optional for interoperability. A Bearer token can be used by whoever possesses it until expiry or revocation. Short access-token lifetime, rotating refresh families, client binding, account versioning, a bounded identity-equivalent concurrency window, and post-window replay-family revocation reduce but do not eliminate token theft risk.
|
|
115
179
|
|
|
116
180
|
### Same-user interference
|
|
117
181
|
|
|
118
|
-
Owner-only permissions
|
|
182
|
+
Owner-only permissions, optional provisioned Secure Enclave roots, control-plane path denial, process-identity locks, and audit chains reduce several attacks. They cannot prevent a determined same-user process from reading portable credentials, inspecting process memory, changing source before execution, or interfering with local services.
|
|
183
|
+
|
|
184
|
+
### Delegated sandbox availability
|
|
185
|
+
|
|
186
|
+
Delegated execution is unavailable when the platform sandbox cannot pass the negative-boundary probe. This is an intentional availability trade-off. Replacing fail-closed behavior with an unverified path blacklist would create false isolation.
|
|
187
|
+
|
|
188
|
+
### Browser and application automation
|
|
189
|
+
|
|
190
|
+
UI state can change between inspection and action. Pages can present deceptive content, and authenticated profiles may contain high-value sessions. Protocol checks and trusted-input handling do not make arbitrary web content trustworthy. Computer Use narrows stale-target risk through one-shot snapshot authority, browser document/frame/semantic identity, and macOS PID-generation/owner-window revalidation, but it cannot make a multi-command visual/semantic observation atomic when the underlying OS/browser does not provide such a primitive.
|
|
191
|
+
|
|
192
|
+
Screenshots are user data and may contain credentials, personal information, private documents, or transient notifications even when semantic value fields are redacted. They are returned only as requested tool results and are not operational log data. Computer Use shares the ordinary 7 MiB tool-result boundary; an image that would overflow the result is omitted before publishing the observation snapshot, and the resulting snapshot loses pixel-action authority. This avoids an inaccessible snapshot ID while not pretending that an omitted image was never captured in local memory during the bounded operation.
|
|
193
|
+
|
|
194
|
+
The macOS experimental background visual backend uses fixed native code and exact process/window/screenshot bindings, but it depends on Accessibility/Automation/Screen Recording permissions and private WindowServer/SkyLight behavior that Apple does not guarantee as a stable public API. It is disabled unless explicitly configured and successfully probed. Probe failure must degrade to supported semantic/screenshot evidence rather than enabling pixel input. Same-UID local interference, OS compositor races, or a UI that changes after the last preflight remain residual risks; unknown outcomes require observation before any new mutation.
|
|
195
|
+
|
|
196
|
+
### Managed jobs
|
|
197
|
+
|
|
198
|
+
Synchronous identity and sandbox probes use `SIGKILL` when their declared deadline expires; a soft timeout signal is not treated as a bound because the caller can otherwise remain blocked. POSIX forced process-tree escalation requires a non-empty captured ownership set and exact PID/start-time continuity. If process inspection is unavailable or ambiguous, Machine Bridge may leave a resistant descendant for operator cleanup rather than risk signaling a reused process group.
|
|
199
|
+
|
|
200
|
+
Managed jobs outlive MCP calls and daemon reconnects. Plans and resources are validated and ownership-bound, but an authorized owner plan can still consume resources or perform destructive work. Finally steps must be idempotent because recovery may retry them. Process-tree escalation revalidates captured PID, start-time, and process-group identity so PID reuse cannot redirect `SIGKILL` to an unrelated process. Full and targeted process snapshots share one monotonic budget per ownership decision, preventing descendant count or a stalled process-table query from expanding shutdown latency without bound. Darwin additionally queries only the target PGID, reducing the chance that unrelated process-table load erases all ownership evidence and forces fail-closed descendant retention. A missing ChildProcess `close` event after observed `exit` receives a bounded output-drain fallback and cannot leave a managed-job runner permanently unresolved.
|
|
119
201
|
|
|
120
202
|
### Availability and resource exhaustion
|
|
121
203
|
|
|
122
|
-
|
|
204
|
+
Application-level limits bound many requests and outputs. An authorized owner process can still exhaust CPU, memory, disk, network, or external service quotas.
|
|
205
|
+
|
|
206
|
+
Beta.61 retains cooperative admission to reduce accidental cross-agent resource storms, adds protected backfill and Linux PSI pressure evidence, and narrows project contention to provable shell working directories. None of these is a hostile-process containment boundary. A same-user process can ignore the coordinator, forge unrelated workload outside Machine Bridge, deliberately escape a process group, or consume more than its advisory reservation. The coordinator therefore protects cooperating Machine Bridge/workflow roots from accidental CPU/I/O/memory/disk oversubscription and starvation; account/container/VM/cgroup controls remain required against malicious or uncooperative local code. Persistent coordinator records contain no command text or raw project path, but their existence and coarse resource-family/timing metadata are local side channels to the same OS user. PSI reports system/cgroup stall history, not which particular cooperating process caused it.
|
|
207
|
+
|
|
208
|
+
### System VPN/TUN and distributed activation
|
|
209
|
+
|
|
210
|
+
A system VPN/TUN can remain administratively connected while its selected upstream route, synthetic DNS mapping, or transport path is temporarily unusable. Machine Bridge can detect missing inbound relay traffic, classify the socket close, bound retry delay, report outage history, and on macOS classify the default route as tunnel/VPN versus a coarse non-tunnel category. It cannot identify the failing upstream node or repair a third-party VPN. `system-network-stack` is therefore not a claim of direct routing. The route diagnostic deliberately omits interface identity, addresses, DNS answers, and endpoints. A Worker transport/liveness invalidation is treated as a retryable socket-generation failure; elevating it to a permanent protocol error would let an ordinary network fault restart the daemon and amplify the outage. Unknown protocol messages and authentication or version mismatch remain fail-closed.
|
|
211
|
+
|
|
212
|
+
Candidate activation verifies the foreground candidate before service handoff and records exact package/deployment evidence. It does not provide an atomic transaction spanning Cloudflare deployment and every local service manager. The machine-global service definition therefore has an owner-only pending/committed ledger, all service writers share one fixed per-user lock, and any path that also acquires a workspace startup lock uses machine-service-first ordering. Provider-active state is not authenticity evidence: the exact owner-bound service daemon must publish a token-protected readiness checkpoint after device authentication, relay probe, and `ready_ack`. Missing, corrupt, pending, mismatched, or unready ownership fails closed.
|
|
213
|
+
|
|
214
|
+
An explicit candidate device-authentication rejection permits one same-name redeployment with the unchanged selected identity; ambiguous network or health failure does not. After remote preparation, local compensation installs and starts the compatible candidate service rather than reviving a known-incompatible old daemon. Before remote preparation, restoration of an older service requires the same version and entrypoint to reappear as a verified service-mode daemon. The wrapper intentionally has no transaction-wide hard kill, because killing the parent could bypass cleanup and leave detached deployment helpers; each internal stage has its own deadline instead. Persistent Cloudflare, service-manager, filesystem, or process-inspection failure can still require operator diagnosis. Local cleanup errors are aggregated rather than hidden, and remote rollback is not fabricated.
|
|
123
215
|
|
|
124
216
|
### External governance and publication
|
|
125
217
|
|
|
126
|
-
|
|
218
|
+
GitHub tag/Release publication requires an explicit confirmation flag, TTY-backed stdin/stdout/stderr, and one process-identity lock shared through the common Git directory. This blocks the supported MCP, managed-job, CI, redirected, and ordinary background paths and prevents concurrent publication from separate linked worktrees. It is a workflow and accountability boundary, not cryptographic user-presence authentication: arbitrary code already executing as the same OS user can allocate a pseudo-terminal and invoke the same command. A protected release environment, hardware-backed user presence, or a separately isolated principal is required when adversarial same-user separation is part of the threat model.
|
|
219
|
+
|
|
220
|
+
Code cannot create a second independent reviewer, npm OIDC trust relationship, protected publication environment, Apple Developer identity, or external certification. These remain explicit operational requirements.
|
|
127
221
|
|
|
128
222
|
## Validation map
|
|
129
223
|
|
|
130
|
-
|
|
224
|
+
Regression suites cover:
|
|
131
225
|
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
135
|
-
-
|
|
136
|
-
-
|
|
226
|
+
- account roles, trusted clients, account-version revocation, refresh-family rotation/replay, DPoP proofs, and non-escalatable effective authority; request-scoped stream cancellation does not weaken that boundary because the outer Worker strips caller-supplied internal control headers, mints a random capability itself, sends no bearer token or DPoP proof on the private cancellation request, and binds the capability only to the currently indexed in-memory call.
|
|
227
|
+
- root-certified ephemeral sessions, preflight nonce replay, daemon challenge binding, readiness, reconnect, and candidate replacement;
|
|
228
|
+
- signed account administration, client revocation, bounded strict-JSON administration responses, and removal of the long-lived administration secret;
|
|
229
|
+
- control-plane path denial, path canonicalization, symlink handling, sensitive/persistence targets, and object ownership;
|
|
230
|
+
- delegated sandbox behavior and fail-closed platform detection;
|
|
231
|
+
- process/session cleanup, generated-key rollback including cleanup failure, managed-job lifecycle and recovery, state locks, atomic persistence, and destructive removal;
|
|
232
|
+
- browser pairing, version/capability handshake, broker routing, independent concurrency limits, public-error redaction, sensitive input, and navigation controls;
|
|
233
|
+
- audit-chain integrity, privacy redaction, package contents, installation, release impact, dependency integrity, CodeQL, Scorecard findings, and GitHub publication guard/lock behavior;
|
|
137
234
|
- malformed, over-limit, concurrent, replayed, stale, and fault-injected inputs.
|
|
138
235
|
|
|
139
|
-
See [TESTING.md](TESTING.md) for the
|
|
236
|
+
See [TESTING.md](TESTING.md) for the test inventory and [AUDIT.md](AUDIT.md) for historical findings and residual limitations.
|
|
140
237
|
|
|
141
238
|
## Reporting
|
|
142
239
|
|