@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.
Files changed (51) hide show
  1. package/README.md +28 -0
  2. package/dist/index.d.ts +9 -23
  3. package/dist/index.js +2265 -457
  4. package/openclaw.plugin.json +5 -1
  5. package/package.json +21 -8
  6. package/dist/agent-prompt-templates.d.ts +0 -19
  7. package/dist/agent-prompt-templates.d.ts.map +0 -1
  8. package/dist/agent-prompt-templates.js +0 -56
  9. package/dist/agent-prompt-templates.js.map +0 -1
  10. package/dist/cli-executor.d.ts +0 -32
  11. package/dist/cli-executor.d.ts.map +0 -1
  12. package/dist/cli-executor.js +0 -75
  13. package/dist/cli-executor.js.map +0 -1
  14. package/dist/config.d.ts +0 -83
  15. package/dist/config.d.ts.map +0 -1
  16. package/dist/config.js +0 -226
  17. package/dist/config.js.map +0 -1
  18. package/dist/credentials-loader.d.ts +0 -29
  19. package/dist/credentials-loader.d.ts.map +0 -1
  20. package/dist/credentials-loader.js +0 -117
  21. package/dist/credentials-loader.js.map +0 -1
  22. package/dist/index.d.ts.map +0 -1
  23. package/dist/index.js.map +0 -1
  24. package/dist/logger.d.ts +0 -12
  25. package/dist/logger.d.ts.map +0 -1
  26. package/dist/logger.js +0 -25
  27. package/dist/logger.js.map +0 -1
  28. package/dist/notification-route-resolver.d.ts +0 -66
  29. package/dist/notification-route-resolver.d.ts.map +0 -1
  30. package/dist/notification-route-resolver.js +0 -603
  31. package/dist/notification-route-resolver.js.map +0 -1
  32. package/dist/notifier.d.ts +0 -39
  33. package/dist/notifier.d.ts.map +0 -1
  34. package/dist/notifier.js +0 -335
  35. package/dist/notifier.js.map +0 -1
  36. package/dist/polling-client.d.ts +0 -86
  37. package/dist/polling-client.d.ts.map +0 -1
  38. package/dist/polling-client.js +0 -158
  39. package/dist/polling-client.js.map +0 -1
  40. package/dist/reply-target.d.ts +0 -8
  41. package/dist/reply-target.d.ts.map +0 -1
  42. package/dist/reply-target.js +0 -104
  43. package/dist/reply-target.js.map +0 -1
  44. package/dist/session-route-memory.d.ts +0 -22
  45. package/dist/session-route-memory.d.ts.map +0 -1
  46. package/dist/session-route-memory.js +0 -117
  47. package/dist/session-route-memory.js.map +0 -1
  48. package/dist/stream-client.d.ts +0 -48
  49. package/dist/stream-client.d.ts.map +0 -1
  50. package/dist/stream-client.js +0 -168
  51. package/dist/stream-client.js.map +0 -1
