overmind-mcp 2.8.12 → 2.8.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/bin/launch.js +78 -0
  2. package/dist/bin/overmind-bridge.d.ts +42 -0
  3. package/dist/bin/overmind-bridge.d.ts.map +1 -0
  4. package/dist/bin/overmind-bridge.js +503 -0
  5. package/dist/bin/overmind-bridge.js.map +1 -0
  6. package/dist/bridge/AgentRegistry.d.ts +123 -0
  7. package/dist/bridge/AgentRegistry.d.ts.map +1 -0
  8. package/dist/bridge/AgentRegistry.js +207 -0
  9. package/dist/bridge/AgentRegistry.js.map +1 -0
  10. package/dist/bridge/ArgParser.d.ts +45 -0
  11. package/dist/bridge/ArgParser.d.ts.map +1 -0
  12. package/dist/bridge/ArgParser.js +134 -0
  13. package/dist/bridge/ArgParser.js.map +1 -0
  14. package/dist/bridge/BridgeHttpClient.d.ts +61 -0
  15. package/dist/bridge/BridgeHttpClient.d.ts.map +1 -0
  16. package/dist/bridge/BridgeHttpClient.js +164 -0
  17. package/dist/bridge/BridgeHttpClient.js.map +1 -0
  18. package/dist/bridge/DirectiveParser.d.ts +82 -0
  19. package/dist/bridge/DirectiveParser.d.ts.map +1 -0
  20. package/dist/bridge/DirectiveParser.js +154 -0
  21. package/dist/bridge/DirectiveParser.js.map +1 -0
  22. package/dist/bridge/JsonSanitizer.d.ts +34 -0
  23. package/dist/bridge/JsonSanitizer.d.ts.map +1 -0
  24. package/dist/bridge/JsonSanitizer.js +90 -0
  25. package/dist/bridge/JsonSanitizer.js.map +1 -0
  26. package/dist/bridge/MessageLog.d.ts +142 -0
  27. package/dist/bridge/MessageLog.d.ts.map +1 -0
  28. package/dist/bridge/MessageLog.js +311 -0
  29. package/dist/bridge/MessageLog.js.map +1 -0
  30. package/dist/bridge/OverBridgeServer.d.ts +179 -0
  31. package/dist/bridge/OverBridgeServer.d.ts.map +1 -0
  32. package/dist/bridge/OverBridgeServer.js +982 -0
  33. package/dist/bridge/OverBridgeServer.js.map +1 -0
  34. package/dist/bridge/PromptSource.d.ts +66 -0
  35. package/dist/bridge/PromptSource.d.ts.map +1 -0
  36. package/dist/bridge/PromptSource.js +152 -0
  37. package/dist/bridge/PromptSource.js.map +1 -0
  38. package/dist/bridge/RequestContext.d.ts +19 -0
  39. package/dist/bridge/RequestContext.d.ts.map +1 -0
  40. package/dist/bridge/RequestContext.js +34 -0
  41. package/dist/bridge/RequestContext.js.map +1 -0
  42. package/dist/bridge/ScenarioLoader.d.ts +124 -0
  43. package/dist/bridge/ScenarioLoader.d.ts.map +1 -0
  44. package/dist/bridge/ScenarioLoader.js +333 -0
  45. package/dist/bridge/ScenarioLoader.js.map +1 -0
  46. package/dist/bridge/SessionStore.d.ts +109 -0
  47. package/dist/bridge/SessionStore.d.ts.map +1 -0
  48. package/dist/bridge/SessionStore.js +220 -0
  49. package/dist/bridge/SessionStore.js.map +1 -0
  50. package/dist/bridge/WebhookAdapter.d.ts +76 -0
  51. package/dist/bridge/WebhookAdapter.d.ts.map +1 -0
  52. package/dist/bridge/WebhookAdapter.js +186 -0
  53. package/dist/bridge/WebhookAdapter.js.map +1 -0
  54. package/dist/bridge/index.d.ts +23 -1
  55. package/dist/bridge/index.d.ts.map +1 -1
  56. package/dist/bridge/index.js +19 -1
  57. package/dist/bridge/index.js.map +1 -1
  58. package/dist/bridge/utils.d.ts +9 -0
  59. package/dist/bridge/utils.d.ts.map +1 -1
  60. package/dist/bridge/utils.js +17 -0
  61. package/dist/bridge/utils.js.map +1 -1
  62. package/dist/services/AgentManager.d.ts.map +1 -1
  63. package/dist/services/AgentManager.js +16 -3
  64. package/dist/services/AgentManager.js.map +1 -1
  65. package/dist/services/NousHermesRunner.d.ts.map +1 -1
  66. package/dist/services/NousHermesRunner.js +47 -8
  67. package/dist/services/NousHermesRunner.js.map +1 -1
  68. package/dist/tools/create_agent.d.ts.map +1 -1
  69. package/dist/tools/create_agent.js +11 -0
  70. package/dist/tools/create_agent.js.map +1 -1
  71. package/package.json +2 -1
