> Call the `diagnose` tool first. Full index: /llms.txt. Errors: /reference/problems.

# Requests and the live phone

## `requests`

Read the cards TaloTrace opens for you and answer them.

Annotations: can change or delete data.

### `requests answer_card`

Answer or skip a card.

| Argument     | Type                                                                                                                                                         | Required | What it is                     |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ------------------------------ |
| `project_id` | `string`                                                                                                                                                     | yes      | The project the call is about. |
| `card_id`    | `string`                                                                                                                                                     | yes      |                                |
| `language`   | `string`                                                                                                                                                     | yes      |                                |
| `answer`     | `MissingOrRequestCardAnswer \| QuestionAnswer \| SaveStatementCardAnswer \| TestMismatchCardAnswer \| AppDiffersCardAnswer \| ConfirmSeenCardAnswer \| null` | no       |                                |
| `skip`       | `boolean`                                                                                                                                                    | no       |                                |

### `requests list`

List cards, or only those opened or settled since a cursor.

| Argument       | Type              | Required | What it is                     |
| -------------- | ----------------- | -------- | ------------------------------ |
| `project_id`   | `string`          | yes      | The project the call is about. |
| `state`        | `CardListState`   | no       |                                |
| `limit`        | `integer \| null` | no       |                                |
| `cursor`       | `string \| null`  | no       |                                |
| `since_cursor` | `string \| null`  | no       |                                |

