overmind-mcp 2.8.12 → 2.8.14

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.
Files changed (71) hide show
  1. package/dist/bin/launch.js +78 -0
  2. package/dist/bin/overmind-bridge.d.ts +42 -0
  3. package/dist/bin/overmind-bridge.d.ts.map +1 -0
  4. package/dist/bin/overmind-bridge.js +503 -0
  5. package/dist/bin/overmind-bridge.js.map +1 -0
  6. package/dist/bridge/AgentRegistry.d.ts +123 -0
  7. package/dist/bridge/AgentRegistry.d.ts.map +1 -0
  8. package/dist/bridge/AgentRegistry.js +207 -0
  9. package/dist/bridge/AgentRegistry.js.map +1 -0
  10. package/dist/bridge/ArgParser.d.ts +45 -0
  11. package/dist/bridge/ArgParser.d.ts.map +1 -0
  12. package/dist/bridge/ArgParser.js +134 -0
  13. package/dist/bridge/ArgParser.js.map +1 -0
  14. package/dist/bridge/BridgeHttpClient.d.ts +61 -0
  15. package/dist/bridge/BridgeHttpClient.d.ts.map +1 -0
  16. package/dist/bridge/BridgeHttpClient.js +164 -0
  17. package/dist/bridge/BridgeHttpClient.js.map +1 -0
  18. package/dist/bridge/DirectiveParser.d.ts +82 -0
  19. package/dist/bridge/DirectiveParser.d.ts.map +1 -0
  20. package/dist/bridge/DirectiveParser.js +154 -0
  21. package/dist/bridge/DirectiveParser.js.map +1 -0
  22. package/dist/bridge/JsonSanitizer.d.ts +34 -0
  23. package/dist/bridge/JsonSanitizer.d.ts.map +1 -0
  24. package/dist/bridge/JsonSanitizer.js +90 -0
  25. package/dist/bridge/JsonSanitizer.js.map +1 -0
  26. package/dist/bridge/MessageLog.d.ts +142 -0
  27. package/dist/bridge/MessageLog.d.ts.map +1 -0
  28. package/dist/bridge/MessageLog.js +311 -0
  29. package/dist/bridge/MessageLog.js.map +1 -0
  30. package/dist/bridge/OverBridgeServer.d.ts +179 -0
  31. package/dist/bridge/OverBridgeServer.d.ts.map +1 -0
  32. package/dist/bridge/OverBridgeServer.js +982 -0
  33. package/dist/bridge/OverBridgeServer.js.map +1 -0
  34. package/dist/bridge/PromptSource.d.ts +66 -0
  35. package/dist/bridge/PromptSource.d.ts.map +1 -0
  36. package/dist/bridge/PromptSource.js +152 -0
  37. package/dist/bridge/PromptSource.js.map +1 -0
  38. package/dist/bridge/RequestContext.d.ts +19 -0
  39. package/dist/bridge/RequestContext.d.ts.map +1 -0
  40. package/dist/bridge/RequestContext.js +34 -0
  41. package/dist/bridge/RequestContext.js.map +1 -0
  42. package/dist/bridge/ScenarioLoader.d.ts +124 -0
  43. package/dist/bridge/ScenarioLoader.d.ts.map +1 -0
  44. package/dist/bridge/ScenarioLoader.js +333 -0
  45. package/dist/bridge/ScenarioLoader.js.map +1 -0
  46. package/dist/bridge/SessionStore.d.ts +109 -0
  47. package/dist/bridge/SessionStore.d.ts.map +1 -0
  48. package/dist/bridge/SessionStore.js +220 -0
  49. package/dist/bridge/SessionStore.js.map +1 -0
  50. package/dist/bridge/WebhookAdapter.d.ts +76 -0
  51. package/dist/bridge/WebhookAdapter.d.ts.map +1 -0
  52. package/dist/bridge/WebhookAdapter.js +186 -0
  53. package/dist/bridge/WebhookAdapter.js.map +1 -0
  54. package/dist/bridge/index.d.ts +23 -1
  55. package/dist/bridge/index.d.ts.map +1 -1
  56. package/dist/bridge/index.js +19 -1
  57. package/dist/bridge/index.js.map +1 -1
  58. package/dist/bridge/utils.d.ts +9 -0
  59. package/dist/bridge/utils.d.ts.map +1 -1
  60. package/dist/bridge/utils.js +17 -0
  61. package/dist/bridge/utils.js.map +1 -1
  62. package/dist/services/AgentManager.d.ts.map +1 -1
  63. package/dist/services/AgentManager.js +16 -3
  64. package/dist/services/AgentManager.js.map +1 -1
  65. package/dist/services/NousHermesRunner.d.ts.map +1 -1
  66. package/dist/services/NousHermesRunner.js +47 -8
  67. package/dist/services/NousHermesRunner.js.map +1 -1
  68. package/dist/tools/create_agent.d.ts.map +1 -1
  69. package/dist/tools/create_agent.js +11 -0
  70. package/dist/tools/create_agent.js.map +1 -1
  71. package/package.json +2 -1
