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.
- 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/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/OverBridgeServer.d.ts +36 -2
- package/dist/bridge/OverBridgeServer.d.ts.map +1 -1
- package/dist/bridge/OverBridgeServer.js +351 -23
- package/dist/bridge/OverBridgeServer.js.map +1 -1
- 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 +16 -0
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +10 -0
- 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/NousHermesRunner.d.ts.map +1 -1
- package/dist/services/NousHermesRunner.js +87 -9
- package/dist/services/NousHermesRunner.js.map +1 -1
- package/dist/tools/config_example.d.ts.map +1 -1
- package/dist/tools/config_example.js +8 -1
- package/dist/tools/config_example.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — ArgParser (Zero-Dep CLI Parser) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Parser d'arguments minimaliste, cohérent avec le style du projet. ║
|
|
6
|
+
* ║ Supporte : ║
|
|
7
|
+
* ║ - Flags courts (-v) et longs (--verbose) ║
|
|
8
|
+
* ║ - Valeurs via = ou espace (--port 3100, --port=3100) ║
|
|
9
|
+
* ║ - Valeurs répétées (--include a --include b) ║
|
|
10
|
+
* ║ - Booléens negations (--no-auth) ║
|
|
11
|
+
* ║ - Stdin auto-détection ║
|
|
12
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
13
|
+
*/
|
|
14
|
+
export type ArgValue = string | boolean | number | string[];
|
|
15
|
+
export interface ParsedArgs {
|
|
16
|
+
/** Premier arg = subcommand (ex: 'server', 'call', 'scenario') */
|
|
17
|
+
command: string | undefined;
|
|
18
|
+
/** Tous les args après le subcommand, indexés par flag (sans le --) */
|
|
19
|
+
flags: Record<string, ArgValue>;
|
|
20
|
+
/** Positionals (args sans flag) */
|
|
21
|
+
positionals: string[];
|
|
22
|
+
/** Args bruts pour debug */
|
|
23
|
+
raw: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse process.argv.slice(2). Le premier non-flag devient `command`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseArgs(argv?: string[]): ParsedArgs;
|
|
29
|
+
/**
|
|
30
|
+
* Récupère un flag avec valeur par défaut et coercion de type.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getFlag<T extends ArgValue>(args: ParsedArgs, name: string, defaultValue?: T): T | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Récupère un flag, throw si manquant.
|
|
35
|
+
*/
|
|
36
|
+
export declare function requireFlag<T extends ArgValue>(args: ParsedArgs, name: string): T;
|
|
37
|
+
/**
|
|
38
|
+
* Vérifie si stdin a des données piped (TTY = false).
|
|
39
|
+
*/
|
|
40
|
+
export declare function hasStdinData(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Lit stdin en entier (utf-8).
|
|
43
|
+
*/
|
|
44
|
+
export declare function readStdin(): Promise<string>;
|
|
45
|
+
//# sourceMappingURL=ArgParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArgParser.d.ts","sourceRoot":"","sources":["../../src/bridge/ArgParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,mCAAmC;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,UAAU,CAmE5E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,QAAQ,EACxC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,GAAG,SAAS,CAIf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAMjF;AAgBD;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAQjD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — ArgParser (Zero-Dep CLI Parser) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Parser d'arguments minimaliste, cohérent avec le style du projet. ║
|
|
6
|
+
* ║ Supporte : ║
|
|
7
|
+
* ║ - Flags courts (-v) et longs (--verbose) ║
|
|
8
|
+
* ║ - Valeurs via = ou espace (--port 3100, --port=3100) ║
|
|
9
|
+
* ║ - Valeurs répétées (--include a --include b) ║
|
|
10
|
+
* ║ - Booléens negations (--no-auth) ║
|
|
11
|
+
* ║ - Stdin auto-détection ║
|
|
12
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
13
|
+
*/
|
|
14
|
+
// ─── Public API ────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Parse process.argv.slice(2). Le premier non-flag devient `command`.
|
|
17
|
+
*/
|
|
18
|
+
export function parseArgs(argv = process.argv.slice(2)) {
|
|
19
|
+
const flags = {};
|
|
20
|
+
const positionals = [];
|
|
21
|
+
let command;
|
|
22
|
+
let commandConsumed = false;
|
|
23
|
+
for (let i = 0; i < argv.length; i++) {
|
|
24
|
+
const arg = argv[i];
|
|
25
|
+
// --flag=value
|
|
26
|
+
if (arg.startsWith('--') && arg.includes('=')) {
|
|
27
|
+
const eqIdx = arg.indexOf('=');
|
|
28
|
+
const key = arg.slice(2, eqIdx);
|
|
29
|
+
const value = arg.slice(eqIdx + 1);
|
|
30
|
+
flags[key] = coerceValue(value, true);
|
|
31
|
+
if (!commandConsumed) {
|
|
32
|
+
command = key; // au cas où le subcommand est en --foo=bar (rare)
|
|
33
|
+
commandConsumed = true;
|
|
34
|
+
}
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// --flag value | --flag
|
|
38
|
+
if (arg.startsWith('--')) {
|
|
39
|
+
const key = arg.slice(2);
|
|
40
|
+
const next = argv[i + 1];
|
|
41
|
+
// Booléen si prochain arg est un autre flag ou rien
|
|
42
|
+
if (next === undefined || next.startsWith('--')) {
|
|
43
|
+
flags[key] = true;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
flags[key] = coerceValue(next, false);
|
|
47
|
+
i++; // consomme la valeur
|
|
48
|
+
}
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// -f value | -f | -abc (flags courts combinés)
|
|
52
|
+
if (arg.startsWith('-') && arg.length > 1) {
|
|
53
|
+
// Combinés : -abc → a, b, c tous booléens
|
|
54
|
+
if (/^-[a-z]+$/i.test(arg)) {
|
|
55
|
+
for (const ch of arg.slice(1)) {
|
|
56
|
+
flags[ch] = true;
|
|
57
|
+
}
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// -v value
|
|
61
|
+
const key = arg.slice(1);
|
|
62
|
+
const next = argv[i + 1];
|
|
63
|
+
if (next === undefined || next.startsWith('--')) {
|
|
64
|
+
flags[key] = true;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
flags[key] = coerceValue(next, false);
|
|
68
|
+
i++;
|
|
69
|
+
}
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
// Positionnel
|
|
73
|
+
if (!commandConsumed) {
|
|
74
|
+
command = arg;
|
|
75
|
+
commandConsumed = true;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
positionals.push(arg);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { command, flags, positionals, raw: argv };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Récupère un flag avec valeur par défaut et coercion de type.
|
|
85
|
+
*/
|
|
86
|
+
export function getFlag(args, name, defaultValue) {
|
|
87
|
+
const value = args.flags[name];
|
|
88
|
+
if (value === undefined)
|
|
89
|
+
return defaultValue;
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Récupère un flag, throw si manquant.
|
|
94
|
+
*/
|
|
95
|
+
export function requireFlag(args, name) {
|
|
96
|
+
const value = args.flags[name];
|
|
97
|
+
if (value === undefined) {
|
|
98
|
+
throw new Error(`Missing required flag: --${name}`);
|
|
99
|
+
}
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
// ─── Helpers ───────────────────────────────────────────────────────────────
|
|
103
|
+
function coerceValue(raw, fromEquals) {
|
|
104
|
+
// Si --flag=true / false
|
|
105
|
+
if (raw === 'true')
|
|
106
|
+
return true;
|
|
107
|
+
if (raw === 'false')
|
|
108
|
+
return false;
|
|
109
|
+
// Si nombre
|
|
110
|
+
if (/^-?\d+(\.\d+)?$/.test(raw))
|
|
111
|
+
return Number(raw);
|
|
112
|
+
// Sinon string brut
|
|
113
|
+
return raw;
|
|
114
|
+
}
|
|
115
|
+
// ─── Stdin detection ───────────────────────────────────────────────────────
|
|
116
|
+
/**
|
|
117
|
+
* Vérifie si stdin a des données piped (TTY = false).
|
|
118
|
+
*/
|
|
119
|
+
export function hasStdinData() {
|
|
120
|
+
return !process.stdin.isTTY;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Lit stdin en entier (utf-8).
|
|
124
|
+
*/
|
|
125
|
+
export async function readStdin() {
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
let data = '';
|
|
128
|
+
process.stdin.setEncoding('utf-8');
|
|
129
|
+
process.stdin.on('data', (chunk) => (data += chunk));
|
|
130
|
+
process.stdin.on('end', () => resolve(data));
|
|
131
|
+
process.stdin.on('error', reject);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=ArgParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArgParser.js","sourceRoot":"","sources":["../../src/bridge/ArgParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — BridgeHttpClient (JSON-RPC 2.0 HTTP Caller) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Client HTTP minimaliste pour parler à un OverBridgeServer. ║
|
|
6
|
+
* ║ Utilisé par le CLI pour les commandes 'call', 'scenario', etc. ║
|
|
7
|
+
* ║ Supporte : ║
|
|
8
|
+
* ║ - Single + batch JSON-RPC 2.0 ║
|
|
9
|
+
* ║ - Auth Bearer token ║
|
|
10
|
+
* ║ - Timeout configurable ║
|
|
11
|
+
* ║ - Mode "auto" : démarre un bridge local si pas de serveur ║
|
|
12
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
13
|
+
*/
|
|
14
|
+
export interface JsonRpcCallRequest {
|
|
15
|
+
jsonrpc: '2.0';
|
|
16
|
+
id: number | string;
|
|
17
|
+
method: string;
|
|
18
|
+
params?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface JsonRpcCallResponse {
|
|
21
|
+
jsonrpc: '2.0';
|
|
22
|
+
id: number | string | null;
|
|
23
|
+
result?: unknown;
|
|
24
|
+
error?: {
|
|
25
|
+
code: number;
|
|
26
|
+
message: string;
|
|
27
|
+
data?: unknown;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface BridgeHttpClientConfig {
|
|
31
|
+
/** URL complète du serveur (ex: http://127.0.0.1:3100) */
|
|
32
|
+
baseUrl: string;
|
|
33
|
+
/** Bearer token (si configuré côté serveur) */
|
|
34
|
+
authToken?: string;
|
|
35
|
+
/** Timeout par défaut en ms (default: 60_000) */
|
|
36
|
+
timeoutMs?: number;
|
|
37
|
+
}
|
|
38
|
+
export declare class BridgeHttpClient {
|
|
39
|
+
private readonly config;
|
|
40
|
+
private rpcId;
|
|
41
|
+
constructor(config: BridgeHttpClientConfig);
|
|
42
|
+
get baseUrl(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Appelle une méthode JSON-RPC et retourne le résultat (ou throw).
|
|
45
|
+
*/
|
|
46
|
+
call<T = unknown>(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Batch JSON-RPC (plusieurs calls en un round-trip).
|
|
49
|
+
*/
|
|
50
|
+
callBatch<T = unknown>(calls: Array<{
|
|
51
|
+
method: string;
|
|
52
|
+
params?: Record<string, unknown>;
|
|
53
|
+
}>): Promise<T[]>;
|
|
54
|
+
/**
|
|
55
|
+
* GET /health (pas JSON-RPC, endpoint séparé).
|
|
56
|
+
*/
|
|
57
|
+
health(): Promise<unknown>;
|
|
58
|
+
private _post;
|
|
59
|
+
private _get;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=BridgeHttpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BridgeHttpClient.d.ts","sourceRoot":"","sources":["../../src/bridge/BridgeHttpClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CACqB;IAC5C,OAAO,CAAC,KAAK,CAAK;gBAEN,MAAM,EAAE,sBAAsB;IAQ1C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAID;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC;IAmBb;;OAEG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GACjE,OAAO,CAAC,CAAC,EAAE,CAAC;IAqBf;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;YAOlB,KAAK;YAiDL,IAAI;CAoCnB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — BridgeHttpClient (JSON-RPC 2.0 HTTP Caller) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Client HTTP minimaliste pour parler à un OverBridgeServer. ║
|
|
6
|
+
* ║ Utilisé par le CLI pour les commandes 'call', 'scenario', etc. ║
|
|
7
|
+
* ║ Supporte : ║
|
|
8
|
+
* ║ - Single + batch JSON-RPC 2.0 ║
|
|
9
|
+
* ║ - Auth Bearer token ║
|
|
10
|
+
* ║ - Timeout configurable ║
|
|
11
|
+
* ║ - Mode "auto" : démarre un bridge local si pas de serveur ║
|
|
12
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
13
|
+
*/
|
|
14
|
+
import http from 'node:http';
|
|
15
|
+
import { URL } from 'node:url';
|
|
16
|
+
// ─── BridgeHttpClient ──────────────────────────────────────────────────────
|
|
17
|
+
export class BridgeHttpClient {
|
|
18
|
+
config;
|
|
19
|
+
rpcId = 1;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = {
|
|
22
|
+
baseUrl: config.baseUrl.replace(/\/+$/, ''), // strip trailing slashes
|
|
23
|
+
authToken: config.authToken,
|
|
24
|
+
timeoutMs: config.timeoutMs ?? 60_000,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
get baseUrl() {
|
|
28
|
+
return this.config.baseUrl;
|
|
29
|
+
}
|
|
30
|
+
// ─── JSON-RPC Calls ──────────────────────────────────────────────────────
|
|
31
|
+
/**
|
|
32
|
+
* Appelle une méthode JSON-RPC et retourne le résultat (ou throw).
|
|
33
|
+
*/
|
|
34
|
+
async call(method, params, timeoutMs) {
|
|
35
|
+
const req = {
|
|
36
|
+
jsonrpc: '2.0',
|
|
37
|
+
id: this.rpcId++,
|
|
38
|
+
method,
|
|
39
|
+
params,
|
|
40
|
+
};
|
|
41
|
+
const res = await this._post('/rpc', req, timeoutMs ?? this.config.timeoutMs);
|
|
42
|
+
if (Array.isArray(res)) {
|
|
43
|
+
throw new Error('Unexpected batch response to single call');
|
|
44
|
+
}
|
|
45
|
+
if (res.error) {
|
|
46
|
+
const err = new Error(`JSON-RPC error ${res.error.code}: ${res.error.message}`);
|
|
47
|
+
Object.assign(err, { code: res.error.code, data: res.error.data });
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
return res.result;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Batch JSON-RPC (plusieurs calls en un round-trip).
|
|
54
|
+
*/
|
|
55
|
+
async callBatch(calls) {
|
|
56
|
+
const reqs = calls.map((c) => ({
|
|
57
|
+
jsonrpc: '2.0',
|
|
58
|
+
id: this.rpcId++,
|
|
59
|
+
method: c.method,
|
|
60
|
+
params: c.params,
|
|
61
|
+
}));
|
|
62
|
+
const responses = await this._post('/rpc', reqs, this.config.timeoutMs);
|
|
63
|
+
if (!Array.isArray(responses)) {
|
|
64
|
+
throw new Error('Batch call did not return an array');
|
|
65
|
+
}
|
|
66
|
+
return responses.map((r) => {
|
|
67
|
+
if (r.error) {
|
|
68
|
+
const err = new Error(`JSON-RPC error ${r.error.code}: ${r.error.message}`);
|
|
69
|
+
Object.assign(err, { code: r.error.code, data: r.error.data });
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
return r.result;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* GET /health (pas JSON-RPC, endpoint séparé).
|
|
77
|
+
*/
|
|
78
|
+
async health() {
|
|
79
|
+
const res = await this._get('/health', 5_000);
|
|
80
|
+
return JSON.parse(res);
|
|
81
|
+
}
|
|
82
|
+
// ─── HTTP Helpers ────────────────────────────────────────────────────────
|
|
83
|
+
async _post(path, body, timeoutMs) {
|
|
84
|
+
const url = new URL(this.config.baseUrl + path);
|
|
85
|
+
const data = JSON.stringify(body);
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
const controller = new AbortController();
|
|
88
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
89
|
+
const req = http.request({
|
|
90
|
+
hostname: url.hostname,
|
|
91
|
+
port: url.port || (url.protocol === 'https:' ? 443 : 80),
|
|
92
|
+
path: url.pathname + url.search,
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: {
|
|
95
|
+
'Content-Type': 'application/json',
|
|
96
|
+
'Accept': 'application/json',
|
|
97
|
+
'Content-Length': Buffer.byteLength(data),
|
|
98
|
+
...(this.config.authToken ? { Authorization: `Bearer ${this.config.authToken}` } : {}),
|
|
99
|
+
},
|
|
100
|
+
signal: controller.signal,
|
|
101
|
+
}, (res) => {
|
|
102
|
+
clearTimeout(timer);
|
|
103
|
+
const chunks = [];
|
|
104
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
105
|
+
res.on('end', () => {
|
|
106
|
+
const text = Buffer.concat(chunks).toString('utf-8');
|
|
107
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
108
|
+
try {
|
|
109
|
+
resolve(JSON.parse(text));
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
reject(new Error(`Invalid JSON response: ${text.slice(0, 200)}`));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
reject(new Error(`HTTP ${res.statusCode}: ${text.slice(0, 200)}`));
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
res.on('error', reject);
|
|
120
|
+
});
|
|
121
|
+
req.on('error', (err) => {
|
|
122
|
+
clearTimeout(timer);
|
|
123
|
+
reject(err);
|
|
124
|
+
});
|
|
125
|
+
req.write(data);
|
|
126
|
+
req.end();
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async _get(path, timeoutMs) {
|
|
130
|
+
const url = new URL(this.config.baseUrl + path);
|
|
131
|
+
return new Promise((resolve, reject) => {
|
|
132
|
+
const controller = new AbortController();
|
|
133
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
134
|
+
const req = http.request({
|
|
135
|
+
hostname: url.hostname,
|
|
136
|
+
port: url.port || 80,
|
|
137
|
+
path: url.pathname + url.search,
|
|
138
|
+
method: 'GET',
|
|
139
|
+
headers: { Accept: 'application/json' },
|
|
140
|
+
signal: controller.signal,
|
|
141
|
+
}, (res) => {
|
|
142
|
+
clearTimeout(timer);
|
|
143
|
+
const chunks = [];
|
|
144
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
145
|
+
res.on('end', () => {
|
|
146
|
+
const text = Buffer.concat(chunks).toString('utf-8');
|
|
147
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
148
|
+
resolve(text);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
reject(new Error(`HTTP ${res.statusCode}: ${text.slice(0, 200)}`));
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
res.on('error', reject);
|
|
155
|
+
});
|
|
156
|
+
req.on('error', (err) => {
|
|
157
|
+
clearTimeout(timer);
|
|
158
|
+
reject(err);
|
|
159
|
+
});
|
|
160
|
+
req.end();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=BridgeHttpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BridgeHttpClient.js","sourceRoot":"","sources":["../../src/bridge/BridgeHttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ╔══════════════════════════════════════════════════════════════════════╗
|
|
3
|
+
* ║ OVERMIND BRIDGE — DirectiveParser (Agent-Side Protocol) ║
|
|
4
|
+
* ║ ║
|
|
5
|
+
* ║ Permet aux agents d'injecter des directives structurées dans ║
|
|
6
|
+
* ║ leurs réponses textuelles. Le bridge les extrait et les exécute. ║
|
|
7
|
+
* ║ ║
|
|
8
|
+
* ║ PATTERN ║
|
|
9
|
+
* ║ ─────── ║
|
|
10
|
+
* ║ Inspiré du `CONTEXT_UPDATE: step=X employe_id=Y` de bt-sms. ║
|
|
11
|
+
* ║ ║
|
|
12
|
+
* ║ L'agent écrit dans sa réponse : ║
|
|
13
|
+
* ║ ║
|
|
14
|
+
* ║ "Voici mon analyse. ║
|
|
15
|
+
* ║ SESSION_ID: hermes-sess-abc123 ║
|
|
16
|
+
* ║ CONTEXT_UPDATE: step=awaiting_description employe_id=42 ║
|
|
17
|
+
* ║ BRIDGE_NEXT: agent=scout prompt=\"Analyse BTC\" ║
|
|
18
|
+
* ║ BRIDGE_END" ║
|
|
19
|
+
* ║ ║
|
|
20
|
+
* ║ Le bridge : ║
|
|
21
|
+
* ║ 1. Extrait SESSION_ID, l'assigne au store ║
|
|
22
|
+
* ║ 2. Patche le context (state machine) ║
|
|
23
|
+
* ║ 3. Lance automatiquement un nouveau call vers scout ║
|
|
24
|
+
* ║ 4. Supprime les directives du texte retourné au client ║
|
|
25
|
+
* ║ ║
|
|
26
|
+
* ║ DIRECTIVES SUPPORTÉES ║
|
|
27
|
+
* ║ ────────────────────── ║
|
|
28
|
+
* ║ - SESSION_ID: <id> → assigne le sessionId ║
|
|
29
|
+
* ║ - CONTEXT_UPDATE: k=v k=v → patche le context ║
|
|
30
|
+
* ║ - BRIDGE_NEXT: method=X ... → déclenche un appel suivant ║
|
|
31
|
+
* ║ - BRIDGE_END → arrête la chaîne de next calls ║
|
|
32
|
+
* ║ - BRIDGE_HINT: <text> → tag/metadata (no action) ║
|
|
33
|
+
* ╚══════════════════════════════════════════════════════════════════════╝
|
|
34
|
+
*/
|
|
35
|
+
import { type BridgeLogger } from './utils.js';
|
|
36
|
+
import type { JsonRpcRequest } from './OverBridgeServer.js';
|
|
37
|
+
export type DirectiveAction = {
|
|
38
|
+
kind: 'session';
|
|
39
|
+
sessionId: string;
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'context';
|
|
42
|
+
patch: Record<string, string>;
|
|
43
|
+
} | {
|
|
44
|
+
kind: 'next';
|
|
45
|
+
call: JsonRpcRequest;
|
|
46
|
+
} | {
|
|
47
|
+
kind: 'end';
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'hint';
|
|
50
|
+
text: string;
|
|
51
|
+
};
|
|
52
|
+
export interface ParsedDirectives {
|
|
53
|
+
/** Texte original sans les directives (propre, pour le client) */
|
|
54
|
+
cleanText: string;
|
|
55
|
+
/** Directives extraites, dans l'ordre */
|
|
56
|
+
actions: DirectiveAction[];
|
|
57
|
+
/** Erreurs de parsing (lignes mal formées, ignorées mais loguées) */
|
|
58
|
+
errors: string[];
|
|
59
|
+
}
|
|
60
|
+
export interface DirectiveParserOptions {
|
|
61
|
+
/** Logger */
|
|
62
|
+
logger?: BridgeLogger;
|
|
63
|
+
}
|
|
64
|
+
export declare class DirectiveParser {
|
|
65
|
+
private readonly log;
|
|
66
|
+
constructor(opts?: DirectiveParserOptions);
|
|
67
|
+
/**
|
|
68
|
+
* Parse un texte de réponse d'agent et extrait les directives.
|
|
69
|
+
* Lignes de directive : `DIRECTIVE_NAME: value`.
|
|
70
|
+
*/
|
|
71
|
+
parse(responseText: string): ParsedDirectives;
|
|
72
|
+
/**
|
|
73
|
+
* Parse une directive individuelle. Retourne null si nom inconnu.
|
|
74
|
+
*/
|
|
75
|
+
private parseDirective;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parse un format "key=value key2='value with spaces' key3="value with quotes"".
|
|
79
|
+
* Supporte quotes simples, doubles, et backslash escape.
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseKeyValueArgs(input: string): Record<string, string>;
|
|
82
|
+
//# sourceMappingURL=DirectiveParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectiveParser.d.ts","sourceRoot":"","sources":["../../src/bridge/DirectiveParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,qEAAqE;IACrE,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAID,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,GAAE,sBAA2B;IAI7C;;;OAGG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB;IAkC7C;;OAEG;IACH,OAAO,CAAC,cAAc;CAwCvB;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYvE"}
|