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.
- package/dist/bin/launch.js +78 -0
- package/dist/bin/overmind-bridge.d.ts +42 -0
- package/dist/bin/overmind-bridge.d.ts.map +1 -0
- package/dist/bin/overmind-bridge.js +503 -0
- package/dist/bin/overmind-bridge.js.map +1 -0
- 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/ArgParser.d.ts +45 -0
- package/dist/bridge/ArgParser.d.ts.map +1 -0
- package/dist/bridge/ArgParser.js +134 -0
- package/dist/bridge/ArgParser.js.map +1 -0
- package/dist/bridge/BridgeHttpClient.d.ts +61 -0
- package/dist/bridge/BridgeHttpClient.d.ts.map +1 -0
- package/dist/bridge/BridgeHttpClient.js +164 -0
- package/dist/bridge/BridgeHttpClient.js.map +1 -0
- package/dist/bridge/DirectiveParser.d.ts +82 -0
- package/dist/bridge/DirectiveParser.d.ts.map +1 -0
- package/dist/bridge/DirectiveParser.js +154 -0
- package/dist/bridge/DirectiveParser.js.map +1 -0
- package/dist/bridge/JsonSanitizer.d.ts +34 -0
- package/dist/bridge/JsonSanitizer.d.ts.map +1 -0
- package/dist/bridge/JsonSanitizer.js +90 -0
- package/dist/bridge/JsonSanitizer.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 +179 -0
- package/dist/bridge/OverBridgeServer.d.ts.map +1 -0
- package/dist/bridge/OverBridgeServer.js +982 -0
- package/dist/bridge/OverBridgeServer.js.map +1 -0
- package/dist/bridge/PromptSource.d.ts +66 -0
- package/dist/bridge/PromptSource.d.ts.map +1 -0
- package/dist/bridge/PromptSource.js +152 -0
- package/dist/bridge/PromptSource.js.map +1 -0
- package/dist/bridge/RequestContext.d.ts +19 -0
- package/dist/bridge/RequestContext.d.ts.map +1 -0
- package/dist/bridge/RequestContext.js +34 -0
- package/dist/bridge/RequestContext.js.map +1 -0
- package/dist/bridge/ScenarioLoader.d.ts +124 -0
- package/dist/bridge/ScenarioLoader.d.ts.map +1 -0
- package/dist/bridge/ScenarioLoader.js +333 -0
- package/dist/bridge/ScenarioLoader.js.map +1 -0
- package/dist/bridge/SessionStore.d.ts +109 -0
- package/dist/bridge/SessionStore.d.ts.map +1 -0
- package/dist/bridge/SessionStore.js +220 -0
- package/dist/bridge/SessionStore.js.map +1 -0
- package/dist/bridge/WebhookAdapter.d.ts +76 -0
- package/dist/bridge/WebhookAdapter.d.ts.map +1 -0
- package/dist/bridge/WebhookAdapter.js +186 -0
- package/dist/bridge/WebhookAdapter.js.map +1 -0
- package/dist/bridge/index.d.ts +23 -1
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +19 -1
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/utils.d.ts +9 -0
- package/dist/bridge/utils.d.ts.map +1 -1
- package/dist/bridge/utils.js +17 -0
- package/dist/bridge/utils.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/services/NousHermesRunner.d.ts.map +1 -1
- package/dist/services/NousHermesRunner.js +47 -8
- package/dist/services/NousHermesRunner.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 +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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"}
|