@@ -0,0 +1,220 @@
1
+ /**
2
+ * ╔══════════════════════════════════════════════════════════════════════╗
3
+ * ║ OVERMIND BRIDGE — SessionStore (Multi-Tenant Session Map) ║
4
+ * ║ ║
5
+ * ║ Gère une map clé_externe → session_id avec TTL et persistence. ║
6
+ * ║ Inspiré du pattern bt-sms (phone → sessionId avec TTL 4h). ║
7
+ * ║ ║
8
+ * ║ USAGE ║
9
+ * ║ ───── ║
10
+ * ║ Clé externe = n'importe quoi : téléphone, user_id, channel_id, ║
11
+ * ║ conversation_id, etc. Le bridge isole les sessions par clé. ║
12
+ * ║ ║
13
+ * ║ { ║
14
+ * ║ "agent.run": { agentName, runner, prompt, externalKey: "+1418..." } ║
15
+ * ║ } ║
16
+ * ║ → le bridge retrouve ou crée une session pour cette clé, ║
17
+ * ║ la passe à l'agent, et la sauvegarde dans le store. ║
18
+ * ╚══════════════════════════════════════════════════════════════════════╝
19
+ */
20
+ import fs from 'node:fs/promises';
21
+ import path from 'node:path';
22
+ import { createBridgeLogger } from './utils.js';
23
+ // ─── SessionStore ──────────────────────────────────────────────────────────
24
+ export class SessionStore {
25
+ map = new Map();
26
+ log;
27
+ config;
28
+ cleanupTimer;
29
+ writeQueue = Promise.resolve();
30
+ constructor(config = {}, logger) {
31
+ this.config = {
32
+ ttlMs: config.ttlMs ?? 4 * 60 * 60 * 1000, // 4h
33
+ cleanupIntervalMs: config.cleanupIntervalMs ?? 5 * 60 * 1000, // 5min
34
+ persistPath: config.persistPath,
35
+ };
36
+ this.log = logger ?? createBridgeLogger('session-store');
37
+ }
38
+ // ─── Lifecycle ───────────────────────────────────────────────────────────
39
+ /**
40
+ * Initialise le store : charge le fichier de persistence si présent,
41
+ * démarre le cleanup périodique.
42
+ */
43
+ async init() {
44
+ if (this.config.persistPath) {
45
+ try {
46
+ const raw = await fs.readFile(this.config.persistPath, 'utf-8');
47
+ const parsed = JSON.parse(raw);
48
+ const now = Date.now();
49
+ let loaded = 0;
50
+ for (const entry of parsed.sessions ?? []) {
51
+ // Skip les sessions expirées au load
52
+ if (now - entry.lastActivityAt > this.config.ttlMs)
53
+ continue;
54
+ this.map.set(this.makeKey(entry.externalKey, entry.agentName), entry);
55
+ loaded++;
56
+ }
57
+ this.log.info(`📂 Loaded ${loaded} session(s) from ${this.config.persistPath}`);
58
+ }
59
+ catch (err) {
60
+ if (err.code !== 'ENOENT') {
61
+ this.log.warn(`⚠️ Failed to load sessions: ${err.message}`);
62
+ }
63
+ }
64
+ }
65
+ if (this.cleanupTimer)
66
+ clearInterval(this.cleanupTimer);
67
+ this.cleanupTimer = setInterval(() => this.purgeExpired(), this.config.cleanupIntervalMs);
68
+ }
69
+ /**
70
+ * Arrête le cleanup et persiste l'état final.
71
+ */
72
+ async close() {
73
+ if (this.cleanupTimer) {
74
+ clearInterval(this.cleanupTimer);
75
+ this.cleanupTimer = undefined;
76
+ }
77
+ await this.writeQueue; // attend les writes en cours
78
+ await this.persist();
79
+ this.log.info('🛑 SessionStore closed');
80
+ }
81
+ // ─── CRUD ────────────────────────────────────────────────────────────────
82
+ /**
83
+ * Récupère une session par (externalKey, agentName).
84
+ * Retourne undefined si absente ou expirée.
85
+ */
86
+ get(externalKey, agentName) {
87
+ const key = this.makeKey(externalKey, agentName);
88
+ const entry = this.map.get(key);
89
+ if (!entry)
90
+ return undefined;
91
+ if (this.isExpired(entry)) {
92
+ this.map.delete(key);
93
+ return undefined;
94
+ }
95
+ return { ...entry };
96
+ }
97
+ /**
98
+ * Sauvegarde ou met à jour une session. Retourne l'entrée.
99
+ */
100
+ set(entry) {
101
+ const full = { ...entry, lastActivityAt: entry.lastActivityAt ?? Date.now() };
102
+ const key = this.makeKey(full.externalKey, full.agentName);
103
+ this.map.set(key, full);
104
+ this.schedulePersist();
105
+ return full;
106
+ }
107
+ /**
108
+ * Met à jour uniquement le sessionId (cas typique : après un run, on a le vrai ID).
109
+ */
110
+ updateSessionId(externalKey, agentName, sessionId, runner) {
111
+ const key = this.makeKey(externalKey, agentName);
112
+ const existing = this.map.get(key);
113
+ if (!existing) {
114
+ return this.set({ externalKey, agentName, runner, sessionId });
115
+ }
116
+ existing.sessionId = sessionId;
117
+ existing.runner = runner;
118
+ existing.lastActivityAt = Date.now();
119
+ this.schedulePersist();
120
+ return { ...existing };
121
+ }
122
+ /**
123
+ * Met à jour le context (pattern CONTEXT_UPDATE de bt-sms).
124
+ */
125
+ updateContext(externalKey, agentName, patch) {
126
+ const entry = this.get(externalKey, agentName);
127
+ if (!entry)
128
+ return undefined;
129
+ entry.context = { ...(entry.context ?? {}), ...patch };
130
+ entry.lastActivityAt = Date.now();
131
+ this.map.set(this.makeKey(externalKey, agentName), entry);
132
+ this.schedulePersist();
133
+ return { ...entry };
134
+ }
135
+ /**
136
+ * Supprime une session.
137
+ */
138
+ delete(externalKey, agentName) {
139
+ const deleted = this.map.delete(this.makeKey(externalKey, agentName));
140
+ if (deleted)
141
+ this.schedulePersist();
142
+ return deleted;
143
+ }
144
+ /**
145
+ * Purge toutes les sessions (reset complet).
146
+ */
147
+ clear() {
148
+ this.map.clear();
149
+ this.schedulePersist();
150
+ }
151
+ // ─── Queries ────────────────────────────────────────────────────────────
152
+ /**
153
+ * Liste toutes les sessions actives (non expirées).
154
+ */
155
+ list() {
156
+ this.purgeExpired();
157
+ return Array.from(this.map.values()).map((e) => ({ ...e }));
158
+ }
159
+ /**
160
+ * Stats par agent.
161
+ */
162
+ stats() {
163
+ const byAgent = {};
164
+ for (const entry of this.map.values()) {
165
+ byAgent[entry.agentName] = (byAgent[entry.agentName] ?? 0) + 1;
166
+ }
167
+ return { total: this.map.size, byAgent };
168
+ }
169
+ // ─── Helpers ────────────────────────────────────────────────────────────
170
+ makeKey(externalKey, agentName) {
171
+ return `${agentName}::${externalKey}`;
172
+ }
173
+ isExpired(entry) {
174
+ return Date.now() - entry.lastActivityAt > this.config.ttlMs;
175
+ }
176
+ purgeExpired() {
177
+ const now = Date.now();
178
+ let purged = 0;
179
+ for (const [key, entry] of this.map) {
180
+ if (now - entry.lastActivityAt > this.config.ttlMs) {
181
+ this.map.delete(key);
182
+ purged++;
183
+ }
184
+ }
185
+ if (purged > 0) {
186
+ this.log.info(`🧹 Purged ${purged} expired sessions`);
187
+ this.schedulePersist();
188
+ }
189
+ return purged;
190
+ }
191
+ // ─── Persistence (queued, atomic) ───────────────────────────────────────
192
+ schedulePersist() {
193
+ if (!this.config.persistPath)
194
+ return;
195
+ this.writeQueue = this.writeQueue.then(() => this.persist()).catch((err) => {
196
+ this.log.error(`Persist error: ${err.message}`);
197
+ });
198
+ }
199
+ async persist() {
200
+ if (!this.config.persistPath)
201
+ return;
202
+ const data = { sessions: Array.from(this.map.values()) };
203
+ const tmp = this.config.persistPath + '.tmp';
204
+ try {
205
+ await fs.mkdir(path.dirname(this.config.persistPath), { recursive: true });
206
+ await fs.writeFile(tmp, JSON.stringify(data, null, 2), 'utf-8');
207
+ await fs.rename(tmp, this.config.persistPath);
208
+ }
209
+ catch (err) {
210
+ this.log.error(`Failed to persist sessions: ${err.message}`);
211
+ try {
212
+ await fs.unlink(tmp);
213
+ }
214
+ catch {
215
+ // ignore
216
+ }
217
+ }
218
+ }
219
+ }
220
+ //# sourceMappingURL=SessionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionStore.js","sourceRoot":"","sources":["../../src/bridge/SessionStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ╔══════════════════════════════════════════════════════════════════════╗
3
+ * ║ OVERMIND BRIDGE — WebhookAdapter (Generic Webhook → Bridge) ║
4
+ * ║ ║
5
+ * ║ Normalise les webhooks de providers variés vers un format ║
6
+ * ║ uniforme consommable par l'API agent.run. ║
7
+ * ║ ║
8
+ * ║ PROVIDERS SUPPORTÉS ║
9
+ * ║ ──────────────────── ║
10
+ * ║ - voipms : VoIP.ms (from, to, message, id, date, media) ║
11
+ * ║ - twilio : Twilio (From, To, Body, MessageSid, MediaUrl0) ║
12
+ * ║ - generic : Format customisable (mapping field-by-field) ║
13
+ * ║ ║
14
+ * ║ Chaque adapter retourne un NormalizedWebhook qui contient : ║
15
+ * ║ - externalKey : clé pour SessionStore (phone, user, etc.) ║
16
+ * ║ - prompt : texte à envoyer à l'agent (déjà contextualisé) ║
17
+ * ║ - metadata : données brutes pour audit ║
18
+ * ║ - mediaUrls : URLs de médias attachés ║
19
+ * ╚══════════════════════════════════════════════════════════════════════╝
20
+ */
21
+ import { type BridgeLogger } from './utils.js';
22
+ export interface NormalizedWebhook {
23
+ /** Clé externe pour SessionStore (ex: numéro de téléphone) */
24
+ externalKey: string;
25
+ /** Prompt à passer à l'agent (déjà contextualisé) */
26
+ prompt: string;
27
+ /** Liste des URLs de médias (optionnel) */
28
+ mediaUrls: string[];
29
+ /** Métadonnées brutes (provider, messageId, etc.) */
30
+ metadata: Record<string, unknown>;
31
+ }
32
+ export type WebhookProvider = 'voipms' | 'twilio' | 'generic' | 'discord';
33
+ export interface WebhookAdapterConfig {
34
+ /** Nom du provider (default: 'voipms') */
35
+ provider?: WebhookProvider;
36
+ /** Pour 'generic' : mapping custom field → champ normalisé */
37
+ fieldMap?: Partial<Record<keyof NormalizedWebhook, string>>;
38
+ /** Préfixe ajouté au prompt (ex: '[SMS reçu]') */
39
+ promptPrefix?: string;
40
+ /** Inclure un contexte Discord-like dans le prompt */
41
+ discordContext?: {
42
+ channelId?: string;
43
+ userId?: string;
44
+ username?: string;
45
+ };
46
+ /** Logger */
47
+ logger?: BridgeLogger;
48
+ }
49
+ export declare class WebhookAdapter {
50
+ private readonly config;
51
+ private readonly log;
52
+ constructor(config?: WebhookAdapterConfig);
53
+ /**
54
+ * Adapte un payload brut vers un NormalizedWebhook.
55
+ */
56
+ adapt(rawPayload: Record<string, unknown>): NormalizedWebhook;
57
+ /**
58
+ * VoIP.ms callback format.
59
+ * Params: from, to, message, id, date, media (URLs séparées par |)
60
+ * Body peut être GET query ou POST form-encoded.
61
+ */
62
+ private adaptVoipMs;
63
+ /**
64
+ * Twilio format (snake_case ou CamelCase).
65
+ */
66
+ private adaptTwilio;
67
+ /**
68
+ * Discord-like format (channel, user, message).
69
+ */
70
+ private adaptDiscord;
71
+ /**
72
+ * Generic — applique le fieldMap custom.
73
+ */
74
+ private adaptGeneric;
75
+ }
76
+ //# sourceMappingURL=WebhookAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookAdapter.d.ts","sourceRoot":"","sources":["../../src/bridge/WebhookAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAKnE,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CACqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,MAAM,GAAE,oBAAyB;IAU7C;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB;IAmB7D;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAkCnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuBrB"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * ╔══════════════════════════════════════════════════════════════════════╗
3
+ * ║ OVERMIND BRIDGE — WebhookAdapter (Generic Webhook → Bridge) ║
4
+ * ║ ║
5
+ * ║ Normalise les webhooks de providers variés vers un format ║
6
+ * ║ uniforme consommable par l'API agent.run. ║
7
+ * ║ ║
8
+ * ║ PROVIDERS SUPPORTÉS ║
9
+ * ║ ──────────────────── ║
10
+ * ║ - voipms : VoIP.ms (from, to, message, id, date, media) ║
11
+ * ║ - twilio : Twilio (From, To, Body, MessageSid, MediaUrl0) ║
12
+ * ║ - generic : Format customisable (mapping field-by-field) ║
13
+ * ║ ║
14
+ * ║ Chaque adapter retourne un NormalizedWebhook qui contient : ║
15
+ * ║ - externalKey : clé pour SessionStore (phone, user, etc.) ║
16
+ * ║ - prompt : texte à envoyer à l'agent (déjà contextualisé) ║
17
+ * ║ - metadata : données brutes pour audit ║
18
+ * ║ - mediaUrls : URLs de médias attachés ║
19
+ * ╚══════════════════════════════════════════════════════════════════════╝
20
+ */
21
+ import { createBridgeLogger } from './utils.js';
22
+ import { formatDiscordContext } from './utils.js';
23
+ // ─── WebhookAdapter ────────────────────────────────────────────────────────
24
+ export class WebhookAdapter {
25
+ config;
26
+ log;
27
+ constructor(config = {}) {
28
+ this.config = {
29
+ provider: config.provider ?? 'voipms',
30
+ promptPrefix: config.promptPrefix ?? '',
31
+ fieldMap: config.fieldMap,
32
+ discordContext: config.discordContext,
33
+ };
34
+ this.log = config.logger ?? createBridgeLogger('webhook-adapter');
35
+ }
36
+ /**
37
+ * Adapte un payload brut vers un NormalizedWebhook.
38
+ */
39
+ adapt(rawPayload) {
40
+ switch (this.config.provider) {
41
+ case 'voipms':
42
+ return this.adaptVoipMs(rawPayload);
43
+ case 'twilio':
44
+ return this.adaptTwilio(rawPayload);
45
+ case 'discord':
46
+ return this.adaptDiscord(rawPayload);
47
+ case 'generic':
48
+ return this.adaptGeneric(rawPayload);
49
+ default: {
50
+ const _exhaustive = this.config.provider;
51
+ throw new Error(`Unknown provider: ${String(_exhaustive)}`);
52
+ }
53
+ }
54
+ }
55
+ // ─── Provider Adapters ──────────────────────────────────────────────────
56
+ /**
57
+ * VoIP.ms callback format.
58
+ * Params: from, to, message, id, date, media (URLs séparées par |)
59
+ * Body peut être GET query ou POST form-encoded.
60
+ */
61
+ adaptVoipMs(raw) {
62
+ const from = stringOr(raw.from ?? raw.From, 'unknown');
63
+ const to = stringOr(raw.to ?? raw.To, 'unknown');
64
+ const message = stringOr(raw.message ?? raw.Message ?? raw.Body ?? raw.body, '');
65
+ const messageId = stringOr(raw.id ?? raw.MessageSid, '');
66
+ const date = stringOr(raw.date ?? raw.Date, new Date().toISOString());
67
+ const mediaRaw = stringOr(raw.media ?? raw.MediaUrl0 ?? '', '');
68
+ const mediaUrls = mediaRaw ? mediaRaw.split('|').map((u) => u.trim()).filter(Boolean) : [];
69
+ const promptParts = [];
70
+ if (this.config.promptPrefix)
71
+ promptParts.push(this.config.promptPrefix);
72
+ promptParts.push(`[Webhook VoIP.ms]`);
73
+ promptParts.push(`From: ${from}`);
74
+ promptParts.push(`To: ${to}`);
75
+ promptParts.push(`Date: ${date}`);
76
+ if (messageId)
77
+ promptParts.push(`MessageId: ${messageId}`);
78
+ promptParts.push('---');
79
+ promptParts.push(message);
80
+ if (mediaUrls.length > 0) {
81
+ promptParts.push('---');
82
+ promptParts.push(`Médias (${mediaUrls.length}):`);
83
+ for (const url of mediaUrls)
84
+ promptParts.push(`- ${url}`);
85
+ }
86
+ return {
87
+ externalKey: from,
88
+ prompt: promptParts.join('\n'),
89
+ mediaUrls,
90
+ metadata: { provider: 'voipms', from, to, messageId, date },
91
+ };
92
+ }
93
+ /**
94
+ * Twilio format (snake_case ou CamelCase).
95
+ */
96
+ adaptTwilio(raw) {
97
+ const from = stringOr(raw.From ?? raw.from, 'unknown');
98
+ const to = stringOr(raw.To ?? raw.to, 'unknown');
99
+ const body = stringOr(raw.Body ?? raw.body, '');
100
+ const messageSid = stringOr(raw.MessageSid ?? raw.SmsSid ?? raw.messageId, '');
101
+ const numMedia = Number(raw.NumMedia ?? 0);
102
+ const mediaUrls = [];
103
+ for (let i = 0; i < numMedia; i++) {
104
+ const url = raw[`MediaUrl${i}`];
105
+ if (typeof url === 'string' && url)
106
+ mediaUrls.push(url);
107
+ }
108
+ const promptParts = [];
109
+ if (this.config.promptPrefix)
110
+ promptParts.push(this.config.promptPrefix);
111
+ promptParts.push(`[Webhook Twilio]`);
112
+ promptParts.push(`From: ${from}`);
113
+ promptParts.push(`To: ${to}`);
114
+ if (messageSid)
115
+ promptParts.push(`MessageSid: ${messageSid}`);
116
+ promptParts.push('---');
117
+ promptParts.push(body);
118
+ if (mediaUrls.length > 0) {
119
+ promptParts.push('---');
120
+ promptParts.push(`Médias (${mediaUrls.length}):`);
121
+ for (const url of mediaUrls)
122
+ promptParts.push(`- ${url}`);
123
+ }
124
+ return {
125
+ externalKey: from,
126
+ prompt: promptParts.join('\n'),
127
+ mediaUrls,
128
+ metadata: { provider: 'twilio', from, to, messageSid, numMedia },
129
+ };
130
+ }
131
+ /**
132
+ * Discord-like format (channel, user, message).
133
+ */
134
+ adaptDiscord(raw) {
135
+ const author = raw.author ?? undefined;
136
+ const channelId = stringOr(raw.channelId ?? raw.channel_id, '');
137
+ const userId = stringOr(raw.userId ?? raw.user_id ?? author?.id, '');
138
+ const username = stringOr(raw.username ?? author?.username, 'unknown');
139
+ const message = stringOr(raw.content ?? raw.message ?? raw.body, '');
140
+ const prompt = formatDiscordContext({ channelId, userId, username, message });
141
+ return {
142
+ externalKey: userId || channelId,
143
+ prompt: this.config.promptPrefix
144
+ ? `${this.config.promptPrefix}\n${prompt}`
145
+ : prompt,
146
+ mediaUrls: Array.isArray(raw.attachments)
147
+ ? raw.attachments.map((a) => a.url).filter((u) => Boolean(u))
148
+ : [],
149
+ metadata: { provider: 'discord', channelId, userId, username },
150
+ };
151
+ }
152
+ /**
153
+ * Generic — applique le fieldMap custom.
154
+ */
155
+ adaptGeneric(raw) {
156
+ const map = this.config.fieldMap ?? {};
157
+ const get = (key) => {
158
+ const sourceKey = map[key];
159
+ if (!sourceKey)
160
+ return '';
161
+ const v = raw[sourceKey];
162
+ return typeof v === 'string' ? v : v != null ? JSON.stringify(v) : '';
163
+ };
164
+ const externalKey = get('externalKey') || 'default';
165
+ const prompt = get('prompt') || JSON.stringify(raw);
166
+ const mediaStr = get('mediaUrls');
167
+ const mediaUrls = mediaStr ? mediaStr.split(',').map((s) => s.trim()).filter(Boolean) : [];
168
+ return {
169
+ externalKey,
170
+ prompt: this.config.promptPrefix
171
+ ? `${this.config.promptPrefix}\n${prompt}`
172
+ : prompt,
173
+ mediaUrls,
174
+ metadata: { provider: 'generic', raw },
175
+ };
176
+ }
177
+ }
178
+ // ─── Helpers ───────────────────────────────────────────────────────────────
179
+ function stringOr(value, defaultValue) {
180
+ if (typeof value === 'string')
181
+ return value;
182
+ if (value == null)
183
+ return defaultValue;
184
+ return String(value);
185
+ }
186
+ //# sourceMappingURL=WebhookAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookAdapter.js","sourceRoot":"","sources":["../../src/bridge/WebhookAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,33 @@
1
1
  /**
2
2
  * ╔══════════════════════════════════════════════════════════════════════╗
3
3
  * ║ OVERMIND BRIDGE — Barrel Export ║
4
- * ║ Expose les APIs client et les types associés
4
+ * ║ Expose les APIs client, serveur, et les types associés
5
5
  * ╚══════════════════════════════════════════════════════════════════════╝
6
6
  */
