@imenam/mcp-messenger 1.0.3 → 1.0.5
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 +61 -13
- package/dist/src/cli/watch.js +4 -2
- package/dist/src/client/messenger-client.d.ts +26 -4
- package/dist/src/client/messenger-client.js +17 -4
- package/dist/src/core/store.d.ts +22 -3
- package/dist/src/core/store.js +201 -13
- package/dist/src/core/types.d.ts +63 -0
- package/dist/src/mcp/tools.js +126 -18
- package/dist/src/server/app.js +46 -6
- package/dist/src/server/ui/app.js +27 -7
- package/dist/src/server/ui/styles.css +20 -1
- package/dist/src/server/watchers.d.ts +10 -0
- package/dist/src/server/watchers.js +69 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Présence des veilleurs, par boîte.
|
|
3
|
+
*
|
|
4
|
+
* L'armement du veilleur dépend de l'agent : rien ne peut le déclencher à sa place, et
|
|
5
|
+
* un agent qui saute l'étape se croit joignable sans l'être. Ce registre rend le fait
|
|
6
|
+
* observable — `whoami` peut alors répondre « armé » ou « pas armé » plutôt que rien.
|
|
7
|
+
*
|
|
8
|
+
* État de connexion, donc volatile : il vit en mémoire du processus serveur et disparaît
|
|
9
|
+
* avec lui. Le mettre en base ferait croire à un veilleur qui n'existe plus.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Un veilleur enchaîne des attentes longues ; entre deux, il n'est plus connecté pendant
|
|
13
|
+
* quelques millisecondes. Ce délai de grâce évite de le déclarer absent dans cet
|
|
14
|
+
* intervalle, ou juste après qu'un message a mis fin à son attente.
|
|
15
|
+
*/
|
|
16
|
+
const GRACE_MS = 2 * 60 * 1000;
|
|
17
|
+
export class WatcherRegistry {
|
|
18
|
+
now;
|
|
19
|
+
presence = new Map();
|
|
20
|
+
/** L'horloge est injectable : le délai de grâce se teste sans faire attendre la suite. */
|
|
21
|
+
constructor(now = Date.now) {
|
|
22
|
+
this.now = now;
|
|
23
|
+
}
|
|
24
|
+
/** Déclare une attente de veilleur. La fonction rendue la clôt, et doit toujours être appelée. */
|
|
25
|
+
begin(agentId) {
|
|
26
|
+
const now = this.now();
|
|
27
|
+
const current = this.presence.get(agentId);
|
|
28
|
+
// Une absence dépassant le délai de grâce commence une nouvelle série : `since`
|
|
29
|
+
// désigne le moment où ce veilleur-ci s'est armé, pas un ancêtre oublié.
|
|
30
|
+
const continuing = current && now - current.lastSeen <= GRACE_MS;
|
|
31
|
+
const entry = continuing
|
|
32
|
+
? { ...current, inflight: current.inflight + 1, lastSeen: now }
|
|
33
|
+
: { inflight: 1, since: now, lastSeen: now };
|
|
34
|
+
this.presence.set(agentId, entry);
|
|
35
|
+
let released = false;
|
|
36
|
+
return () => {
|
|
37
|
+
if (released)
|
|
38
|
+
return;
|
|
39
|
+
released = true;
|
|
40
|
+
const active = this.presence.get(agentId);
|
|
41
|
+
if (!active)
|
|
42
|
+
return;
|
|
43
|
+
// On garde l'entrée après la dernière attente : c'est elle qui porte le délai de
|
|
44
|
+
// grâce, le temps que le veilleur relance son tour suivant.
|
|
45
|
+
this.presence.set(agentId, {
|
|
46
|
+
...active,
|
|
47
|
+
inflight: Math.max(0, active.inflight - 1),
|
|
48
|
+
lastSeen: this.now(),
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
status(agentId) {
|
|
53
|
+
const now = this.now();
|
|
54
|
+
const entry = this.presence.get(agentId);
|
|
55
|
+
if (!entry)
|
|
56
|
+
return { armed: false, since: null, last_seen: null };
|
|
57
|
+
const armed = entry.inflight > 0 || now - entry.lastSeen <= GRACE_MS;
|
|
58
|
+
if (!armed) {
|
|
59
|
+
// Purge à la lecture : sans veilleur pour cette boîte, l'entrée n'a plus d'objet.
|
|
60
|
+
this.presence.delete(agentId);
|
|
61
|
+
return { armed: false, since: null, last_seen: new Date(entry.lastSeen).toISOString() };
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
armed: true,
|
|
65
|
+
since: new Date(entry.since).toISOString(),
|
|
66
|
+
last_seen: new Date(entry.lastSeen).toISOString(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const APP_VERSION = "1.0.
|
|
1
|
+
export declare const APP_VERSION = "1.0.5";
|
package/dist/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Généré par scripts/generate-version.js — ne pas modifier à la main.
|
|
2
|
-
export const APP_VERSION = "1.0.
|
|
2
|
+
export const APP_VERSION = "1.0.5";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imenam/mcp-messenger",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"main": "dist/src/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "npm run build && vitest run",
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"@types/better-sqlite3": "^7.6.13",
|
|
49
49
|
"@types/express": "^5.0.6",
|
|
50
50
|
"@types/node": "^22.20.1",
|
|
51
|
+
"@vitest/coverage-v8": "^3.2.7",
|
|
51
52
|
"typescript": "^5.9.3",
|
|
52
53
|
"vitest": "^3.2.7"
|
|
53
54
|
},
|