@@ -1,8 +0,0 @@
1
- type ConversationTargetKind = 'user' | 'chat' | 'channel' | 'room';
2
- export declare function normalizeReplyTarget(value: unknown, options?: {
3
- channel?: string;
4
- sessionKey?: string;
5
- fallbackKind?: ConversationTargetKind;
6
- }): string | undefined;
7
- export {};
8
- //# sourceMappingURL=reply-target.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reply-target.d.ts","sourceRoot":"","sources":["../src/reply-target.ts"],"names":[],"mappings":"AAAA,KAAK,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AA0GnE,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC,GACA,MAAM,GAAG,SAAS,CAwBpB"}
@@ -1,104 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.normalizeReplyTarget = normalizeReplyTarget;
4
- function readNonEmptyString(value) {
5
- if (typeof value !== 'string') {
6
- return undefined;
7
- }
8
- const trimmed = value.trim();
9
- return trimmed.length > 0 ? trimmed : undefined;
10
- }
11
- function isNormalizedConversationTarget(value) {
12
- return /^(user|chat|channel|room):/u.test(value);
13
- }
14
- function isSessionPeerShape(value) {
15
- const normalized = value?.trim().toLowerCase();
16
- return (normalized === 'direct' ||
17
- normalized === 'dm' ||
18
- normalized === 'group' ||
19
- normalized === 'channel' ||
20
- normalized === 'room');
21
- }
22
- function supportsKindPrefixedTargets(channel) {
23
- return channel === 'feishu' || channel === 'discord';
24
- }
25
- function parseSessionRoute(sessionKey) {
26
- const trimmed = readNonEmptyString(sessionKey);
27
- if (!trimmed) {
28
- return {};
29
- }
30
- const parts = trimmed.split(':').filter((part) => part.length > 0);
31
- if (parts[0]?.toLowerCase() !== 'agent') {
32
- return {};
33
- }
34
- const channel = readNonEmptyString(parts[2])?.toLowerCase();
35
- const peerShapeRaw = parts.length >= 6 && isSessionPeerShape(parts[4])
36
- ? parts[4].toLowerCase()
37
- : parts.length >= 5 && isSessionPeerShape(parts[3])
38
- ? parts[3].toLowerCase()
39
- : undefined;
40
- const peerShape = peerShapeRaw;
41
- return { channel, peerShape };
42
- }
43
- function deriveReplyTargetKindFromSessionKey(sessionKey) {
44
- const route = parseSessionRoute(sessionKey);
45
- if (!supportsKindPrefixedTargets(route.channel)) {
46
- return undefined;
47
- }
48
- switch (route.channel) {
49
- case 'feishu':
50
- switch (route.peerShape) {
51
- case 'direct':
52
- case 'dm':
53
- return 'user';
54
- case 'group':
55
- return 'chat';
56
- default:
57
- return undefined;
58
- }
59
- case 'discord':
60
- switch (route.peerShape) {
61
- case 'direct':
62
- case 'dm':
63
- return 'user';
64
- case 'channel':
65
- return 'channel';
66
- default:
67
- return undefined;
68
- }
69
- default:
70
- return undefined;
71
- }
72
- }
73
- function deriveReplyTargetKindFromValue(value, channel) {
74
- if (channel === 'feishu') {
75
- if (/^ou_/iu.test(value)) {
76
- return 'user';
77
- }
78
- if (/^oc_/iu.test(value)) {
79
- return 'chat';
80
- }
81
- }
82
- return undefined;
83
- }
84
- function normalizeReplyTarget(value, options) {
85
- const trimmed = readNonEmptyString(value);
86
- if (!trimmed) {
87
- return undefined;
88
- }
89
- if (isNormalizedConversationTarget(trimmed)) {
90
- return trimmed;
91
- }
92
- const channel = readNonEmptyString(options?.channel)?.toLowerCase();
93
- if (channel && trimmed.startsWith(`${channel}:`)) {
94
- return normalizeReplyTarget(trimmed.slice(channel.length + 1), {
95
- ...options,
96
- channel,
97
- });
98
- }
99
- const fallbackKind = deriveReplyTargetKindFromValue(trimmed, channel) ??
100
- (supportsKindPrefixedTargets(channel) ? options?.fallbackKind : undefined) ??
101
- deriveReplyTargetKindFromSessionKey(options?.sessionKey);
102
- return fallbackKind ? `${fallbackKind}:${trimmed}` : trimmed;
103
- }
104
- //# sourceMappingURL=reply-target.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reply-target.js","sourceRoot":"","sources":["../src/reply-target.ts"],"names":[],"mappings":";;AA0GA,oDA+BC;AAtID,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAa;IACnD,OAAO,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAyB;IACnD,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,OAAO,CACL,UAAU,KAAK,QAAQ;QACvB,UAAU,KAAK,IAAI;QACnB,UAAU,KAAK,OAAO;QACtB,UAAU,KAAK,SAAS;QACxB,UAAU,KAAK,MAAM,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,OAA2B;IAC9D,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,iBAAiB,CAAC,UAA8B;IAIvD,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5D,MAAM,YAAY,GAChB,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QACxB,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YACxB,CAAC,CAAC,SAAS,CAAC;IAClB,MAAM,SAAS,GAAG,YAA4C,CAAC;IAE/D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,mCAAmC,CAC1C,UAA8B;IAE9B,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC;gBACxB,KAAK,QAAQ,CAAC;gBACd,KAAK,IAAI;oBACP,OAAO,MAAM,CAAC;gBAChB,KAAK,OAAO;oBACV,OAAO,MAAM,CAAC;gBAChB;oBACE,OAAO,SAAS,CAAC;YACrB,CAAC;QACH,KAAK,SAAS;YACZ,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC;gBACxB,KAAK,QAAQ,CAAC;gBACd,KAAK,IAAI;oBACP,OAAO,MAAM,CAAC;gBAChB,KAAK,SAAS;oBACZ,OAAO,SAAS,CAAC;gBACnB;oBACE,OAAO,SAAS,CAAC;YACrB,CAAC;QACH;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CACrC,KAAa,EACb,OAA2B;IAE3B,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,oBAAoB,CAClC,KAAc,EACd,OAIC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACpE,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YAC7D,GAAG,OAAO;YACV,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAChB,8BAA8B,CAAC,OAAO,EAAE,OAAO,CAAC;QAChD,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,mCAAmC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE3D,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/D,CAAC"}
@@ -1,22 +0,0 @@
1
- import { Logger } from './logger';
2
- export declare const DELIVER_SESSION_KEY = "openclaw_deliver_session";
3
- export type StoredNotificationRoute = {
4
- sessionKey: string;
5
- agentId: string;
6
- replyChannel?: string;
7
- replyTo?: string;
8
- replyAccountId?: string;
9
- updatedAt: number;
10
- };
11
- /**
12
- * Reads the remembered delivery route for a server from the eigenflux CLI
13
- * config store (`openclaw_deliver_session` key). Returns undefined when the
14
- * key is unset or the CLI call fails.
15
- */
16
- export declare function readStoredNotificationRoute(eigenfluxBin: string | undefined, serverName: string | undefined, logger: Logger): Promise<StoredNotificationRoute | undefined>;
17
- /**
18
- * Persists the remembered delivery route for a server via the eigenflux CLI
19
- * config store (`openclaw_deliver_session` key).
20
- */
21
- export declare function writeStoredNotificationRoute(eigenfluxBin: string | undefined, serverName: string | undefined, route: Omit<StoredNotificationRoute, 'updatedAt'>, logger: Logger): Promise<boolean>;
22
- //# sourceMappingURL=session-route-memory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-route-memory.d.ts","sourceRoot":"","sources":["../src/session-route-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAcF;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAuD9C;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,WAAW,CAAC,EACjD,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAkElB"}
@@ -1,117 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DELIVER_SESSION_KEY = void 0;
4
- exports.readStoredNotificationRoute = readStoredNotificationRoute;
5
- exports.writeStoredNotificationRoute = writeStoredNotificationRoute;
6
- const reply_target_1 = require("./reply-target");
7
- const cli_executor_1 = require("./cli-executor");
8
- exports.DELIVER_SESSION_KEY = 'openclaw_deliver_session';
9
- function readNonEmptyString(value) {
10
- if (typeof value !== 'string') {
11
- return undefined;
12
- }
13
- const trimmed = value.trim();
14
- return trimmed.length > 0 ? trimmed : undefined;
15
- }
16
- function normalizeChannel(value) {
17
- return readNonEmptyString(value)?.toLowerCase();
18
- }
19
- /**
20
- * Reads the remembered delivery route for a server from the eigenflux CLI
21
- * config store (`openclaw_deliver_session` key). Returns undefined when the
22
- * key is unset or the CLI call fails.
23
- */
24
- async function readStoredNotificationRoute(eigenfluxBin, serverName, logger) {
25
- const bin = readNonEmptyString(eigenfluxBin);
26
- const server = readNonEmptyString(serverName);
27
- if (!bin || !server) {
28
- return undefined;
29
- }
30
- const result = await (0, cli_executor_1.execEigenflux)(bin, ['config', 'get', '--key', exports.DELIVER_SESSION_KEY, '--server', server, '--format', 'json'], { logger });
31
- if (result.kind !== 'success' || result.data === undefined) {
32
- if (result.kind === 'error') {
33
- logger.debug(`readStoredNotificationRoute: eigenflux config get failed for server=${server}: ${result.error.message}`);
34
- }
35
- return undefined;
36
- }
37
- const parsed = result.data;
38
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
39
- return undefined;
40
- }
41
- const record = parsed;
42
- const sessionKey = readNonEmptyString(record.sessionKey);
43
- const agentId = readNonEmptyString(record.agentId);
44
- if (!sessionKey || !agentId) {
45
- logger.warn(`Remembered route entry for server=${server} is incomplete (sessionKey/agentId missing)`);
46
- return undefined;
47
- }
48
- const route = {
49
- sessionKey,
50
- agentId,
51
- replyChannel: normalizeChannel(record.replyChannel),
52
- replyTo: (0, reply_target_1.normalizeReplyTarget)(readNonEmptyString(record.replyTo), {
53
- channel: normalizeChannel(record.replyChannel),
54
- sessionKey,
55
- }),
56
- replyAccountId: readNonEmptyString(record.replyAccountId),
57
- updatedAt: typeof record.updatedAt === 'number' && Number.isFinite(record.updatedAt)
58
- ? record.updatedAt
59
- : 0,
60
- };
61
- logger.info(`Remembered route loaded: server=${server}, session_key=${route.sessionKey}, agent_id=${route.agentId}, channel=${route.replyChannel ?? 'n/a'}, to=${route.replyTo ?? 'n/a'}, account=${route.replyAccountId ?? 'n/a'}`);
62
- return route;
63
- }
64
- /**
65
- * Persists the remembered delivery route for a server via the eigenflux CLI
66
- * config store (`openclaw_deliver_session` key).
67
- */
68
- async function writeStoredNotificationRoute(eigenfluxBin, serverName, route, logger) {
69
- const bin = readNonEmptyString(eigenfluxBin);
70
- const server = readNonEmptyString(serverName);
71
- if (!bin || !server) {
72
- return false;
73
- }
74
- const normalized = {
75
- sessionKey: route.sessionKey,
76
- agentId: route.agentId,
77
- replyChannel: normalizeChannel(route.replyChannel),
78
- replyTo: (0, reply_target_1.normalizeReplyTarget)(readNonEmptyString(route.replyTo), {
79
- channel: normalizeChannel(route.replyChannel),
80
- sessionKey: route.sessionKey,
81
- }),
82
- replyAccountId: readNonEmptyString(route.replyAccountId),
83
- };
84
- const existing = await readStoredNotificationRoute(bin, server, logger);
85
- if (existing &&
86
- existing.sessionKey === normalized.sessionKey &&
87
- existing.agentId === normalized.agentId &&
88
- existing.replyChannel === normalized.replyChannel &&
89
- existing.replyTo === normalized.replyTo &&
90
- existing.replyAccountId === normalized.replyAccountId) {
91
- logger.debug(`Remembered route unchanged for server=${server} (session_key=${normalized.sessionKey}); skipping write`);
92
- return true;
93
- }
94
- const payload = {
95
- ...normalized,
96
- updatedAt: Date.now(),
97
- };
98
- const value = JSON.stringify(payload);
99
- const result = await (0, cli_executor_1.execEigenflux)(bin, [
100
- 'config',
101
- 'set',
102
- '--key',
103
- exports.DELIVER_SESSION_KEY,
104
- '--value',
105
- value,
106
- '--server',
107
- server,
108
- ], { logger, parseJson: false });
109
- if (result.kind !== 'success') {
110
- const detail = result.kind === 'error' ? result.error.message : result.kind;
111
- logger.warn(`Failed to persist remembered session route via eigenflux config set (server=${server}): ${detail}`);
112
- return false;
113
- }
114
- logger.info(`Remembered route saved: server=${server}, session_key=${payload.sessionKey}, agent_id=${payload.agentId}, channel=${payload.replyChannel ?? 'n/a'}, to=${payload.replyTo ?? 'n/a'}, account=${payload.replyAccountId ?? 'n/a'}`);
115
- return true;
116
- }
117
- //# sourceMappingURL=session-route-memory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-route-memory.js","sourceRoot":"","sources":["../src/session-route-memory.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Stream client for EigenFlux private message updates.
3
- * Manages a long-running `eigenflux stream` child process that outputs NDJSON.
4
- */
5
- import { Logger } from './logger';
6
- export interface PmStreamEvent {
7
- type: string;
8
- data: {
9
- messages?: Array<{
10
- msg_id: string;
11
- conv_id: string;
12
- sender_id?: string;
13
- sender_name?: string;
14
- content: string;
15
- created_at: number;
16
- }>;
17
- next_cursor?: string;
18
- [key: string]: unknown;
19
- };
20
- }
21
- export interface StreamClientConfig {
22
- serverName: string;
23
- eigenfluxBin: string;
24
- logger: Logger;
25
- onPmEvent: (event: PmStreamEvent) => Promise<void>;
26
- onAuthRequired: () => Promise<void>;
27
- onStreamError?: (error: Error) => void;
28
- }
29
- export declare class EigenFluxStreamClient {
30
- private config;
31
- private child;
32
- private readline;
33
- private stopping;
34
- private running;
35
- private lastCursor;
36
- private backoffMs;
37
- private consecutiveFailures;
38
- private restartTimer;
39
- constructor(config: StreamClientConfig);
40
- isRunning(): boolean;
41
- getLastCursor(): string | null;
42
- start(): Promise<void>;
43
- stop(): Promise<void>;
44
- private spawnStreamProcess;
45
- private handleLine;
46
- private scheduleRestart;
47
- }
48
- //# sourceMappingURL=stream-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-client.d.ts","sourceRoot":"","sources":["../src/stream-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AASlC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,OAAO,EAAE,MAAM,CAAC;YAChB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC,CAAC;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,YAAY,CAA+B;gBAEvC,MAAM,EAAE,kBAAkB;IAItC,SAAS,IAAI,OAAO;IAIpB,aAAa,IAAI,MAAM,GAAG,IAAI;IAIxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C3B,OAAO,CAAC,kBAAkB;IA+D1B,OAAO,CAAC,UAAU;IA8BlB,OAAO,CAAC,eAAe;CA6BxB"}
@@ -1,168 +0,0 @@
1
- "use strict";
2
- /**
3
- * Stream client for EigenFlux private message updates.
4
- * Manages a long-running `eigenflux stream` child process that outputs NDJSON.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.EigenFluxStreamClient = void 0;
8
- const child_process_1 = require("child_process");
9
- const readline_1 = require("readline");
10
- const EXIT_AUTH_REQUIRED = 4;
11
- const INITIAL_BACKOFF_MS = 1000;
12
- const MAX_BACKOFF_MS = 60000;
13
- const BACKOFF_MULTIPLIER = 2;
14
- const STOP_GRACE_MS = 5000;
15
- const MAX_CONSECUTIVE_FAILURES = 20;
16
- class EigenFluxStreamClient {
17
- constructor(config) {
18
- this.child = null;
19
- this.readline = null;
20
- this.stopping = false;
21
- this.running = false;
22
- this.lastCursor = null;
23
- this.backoffMs = INITIAL_BACKOFF_MS;
24
- this.consecutiveFailures = 0;
25
- this.restartTimer = null;
26
- this.config = config;
27
- }
28
- isRunning() {
29
- return this.running;
30
- }
31
- getLastCursor() {
32
- return this.lastCursor;
33
- }
34
- async start() {
35
- if (this.running) {
36
- this.config.logger.warn('Stream client already running');
37
- return;
38
- }
39
- this.running = true;
40
- this.stopping = false;
41
- this.config.logger.info(`Starting stream client for server=${this.config.serverName}`);
42
- this.spawnStreamProcess();
43
- }
44
- async stop() {
45
- if (!this.running) {
46
- return;
47
- }
48
- this.config.logger.info(`Stopping stream client for server=${this.config.serverName}`);
49
- this.stopping = true;
50
- this.running = false;
51
- if (this.restartTimer) {
52
- clearTimeout(this.restartTimer);
53
- this.restartTimer = null;
54
- }
55
- if (this.readline) {
56
- this.readline.close();
57
- this.readline = null;
58
- }
59
- if (this.child) {
60
- const child = this.child;
61
- this.child = null;
62
- child.kill('SIGTERM');
63
- await new Promise((resolve) => {
64
- const forceKillTimer = setTimeout(() => {
65
- try {
66
- child.kill('SIGKILL');
67
- }
68
- catch {
69
- // Process already exited
70
- }
71
- resolve();
72
- }, STOP_GRACE_MS);
73
- child.once('exit', () => {
74
- clearTimeout(forceKillTimer);
75
- resolve();
76
- });
77
- });
78
- }
79
- }
80
- spawnStreamProcess() {
81
- if (this.stopping || !this.running) {
82
- return;
83
- }
84
- const args = ['stream', '-s', this.config.serverName, '-f', 'json'];
85
- if (this.lastCursor) {
86
- args.push('--cursor', this.lastCursor);
87
- }
88
- this.config.logger.info(`Spawning: ${this.config.eigenfluxBin} ${args.join(' ')}`);
89
- const child = (0, child_process_1.spawn)(this.config.eigenfluxBin, args, {
90
- stdio: ['ignore', 'pipe', 'pipe'],
91
- });
92
- this.child = child;
93
- const rl = (0, readline_1.createInterface)({ input: child.stdout });
94
- this.readline = rl;
95
- rl.on('line', (line) => {
96
- this.handleLine(line);
97
- });
98
- child.stderr?.on('data', (chunk) => {
99
- const text = chunk.toString().trim();
100
- if (text) {
101
- this.config.logger.debug(`[stream stderr] ${text}`);
102
- }
103
- });
104
- child.on('error', (err) => {
105
- this.config.logger.error(`Stream process error: ${err.message}`);
106
- this.config.onStreamError?.(err);
107
- this.scheduleRestart();
108
- });
109
- child.on('exit', (code, signal) => {
110
- this.config.logger.info(`Stream process exited (code=${code}, signal=${signal})`);
111
- if (this.stopping) {
112
- return;
113
- }
114
- if (code === EXIT_AUTH_REQUIRED) {
115
- this.config.logger.warn('Stream auth required');
116
- this.config.onAuthRequired().then(() => {
117
- this.scheduleRestart();
118
- }).catch((err) => {
119
- this.config.logger.error(`Auth required handler error: ${err instanceof Error ? err.message : String(err)}`);
120
- this.scheduleRestart();
121
- });
122
- return;
123
- }
124
- this.scheduleRestart();
125
- });
126
- }
127
- handleLine(line) {
128
- const trimmed = line.trim();
129
- if (!trimmed) {
130
- return;
131
- }
132
- try {
133
- const event = JSON.parse(trimmed);
134
- // Update cursor for reconnect resume
135
- if (event.data?.next_cursor) {
136
- this.lastCursor = event.data.next_cursor;
137
- }
138
- // Reset backoff on successful message
139
- this.backoffMs = INITIAL_BACKOFF_MS;
140
- this.consecutiveFailures = 0;
141
- this.config.onPmEvent(event).catch((err) => {
142
- this.config.logger.error(`PM event handler error: ${err instanceof Error ? err.message : String(err)}`);
143
- });
144
- }
145
- catch (err) {
146
- this.config.logger.warn(`Failed to parse stream line: ${err.message}`);
147
- }
148
- }
149
- scheduleRestart() {
150
- if (this.stopping || !this.running) {
151
- return;
152
- }
153
- this.consecutiveFailures += 1;
154
- if (this.consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
155
- this.config.logger.error(`Stream client giving up after ${MAX_CONSECUTIVE_FAILURES} consecutive failures for server=${this.config.serverName}`);
156
- this.running = false;
157
- return;
158
- }
159
- this.config.logger.info(`Stream reconnecting in ${this.backoffMs}ms (failure #${this.consecutiveFailures}) for server=${this.config.serverName}`);
160
- this.restartTimer = setTimeout(() => {
161
- this.restartTimer = null;
162
- this.spawnStreamProcess();
163
- }, this.backoffMs);
164
- this.backoffMs = Math.min(this.backoffMs * BACKOFF_MULTIPLIER, MAX_BACKOFF_MS);
165
- }
166
- }
167
- exports.EigenFluxStreamClient = EigenFluxStreamClient;
168
- //# sourceMappingURL=stream-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-client.js","sourceRoot":"","sources":["../src/stream-client.ts"],"names":[],"mappings":"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"}