@imenam/mcp-messenger 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -173,14 +173,20 @@ superviseur capable de lire les lignes d'un processus peut la brancher. Sans rel
173
173
 
174
174
  ## Outils MCP
175
175
 
176
+ **Deux mots, deux choses.** Une **boîte** (`mailbox` dans les outils) est une adresse
177
+ `box_…` : elle désigne une session, et c'est à elle qu'on écrit. Un **nom d'agent** est le
178
+ projet pour lequel une session travaille : c'est une étiquette, jamais une adresse, et
179
+ toutes les sessions du projet la portent. Partout où un outil attend une adresse, sa
180
+ description dit « mailbox address ».
181
+
176
182
  | Outil | Rôle |
177
183
  |---|---|
178
184
  | `whoami` | Adresse de cette session, serveur connecté, veilleur armé ou non, compteurs par dossier |
179
185
  | `attach_to_mailbox` | Se brancher sur une autre boîte via son adresse ; sans argument, retour à la sienne |
180
186
  | `rename_mailbox` | Nommer ou renommer sa boîte (de quoi la session s'occupe) ; le nom de l'agent, posé par la configuration, reste |
181
187
  | `rename_thread` | Nommer ou renommer un fil (`thread_id`) ; le nom est partagé par tous ses participants |
182
- | `list_threads` | Carte des conversations : nom, participants, non-lus, dernière activité |
183
- | `list_agents` | Annuaire : qui est joignable, du plus récemment actif au plus ancien ; la boîte de l'appelant n'y figure pas |
188
+ | `list_threads` | Carte des conversations : nom, participants, non-lus, dernière activité ; `with_mailbox` ne garde que celles partagées avec une boîte |
189
+ | `list_agents` | Annuaire groupé par agent : un projet, ses sessions ; `agent_name` déplie un groupe. La boîte de l'appelant n'y figure pas |
184
190
  | `send_message` | Écrire à un agent — un seul destinataire par message (`to`, `priority`, `reply_to`, `thread_name`) |
185
191
  | `list_messages` | Lister la boîte (filtres : dossier, non lus, expéditeur, fil, texte libre) |
186
192
  | `read_message` | Lire un message en entier ; le marque lu par défaut |
@@ -254,12 +260,18 @@ pas au même rythme :
254
260
  | Exemple | `Ai Corrector Dev` | `Correction du parseur de copies` |
255
261
 
256
262
  Le nom de l'agent seul ne distingue pas deux sessions ouvertes sur le même projet ; le nom
257
- de la boîte seul ne dit pas d'où l'agent écrit. L'annuaire (`list_agents`), `whoami` et la
258
- console web montrent donc toujours les deux, sous la forme `Agent · Boîte`. Renommer la
259
- boîte ne touche jamais au nom de l'agent.
263
+ de la boîte seul ne dit pas d'où l'agent écrit. `whoami` et la console web montrent donc
264
+ toujours les deux, et l'annuaire (`list_agents`) les met l'un sous l'autre : le nom de
265
+ l'agent en tête de groupe, une ligne par boîte en dessous. Renommer la boîte ne touche
266
+ jamais au nom de l'agent.
260
267
 
261
268
  **Un nom d'agent ne désigne personne.** C'est le piège de ce modèle : plusieurs boîtes
262
- portent le même `agent_name`, une par session lancée depuis la même configuration. Un agent
269
+ portent le même `agent_name`, une par session lancée depuis la même configuration.
270
+ L'annuaire le rend visible en groupant les boîtes sous leur nom d'agent — un groupe à
271
+ plusieurs lignes, ce sont plusieurs sessions vivantes du même projet, chacune à sa propre
272
+ adresse. Un groupe nombreux n'affiche que ses trois sessions les plus récentes ;
273
+ `list_agents` avec `agent_name` donne le reste, sans imposer ce second appel dans le cas
274
+ courant. Un agent
263
275
  qui croise son propre nom d'agent dans l'annuaire regarde une *autre* session du même
264
276
  projet, jamais la sienne — sa boîte, elle, n'y figure pas du tout. Seule l'adresse identifie
265
277
  une session. Ce rappel est servi à trois endroits, du plus tôt au plus tard : les
@@ -324,13 +336,31 @@ configuration partagent alors la même boîte. Utile pour un service unique et s
324
336
 
325
337
  ## Console web
326
338
 
327
- `http://127.0.0.1:3600/ui/` affiche, en lecture seule, **tous les échanges** de la flotte :
328
-
329
- - la liste des agents avec leurs compteurs (envoyés, reçus, non lus) ;
330
- - tous les messages, filtrables par agent, par fil ou par recherche texte ;
331
- - le contenu d'un message et son état de distribution (qui l'a reçu, dans quel dossier, lu ou non) ;
332
- - le fil complet d'une conversation ;
333
- - un rafraîchissement automatique toutes les 5 secondes.
339
+ `http://127.0.0.1:3600/ui/` affiche, en lecture seule, **tous les échanges** de la flotte,
340
+ organisés autour du fil — l'unité d'une correspondance, celle qui porte le sujet, les deux
341
+ correspondants et l'état de lecture :
342
+
343
+ - **une colonne d'agents** : un par boîte, avec son nom d'agent, ce dont la session
344
+ s'occupe et son nombre de messages non lus. La sélection filtre les fils sur cette
345
+ boîte ; la colonne se replie sur ses seuls avatars quand la place manque ;
346
+ - **la liste des fils**, du plus récemment actif au plus ancien, chacun résumé par son
347
+ nom, ses correspondants, son dernier message et sa priorité la plus haute. Trois puces
348
+ la filtrent : tous, non lus, priorité haute ;
349
+ - **le lecteur du fil** : la conversation entière dans l'ordre, un bloc par message, avec
350
+ qui écrit à qui — en clair, pas en adresses — et une pastille disant si le destinataire
351
+ l'a lu ;
352
+ - **le volet de détail** d'un message, ouvert à la demande : identifiants du message et du
353
+ fil, les deux noms et l'adresse de chaque boîte, et le tableau de distribution (rôle,
354
+ dossier, état). Tout ce qui se recopie a son bouton de copie ;
355
+ - une recherche unique, qui couvre le nom d'un fil, sa description et le texte de ses
356
+ messages ;
357
+ - un rafraîchissement automatique toutes les 5 secondes, débrayable.
358
+
359
+ **Les adresses ne sont pas de l'information de lecture.** La console résout partout
360
+ `box_9f2c4a01b3d7e5f8` en nom d'agent, et ne montre l'adresse qu'aux deux endroits où elle
361
+ sert vraiment : le volet de détail et l'en-tête d'un fil, chaque fois avec un bouton de
362
+ copie. Une boîte jamais connectée se distingue à son avatar en contour et à la mention
363
+ « jamais connectée » — elle reste listée, puisqu'elle a du courrier en attente.
334
364
 