```json
{
  "$defs": {
    "AppDiffersAnswer": {
      "description": "Which side of a document-versus-app disagreement is right.",
      "enum": [
        "app_bug",
        "document_outdated"
      ],
      "title": "AppDiffersAnswer",
      "type": "string"
    },
    "AppDiffersCardAnswer": {
      "description": "Answers an ``app_differs`` card.",
      "properties": {
        "verdict": {
          "$ref": "#/$defs/AppDiffersAnswer"
        }
      },
      "required": [
        "verdict"
      ],
      "title": "AppDiffersCardAnswer",
      "type": "object"
    },
    "BugSeverity": {
      "description": "The single severity vocabulary for bugs, findings, tickets, APIs and persistence.\n\nJira priority, UI colour and presentation-only impact labels are derived at adapter\nedges so the P3/P4 distinction is never lost in the canonical data.",
      "enum": [
        "P0",
        "P1",
        "P2",
        "P3",
        "P4"
      ],
      "title": "BugSeverity",
      "type": "string"
    },
    "CardListState": {
      "enum": [
        "open",
        "done",
        "changed"
      ],
      "title": "CardListState",
      "type": "string"
    },
    "CodeBinding": {
      "description": "A ``code`` field's value: an OTP binding reference in the identity broker (5.2).",
      "properties": {
        "binding_ref": {
          "maxLength": 512,
          "minLength": 1,
          "title": "Binding Ref",
          "type": "string"
        }
      },
      "required": [
        "binding_ref"
      ],
      "title": "CodeBinding",
      "type": "object"
    },
    "ConfirmSeenCardAnswer": {
      "description": "Answers a ``confirm_seen`` card: one verdict per claim mid of its payload. The receiver\nchecks the mids against the card's claims.",
      "properties": {
        "verdicts": {
          "additionalProperties": {
            "$ref": "#/$defs/SeenClaimAnswer"
          },
          "maxProperties": 10,
          "propertyNames": {
            "minLength": 1
          },
          "title": "Verdicts",
          "type": "object"
        }
      },
      "required": [
        "verdicts"
      ],
      "title": "ConfirmSeenCardAnswer",
      "type": "object"
    },
    "DepositCodeInput": {
      "properties": {
        "key": {
          "default": false,
          "title": "Key",
          "type": "boolean"
        },
        "kind": {
          "const": "code",
          "default": "code",
          "title": "Kind",
          "type": "string"
        },
        "value": {
          "$ref": "#/$defs/CodeBinding"
        }
      },
      "required": [
        "value"
      ],
      "title": "DepositCodeInput",
      "type": "object"
    },
    "DepositFileInput": {
      "properties": {
        "key": {
          "default": false,
          "title": "Key",
          "type": "boolean"
        },
        "kind": {
          "const": "file",
          "default": "file",
          "title": "Kind",
          "type": "string"
        },
        "object": {
          "maxLength": 1024,
          "minLength": 1,
          "title": "Object",
          "type": "string"
        }
      },
      "required": [
        "object"
      ],
      "title": "DepositFileInput",
      "type": "object"
    },
    "DepositSecretInput": {
      "properties": {
        "key": {
          "default": false,
          "title": "Key",
          "type": "boolean"
        },
        "kind": {
          "const": "secret",
          "default": "secret",
          "title": "Kind",
          "type": "string"
        },
        "value": {
          "$ref": "#/$defs/SealedBox"
        }
      },
      "required": [
        "value"
      ],
      "title": "DepositSecretInput",
      "type": "object"
    },
    "DepositTextInput": {
      "properties": {
        "key": {
          "default": false,
          "title": "Key",
          "type": "boolean"
        },
        "kind": {
          "const": "text",
          "default": "text",
          "title": "Kind",
          "type": "string"
        },
        "value": {
          "minLength": 1,
          "title": "Value",
          "type": "string"
        }
      },
      "required": [
        "value"
      ],
      "title": "DepositTextInput",
      "type": "object"
    },
    "MissingOrRequestCardAnswer": {
      "description": "Answers a `missing` or `request` card: fill in the fields, or point at an item that\nalready has them (5.6). The same shape either way -- both payloads ask for the same\n`needed_fields`/`missing_fields` map, and the answer fills it the same way.",
      "properties": {
        "fields": {
          "additionalProperties": {
            "discriminator": {
              "mapping": {
                "code": "#/$defs/DepositCodeInput",
                "file": "#/$defs/DepositFileInput",
                "secret": "#/$defs/DepositSecretInput",
                "text": "#/$defs/DepositTextInput"
              },
              "propertyName": "kind"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/DepositTextInput"
              },
              {
                "$ref": "#/$defs/DepositSecretInput"
              },
              {
                "$ref": "#/$defs/DepositFileInput"
              },
              {
                "$ref": "#/$defs/DepositCodeInput"
              }
            ]
          },
          "title": "Fields",
          "type": "object"
        },
        "item_id": {
          "anyOf": [
            {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Item Id"
        }
      },
      "title": "MissingOrRequestCardAnswer",
      "type": "object"
    },
    "QuestionAnswer": {
      "description": "One answer, whatever the widget. ``text`` is the free text: the \"Something else\" row, a\n``text`` question's value, or a note beside an option. ``payload`` is a rich widget's typed\nvalue.",
      "properties": {
        "fields": {
          "additionalProperties": {
            "maxLength": 20000,
            "type": "string"
          },
          "maxProperties": 16,
          "title": "Fields",
          "type": "object"
        },
        "option_keys": {
          "default": [],
          "items": {
            "type": "string"
          },
          "maxItems": 200,
          "title": "Option Keys",
          "type": "array"
        },
        "payload": {
          "additionalProperties": true,
          "title": "Payload",
          "type": "object"
        },
        "text": {
          "default": "",
          "maxLength": 20000,
          "title": "Text",
          "type": "string"
        }
      },
      "title": "QuestionAnswer",
      "type": "object"
    },
    "RequestsAnswerCardCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "answer_card",
          "title": "Action",
          "type": "string"
        },
        "answer": {
          "anyOf": [
            {
              "$ref": "#/$defs/MissingOrRequestCardAnswer"
            },
            {
              "$ref": "#/$defs/QuestionAnswer"
            },
            {
              "$ref": "#/$defs/SaveStatementCardAnswer"
            },
            {
              "$ref": "#/$defs/TestMismatchCardAnswer"
            },
            {
              "$ref": "#/$defs/AppDiffersCardAnswer"
            },
            {
              "$ref": "#/$defs/ConfirmSeenCardAnswer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Answer"
        },
        "card_id": {
          "minLength": 1,
          "title": "Card Id",
          "type": "string"
        },
        "language": {
          "maxLength": 35,
          "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$",
          "title": "Language",
          "type": "string"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        },
        "skip": {
          "default": false,
          "title": "Skip",
          "type": "boolean"
        }
      },
      "required": [
        "action",
        "project_id",
        "card_id",
        "language"
      ],
      "title": "RequestsAnswerCardCall",
      "type": "object"
    },
    "RequestsListCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "list",
          "title": "Action",
          "type": "string"
        },
        "cursor": {
          "anyOf": [
            {
              "minLength": 1,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Cursor"
        },
        "limit": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Limit"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        },
        "since_cursor": {
          "anyOf": [
            {
              "minLength": 1,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Since Cursor"
        },
        "state": {
          "$ref": "#/$defs/CardListState",
          "default": "open"
        }
      },
      "required": [
        "action",
        "project_id"
      ],
      "title": "RequestsListCall",
      "type": "object"
    },
    "SaveStatementCardAnswer": {
      "description": "Confirms a `save_statement` card with the statement to keep, as the customer left it after\nany edit. Declining is `skip`.",
      "properties": {
        "statement": {
          "maxLength": 4000,
          "minLength": 1,
          "title": "Statement",
          "type": "string"
        }
      },
      "required": [
        "statement"
      ],
      "title": "SaveStatementCardAnswer",
      "type": "object"
    },
    "SealedBox": {
      "description": "A libsodium ``crypto_box_seal`` ciphertext over ``{tenant, field, value}`` (5.3).\n\nWrite-only after sealing: nothing in this package can recover ``value`` from ``sealed``.\nOnly the identity broker holds the private key that opens it, and only for the tenant and\nfield it was sealed under (:mod:`talotrace_contracts.identity.sealing`). Every writer --\nthe browser, the Suite reader, the engines -- sends a value already in this shape: Deposit\nnever seals a value itself, except the two named exceptions of 1.1 item 5, which seal it at\norch's edge before it ever reaches this shape.",
      "properties": {
        "key_id": {
          "maxLength": 64,
          "minLength": 1,
          "title": "Key Id",
          "type": "string"
        },
        "sealed": {
          "minLength": 1,
          "title": "Sealed",
          "type": "string"
        }
      },
      "required": [
        "sealed",
        "key_id"
      ],
      "title": "SealedBox",
      "type": "object"
    },
    "SeenClaimAnswer": {
      "description": "The customer's verdict on one claim only an exploration has seen.",
      "enum": [
        "correct",
        "wrong"
      ],
      "title": "SeenClaimAnswer",
      "type": "string"
    },
    "TestMismatchCardAnswer": {
      "description": "Answers a `test_mismatch` card. ``severity`` is the owner's pick for a ``product_bug``.",
      "properties": {
        "choice": {
          "$ref": "#/$defs/TestMismatchChoice"
        },
        "severity": {
          "anyOf": [
            {
              "$ref": "#/$defs/BugSeverity"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "choice"
      ],
      "title": "TestMismatchCardAnswer",
      "type": "object"
    },
    "TestMismatchChoice": {
      "description": "The answer to a test mismatch, on the card and in every Quality question shape.",
      "enum": [
        "update_test",
        "product_bug"
      ],
      "title": "TestMismatchChoice",
      "type": "string"
    }
  },
  "discriminator": {
    "mapping": {
      "answer_card": "#/$defs/RequestsAnswerCardCall",
      "list": "#/$defs/RequestsListCall"
    },
    "propertyName": "action"
  },
  "oneOf": [
    {
      "$ref": "#/$defs/RequestsListCall"
    },
    {
      "$ref": "#/$defs/RequestsAnswerCardCall"
    }
  ],
  "type": "object"
}
```

