Skip to main content

Action Vocabulary

The qontinui runner and the wrapper SDK communicate via action names — short camelCase identifiers like getControlSnapshot, executeElementAction, find. The runner sends an action name with a payload; your wrapper's HandlerRegistry dispatches to the handler keyed by that string. A typo on either side fails silently with NO_HANDLER at runtime.

This page is the canonical reference for the vocabulary. If you're new to wrappers, read Authoring a Wrapper first.

Where the vocabulary is defined​

Two files are the source of truth — one per side of the protocol:

SideFileRole
Wrapper SDKui-bridge/packages/ui-bridge/src/server/relay-handlers.tsDefines every action handler available to apps. Each relayCommand('<name>', payload) / queueCommand<T>('<name>', payload) site is a registered action.
Runnerqontinui-runner/src-tauri/src/mcp/sdk_client.rsDispatches actions over WebSocket via dispatch_app_request(state, "<name>", ...). Each call is a runner-side use of the action.

The cross-language validator below diffs the two sets and fails CI if the runner dispatches an action the wrapper SDK has no handler for.

Action → HTTP route table​

The table below is auto-generated from sdk_client.rs by walking every /// METHOD /path — description\nasync fn handle_X(...) block and pairing it with the first dispatch_app_request(&state, "<action>", ...) site inside that handler's body. Regenerate with:

cd qontinui-runner
npm run validate:ws-actions -- --emit-doc docs-site/docs/wrappers/action-vocabulary.md

CI runs the equivalent --check-doc mode (via npm run check) and fails if the table is stale.

138 routes; regenerate via npm run validate:ws-actions -- --emit-doc docs-site/docs/wrappers/action-vocabulary.md.

