@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 +46 -14
- package/dist/src/client/messenger-client.d.ts +1 -0
- package/dist/src/core/store.d.ts +26 -1
- package/dist/src/core/store.js +264 -146
- package/dist/src/core/types.d.ts +29 -0
- package/dist/src/mcp/start.js +7 -2
- package/dist/src/mcp/tools.js +150 -37
- package/dist/src/server/app.js +25 -2
- package/dist/src/server/ui/app.js +703 -320
- package/dist/src/server/ui/index.html +92 -27
- package/dist/src/server/ui/styles.css +1147 -328
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +1 -1
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 :
|
|
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.
|
|
258
|
-
|
|
259
|
-
boîte
|
|
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.
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
-
|
|
332
|
-
|
|
333
|
-
|
|
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]`
|
|
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
|
---
|
package/dist/src/core/store.d.ts
CHANGED
|
@@ -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: {
|