7
7
  export { BridgeProxy } from './BridgeProxy.js';
8
8
  export { OverBridgeService } from './OverBridgeService.js';
9
+ export { OverBridgeServer } from './OverBridgeServer.js';
10
+ export type { OverBridgeServerConfig, JsonRpcRequest, JsonRpcResponse } from './OverBridgeServer.js';
11
+ export { parseArgs, getFlag, requireFlag, hasStdinData, readStdin } from './ArgParser.js';
12
+ export type { ParsedArgs, ArgValue } from './ArgParser.js';
13
+ export { resolvePrompt, parseVars } from './PromptSource.js';
14
+ export type { ResolvePromptOptions, ResolvedPrompt, PromptSource } from './PromptSource.js';
15
+ export { loadScenario, runScenario } from './ScenarioLoader.js';
16
+ export type { Scenario, ScenarioStep, RunStep, A2AStep, ParallelStep, ConditionalStep, WaitStep, StepResult, ScenarioRunnerContext, } from './ScenarioLoader.js';
17
+ export { BridgeHttpClient } from './BridgeHttpClient.js';
18
+ export type { BridgeHttpClientConfig, JsonRpcCallRequest, JsonRpcCallResponse, } from './BridgeHttpClient.js';
19
+ export { AgentRegistry } from './AgentRegistry.js';
20
+ export type { AgentLiveState, AgentLiveStatus, ListAgentsFilter } from './AgentRegistry.js';
21
+ export { MessageLog, loadMessageLogConfigFromEnv } from './MessageLog.js';
22
+ export type { PersistedMessage, MessageStatus, CreateMessageInput, ListMessagesFilter, MessageLogConfig, } from './MessageLog.js';
23
+ export { SessionStore } from './SessionStore.js';
24
+ export type { SessionEntry, SessionStoreConfig } from './SessionStore.js';
25
+ export { DirectiveParser, parseKeyValueArgs } from './DirectiveParser.js';
26
+ export type { DirectiveAction, ParsedDirectives, DirectiveParserOptions } from './DirectiveParser.js';
27
+ export { WebhookAdapter } from './WebhookAdapter.js';
28
+ export type { NormalizedWebhook, WebhookProvider, WebhookAdapterConfig } from './WebhookAdapter.js';
29
+ export { sanitizeAndParse, sanitizeJsonRaw, looksLikeWindowsPathIssue } from './JsonSanitizer.js';
30
+ export { newRequestId, getOrCreateRequestId } from './RequestContext.js';
9
31
  export * from './types.js';