ActionHTTP routeHandler
activateStatePOST /ui-bridge/sdk/state/:id/activate — Activate a statehandle_activate_state
activateStateGroupPOST /ui-bridge/sdk/state-group/:id/activate — Activate a state grouphandle_activate_state_group
aiAssertPOST /ui-bridge/sdk/ai/assert — AI-powered assertionshandle_ai_assert
aiAssertBatchPOST /ui-bridge/sdk/ai/assert/batch — Batch AI assertionshandle_ai_assert_batch
aiExecutePOST /ui-bridge/sdk/ai/execute — AI-powered action executionhandle_ai_execute
aiFindPOST /ui-bridge/sdk/ai/find — AI-powered element findinghandle_ai_find
aiSearchPOST /ui-bridge/sdk/ai/search — AI-powered element searchhandle_ai_search
aiSemanticSearchPOST /ui-bridge/sdk/ai/semantic-search — Semantic searchhandle_ai_semantic_search
analyzeMediaPOST /ui-bridge/sdk/ai/media/analyze — AI analysis of single media elementhandle_media_analyze
analyzeMediaBatchPOST /ui-bridge/sdk/ai/media/analyze/batch — AI analysis of multiple media elementshandle_media_analyze_batch
analyzeMediaPagePOST /ui-bridge/sdk/ai/media/analyze/page — AI analysis of all visible media on pagehandle_media_analyze_page
analyzePageDataGET /ui-bridge/sdk/ai/analyze/data — Extract page datahandle_ai_analyze_data
analyzePageRegionsGET /ui-bridge/sdk/ai/analyze/regions — Segment page regionshandle_ai_analyze_regions
analyzeStructuredChangesPOST /ui-bridge/sdk/ai/structured-changes — Analyze structured changeshandle_ct_structured_changes
analyzeStructuredDataGET /ui-bridge/sdk/ai/analyze/structured-data — Extract tables/listshandle_ai_analyze_structured_data
attemptRecoveryPOST /ui-bridge/sdk/ai/recovery/attempt — Attempt error recoveryhandle_recovery_attempt
canExecuteTransitionGET /ui-bridge/sdk/transition/:id/can-execute — Check if transition can executehandle_can_execute_transition
captureMediaSnapshotPOST /ui-bridge/sdk/ai/media/snapshot — Capture media snapshothandle_media_snapshot
captureSnapshotPOST /ui-bridge/sdk/render-log/snapshot — Capture render log snapshothandle_render_log_snapshot
categorizeLastDiffGET /ui-bridge/sdk/ai/categorize-last-diff — Categorize the last diffhandle_ct_categorize_last_diff
clearConsoleErrorsPOST /ui-bridge/sdk/console-errors/clear — Clear console errors in SDK apphandle_clear_console_errors
clearPerformanceEntriesPOST /ui-bridge/sdk/performance-entries/clear — Clear performance entrieshandle_clear_performance_entries
clearRenderLogDELETE /ui-bridge/sdk/render-log — Clear render loghandle_clear_render_log
clearStyleGuideDELETE /ui-bridge/sdk/design/style-guide — Clear loaded style guidehandle_design_clear_style_guide
clickBySelectorPOST /ui-bridge/sdk/page/click-by-selector — Click an element by CSS selectorhandle_click_by_selector
clickByTextPOST /ui-bridge/sdk/page/click-by-text — Click an element by visible texthandle_click_by_text
compareMediaSnapshotsPOST /ui-bridge/sdk/ai/media/compare — Compare two media snapshotshandle_media_compare
controlBatchPOST /ui-bridge/sdk/control/batch — Execute a batched control requesthandle_control_batch
crossAppComparePOST /ui-bridge/sdk/ai/analyze/cross-app-compare — Compare two snapshotshandle_ai_analyze_cross_app_compare
deactivateStatePOST /ui-bridge/sdk/state/:id/deactivate — Deactivate a statehandle_deactivate_state
deactivateStateGroupPOST /ui-bridge/sdk/state-group/:id/deactivate — Deactivate a state grouphandle_deactivate_state_group
deleteAnnotationDELETE /ui-bridge/sdk/annotations/:id — Delete an annotationhandle_annotation_delete
deleteBookmarkDELETE /ui-bridge/sdk/ai/bookmark/:name — Delete a bookmarkhandle_ct_delete_bookmark
deleteIntentDELETE /ui-bridge/sdk/control/intent/:name — Delete a registered intenthandle_delete_intent
diffBaselinePOST /ui-bridge/sdk/design/evaluate/diff — Diff quality baselinehandle_diff_baseline
diffFormsPOST /ui-bridge/sdk/forms/diff — Diff two form snapshotshandle_diff_forms
diffFromBookmarkGET /ui-bridge/sdk/ai/bookmark/:name/diff — Diff from a bookmarkhandle_ct_diff_from_bookmark
disableChangeBufferPOST /ui-bridge/sdk/ai/change-buffer/disable — Disable change bufferhandle_ct_disable_change_buffer
drainChangeBufferPOST /ui-bridge/sdk/ai/change-buffer/drain — Drain change bufferhandle_ct_drain_change_buffer
enableChangeBufferPOST /ui-bridge/sdk/ai/change-buffer/enable — Enable change bufferhandle_ct_enable_change_buffer
evaluateQualityPOST /ui-bridge/sdk/design/evaluate — Evaluate qualityhandle_evaluate_quality
executeBatchActionPOST /ui-bridge/sdk/control/batch-action — Execute a batch of element actionshandle_execute_batch_action
executeComponentActionPOST /ui-bridge/sdk/component/:id/action/:actionId — Execute component actionhandle_component_action
executeElementActionPOST /ui-bridge/sdk/element/:id/action — Execute an action on an elementhandle_element_action
executeIntentPOST /ui-bridge/sdk/ai/intents/execute — Execute an intenthandle_execute_intent
executeIntentFromQueryPOST /ui-bridge/sdk/ai/intents/execute-from-query — Execute intent from natural languagehandle_execute_intent_from_query
executeRedoPOST /ui-bridge/sdk/redo — Execute redohandle_redo
executeTransitionPOST /ui-bridge/sdk/transition/:id/execute — Execute a transitionhandle_execute_transition
executeUndoPOST /ui-bridge/sdk/undo — Execute undohandle_undo
executeWithDiffPOST /ui-bridge/sdk/ai/execute-with-diff — Execute action and return diffhandle_ct_execute_with_diff
exportAnnotationsGET /ui-bridge/sdk/annotations/export — Export annotationshandle_annotations_export
fillFormPOST /ui-bridge/sdk/fill — Smart form fillhandle_fill_form
findPOST /ui-bridge/sdk/discover — Find/discover elementshandle_discover
findByTextPOST /ui-bridge/sdk/page/find-by-text — Find elements by visible texthandle_find_by_text
findIntentPOST /ui-bridge/sdk/ai/intents/find — Find matching intentshandle_find_intent
findMediaPOST /ui-bridge/sdk/ai/media/find — Find media elements with filtershandle_media_find
findPathPOST /ui-bridge/sdk/states/find-path — Find path between stateshandle_find_path
getActionHistoryGET /ui-bridge/sdk/debug/action-history — Get action historyhandle_action_history
getActiveStatesGET /ui-bridge/sdk/states/active — Get active stateshandle_active_states
getAnnotationGET /ui-bridge/sdk/annotations/:id — Get a specific annotationhandle_annotation_get
getAnnotationCoverageGET /ui-bridge/sdk/annotations/coverage — Get annotation coveragehandle_annotations_coverage
getAnnotationsGET /ui-bridge/sdk/annotations — Get all annotationshandle_annotations
getBookmarkGET /ui-bridge/sdk/ai/bookmark/:name — Get a specific bookmarkhandle_ct_get_bookmark
getChangeBufferSizeGET /ui-bridge/sdk/ai/change-buffer/size — Get change buffer sizehandle_ct_get_change_buffer_size
getComponentStateGET /ui-bridge/sdk/component/:id/state — Get component statehandle_component_state
getConsoleErrorsGET /ui-bridge/sdk/console-errors — Get console errors from SDK apphandle_console_errors
getControlSnapshotGET /ui-bridge/sdk/component/:id — Get a single componenthandle_component
getControlSnapshotGET /ui-bridge/sdk/components — List componentshandle_components
getControlSnapshotGET /ui-bridge/sdk/states/snapshot — Get state snapshothandle_state_snapshot
getControlSnapshotGET /ui-bridge/sdk/workflows — List workflowshandle_workflows
getDesignSnapshotPOST /ui-bridge/sdk/design/snapshot — Design data for all/filtered elementshandle_design_snapshot
getDiagnosticsGET /ui-bridge/sdk/diagnostics — SDK diagnostic informationhandle_diagnostics
getElementGET /ui-bridge/sdk/element/:id — Get a single elementhandle_element
getElementHistoryGET /ui-bridge/sdk/control/element/:id/history — Get element historyhandle_element_history
getElementImagesGET /ui-bridge/sdk/control/element/:id/images — Get images associated with an elementhandle_element_images
getElementReactStateGET /ui-bridge/sdk/element/:id/state — Get element statehandle_element_state
getElementStateGET /ui-bridge/sdk/control/element/:id/state-generic — Get generic element statehandle_element_state_generic
getElementStateStylesPOST /ui-bridge/sdk/design/element/:id/state-styles — Styles across interaction stateshandle_design_element_state_styles
getElementStylesGET /ui-bridge/sdk/design/element/:id/styles — Extended computed styles for one elementhandle_design_element_styles
getElementTreeGET /ui-bridge/sdk/debug/element-tree — Get element treehandle_element_tree
getErrorReportGET /ui-bridge/sdk/error-report — Get error reporthandle_error_report
getErrorSessionsGET /ui-bridge/sdk/console/error-sessions — List all error session summarieshandle_console_error_sessions_list
getErrorSnapshotsGET /ui-bridge/sdk/error-snapshots — Get error snapshotshandle_error_snapshots
getFormsGET /ui-bridge/sdk/forms — Form state awarenesshandle_forms
getIdleSignalStatusGET /ui-bridge/sdk/idle-status/:signal — Get single signal idle status from SDK apphandle_idle_status_signal
getIdleStatusGET /ui-bridge/sdk/idle-status — Get idle status from SDK apphandle_idle_status
getNetworkRequestGET /ui-bridge/sdk/network-request/:id — Get specific request by IDhandle_network_request
getNetworkRequestsInFlightGET /ui-bridge/sdk/network-requests/in-flight — Currently in-flight requestshandle_network_requests_in_flight
getPageSummaryGET /ui-bridge/sdk/ai/summary — Page summaryhandle_ai_summary
getPerformanceEntriesGET /ui-bridge/sdk/performance-entries — Get performance entrieshandle_performance_entries
getQualityContextsGET /ui-bridge/sdk/design/evaluate/contexts — Get quality evaluation contextshandle_quality_contexts
getRenderLogGET /ui-bridge/sdk/render-log — Get render log entrieshandle_render_log
getResponsiveSnapshotsPOST /ui-bridge/sdk/design/responsive — Snapshots at multiple viewportshandle_design_responsive
getRoutesGET /ui-bridge/sdk/page/routes — List available routeshandle_page_routes
getScopedDiffPOST /ui-bridge/sdk/ai/scoped-diff — Get scoped diffhandle_ct_scoped_diff
getSemanticDiffGET /ui-bridge/sdk/ai/diff — Get semantic diffhandle_ai_diff
getSemanticSnapshotGET /ui-bridge/sdk/ai/snapshot — Semantic AI snapshothandle_ai_snapshot
getStateGET /ui-bridge/sdk/state/:id — Get a specific statehandle_get_state
getStateGroupsGET /ui-bridge/sdk/state-groups — Get all state groupshandle_state_groups
getStatesGET /ui-bridge/sdk/states — Get all stateshandle_states
getStyleGuideGET /ui-bridge/sdk/design/style-guide — Get loaded style guidehandle_design_get_style_guide
getTransitionsGET /ui-bridge/sdk/transitions — Get all transitionshandle_transitions
getUndoStateGET /ui-bridge/sdk/undo-state — Get undo/redo statehandle_undo_state
getWorkflowStatusGET /ui-bridge/sdk/workflow/:runId/status — Get workflow run statushandle_workflow_status
highlightElementPOST /ui-bridge/sdk/debug/highlight/:id — Highlight an elementhandle_debug_highlight
importAnnotationsPOST /ui-bridge/sdk/annotations/import — Import annotationshandle_annotations_import
listBookmarksGET /ui-bridge/sdk/ai/bookmarks — List all bookmarkshandle_ct_list_bookmarks
listIntentsGET /ui-bridge/sdk/ai/intents — List all intentshandle_list_intents
loadStyleGuidePOST /ui-bridge/sdk/design/style-guide/load — Load a style guidehandle_design_load_style_guide
mediaAuditAccessibilityPOST /ui-bridge/sdk/ai/media/audit/accessibility — Alt text audithandle_media_audit_accessibility
mediaAuditPerformancePOST /ui-bridge/sdk/ai/media/audit/performance — Performance audithandle_media_audit_performance
navigateByAdapterPOST /ui-bridge/sdk/page/navigate-to — Navigate using the navigation adapterhandle_navigate_by_adapter
navigateToPOST /ui-bridge/sdk/states/navigate — Navigate to a statehandle_navigate_to
pageGoBackPOST /ui-bridge/sdk/page/back — Go back in historyhandle_page_go_back
pageGoForwardPOST /ui-bridge/sdk/page/forward — Go forward in historyhandle_page_go_forward
pageNavigatePOST /ui-bridge/sdk/page/navigate — Navigate to a URLhandle_page_navigate
pageRefreshPOST /ui-bridge/sdk/page/refresh — Refresh the pagehandle_page_refresh
pageScrollPOST /ui-bridge/sdk/control/page/scroll — Scroll the page or a target elementhandle_page_scroll
readValuePOST /ui-bridge/sdk/page/read-value — Read a form element's valuehandle_read_value
registerIntentPOST /ui-bridge/sdk/ai/intents/register — Register an intenthandle_register_intent
runDesignAuditPOST /ui-bridge/sdk/design/audit — Run style audit against style guidehandle_design_audit
runWorkflowPOST /ui-bridge/sdk/workflow/:id/run — Run a workflowhandle_workflow_run
saveBaselinePOST /ui-bridge/sdk/design/evaluate/baseline — Save quality baselinehandle_save_baseline
saveBookmarkPOST /ui-bridge/sdk/ai/bookmarks — Save a bookmarkhandle_ct_save_bookmark
setAnnotationPUT /ui-bridge/sdk/annotations/:id — Set/update an annotationhandle_annotation_set
setViewportConstraintsPOST /ui-bridge/sdk/control/viewport — Set viewport constraints for the active windowhandle_set_viewport_constraints
snapshotFormsPOST /ui-bridge/sdk/forms/snapshot — Capture form state snapshothandle_snapshot_forms
summarizeDiffPOST /ui-bridge/sdk/ai/summarize-diff — Summarize a diff with budgethandle_ct_summarize_diff
typeIntoPOST /ui-bridge/sdk/page/type-into — Type text into an input fieldhandle_type_into
waitForChangePOST /ui-bridge/sdk/ai/wait-for-change — Wait for a change matching predicatehandle_ct_wait_for_change
waitForElementPOST /ui-bridge/sdk/control/wait-for-element — Wait for an element matching a queryhandle_wait_for_element_sdk
waitForElementByConditionPOST /ui-bridge/sdk/control/wait-for-element-by-condition — Wait until an element satisfies a conditionhandle_wait_for_element_by_condition
waitForElementRegisteredPOST /ui-bridge/sdk/control/wait-for-element-registered — Wait for an element to registerhandle_wait_for_element_registered
waitForIdlePOST /ui-bridge/sdk/wait-for-idle — Block until SDK app is idlehandle_wait_for_idle
waitForNetworkRequestPOST /ui-bridge/sdk/network-requests/wait — Wait for a specific request matching criteriahandle_wait_for_network_request
waitForRouteChangePOST /ui-bridge/sdk/control/wait-for-route-change — Wait for a router route changehandle_wait_for_route_change
waitForSignalIdlePOST /ui-bridge/sdk/wait-for-idle/:signal — Block until specific signal is idle in SDK apphandle_wait_for_signal
waitForTargetsPOST /ui-bridge/sdk/wait-for-targets — Wait for specific targets in SDK apphandle_wait_for_targets