@@ -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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"}
@@ -0,0 +1,311 @@
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 pg from 'pg';
28
+ import { createBridgeLogger } from './utils.js';
29
+ // ─── Schema SQL ───────────────────────────────────────────────────────────
30
+ const SCHEMA_SQL = `
31
+ CREATE EXTENSION IF NOT EXISTS "pgcrypto";
32
+
33
+ CREATE TABLE IF NOT EXISTS bridge_messages (
34
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
35
+ from_agent TEXT NULL,
36
+ to_agent TEXT NOT NULL,
37
+ runner TEXT NOT NULL,
38
+ prompt TEXT NOT NULL,
39
+ response TEXT NULL,
40
+ status TEXT NOT NULL DEFAULT 'pending',
41
+ session_id TEXT NULL,
42
+ metadata JSONB NULL,
43
+ error TEXT NULL,
44
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
45
+ started_at TIMESTAMPTZ NULL,
46
+ completed_at TIMESTAMPTZ NULL,
47
+ duration_ms INTEGER NULL
48
+ );
49
+
50
+ CREATE INDEX IF NOT EXISTS idx_bridge_messages_status ON bridge_messages(status);
51
+ CREATE INDEX IF NOT EXISTS idx_bridge_messages_to_agent ON bridge_messages(to_agent, created_at DESC);
52
+ CREATE INDEX IF NOT EXISTS idx_bridge_messages_from_agent ON bridge_messages(from_agent, created_at DESC);
53
+ CREATE INDEX IF NOT EXISTS idx_bridge_messages_session ON bridge_messages(session_id);
54
+ CREATE INDEX IF NOT EXISTS idx_bridge_messages_created ON bridge_messages(created_at DESC);
55
+ `;
56
+ // ─── MessageLog ───────────────────────────────────────────────────────────
57
+ export class MessageLog {
58
+ config;
59
+ pool;
60
+ log;
61
+ initialized = false;
62
+ constructor(config, logger) {
63
+ this.config = config;
64
+ this.log = logger ?? createBridgeLogger('message-log');
65
+ }
66
+ // ─── Lifecycle ───────────────────────────────────────────────────────────
67
+ /**
68
+ * Initialise le pool Postgres et crée le schéma si nécessaire.
69
+ * Idempotent : peut être appelé plusieurs fois sans danger.
70
+ */
71
+ async init() {
72
+ if (this.initialized)
73
+ return;
74
+ this.log.info(`🐘 Connecting to Postgres ${this.config.host}:${this.config.port}/${this.config.database}...`);
75
+ this.pool = new pg.Pool({
76
+ host: this.config.host,
77
+ port: this.config.port,
78
+ user: this.config.user,
79
+ password: this.config.password,
80
+ database: this.config.database,
81
+ ssl: this.config.ssl ? { rejectUnauthorized: false } : false,
82
+ min: this.config.poolMin ?? 2,
83
+ max: this.config.poolMax ?? 10,
84
+ idleTimeoutMillis: 30_000,
85
+ });
86
+ // Test connexion
87
+ const client = await this.pool.connect();
88
+ try {
89
+ await client.query('SELECT 1');
90
+ this.log.info('🐘 Postgres connection OK');
91
+ }
92
+ finally {
93
+ client.release();
94
+ }
95
+ // Crée le schéma
96
+ await this.pool.query(SCHEMA_SQL);
97
+ this.log.info('🐘 Schema bridge_messages ready');
98
+ this.initialized = true;
99
+ }
100
+ /**
101
+ * Ferme proprement le pool.
102
+ */
103
+ async close() {
104
+ if (this.pool) {
105
+ await this.pool.end();
106
+ this.pool = undefined;
107
+ this.initialized = false;
108
+ this.log.info('🐘 Postgres pool closed');
109
+ }
110
+ }
111
+ // ─── CRUD ────────────────────────────────────────────────────────────────
112
+ /**
113
+ * Crée un message en status 'pending' et retourne son ID.
114
+ */
115
+ async create(input) {
116
+ this.assertReady();
117
+ const result = await this.pool.query(`INSERT INTO bridge_messages
118
+ (from_agent, to_agent, runner, prompt, session_id, metadata, status)
119
+ VALUES ($1, $2, $3, $4, $5, $6, 'pending')
120
+ RETURNING id`, [
121
+ input.fromAgent ?? null,
122
+ input.toAgent,
123
+ input.runner,
124
+ input.prompt,
125
+ input.sessionId ?? null,
126
+ input.metadata ? JSON.stringify(input.metadata) : null,
127
+ ]);
128
+ return result.rows[0].id;
129
+ }
130
+ /**
131
+ * Marque un message comme 'running' (appel MCP en cours).
132
+ */
133
+ async markRunning(id, sessionId) {
134
+ this.assertReady();
135
+ await this.pool.query(`UPDATE bridge_messages
136
+ SET status = 'running', started_at = now(), session_id = COALESCE($2, session_id)
137
+ WHERE id = $1`, [id, sessionId ?? null]);
138
+ }
139
+ /**
140
+ * Marque un message comme 'done' avec sa réponse.
141
+ */
142
+ async markDone(id, response, sessionId) {
143
+ this.assertReady();
144
+ await this.pool.query(`UPDATE bridge_messages
145
+ SET status = 'done',
146
+ response = $2,
147
+ session_id = COALESCE($3, session_id),
148
+ completed_at = now(),
149
+ duration_ms = EXTRACT(MILLISECOND FROM (now() - started_at))::int
150
+ + EXTRACT(SECOND FROM (now() - started_at))::int * 1000
151
+ + EXTRACT(MINUTE FROM (now() - started_at))::int * 60_000
152
+ WHERE id = $1`, [id, response, sessionId ?? null]);
153
+ }
154
+ /**
155
+ * Marque un message comme 'failed' avec erreur.
156
+ */
157
+ async markFailed(id, error) {
158
+ this.assertReady();
159
+ await this.pool.query(`UPDATE bridge_messages
160
+ SET status = 'failed', error = $2, completed_at = now()
161
+ WHERE id = $1`, [id, error]);
162
+ }
163
+ /**
164
+ * Marque un message comme 'timeout'.
165
+ */
166
+ async markTimeout(id) {
167
+ this.assertReady();
168
+ await this.pool.query(`UPDATE bridge_messages
169
+ SET status = 'timeout', completed_at = now()
170
+ WHERE id = $1`, [id]);
171
+ }
172
+ /**
173
+ * Récupère un message par ID.
174
+ */
175
+ async getById(id) {
176
+ this.assertReady();
177
+ const result = await this.pool.query('SELECT * FROM bridge_messages WHERE id = $1', [id]);
178
+ return result.rows[0] ? rowToMessage(result.rows[0]) : null;
179
+ }
180
+ /**
181
+ * Liste les messages avec filtres et pagination.
182
+ */
183
+ async list(filter = {}) {
184
+ this.assertReady();
185
+ const limit = filter.limit ?? 50;
186
+ const offset = filter.offset ?? 0;
187
+ const conditions = [];
188
+ const params = [];
189
+ if (filter.toAgent) {
190
+ params.push(filter.toAgent);
191
+ conditions.push(`to_agent = $${params.length}`);
192
+ }
193
+ if (filter.fromAgent !== undefined) {
194
+ if (filter.fromAgent === null) {
195
+ conditions.push(`from_agent IS NULL`);
196
+ }
197
+ else {
198
+ params.push(filter.fromAgent);
199
+ conditions.push(`from_agent = $${params.length}`);
200
+ }
201
+ }
202
+ if (filter.status) {
203
+ params.push(filter.status);
204
+ conditions.push(`status = $${params.length}`);
205
+ }
206
+ if (filter.sinceHours) {
207
+ params.push(filter.sinceHours);
208
+ conditions.push(`created_at > now() - ($${params.length} || ' hours')::interval`);
209
+ }
210
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
211
+ params.push(limit, offset);
212
+ const result = await this.pool.query(`SELECT * FROM bridge_messages ${where}
213
+ ORDER BY created_at DESC
214
+ LIMIT $${params.length - 1} OFFSET $${params.length}`, params);
215
+ return result.rows.map(rowToMessage);
216
+ }
217
+ /**
218
+ * Trouve les messages 'pending' ou 'running' depuis plus de X minutes (stuck).
219
+ * Utile pour le replay automatique au redémarrage.
220
+ */
221
+ async findStuck(stuckAfterMinutes = 5) {
222
+ this.assertReady();
223
+ const result = await this.pool.query(`SELECT * FROM bridge_messages
224
+ WHERE status IN ('pending', 'running')
225
+ AND created_at < now() - ($1 || ' minutes')::interval
226
+ ORDER BY created_at ASC`, [stuckAfterMinutes]);
227
+ return result.rows.map(rowToMessage);
228
+ }
229
+ /**
230
+ * Statistiques globales du log.
231
+ */
232
+ async stats(sinceHours = 24) {
233
+ this.assertReady();
234
+ const result = await this.pool.query(`SELECT COUNT(*)::text AS total, AVG(duration_ms)::text AS avg_duration
235
+ FROM bridge_messages
236
+ WHERE created_at > now() - ($1 || ' hours')::interval`, [sinceHours]);
237
+ const byStatusResult = await this.pool.query(`SELECT status, COUNT(*)::text AS count
238
+ FROM bridge_messages
239
+ WHERE created_at > now() - ($1 || ' hours')::interval
240
+ GROUP BY status`, [sinceHours]);
241
+ const byRunnerResult = await this.pool.query(`SELECT runner, COUNT(*)::text AS count
242
+ FROM bridge_messages
243
+ WHERE created_at > now() - ($1 || ' hours')::interval
244
+ GROUP BY runner`, [sinceHours]);
245
+ const total = Number(result.rows[0]?.total ?? 0);
246
+ const byStatus = {
247
+ pending: 0,
248
+ running: 0,
249
+ done: 0,
250
+ failed: 0,
251
+ timeout: 0,
252
+ };
253
+ for (const row of byStatusResult.rows) {
254
+ byStatus[row.status] = Number(row.count);
255
+ }
256
+ const byRunner = {};
257
+ for (const row of byRunnerResult.rows) {
258
+ byRunner[row.runner] = Number(row.count);
259
+ }
260
+ const avgDurationMs = result.rows[0]?.avg_duration
261
+ ? Math.round(Number(result.rows[0].avg_duration))
262
+ : null;
263
+ return { total, byStatus, byRunner, avgDurationMs };
264
+ }
265
+ // ─── Internal ───────────────────────────────────────────────────────────
266
+ assertReady() {
267
+ if (!this.initialized || !this.pool) {
268
+ throw new Error('MessageLog not initialized. Call init() first.');
269
+ }
270
+ }
271
+ }
272
+ function rowToMessage(row) {
273
+ return {
274
+ id: row.id,
275
+ fromAgent: row.from_agent,
276
+ toAgent: row.to_agent,
277
+ runner: row.runner,
278
+ prompt: row.prompt,
279
+ response: row.response,
280
+ status: row.status,
281
+ sessionId: row.session_id,
282
+ metadata: row.metadata,
283
+ error: row.error,
284
+ createdAt: row.created_at,
285
+ startedAt: row.started_at,
286
+ completedAt: row.completed_at,
287
+ durationMs: row.duration_ms,
288
+ };
289
+ }
290
+ // ─── Env Loader ───────────────────────────────────────────────────────────
291
+ /**
292
+ * Charge la config Postgres depuis process.env (POSTGRES_*).
293
+ * Utilise les variables déjà dans .env.
294
+ */
295
+ export function loadMessageLogConfigFromEnv() {
296
+ const num = (v, def) => {
297
+ const n = v ? Number(v) : NaN;
298
+ return Number.isFinite(n) ? n : def;
299
+ };
300
+ return {
301
+ host: process.env.POSTGRES_HOST ?? 'localhost',
302
+ port: num(process.env.POSTGRES_PORT, 5432),
303
+ user: process.env.POSTGRES_USER ?? 'postgres',
304
+ password: process.env.POSTGRES_PASSWORD ?? '',
305
+ database: process.env.POSTGRES_DB ?? 'overmind_memory',
306
+ ssl: process.env.POSTGRES_SSL === 'true',
307
+ poolMin: num(process.env.POSTGRES_POOL_MIN, 2),
308
+ poolMax: num(process.env.POSTGRES_POOL_MAX, 10),
309
+ };
310
+ }
311
+ //# sourceMappingURL=MessageLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageLog.js","sourceRoot":"","sources":["../../src/bridge/MessageLog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * ╔══════════════════════════════════════════════════════════════════════╗
3
+ * ║ OVERMIND BRIDGE — OverBridgeServer (HTTP JSON-RPC 2.0 Entry Point)║
4
+ * ║ ║
5
+ * ║ Serveur HTTP qui expose l'API Overmind Bridge via JSON-RPC 2.0. ║
6
+ * ║ Permet à n'importe quel client (curl, Python, fetch...) de : ║
7
+ * ║ - Parler à un agent ║
8
+ * ║ - Faire parler des agents entre eux (A2A) ║
9
+ * ║ - Suivre l'état live des agents (busy/idle/online) ║
10
+ * ║ - Consulter l'historique persistant des messages ║
11
+ * ║ ║
12
+ * ║ ARCHITECTURE ║
13
+ * ║ ───────────── ║
14
+ * ║ Client HTTP → POST /rpc → JSON-RPC dispatcher ║
15
+ * ║ → OverBridgeService (deja wrappe MCP) ║
16
+ * ║ → AgentRegistry (etat live) ║
17
+ * ║ → MessageLog (persistence Postgres) ║
18
+ * ║ → Overmind MCP :3099 ║
19
+ * ╚══════════════════════════════════════════════════════════════════════╝
20
+ */
21
+ import { OverBridgeService } from './OverBridgeService.js';
22
+ import { AgentRegistry } from './AgentRegistry.js';
23
+ import { MessageLog, type MessageLogConfig } from './MessageLog.js';
24
+ import { SessionStore } from './SessionStore.js';
25
+ import { type BridgeLogger } from './utils.js';
26
+ export interface JsonRpcRequest {
27
+ jsonrpc: '2.0';
28
+ id?: number | string | null;
29
+ method: string;
30
+ params?: Record<string, unknown>;
31
+ }
32
+ export interface JsonRpcResponse {
33
+ jsonrpc: '2.0';
34
+ id: number | string | null;
35
+ result?: unknown;
36
+ error?: {
37
+ code: number;
38
+ message: string;
39
+ data?: unknown;
40
+ };
41
+ }
42
+ export interface OverBridgeServerConfig {
43
+ /** Port d'écoute HTTP (default: 3100) */
44
+ port: number;
45
+ /** Host d'écoute (default: '127.0.0.1') */
46
+ host: string;
47
+ /** Config Postgres pour MessageLog */
48
+ postgres: MessageLogConfig;
49
+ /** Active le MessageLog (si false, les messages ne sont pas persistés) */
50
+ enableMessageLog: boolean;
51
+ /** Authentification simple par token (Authorization: Bearer *** — optionnel */
52
+ authToken?: string;
53
+ /** Health check interval pour OverBridgeService (default: 30000ms) */
54
+ healthCheckIntervalMs: number;
55
+ /** Active le SessionStore multi-tenant (sessions par clé externe) */
56
+ enableSessionStore?: boolean;
57
+ /** Chemin du fichier de persistence des sessions (default: ~/.overmind/bridge/sessions.json) */
58
+ sessionStorePath?: string;
59
+ /** TTL des sessions en ms (default: 4h) */
60
+ sessionTtlMs?: number;
61
+ /** Active le parsing de directives dans les réponses agent (SESSION_ID, CONTEXT_UPDATE, BRIDGE_NEXT) */
62
+ enableDirectives?: boolean;
63
+ /** Active le support webhook (auto-mount /webhook/:provider endpoints) */
64
+ enableWebhooks?: boolean;
65
+ /** JSON body limit (default: '10mb') */
66
+ jsonBodyLimit?: string;
67
+ /** Active la sanitization JSON (Windows paths) */
68
+ sanitizeJson?: boolean;
69
+ }
70
+ export declare class OverBridgeServer {
71
+ private readonly service;
72
+ private readonly registry;
73
+ private readonly log;
74
+ private readonly messageLog;
75
+ private readonly sessions;
76
+ private readonly directiveParser;
77
+ private readonly webhookAdapter;
78
+ private readonly config;
79
+ private server;
80
+ private startTime;
81
+ constructor(service: OverBridgeService, config: OverBridgeServerConfig, logger?: BridgeLogger);
82
+ /**
83
+ * Démarre le serveur HTTP et initialise les dépendances (MessageLog, SessionStore, OverBridgeService).
84
+ */
85
+ start(): Promise<{
86
+ port: number;
87
+ host: string;
88
+ url: string;
89
+ }>;
90
+ /**
91
+ * Ferme proprement le serveur HTTP et les dépendances.
92
+ */
93
+ stop(): Promise<void>;
94
+ /**
95
+ * Expose le registry (pour tests / inspection).
96
+ */
97
+ get agentRegistry(): AgentRegistry;
98
+ /**
99
+ * Expose le MessageLog (pour tests / inspection).
100
+ */
101
+ get messages(): MessageLog | undefined;
102
+ /**
103
+ * Expose le SessionStore (pour tests / inspection).
104
+ */
105
+ get sessionStore(): SessionStore | undefined;
106
+ private handleRequest;
107
+ private writeCors;
108
+ private writeJson;
109
+ private handleWebhook;
110
+ private handleStaticFile;
111
+ private handleHealth;
112
+ private handleRpc;
113
+ /**
114
+ * Dispatch une requête JSON-RPC vers la bonne méthode.
115
+ */
116
+ private dispatchRpc;
117
+ /**
118
+ * agent.run — Lance un agent (from client externe OU from autre agent).
119
+ * Avec support SessionStore (externalKey) et DirectiveParser.
120
+ */
121
+ private methodAgentRun;
122
+ /**
123
+ * agent.a2a — Agent A parle à Agent B (le hub orchestre).
124
+ * B reçoit un prompt enrichi avec le contexte de A.
125
+ */
126
+ private methodAgentA2A;
127
+ /**
128
+ * agent.status — Status live d'un agent (busy/idle/online) via registry.
129
+ * Possibilité de proxy vers Overmind MCP agent_control aussi.
130
+ */
131
+ private methodAgentStatus;
132
+ /**
133
+ * agent.list — Liste tous les agents et leur état.
134
+ */
135
+ private methodAgentList;
136
+ /**
137
+ * agent.kill — Kill un agent en cours.
138
+ */
139
+ private methodAgentKill;
140
+ /**
141
+ * message.history — Historique des messages persistés.
142
+ */
143
+ private methodMessageHistory;
144
+ /**
145
+ * message.get — Récupère un message par ID.
146
+ */
147
+ private methodMessageGet;
148
+ /**
149
+ * message.replay — Rejoue un message (re-run l'agent avec le même prompt).
150
+ * Le nouveau run crée un NOUVEAU message, l'ancien reste en status 'pending' pour traçabilité.
151
+ */
152
+ private methodMessageReplay;
153
+ /**
154
+ * message.stats — Statistiques globales du log.
155
+ */
156
+ private methodMessageStats;
157
+ private methodSessionGet;
158
+ private methodSessionList;
159
+ private methodSessionDelete;
160
+ private methodSessionStats;
161
+ private methodWebhookSms;
162
+ /**
163
+ * Valide les params d'une requête JSON-RPC via Zod.
164
+ * Retourne soit { data } (succès) soit une JsonRpcResponse d'erreur (à retourner tel quel).
165
+ */
166
+ private validateParams;
167
+ private respondError;
168
+ private buildErrorResponse;
169
+ private readBody;
170
+ /**
171
+ * Parse "10mb" / "1gb" en bytes.
172
+ */
173
+ private parseBodyLimit;
174
+ /**
175
+ * Parse le retour de agent_control pour extraire le status de l'agent distant.
176
+ */
177
+ private parseAgentControlStatus;
178
+ }
179
+ //# sourceMappingURL=OverBridgeServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverBridgeServer.d.ts","sourceRoot":"","sources":["../../src/bridge/OverBridgeServer.ts"],"names":[],"mappings":"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"}