@imenam/mcp-messenger 1.0.30 → 1.0.31

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.
@@ -1,5 +1,5 @@
1
1
  import { type AgentConfig } from "../config.js";
2
- import type { Message } from "../core/types.js";
2
+ import type { LinkedMailbox, Message } from "../core/types.js";
3
3
  export interface WatchConfig {
4
4
  config: AgentConfig;
5
5
  mailbox: string;
@@ -16,4 +16,6 @@ export interface WatchConfig {
16
16
  export declare function resolveWatchConfig(mailbox: string | null, env?: NodeJS.ProcessEnv): WatchConfig;
17
17
  /** Ligne d'évènement : une seule ligne, lisible telle quelle dans la notification. */
18
18
  export declare function formatEvent(message: Message): string;
19
+ /** Ligne d'une liaison posée depuis la console sur la boîte surveillée. */
20
+ export declare function formatLinkEvent(link: LinkedMailbox): string;
19
21
  export declare function runWatchMode(mailbox: string | null): Promise<void>;
@@ -62,6 +62,13 @@ export function formatEvent(message) {
62
62
  const thread = message.thread_title ? ` · ${message.thread_title.replace(/\s+/g, " ").trim()}` : "";
63
63
  return `[messenger] ${flag}${message.from} — ${subject}${thread} (${message.message_id})`;
64
64
  }
65
+ /** Ligne d'une liaison posée depuis la console sur la boîte surveillée. */
66
+ export function formatLinkEvent(link) {
67
+ const who = link.correspondent;
68
+ const names = [who.agent_name, who.display_name].filter(Boolean).join(" · ") || "unnamed mailbox";
69
+ const note = link.note ? ` — ${link.note.replace(/\s+/g, " ").trim()}` : "";
70
+ return `[messenger] linked with ${names} (${who.id})${note} — call list_links`;
71
+ }
65
72
  export async function runWatchMode(mailbox) {
66
73
  const { config, mailbox: target, source } = resolveWatchConfig(mailbox);
67
74
  const client = new MessengerClient(config);
@@ -71,11 +78,14 @@ export async function runWatchMode(mailbox) {
71
78
  try {
72
79
  const result = await client.waitForMessage(POLL_SECONDS, undefined, { watcher: true });
73
80
  backoff = BACKOFF_MIN_MS;
74
- if (result.timed_out || !result.message)
81
+ if (result.timed_out)
75
82
  continue;
76
83
  // Une ligne, un réveil. On repart aussitôt en attente : les messages suivants
77
84
  // arrivés entre-temps sont récupérés au tour d'après.
78
- process.stdout.write(`${formatEvent(result.message)}\n`);
85
+ if (result.message)
86
+ process.stdout.write(`${formatEvent(result.message)}\n`);
87
+ else if (result.link)
88
+ process.stdout.write(`${formatLinkEvent(result.link)}\n`);
79
89
  }
80
90
  catch (error) {
81
91
  const detail = error instanceof Error ? error.message : String(error);
@@ -1,5 +1,5 @@
1
1
  import type { AgentConfig } from "../config.js";
2
- import type { Agent, AgentDirectoryEntry, FolderInfo, ListMessagesOptions, MailboxStats, Message, MessageSummary, Priority, SendMessageResult, ThreadInfo, ThreadSummary } from "../core/types.js";
2
+ import type { Agent, AgentDirectoryEntry, FolderInfo, LinkedMailbox, ListMessagesOptions, MailboxStats, Message, MessageSummary, Priority, SendMessageResult, ThreadInfo, ThreadSummary } from "../core/types.js";
3
3
  /** Échec d'un appel au serveur boîte aux lettres (réseau, authentification ou métier). */
4
4
  export declare class MessengerClientError extends Error {
5
5
  readonly status?: number | undefined;
@@ -19,6 +19,8 @@ export interface DownloadedAttachment {
19
19
  export interface WaitResult {
20
20
  timed_out: boolean;
21
21
  message: Message | null;
22
+ /** Liaison posée sur la boîte pendant l'attente ; seul un veilleur en reçoit. */
23
+ link?: LinkedMailbox | null;
22
24
  }
23
25
  /**
24
26
  * Client HTTP du serveur boîte aux lettres.
@@ -70,6 +72,8 @@ export declare class MessengerClient {
70
72
  }): Promise<Agent>;
71
73
  getAgent(agentId: string): Promise<Agent>;
72
74
  listAgents(): Promise<AgentDirectoryEntry[]>;
75
+ /** Liaisons de la boîte courante. Le serveur les note comme reçues par cet agent. */
76
+ listLinks(): Promise<LinkedMailbox[]>;
73
77
  stats(): Promise<MailboxStats>;
74
78
  sendMessage(input: {
75
79
  to: string;
@@ -89,6 +89,11 @@ export class MessengerClient {
89
89
  const { agents } = await this.request("GET", "/api/agents");
90
90
  return agents;
91
91
  }
92
+ /** Liaisons de la boîte courante. Le serveur les note comme reçues par cet agent. */
93
+ async listLinks() {
94
+ const { links } = await this.request("GET", "/api/links");
95
+ return links;
96
+ }
92
97
  async stats() {
93
98
  return this.request("GET", "/api/mailbox");
94
99
  }
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter } from "node:events";
2
- import { type AdminThreadSummary, type Agent, type AgentDirectoryEntry, type AttachmentInfo, 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";
2
+ import { type AdminThreadSummary, type Agent, type AgentDirectoryEntry, type AttachmentInfo, type DeliveryRole, type FolderInfo, type LinkedMailbox, type ListMessagesOptions, type ListThreadsOptions, type MailboxLink, 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;
@@ -27,6 +27,11 @@ export interface StoreEvents {
27
27
  folder: string;
28
28
  role: DeliveryRole;
29
29
  }];
30
+ /** Émis pour chacune des deux boîtes d'une liaison qui vient d'être créée. */
31
+ link: [{
32
+ agent_id: string;
33
+ link_id: string;
34
+ }];
30
35
  }
31
36
  /**
32
37
  * Boîte aux lettres persistée en SQLite.
@@ -141,6 +146,23 @@ export declare class MessageStore extends EventEmitter<StoreEvents> {
141
146
  messages: number;
142
147
  threads: number;
143
148
  };
149
+ /**
150
+ * Lie deux boîtes existantes. La paire est stockée dans l'ordre des adresses : une
151
+ * liaison n'a pas de direction, et la même paire ne peut être liée deux fois.
152
+ */
153
+ createLink(first: string, second: string, note?: string | null): MailboxLink;
154
+ getLink(linkId: string): MailboxLink | null;
155
+ /** Toutes les liaisons du serveur, la plus récente en tête. */
156
+ listLinks(): MailboxLink[];
157
+ deleteLink(linkId: string): void;
158
+ /**
159
+ * Liaisons d'une boîte, la plus récente en tête, chacune avec la fiche de la boîte d'en
160
+ * face. `markSeen` note que l'agent de cette boîte en a pris connaissance.
161
+ */
162
+ linksFor(agentId: string, opts?: {
163
+ markSeen?: boolean;
164
+ linkId?: string;
165
+ }): LinkedMailbox[];
144
166
  /** Vue globale : tous les messages du serveur, indépendamment des boîtes. */
145
167
  listAllMessages(opts?: {
146
168
  search?: string;