# airdress.device_join.*

{/* Generated by scripts/generate-event-reference.mjs from https://schemas.airdress.co/operator/events/v1.json (operator v0.1.138).
    Do not edit by hand: run `pnpm generate:event-reference` and commit the result. */}

The events in the `airdress.device_join` family. How to read a section, and what
each audience means, is on the [event reference](/events/) page.

## `airdress.device_join.approved`

Owner info App stream Functions

An enrolled device approved a join request; the sealed root is in the slot. Does not tell the other devices which one approved.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **The app's event stream**, as `device_join_approved`: devices it concerns hear of it at once.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.133.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `approved_by_enrollment` | string (uuid) | yes |  |
| `at` | string | yes |  |
| `request_id` | string (uuid) | yes |  |
| `slot_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "An enrolled device approved a join request; the sealed root is in the slot. Does not tell the other devices which one approved.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "approved_by_enrollment": {
      "format": "uuid",
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    },
    "slot_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "approved_by_enrollment",
    "at",
    "request_id",
    "slot_id"
  ],
  "title": "DeviceJoinApproved",
  "type": "object"
}
```

</details>

## `airdress.device_join.approved_by_delegation`

Owner info App stream Functions

A join request was approved with a root-signed delegation: nothing was sealed, so there is no slot. Clears the prompt on the other devices, as the sealed approval does.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **The app's event stream**, as `device_join_approved`: devices it concerns hear of it at once.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.133.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `approved_by_enrollment` | string (uuid) | yes |  |
| `at` | string | yes |  |
| `device_kind` | string | yes |  |
| `request_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A join request was approved with a root-signed delegation: nothing was sealed, so there is no slot. Clears the prompt on the other devices, as the sealed approval does.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "approved_by_enrollment": {
      "format": "uuid",
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "device_kind": {
      "type": "string"
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "approved_by_enrollment",
    "at",
    "device_kind",
    "request_id"
  ],
  "title": "DeviceJoinApprovedByDelegation",
  "type": "object"
}
```

</details>

## `airdress.device_join.cleared_by_reset`

Owner info App stream Functions

A root reset on the airdress expired an open join request.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **The app's event stream**, as `device_join_declined`: devices it concerns hear of it at once.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.133.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `at` | string | yes |  |
| `reason` | string | yes | Always `reset`. |
| `request_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A root reset on the airdress expired an open join request.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "reason": {
      "description": "Always `reset`.",
      "type": "string"
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "at",
    "reason",
    "request_id"
  ],
  "title": "DeviceJoinClearedByReset",
  "type": "object"
}
```

</details>

## `airdress.device_join.declined`

Owner warn App stream Functions

An enrolled device declined a join request.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **The app's event stream**, as `device_join_declined`: devices it concerns hear of it at once.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.133.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `at` | string | yes |  |
| `declined_by_enrollment` | string (uuid) | yes |  |
| `reason` | string | yes | Always `declined`. |
| `request_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "An enrolled device declined a join request.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "declined_by_enrollment": {
      "format": "uuid",
      "type": "string"
    },
    "reason": {
      "description": "Always `declined`.",
      "type": "string"
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "at",
    "declined_by_enrollment",
    "reason",
    "request_id"
  ],
  "title": "DeviceJoinDeclined",
  "type": "object"
}
```

</details>

## `airdress.device_join.delegation_refused`

Owner warn Functions

An approval of a join request by delegation did not verify.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.138.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `approver` | string (uuid) | yes | The approving device's enrollment. |
| `reason` | string | yes |  |
| `request_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "An approval of a join request by delegation did not verify.",
  "properties": {
    "approver": {
      "description": "The approving device's enrollment.",
      "format": "uuid",
      "type": "string"
    },
    "reason": {
      "type": "string"
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "approver",
    "reason",
    "request_id"
  ],
  "title": "DeviceJoinDelegationRefused",
  "type": "object"
}
```

</details>

## `airdress.device_join.expired`

Owner info App stream Functions

A join request expired unanswered.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **The app's event stream**, as `device_join_declined`: devices it concerns hear of it at once.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.133.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `at` | string | yes |  |
| `reason` | string | yes | Always `expired`. |
| `request_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A join request expired unanswered.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "reason": {
      "description": "Always `expired`.",
      "type": "string"
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "at",
    "reason",
    "request_id"
  ],
  "title": "DeviceJoinExpired",
  "type": "object"
}
```

</details>

## `airdress.device_join.requested`

Owner info App stream Functions

A device with no credential here asked to join this airdress. A doorbell: the label and the id, never the key, the address or the account.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **The app's event stream**, as `device_join_requested`: devices it concerns hear of it at once.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.133.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `delivered` | integer (uint) | yes | Streams open when it was recorded. |
| `device_class` | string or null | no | `agent` when an agent device asks; absent for a person's device. |
| `device_label` | string | yes |  |
| `expires_at` | string | yes |  |
| `renews` | string or null | no | The agent enrollment this request renews. |
| `request_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A device with no credential here asked to join this airdress. A doorbell: the label and the id, never the key, the address or the account.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "delivered": {
      "description": "Streams open when it was recorded.",
      "format": "uint",
      "minimum": 0,
      "type": "integer"
    },
    "device_class": {
      "description": "`agent` when an agent device asks; absent for a person's device.",
      "type": [
        "string",
        "null"
      ]
    },
    "device_label": {
      "type": "string"
    },
    "expires_at": {
      "type": "string"
    },
    "renews": {
      "description": "The agent enrollment this request renews.",
      "format": "uuid",
      "type": [
        "string",
        "null"
      ]
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "delivered",
    "device_label",
    "expires_at",
    "request_id"
  ],
  "title": "DeviceJoinRequested",
  "type": "object"
}
```

</details>

## `airdress.device_join.withdrawn`

Owner info App stream Functions

The device that asked took its join request back.

**Audience: owner.** About the airdress as a whole. Only the owner receives it: the owner's devices and the owner's subscriptions.

**Where it goes**

- **The operator's journal**, as one log line at this level, and **the event log**, where `airdress events tail` reads it.
- **Subscriptions** that name it, within its audience.
- **The app's event stream**, as `device_join_declined`: devices it concerns hear of it at once.
- **Functions bound to this operator's events** (`source: operator`).

**Versions**

- Version 1: first carried by operator v0.1.133.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `at` | string | yes |  |
| `reason` | string | yes | Always `withdrawn`. |
| `request_id` | string (uuid) | yes |  |

<details>
<summary>JSON Schema</summary>

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "The device that asked took its join request back.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "reason": {
      "description": "Always `withdrawn`.",
      "type": "string"
    },
    "request_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "at",
    "reason",
    "request_id"
  ],
  "title": "DeviceJoinWithdrawn",
  "type": "object"
}
```

</details>