> Pour un agent : la carte du site est sur https://subagent.fr/llms.txt ; chaque page existe en Markdown, à la même adresse suffixée `.md`.

# Agenda et contacts

> Chaque boîte a un agenda et un carnet de contacts. Un téléphone les affiche avec un mot de passe d'application : un par appareil, créé par l'humain de l'espace, retiré d'un geste. Il n'envoie pas d'e-mail : les envois passent toujours par Subagent.

## Ce qu'ouvre un mot de passe d'application

| Accès | Ce qu'il ouvre | Pour |
|---|---|---|
| `calendar_contacts` | L'agenda (CalDAV) et les contacts (CardDAV) de la boîte, avec les demandes de rendez-vous : un rendez-vous créé avec des participants leur part par e-mail, depuis l'adresse de la boîte, et leurs réponses reviennent dans l'agenda. | Un téléphone, un logiciel d'agenda. |
| `mail_read` | La lecture de la boîte en IMAP : ses dossiers et ses messages. Rien ne s'y écrit, ne s'y déplace ni ne s'y efface. | Escouade, ou un logiciel qui lit seulement. |

- **Aucun n'envoie d'e-mail.** Un message parti d'un téléphone échapperait au créneau, aux quotas, à la montée progressive, à la liste de blocage et à la validation : les envois passent par `send_email` et `reply_to_thread`.
- **Le mot de passe de la boîte ne se donne jamais.** Chaque appareil a le sien ; en retirer un ne touche pas aux autres.
- **Il s'affiche une seule fois**, à la création. Subagent ne le garde pas : perdu, on en crée un autre et on retire l'ancien.
- **L'humain de l'espace est prévenu par e-mail** de chaque création. Dix mots de passe au plus par boîte, vingt créations au plus par espace et par jour.

## Obtenir le mot de passe

C'est un geste de l'humain de l'espace : il demande la permission `approve`. Un agent ne se donne pas l'agenda d'une boîte.

- **Dans l'établi**, dans son assistant ou sur la page web : Boîtes, la boîte, « Agenda, contacts et lecture », puis « Brancher un téléphone ou un logiciel ». Le mot de passe s'affiche une fois, avec le serveur et l'identifiant à saisir.
- **En le demandant à son assistant**, par exemple : « Branche mon iPhone sur l'agenda de contact@exemple.fr. » L'assistant appelle `create_app_password`.

Ce qu'on saisit dans l'appareil :

| Champ | Valeur |
|---|---|
| Serveur | `mx1.subagent.fr` |
| Nom d'utilisateur | L'adresse de la boîte, par exemple `contact@exemple.fr` |
| Mot de passe | Le mot de passe d'application |

## iPhone et iPad

1. Réglages › Apps › Calendrier › Comptes de calendrier › Ajouter un compte › Autre › **Ajouter un compte CalDAV**. Avant iOS 18 : Réglages › Calendrier › Comptes.
2. Serveur `mx1.subagent.fr`, l'adresse de la boîte en nom d'utilisateur, le mot de passe d'application, et une description (le nom de la boîte, par exemple). Suivant.
3. Les contacts : Réglages › Apps › Contacts › Comptes de contacts › Ajouter un compte › Autre › **Ajouter un compte CardDAV**, avec les mêmes valeurs.

L'agenda de la boîte apparaît dans Calendrier, son carnet dans Contacts. Un rendez-vous créé sur le téléphone dans cet agenda est enregistré dans la boîte, et inversement.

## Android

Android n'a pas de compte CalDAV intégré : on passe par l'application **DAVx⁵**, sur Google Play ou F-Droid.

1. Dans DAVx⁵ : ajouter un compte, **Connexion avec une URL et un nom d'utilisateur**.
2. URL de base `https://mx1.subagent.fr`, l'adresse de la boîte en nom d'utilisateur, le mot de passe d'application.
3. Cocher l'agenda et le carnet à synchroniser. Ils apparaissent dans l'agenda et les contacts du téléphone.

## Sur un ordinateur

Calendrier et Contacts sur Mac, Thunderbird et les autres logiciels d'agenda : un compte CalDAV et un compte CardDAV, serveur `mx1.subagent.fr`, mêmes identifiants. Un logiciel qui demande l'adresse entière : `https://mx1.subagent.fr/.well-known/caldav` pour l'agenda, `https://mx1.subagent.fr/.well-known/carddav` pour les contacts.

## Les demandes de rendez-vous

