cavi-ai/
GitHub ↗

Capabilities

Tokens bind one principal to an explicit capability set and expiry. Revocation and expiry are checked again at dispatch, including long-lived MCP and CDP connections.

Wire strings (camelCase JSON uses these exact values):

CapabilityWire
Session read / writesession:read / session:write
Page read / writepage:read / page:write
Browser mutatebrowser:mutate
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

Operation → capability matrix

From InterfaceOperation::required (HTTP broker and MCP operations map to these):

OperationHTTP / MCPRequired capability
RuntimeInfoGET /v1/runtime / runtime_infosession:read
CreateSessionPOST /v1/sessions / session_createsession:write
DeleteSessionDELETE /v1/sessions/{id} / session_closesession:write
ReadSessionGET /v1/sessions / session_listsession:read
OpenPagePOST /v1/pages / page_openpage:write
ReadPageform_snapshotpage:read
SubmitCommandPOST /v1/commands / command_execute (+ flat MCP browser tools)browser:mutate
CreateCheckpointPOST /v1/checkpoints / checkpoint_saverecovery:write
ReadCheckpointGET /v1/recovery/{id} / recovery_statusrecovery:read
RecoverWorkflowPOST /v1/recovery/{id} / workflow_recoverrecovery:write
SubscribeEventsGET /v1/events / events_readsession:read
ReadArtifactGET /v1/artifacts/{id}artifact:read
ReadContextGET /v1/context/ask, GET /v1/context/site/{key} / context_neighborscontext:read
IssuePrincipalPOST /v1/principalsauthority:admin
RevokePrincipalDELETE /v1/principals/{id}authority:admin
SubmitJobPOST /v1/jobsjob:submit
ReadJobGET /v1/jobs/{id}job:read
CancelJobDELETE /v1/jobs/{id}job:cancel

activatePage / MCP page_activate and accessibilitySnapshot / MCP a11y_snapshot are primitive commands (via command_execute or the flat MCP tools), not separate /v1/pages/... routes. Both still require browser:mutate. See Accessibility snapshot.

Some interface operations (ClosePage, CaptureArtifact) exist in the type map for authority checks; prefer the documented HTTP/MCP surfaces above for public clients.

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)

Missing capability → missingCapability (HTTP 403) with requiredCapability set when known.