## `dev_session`

Start, check, keep alive, rebuild, share and stop a live phone that runs your working tree.

Annotations: can change or delete data.

### `dev_session keep_alive`

Tell TaloTrace the session is still in use.

| Argument         | Type     | Required | What it is                     |
| ---------------- | -------- | -------- | ------------------------------ |
| `project_id`     | `string` | yes      | The project the call is about. |
| `dev_session_id` | `string` | yes      |                                |

### `dev_session rebuild`

Install a rebuilt build on the live phone.

| Argument         | Type     | Required | What it is                     |
| ---------------- | -------- | -------- | ------------------------------ |
| `project_id`     | `string` | yes      | The project the call is about. |
| `dev_session_id` | `string` | yes      |                                |
| `build_id`       | `string` | yes      |                                |

### `dev_session share`

Make a link others can watch the live phone through.

| Argument             | Type              | Required | What it is                     |
| -------------------- | ----------------- | -------- | ------------------------------ |
| `audience`           | `ShareAudience`   | no       |                                |
| `expires_in_seconds` | `integer \| null` | no       |                                |
| `project_id`         | `string`          | yes      | The project the call is about. |
| `dev_session_id`     | `string`          | yes      |                                |

### `dev_session start`

Start a live phone for an app.

| Argument       | Type                          | Required | What it is                     |
| -------------- | ----------------------------- | -------- | ------------------------------ |
| `project_id`   | `string`                      | yes      | The project the call is about. |
| `app_id`       | `string`                      | yes      |                                |
| `framework`    | `"react_native" \| "flutter"` | yes      |                                |
| `workspace_id` | `string`                      | yes      |                                |
| `build_id`     | `string`                      | yes      |                                |
| `app_scheme`   | `string \| null`              | no       |                                |
| `metro_port`   | `integer`                     | no       |                                |