- **Un rendez-vous avec des participants**, créé dans l'agenda de la boîte, leur part par e-mail depuis l'adresse de la boîte : le rendez-vous en pièce jointe (`.ics`) et un lien pour répondre en un clic, sans agenda. Leurs réponses reviennent dans l'agenda de la boîte.
- **Vingt participants au plus** par rendez-vous. Ces e-mails sont des demandes de rendez-vous, une par participant, pas une campagne : ils ne comptent pas dans le quota du jour de la boîte.
- **Une demande reçue** arrive dans la boîte comme un e-mail, que Subagent range dans un fil. Elle s'ajoute d'elle-même à l'agenda quand son expéditeur est authentifié (DMARC) et figure dans les contacts de la boîte ; sinon, on l'accepte depuis le téléphone.

## La lecture par Escouade

Une boîte se lit dans Escouade comme ses autres boîtes : ses messages se rattachent aux fiches de leurs correspondants.

1. Dans Subagent : créer un mot de passe d'application avec l'accès `mail_read` (dans l'établi : « Lecture de la boîte en IMAP (Escouade) »).
2. Dans Escouade : Réglages › Comptes › **Boîte Escouade Mail**, l'adresse de la boîte et ce mot de passe. Le réglage « Boîtes Escouade Mail » de l'espace Escouade (Réglages › Modules) doit être allumé.

Escouade lit seulement : il ne marque rien comme lu, ne déplace rien, n'envoie rien. Les envois de la boîte restent dans Subagent ; Escouade voit ce qu'elle reçoit. Pour un autre logiciel de lecture : serveur IMAP `mx1.subagent.fr`, port 993, TLS.

## Votre propre domaine

Rien à publier : l'appareil se branche sur `mx1.subagent.fr`. Pour qu'un logiciel trouve le serveur à partir de la seule adresse de la boîte (DAVx⁵ en connexion par adresse e-mail, un compte CalDAV dont le serveur est le domaine), publiez dans le DNS du domaine :

| Type | Nom | Valeur |
|---|---|---|
| SRV | `_caldavs._tcp.exemple.fr` | `0 1 443 mx1.subagent.fr.` |
| SRV | `_carddavs._tcp.exemple.fr` | `0 1 443 mx1.subagent.fr.` |
| TXT | `_caldavs._tcp.exemple.fr` | `path=/.well-known/caldav` |
| TXT | `_carddavs._tcp.exemple.fr` | `path=/.well-known/carddav` |

Ils sont conseillés, pas exigés : `verify_domain` ne les contrôle pas.

## Retirer un appareil

Un téléphone perdu, un logiciel qui ne sert plus : on retire son mot de passe. L'appareil ne se connecte plus ; l'agenda et les contacts restent dans la boîte. Dans l'établi : « Agenda, contacts et lecture », l'appareil, « Retirer ». Par l'outil : `revoke_app_password`.

Supprimer la boîte avec `delete_inbox` retire tout : ses mots de passe, son agenda et ses contacts.

## `create_app_password`

Crée un mot de passe d'application pour une boîte. Permission : `approve`. L'espace doit être vérifié.

| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| `inbox_id` | texte | oui | La boîte (`inb_…`, voir `list_inboxes`). |
| `access` | texte | non | `calendar_contacts` (par défaut) : l'agenda et les contacts. `mail_read` : la lecture en IMAP. |
| `label` | texte | non | Le nom de l'appareil, 2 à 60 caractères, une ligne. Absent : « Téléphone », ou « Escouade » pour la lecture. |

Le résultat porte `password` (cette seule fois), `username`, `server`, `caldav_url`, `carddav_url`, `imap` (`host`, `port`, `security`), `guide_url` et `app_password` (`id`, `label`, `access`, `created_at`).

Refus propres à l'outil : `app_passwords_unavailable` (le serveur ne l'a pas encore ouvert), `app_password_limit` (dix déjà sur la boîte), `inbox_not_managed` (une boîte dont Subagent ne garde pas le mot de passe), `space_rate_limited`, `provisioning_failed`.

## `list_app_passwords`

Liste les mots de passe d'application d'une boîte : le nom de l'appareil, l'accès, la date de création, jamais le secret. Il rend aussi le serveur et le nom d'utilisateur à saisir. Permission : `approve`.

| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| `inbox_id` | texte | oui | La boîte (`inb_…`, voir `list_inboxes`). |

## `revoke_app_password`

Retire un mot de passe d'application : l'appareil qui s'en sert ne se connecte plus. Sans retour. Permission : `approve`. Un mot de passe déjà retiré rend `already_revoked: true`, sans rien changer.

| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| `inbox_id` | texte | oui | La boîte (`inb_…`, voir `list_inboxes`). |
| `app_password_id` | texte | oui | Le mot de passe à retirer, tel que `list_app_passwords` le donne. |
| `confirm` | booléen | oui | Doit valoir `true`. |
