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,154 @@
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 { createBridgeLogger } from './utils.js';
36
+ // ─── DirectiveParser ───────────────────────────────────────────────────────
37
+ export class DirectiveParser {
38
+ log;
39
+ constructor(opts = {}) {
40
+ this.log = opts.logger ?? createBridgeLogger('directive-parser');
41
+ }
42
+ /**
43
+ * Parse un texte de réponse d'agent et extrait les directives.
44
+ * Lignes de directive : `DIRECTIVE_NAME: value`.
45
+ */
46
+ parse(responseText) {
47
+ const actions = [];
48
+ const errors = [];
49
+ const cleanedLines = [];
50
+ for (const rawLine of responseText.split('\n')) {
51
+ const line = rawLine.trim();
52
+ // Détecte ligne "DIRECTIVE:" (case-insensitive)
53
+ const m = line.match(/^([A-Z_]+):\s*(.*)$/);
54
+ if (!m) {
55
+ cleanedLines.push(rawLine);
56
+ continue;
57
+ }
58
+ const [, name, rawValue] = m;
59
+ try {
60
+ const action = this.parseDirective(name, rawValue);
61
+ if (action) {
62
+ actions.push(action);
63
+ continue; // directive consommée
64
+ }
65
+ cleanedLines.push(rawLine); // nom inconnu, on garde
66
+ }
67
+ catch (err) {
68
+ errors.push(`Failed to parse ${name}: ${err.message}`);
69
+ cleanedLines.push(rawLine); // on garde la ligne en cas d'erreur
70
+ }
71
+ }
72
+ return {
73
+ cleanText: cleanedLines.join('\n').replace(/\n{3,}/g, '\n\n').trim(),
74
+ actions,
75
+ errors,
76
+ };
77
+ }
78
+ /**
79
+ * Parse une directive individuelle. Retourne null si nom inconnu.
80
+ */
81
+ parseDirective(name, value) {
82
+ switch (name) {
83
+ case 'SESSION_ID':
84
+ if (!value.trim())
85
+ throw new Error('Empty session id');
86
+ return { kind: 'session', sessionId: value.trim() };
87
+ case 'CONTEXT_UPDATE': {
88
+ const patch = {};
89
+ for (const token of value.split(/\s+/)) {
90
+ const eqIdx = token.indexOf('=');
91
+ if (eqIdx === -1)
92
+ continue;
93
+ const k = token.slice(0, eqIdx).trim();
94
+ const v = token.slice(eqIdx + 1).trim();
95
+ if (k)
96
+ patch[k] = decodeURIComponentSafe(v);
97
+ }
98
+ if (Object.keys(patch).length === 0)
99
+ throw new Error('Empty CONTEXT_UPDATE');
100
+ return { kind: 'context', patch };
101
+ }
102
+ case 'BRIDGE_NEXT': {
103
+ // Format: method=agent.run agent=scout prompt="..."
104
+ // method=agent.a2a from=scout to=analyst prompt="..."
105
+ const params = parseKeyValueArgs(value);
106
+ if (!params.method)
107
+ throw new Error('BRIDGE_NEXT requires method=...');
108
+ return {
109
+ kind: 'next',
110
+ call: { jsonrpc: '2.0', id: 0, method: params.method, params },
111
+ };
112
+ }
113
+ case 'BRIDGE_END':
114
+ return { kind: 'end' };
115
+ case 'BRIDGE_HINT':
116
+ return { kind: 'hint', text: value.trim() };
117
+ default:
118
+ return null; // nom inconnu, le caller garde la ligne
119
+ }
120
+ }
121
+ }
122
+ // ─── Helpers ───────────────────────────────────────────────────────────────
123
+ /**
124
+ * Parse un format "key=value key2='value with spaces' key3="value with quotes"".
125
+ * Supporte quotes simples, doubles, et backslash escape.
126
+ */
127
+ export function parseKeyValueArgs(input) {
128
+ const result = {};
129
+ const re = /(\w+)=(?:"((?:\\.|[^"\\])*)"|'((?:\\.|[^'\\])*)'|(\S+))/g;
130
+ let m;
131
+ while ((m = re.exec(input)) !== null) {
132
+ const key = m[1];
133
+ const value = m[2] ?? m[3] ?? m[4] ?? '';
134
+ // Déchapper les séquences \\ \"
135
+ const decoded = value.replace(/\\(.)/g, '$1');
136
+ result[key] = decoded;
137
+ }
138
+ return result;
139
+ }
140
+ /**
141
+ * Décode une valeur URI-component si elle ressemble à du %XX, sinon la retourne brute.
142
+ */
143
+ function decodeURIComponentSafe(value) {
144
+ if (value.includes('%') && /%[0-9A-Fa-f]{2}/.test(value)) {
145
+ try {
146
+ return decodeURIComponent(value);
147
+ }
148
+ catch {
149
+ return value;
150
+ }
151
+ }
152
+ return value;
153
+ }
154
+ //# sourceMappingURL=DirectiveParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectiveParser.js","sourceRoot":"","sources":["../../src/bridge/DirectiveParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * ╔══════════════════════════════════════════════════════════════════════╗
3
+ * ║ OVERMIND BRIDGE — JSON Sanitizer (Windows Path Rescue) ║
4
+ * ║ ║
5
+ * ║ Répare les payloads JSON mal échappés contenant des chemins ║
6
+ * ║ Windows (ex: `C:\Users\Deamon\file.txt` qui casse le JSON si ║
7
+ * ║ pas double-échappé). Pattern inspiré de bt-sms. ║
8
+ * ║ ║
9
+ * ║ Le problème : un client envoie un body qui contient ║
10
+ * ║ `"path": "C:\Users\Deamon\file.txt"` — l'antislash devant `U` ║
11
+ * ║ est interprété comme un caractère d'échappement JSON invalide. ║
12
+ * ║ ║
13
+ * ║ La solution : un sanitizer state-machine qui : ║
14
+ * ║ - Détecte si on est dans une string ║
15
+ * ║ - Double les `\` qui ne sont pas suivis d'un char d'échappement ║
16
+ * ║ - Préserve le contenu légitime ║
17
+ * ╚══════════════════════════════════════════════════════════════════════╝
18
+ */
19
+ /**
20
+ * Tente de réparer un JSON malformé contenant des chemins Windows non échappés.
21
+ * Retourne le JSON parsé, ou throw si irrécupérable.
22
+ */
23
+ export declare function sanitizeAndParse(rawBody: string): unknown;
24
+ /**
25
+ * State-machine qui double les `\` non-échappés dans les strings JSON.
26
+ * Préserve les séquences d'échappement valides (\n, \t, \\, \", etc.)
27
+ */
28
+ export declare function sanitizeJsonRaw(rawBody: string): string;
29
+ /**
30
+ * Détecte si un body est probablement cassé par des Windows paths non échappés.
31
+ * Heuristique simple : présence de `:\` dans le body.
32
+ */
33
+ export declare function looksLikeWindowsPathIssue(rawBody: string): boolean;
34
+ //# sourceMappingURL=JsonSanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonSanitizer.d.ts","sourceRoot":"","sources":["../../src/bridge/JsonSanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBzD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAuCvD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElE"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * ╔══════════════════════════════════════════════════════════════════════╗
3
+ * ║ OVERMIND BRIDGE — JSON Sanitizer (Windows Path Rescue) ║
4
+ * ║ ║
5
+ * ║ Répare les payloads JSON mal échappés contenant des chemins ║
6
+ * ║ Windows (ex: `C:\Users\Deamon\file.txt` qui casse le JSON si ║
7
+ * ║ pas double-échappé). Pattern inspiré de bt-sms. ║
8
+ * ║ ║
9
+ * ║ Le problème : un client envoie un body qui contient ║
10
+ * ║ `"path": "C:\Users\Deamon\file.txt"` — l'antislash devant `U` ║
11
+ * ║ est interprété comme un caractère d'échappement JSON invalide. ║
12
+ * ║ ║
13
+ * ║ La solution : un sanitizer state-machine qui : ║
14
+ * ║ - Détecte si on est dans une string ║
15
+ * ║ - Double les `\` qui ne sont pas suivis d'un char d'échappement ║
16
+ * ║ - Préserve le contenu légitime ║
17
+ * ╚══════════════════════════════════════════════════════════════════════╝
18
+ */
19
+ /**
20
+ * Tente de réparer un JSON malformé contenant des chemins Windows non échappés.
21
+ * Retourne le JSON parsé, ou throw si irrécupérable.
22
+ */
23
+ export function sanitizeAndParse(rawBody) {
24
+ // Essai 1 : parse direct
25
+ try {
26
+ return JSON.parse(rawBody);
27
+ }
28
+ catch {
29
+ // Fall through
30
+ }
31
+ // Essai 2 : sanitizer state-machine
32
+ const sanitized = sanitizeJsonRaw(rawBody);
33
+ try {
34
+ return JSON.parse(sanitized);
35
+ }
36
+ catch {
37
+ // Fall through
38
+ }
39
+ // Donné, on throw
40
+ throw new Error('JSON body is malformed and could not be sanitized');
41
+ }
42
+ /**
43
+ * State-machine qui double les `\` non-échappés dans les strings JSON.
44
+ * Préserve les séquences d'échappement valides (\n, \t, \\, \", etc.)
45
+ */
46
+ export function sanitizeJsonRaw(rawBody) {
47
+ let insideString = false;
48
+ let result = '';
49
+ for (let i = 0; i < rawBody.length; i++) {
50
+ const char = rawBody[i];
51
+ if (char === '"' && (i === 0 || rawBody[i - 1] !== '\\')) {
52
+ insideString = !insideString;
53
+ result += char;
54
+ continue;
55
+ }
56
+ if (char === '\\' && insideString) {
57
+ const nextChar = rawBody[i + 1];
58
+ if (nextChar === '\\') {
59
+ // \\ : on garde, on saute le 2e
60
+ result += '\\\\';
61
+ i++;
62
+ continue;
63
+ }
64
+ if (nextChar === '"') {
65
+ // \" : on garde
66
+ result += '\\"';
67
+ i++;
68
+ continue;
69
+ }
70
+ // Autres : \n, \t, \u, etc. — légitime, on garde tel quel
71
+ if (nextChar && /[nrtbf/\\"u]/.test(nextChar)) {
72
+ result += char;
73
+ continue;
74
+ }
75
+ // \X non standard (typiquement \U de C:\Users) — on double
76
+ result += '\\\\';
77
+ continue;
78
+ }
79
+ result += char;
80
+ }
81
+ return result;
82
+ }
83
+ /**
84
+ * Détecte si un body est probablement cassé par des Windows paths non échappés.
85
+ * Heuristique simple : présence de `:\` dans le body.
86
+ */
87
+ export function looksLikeWindowsPathIssue(rawBody) {
88
+ return /:\\/.test(rawBody);
89
+ }
90
+ //# sourceMappingURL=JsonSanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonSanitizer.js","sourceRoot":"","sources":["../../src/bridge/JsonSanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,yBAAyB;IACzB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IAED,oCAAoC;IACpC,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IAED,kBAAkB;IAClB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACzD,YAAY,GAAG,CAAC,YAAY,CAAC;YAC7B,MAAM,IAAI,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,gCAAgC;gBAChC,MAAM,IAAI,MAAM,CAAC;gBACjB,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrB,gBAAgB;gBAChB,MAAM,IAAI,KAAK,CAAC;gBAChB,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,0DAA0D;YAC1D,IAAI,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;YACD,2DAA2D;YAC3D,MAAM,IAAI,MAAM,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
@@ -21,6 +21,7 @@
21
21
  import { OverBridgeService } from './OverBridgeService.js';
22
22
  import { AgentRegistry } from './AgentRegistry.js';
23
23
  import { MessageLog, type MessageLogConfig } from './MessageLog.js';
24
+ import { SessionStore } from './SessionStore.js';
24
25
  import { type BridgeLogger } from './utils.js';
25
26
  export interface JsonRpcRequest {
26
27
  jsonrpc: '2.0';
@@ -47,22 +48,39 @@ export interface OverBridgeServerConfig {
47
48
  postgres: MessageLogConfig;
48
49
  /** Active le MessageLog (si false, les messages ne sont pas persistés) */
49
50
  enableMessageLog: boolean;
50
- /** Authentification simple par token (Authorization: Bearer XXX) — optionnel */
51
+ /** Authentification simple par token (Authorization: Bearer *** — optionnel */
51
52
  authToken?: string;
52
53
  /** Health check interval pour OverBridgeService (default: 30000ms) */
53
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;
54
69
  }
55
70
  export declare class OverBridgeServer {
56
71
  private readonly service;
57
72
  private readonly registry;
58
73
  private readonly log;
59
74
  private readonly messageLog;
75
+ private readonly sessions;
76
+ private readonly directiveParser;
77
+ private readonly webhookAdapter;
60
78
  private readonly config;
61
79
  private server;
62
80
  private startTime;
63
81
  constructor(service: OverBridgeService, config: OverBridgeServerConfig, logger?: BridgeLogger);
64
82
  /**
65
- * Démarre le serveur HTTP et initialise les dépendances (MessageLog, OverBridgeService).
83
+ * Démarre le serveur HTTP et initialise les dépendances (MessageLog, SessionStore, OverBridgeService).
66
84
  */
67
85
  start(): Promise<{
68
86
  port: number;
@@ -81,9 +99,15 @@ export declare class OverBridgeServer {
81
99
  * Expose le MessageLog (pour tests / inspection).
82
100
  */
83
101
  get messages(): MessageLog | undefined;
102
+ /**
103
+ * Expose le SessionStore (pour tests / inspection).
104
+ */
105
+ get sessionStore(): SessionStore | undefined;
84
106
  private handleRequest;
85
107
  private writeCors;
86
108
  private writeJson;
109
+ private handleWebhook;
110
+ private handleStaticFile;
87
111
  private handleHealth;
88
112
  private handleRpc;
89
113
  /**
@@ -92,6 +116,7 @@ export declare class OverBridgeServer {
92
116
  private dispatchRpc;
93
117
  /**
94
118
  * agent.run — Lance un agent (from client externe OU from autre agent).
119
+ * Avec support SessionStore (externalKey) et DirectiveParser.
95
120
  */
96
121
  private methodAgentRun;
97
122
  /**
@@ -129,6 +154,11 @@ export declare class OverBridgeServer {
129
154
  * message.stats — Statistiques globales du log.
130
155
  */
131
156
  private methodMessageStats;
157
+ private methodSessionGet;
158
+ private methodSessionList;
159
+ private methodSessionDelete;
160
+ private methodSessionStats;
161
+ private methodWebhookSms;
132
162
  /**
133
163
  * Valide les params d'une requête JSON-RPC via Zod.
134
164
  * Retourne soit { data } (succès) soit une JsonRpcResponse d'erreur (à retourner tel quel).
@@ -137,6 +167,10 @@ export declare class OverBridgeServer {
137
167
  private respondError;
138
168
  private buildErrorResponse;
139
169
  private readBody;
170
+ /**
171
+ * Parse "10mb" / "1gb" en bytes.
172
+ */
173
+ private parseBodyLimit;
140
174
  /**
141
175
  * Parse le retour de agent_control pour extraire le status de l'agent distant.
142
176
  */
@@ -1 +1 @@
1
- {"version":3,"file":"OverBridgeServer.d.ts","sourceRoot":"","sources":["../../src/bridge/OverBridgeServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAuB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAsB,KAAK,YAAY,EAAqB,MAAM,YAAY,CAAC;AAKtF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,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;AAmED,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAK;gBAGpB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,sBAAsB,EAC9B,MAAM,CAAC,EAAE,YAAY;IAavB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAkCnE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;OAEG;IACH,IAAI,aAAa,IAAI,aAAa,CAEjC;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,UAAU,GAAG,SAAS,CAErC;YAIa,aAAa;IAkC3B,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;YAOH,YAAY;YAwBZ,SAAS;IAwCvB;;OAEG;YACW,WAAW;IA2CzB;;OAEG;YACW,cAAc;IAwE5B;;;OAGG;YACW,cAAc;IAmF5B;;;OAGG;YACW,iBAAiB;IA+C/B;;OAEG;YACW,eAAe;IAa7B;;OAEG;YACW,eAAe;IAiB7B;;OAEG;YACW,oBAAoB;IAWlC;;OAEG;YACW,gBAAgB;IAW9B;;;OAGG;YACW,mBAAmB;IA4BjC;;OAEG;YACW,kBAAkB;IAUhC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,QAAQ;IAShB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAQhC"}
1
+ {"version":3,"file":"OverBridgeServer.d.ts","sourceRoot":"","sources":["../../src/bridge/OverBridgeServer.ts"],"names":[],"mappings":"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"}