@phronesis-io/openclaw-eigenflux 0.0.8 → 0.0.9
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/README.md +28 -0
- package/dist/index.d.ts +9 -23
- package/dist/index.js +2265 -457
- package/openclaw.plugin.json +5 -1
- package/package.json +21 -8
- package/dist/agent-prompt-templates.d.ts +0 -19
- package/dist/agent-prompt-templates.d.ts.map +0 -1
- package/dist/agent-prompt-templates.js +0 -56
- package/dist/agent-prompt-templates.js.map +0 -1
- package/dist/cli-executor.d.ts +0 -32
- package/dist/cli-executor.d.ts.map +0 -1
- package/dist/cli-executor.js +0 -75
- package/dist/cli-executor.js.map +0 -1
- package/dist/config.d.ts +0 -83
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -226
- package/dist/config.js.map +0 -1
- package/dist/credentials-loader.d.ts +0 -29
- package/dist/credentials-loader.d.ts.map +0 -1
- package/dist/credentials-loader.js +0 -117
- package/dist/credentials-loader.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.d.ts +0 -12
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -25
- package/dist/logger.js.map +0 -1
- package/dist/notification-route-resolver.d.ts +0 -66
- package/dist/notification-route-resolver.d.ts.map +0 -1
- package/dist/notification-route-resolver.js +0 -603
- package/dist/notification-route-resolver.js.map +0 -1
- package/dist/notifier.d.ts +0 -39
- package/dist/notifier.d.ts.map +0 -1
- package/dist/notifier.js +0 -335
- package/dist/notifier.js.map +0 -1
- package/dist/polling-client.d.ts +0 -86
- package/dist/polling-client.d.ts.map +0 -1
- package/dist/polling-client.js +0 -158
- package/dist/polling-client.js.map +0 -1
- package/dist/reply-target.d.ts +0 -8
- package/dist/reply-target.d.ts.map +0 -1
- package/dist/reply-target.js +0 -104
- package/dist/reply-target.js.map +0 -1
- package/dist/session-route-memory.d.ts +0 -22
- package/dist/session-route-memory.d.ts.map +0 -1
- package/dist/session-route-memory.js +0 -117
- package/dist/session-route-memory.js.map +0 -1
- package/dist/stream-client.d.ts +0 -48
- package/dist/stream-client.d.ts.map +0 -1
- package/dist/stream-client.js +0 -168
- 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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"}
|