# airdress.shell.*

{/* 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.shell` family. How to read a section, and what
each audience means, is on the [event reference](/events/) page.

## `airdress.shell.attention`

The person it concerns info App stream

A shell session asked for its person's attention: `needs_you`, `done` or `bell`. Labels and a state, never a session's content, and only on the person's own airdresses.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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 `shell_attention`: devices it concerns hear of it at once.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `at` | string | yes |  |
| `host_label` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `profile_label` | string | yes |  |
| `state` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell session asked for its person's attention: `needs_you`, `done` or `bell`. Labels and a state, never a session's content, and only on the person's own airdresses.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "host_label": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "profile_label": {
      "type": "string"
    },
    "state": {
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "at",
    "host_label",
    "principal_id",
    "profile_label",
    "state"
  ],
  "title": "ShellAttention",
  "type": "object"
}
```

</details>

## `airdress.shell.attention.sent`

The person it concerns info

A shell session raised attention (`needs_you`, `done`, `bell`) and it passed the rate limit. `skipped_foreground` is true when a device had the session in front of it, so no notice was sent.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `session` | string (uuid) | yes |  |
| `skipped_foreground` | boolean | yes |  |
| `state` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell session raised attention (`needs_you`, `done`, `bell`) and it passed the rate limit. `skipped_foreground` is true when a device had the session in front of it, so no notice was sent.",
  "properties": {
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "session": {
      "format": "uuid",
      "type": "string"
    },
    "skipped_foreground": {
      "type": "boolean"
    },
    "state": {
      "type": "string"
    }
  },
  "required": [
    "host",
    "principal_id",
    "session",
    "skipped_foreground",
    "state"
  ],
  "title": "ShellAttentionSent",
  "type": "object"
}
```

</details>

## `airdress.shell.device.revoked`

The person it concerns info

A revoked device's shell legs were closed, and its person's hosts told to forget it.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `device` | string (uuid) | yes |  |
| `legs` | integer (uint) | yes |  |
| `principal_id` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A revoked device's shell legs were closed, and its person's hosts told to forget it.",
  "properties": {
    "device": {
      "format": "uuid",
      "type": "string"
    },
    "legs": {
      "format": "uint",
      "minimum": 0,
      "type": "integer"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "device",
    "legs",
    "principal_id"
  ],
  "title": "ShellDeviceRevoked",
  "type": "object"
}
```

</details>

## `airdress.shell.device_key.introduced`

The person it concerns info

A device of a person was introduced, by another of that person's devices, to that person's shell hosts.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `device` | string (uuid) | yes |  |
| `introduced_by` | string (uuid) | yes |  |
| `principal_id` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A device of a person was introduced, by another of that person's devices, to that person's shell hosts.",
  "properties": {
    "device": {
      "format": "uuid",
      "type": "string"
    },
    "introduced_by": {
      "format": "uuid",
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "device",
    "introduced_by",
    "principal_id"
  ],
  "title": "ShellDeviceKeyIntroduced",
  "type": "object"
}
```

</details>

## `airdress.shell.device_key.registered`

The person it concerns info

A device registered its shell keys.

`presence_alg` is how it proves a person is present (`none` for a CLI). No key is in the event; it is about the device's own person.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `device` | string (uuid) | yes |  |
| `presence_alg` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A device registered its shell keys.\n\n`presence_alg` is how it proves a person is present (`none` for a CLI). No key is in the event; it is about the device's own person.",
  "properties": {
    "device": {
      "format": "uuid",
      "type": "string"
    },
    "presence_alg": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "device",
    "presence_alg",
    "principal_id"
  ],
  "title": "ShellDeviceKeyRegistered",
  "type": "object"
}
```

</details>

## `airdress.shell.host.connected`

The person it concerns info

A shell host's channel opened, over `ws` or `poll`.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `machine` | string (uuid) | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `transport` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host's channel opened, over `ws` or `poll`.",
  "properties": {
    "host": {
      "type": "string"
    },
    "machine": {
      "format": "uuid",
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "transport": {
      "type": "string"
    }
  },
  "required": [
    "host",
    "machine",
    "principal_id",
    "transport"
  ],
  "title": "ShellHostConnected",
  "type": "object"
}
```

</details>

## `airdress.shell.host.deleted`

Owner info Functions

A `ShellHost` was deleted; its machine is no longer admitted to a host channel. Deleting revokes nothing by itself.

**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.137.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A `ShellHost` was deleted; its machine is no longer admitted to a host channel. Deleting revokes nothing by itself.",
  "properties": {
    "host": {
      "type": "string"
    }
  },
  "required": [
    "host"
  ],
  "title": "ShellHostDeleted",
  "type": "object"
}
```

</details>

## `airdress.shell.host.disconnected`

The person it concerns info

A shell host's channel closed. `reason` is the close reason (`displaced`, `idle`, `host_revoked`, …); `lived_secs` how long it was held.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `lived_secs` | integer (uint64) | yes |  |
| `machine` | string (uuid) | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `reason` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host's channel closed. `reason` is the close reason (`displaced`, `idle`, `host_revoked`, …); `lived_secs` how long it was held.",
  "properties": {
    "host": {
      "type": "string"
    },
    "lived_secs": {
      "format": "uint64",
      "minimum": 0,
      "type": "integer"
    },
    "machine": {
      "format": "uuid",
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  },
  "required": [
    "host",
    "lived_secs",
    "machine",
    "principal_id",
    "reason"
  ],
  "title": "ShellHostDisconnected",
  "type": "object"
}
```

</details>

## `airdress.shell.host.linked`

The person it concerns info App stream

A shell host was approved and linked to its person.

Recorded on the person's airdresses and the owner's, because a sub-user may approve their own host and the owner is the one who can revoke it. A label and ids: never an argv, a path, a key or an address.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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 `shell_host_linked`: devices it concerns hear of it at once.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `airdress` | string | yes |  |
| `at` | string | yes |  |
| `host_label` | string | yes |  |
| `machine_id` | string (uuid) | yes |  |
| `principal_id` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host was approved and linked to its person.\n\nRecorded on the person's airdresses and the owner's, because a sub-user may approve their own host and the owner is the one who can revoke it. A label and ids: never an argv, a path, a key or an address.",
  "properties": {
    "airdress": {
      "type": "string"
    },
    "at": {
      "type": "string"
    },
    "host_label": {
      "type": "string"
    },
    "machine_id": {
      "format": "uuid",
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "airdress",
    "at",
    "host_label",
    "machine_id",
    "principal_id"
  ],
  "title": "ShellHostLinked",
  "type": "object"
}
```

</details>

## `airdress.shell.host.linked_unannounced`

Owner warn Functions

A shell host was linked and no enrolled device — neither its person's nor the owner's — could be told. The link stands.

**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.137.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `machine` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host was linked and no enrolled device — neither its person's nor the owner's — could be told. The link stands.",
  "properties": {
    "machine": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "machine"
  ],
  "title": "ShellHostLinkedUnannounced",
  "type": "object"
}
```

</details>

## `airdress.shell.host.pin_mismatch`

Owner warn

A shell host's signed host info names a person other than its `ShellHost`'s. Repeats on each reconcile while it holds, so it stays off the bus.

**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.
- Not functions bound to this operator's events: it is kept off that path as too frequent or too internal. A subscription with a function target still receives it.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host's signed host info names a person other than its `ShellHost`'s. Repeats on each reconcile while it holds, so it stays off the bus.",
  "properties": {
    "host": {
      "type": "string"
    }
  },
  "required": [
    "host"
  ],
  "title": "ShellHostPinMismatch",
  "type": "object"
}
```

</details>

## `airdress.shell.host.profiles_changed`

The person it concerns info

A shell host published its profiles. The count only: a profile's argv never leaves the host.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `profiles` | integer (uint) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host published its profiles. The count only: a profile's argv never leaves the host.",
  "properties": {
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "profiles": {
      "format": "uint",
      "minimum": 0,
      "type": "integer"
    }
  },
  "required": [
    "host",
    "principal_id",
    "profiles"
  ],
  "title": "ShellHostProfilesChanged",
  "type": "object"
}
```

</details>

## `airdress.shell.host.refused`

Owner info Functions

A machine that is not a linked, enabled shell host asked for a host channel and was refused (`shell_host_not_linked`, `shell_host_disabled`).

**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.137.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `machine` | string (uuid) | yes |  |
| `reason` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A machine that is not a linked, enabled shell host asked for a host channel and was refused (`shell_host_not_linked`, `shell_host_disabled`).",
  "properties": {
    "machine": {
      "format": "uuid",
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  },
  "required": [
    "machine",
    "reason"
  ],
  "title": "ShellHostRefused",
  "type": "object"
}
```

</details>

## `airdress.shell.host.revoked`

Owner info Functions

A shell host was revoked: by the owner through the admin route (its machine revoked, its `ShellHost` deleted), or found revoked by the liveness check and its channel closed.

**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.137.

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `machine` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host was revoked: by the owner through the admin route (its machine revoked, its `ShellHost` deleted), or found revoked by the liveness check and its channel closed.",
  "properties": {
    "host": {
      "type": "string"
    },
    "machine": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "host",
    "machine"
  ],
  "title": "ShellHostRevoked",
  "type": "object"
}
```

</details>

## `airdress.shell.host.runs_as_root`

Owner warn

A shell host reports that it runs as root. Every surface that shows the host shows it too (`status.host.runsAsRoot`); this line repeats on each reconcile while it holds, so it stays off the bus.

**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.
- Not functions bound to this operator's events: it is kept off that path as too frequent or too internal. A subscription with a function target still receives it.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host reports that it runs as root. Every surface that shows the host shows it too (`status.host.runsAsRoot`); this line repeats on each reconcile while it holds, so it stays off the bus.",
  "properties": {
    "host": {
      "type": "string"
    }
  },
  "required": [
    "host"
  ],
  "title": "ShellHostRunsAsRoot",
  "type": "object"
}
```

</details>

## `airdress.shell.host.stopping`

The person it concerns info

A shell host announced it is stopping, in `in_seconds`, ending `sessions` sessions. Once per stop.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `in_seconds` | integer (uint32) | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `sessions` | integer (uint) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host announced it is stopping, in `in_seconds`, ending `sessions` sessions. Once per stop.",
  "properties": {
    "host": {
      "type": "string"
    },
    "in_seconds": {
      "format": "uint32",
      "minimum": 0,
      "type": "integer"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "sessions": {
      "format": "uint",
      "minimum": 0,
      "type": "integer"
    }
  },
  "required": [
    "host",
    "in_seconds",
    "principal_id",
    "sessions"
  ],
  "title": "ShellHostStopping",
  "type": "object"
}
```

</details>

## `airdress.shell.liveness.listen_failed`

Owner warn

The listener for machine and device revocations could not connect, or failed and is reconnecting. Revocations still land through the periodic check; only their promptness is lost.

**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.
- Not functions bound to this operator's events: it is kept off that path as too frequent or too internal. A subscription with a function target still receives it.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `error` | string | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "The listener for machine and device revocations could not connect, or failed and is reconnecting. Revocations still land through the periodic check; only their promptness is lost.",
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "title": "ShellLivenessListenFailed",
  "type": "object"
}
```

</details>

## `airdress.shell.session.attached`

The person it concerns info

A device attached to a shell session.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `session` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A device attached to a shell session.",
  "properties": {
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "session": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "host",
    "principal_id",
    "session"
  ],
  "title": "ShellSessionAttached",
  "type": "object"
}
```

</details>

## `airdress.shell.session.closed`

The person it concerns info

A shell session ended. `reason` is the host's (`exit`, `host_stopped`, …).

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `reason` | string | yes |  |
| `session` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell session ended. `reason` is the host's (`exit`, `host_stopped`, …).",
  "properties": {
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "reason": {
      "type": "string"
    },
    "session": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "host",
    "principal_id",
    "reason",
    "session"
  ],
  "title": "ShellSessionClosed",
  "type": "object"
}
```

</details>

## `airdress.shell.session.detached`

The person it concerns info

A device detached from a shell session; the session goes on.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `session` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A device detached from a shell session; the session goes on.",
  "properties": {
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "session": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "host",
    "principal_id",
    "session"
  ],
  "title": "ShellSessionDetached",
  "type": "object"
}
```

</details>

## `airdress.shell.session.input_moved`

The person it concerns info

Input in a shell session moved to another device: that device is now its typist.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `session` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "Input in a shell session moved to another device: that device is now its typist.",
  "properties": {
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "session": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "host",
    "principal_id",
    "session"
  ],
  "title": "ShellSessionInputMoved",
  "type": "object"
}
```

</details>

## `airdress.shell.session.opened`

The person it concerns info

A shell session opened on a host.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `session` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell session opened on a host.",
  "properties": {
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "session": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "host",
    "principal_id",
    "session"
  ],
  "title": "ShellSessionOpened",
  "type": "object"
}
```

</details>

## `airdress.shell.session.refused`

The person it concerns info

A shell host refused a device on a session; `code` is the host's reason. The device's leg was ended.

**Audience: the person it concerns.** About one person on the airdress. It reaches only that person: their own devices and subscriptions they made themselves. The owner's subscriptions never receive another person's events.

**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.
- Not functions bound to this operator's events: functions act for the owner, and this event is about someone else.

**Versions**

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

**Data**

| Field | Type | Required | Description |
| ----- | ---- | -------- | ----------- |
| `code` | string | yes |  |
| `host` | string | yes |  |
| `principal_id` | string (uuid) | yes |  |
| `session` | string (uuid) | yes |  |

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "A shell host refused a device on a session; `code` is the host's reason. The device's leg was ended.",
  "properties": {
    "code": {
      "type": "string"
    },
    "host": {
      "type": "string"
    },
    "principal_id": {
      "format": "uuid",
      "type": "string"
    },
    "session": {
      "format": "uuid",
      "type": "string"
    }
  },
  "required": [
    "code",
    "host",
    "principal_id",
    "session"
  ],
  "title": "ShellSessionRefused",
  "type": "object"
}
```

</details>

## `airdress.shell.switched_off`

Owner info Functions

The shells switch was turned off: every leg and host channel is closed.

**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**

It carries no fields.

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

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "The shells switch was turned off: every leg and host channel is closed.",
  "title": "ShellsSwitchedOff",
  "type": "object"
}
```

</details>