| # Find |
|
|
| `/find` lets PinchTab locate elements by natural-language description instead of CSS selectors or XPath. |
|
|
| It works against the accessibility snapshot for a tab and returns the best matching `ref`, which you can pass to `/action`. |
|
|
| ## Endpoints |
|
|
| PinchTab currently exposes two useful forms: |
|
|
| - `POST /find` |
| - `POST /tabs/{id}/find` |
|
|
| Use `POST /find` when you are talking directly to a bridge-style runtime or shorthand route and want to pass `tabId` in the request body. |
|
|
| Use `POST /tabs/{id}/find` when you already know the tab ID and want the orchestrator to route the request to the correct instance. |
|
|
| ## Request Body |
|
|
| | Field | Type | Required | Default | Description | |
| | --- | --- | --- | --- | --- | |
| | `query` | string | yes | - | Natural-language description of the target element | |
| | `tabId` | string | no | active tab | Tab ID when using `POST /find` | |
| | `threshold` | float | no | `0.3` | Minimum similarity score | |
| | `topK` | int | no | `3` | Maximum number of matches to return | |
| | `lexicalWeight` | float | no | matcher default | Override lexical score weight | |
| | `embeddingWeight` | float | no | matcher default | Override embedding score weight | |
| | `explain` | bool | no | `false` | Include per-match score breakdown | |
|
|
| ## Main Example |
|
|
| ```bash |
| curl -X POST http://localhost:9867/tabs/<tabId>/find \ |
| -H "Content-Type: application/json" \ |
| -d '{"query":"login button","threshold":0.3,"topK":3}' |
| # Response |
| { |
| "best_ref": "e5", |
| "confidence": "high", |
| "score": 0.85, |
| "matches": [ |
| { |
| "ref": "e5", |
| "score": 0.85, |
| "role": "button", |
| "name": "Log in" |
| } |
| ], |
| "strategy": "combined:lexical+embedding:hashing", |
| "threshold": 0.3, |
| "latency_ms": 2, |
| "element_count": 42 |
| } |
| ``` |
|
|
| There is no dedicated CLI `find` command at the moment. |
|
|
| ## Using `POST /find` |
|
|
| ```bash |
| curl -X POST http://localhost:9867/find \ |
| -H "Content-Type: application/json" \ |
| -d '{"tabId":"<tabId>","query":"search input"}' |
| # Response |
| { |
| "best_ref": "e7", |
| "confidence": "high", |
| "score": 0.91, |
| "matches": [ |
| { |
| "ref": "e7", |
| "score": 0.91, |
| "role": "textbox", |
| "name": "Search" |
| } |
| ], |
| "strategy": "combined:lexical+embedding:hashing", |
| "threshold": 0.3, |
| "latency_ms": 18, |
| "element_count": 142 |
| } |
| ``` |
|
|
| If `tabId` is omitted, PinchTab uses the active tab in the current bridge context. |
|
|
| ## Response Fields |
|
|
| | Field | Description | |
| | --- | --- | |
| | `best_ref` | Highest-scoring element reference to use with `/action` | |
| | `confidence` | `high`, `medium`, or `low` | |
| | `score` | Score of the best match | |
| | `matches` | Top matches above threshold | |
| | `strategy` | Matching strategy used | |
| | `threshold` | Threshold used for the request | |
| | `latency_ms` | Matching time in milliseconds | |
| | `element_count` | Number of elements evaluated | |
|
|
| When `explain` is enabled, each match may also include: |
|
|
| - `lexical_score` |
| - `embedding_score` |
| - `composite` |
|
|
| ## Confidence Levels |
|
|
| | Level | Score Range | Meaning | |
| | --- | --- | --- | |
| | `high` | `>= 0.80` | Usually safe to act on directly | |
| | `medium` | `0.60 - 0.79` | Reasonable match, but verify for critical actions | |
| | `low` | `< 0.60` | Weak match; rephrase the query or lower the threshold carefully | |
|
|
| ## Common Flow |
|
|
| The standard pattern is: |
|
|
| ```text |
| navigate -> find -> action |
| ``` |
|
|
| Example: |
|
|
| ```bash |
| curl -X POST http://localhost:9867/tabs/<tabId>/find \ |
| -H "Content-Type: application/json" \ |
| -d '{"query":"username input"}' |
| # Response |
| { |
| "best_ref": "e14", |
| "confidence": "high", |
| "score": 0.85 |
| } |
| ``` |
|
|
| Then use the returned ref: |
|
|
| ```bash |
| curl -X POST http://localhost:9867/tabs/<tabId>/action \ |
| -H "Content-Type: application/json" \ |
| -d '{"ref":"e14","kind":"type","text":"user@example.com"}' |
| ``` |
|
|
| ## Operational Notes |
|
|
| - `/find` uses the tab's accessibility snapshot, not raw DOM selectors. |
| - If there is no cached snapshot, PinchTab tries to refresh it automatically before matching. |
| - Successful matches are useful inputs to `/action`, `/actions`, and higher-level recovery logic. |
| - A `200` response can still return an empty `best_ref` if nothing met the threshold. |
|
|
| ## Error Cases |
|
|
| | Status | Condition | |
| | --- | --- | |
| | `400` | invalid JSON or missing `query` | |
| | `404` | tab not found | |
| | `500` | Chrome not initialized, snapshot unavailable, or matcher failure | |
|
|