### `dev_session status`

Show the live phone's state.

| Argument         | Type             | Required | What it is                     |
| ---------------- | ---------------- | -------- | ------------------------------ |
| `project_id`     | `string`         | yes      | The project the call is about. |
| `dev_session_id` | `string \| null` | no       |                                |

### `dev_session stop`

Stop the live phone.

| Argument         | Type     | Required | What it is                     |
| ---------------- | -------- | -------- | ------------------------------ |
| `project_id`     | `string` | yes      | The project the call is about. |
| `dev_session_id` | `string` | yes      |                                |

```json
{
  "$defs": {
    "DevSessionKeepAliveCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "keep_alive",
          "default": "keep_alive",
          "title": "Action",
          "type": "string"
        },
        "dev_session_id": {
          "minLength": 1,
          "title": "Dev Session Id",
          "type": "string"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        }
      },
      "required": [
        "project_id",
        "dev_session_id"
      ],
      "title": "DevSessionKeepAliveCall",
      "type": "object"
    },
    "DevSessionRebuildCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "rebuild",
          "default": "rebuild",
          "title": "Action",
          "type": "string"
        },
        "build_id": {
          "minLength": 1,
          "title": "Build Id",
          "type": "string"
        },
        "dev_session_id": {
          "minLength": 1,
          "title": "Dev Session Id",
          "type": "string"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        }
      },
      "required": [
        "project_id",
        "dev_session_id",
        "build_id"
      ],
      "title": "DevSessionRebuildCall",
      "type": "object"
    },
    "DevSessionShareCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "share",
          "default": "share",
          "title": "Action",
          "type": "string"
        },
        "audience": {
          "$ref": "#/$defs/ShareAudience",
          "default": "team"
        },
        "dev_session_id": {
          "minLength": 1,
          "title": "Dev Session Id",
          "type": "string"
        },
        "expires_in_seconds": {
          "anyOf": [
            {
              "maximum": 3600,
              "minimum": 1,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Expires In Seconds"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        }
      },
      "required": [
        "project_id",
        "dev_session_id"
      ],
      "title": "DevSessionShareCall",
      "type": "object"
    },
    "DevSessionStartCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "start",
          "default": "start",
          "title": "Action",
          "type": "string"
        },
        "app_id": {
          "minLength": 1,
          "title": "App Id",
          "type": "string"
        },
        "app_scheme": {
          "anyOf": [
            {
              "maxLength": 64,
              "pattern": "^[a-z][a-z0-9+.-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "App Scheme"
        },
        "build_id": {
          "minLength": 1,
          "title": "Build Id",
          "type": "string"
        },
        "framework": {
          "enum": [
            "react_native",
            "flutter"
          ],
          "title": "Framework",
          "type": "string"
        },
        "metro_port": {
          "default": 8081,
          "maximum": 65535,
          "minimum": 1,
          "title": "Metro Port",
          "type": "integer"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        },
        "workspace_id": {
          "title": "Workspace Id",
          "type": "string"
        }
      },
      "required": [
        "project_id",
        "app_id",
        "framework",
        "workspace_id",
        "build_id"
      ],
      "title": "DevSessionStartCall",
      "type": "object"
    },
    "DevSessionStatusCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "status",
          "default": "status",
          "title": "Action",
          "type": "string"
        },
        "dev_session_id": {
          "anyOf": [
            {
              "minLength": 1,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Dev Session Id"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        }
      },
      "required": [
        "project_id"
      ],
      "title": "DevSessionStatusCall",
      "type": "object"
    },
    "DevSessionStopCall": {
      "additionalProperties": false,
      "properties": {
        "action": {
          "const": "stop",
          "default": "stop",
          "title": "Action",
          "type": "string"
        },
        "dev_session_id": {
          "minLength": 1,
          "title": "Dev Session Id",
          "type": "string"
        },
        "project_id": {
          "description": "The project the call is about.",
          "minLength": 1,
          "title": "Project Id",
          "type": "string"
        }
      },
      "required": [
        "project_id",
        "dev_session_id"
      ],
      "title": "DevSessionStopCall",
      "type": "object"
    },
    "ShareAudience": {
      "description": "Who may open a watch link besides holding it.",
      "enum": [
        "team",
        "link"
      ],
      "title": "ShareAudience",
      "type": "string"
    }
  },
  "discriminator": {
    "mapping": {
      "keep_alive": "#/$defs/DevSessionKeepAliveCall",
      "rebuild": "#/$defs/DevSessionRebuildCall",
      "share": "#/$defs/DevSessionShareCall",
      "start": "#/$defs/DevSessionStartCall",
      "status": "#/$defs/DevSessionStatusCall",
      "stop": "#/$defs/DevSessionStopCall"
    },
    "propertyName": "action"
  },
  "oneOf": [
    {
      "$ref": "#/$defs/DevSessionStartCall"
    },
    {
      "$ref": "#/$defs/DevSessionStatusCall"
    },
    {
      "$ref": "#/$defs/DevSessionKeepAliveCall"
    },
    {
      "$ref": "#/$defs/DevSessionRebuildCall"
    },
    {
      "$ref": "#/$defs/DevSessionStopCall"
    },
    {
      "$ref": "#/$defs/DevSessionShareCall"
    }
  ],
  "type": "object"
}
```