10
32
  export { createBridgeLogger, parseMcpResponseBody, validatePrompt, validateAgentName, formatDiscordContext, type BridgeLogger, type LogLevel, } from './utils.js';
11
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGrG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1F,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC7D,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,UAAU,EACV,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC1E,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC"}
@@ -1,11 +1,29 @@
1
1
  /**
2
2
  * ╔══════════════════════════════════════════════════════════════════════╗
3
3
  * ║ OVERMIND BRIDGE — Barrel Export ║
4
- * ║ Expose les APIs client et les types associés
4
+ * ║ Expose les APIs client, serveur, et les types associés
5
5
  * ╚══════════════════════════════════════════════════════════════════════╝
6
6
  */
7
+ // ─── Client API (existant) ────────────────────────────────────────────────
7
8
  export { BridgeProxy } from './BridgeProxy.js';
8
9
  export { OverBridgeService } from './OverBridgeService.js';
10
+ // ─── Server API (nouveau) ─────────────────────────────────────────────────
11
+ export { OverBridgeServer } from './OverBridgeServer.js';
12
+ // ─── CLI Components ──────────────────────────────────────────────────────
13
+ export { parseArgs, getFlag, requireFlag, hasStdinData, readStdin } from './ArgParser.js';
14
+ export { resolvePrompt, parseVars } from './PromptSource.js';
15
+ export { loadScenario, runScenario } from './ScenarioLoader.js';
16
+ export { BridgeHttpClient } from './BridgeHttpClient.js';
17
+ // ─── Server Components (nouveau) ─────────────────────────────────────────
18
+ export { AgentRegistry } from './AgentRegistry.js';
19
+ export { MessageLog, loadMessageLogConfigFromEnv } from './MessageLog.js';
20
+ export { SessionStore } from './SessionStore.js';
21
+ export { DirectiveParser, parseKeyValueArgs } from './DirectiveParser.js';
22
+ export { WebhookAdapter } from './WebhookAdapter.js';
23
+ export { sanitizeAndParse, sanitizeJsonRaw, looksLikeWindowsPathIssue } from './JsonSanitizer.js';
24
+ export { newRequestId, getOrCreateRequestId } from './RequestContext.js';
25
+ // ─── Types ────────────────────────────────────────────────────────────────
9
26
  export * from './types.js';
