@phronesis-io/openclaw-eigenflux 0.0.3 → 0.0.6
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 +15 -161
- package/dist/agent-prompt-templates.d.ts +14 -11
- package/dist/agent-prompt-templates.d.ts.map +1 -1
- package/dist/agent-prompt-templates.js +27 -38
- package/dist/agent-prompt-templates.js.map +1 -1
- package/dist/cli-executor.d.ts +32 -0
- package/dist/cli-executor.d.ts.map +1 -0
- package/dist/cli-executor.js +75 -0
- package/dist/cli-executor.js.map +1 -0
- package/dist/config.d.ts +41 -126
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +94 -229
- package/dist/config.js.map +1 -1
- package/dist/credentials-loader.d.ts +6 -5
- package/dist/credentials-loader.d.ts.map +1 -1
- package/dist/credentials-loader.js +17 -21
- package/dist/credentials-loader.js.map +1 -1
- package/dist/index.d.ts +3 -73
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +212 -276
- package/dist/index.js.map +1 -1
- package/dist/notification-route-resolver.d.ts +24 -2
- package/dist/notification-route-resolver.d.ts.map +1 -1
- package/dist/notification-route-resolver.js +257 -43
- package/dist/notification-route-resolver.js.map +1 -1
- package/dist/notifier.d.ts +9 -17
- package/dist/notifier.d.ts.map +1 -1
- package/dist/notifier.js +133 -66
- package/dist/notifier.js.map +1 -1
- package/dist/polling-client.d.ts +31 -19
- package/dist/polling-client.d.ts.map +1 -1
- package/dist/polling-client.js +102 -127
- package/dist/polling-client.js.map +1 -1
- package/dist/reply-target.d.ts +8 -0
- package/dist/reply-target.d.ts.map +1 -0
- package/dist/reply-target.js +104 -0
- package/dist/reply-target.js.map +1 -0
- package/dist/session-route-memory.d.ts +12 -3
- package/dist/session-route-memory.d.ts.map +1 -1
- package/dist/session-route-memory.js +83 -80
- package/dist/session-route-memory.js.map +1 -1
- package/dist/stream-client.d.ts +48 -0
- package/dist/stream-client.d.ts.map +1 -0
- package/dist/stream-client.js +168 -0
- package/dist/stream-client.js.map +1 -0
- package/openclaw.plugin.json +5 -75
- package/package.json +6 -8
- package/skills/ef-broadcast/SKILL.md +84 -0
- package/skills/ef-broadcast/references/feed.md +127 -0
- package/skills/ef-broadcast/references/publish.md +119 -0
- package/skills/ef-communication/SKILL.md +95 -0
- package/skills/ef-communication/references/message.md +132 -0
- package/skills/ef-communication/references/relations.md +215 -0
- package/skills/ef-communication/references/stream.md +66 -0
- package/skills/ef-profile/SKILL.md +138 -0
- package/skills/ef-profile/references/auth.md +103 -0
- package/skills/ef-profile/references/config.md +54 -0
- package/skills/ef-profile/references/onboarding.md +172 -0
- package/skills/ef-profile/references/server-management.md +67 -0
- package/dist/gateway-rpc-client.d.ts +0 -26
- package/dist/gateway-rpc-client.d.ts.map +0 -1
- package/dist/gateway-rpc-client.js +0 -288
- package/dist/gateway-rpc-client.js.map +0 -1
- package/dist/pm-polling-client.d.ts +0 -52
- package/dist/pm-polling-client.d.ts.map +0 -1
- package/dist/pm-polling-client.js +0 -182
- package/dist/pm-polling-client.js.map +0 -1
|
@@ -1,43 +1,11 @@
|
|
|
1
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
3
|
+
exports.DELIVER_SESSION_KEY = void 0;
|
|
37
4
|
exports.readStoredNotificationRoute = readStoredNotificationRoute;
|
|
38
5
|
exports.writeStoredNotificationRoute = writeStoredNotificationRoute;
|
|
39
|
-
const
|
|
40
|
-
const
|
|
6
|
+
const reply_target_1 = require("./reply-target");
|
|
7
|
+
const cli_executor_1 = require("./cli-executor");
|
|
8
|
+
exports.DELIVER_SESSION_KEY = 'openclaw_deliver_session';
|
|
41
9
|
function readNonEmptyString(value) {
|
|
42
10
|
if (typeof value !== 'string') {
|
|
43
11
|
return undefined;
|
|
@@ -48,67 +16,102 @@ function readNonEmptyString(value) {
|
|
|
48
16
|
function normalizeChannel(value) {
|
|
49
17
|
return readNonEmptyString(value)?.toLowerCase();
|
|
50
18
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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) {
|
|
57
28
|
return undefined;
|
|
58
29
|
}
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
65
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
66
|
-
return undefined;
|
|
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}`);
|
|
67
34
|
}
|
|
68
|
-
|
|
69
|
-
const sessionKey = readNonEmptyString(record.sessionKey);
|
|
70
|
-
const agentId = readNonEmptyString(record.agentId);
|
|
71
|
-
if (!sessionKey || !agentId) {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
return {
|
|
75
|
-
sessionKey,
|
|
76
|
-
agentId,
|
|
77
|
-
replyChannel: normalizeChannel(record.replyChannel),
|
|
78
|
-
replyTo: readNonEmptyString(record.replyTo),
|
|
79
|
-
replyAccountId: readNonEmptyString(record.replyAccountId),
|
|
80
|
-
updatedAt: typeof record.updatedAt === 'number' && Number.isFinite(record.updatedAt)
|
|
81
|
-
? record.updatedAt
|
|
82
|
-
: 0,
|
|
83
|
-
};
|
|
35
|
+
return undefined;
|
|
84
36
|
}
|
|
85
|
-
|
|
86
|
-
|
|
37
|
+
const parsed = result.data;
|
|
38
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
87
39
|
return undefined;
|
|
88
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;
|
|
89
63
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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) {
|
|
93
72
|
return false;
|
|
94
73
|
}
|
|
95
|
-
const
|
|
96
|
-
const payload = {
|
|
74
|
+
const normalized = {
|
|
97
75
|
sessionKey: route.sessionKey,
|
|
98
76
|
agentId: route.agentId,
|
|
99
77
|
replyChannel: normalizeChannel(route.replyChannel),
|
|
100
|
-
replyTo: readNonEmptyString(route.replyTo),
|
|
78
|
+
replyTo: (0, reply_target_1.normalizeReplyTarget)(readNonEmptyString(route.replyTo), {
|
|
79
|
+
channel: normalizeChannel(route.replyChannel),
|
|
80
|
+
sessionKey: route.sessionKey,
|
|
81
|
+
}),
|
|
101
82
|
replyAccountId: readNonEmptyString(route.replyAccountId),
|
|
102
|
-
updatedAt: Date.now(),
|
|
103
83
|
};
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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`);
|
|
107
92
|
return true;
|
|
108
93
|
}
|
|
109
|
-
|
|
110
|
-
|
|
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}`);
|
|
111
112
|
return false;
|
|
112
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;
|
|
113
116
|
}
|
|
114
117
|
//# sourceMappingURL=session-route-memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-route-memory.js","sourceRoot":"","sources":["../src/session-route-memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-route-memory.js","sourceRoot":"","sources":["../src/session-route-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-client.js","sourceRoot":"","sources":["../src/stream-client.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,91 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "openclaw-eigenflux",
|
|
3
3
|
"name": "EigenFlux",
|
|
4
|
-
"version": "0.0.
|
|
5
|
-
"description": "
|
|
4
|
+
"version": "0.0.6",
|
|
5
|
+
"description": "CLI-based EigenFlux delivery for OpenClaw with server discovery, feed polling, and PM streaming",
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"additionalProperties": false,
|
|
9
9
|
"properties": {
|
|
10
|
-
"
|
|
10
|
+
"eigenfluxBin": {
|
|
11
11
|
"type": "string",
|
|
12
|
-
"description": "
|
|
13
|
-
"default": "
|
|
14
|
-
},
|
|
15
|
-
"gatewayToken": {
|
|
16
|
-
"type": "string",
|
|
17
|
-
"description": "Optional gateway token override used for Gateway RPC fallback"
|
|
12
|
+
"description": "Path to the eigenflux CLI binary",
|
|
13
|
+
"default": "eigenflux"
|
|
18
14
|
},
|
|
19
15
|
"openclawCliBin": {
|
|
20
16
|
"type": "string",
|
|
21
17
|
"description": "OpenClaw CLI binary used by runtime command fallbacks",
|
|
22
18
|
"default": "openclaw"
|
|
23
|
-
},
|
|
24
|
-
"servers": {
|
|
25
|
-
"type": "array",
|
|
26
|
-
"description": "Server list. When empty or when no server named eigenflux is provided, the plugin prepends a default eigenflux server.",
|
|
27
|
-
"default": [],
|
|
28
|
-
"items": {
|
|
29
|
-
"type": "object",
|
|
30
|
-
"additionalProperties": false,
|
|
31
|
-
"properties": {
|
|
32
|
-
"enabled": {
|
|
33
|
-
"type": "boolean",
|
|
34
|
-
"description": "Enable or disable background polling for this server",
|
|
35
|
-
"default": true
|
|
36
|
-
},
|
|
37
|
-
"name": {
|
|
38
|
-
"type": "string",
|
|
39
|
-
"description": "Server name used for routing, workdir defaults, and diagnostics",
|
|
40
|
-
"default": "eigenflux"
|
|
41
|
-
},
|
|
42
|
-
"endpoint": {
|
|
43
|
-
"type": "string",
|
|
44
|
-
"description": "EigenFlux API base URL for this server",
|
|
45
|
-
"default": "https://www.eigenflux.ai"
|
|
46
|
-
},
|
|
47
|
-
"workdir": {
|
|
48
|
-
"type": "string",
|
|
49
|
-
"description": "Directory used to store server credentials and remembered session state"
|
|
50
|
-
},
|
|
51
|
-
"pollInterval": {
|
|
52
|
-
"type": "integer",
|
|
53
|
-
"minimum": 10,
|
|
54
|
-
"maximum": 86400,
|
|
55
|
-
"description": "Feed polling interval in seconds for this server",
|
|
56
|
-
"default": 300
|
|
57
|
-
},
|
|
58
|
-
"pmPollInterval": {
|
|
59
|
-
"type": "integer",
|
|
60
|
-
"minimum": 10,
|
|
61
|
-
"maximum": 86400,
|
|
62
|
-
"description": "Private message polling interval in seconds for this server",
|
|
63
|
-
"default": 60
|
|
64
|
-
},
|
|
65
|
-
"sessionKey": {
|
|
66
|
-
"type": "string",
|
|
67
|
-
"description": "Target session key used by runtime.subagent and heartbeat fallback",
|
|
68
|
-
"default": "main"
|
|
69
|
-
},
|
|
70
|
-
"agentId": {
|
|
71
|
-
"type": "string",
|
|
72
|
-
"description": "Agent id used by Gateway agent and CLI fallbacks",
|
|
73
|
-
"default": "main"
|
|
74
|
-
},
|
|
75
|
-
"replyChannel": {
|
|
76
|
-
"type": "string",
|
|
77
|
-
"description": "Explicit reply channel used by Gateway agent and CLI fallbacks"
|
|
78
|
-
},
|
|
79
|
-
"replyTo": {
|
|
80
|
-
"type": "string",
|
|
81
|
-
"description": "Explicit reply target used by Gateway agent and CLI fallbacks"
|
|
82
|
-
},
|
|
83
|
-
"replyAccountId": {
|
|
84
|
-
"type": "string",
|
|
85
|
-
"description": "Optional reply account id for multi-account channel delivery"
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
19
|
}
|
|
90
20
|
}
|
|
91
21
|
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phronesis-io/openclaw-eigenflux",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "OpenClaw plugin for EigenFlux periodic polling delivery",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
8
|
+
"skills",
|
|
8
9
|
"index.ts",
|
|
9
10
|
"openclaw.plugin.json",
|
|
10
11
|
"README.md",
|
|
@@ -12,7 +13,8 @@
|
|
|
12
13
|
],
|
|
13
14
|
"scripts": {
|
|
14
15
|
"bump-version": "node scripts/set-version.mjs",
|
|
15
|
-
"
|
|
16
|
+
"copy-skills": "node -e \"require('fs').rmSync('skills',{recursive:true,force:true});require('fs').cpSync('../../eigenflux/skills','skills',{recursive:true})\"",
|
|
17
|
+
"build": "npm run copy-skills && node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\" && tsc && echo success",
|
|
16
18
|
"build:watch": "tsc --watch",
|
|
17
19
|
"test": "jest --runInBand",
|
|
18
20
|
"test:watch": "jest --watch"
|
|
@@ -25,20 +27,16 @@
|
|
|
25
27
|
"keywords": [
|
|
26
28
|
"openclaw",
|
|
27
29
|
"eigenflux",
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
+
"agent network",
|
|
31
|
+
"agent broadcast"
|
|
30
32
|
],
|
|
31
33
|
"author": "Phronesis",
|
|
32
34
|
"license": "MIT",
|
|
33
35
|
"publishConfig": {
|
|
34
36
|
"access": "public"
|
|
35
37
|
},
|
|
36
|
-
"dependencies": {
|
|
37
|
-
"ws": "^8.18.0"
|
|
38
|
-
},
|
|
39
38
|
"devDependencies": {
|
|
40
39
|
"@types/node": "^20.0.0",
|
|
41
|
-
"@types/ws": "^8.5.0",
|
|
42
40
|
"typescript": "^5.0.0",
|
|
43
41
|
"jest": "^29.0.0",
|
|
44
42
|
"@types/jest": "^29.0.0",
|