overmind-mcp 2.8.12 → 2.8.13
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/dist/bridge/AgentRegistry.d.ts +123 -0
- package/dist/bridge/AgentRegistry.d.ts.map +1 -0
- package/dist/bridge/AgentRegistry.js +207 -0
- package/dist/bridge/AgentRegistry.js.map +1 -0
- package/dist/bridge/MessageLog.d.ts +142 -0
- package/dist/bridge/MessageLog.d.ts.map +1 -0
- package/dist/bridge/MessageLog.js +311 -0
- package/dist/bridge/MessageLog.js.map +1 -0
- package/dist/bridge/OverBridgeServer.d.ts +145 -0
- package/dist/bridge/OverBridgeServer.d.ts.map +1 -0
- package/dist/bridge/OverBridgeServer.js +654 -0
- package/dist/bridge/OverBridgeServer.js.map +1 -0
- package/dist/bridge/index.d.ts +7 -1
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +9 -1
- package/dist/bridge/index.js.map +1 -1
- package/dist/services/AgentManager.d.ts.map +1 -1
- package/dist/services/AgentManager.js +16 -3
- package/dist/services/AgentManager.js.map +1 -1
- package/dist/tools/create_agent.d.ts.map +1 -1
- package/dist/tools/create_agent.js +11 -0
- package/dist/tools/create_agent.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — AgentRegistry (In-Memory State Tracker) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Tracke l'état live de chaque agent : busy / idle / offline. ║
|
|
6
|
+
* ║ Sérialise les appels concurrents vers un même agent via mutex. ║
|
|
7
|
+
* ║ ║
|
|
8
|
+
* ║ ARCHITECTURE ║
|
|
9
|
+
* ║ ───────────── ║
|
|
10
|
+
* ║ OverBridgeServer → AgentRegistry → (mutex per agent) ║
|
|
11
|
+
* ║ → OverBridgeService.runAgent() ║
|
|
12
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
13
|
+
*/
|
|
14
|
+
import type { RunnerType } from './types.js';
|
|
15
|
+
import { type BridgeLogger } from './utils.js';
|
|
16
|
+
export type AgentLiveStatus = 'online' | 'offline' | 'busy' | 'idle';
|
|
17
|
+
export interface AgentLiveState {
|
|
18
|
+
name: string;
|
|
19
|
+
runner: RunnerType;
|
|
20
|
+
status: AgentLiveStatus;
|
|
21
|
+
/** PID du process si connu (via agent_control status) */
|
|
22
|
+
pid?: number;
|
|
23
|
+
/** SessionId de l'appel en cours (si busy) */
|
|
24
|
+
currentSessionId?: string;
|
|
25
|
+
/** Timestamp dernière activité (runAgent / heartbeat) */
|
|
26
|
+
lastActivityAt: number;
|
|
27
|
+
/** Compteur de runs total depuis le boot du bridge */
|
|
28
|
+
totalRuns: number;
|
|
29
|
+
/** Compteur de runs échoués */
|
|
30
|
+
totalErrors: number;
|
|
31
|
+
/** Compteur A2A (combien de fois cet agent a été appelé par un autre agent) */
|
|
32
|
+
a2aReceived: number;
|
|
33
|
+
/** Compteur A2A (combien de fois cet agent a appelé un autre agent) */
|
|
34
|
+
a2aSent: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ListAgentsFilter {
|
|
37
|
+
/** Filtre par status (ex: tous les 'busy') */
|
|
38
|
+
status?: AgentLiveStatus;
|
|
39
|
+
/** Filtre par runner (ex: 'claude', 'hermes') */
|
|
40
|
+
runner?: RunnerType;
|
|
41
|
+
}
|
|
42
|
+
export declare class AgentRegistry {
|
|
43
|
+
private readonly states;
|
|
44
|
+
private readonly mutexes;
|
|
45
|
+
private readonly log;
|
|
46
|
+
constructor(logger?: BridgeLogger);
|
|
47
|
+
/**
|
|
48
|
+
* Récupère (ou crée) le mutex associé à un agent.
|
|
49
|
+
* Garantit qu'un seul appel runAgent tourne à la fois par agent.
|
|
50
|
+
*/
|
|
51
|
+
private getMutex;
|
|
52
|
+
/**
|
|
53
|
+
* Exécute une fonction sous le mutex de l'agent.
|
|
54
|
+
* Bloque si un autre run est en cours sur le même agent.
|
|
55
|
+
*/
|
|
56
|
+
withLock<T>(agentName: string, fn: () => Promise<T>): Promise<T>;
|
|
57
|
+
/**
|
|
58
|
+
* Vérifie si un run est actuellement en cours sur cet agent.
|
|
59
|
+
*/
|
|
60
|
+
isBusy(agentName: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Initialise ou met à jour l'état d'un agent.
|
|
63
|
+
* Appelé au premier runAgent ou explicitement via register().
|
|
64
|
+
*/
|
|
65
|
+
register(agentName: string, runner: RunnerType): AgentLiveState;
|
|
66
|
+
/**
|
|
67
|
+
* Marque un agent comme busy (run en cours).
|
|
68
|
+
*/
|
|
69
|
+
markBusy(agentName: string, sessionId?: string, pid?: number): void;
|
|
70
|
+
/**
|
|
71
|
+
* Marque un agent comme idle (run terminé, agent dispo).
|
|
72
|
+
*/
|
|
73
|
+
markIdle(agentName: string, success: boolean): void;
|
|
74
|
+
/**
|
|
75
|
+
* Marque un agent comme offline (kill, crash, ou jamais vu).
|
|
76
|
+
*/
|
|
77
|
+
markOffline(agentName: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* Marque un agent comme online (vu récemment, pas en cours).
|
|
80
|
+
*/
|
|
81
|
+
markOnline(agentName: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Incrémente le compteur A2A received (cet agent a été appelé par un autre).
|
|
84
|
+
*/
|
|
85
|
+
incrementA2aReceived(agentName: string): void;
|
|
86
|
+
/**
|
|
87
|
+
* Incrémente le compteur A2A sent (cet agent a appelé un autre).
|
|
88
|
+
*/
|
|
89
|
+
incrementA2aSent(agentName: string): void;
|
|
90
|
+
/**
|
|
91
|
+
* Récupère l'état d'un agent. Retourne undefined si jamais vu.
|
|
92
|
+
*/
|
|
93
|
+
get(agentName: string): AgentLiveState | undefined;
|
|
94
|
+
/**
|
|
95
|
+
* Liste tous les agents connus, optionnellement filtrés.
|
|
96
|
+
*/
|
|
97
|
+
list(filter?: ListAgentsFilter): AgentLiveState[];
|
|
98
|
+
/**
|
|
99
|
+
* Liste les agents actuellement busy (utile pour /status global).
|
|
100
|
+
*/
|
|
101
|
+
listBusy(): AgentLiveState[];
|
|
102
|
+
/**
|
|
103
|
+
* Liste les agents online et idle (disponibles pour run).
|
|
104
|
+
*/
|
|
105
|
+
listAvailable(): AgentLiveState[];
|
|
106
|
+
/**
|
|
107
|
+
* Statistiques globales du registry.
|
|
108
|
+
*/
|
|
109
|
+
stats(): {
|
|
110
|
+
total: number;
|
|
111
|
+
online: number;
|
|
112
|
+
busy: number;
|
|
113
|
+
offline: number;
|
|
114
|
+
totalRuns: number;
|
|
115
|
+
totalErrors: number;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Purge les agents offline depuis plus de `maxAgeMs`.
|
|
119
|
+
* Évite que la map grossisse indéfiniment.
|
|
120
|
+
*/
|
|
121
|
+
prune(maxAgeMs?: number): number;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=AgentRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRegistry.d.ts","sourceRoot":"","sources":["../../src/bridge/AgentRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAInE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;IACxB,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,iDAAiD;IACjD,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,MAAM,CAAC,EAAE,YAAY;IAMjC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAShB;;;OAGG;IACG,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAItE;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAMlC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,cAAc;IAqB/D;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IASnE;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAUnD;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQpC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOnC;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK7C;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOzC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAKlD;;OAEG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,cAAc,EAAE;IAWjD;;OAEG;IACH,QAAQ,IAAI,cAAc,EAAE;IAI5B;;OAEG;IACH,aAAa,IAAI,cAAc,EAAE;IAIjC;;OAEG;IACH,KAAK,IAAI;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB;IAYD;;;OAGG;IACH,KAAK,CAAC,QAAQ,SAAsB,GAAG,MAAM;CAe9C"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — AgentRegistry (In-Memory State Tracker) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Tracke l'état live de chaque agent : busy / idle / offline. ║
|
|
6
|
+
* ║ Sérialise les appels concurrents vers un même agent via mutex. ║
|
|
7
|
+
* ║ ║
|
|
8
|
+
* ║ ARCHITECTURE ║
|
|
9
|
+
* ║ ───────────── ║
|
|
10
|
+
* ║ OverBridgeServer → AgentRegistry → (mutex per agent) ║
|
|
11
|
+
* ║ → OverBridgeService.runAgent() ║
|
|
12
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
13
|
+
*/
|
|
14
|
+
import { Mutex } from 'async-mutex';
|
|
15
|
+
import { createBridgeLogger } from './utils.js';
|
|
16
|
+
// ─── AgentRegistry ────────────────────────────────────────────────────────
|
|
17
|
+
export class AgentRegistry {
|
|
18
|
+
states = new Map();
|
|
19
|
+
mutexes = new Map();
|
|
20
|
+
log;
|
|
21
|
+
constructor(logger) {
|
|
22
|
+
this.log = logger ?? createBridgeLogger('agent-registry');
|
|
23
|
+
}
|
|
24
|
+
// ─── Mutex Helpers ──────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Récupère (ou crée) le mutex associé à un agent.
|
|
27
|
+
* Garantit qu'un seul appel runAgent tourne à la fois par agent.
|
|
28
|
+
*/
|
|
29
|
+
getMutex(agentName) {
|
|
30
|
+
let mutex = this.mutexes.get(agentName);
|
|
31
|
+
if (!mutex) {
|
|
32
|
+
mutex = new Mutex();
|
|
33
|
+
this.mutexes.set(agentName, mutex);
|
|
34
|
+
}
|
|
35
|
+
return mutex;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Exécute une fonction sous le mutex de l'agent.
|
|
39
|
+
* Bloque si un autre run est en cours sur le même agent.
|
|
40
|
+
*/
|
|
41
|
+
async withLock(agentName, fn) {
|
|
42
|
+
return this.getMutex(agentName).runExclusive(fn);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Vérifie si un run est actuellement en cours sur cet agent.
|
|
46
|
+
*/
|
|
47
|
+
isBusy(agentName) {
|
|
48
|
+
return this.getMutex(agentName).isLocked();
|
|
49
|
+
}
|
|
50
|
+
// ─── State Management ───────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Initialise ou met à jour l'état d'un agent.
|
|
53
|
+
* Appelé au premier runAgent ou explicitement via register().
|
|
54
|
+
*/
|
|
55
|
+
register(agentName, runner) {
|
|
56
|
+
const existing = this.states.get(agentName);
|
|
57
|
+
if (existing) {
|
|
58
|
+
existing.runner = runner; // Update runner if changed
|
|
59
|
+
return existing;
|
|
60
|
+
}
|
|
61
|
+
const state = {
|
|
62
|
+
name: agentName,
|
|
63
|
+
runner,
|
|
64
|
+
status: 'online',
|
|
65
|
+
lastActivityAt: Date.now(),
|
|
66
|
+
totalRuns: 0,
|
|
67
|
+
totalErrors: 0,
|
|
68
|
+
a2aReceived: 0,
|
|
69
|
+
a2aSent: 0,
|
|
70
|
+
};
|
|
71
|
+
this.states.set(agentName, state);
|
|
72
|
+
this.log.info(`📝 Agent registered: ${agentName} (${runner})`);
|
|
73
|
+
return state;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Marque un agent comme busy (run en cours).
|
|
77
|
+
*/
|
|
78
|
+
markBusy(agentName, sessionId, pid) {
|
|
79
|
+
const state = this.states.get(agentName);
|
|
80
|
+
if (!state)
|
|
81
|
+
return;
|
|
82
|
+
state.status = 'busy';
|
|
83
|
+
state.currentSessionId = sessionId;
|
|
84
|
+
state.pid = pid;
|
|
85
|
+
state.lastActivityAt = Date.now();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Marque un agent comme idle (run terminé, agent dispo).
|
|
89
|
+
*/
|
|
90
|
+
markIdle(agentName, success) {
|
|
91
|
+
const state = this.states.get(agentName);
|
|
92
|
+
if (!state)
|
|
93
|
+
return;
|
|
94
|
+
state.status = 'online';
|
|
95
|
+
state.currentSessionId = undefined;
|
|
96
|
+
state.lastActivityAt = Date.now();
|
|
97
|
+
state.totalRuns++;
|
|
98
|
+
if (!success)
|
|
99
|
+
state.totalErrors++;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Marque un agent comme offline (kill, crash, ou jamais vu).
|
|
103
|
+
*/
|
|
104
|
+
markOffline(agentName) {
|
|
105
|
+
const state = this.states.get(agentName);
|
|
106
|
+
if (!state)
|
|
107
|
+
return;
|
|
108
|
+
state.status = 'offline';
|
|
109
|
+
state.currentSessionId = undefined;
|
|
110
|
+
state.pid = undefined;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Marque un agent comme online (vu récemment, pas en cours).
|
|
114
|
+
*/
|
|
115
|
+
markOnline(agentName) {
|
|
116
|
+
const state = this.states.get(agentName);
|
|
117
|
+
if (!state)
|
|
118
|
+
return;
|
|
119
|
+
state.status = 'online';
|
|
120
|
+
state.lastActivityAt = Date.now();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Incrémente le compteur A2A received (cet agent a été appelé par un autre).
|
|
124
|
+
*/
|
|
125
|
+
incrementA2aReceived(agentName) {
|
|
126
|
+
const state = this.states.get(agentName);
|
|
127
|
+
if (state)
|
|
128
|
+
state.a2aReceived++;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Incrémente le compteur A2A sent (cet agent a appelé un autre).
|
|
132
|
+
*/
|
|
133
|
+
incrementA2aSent(agentName) {
|
|
134
|
+
const state = this.states.get(agentName);
|
|
135
|
+
if (state)
|
|
136
|
+
state.a2aSent++;
|
|
137
|
+
}
|
|
138
|
+
// ─── Queries ────────────────────────────────────────────────────────────
|
|
139
|
+
/**
|
|
140
|
+
* Récupère l'état d'un agent. Retourne undefined si jamais vu.
|
|
141
|
+
*/
|
|
142
|
+
get(agentName) {
|
|
143
|
+
const state = this.states.get(agentName);
|
|
144
|
+
return state ? { ...state } : undefined;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Liste tous les agents connus, optionnellement filtrés.
|
|
148
|
+
*/
|
|
149
|
+
list(filter) {
|
|
150
|
+
const all = Array.from(this.states.values()).map((s) => ({ ...s }));
|
|
151
|
+
if (!filter)
|
|
152
|
+
return all;
|
|
153
|
+
return all.filter((s) => {
|
|
154
|
+
if (filter.status && s.status !== filter.status)
|
|
155
|
+
return false;
|
|
156
|
+
if (filter.runner && s.runner !== filter.runner)
|
|
157
|
+
return false;
|
|
158
|
+
return true;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Liste les agents actuellement busy (utile pour /status global).
|
|
163
|
+
*/
|
|
164
|
+
listBusy() {
|
|
165
|
+
return this.list({ status: 'busy' });
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Liste les agents online et idle (disponibles pour run).
|
|
169
|
+
*/
|
|
170
|
+
listAvailable() {
|
|
171
|
+
return this.list().filter((s) => s.status === 'online' || s.status === 'idle');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Statistiques globales du registry.
|
|
175
|
+
*/
|
|
176
|
+
stats() {
|
|
177
|
+
const all = Array.from(this.states.values());
|
|
178
|
+
return {
|
|
179
|
+
total: all.length,
|
|
180
|
+
online: all.filter((s) => s.status === 'online').length,
|
|
181
|
+
busy: all.filter((s) => s.status === 'busy').length,
|
|
182
|
+
offline: all.filter((s) => s.status === 'offline').length,
|
|
183
|
+
totalRuns: all.reduce((acc, s) => acc + s.totalRuns, 0),
|
|
184
|
+
totalErrors: all.reduce((acc, s) => acc + s.totalErrors, 0),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Purge les agents offline depuis plus de `maxAgeMs`.
|
|
189
|
+
* Évite que la map grossisse indéfiniment.
|
|
190
|
+
*/
|
|
191
|
+
prune(maxAgeMs = 24 * 60 * 60 * 1000) {
|
|
192
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
193
|
+
let pruned = 0;
|
|
194
|
+
for (const [name, state] of this.states) {
|
|
195
|
+
if (state.status === 'offline' && state.lastActivityAt < cutoff) {
|
|
196
|
+
this.states.delete(name);
|
|
197
|
+
this.mutexes.delete(name);
|
|
198
|
+
pruned++;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (pruned > 0) {
|
|
202
|
+
this.log.info(`🧹 Pruned ${pruned} stale offline agents`);
|
|
203
|
+
}
|
|
204
|
+
return pruned;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=AgentRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRegistry.js","sourceRoot":"","sources":["../../src/bridge/AgentRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — MessageLog (Postgres Persistence) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Persiste tous les messages agent↔agent et client→agent dans ║
|
|
6
|
+
* ║ Postgres pour audit, replay après crash, et statistiques. ║
|
|
7
|
+
* ║ ║
|
|
8
|
+
* ║ TABLE ║
|
|
9
|
+
* ║ ────── ║
|
|
10
|
+
* ║ bridge_messages ║
|
|
11
|
+
* ║ id UUID PK ║
|
|
12
|
+
* ║ from_agent TEXT NULL (NULL = client externe) ║
|
|
13
|
+
* ║ to_agent TEXT NOT NULL ║
|
|
14
|
+
* ║ runner TEXT NOT NULL ║
|
|
15
|
+
* ║ prompt TEXT NOT NULL ║
|
|
16
|
+
* ║ response TEXT NULL ║
|
|
17
|
+
* ║ status TEXT NOT NULL (pending|running|done|failed) ║
|
|
18
|
+
* ║ session_id TEXT NULL ║
|
|
19
|
+
* ║ metadata JSONB NULL (path, model, mode, discord ctx) ║
|
|
20
|
+
* ║ error TEXT NULL ║
|
|
21
|
+
* ║ created_at TIMESTAMPTZ ║
|
|
22
|
+
* ║ started_at TIMESTAMPTZ NULL ║
|
|
23
|
+
* ║ completed_at TIMESTAMPTZ NULL ║
|
|
24
|
+
* ║ duration_ms INTEGER NULL ║
|
|
25
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
26
|
+
*/
|
|
27
|
+
import { type BridgeLogger } from './utils.js';
|
|
28
|
+
import type { RunnerType } from './types.js';
|
|
29
|
+
export type MessageStatus = 'pending' | 'running' | 'done' | 'failed' | 'timeout';
|
|
30
|
+
export interface PersistedMessage {
|
|
31
|
+
id: string;
|
|
32
|
+
fromAgent: string | null;
|
|
33
|
+
toAgent: string;
|
|
34
|
+
runner: RunnerType;
|
|
35
|
+
prompt: string;
|
|
36
|
+
response: string | null;
|
|
37
|
+
status: MessageStatus;
|
|
38
|
+
sessionId: string | null;
|
|
39
|
+
metadata: Record<string, unknown> | null;
|
|
40
|
+
error: string | null;
|
|
41
|
+
createdAt: Date;
|
|
42
|
+
startedAt: Date | null;
|
|
43
|
+
completedAt: Date | null;
|
|
44
|
+
durationMs: number | null;
|
|
45
|
+
}
|
|
46
|
+
export interface CreateMessageInput {
|
|
47
|
+
fromAgent?: string | null;
|
|
48
|
+
toAgent: string;
|
|
49
|
+
runner: RunnerType;
|
|
50
|
+
prompt: string;
|
|
51
|
+
sessionId?: string;
|
|
52
|
+
metadata?: Record<string, unknown> | null;
|
|
53
|
+
}
|
|
54
|
+
export interface ListMessagesFilter {
|
|
55
|
+
toAgent?: string;
|
|
56
|
+
/** null = filtre les messages sans fromAgent (i.e. venant d'un client externe) */
|
|
57
|
+
fromAgent?: string | null;
|
|
58
|
+
status?: MessageStatus;
|
|
59
|
+
/** Limite de résultats (default: 50) */
|
|
60
|
+
limit?: number;
|
|
61
|
+
/** Offset pour pagination (default: 0) */
|
|
62
|
+
offset?: number;
|
|
63
|
+
/** Depuis N heures (ex: 24 = dernières 24h) */
|
|
64
|
+
sinceHours?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface MessageLogConfig {
|
|
67
|
+
host: string;
|
|
68
|
+
port: number;
|
|
69
|
+
user: string;
|
|
70
|
+
password: string;
|
|
71
|
+
database: string;
|
|
72
|
+
/** SSL (default: false) */
|
|
73
|
+
ssl?: boolean;
|
|
74
|
+
/** Pool min/max (default: 2/10) */
|
|
75
|
+
poolMin?: number;
|
|
76
|
+
poolMax?: number;
|
|
77
|
+
}
|
|
78
|
+
export declare class MessageLog {
|
|
79
|
+
private readonly config;
|
|
80
|
+
private pool;
|
|
81
|
+
private readonly log;
|
|
82
|
+
private initialized;
|
|
83
|
+
constructor(config: MessageLogConfig, logger?: BridgeLogger);
|
|
84
|
+
/**
|
|
85
|
+
* Initialise le pool Postgres et crée le schéma si nécessaire.
|
|
86
|
+
* Idempotent : peut être appelé plusieurs fois sans danger.
|
|
87
|
+
*/
|
|
88
|
+
init(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Ferme proprement le pool.
|
|
91
|
+
*/
|
|
92
|
+
close(): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Crée un message en status 'pending' et retourne son ID.
|
|
95
|
+
*/
|
|
96
|
+
create(input: CreateMessageInput): Promise<string>;
|
|
97
|
+
/**
|
|
98
|
+
* Marque un message comme 'running' (appel MCP en cours).
|
|
99
|
+
*/
|
|
100
|
+
markRunning(id: string, sessionId?: string): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Marque un message comme 'done' avec sa réponse.
|
|
103
|
+
*/
|
|
104
|
+
markDone(id: string, response: string, sessionId?: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Marque un message comme 'failed' avec erreur.
|
|
107
|
+
*/
|
|
108
|
+
markFailed(id: string, error: string): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Marque un message comme 'timeout'.
|
|
111
|
+
*/
|
|
112
|
+
markTimeout(id: string): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Récupère un message par ID.
|
|
115
|
+
*/
|
|
116
|
+
getById(id: string): Promise<PersistedMessage | null>;
|
|
117
|
+
/**
|
|
118
|
+
* Liste les messages avec filtres et pagination.
|
|
119
|
+
*/
|
|
120
|
+
list(filter?: ListMessagesFilter): Promise<PersistedMessage[]>;
|
|
121
|
+
/**
|
|
122
|
+
* Trouve les messages 'pending' ou 'running' depuis plus de X minutes (stuck).
|
|
123
|
+
* Utile pour le replay automatique au redémarrage.
|
|
124
|
+
*/
|
|
125
|
+
findStuck(stuckAfterMinutes?: number): Promise<PersistedMessage[]>;
|
|
126
|
+
/**
|
|
127
|
+
* Statistiques globales du log.
|
|
128
|
+
*/
|
|
129
|
+
stats(sinceHours?: number): Promise<{
|
|
130
|
+
total: number;
|
|
131
|
+
byStatus: Record<MessageStatus, number>;
|
|
132
|
+
byRunner: Record<string, number>;
|
|
133
|
+
avgDurationMs: number | null;
|
|
134
|
+
}>;
|
|
135
|
+
private assertReady;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Charge la config Postgres depuis process.env (POSTGRES_*).
|
|
139
|
+
* Utilise les variables déjà dans .env.
|
|
140
|
+
*/
|
|
141
|
+
export declare function loadMessageLogConfigFromEnv(): MessageLogConfig;
|
|
142
|
+
//# sourceMappingURL=MessageLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageLog.d.ts","sourceRoot":"","sources":["../../src/bridge/MessageLog.ts"],"names":[],"mappings":"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"}
|