strray-ai 1.22.21 → 1.22.22
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/.strray/state/state.json +1 -0
- package/dist/CHANGELOG.md +8 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/openclaw/api-server.d.ts +86 -0
- package/dist/integrations/openclaw/api-server.d.ts.map +1 -0
- package/dist/integrations/openclaw/api-server.js +339 -0
- package/dist/integrations/openclaw/api-server.js.map +1 -0
- package/dist/integrations/openclaw/client.d.ts +120 -0
- package/dist/integrations/openclaw/client.d.ts.map +1 -0
- package/dist/integrations/openclaw/client.js +447 -0
- package/dist/integrations/openclaw/client.js.map +1 -0
- package/dist/integrations/openclaw/config.d.ts +97 -0
- package/dist/integrations/openclaw/config.d.ts.map +1 -0
- package/dist/integrations/openclaw/config.js +375 -0
- package/dist/integrations/openclaw/config.js.map +1 -0
- package/dist/integrations/openclaw/hooks/strray-hooks.d.ts +125 -0
- package/dist/integrations/openclaw/hooks/strray-hooks.d.ts.map +1 -0
- package/dist/integrations/openclaw/hooks/strray-hooks.js +281 -0
- package/dist/integrations/openclaw/hooks/strray-hooks.js.map +1 -0
- package/dist/integrations/openclaw/index.d.ts +102 -0
- package/dist/integrations/openclaw/index.d.ts.map +1 -0
- package/dist/integrations/openclaw/index.js +340 -0
- package/dist/integrations/openclaw/index.js.map +1 -0
- package/dist/integrations/openclaw/types.d.ts +427 -0
- package/dist/integrations/openclaw/types.d.ts.map +1 -0
- package/dist/integrations/openclaw/types.js +154 -0
- package/dist/integrations/openclaw/types.js.map +1 -0
- package/package.json +1 -1
- package/scripts/node/universal-version-manager.js +3 -3
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw WebSocket Client
|
|
3
|
+
*
|
|
4
|
+
* Implements OpenClaw Gateway Protocol v3 with proper request/response handling,
|
|
5
|
+
* reconnection logic, and event management.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @since 2026-03-14
|
|
9
|
+
*/
|
|
10
|
+
import { WebSocket } from 'ws';
|
|
11
|
+
import * as crypto from 'crypto';
|
|
12
|
+
import { isOpenClawResponse, isOpenClawEvent, OpenClawTimeoutError, OpenClawConnectionError, } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* OpenClaw WebSocket Client
|
|
15
|
+
*/
|
|
16
|
+
export class OpenClawClient {
|
|
17
|
+
ws = null;
|
|
18
|
+
config;
|
|
19
|
+
state = 'disconnected';
|
|
20
|
+
pendingRequests = new Map();
|
|
21
|
+
eventListeners = new Map();
|
|
22
|
+
stateListeners = new Set();
|
|
23
|
+
reconnectAttempts = 0;
|
|
24
|
+
reconnectTimeout = null;
|
|
25
|
+
pingInterval = null;
|
|
26
|
+
stats = {
|
|
27
|
+
messagesSent: 0,
|
|
28
|
+
messagesReceived: 0,
|
|
29
|
+
requestsSent: 0,
|
|
30
|
+
requestsSucceeded: 0,
|
|
31
|
+
requestsFailed: 0,
|
|
32
|
+
reconnects: 0,
|
|
33
|
+
errors: 0,
|
|
34
|
+
};
|
|
35
|
+
logger;
|
|
36
|
+
constructor(config) {
|
|
37
|
+
this.config = {
|
|
38
|
+
gatewayUrl: config.gatewayUrl || 'ws://127.0.0.1:18789',
|
|
39
|
+
authToken: config.authToken || '',
|
|
40
|
+
deviceId: config.deviceId || '',
|
|
41
|
+
deviceKeyPair: config.deviceKeyPair || { publicKey: '', privateKey: '' },
|
|
42
|
+
reconnect: config.reconnect ?? true,
|
|
43
|
+
reconnectAttempts: config.reconnectAttempts ?? 5,
|
|
44
|
+
reconnectDelay: config.reconnectDelay ?? 1000,
|
|
45
|
+
pingInterval: config.pingInterval ?? 30000,
|
|
46
|
+
requestTimeout: config.requestTimeout ?? 30000,
|
|
47
|
+
};
|
|
48
|
+
// Use console but can be replaced with proper logger
|
|
49
|
+
this.logger = console;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Connect to OpenClaw Gateway
|
|
53
|
+
*/
|
|
54
|
+
async connect() {
|
|
55
|
+
if (this.state === 'connected' || this.state === 'authenticating') {
|
|
56
|
+
this.logger.warn('[OpenClawClient] Already connected or connecting');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.setState('connecting');
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
try {
|
|
62
|
+
this.ws = new WebSocket(this.config.gatewayUrl);
|
|
63
|
+
this.ws.on('open', () => {
|
|
64
|
+
this.logger.info('[OpenClawClient] WebSocket connected, sending handshake...');
|
|
65
|
+
this.sendHandshake();
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
this.ws.on('message', (data) => {
|
|
69
|
+
const message = typeof data === 'string' ? data : String(data);
|
|
70
|
+
this.handleMessage(message);
|
|
71
|
+
});
|
|
72
|
+
this.ws.on('close', (code, reason) => {
|
|
73
|
+
this.logger.info(`[OpenClawClient] Connection closed: ${code} ${String(reason)}`);
|
|
74
|
+
this.handleDisconnect(Number(code), String(reason));
|
|
75
|
+
});
|
|
76
|
+
this.ws.on('error', (error) => {
|
|
77
|
+
this.logger.error('[OpenClawClient] WebSocket error:', error instanceof Error ? error.message : String(error));
|
|
78
|
+
this.stats.errors++;
|
|
79
|
+
if (this.state === 'connecting') {
|
|
80
|
+
reject(new OpenClawConnectionError(`Failed to connect to ${this.config.gatewayUrl}: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
this.ws.on('ping', () => {
|
|
84
|
+
this.logger.debug('[OpenClawClient] Received ping');
|
|
85
|
+
});
|
|
86
|
+
this.ws.on('pong', () => {
|
|
87
|
+
this.logger.debug('[OpenClawClient] Received pong');
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.setState('error');
|
|
92
|
+
reject(new OpenClawConnectionError('Failed to create WebSocket connection', error));
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Disconnect from OpenClaw Gateway
|
|
98
|
+
*/
|
|
99
|
+
disconnect() {
|
|
100
|
+
this.logger.info('[OpenClawClient] Disconnecting...');
|
|
101
|
+
// Clear reconnection
|
|
102
|
+
if (this.reconnectTimeout) {
|
|
103
|
+
clearTimeout(this.reconnectTimeout);
|
|
104
|
+
this.reconnectTimeout = null;
|
|
105
|
+
}
|
|
106
|
+
// Clear ping interval
|
|
107
|
+
if (this.pingInterval) {
|
|
108
|
+
clearInterval(this.pingInterval);
|
|
109
|
+
this.pingInterval = null;
|
|
110
|
+
}
|
|
111
|
+
// Reject pending requests
|
|
112
|
+
for (const [id, request] of this.pendingRequests.entries()) {
|
|
113
|
+
clearTimeout(request.timeout);
|
|
114
|
+
request.reject(new Error('Connection closed'));
|
|
115
|
+
this.pendingRequests.delete(id);
|
|
116
|
+
}
|
|
117
|
+
// Close WebSocket
|
|
118
|
+
if (this.ws) {
|
|
119
|
+
this.ws.removeAllListeners();
|
|
120
|
+
this.ws.close(1000, 'Client disconnecting');
|
|
121
|
+
this.ws = null;
|
|
122
|
+
}
|
|
123
|
+
this.setState('disconnected');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Send request and wait for response
|
|
127
|
+
*/
|
|
128
|
+
async sendRequest(method, params = {}) {
|
|
129
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
130
|
+
throw new Error('Not connected to OpenClaw Gateway');
|
|
131
|
+
}
|
|
132
|
+
const id = this.generateId();
|
|
133
|
+
const frame = {
|
|
134
|
+
type: 'req',
|
|
135
|
+
id,
|
|
136
|
+
method,
|
|
137
|
+
params,
|
|
138
|
+
};
|
|
139
|
+
this.logger.debug(`[OpenClawClient] Sending request: ${method} (${id})`);
|
|
140
|
+
this.stats.requestsSent++;
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
// Set timeout
|
|
143
|
+
const timeout = setTimeout(() => {
|
|
144
|
+
this.pendingRequests.delete(id);
|
|
145
|
+
this.stats.requestsFailed++;
|
|
146
|
+
reject(new OpenClawTimeoutError(method, this.config.requestTimeout));
|
|
147
|
+
}, this.config.requestTimeout);
|
|
148
|
+
// Store pending request
|
|
149
|
+
this.pendingRequests.set(id, {
|
|
150
|
+
resolve: (value) => {
|
|
151
|
+
clearTimeout(timeout);
|
|
152
|
+
this.stats.requestsSucceeded++;
|
|
153
|
+
resolve(value);
|
|
154
|
+
},
|
|
155
|
+
reject: (reason) => {
|
|
156
|
+
clearTimeout(timeout);
|
|
157
|
+
this.stats.requestsFailed++;
|
|
158
|
+
reject(reason);
|
|
159
|
+
},
|
|
160
|
+
timeout,
|
|
161
|
+
timestamp: Date.now(),
|
|
162
|
+
});
|
|
163
|
+
// Send frame
|
|
164
|
+
try {
|
|
165
|
+
this.ws.send(JSON.stringify(frame));
|
|
166
|
+
this.stats.messagesSent++;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
clearTimeout(timeout);
|
|
170
|
+
this.pendingRequests.delete(id);
|
|
171
|
+
this.stats.errors++;
|
|
172
|
+
reject(error);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Subscribe to events
|
|
178
|
+
*/
|
|
179
|
+
async subscribeToEvents(events) {
|
|
180
|
+
await this.sendRequest('events.subscribe', { events });
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get current state
|
|
184
|
+
*/
|
|
185
|
+
getState() {
|
|
186
|
+
return this.state;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if connected
|
|
190
|
+
*/
|
|
191
|
+
isConnected() {
|
|
192
|
+
return this.state === 'connected' || this.state === 'authorized';
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get statistics
|
|
196
|
+
*/
|
|
197
|
+
getStats() {
|
|
198
|
+
return { ...this.stats };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Add event listener
|
|
202
|
+
*/
|
|
203
|
+
on(event, listener) {
|
|
204
|
+
if (!this.eventListeners.has(event)) {
|
|
205
|
+
this.eventListeners.set(event, new Set());
|
|
206
|
+
}
|
|
207
|
+
this.eventListeners.get(event).add(listener);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Remove event listener
|
|
211
|
+
*/
|
|
212
|
+
off(event, listener) {
|
|
213
|
+
const listeners = this.eventListeners.get(event);
|
|
214
|
+
if (listeners) {
|
|
215
|
+
listeners.delete(listener);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Add state change listener
|
|
220
|
+
*/
|
|
221
|
+
onStateChange(listener) {
|
|
222
|
+
this.stateListeners.add(listener);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Remove state change listener
|
|
226
|
+
*/
|
|
227
|
+
offStateChange(listener) {
|
|
228
|
+
this.stateListeners.delete(listener);
|
|
229
|
+
}
|
|
230
|
+
// =========================================================================
|
|
231
|
+
// Private Methods
|
|
232
|
+
// =========================================================================
|
|
233
|
+
/**
|
|
234
|
+
* Send handshake on connect
|
|
235
|
+
*/
|
|
236
|
+
sendHandshake() {
|
|
237
|
+
const params = {
|
|
238
|
+
minProtocol: 3,
|
|
239
|
+
maxProtocol: 3,
|
|
240
|
+
client: {
|
|
241
|
+
id: 'strray-integration',
|
|
242
|
+
version: '1.0.0',
|
|
243
|
+
platform: process.platform,
|
|
244
|
+
mode: 'operator',
|
|
245
|
+
},
|
|
246
|
+
role: 'operator',
|
|
247
|
+
scopes: ['operator.read', 'operator.write'],
|
|
248
|
+
caps: [],
|
|
249
|
+
commands: [],
|
|
250
|
+
userAgent: `0xRay-OpenClaw-Integration/1.0.0`,
|
|
251
|
+
};
|
|
252
|
+
// Add auth if provided
|
|
253
|
+
if (this.config.authToken) {
|
|
254
|
+
params.auth = { token: this.config.authToken };
|
|
255
|
+
}
|
|
256
|
+
// Add device if provided
|
|
257
|
+
if (this.config.deviceId && this.config.deviceKeyPair) {
|
|
258
|
+
params.device = {
|
|
259
|
+
id: this.config.deviceId,
|
|
260
|
+
publicKey: this.config.deviceKeyPair.publicKey,
|
|
261
|
+
signature: this.signDeviceChallenge(this.config.deviceId),
|
|
262
|
+
signedAt: Date.now(),
|
|
263
|
+
nonce: this.generateNonce(),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// Send connect request
|
|
267
|
+
this.sendRequest('connect', params).catch((error) => {
|
|
268
|
+
this.logger.error('[OpenClawClient] Handshake failed:', error);
|
|
269
|
+
this.setState('error');
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Handle incoming WebSocket message
|
|
274
|
+
*/
|
|
275
|
+
handleMessage(data) {
|
|
276
|
+
this.stats.messagesReceived++;
|
|
277
|
+
try {
|
|
278
|
+
const frame = JSON.parse(data);
|
|
279
|
+
if (isOpenClawResponse(frame)) {
|
|
280
|
+
this.handleResponse(frame);
|
|
281
|
+
}
|
|
282
|
+
else if (isOpenClawEvent(frame)) {
|
|
283
|
+
this.handleEvent(frame);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
this.logger.warn('[OpenClawClient] Unknown frame type:', frame);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
this.logger.error('[OpenClawClient] Failed to parse message:', error);
|
|
291
|
+
this.stats.errors++;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Handle response frame
|
|
296
|
+
*/
|
|
297
|
+
handleResponse(frame) {
|
|
298
|
+
const pending = this.pendingRequests.get(frame.id);
|
|
299
|
+
if (pending) {
|
|
300
|
+
this.pendingRequests.delete(frame.id);
|
|
301
|
+
if (frame.ok) {
|
|
302
|
+
pending.resolve(frame.result);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
const error = new Error(frame.error?.message || 'Request failed');
|
|
306
|
+
error.code = frame.error?.code;
|
|
307
|
+
pending.reject(error);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
this.logger.warn('[OpenClawClient] Received response for unknown request:', frame.id);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Handle event frame
|
|
316
|
+
*/
|
|
317
|
+
handleEvent(frame) {
|
|
318
|
+
this.logger.debug('[OpenClawClient] Event:', frame.event);
|
|
319
|
+
// Handle specific events
|
|
320
|
+
if (frame.event === 'authorized') {
|
|
321
|
+
this.setState('authorized');
|
|
322
|
+
this.startPingInterval();
|
|
323
|
+
}
|
|
324
|
+
// Notify listeners
|
|
325
|
+
const listeners = this.eventListeners.get(frame.event);
|
|
326
|
+
if (listeners) {
|
|
327
|
+
for (const listener of listeners) {
|
|
328
|
+
try {
|
|
329
|
+
listener(frame.data);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
this.logger.error('[OpenClawClient] Event listener error:', error);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Notify all-event listeners
|
|
337
|
+
const allListeners = this.eventListeners.get('*');
|
|
338
|
+
if (allListeners) {
|
|
339
|
+
for (const listener of allListeners) {
|
|
340
|
+
try {
|
|
341
|
+
listener(frame.event, frame.data);
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
this.logger.error('[OpenClawClient] All-event listener error:', error);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Handle disconnection
|
|
351
|
+
*/
|
|
352
|
+
handleDisconnect(code, reason) {
|
|
353
|
+
// Stop ping interval
|
|
354
|
+
if (this.pingInterval) {
|
|
355
|
+
clearInterval(this.pingInterval);
|
|
356
|
+
this.pingInterval = null;
|
|
357
|
+
}
|
|
358
|
+
// Set state
|
|
359
|
+
if (this.state !== 'disconnected') {
|
|
360
|
+
this.setState('disconnected');
|
|
361
|
+
}
|
|
362
|
+
// Attempt reconnection
|
|
363
|
+
if (this.config.reconnect && this.reconnectAttempts < this.config.reconnectAttempts) {
|
|
364
|
+
this.scheduleReconnect();
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Schedule reconnection
|
|
369
|
+
*/
|
|
370
|
+
scheduleReconnect() {
|
|
371
|
+
if (this.reconnectTimeout) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
this.reconnectAttempts++;
|
|
375
|
+
this.stats.reconnects++;
|
|
376
|
+
const delay = this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
377
|
+
const maxDelay = 30000;
|
|
378
|
+
const actualDelay = Math.min(delay, maxDelay);
|
|
379
|
+
this.logger.info(`[OpenClawClient] Scheduling reconnect attempt ${this.reconnectAttempts}/${this.config.reconnectAttempts} in ${actualDelay}ms`);
|
|
380
|
+
this.setState('reconnecting');
|
|
381
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
382
|
+
this.reconnectTimeout = null;
|
|
383
|
+
this.connect().catch((error) => {
|
|
384
|
+
this.logger.error('[OpenClawClient] Reconnection failed:', error);
|
|
385
|
+
});
|
|
386
|
+
}, actualDelay);
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Start ping interval for connection health
|
|
390
|
+
*/
|
|
391
|
+
startPingInterval() {
|
|
392
|
+
this.pingInterval = setInterval(() => {
|
|
393
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
394
|
+
this.ws.ping();
|
|
395
|
+
}
|
|
396
|
+
}, this.config.pingInterval);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Set client state
|
|
400
|
+
*/
|
|
401
|
+
setState(newState) {
|
|
402
|
+
const previousState = this.state;
|
|
403
|
+
this.state = newState;
|
|
404
|
+
if (previousState !== newState) {
|
|
405
|
+
this.logger.info(`[OpenClawClient] State: ${previousState} → ${newState}`);
|
|
406
|
+
// Notify state listeners
|
|
407
|
+
for (const listener of this.stateListeners) {
|
|
408
|
+
try {
|
|
409
|
+
listener(newState, previousState);
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
this.logger.error('[OpenClawClient] State listener error:', error);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Generate unique ID for requests
|
|
419
|
+
*/
|
|
420
|
+
generateId() {
|
|
421
|
+
return `${Date.now()}-${crypto.randomBytes(4).toString('hex')}`;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Generate nonce for device pairing
|
|
425
|
+
*/
|
|
426
|
+
generateNonce() {
|
|
427
|
+
return crypto.randomBytes(16).toString('base64');
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Sign device challenge
|
|
431
|
+
*/
|
|
432
|
+
signDeviceChallenge(deviceId) {
|
|
433
|
+
if (!this.config.deviceKeyPair) {
|
|
434
|
+
return '';
|
|
435
|
+
}
|
|
436
|
+
const hmac = crypto.createHmac('sha256', this.config.deviceKeyPair.privateKey);
|
|
437
|
+
hmac.update(deviceId);
|
|
438
|
+
return hmac.digest('base64');
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Factory function to create client
|
|
443
|
+
*/
|
|
444
|
+
export function createOpenClawClient(config) {
|
|
445
|
+
return new OpenClawClient(config);
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/integrations/openclaw/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Handles loading, validation, and management of OpenClaw integration configuration.
|
|
5
|
+
*
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
* @since 2026-03-14
|
|
8
|
+
*/
|
|
9
|
+
import { OpenClawIntegrationConfig, ConfigValidationResult } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration loader class
|
|
12
|
+
*/
|
|
13
|
+
export declare class OpenClawConfigLoader {
|
|
14
|
+
private config;
|
|
15
|
+
private configPath;
|
|
16
|
+
private loadedAt;
|
|
17
|
+
constructor(configPath?: string);
|
|
18
|
+
/**
|
|
19
|
+
* Load configuration from file with environment variable overrides
|
|
20
|
+
*/
|
|
21
|
+
load(): OpenClawIntegrationConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Reload configuration from file
|
|
24
|
+
*/
|
|
25
|
+
reload(): OpenClawIntegrationConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Get current configuration
|
|
28
|
+
*/
|
|
29
|
+
getConfig(): OpenClawIntegrationConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Get configuration age in milliseconds
|
|
32
|
+
*/
|
|
33
|
+
getConfigAge(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Check if configuration needs reload
|
|
36
|
+
*/
|
|
37
|
+
needsReload(maxAgeMs?: number): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Apply environment variable overrides
|
|
40
|
+
*/
|
|
41
|
+
private applyEnvironmentOverrides;
|
|
42
|
+
/**
|
|
43
|
+
* Merge user config with defaults
|
|
44
|
+
*/
|
|
45
|
+
private mergeWithDefaults;
|
|
46
|
+
/**
|
|
47
|
+
* Validate configuration
|
|
48
|
+
*/
|
|
49
|
+
validateConfig(config: OpenClawIntegrationConfig): ConfigValidationResult;
|
|
50
|
+
/**
|
|
51
|
+
* Get configuration file path
|
|
52
|
+
*/
|
|
53
|
+
getConfigPath(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Check if configuration file exists
|
|
56
|
+
*/
|
|
57
|
+
configExists(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Create sample configuration file
|
|
60
|
+
*/
|
|
61
|
+
createSampleConfig(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get config for API server only
|
|
64
|
+
*/
|
|
65
|
+
getAPIServerConfig(): {
|
|
66
|
+
enabled: boolean;
|
|
67
|
+
port: number;
|
|
68
|
+
host?: string;
|
|
69
|
+
apiKey?: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Get config for hooks only
|
|
73
|
+
*/
|
|
74
|
+
getHooksConfig(): {
|
|
75
|
+
enabled: boolean;
|
|
76
|
+
toolBefore: boolean;
|
|
77
|
+
toolAfter: boolean;
|
|
78
|
+
includeArgs: boolean;
|
|
79
|
+
includeResult: boolean;
|
|
80
|
+
toolFilter?: string[];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Check if integration is enabled
|
|
84
|
+
*/
|
|
85
|
+
isEnabled(): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Check if API server is enabled
|
|
88
|
+
*/
|
|
89
|
+
isAPIServerEnabled(): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Check if hooks are enabled
|
|
92
|
+
*/
|
|
93
|
+
areHooksEnabled(): boolean;
|
|
94
|
+
}
|
|
95
|
+
export declare const configLoader: OpenClawConfigLoader;
|
|
96
|
+
export declare function createConfigLoader(configPath?: string): OpenClawConfigLoader;
|
|
97
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/integrations/openclaw/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AAwCpB;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAa;gBAEjB,UAAU,CAAC,EAAE,MAAM;IAK/B;;OAEG;IACH,IAAI,IAAI,yBAAyB;IAoCjC;;OAEG;IACH,MAAM,IAAI,yBAAyB;IAMnC;;OAEG;IACH,SAAS,IAAI,yBAAyB;IAOtC;;OAEG;IACH,YAAY,IAAI,MAAM;IAKtB;;OAEG;IACH,WAAW,CAAC,QAAQ,GAAE,MAAc,GAAG,OAAO;IAI9C;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2CjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqCzB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,yBAAyB,GAAG,sBAAsB;IAkGzE;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IA0C1B;;OAEG;IACH,kBAAkB;;;;;;IAKlB;;OAEG;IACH,cAAc;;;;;;;;IAKd;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,eAAe,IAAI,OAAO;CAI3B;AAGD,eAAO,MAAM,YAAY,sBAA6B,CAAC;AAGvD,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAE5E"}
|