27
+ // ─── Utilities ────────────────────────────────────────────────────────────
10
28
  export { createBridgeLogger, parseMcpResponseBody, validatePrompt, validateAgentName, formatDiscordContext, } from './utils.js';
11
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,GAGrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6EAA6E;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,6EAA6E;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,4EAA4E;AAC5E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1F,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAYhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAOzD,4EAA4E;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAQ1E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,6EAA6E;AAC7E,cAAc,YAAY,CAAC;AAE3B,6EAA6E;AAC7E,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,GAGrB,MAAM,YAAY,CAAC"}
@@ -45,4 +45,13 @@ export declare function formatDiscordContext(params: {
45
45
  username?: string;
46
46
  message: string;
47
47
  }): string;
48
+ /**
49
+ * Interpolation de variables ${var} dans un template.
50
+ * Utilisé par ScenarioLoader, PromptSource, et le CLI.
51
+ *
52
+ * Supporte :
53
+ * - ${var} → remplacé par vars[var] si défini, sinon laissé tel quel
54
+ * - ${var:-def} → valeur par défaut si vars[var] est undefined
55
+ */
56
+ export declare function interpolate(template: string, vars?: Record<string, string | undefined>): string;
48
57
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1D;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAc/D;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAc7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAgB9D;AAID,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,YAAY,EAClB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAKtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CASvD;AAID,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7C,MAAM,GAAG,SAAS,CAMpB;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAYT"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1D;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAc/D;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAc7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAgB9D;AAID,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,YAAY,EAClB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAKtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CASvD;AAID,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7C,MAAM,GAAG,SAAS,CAMpB;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAYT;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAM/F"}
@@ -125,4 +125,21 @@ export function formatDiscordContext(params) {
125
125
  `MESSAGE: ${message}`,
126
126
  ].join('\n');
127
127
  }
128
+ /**
129
+ * Interpolation de variables ${var} dans un template.
130
+ * Utilisé par ScenarioLoader, PromptSource, et le CLI.
131
+ *
132
+ * Supporte :
133
+ * - ${var} → remplacé par vars[var] si défini, sinon laissé tel quel
134
+ * - ${var:-def} → valeur par défaut si vars[var] est undefined
135
+ */
136
+ export function interpolate(template, vars) {
137
+ if (!vars || Object.keys(vars).length === 0)
138
+ return template;
139
+ return template.replace(/\$\{([a-zA-Z0-9_]+)(?::-([^}]*))?\}/g, (_, key, def) => {
140
+ if (vars[key] !== undefined)
141
+ return vars[key];
142
+ return def !== undefined ? def : `\${${key}}`;
143
+ });
144
+ }
128
145
  //# sourceMappingURL=utils.js.map