› cavi-ai/
GitHub ↗

Capabilities

A capability is a permission a token carries. Each token binds one principal to an explicit capability set and an expiry. The runtime checks the capability for every operation, and checks expiry and revocation again at dispatch, including on long-lived MCP and CDP connections. A missing capability returns missingCapability (HTTP 403) with requiredCapability set when known.

Choose a set when you create a credential (bobby init --preset) or issue a principal (POST /v1/principals). The tables below show what each operation needs and what each preset allows.

Capability names

JSON uses these exact strings:

CapabilityWire
Session read / writesession:read / session:write
Page read / writepage:read / page:write
Browser mutatebrowser:mutate
Network egressnetwork:egress
File upload / downloadfile:upload / file:download
JavaScript evaluatejavascript:evaluate
Intent executeintent:execute
Vision assistvision:assist
Artifact read / captureartifact:read / artifact:capture
Context readcontext:read
Recovery read / writerecovery:read / recovery:write
Job submit / read / canceljob:submit / job:read / job:cancel
Authority adminauthority:admin
Browser fingerprintbrowser:fingerprint
Browser humanizebrowser:humanize

<!-- BEGIN GENERATED INTERFACE SUPPORT -->

Generated operation support

direct means the adapter exposes the operation. via command means it is reached through submitCommand. The capability column is the direct operation gate; translated paths use browser:mutate plus nested command requirements.

OperationRequired capabilityHTTPMCPCDPACPEngine scope
runtimeInfosession:readdirectdirectdirect—engine-agnostic
createSessionsession:writedirectdirect—directChromium, Firefox
readSessionsession:readdirectdirectdirect—Chromium, Firefox
deleteSessionsession:writedirectdirect—directChromium, Firefox
openPagepage:writedirectdirectdirectdirectChromium, Firefox
readPagepage:readdirectdirectvia commandvia commandChromium, Firefox
closePagepage:writevia commandvia commandvia commandvia commandChromium, Firefox
submitCommandbrowser:mutatedirectdirectdirectdirectChromium, Firefox
createCheckpointrecovery:writedirectdirectdirectdirectChromium, Firefox
readCheckpointrecovery:readdirectdirectdirectdirectChromium, Firefox
recoverWorkflowrecovery:writedirectdirect—directChromium, Firefox
readArtifactartifact:readdirect———engine-agnostic
readContextcontext:readdirectdirect—directChromium, Firefox
captureArtifactartifact:capturevia commandvia commanddirect—Chromium, Firefox
subscribeEventssession:readdirectdirectdirect—Chromium, Firefox
submitJobjob:submitdirectdirect——engine-agnostic
readJobjob:readdirectdirect——engine-agnostic
cancelJobjob:canceldirectdirect——engine-agnostic
resolveJobjob:read, job:cancel, authority:admindirect———engine-agnostic
issuePrincipalauthority:admindirect———engine-agnostic
revokePrincipalauthority:admindirect———engine-agnostic

Execution-policy gates

These fields are opt-ins. The capability is checked at the listed operation before protected behavior runs.

executionPolicy fieldCapabilityEnforced atHTTPMCPCDPACPEngines
javascriptEvaluationjavascript:evaluatesubmitCommandyesyesyes—Chromium, Firefox
visionAssistvision:assistsubmitCommandyesyes—yesChromium, Firefox
fingerprintbrowser:fingerprintcreateSessionyesyes——Chromium, Firefox
humanizebrowser:humanizecreateSessionyesyes——Chromium, Firefox

Engine-specific option support

GET /v1/runtime reports configured implementation features in capabilities, such as engine:firefox:captureScreenshot.viewport. Session engine, credential capabilities, execution policy, and connection health still govern each call. These options supplement the operation and policy tables above.

Operation or optionchromiumfirefox
captureScreenshot.viewportyesyes
captureScreenshot.fullPageyesno
captureScreenshot.clipyesno
setCookies.httpOnlyyesno
deleteCookies.httpOnlyyesno
setFocusEmulationyesno
setEmulatedMediayesno
waitFor.networkQuietyesyes
evaluateJavaScriptyesyes

<!-- END GENERATED INTERFACE SUPPORT -->

Session availability

Use GET /v1/sessions/{session}/capabilities, MCP session_capabilities, or the SDK helpers session_capabilities (Rust/Python) and sessionCapabilities (TypeScript) to inspect an owned session. The query requires session:read. It reports schema version 1, the session ID, observation time, selected engine, connection state, and feature observations. Existing session-list responses are unchanged.

Each feature has supported (true, false, or null when unknown), available, reason, requiredCapabilities, and policyRequirement. Availability combines the selected worker's implementation support, current credential grants, execution policy, writable command storage, and passively observed connection state. JavaScript evaluation requires browser:mutate, javascript:evaluate, and javascriptEvaluation. Other listed options require browser:mutate.

