@phronesis-io/openclaw-eigenflux 0.0.8 → 0.0.9-beta.0

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 (50) hide show
  1. package/dist/index.d.ts +9 -23
  2. package/dist/index.js +2265 -457
  3. package/openclaw.plugin.json +5 -1
  4. package/package.json +21 -8
  5. package/dist/agent-prompt-templates.d.ts +0 -19
  6. package/dist/agent-prompt-templates.d.ts.map +0 -1
  7. package/dist/agent-prompt-templates.js +0 -56
  8. package/dist/agent-prompt-templates.js.map +0 -1
  9. package/dist/cli-executor.d.ts +0 -32
  10. package/dist/cli-executor.d.ts.map +0 -1
  11. package/dist/cli-executor.js +0 -75
  12. package/dist/cli-executor.js.map +0 -1
  13. package/dist/config.d.ts +0 -83
  14. package/dist/config.d.ts.map +0 -1
  15. package/dist/config.js +0 -226
  16. package/dist/config.js.map +0 -1
  17. package/dist/credentials-loader.d.ts +0 -29
  18. package/dist/credentials-loader.d.ts.map +0 -1
  19. package/dist/credentials-loader.js +0 -117
  20. package/dist/credentials-loader.js.map +0 -1
  21. package/dist/index.d.ts.map +0 -1
  22. package/dist/index.js.map +0 -1
  23. package/dist/logger.d.ts +0 -12
  24. package/dist/logger.d.ts.map +0 -1
  25. package/dist/logger.js +0 -25
  26. package/dist/logger.js.map +0 -1
  27. package/dist/notification-route-resolver.d.ts +0 -66
  28. package/dist/notification-route-resolver.d.ts.map +0 -1
  29. package/dist/notification-route-resolver.js +0 -603
  30. package/dist/notification-route-resolver.js.map +0 -1
  31. package/dist/notifier.d.ts +0 -39
  32. package/dist/notifier.d.ts.map +0 -1
  33. package/dist/notifier.js +0 -335
  34. package/dist/notifier.js.map +0 -1
  35. package/dist/polling-client.d.ts +0 -86
  36. package/dist/polling-client.d.ts.map +0 -1
  37. package/dist/polling-client.js +0 -158
  38. package/dist/polling-client.js.map +0 -1
  39. package/dist/reply-target.d.ts +0 -8
  40. package/dist/reply-target.d.ts.map +0 -1
  41. package/dist/reply-target.js +0 -104
  42. package/dist/reply-target.js.map +0 -1
  43. package/dist/session-route-memory.d.ts +0 -22
  44. package/dist/session-route-memory.d.ts.map +0 -1
  45. package/dist/session-route-memory.js +0 -117
  46. package/dist/session-route-memory.js.map +0 -1
  47. package/dist/stream-client.d.ts +0 -48
  48. package/dist/stream-client.d.ts.map +0 -1
  49. package/dist/stream-client.js +0 -168
  50. package/dist/stream-client.js.map +0 -1