Multiple rows for the same action mean the runner exposes multiple HTTP routes that share a handler — typically a /snapshot-flavored route that synthesizes a sub-view from getControlSnapshot.

Aliases that no longer exist​

These names appeared in older docs / scaffolder templates. They forward to canonical names in current relay-handlers.ts (with @deprecated JSDoc), so existing callers keep working but the canonical name is what goes over the wire:

DeprecatedCanonicalRemoved since
discoverfind21ef25e (ui-bridge)
clipboardReadgetClipboard21ef25e (ui-bridge)
clipboardWritesetClipboard21ef25e (ui-bridge)

Wrapper-only actions (no runner caller)​

Some actions exist on the wrapper-SDK side but the runner doesn't proxy them. They're intentional non-proxies, not gaps:

ActionWhy no runner route
pageEvaluateRunner uses IPC (ui_bridge_request_sync) instead — see handle_page_evaluate
queryRunner uses IPC — see handle_query_selector
getStateSnapshotRunner synthesizes from getControlSnapshot — see handle_state_snapshot
getSpecsRunner calls it via sdk_request directly from handle_discover_and_cache, not through the dispatch helper

If you add a new action to relay-handlers.ts and want it reachable via HTTP, add a matching dispatch_app_request site in sdk_client.rs — see Adding a new action below.