Unavailable reasons are unsupportedByEngine, missingCapability, policyDisabled, storageUnavailable, workerUnavailable, connectionUnknown, disconnected, and metadataUnavailable. Custom workers without metadata report unknown support and remain unavailable. The query never starts, leases, reconnects, or sends messages to a browser.

This observation can become stale immediately. Dispatch rechecks authorization, policy, storage, page state, and attachment grants. available describes eligibility for a canonical command option; it does not guarantee execution success. Consult MCP tools/list for callable tools.

Privileged primitives (beyond browser:mutate)

Submitting a command still requires browser:mutate. Nested commands add:

Command familyExtra capability
File uploadfile:upload
File downloadfile:download
Evaluate JavaScriptjavascript:evaluate (+ session executionPolicy.javascriptEvaluation)
Any intentintent:execute
Intent + file fill (fill / completeForm with files)intent:execute and file:upload
Vision escalationvision:assist (+ session executionPolicy.visionAssist + reachable [vision] / vision node endpoint)
Structured extraction (extractStructured / MCP extract_structured)vision:assist (+ session executionPolicy.visionAssist + reachable [vision] / vision node endpoint)
Fingerprint spoofingbrowser:fingerprint at session creation (+ session executionPolicy.fingerprint)
Humanized input timingbrowser:humanize at session creation (+ session executionPolicy.humanize)

<!-- BEGIN GENERATED PRESET MATRIX -->

Generated preset matrix

bobby init --preset <name> mints the loopback credential with one of these sets. A call that needs a capability the credential lacks fails with missingCapability.

CapabilityLets a principalunrestrictedagentclaudecodexopenshell
session:readlist sessions, read runtime info, subscribe to eventsyesyesyesyesyes
session:writecreate and delete sessionsyesyesyesyesyes
page:readread page stateyesyesyesyesyes
page:writeopen and close pagesyesyesyesyesyes
browser:mutatesubmit commands: navigate, click, typeyesyesyesyesyes
network:egressrun the HTTP job handlers (http_probe, http_wait, http_fetch)yesyesyesyes—
file:uploadupload local files into the pageyesyesyesyesyes
file:downloaddownload files to diskyesyesyesyesyes
javascript:evaluaterun JavaScript in the pageyesyes———
intent:executerun intent commands (locate, fill, submit, follow)yesyesyesyesyes
vision:assistescalate stuck intents and extraction to a vision modelyesyesyesyes—
artifact:readread stored artifactsyesyesyesyesyes
context:readread remembered site structureyesyesyesyesyes
artifact:capturecapture screenshots and other artifactsyesyesyesyesyes
recovery:readread checkpoints and recovery stateyesyesyesyesyes
recovery:writesave checkpoints and recover workflowsyesyesyesyesyes
job:submitsubmit background jobsyesyesyesyes—
job:readread background jobsyesyesyesyes—
job:cancelcancel background jobsyesyesyesyes—
authority:adminmint and revoke principalsyes————
browser:fingerprintspoof the browser fingerprintyesyes———
browser:humanizehumanize input timingyesyes———

What each preset cannot do

  • unrestricted: local operator: every capability, including authority:admin. Nothing is withheld.
  • agent: no authority:admin; every other capability. Cannot:

- mint and revoke principals (authority:admin: resolveJob, issuePrincipal, revokePrincipal)

  • claude: the shipped agent skill's workflow: no JavaScript evaluation, fingerprint, humanize, or authority:admin. Cannot:

- run JavaScript in the page (javascript:evaluate: executionPolicy.javascriptEvaluation) - mint and revoke principals (authority:admin: resolveJob, issuePrincipal, revokePrincipal) - spoof the browser fingerprint (browser:fingerprint: executionPolicy.fingerprint) - humanize input timing (browser:humanize: executionPolicy.humanize)

  • codex: the shipped agent skill's workflow: no JavaScript evaluation, fingerprint, humanize, or authority:admin. Cannot:

- run JavaScript in the page (javascript:evaluate: executionPolicy.javascriptEvaluation) - mint and revoke principals (authority:admin: resolveJob, issuePrincipal, revokePrincipal) - spoof the browser fingerprint (browser:fingerprint: executionPolicy.fingerprint) - humanize input timing (browser:humanize: executionPolicy.humanize)

  • openshell: sandboxed tenant: browse, intents, files, evidence, and recovery only. Cannot:

- run the HTTP job handlers (http_probe, http_wait, http_fetch) (network:egress: checked by the job or command that uses it) - run JavaScript in the page (javascript:evaluate: executionPolicy.javascriptEvaluation) - escalate stuck intents and extraction to a vision model (vision:assist: executionPolicy.visionAssist) - submit background jobs (job:submit: submitJob) - read background jobs (job:read: readJob, resolveJob) - cancel background jobs (job:cancel: cancelJob, resolveJob) - mint and revoke principals (authority:admin: resolveJob, issuePrincipal, revokePrincipal) - spoof the browser fingerprint (browser:fingerprint: executionPolicy.fingerprint) - humanize input timing (browser:humanize: executionPolicy.humanize) <!-- END GENERATED PRESET MATRIX -->