overmind-mcp 2.8.13 → 2.8.15

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 (60) 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/ArgParser.d.ts +45 -0
  7. package/dist/bridge/ArgParser.d.ts.map +1 -0
  8. package/dist/bridge/ArgParser.js +134 -0
  9. package/dist/bridge/ArgParser.js.map +1 -0
  10. package/dist/bridge/BridgeHttpClient.d.ts +61 -0
  11. package/dist/bridge/BridgeHttpClient.d.ts.map +1 -0
  12. package/dist/bridge/BridgeHttpClient.js +164 -0
  13. package/dist/bridge/BridgeHttpClient.js.map +1 -0
  14. package/dist/bridge/DirectiveParser.d.ts +82 -0
  15. package/dist/bridge/DirectiveParser.d.ts.map +1 -0
  16. package/dist/bridge/DirectiveParser.js +154 -0
  17. package/dist/bridge/DirectiveParser.js.map +1 -0
  18. package/dist/bridge/JsonSanitizer.d.ts +34 -0
  19. package/dist/bridge/JsonSanitizer.d.ts.map +1 -0
  20. package/dist/bridge/JsonSanitizer.js +90 -0
  21. package/dist/bridge/JsonSanitizer.js.map +1 -0
  22. package/dist/bridge/OverBridgeServer.d.ts +36 -2
  23. package/dist/bridge/OverBridgeServer.d.ts.map +1 -1
  24. package/dist/bridge/OverBridgeServer.js +351 -23
  25. package/dist/bridge/OverBridgeServer.js.map +1 -1
  26. package/dist/bridge/PromptSource.d.ts +66 -0
  27. package/dist/bridge/PromptSource.d.ts.map +1 -0
  28. package/dist/bridge/PromptSource.js +152 -0
  29. package/dist/bridge/PromptSource.js.map +1 -0
  30. package/dist/bridge/RequestContext.d.ts +19 -0
  31. package/dist/bridge/RequestContext.d.ts.map +1 -0
  32. package/dist/bridge/RequestContext.js +34 -0
  33. package/dist/bridge/RequestContext.js.map +1 -0
  34. package/dist/bridge/ScenarioLoader.d.ts +124 -0
  35. package/dist/bridge/ScenarioLoader.d.ts.map +1 -0
  36. package/dist/bridge/ScenarioLoader.js +333 -0
  37. package/dist/bridge/ScenarioLoader.js.map +1 -0
  38. package/dist/bridge/SessionStore.d.ts +109 -0
  39. package/dist/bridge/SessionStore.d.ts.map +1 -0
  40. package/dist/bridge/SessionStore.js +220 -0
  41. package/dist/bridge/SessionStore.js.map +1 -0
  42. package/dist/bridge/WebhookAdapter.d.ts +76 -0
  43. package/dist/bridge/WebhookAdapter.d.ts.map +1 -0
  44. package/dist/bridge/WebhookAdapter.js +186 -0
  45. package/dist/bridge/WebhookAdapter.js.map +1 -0
  46. package/dist/bridge/index.d.ts +16 -0
  47. package/dist/bridge/index.d.ts.map +1 -1
  48. package/dist/bridge/index.js +10 -0
  49. package/dist/bridge/index.js.map +1 -1
  50. package/dist/bridge/utils.d.ts +9 -0
  51. package/dist/bridge/utils.d.ts.map +1 -1
  52. package/dist/bridge/utils.js +17 -0
  53. package/dist/bridge/utils.js.map +1 -1
  54. package/dist/services/NousHermesRunner.d.ts.map +1 -1
  55. package/dist/services/NousHermesRunner.js +87 -9
  56. package/dist/services/NousHermesRunner.js.map +1 -1
  57. package/dist/tools/config_example.d.ts.map +1 -1
  58. package/dist/tools/config_example.js +8 -1
  59. package/dist/tools/config_example.js.map +1 -1
  60. package/package.json +2 -1