Validating action names​

The runner ships a cross-language validator that diffs the two action sets:

cd qontinui-runner
npm run validate:ws-actions

# verbose mode lists wrapper-only orphans
npm run validate:ws-actions -- --verbose

# regenerate the table above (writes to the path you pass)
npm run validate:ws-actions -- --emit-doc docs-site/docs/wrappers/action-vocabulary.md

# CI-style check that the committed table is in sync
npm run validate:ws-actions -- --check-doc docs-site/docs/wrappers/action-vocabulary.md

Sample default output:

runner sites=146, wrapper actions=150, missing=0, orphans=4
ok: every runner action has a matching wrapper handler

missing=0 means every action the runner dispatches has a matching handler in relay-handlers.ts. If missing > 0, the validator exits non-zero and lists the offenders — a wrapper running this version of the runner would silently fail with NO_HANDLER for those routes.

The validator is wired into npm run check for the runner, so CI fails on action-name drift before the change ships.

Adding a new action​

End-to-end checklist for adding action <X>:

  1. Wrapper SDK side (ui-bridge/packages/ui-bridge/src/server/relay-handlers.ts): add a handler method that calls relayCommand('<X>', payload) (or relayWithFallback if you have a server-side fallback).
  2. Browser-side wrapper (or your wrapper's transport.register('<X>', fn)): register the handler that actually does the work.
  3. Runner (qontinui-runner/src-tauri/src/mcp/sdk_client.rs):
    • Add a handler function handle_<x> with /// METHOD /path — description doc comment, and have its body call dispatch_app_request(&state, "<X>", payload, METHOD, "/control/<path>", body).
    • Add .route("/ui-bridge/sdk/control/<path>", post(handle_<x>)) (or get/delete) in the route registration block.
  4. Regenerate the doc table: npm run validate:ws-actions -- --emit-doc docs-site/docs/wrappers/action-vocabulary.md. Commit the diff alongside the source change.
  5. Validate: npm run validate:ws-actions — should still report missing=0, with runner sites increased by 1.
  6. Test: extend the wrapper-live-example smoke or add a curl-based assertion.

The runner's dispatch_app_request helper handles WS routing and HTTP fallback in one call — every retrofitted route follows the same pattern.