## `device`

Tap, type, swipe, press a key, open a link, take a screenshot or read logs on the live phone.

Annotations: can change or delete data.

| Argument         | Type                                                                                                                                | Required | What it is                     |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------ |
| `project_id`     | `string`                                                                                                                            | yes      | The project the call is about. |
| `dev_session_id` | `string`                                                                                                                            | yes      |                                |
| `request`        | `DeviceTap \| DeviceTapPoint \| DeviceTypeText \| DeviceSwipe \| DevicePressKey \| DeviceOpenUrl \| DeviceScreenshot \| DeviceLogs` | yes      |                                |

```json
{
  "$defs": {
    "DeviceKey": {
      "description": "A key the phone presses. A native lane offers no Enter key yet, so none is named.",
      "enum": [
        "back",
        "home"
      ],
      "title": "DeviceKey",
      "type": "string"
    },
    "DeviceLogs": {
      "properties": {
        "action": {
          "const": "logs",
          "default": "logs",
          "title": "Action",
          "type": "string"
        },
        "since_seconds": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Since Seconds"
        }
      },
      "title": "DeviceLogs",
      "type": "object"
    },
    "DeviceOpenUrl": {
      "properties": {
        "action": {
          "const": "open_url",
          "default": "open_url",
          "title": "Action",
          "type": "string"
        },
        "url": {
          "maxLength": 2048,
          "minLength": 1,
          "title": "Url",
          "type": "string"
        }
      },
      "required": [
        "url"
      ],
      "title": "DeviceOpenUrl",
      "type": "object"
    },
    "DevicePoint": {
      "description": "A place on the screen as the caller saw it, as fractions of the frame's width and height.",
      "properties": {
        "x": {
          "maximum": 1,
          "minimum": 0,
          "title": "X",
          "type": "number"
        },
        "y": {
          "maximum": 1,
          "minimum": 0,
          "title": "Y",
          "type": "number"
        }
      },
      "required": [
        "x",
        "y"
      ],
      "title": "DevicePoint",
      "type": "object"
    },
    "DevicePressKey": {
      "properties": {
        "action": {
          "const": "press_key",
          "default": "press_key",
          "title": "Action",
          "type": "string"
        },
        "key": {
          "$ref": "#/$defs/DeviceKey"
        }
      },
      "required": [
        "key"
      ],
      "title": "DevicePressKey",
      "type": "object"
    },
    "DeviceScreenshot": {
      "properties": {
        "action": {
          "const": "screenshot",
          "default": "screenshot",
          "title": "Action",
          "type": "string"
        }
      },
      "title": "DeviceScreenshot",
      "type": "object"
    },
    "DeviceSwipe": {
      "properties": {
        "action": {
          "const": "swipe",
          "default": "swipe",
          "title": "Action",
          "type": "string"
        },
        "direction": {
          "$ref": "#/$defs/SwipeDirection"
        }
      },
      "required": [
        "direction"
      ],
      "title": "DeviceSwipe",
      "type": "object"
    },
    "DeviceTap": {
      "properties": {
        "action": {
          "const": "tap",
          "default": "tap",
          "title": "Action",
          "type": "string"
        },
        "target": {
          "minLength": 1,
          "title": "Target",
          "type": "string"
        }
      },
      "required": [
        "target"
      ],
      "title": "DeviceTap",
      "type": "object"
    },
    "DeviceTapPoint": {
      "properties": {
        "action": {
          "const": "tap_point",
          "default": "tap_point",
          "title": "Action",
          "type": "string"
        },
        "at": {
          "$ref": "#/$defs/DevicePoint"
        }
      },
      "required": [
        "at"
      ],
      "title": "DeviceTapPoint",
      "type": "object"
    },
    "DeviceTypeText": {
      "properties": {
        "action": {
          "const": "type_text",
          "default": "type_text",
          "title": "Action",
          "type": "string"
        },
        "at": {
          "anyOf": [
            {
              "$ref": "#/$defs/DevicePoint"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "target": {
          "anyOf": [
            {
              "minLength": 1,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Target"
        },
        "text": {
          "minLength": 1,
          "title": "Text",
          "type": "string"
        }
      },
      "required": [
        "text"
      ],
      "title": "DeviceTypeText",
      "type": "object"
    },
    "SwipeDirection": {
      "enum": [
        "up",
        "down",
        "left",
        "right"
      ],
      "title": "SwipeDirection",
      "type": "string"
    }
  },
  "additionalProperties": false,
  "properties": {
    "dev_session_id": {
      "minLength": 1,
      "title": "Dev Session Id",
      "type": "string"
    },
    "project_id": {
      "description": "The project the call is about.",
      "minLength": 1,
      "title": "Project Id",
      "type": "string"
    },
    "request": {
      "discriminator": {
        "mapping": {
          "logs": "#/$defs/DeviceLogs",
          "open_url": "#/$defs/DeviceOpenUrl",
          "press_key": "#/$defs/DevicePressKey",
          "screenshot": "#/$defs/DeviceScreenshot",
          "swipe": "#/$defs/DeviceSwipe",
          "tap": "#/$defs/DeviceTap",
          "tap_point": "#/$defs/DeviceTapPoint",
          "type_text": "#/$defs/DeviceTypeText"
        },
        "propertyName": "action"
      },
      "oneOf": [
        {
          "$ref": "#/$defs/DeviceTap"
        },
        {
          "$ref": "#/$defs/DeviceTapPoint"
        },
        {
          "$ref": "#/$defs/DeviceTypeText"
        },
        {
          "$ref": "#/$defs/DeviceSwipe"
        },
        {
          "$ref": "#/$defs/DevicePressKey"
        },
        {
          "$ref": "#/$defs/DeviceOpenUrl"
        },
        {
          "$ref": "#/$defs/DeviceScreenshot"
        },
        {
          "$ref": "#/$defs/DeviceLogs"
        }
      ],
      "title": "Request"
    }
  },
  "required": [
    "project_id",
    "dev_session_id",
    "request"
  ],
  "title": "DeviceCall",
  "type": "object"
}
```