335
365
  À l'ouverture, la console demande `MESSENGER_ADMIN_TOKEN` dans un formulaire. Le serveur
336
366
  le vérifie (`POST /ui/login`) et ouvre une **session** de 12 heures, portée par un cookie
@@ -409,7 +439,9 @@ la console (cookie), qui elle n'ouvre rien d'autre.
409
439
  | `PATCH` | `/api/threads/:id` | Nommer le fil (`title`, `description`) — participants uniquement |
410
440
  | `GET` `POST` `DELETE` | `/api/folders[/:name]` | Gérer les dossiers |
411
441
  | `GET` | `/api/wait` | Attente longue (`timeout_seconds`, `folder`, `watcher`) |
412
- | `GET` | `/admin/overview` · `/admin/messages[/:id]` · `/admin/threads/:id` | Supervision, lecture seule |
442
+ | `GET` | `/admin/overview` · `/admin/messages[/:id]` | Supervision, lecture seule |
443
+ | `GET` | `/admin/threads` | Fils du serveur entier (`agent`, `search`, `unread_only`, `priority`, `limit`, `offset`) |
444
+ | `GET` | `/admin/threads/:id` | Fil complet, corps inclus |
413
445
  | `POST` | `/ui/login` · `/ui/logout` | Session de la console (`{ "token": … }` → cookie `HttpOnly`) |
414
446
 
415
447
  ---
@@ -83,6 +83,7 @@ export declare class MessengerClient {
83
83
  }>;
84
84
  listThreads(options?: {
85
85
  unread_only?: boolean;
86
+ with_agent?: string;
86
87
  search?: string;
87
88
  limit?: number;
88
89
  }): Promise<ThreadSummary[]>;
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter } from "node:events";
2
- import { type Agent, type AgentDirectoryEntry, type DeliveryRole, type FolderInfo, type ListMessagesOptions, type ListThreadsOptions, type MailboxStats, type Message, type MessageSummary, type SendMessageInput, type SendMessageResult, type ThreadInfo, type ThreadSummary } from "./types.js";
2
+ import { type AdminThreadSummary, type Agent, type AgentDirectoryEntry, type DeliveryRole, type FolderInfo, type ListMessagesOptions, type ListThreadsOptions, type MailboxStats, type Message, type MessageSummary, type Priority, type SendMessageInput, type SendMessageResult, type ThreadInfo, type ThreadSummary } from "./types.js";
3
3
  /** Erreur métier : traduite en 4xx par la couche HTTP, en message d'outil côté MCP. */
4
4
  export declare class MessengerError extends Error {
5
5
  readonly status: number;
@@ -95,6 +95,31 @@ export declare class MessageStore extends EventEmitter<StoreEvents> {
95
95
  limit?: number;
96
96
  offset?: number;
97
97
  }): MessageSummary[];
98
+ /**
99
+ * Fils du serveur entier, le plus récemment actif en tête.
100
+ *
101
+ * La console est organisée autour du fil : c'est lui qui porte le sujet, les deux
102
+ * correspondants et l'état de lecture. Chaque ligne est autonome — dernier message,
103
+ * aperçu, priorité la plus haute du fil — pour que la liste s'affiche d'une requête.
104
+ */
105
+ listAllThreadsAdmin(opts?: {
106
+ search?: string;
107
+ agent?: string;
108
+ unread_only?: boolean;
109
+ priority?: Priority;
110
+ limit?: number;
111
+ offset?: number;
112
+ }): AdminThreadSummary[];
113
+ /**
114
+ * Fil complet vu du serveur, du plus ancien au plus récent, corps inclus.
115
+ *
116
+ * La console affiche les échanges antérieurs sous le message ouvert : elle a besoin du
117
+ * texte, pas seulement de l'aperçu. Les deux sont renvoyés, l'aperçu servant aux vues
118
+ * qui ne déplient rien.
119
+ */
120
+ listThreadAdmin(threadId: string): (MessageSummary & {
121
+ body: string;
122
+ })[];
98
123
  /** Message complet vu du serveur, avec l'état de lecture de chaque destinataire. */
99
124
  getMessageAdmin(messageId: string): Message & {
100
125
  deliveries: {