@@ -1,603 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.isInternalSessionKey = isInternalSessionKey;
37
- exports.isDirectSessionKey = isDirectSessionKey;
38
- exports.isGroupEntry = isGroupEntry;
39
- exports.findSessionRouteForBinding = findSessionRouteForBinding;
40
- exports.resolveNotificationRoute = resolveNotificationRoute;
41
- const fs = __importStar(require("fs"));
42
- const os = __importStar(require("os"));
43
- const path = __importStar(require("path"));
44
- const reply_target_1 = require("./reply-target");
45
- const session_route_memory_1 = require("./session-route-memory");
46
- const INTERNAL_CHANNELS = new Set(['webchat']);
47
- function getDefaultOpenClawStateDir() {
48
- return path.join(os.homedir(), '.openclaw');
49
- }
50
- function readNonEmptyString(value) {
51
- if (typeof value !== 'string') {
52
- return undefined;
53
- }
54
- const trimmed = value.trim();
55
- return trimmed.length > 0 ? trimmed : undefined;
56
- }
57
- function normalizeChannel(value) {
58
- return readNonEmptyString(value)?.toLowerCase();
59
- }
60
- function normalizeUpdatedAt(value) {
61
- if (typeof value === 'number' && Number.isFinite(value)) {
62
- return value;
63
- }
64
- return 0;
65
- }
66
- function createRouteOverrides(overrides) {
67
- return {
68
- sessionKey: overrides?.sessionKey === true,
69
- agentId: overrides?.agentId === true,
70
- replyChannel: overrides?.replyChannel === true,
71
- replyTo: overrides?.replyTo === true,
72
- replyAccountId: overrides?.replyAccountId === true,
73
- };
74
- }
75
- function isAnyRouteOverrideEnabled(overrides) {
76
- return Object.values(overrides).some(Boolean);
77
- }
78
- function isInternalSessionKey(sessionKey) {
79
- const trimmed = readNonEmptyString(sessionKey);
80
- if (!trimmed) {
81
- return true;
82
- }
83
- const lower = trimmed.toLowerCase();
84
- if (lower === 'main' || lower === 'heartbeat') {
85
- return true;
86
- }
87
- const parts = lower.split(':').filter((part) => part.length > 0);
88
- return parts[0] === 'agent' && parts[2] === 'heartbeat';
89
- }
90
- function isExternalChannel(channel) {
91
- return Boolean(channel && !INTERNAL_CHANNELS.has(channel));
92
- }
93
- function isDirectSessionKey(sessionKey, entry) {
94
- const parts = sessionKey.toLowerCase().split(':').filter(Boolean);
95
- if (parts.includes('direct') || parts.includes('dm')) {
96
- return true;
97
- }
98
- const chatType = readNonEmptyString(entry.chatType)?.toLowerCase() ??
99
- readNonEmptyString(entry.origin?.chatType)?.toLowerCase();
100
- if (chatType === 'direct' || chatType === 'dm') {
101
- return true;
102
- }
103
- const toCandidates = [entry.deliveryContext?.to, entry.lastTo, entry.origin?.to];
104
- return toCandidates.some((candidate) => {
105
- const trimmed = readNonEmptyString(candidate);
106
- if (!trimmed) {
107
- return false;
108
- }
109
- const colonAt = trimmed.indexOf(':');
110
- if (colonAt <= 0) {
111
- return false;
112
- }
113
- return trimmed.slice(0, colonAt).toLowerCase() === 'user';
114
- });
115
- }
116
- const GROUP_PEER_SHAPES = new Set(['group', 'channel', 'room']);
117
- const GROUP_TARGET_PREFIXES = new Set(['chat', 'channel', 'room']);
118
- function readChatTypeSignal(value) {
119
- const normalized = readNonEmptyString(value)?.toLowerCase();
120
- return normalized && GROUP_PEER_SHAPES.has(normalized) ? normalized : undefined;
121
- }
122
- function readTargetPrefixSignal(value) {
123
- const trimmed = readNonEmptyString(value);
124
- if (!trimmed) {
125
- return undefined;
126
- }
127
- const colonAt = trimmed.indexOf(':');
128
- if (colonAt <= 0) {
129
- return undefined;
130
- }
131
- const prefix = trimmed.slice(0, colonAt).toLowerCase();
132
- return GROUP_TARGET_PREFIXES.has(prefix) ? prefix : undefined;
133
- }
134
- function isGroupEntry(sessionKey, entry) {
135
- const parts = sessionKey.toLowerCase().split(':').filter(Boolean);
136
- if (parts.some((part) => GROUP_PEER_SHAPES.has(part))) {
137
- return true;
138
- }
139
- if (readChatTypeSignal(entry.chatType) ||
140
- readChatTypeSignal(entry.origin?.chatType)) {
141
- return true;
142
- }
143
- const toCandidates = [entry.deliveryContext?.to, entry.lastTo, entry.origin?.to];
144
- if (toCandidates.some((candidate) => readTargetPrefixSignal(candidate))) {
145
- return true;
146
- }
147
- return false;
148
- }
149
- function isSessionPeerShape(value) {
150
- const normalized = value?.trim().toLowerCase();
151
- return (normalized === 'direct' ||
152
- normalized === 'dm' ||
153
- normalized === 'group' ||
154
- normalized === 'channel' ||
155
- normalized === 'room');
156
- }
157
- function routeTargetMatches(actual, expected) {
158
- if (!expected) {
159
- return true;
160
- }
161
- if (!actual) {
162
- return false;
163
- }
164
- return actual === expected || actual.endsWith(`:${expected}`) || expected.endsWith(`:${actual}`);
165
- }
166
- function routeMatchesPreferred(route, preferred) {
167
- if (!preferred) {
168
- return true;
169
- }
170
- if (preferred.channel && route.replyChannel !== preferred.channel) {
171
- return false;
172
- }
173
- if (!routeTargetMatches(route.replyTo, preferred.to)) {
174
- return false;
175
- }
176
- if (preferred.accountId && route.replyAccountId !== preferred.accountId) {
177
- return false;
178
- }
179
- return true;
180
- }
181
- function deriveAgentIdFromSessionKey(sessionKey) {
182
- const trimmed = readNonEmptyString(sessionKey);
183
- if (!trimmed) {
184
- return undefined;
185
- }
186
- const parts = trimmed.split(':').filter((part) => part.length > 0);
187
- if (parts[0]?.toLowerCase() !== 'agent') {
188
- return undefined;
189
- }
190
- return readNonEmptyString(parts[1]);
191
- }
192
- function deriveReplyTargetKindFromSessionKey(sessionKey) {
193
- const trimmed = readNonEmptyString(sessionKey);
194
- if (!trimmed) {
195
- return undefined;
196
- }
197
- const parts = trimmed.split(':').filter((part) => part.length > 0);
198
- if (parts[0]?.toLowerCase() !== 'agent') {
199
- return undefined;
200
- }
201
- const channel = readNonEmptyString(parts[2])?.toLowerCase();
202
- const peerShape = parts.length >= 6 && isSessionPeerShape(parts[4])
203
- ? parts[4].toLowerCase()
204
- : parts.length >= 5 && isSessionPeerShape(parts[3])
205
- ? parts[3].toLowerCase()
206
- : undefined;
207
- switch (channel) {
208
- case 'feishu':
209
- if (peerShape === 'direct' || peerShape === 'dm') {
210
- return 'user';
211
- }
212
- if (peerShape === 'group') {
213
- return 'chat';
214
- }
215
- return undefined;
216
- case 'discord':
217
- if (peerShape === 'direct' || peerShape === 'dm') {
218
- return 'user';
219
- }
220
- if (peerShape === 'channel') {
221
- return 'channel';
222
- }
223
- return undefined;
224
- default:
225
- return undefined;
226
- }
227
- }
228
- function normalizeSessionStoreTarget(value, channel, sessionKey) {
229
- const trimmed = readNonEmptyString(value);
230
- if (!trimmed) {
231
- return undefined;
232
- }
233
- const derivedKind = deriveReplyTargetKindFromSessionKey(sessionKey);
234
- if (derivedKind && !/^(user|chat|channel|room):/u.test(trimmed)) {
235
- return `${derivedKind}:${trimmed}`;
236
- }
237
- return (0, reply_target_1.normalizeReplyTarget)(trimmed, {
238
- channel,
239
- sessionKey,
240
- });
241
- }
242
- function deriveChannelFromSessionKey(sessionKey) {
243
- const parts = sessionKey.split(':').filter(Boolean);
244
- if (parts[0]?.toLowerCase() !== 'agent') {
245
- return undefined;
246
- }
247
- return normalizeChannel(parts[2]);
248
- }
249
- function deriveTargetFromSessionKey(sessionKey, channel) {
250
- const parts = sessionKey.split(':').filter(Boolean);
251
- if (parts[0]?.toLowerCase() !== 'agent') {
252
- return undefined;
253
- }
254
- // Layout: agent:<agentId>:<channel>:<peerShape>:<target>[:<extra>]
255
- // or: agent:<agentId>:<channel>:<peerShape>:<accountId>:<target>
256
- if (parts.length < 5 || !isSessionPeerShape(parts[3])) {
257
- return undefined;
258
- }
259
- const rawTarget = parts.length >= 6 ? parts[5] : parts[4];
260
- if (!readNonEmptyString(rawTarget)) {
261
- return undefined;
262
- }
263
- return normalizeSessionStoreTarget(rawTarget, channel, sessionKey);
264
- }
265
- function extractRouteFromEntry(sessionKey, entry) {
266
- if (!entry) {
267
- return undefined;
268
- }
269
- const replyChannel = normalizeChannel(entry.deliveryContext?.channel) ??
270
- normalizeChannel(entry.origin?.provider) ??
271
- deriveChannelFromSessionKey(sessionKey);
272
- const replyTo = normalizeSessionStoreTarget(entry.deliveryContext?.to, replyChannel, sessionKey) ??
273
- normalizeSessionStoreTarget(entry.lastTo, replyChannel, sessionKey) ??
274
- normalizeSessionStoreTarget(entry.origin?.to, replyChannel, sessionKey) ??
275
- deriveTargetFromSessionKey(sessionKey, replyChannel);
276
- const replyAccountId = readNonEmptyString(entry.deliveryContext?.accountId) ??
277
- readNonEmptyString(entry.lastAccountId) ??
278
- readNonEmptyString(entry.origin?.accountId);
279
- if (!replyChannel || !replyTo) {
280
- return undefined;
281
- }
282
- return {
283
- sessionKey,
284
- agentId: deriveAgentIdFromSessionKey(sessionKey) ?? 'main',
285
- replyChannel,
286
- replyTo,
287
- replyAccountId,
288
- };
289
- }
290
- function tryDeriveAgentIdFromStorePath(sessionStorePath) {
291
- const normalized = path.normalize(sessionStorePath);
292
- const parts = normalized.split(path.sep).filter(Boolean);
293
- const agentsIndex = parts.lastIndexOf('agents');
294
- if (agentsIndex === -1) {
295
- return undefined;
296
- }
297
- return readNonEmptyString(parts[agentsIndex + 1]);
298
- }
299
- function listSessionStorePaths(explicitPath, baseAgentId) {
300
- const candidates = [];
301
- const seen = new Set();
302
- const addPath = (candidate) => {
303
- const trimmed = readNonEmptyString(candidate);
304
- if (!trimmed) {
305
- return;
306
- }
307
- const normalized = path.normalize(trimmed);
308
- if (seen.has(normalized)) {
309
- return;
310
- }
311
- seen.add(normalized);
312
- candidates.push(normalized);
313
- };
314
- addPath(explicitPath);
315
- if (candidates.length > 0) {
316
- return candidates;
317
- }
318
- const defaultOpenClawStateDir = getDefaultOpenClawStateDir();
319
- addPath(path.join(defaultOpenClawStateDir, 'agents', baseAgentId, 'sessions', 'sessions.json'));
320
- const agentsRoot = path.join(defaultOpenClawStateDir, 'agents');
321
- try {
322
- if (fs.existsSync(agentsRoot)) {
323
- for (const entry of fs.readdirSync(agentsRoot, { withFileTypes: true })) {
324
- if (!entry.isDirectory()) {
325
- continue;
326
- }
327
- addPath(path.join(agentsRoot, entry.name, 'sessions', 'sessions.json'));
328
- }
329
- }
330
- }
331
- catch {
332
- // Ignore directory scan failures; we will still try explicit/default paths.
333
- }
334
- return candidates;
335
- }
336
- function readSessionStore(sessionStorePath, logger) {
337
- try {
338
- if (!fs.existsSync(sessionStorePath)) {
339
- return undefined;
340
- }
341
- const raw = fs.readFileSync(sessionStorePath, 'utf-8');
342
- const parsed = JSON.parse(raw);
343
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
344
- return undefined;
345
- }
346
- return parsed;
347
- }
348
- catch (error) {
349
- logger.debug(`Failed to read session store ${sessionStorePath}: ${error instanceof Error ? error.message : String(error)}`);
350
- return undefined;
351
- }
352
- }
353
- function readSessionStores(sessionStorePath, baseAgentId, logger) {
354
- const snapshots = [];
355
- const candidates = listSessionStorePaths(sessionStorePath, baseAgentId);
356
- logger.info(`Session store scan candidates: base_agent_id=${baseAgentId}, explicit_path=${sessionStorePath ?? 'n/a'}, candidates=${JSON.stringify(candidates)}`);
357
- for (const candidate of candidates) {
358
- const store = readSessionStore(candidate, logger);
359
- if (store) {
360
- const keys = Object.keys(store);
361
- logger.info(`Session store loaded: path=${candidate}, entries=${keys.length}, session_keys=${JSON.stringify(keys)}`);
362
- snapshots.push({ path: candidate, store });
363
- }
364
- }
365
- return snapshots;
366
- }
367
- function buildPreferredRoute(route) {
368
- if (!route.replyChannel && !route.replyTo && !route.replyAccountId) {
369
- return undefined;
370
- }
371
- return {
372
- channel: route.replyChannel,
373
- to: route.replyTo,
374
- accountId: route.replyAccountId,
375
- };
376
- }
377
- function mergeRoute(base, resolved, overrides, allowSessionOverride) {
378
- const nextSessionKey = allowSessionOverride && !overrides.sessionKey ? resolved.sessionKey : base.sessionKey;
379
- return {
380
- sessionKey: nextSessionKey,
381
- agentId: overrides.agentId === true
382
- ? base.agentId
383
- : resolved.agentId ?? deriveAgentIdFromSessionKey(nextSessionKey) ?? base.agentId,
384
- replyChannel: overrides.replyChannel === true ? base.replyChannel : resolved.replyChannel ?? base.replyChannel,
385
- replyTo: overrides.replyTo === true ? base.replyTo : resolved.replyTo ?? base.replyTo,
386
- replyAccountId: overrides.replyAccountId === true
387
- ? base.replyAccountId
388
- : resolved.replyAccountId ?? base.replyAccountId,
389
- };
390
- }
391
- function selectExactRoute(snapshots, sessionKey) {
392
- let best;
393
- for (const snapshot of snapshots) {
394
- const entry = snapshot.store[sessionKey];
395
- const route = extractRouteFromEntry(sessionKey, entry);
396
- if (!route || !isExternalChannel(route.replyChannel)) {
397
- continue;
398
- }
399
- const updatedAt = normalizeUpdatedAt(entry?.updatedAt);
400
- if (!best || updatedAt > best.updatedAt) {
401
- best = { route, updatedAt };
402
- }
403
- }
404
- return best;
405
- }
406
- /**
407
- * Picks the best session route from recent conversation history.
408
- *
409
- * Preference order (each tier only falls back if the prior tier is empty):
410
- * 1. External channel (not in INTERNAL_CHANNELS) over internal channel.
411
- * 2. Direct/DM session over non-direct.
412
- * 3. Most recent `updatedAt`.
413
- *
414
- * Always skips OpenClaw-internal sessions (bare `main`, `heartbeat`,
415
- * `agent:*:heartbeat`). When called in auto-scan mode (no `preferred`),
416
- * also skips group/channel/room entries so we never auto-post to a group —
417
- * only an explicit binding (via `preferred`) can route there.
418
- */
419
- function selectBestRoute(snapshots, preferred, preferredAgentId, logger) {
420
- const candidates = [];
421
- const autoScan = preferred === undefined;
422
- for (const snapshot of snapshots) {
423
- const pathAgentId = tryDeriveAgentIdFromStorePath(snapshot.path);
424
- for (const [sessionKey, entry] of Object.entries(snapshot.store)) {
425
- if (sessionKey.includes(':subagent:')) {
426
- continue;
427
- }
428
- if (isInternalSessionKey(sessionKey)) {
429
- logger?.debug(`Skipping ${sessionKey}: internal session`);
430
- continue;
431
- }
432
- if (autoScan && isGroupEntry(sessionKey, entry)) {
433
- logger?.debug(`Skipping ${sessionKey}: group entry in auto-scan`);
434
- continue;
435
- }
436
- const route = extractRouteFromEntry(sessionKey, entry);
437
- if (!route || !routeMatchesPreferred(route, preferred)) {
438
- continue;
439
- }
440
- if (preferredAgentId && route.agentId !== preferredAgentId && pathAgentId !== preferredAgentId) {
441
- continue;
442
- }
443
- candidates.push({
444
- route,
445
- updatedAt: normalizeUpdatedAt(entry.updatedAt),
446
- isExternal: isExternalChannel(route.replyChannel),
447
- isDirect: isDirectSessionKey(sessionKey, entry),
448
- });
449
- }
450
- }
451
- if (candidates.length === 0) {
452
- return undefined;
453
- }
454
- const externalPool = candidates.filter((c) => c.isExternal);
455
- const channelPool = externalPool.length > 0 ? externalPool : candidates;
456
- const directPool = channelPool.filter((c) => c.isDirect);
457
- const finalPool = directPool.length > 0 ? directPool : channelPool;
458
- const chosen = finalPool.reduce((best, c) => (c.updatedAt > best.updatedAt ? c : best));
459
- return { route: chosen.route, updatedAt: chosen.updatedAt };
460
- }
461
- /**
462
- * Find a session route that matches the given binding (channel + to + optional
463
- * account). Used by `/eigenflux here` to pin delivery to the current conversation.
464
- * Falls back through the same external-first / direct-first tiers as startup
465
- * discovery.
466
- */
467
- function findSessionRouteForBinding(options, logger) {
468
- const channel = normalizeChannel(options.channel);
469
- const to = (0, reply_target_1.normalizeReplyTarget)(options.to, { channel });
470
- const accountId = readNonEmptyString(options.accountId);
471
- const agentId = readNonEmptyString(options.agentId) ?? 'main';
472
- if (!channel || !to) {
473
- return undefined;
474
- }
475
- const snapshots = readSessionStores(options.sessionStorePath, agentId, logger);
476
- const best = selectBestRoute(snapshots, { channel, to, accountId }, agentId, logger);
477
- if (best) {
478
- return best.route;
479
- }
480
- // Fallback: synthesize a sessionKey from agentId + channel + peer shape + target
481
- // so `/eigenflux here` can pin the conversation even without a session-store hit.
482
- const peerShape = inferPeerShape(channel, to);
483
- const targetLocal = stripTargetPrefix(to);
484
- if (!peerShape || !targetLocal) {
485
- return undefined;
486
- }
487
- return {
488
- sessionKey: `agent:${agentId}:${channel}:${peerShape}:${targetLocal}`,
489
- agentId,
490
- replyChannel: channel,
491
- replyTo: to,
492
- replyAccountId: accountId,
493
- };
494
- }
495
- function inferPeerShape(channel, to) {
496
- const kind = to.split(':', 1)[0]?.toLowerCase();
497
- switch (kind) {
498
- case 'user':
499
- return 'direct';
500
- case 'chat':
501
- return channel === 'feishu' ? 'group' : 'direct';
502
- case 'channel':
503
- return 'channel';
504
- case 'room':
505
- return 'group';
506
- default:
507
- return undefined;
508
- }
509
- }
510
- function stripTargetPrefix(to) {
511
- const idx = to.indexOf(':');
512
- if (idx === -1) {
513
- return readNonEmptyString(to);
514
- }
515
- return readNonEmptyString(to.slice(idx + 1));
516
- }
517
- async function resolveNotificationRoute(config, logger, options = {}) {
518
- const overrides = createRouteOverrides(config.routeOverrides);
519
- const configRoute = {
520
- sessionKey: readNonEmptyString(config.sessionKey) ?? 'main',
521
- agentId: readNonEmptyString(config.agentId) ??
522
- deriveAgentIdFromSessionKey(config.sessionKey) ??
523
- 'main',
524
- replyChannel: normalizeChannel(config.replyChannel),
525
- replyTo: (0, reply_target_1.normalizeReplyTarget)(config.replyTo, {
526
- channel: normalizeChannel(config.replyChannel),
527
- sessionKey: config.sessionKey,
528
- }),
529
- replyAccountId: readNonEmptyString(config.replyAccountId),
530
- };
531
- logger.info(`Route resolve start: session_key=${configRoute.sessionKey}, agent_id=${configRoute.agentId}, channel=${configRoute.replyChannel ?? 'n/a'}, to=${configRoute.replyTo ?? 'n/a'}, account=${configRoute.replyAccountId ?? 'n/a'}, overrides=${JSON.stringify(overrides)}, ignore_remembered=${options.ignoreRemembered === true}`);
532
- // 1. Explicit config values win.
533
- // Triggered by any of:
534
- // - routeOverrides flag set on a field (plugin config marks user-provided fields)
535
- // - non-internal sessionKey provided directly
536
- // - both replyChannel and replyTo provided directly
537
- const hasExplicitConfig = isAnyRouteOverrideEnabled(overrides) ||
538
- !isInternalSessionKey(configRoute.sessionKey) ||
539
- Boolean(configRoute.replyChannel && configRoute.replyTo);
540
- if (hasExplicitConfig) {
541
- const snapshots = readSessionStores(config.sessionStorePath, configRoute.agentId, logger);
542
- // Try exact sessionKey match first. If config sessionKey is internal but
543
- // channel+to are pinned, fall back to peer-shape match to enrich accountId
544
- // (and pick up the real sessionKey) from the session store.
545
- let enriched = selectExactRoute(snapshots, configRoute.sessionKey)?.route;
546
- if (!enriched && configRoute.replyChannel && configRoute.replyTo) {
547
- enriched = selectBestRoute(snapshots, {
548
- channel: configRoute.replyChannel,
549
- to: configRoute.replyTo,
550
- accountId: configRoute.replyAccountId,
551
- }, undefined, logger)?.route;
552
- }
553
- const resolved = enriched
554
- ? mergeRoute(configRoute, enriched, overrides, isInternalSessionKey(configRoute.sessionKey))
555
- : configRoute;
556
- logger.info(`Route resolve final (config): session_key=${resolved.sessionKey}, agent_id=${resolved.agentId}, channel=${resolved.replyChannel ?? 'n/a'}, to=${resolved.replyTo ?? 'n/a'}, account=${resolved.replyAccountId ?? 'n/a'}`);
557
- return { route: resolved, source: 'config' };
558
- }
559
- const snapshots = readSessionStores(config.sessionStorePath, configRoute.agentId, logger);
560
- // 2. Remembered route (openclaw_deliver_session CLI config).
561
- if (options.ignoreRemembered !== true) {
562
- const remembered = await (0, session_route_memory_1.readStoredNotificationRoute)(config.eigenfluxBin, config.serverName, logger);
563
- if (remembered) {
564
- logger.info(`Route resolve remembered: session_key=${remembered.sessionKey}, agent_id=${remembered.agentId}, channel=${remembered.replyChannel ?? 'n/a'}, to=${remembered.replyTo ?? 'n/a'}, account=${remembered.replyAccountId ?? 'n/a'}`);
565
- // Use remembered replyChannel+replyTo as a peer-shape anchor against
566
- // session stores so we resolve the real sessionKey even if remembered
567
- // was stored with a stale/internal key.
568
- const preferred = remembered.replyChannel && remembered.replyTo
569
- ? {
570
- channel: remembered.replyChannel,
571
- to: remembered.replyTo,
572
- accountId: remembered.replyAccountId,
573
- }
574
- : undefined;
575
- const peerMatch = selectBestRoute(snapshots, preferred, undefined, logger);
576
- if (peerMatch) {
577
- return { route: peerMatch.route, source: 'remembered' };
578
- }
579
- if (!isInternalSessionKey(remembered.sessionKey)) {
580
- return {
581
- route: {
582
- sessionKey: remembered.sessionKey,
583
- agentId: remembered.agentId,
584
- replyChannel: remembered.replyChannel,
585
- replyTo: remembered.replyTo,
586
- replyAccountId: remembered.replyAccountId,
587
- },
588
- source: 'remembered',
589
- };
590
- }
591
- logger.warn(`Remembered route has internal session_key=${remembered.sessionKey} and no peer match; falling through to session-store scan.`);
592
- }
593
- }
594
- // 3. Scan recent conversation history.
595
- const best = selectBestRoute(snapshots, undefined, undefined, logger);
596
- if (best) {
597
- logger.info(`Route resolve from session store: session_key=${best.route.sessionKey}, agent_id=${best.route.agentId}, channel=${best.route.replyChannel ?? 'n/a'}, to=${best.route.replyTo ?? 'n/a'}, account=${best.route.replyAccountId ?? 'n/a'}, updated_at=${best.updatedAt}`);
598
- return { route: best.route, source: 'session-store' };
599
- }
600
- logger.warn(`Route resolve fell back to config default: session_key=${configRoute.sessionKey}, agent_id=${configRoute.agentId}`);
601
- return { route: configRoute, source: 'default' };
602
- }
603
- //# sourceMappingURL=notification-route-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notification-route-resolver.js","sourceRoot":"","sources":["../src/notification-route-resolver.ts"],"names":[],"mappings":"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"}