@@ -0,0 +1,78 @@
1
+ // launch.js — compiled launcher for Workflow
2
+ // Prebuild copies this to dist/bin/launch.js
3
+
4
+ const { exec, spawn } = require("child_process");
5
+ const fs = require("fs");
6
+ const path = require("path");
7
+
8
+ const SCRIPT_DIR = path.resolve(__dirname, "..");
9
+ const LOG_DIR = path.join(SCRIPT_DIR, "logs");
10
+ const PORT = "3099";
11
+ const NAME = "Workflow";
12
+ const BUILD_CMD = "npm run build";
13
+
14
+ function log(msg) {
15
+ console.log(`[{new Date().toISOString()}] [{NAME}] ${msg}`);
16
+ }
17
+
18
+ function ensureDir(dir) {
19
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
20
+ }
21
+
22
+ function killPort(port) {
23
+ return new Promise((resolve) => {
24
+ const cmd = `powershell -c "Get-NetTCPConnection -LocalPort ${port} -State Listen -ErrorAction SilentlyContinue | Format-Table -HideTableHeaders -Property OwningProcess | ForEach-Object {$_.Trim()} | Where-Object {$_}"`;
25
+ exec(cmd, { cwd: SCRIPT_DIR }, (err, stdout) => {
26
+ const pids = (stdout || "").trim().split("\n").map((p) => p.trim()).filter(Boolean);
27
+ if (pids.length === 0) { log(`Port ${port} — no process`); resolve(); return; }
28
+ for (const pid of pids) {
29
+ log(`Port ${port} PID ${pid} killed`);
30
+ exec(`taskkill /F /PID ${pid}`, () => {});
31
+ }
32
+ setTimeout(resolve, 500);
33
+ });
34
+ });
35
+ }
36
+
37
+ function build() {
38
+ return new Promise((resolve) => {
39
+ log("[BUILD] Starting...");
40
+ exec(BUILD_CMD, { cwd: SCRIPT_DIR }, (err) => {
41
+ if (err && !fs.existsSync(path.join(SCRIPT_DIR, "dist"))) {
42
+ log("[FAIL] Build failed — no dist");
43
+ resolve(false);
44
+ } else {
45
+ log("[OK] Build complete");
46
+ resolve(true);
47
+ }
48
+ });
49
+ });
50
+ }
51
+
52
+ function launch() {
53
+ const logFile = path.join(LOG_DIR, `${NAME}.log`);
54
+ const errFile = path.join(LOG_DIR, `${NAME}.err.log`);
55
+ const out = fs.openSync(logFile, "a");
56
+ const err = fs.openSync(errFile, "a");
57
+ const env = { ...process.env, ...{} };
58
+ const child = spawn("node", ['--max-old-space-size=256', '--no-warnings', '--env-file=.env', 'dist/bin/cli.js', '--transport', 'httpStream', '--port', '3099'], {
59
+ cwd: SCRIPT_DIR,
60
+ detached: true,
61
+ stdio: ["ignore", out, err],
62
+ env,
63
+ });
64
+ child.unref();
65
+ log(`[SPAWN] PID=${child.pid}`);
66
+ }
67
+
68
+ async function main() {
69
+ log("[START] Launching...");
70
+ ensureDir(LOG_DIR);
71
+ await killPort(PORT);
72
+ const ok = await build();
73
+ if (!ok) { console.error("[ABORT] Build failed"); process.exit(1); }
74
+ launch();
75
+ log("[DONE] Server launched. Check ${LOG_DIR}/${NAME}.log");
76
+ }
77
+
78
+ main().catch(console.error);
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ╔══════════════════════════════════════════════════════════════════════╗
4
+ * ║ OVERMIND BRIDGE — CLI (overmind-bridge) ║
5
+ * ║ ║
6
+ * ║ Point d'entrée unifié pour le bridge Overmind. ║
7
+ * ║ Supporte 8 subcommands : server, call, scenario, replay, status, ║
8
+ * ║ health, send, agent. ║
9
+ * ║ ║
10
+ * ║ USAGE EXAMPLES ║
11
+ * ║ ────────────── ║
12
+ * ║ # Start server ║
13
+ * ║ overmind-bridge server --port 3100 ║
14
+ * ║ ║
15
+ * ║ # One-shot agent call (8 prompt sources) ║
16
+ * ║ overmind-bridge call agent.run --agent scout --runner kilo \ ║
17
+ * ║ --prompt "Analyse BTC" ║
18
+ * ║ echo "Analyse BTC" | overmind-bridge call agent.run \ ║
19
+ * ║ --agent scout --runner kilo --prompt-stdin ║
20
+ * ║ overmind-bridge call agent.run --agent scout --runner kilo \ ║
21
+ * ║ --prompt-file ./brief.txt --var ticker=BTC ║
22
+ * ║ ║
23
+ * ║ # A2A — agent A parle à agent B ║
24
+ * ║ overmind-bridge call agent.a2a \ ║
25
+ * ║ --from scout --to analyst --runner kilo \ ║
26
+ * ║ --prompt "Valide mon analyse" ║
27
+ * ║ ║
28
+ * ║ # Multi-agent scenario from JSON ║
29
+ * ║ overmind-bridge scenario ./workflow.json --var ticker=BTC ║
30
+ * ║ ║
31
+ * ║ # Replay a failed message ║
32
+ * ║ overmind-bridge replay --id 7f3e8a1b-... ║
33
+ * ║ ║
34
+ * ║ # Status of all agents ║
35
+ * ║ overmind-bridge status ║
36
+ * ║ ║
37
+ * ║ # Server health ║
38
+ * ║ overmind-bridge health ║
39
+ * ╚══════════════════════════════════════════════════════════════════════╝
40
+ */
41
+ export {};
42
+ //# sourceMappingURL=overmind-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overmind-bridge.d.ts","sourceRoot":"","sources":["../../src/bin/overmind-bridge.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG"}
@@ -0,0 +1,503 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ╔══════════════════════════════════════════════════════════════════════╗
4
+ * ║ OVERMIND BRIDGE — CLI (overmind-bridge) ║
5
+ * ║ ║
6
+ * ║ Point d'entrée unifié pour le bridge Overmind. ║
7
+ * ║ Supporte 8 subcommands : server, call, scenario, replay, status, ║
8
+ * ║ health, send, agent. ║
9
+ * ║ ║
10
+ * ║ USAGE EXAMPLES ║
11
+ * ║ ────────────── ║
12
+ * ║ # Start server ║
13
+ * ║ overmind-bridge server --port 3100 ║
14
+ * ║ ║
15
+ * ║ # One-shot agent call (8 prompt sources) ║
16
+ * ║ overmind-bridge call agent.run --agent scout --runner kilo \ ║
17
+ * ║ --prompt "Analyse BTC" ║
18
+ * ║ echo "Analyse BTC" | overmind-bridge call agent.run \ ║
19
+ * ║ --agent scout --runner kilo --prompt-stdin ║
20
+ * ║ overmind-bridge call agent.run --agent scout --runner kilo \ ║
21
+ * ║ --prompt-file ./brief.txt --var ticker=BTC ║
22
+ * ║ ║
23
+ * ║ # A2A — agent A parle à agent B ║
24
+ * ║ overmind-bridge call agent.a2a \ ║
25
+ * ║ --from scout --to analyst --runner kilo \ ║
26
+ * ║ --prompt "Valide mon analyse" ║
27
+ * ║ ║
28
+ * ║ # Multi-agent scenario from JSON ║
29
+ * ║ overmind-bridge scenario ./workflow.json --var ticker=BTC ║
30
+ * ║ ║
31
+ * ║ # Replay a failed message ║
32
+ * ║ overmind-bridge replay --id 7f3e8a1b-... ║
33
+ * ║ ║
34
+ * ║ # Status of all agents ║
35
+ * ║ overmind-bridge status ║
36
+ * ║ ║
37
+ * ║ # Server health ║
38
+ * ║ overmind-bridge health ║
39
+ * ╚══════════════════════════════════════════════════════════════════════╝
40
+ */
41
+ import { parseArgs, requireFlag, getFlag } from '../bridge/ArgParser.js';
42
+ import { resolvePrompt, parseVars } from '../bridge/PromptSource.js';
43
+ import { loadScenario, runScenario } from '../bridge/ScenarioLoader.js';
44
+ import { BridgeHttpClient } from '../bridge/BridgeHttpClient.js';
45
+ import { OverBridgeService, OverBridgeServer, loadMessageLogConfigFromEnv, createBridgeLogger, } from '../bridge/index.js';
46
+ const log = createBridgeLogger('overmind-bridge');
47
+ const clog = (msg) => log.info(msg);
48
+ // ─── Entry Point ───────────────────────────────────────────────────────────
49
+ async function main() {
50
+ const args = parseArgs();
51
+ const command = args.command ?? 'help';
52
+ try {
53
+ switch (command) {
54
+ case 'server':
55
+ await cmdServer(args);
56
+ break;
57
+ case 'call':
58
+ await cmdCall(args);
59
+ break;
60
+ case 'scenario':
61
+ await cmdScenario(args);
62
+ break;
63
+ case 'replay':
64
+ await cmdReplay(args);
65
+ break;
66
+ case 'status':
67
+ await cmdStatus(args);
68
+ break;
69
+ case 'health':
70
+ await cmdHealth(args);
71
+ break;
72
+ case 'agents':
73
+ case 'agent':
74
+ await cmdAgents(args);
75
+ break;
76
+ case 'history':
77
+ await cmdHistory(args);
78
+ break;
79
+ case 'sessions':
80
+ case 'session':
81
+ await cmdSessions(args);
82
+ break;
83
+ case 'webhook':
84
+ await cmdWebhook(args);
85
+ break;
86
+ case 'send':
87
+ await cmdSend(args);
88
+ break;
89
+ case 'version':
90
+ case '--version':
91
+ case '-v':
92
+ console.log('overmind-bridge 1.0.0');
93
+ break;
94
+ case 'help':
95
+ case '--help':
96
+ case '-h':
97
+ case undefined:
98
+ printHelp();
99
+ break;
100
+ default:
101
+ console.error(`❌ Unknown command: ${command}`);
102
+ console.error(`Run 'overmind-bridge help' for usage.`);
103
+ process.exit(1);
104
+ }
105
+ }
106
+ catch (err) {
107
+ console.error(`💥 ${command} failed: ${err.message}`);
108
+ if (process.env.DEBUG) {
109
+ console.error(err.stack);
110
+ }
111
+ process.exit(1);
112
+ }
113
+ }
114
+ // ─── Subcommand: server ────────────────────────────────────────────────────
115
+ async function cmdServer(args) {
116
+ const port = Number(getFlag(args, 'port', 3100));
117
+ const host = String(getFlag(args, 'host', '127.0.0.1'));
118
+ const authToken = getFlag(args, 'auth-token') ?? process.env.BRIDGE_AUTH_TOKEN;
119
+ const enableLog = getFlag(args, 'no-log', undefined) === undefined; // --no-log désactive
120
+ const healthInterval = Number(getFlag(args, 'health-interval', 30_000));
121
+ const mcpUrl = String(getFlag(args, 'mcp-url', process.env.MCP_URL ?? 'http://localhost:3099/mcp'));
122
+ const enableSessionStore = getFlag(args, 'no-session-store', undefined) === undefined;
123
+ const enableDirectives = getFlag(args, 'no-directives', undefined) === undefined;
124
+ const enableWebhooks = getFlag(args, 'webhooks', false);
125
+ const enableSanitize = getFlag(args, 'sanitize-json', true);
126
+ const sessionTtlMs = Number(getFlag(args, 'session-ttl', 4 * 60 * 60 * 1000));
127
+ clog(`🚀 Starting OverBridgeServer on ${host}:${port}`);
128
+ clog(` MCP upstream: ${mcpUrl}`);
129
+ clog(` MessageLog: ${enableLog ? 'enabled' : 'disabled'}`);
130
+ clog(` SessionStore: ${enableSessionStore ? 'enabled' : 'disabled'}`);
131
+ clog(` Directives: ${enableDirectives ? 'enabled' : 'disabled'}`);
132
+ clog(` Webhooks: ${enableWebhooks ? 'enabled' : 'disabled'}`);
133
+ clog(` Sanitize JSON: ${enableSanitize ? 'enabled' : 'disabled'}`);
134
+ if (authToken)
135
+ clog(` Auth: enabled`);
136
+ const service = new OverBridgeService({ mcpUrl });
137
+ const server = new OverBridgeServer(service, {
138
+ port,
139
+ host,
140
+ postgres: loadMessageLogConfigFromEnv(),
141
+ enableMessageLog: enableLog,
142
+ authToken,
143
+ healthCheckIntervalMs: healthInterval,
144
+ enableSessionStore,
145
+ enableDirectives,
146
+ enableWebhooks,
147
+ sanitizeJson: enableSanitize,
148
+ sessionTtlMs,
149
+ }, log);
150
+ const { url } = await server.start();
151
+ console.log(`\n OverBridgeServer ready at ${url}`);
152
+ console.log(` POST ${url}/rpc (JSON-RPC 2.0)`);
153
+ console.log(` GET ${url}/health`);
154
+ if (enableWebhooks) {
155
+ console.log(` POST ${url}/webhook/:provider (voipms, twilio, discord, generic)`);
156
+ }
157
+ console.log('');
158
+ // Graceful shutdown
159
+ const shutdown = async (signal) => {
160
+ clog(`\n🛑 Received ${signal}, shutting down...`);
161
+ await server.stop();
162
+ process.exit(0);
163
+ };
164
+ process.on('SIGINT', () => void shutdown('SIGINT'));
165
+ process.on('SIGTERM', () => void shutdown('SIGTERM'));
166
+ // Keep alive
167
+ await new Promise(() => { });
168
+ }
169
+ // ─── Subcommand: call (one-shot JSON-RPC) ──────────────────────────────────
170
+ async function cmdCall(args) {
171
+ // 2 formats acceptés:
172
+ // call <method> [--param1 v1 --param2 v2 ...]
173
+ // call --method <method> [--param1 v1 ...]
174
+ const method = (args.positionals[0] ?? getFlag(args, 'method'));
175
+ if (!method) {
176
+ throw new Error('call requires a method (e.g. "call agent.run --agent scout ..." or "call --method agent.run ...")');
177
+ }
178
+ const client = getClient(args);
179
+ // Prompt resolution (8 sources)
180
+ const prompt = await resolvePrompt({
181
+ prompt: getFlag(args, 'prompt'),
182
+ promptFile: getFlag(args, 'prompt-file'),
183
+ promptStdin: getFlag(args, 'prompt-stdin', false),
184
+ promptBase64: getFlag(args, 'prompt-base64'),
185
+ promptFileBase64: getFlag(args, 'prompt-file-base64'),
186
+ promptUrl: getFlag(args, 'prompt-url'),
187
+ promptJson: getFlag(args, 'prompt-json'),
188
+ promptTemplate: getFlag(args, 'prompt-template'),
189
+ vars: parseVars(getFlag(args, 'var')),
190
+ });
191
+ // Construit les params dynamiquement depuis tous les flags non-préfixés
192
+ const params = {};
193
+ const reservedFlags = new Set([
194
+ 'method', 'server', 'port', 'host', 'auth-token', 'no-log', 'health-interval', 'mcp-url',
195
+ 'prompt', 'prompt-file', 'prompt-stdin', 'prompt-base64', 'prompt-file-base64',
196
+ 'prompt-url', 'prompt-json', 'prompt-template', 'var',
197
+ 'id', 'output', 'json', 'pretty',
198
+ ]);
199
+ for (const [k, v] of Object.entries(args.flags)) {
200
+ if (!reservedFlags.has(k)) {
201
+ params[k] = v;
202
+ }
203
+ }
204
+ // Si prompt résolu, l'injecte (sauf si déjà fourni via params)
205
+ if (prompt.text && !params.prompt) {
206
+ params.prompt = prompt.text;
207
+ }
208
+ // Métadonnées (vars, prompt source)
209
+ if (Object.keys(params).length > 0 || prompt.text) {
210
+ const metadata = {
211
+ promptSource: prompt.source,
212
+ promptBytes: prompt.meta.bytes,
213
+ };
214
+ if (prompt.meta.origin)
215
+ metadata.promptOrigin = prompt.meta.origin;
216
+ params.metadata = { ...params.metadata, ...metadata };
217
+ }
218
+ clog(`📞 ${method} → ${client.baseUrl}`);
219
+ const result = await client.call(method, params, Number(getFlag(args, 'timeout', 600_000)));
220
+ printResult(result, getFlag(args, 'pretty', false));
221
+ }
222
+ // ─── Subcommand: send (alias pour call agent.run) ──────────────────────────
223
+ async function cmdSend(args) {
224
+ // send est un raccourci : call agent.run avec les bons flags
225
+ const agentName = requireFlag(args, 'agent');
226
+ const runner = requireFlag(args, 'runner');
227
+ const prompt = await resolvePrompt({
228
+ prompt: getFlag(args, 'prompt'),
229
+ promptFile: getFlag(args, 'prompt-file'),
230
+ promptStdin: getFlag(args, 'prompt-stdin', true),
231
+ promptBase64: getFlag(args, 'prompt-base64'),
232
+ promptFileBase64: getFlag(args, 'prompt-file-base64'),
233
+ promptUrl: getFlag(args, 'prompt-url'),
234
+ promptJson: getFlag(args, 'prompt-json'),
235
+ promptTemplate: getFlag(args, 'prompt-template'),
236
+ vars: parseVars(getFlag(args, 'var')),
237
+ });
238
+ const client = getClient(args);
239
+ const result = await client.call('agent.run', {
240
+ agentName,
241
+ runner,
242
+ prompt: prompt.text,
243
+ sessionId: getFlag(args, 'session'),
244
+ model: getFlag(args, 'model'),
245
+ mode: getFlag(args, 'mode'),
246
+ path: getFlag(args, 'path'),
247
+ silent: getFlag(args, 'silent', false),
248
+ }, Number(getFlag(args, 'timeout', 600_000)));
249
+ printResult(result, getFlag(args, 'pretty', false));
250
+ }
251
+ // ─── Subcommand: scenario ──────────────────────────────────────────────────
252
+ async function cmdScenario(args) {
253
+ const file = getFlag(args, 'file') ?? args.positionals[0];
254
+ if (!file)
255
+ throw new Error('scenario requires --file <path.json> or positional <path.json>');
256
+ const client = getClient(args);
257
+ const scenario = await loadScenario(file);
258
+ const inputVars = parseVars(getFlag(args, 'var'));
259
+ clog(`📜 Scenario: ${scenario.name} (${scenario.steps.length} steps)`);
260
+ const results = await runScenario(scenario, {
261
+ vars: inputVars,
262
+ log: (msg) => clog(msg),
263
+ runAgent: async (params) => {
264
+ const r = await client.call('agent.run', params);
265
+ return {
266
+ text: r.content.map((c) => c.text).join('\n'),
267
+ sessionId: r.sessionId,
268
+ isError: r.isError,
269
+ messageId: r.messageId,
270
+ };
271
+ },
272
+ runA2A: async (params) => {
273
+ const r = await client.call('agent.a2a', params);
274
+ return {
275
+ text: r.content.map((c) => c.text).join('\n'),
276
+ sessionId: r.sessionId,
277
+ isError: r.isError,
278
+ messageId: r.messageId,
279
+ };
280
+ },
281
+ });
282
+ printResult({ scenario: scenario.name, results }, getFlag(args, 'pretty', false));
283
+ const allOk = results.every((r) => r.success);
284
+ if (!allOk)
285
+ process.exit(2);
286
+ }
287
+ // ─── Subcommand: replay ────────────────────────────────────────────────────
288
+ async function cmdReplay(args) {
289
+ const id = requireFlag(args, 'id');
290
+ const client = getClient(args);
291
+ clog(`🔁 Replaying message ${id}...`);
292
+ const result = await client.call('message.replay', { id }, Number(getFlag(args, 'timeout', 600_000)));
293
+ printResult(result, getFlag(args, 'pretty', false));
294
+ }
295
+ // ─── Subcommand: status (alias agent.list) ─────────────────────────────────
296
+ async function cmdStatus(args) {
297
+ const client = getClient(args);
298
+ const result = await client.call('agent.list', {
299
+ status: getFlag(args, 'status'),
300
+ runner: getFlag(args, 'runner'),
301
+ });
302
+ printResult(result, getFlag(args, 'pretty', false));
303
+ }
304
+ // ─── Subcommand: agents (alias) ────────────────────────────────────────────
305
+ async function cmdAgents(args) {
306
+ return cmdStatus(args);
307
+ }
308
+ // ─── Subcommand: health ────────────────────────────────────────────────────
309
+ async function cmdHealth(args) {
310
+ const client = getClient(args);
311
+ try {
312
+ const result = await client.health();
313
+ printResult(result, getFlag(args, 'pretty', false));
314
+ }
315
+ catch (err) {
316
+ console.error(`❌ Server unreachable: ${err.message}`);
317
+ process.exit(1);
318
+ }
319
+ }
320
+ // ─── Subcommand: history (alias message.history) ───────────────────────────
321
+ async function cmdHistory(args) {
322
+ const client = getClient(args);
323
+ const result = await client.call('message.history', {
324
+ toAgent: getFlag(args, 'to'),
325
+ fromAgent: getFlag(args, 'from'),
326
+ status: getFlag(args, 'status'),
327
+ limit: Number(getFlag(args, 'limit', 50)),
328
+ offset: Number(getFlag(args, 'offset', 0)),
329
+ sinceHours: getFlag(args, 'since-hours', undefined),
330
+ });
331
+ printResult(result, getFlag(args, 'pretty', false));
332
+ }
333
+ // ─── Subcommand: sessions (multi-tenant) ─────────────────────────────────
334
+ async function cmdSessions(args) {
335
+ const client = getClient(args);
336
+ const method = args.positionals[1] ?? 'list';
337
+ if (method === 'list' || method === 'stats') {
338
+ const result = await client.call('session.list');
339
+ printResult(result, getFlag(args, 'pretty', false));
340
+ }
341
+ else if (method === 'get') {
342
+ const result = await client.call('session.get', {
343
+ externalKey: requireFlag(args, 'key'),
344
+ agentName: requireFlag(args, 'agent'),
345
+ });
346
+ printResult(result, getFlag(args, 'pretty', false));
347
+ }
348
+ else if (method === 'delete' || method === 'rm') {
349
+ const result = await client.call('session.delete', {
350
+ externalKey: requireFlag(args, 'key'),
351
+ agentName: requireFlag(args, 'agent'),
352
+ });
353
+ printResult(result, getFlag(args, 'pretty', false));
354
+ }
355
+ else {
356
+ throw new Error(`Unknown session subcommand: ${method}. Use: list, get, delete`);
357
+ }
358
+ }
359
+ // ─── Subcommand: webhook (envoi programmatique) ───────────────────────────
360
+ async function cmdWebhook(args) {
361
+ const provider = String(getFlag(args, 'provider', 'voipms'));
362
+ const client = getClient(args);
363
+ // Payload depuis --payload-file ou --payload (JSON string)
364
+ let payload;
365
+ const payloadFile = getFlag(args, 'payload-file');
366
+ const payloadStr = getFlag(args, 'payload');
367
+ if (payloadFile) {
368
+ const fs = await import('node:fs/promises');
369
+ const raw = await fs.readFile(payloadFile, 'utf-8');
370
+ payload = JSON.parse(raw);
371
+ }
372
+ else if (payloadStr) {
373
+ payload = JSON.parse(payloadStr);
374
+ }
375
+ else {
376
+ throw new Error('webhook requires --payload <json> or --payload-file <path>');
377
+ }
378
+ const autoDispatch = getFlag(args, 'agent')
379
+ ? {
380
+ agentName: requireFlag(args, 'agent'),
381
+ runner: requireFlag(args, 'runner'),
382
+ model: getFlag(args, 'model'),
383
+ mode: getFlag(args, 'mode'),
384
+ }
385
+ : undefined;
386
+ const result = await client.call('webhook.sms', {
387
+ provider,
388
+ payload,
389
+ externalKey: getFlag(args, 'key'),
390
+ autoDispatch,
391
+ });
392
+ printResult(result, getFlag(args, 'pretty', false));
393
+ }
394
+ // ─── Helpers ───────────────────────────────────────────────────────────────
395
+ function getClient(args) {
396
+ const serverUrl = String(getFlag(args, 'server', process.env.BRIDGE_URL ?? 'http://127.0.0.1:3100'));
397
+ const authToken = getFlag(args, 'auth-token') ?? process.env.BRIDGE_AUTH_TOKEN;
398
+ return new BridgeHttpClient({ baseUrl: serverUrl, authToken });
399
+ }
400
+ function printResult(result, pretty) {
401
+ if (pretty) {
402
+ console.log(JSON.stringify(result, null, 2));
403
+ }
404
+ else {
405
+ console.log(JSON.stringify(result));
406
+ }
407
+ }
408
+ // ─── Help ──────────────────────────────────────────────────────────────────
409
+ function printHelp() {
410
+ console.log(`
411
+ overmind-bridge — Multi-agent orchestrator CLI
412
+
413
+ USAGE
414
+ overmind-bridge <command> [options]
415
+
416
+ COMMANDS
417
+ server Start the HTTP JSON-RPC 2.0 server
418
+ call One-shot JSON-RPC call (use --method or positional)
419
+ send Shortcut for 'call agent.run'
420
+ scenario Run a multi-agent scenario from JSON/YAML
421
+ status List all known agents and their state
422
+ history Show persisted message history
423
+ sessions Manage multi-tenant sessions (list, get, delete)
424
+ webhook Send a webhook payload (voipms/twilio/discord/generic) and optionally auto-dispatch
425
+ replay Replay a failed/stuck message by ID
426
+ health Ping the server's /health endpoint
427
+ version Print version
428
+
429
+ COMMON OPTIONS
430
+ --server <url> Bridge server URL (default: http://127.0.0.1:3100)
431
+ or env BRIDGE_URL
432
+ --auth-token <token> Bearer token (or env BRIDGE_AUTH_TOKEN)
433
+ --pretty Pretty-print JSON output
434
+ --timeout <ms> RPC timeout in ms (default: 600000)
435
+ --var <key=value> Variable for templating (repeatable)
436
+
437
+ PROMPT SOURCES (for 'call' and 'send')
438
+ --prompt "..." Literal string
439
+ --prompt-file <path> Read from file
440
+ --prompt-stdin Read from stdin (auto-detect if TTY absent)
441
+ --prompt-base64 "..." Decode base64 string
442
+ --prompt-file-base64 Decode base64 from file
443
+ --prompt-url <url> Fetch URL
444
+ --prompt-json '{...}' Parse JSON object, reformat as text
445
+ --prompt-template "..." Use --var for interpolation
446
+
447
+ EXAMPLES
448
+ # Server
449
+ overmind-bridge server --port 3100 --auth-token secret
450
+
451
+ # Agent call
452
+ overmind-bridge call agent.run --agent scout --runner kilo \\
453
+ --prompt "Analyse BTC"
454
+
455
+ # From file with template
456
+ overmind-bridge send --agent scout --runner kilo \\
457
+ --prompt-file ./brief.txt --var ticker=BTC
458
+
459
+ # A2A (agent-to-agent)
460
+ overmind-bridge call agent.a2a --from scout --to analyst \\
461
+ --runner kilo --prompt "Validate my analysis"
462
+
463
+ # Multi-agent scenario
464
+ overmind-bridge scenario ./workflow.json --var ticker=BTC
465
+
466
+ # Status
467
+ overmind-bridge status --status busy
468
+
469
+ # Multi-tenant sessions
470
+ overmind-bridge sessions list
471
+ overmind-bridge sessions get --key "+14187207735" --agent pdf_bon_travail
472
+ overmind-bridge sessions rm --key "+14187207735" --agent pdf_bon_travail
473
+
474
+ # Webhook programmatic dispatch
475
+ overmind-bridge webhook --provider voipms \\
476
+ --payload '{"from":"+14187207735","message":"Salut","id":"abc"}' \\
477
+ --agent pdf_bon_travail --runner hermes
478
+
479
+ # Server with all features
480
+ overmind-bridge server --port 3100 --webhooks --sanitize-json
481
+
482
+ ENV VARS
483
+ BRIDGE_URL Default server URL
484
+ BRIDGE_AUTH_TOKEN Default auth token
485
+ MCP_URL Overmind MCP URL (default: http://localhost:3099/mcp)
486
+ POSTGRES_HOST Postgres host
487
+ POSTGRES_PORT Postgres port (default: 5432)
488
+ POSTGRES_USER Postgres user
489
+ POSTGRES_PASSWORD Postgres password
490
+ POSTGRES_DB Postgres database
491
+
492
+ For more help on a specific command:
493
+ overmind-bridge <command> --help
494
+ `);
495
+ }
496
+ // ─── Run ───────────────────────────────────────────────────────────────────
497
+ main().catch((err) => {
498
+ console.error('💥 Fatal:', err.message);
499
+ if (process.env.DEBUG)
500
+ console.error(err.stack);
501
+ process.exit(1);
502
+ });
503
+ //# sourceMappingURL=overmind-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overmind-bridge.js","sourceRoot":"","sources":["../../src/bin/overmind-bridge.ts"],"names":[],"mappings":"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"}