@openclaw-caribbean/agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,165 @@
1
+ import { writeFileSync, readFileSync, existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ export class OpenClawConfigFixer {
4
+ configPath;
5
+ constructor() {
6
+ this.configPath = join(process.env.HOME || '', '.openclaw', 'openclaw.json');
7
+ }
8
+ fixIssues(warnings, troubles) {
9
+ if (!existsSync(this.configPath)) {
10
+ return {
11
+ success: false,
12
+ message: 'Configuration file not found',
13
+ warningsFixed: 0,
14
+ troublesFixed: 0
15
+ };
16
+ }
17
+ let config;
18
+ try {
19
+ config = JSON.parse(readFileSync(this.configPath, 'utf-8'));
20
+ }
21
+ catch (error) {
22
+ return {
23
+ success: false,
24
+ message: `Failed to parse configuration: ${error instanceof Error ? error.message : String(error)}`,
25
+ warningsFixed: 0,
26
+ troublesFixed: 0
27
+ };
28
+ }
29
+ let warningsFixed = 0;
30
+ let troublesFixed = 0;
31
+ for (const warning of warnings) {
32
+ if (this.fixWarning(warning, config)) {
33
+ warningsFixed++;
34
+ }
35
+ }
36
+ for (const trouble of troubles) {
37
+ if (this.fixTrouble(trouble, config)) {
38
+ troublesFixed++;
39
+ }
40
+ }
41
+ try {
42
+ writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
43
+ return {
44
+ success: true,
45
+ message: `Configuration updated: ${warningsFixed} warnings fixed, ${troublesFixed} troubles fixed`,
46
+ warningsFixed,
47
+ troublesFixed
48
+ };
49
+ }
50
+ catch (error) {
51
+ return {
52
+ success: false,
53
+ message: `Failed to write configuration: ${error instanceof Error ? error.message : String(error)}`,
54
+ warningsFixed,
55
+ troublesFixed
56
+ };
57
+ }
58
+ }
59
+ fixWarning(warning, config) {
60
+ let fixed = false;
61
+ switch (warning.type) {
62
+ case 'telegram_group_policy':
63
+ if (!config.channels) {
64
+ config.channels = {};
65
+ }
66
+ if (!config.channels.telegram) {
67
+ config.channels.telegram = {};
68
+ }
69
+ if (config.channels.telegram.groupPolicy === 'allowlist' &&
70
+ (!config.channels.telegram.groupAllowFrom || config.channels.telegram.groupAllowFrom.length === 0)) {
71
+ config.channels.telegram.groupPolicy = 'open';
72
+ fixed = true;
73
+ }
74
+ break;
75
+ case 'no_skills':
76
+ if (!config.skills || config.skills.length === 0) {
77
+ config.skills = ['shell', 'github', 'tmux', 'browser'];
78
+ fixed = true;
79
+ }
80
+ break;
81
+ case 'no_agents':
82
+ if (!config.agents) {
83
+ config.agents = {};
84
+ }
85
+ if (!config.agents.list || config.agents.list.length === 0) {
86
+ config.agents.list = ['reef', 'navigator', 'shell'];
87
+ fixed = true;
88
+ }
89
+ break;
90
+ }
91
+ return fixed;
92
+ }
93
+ fixTrouble(trouble, config) {
94
+ let fixed = false;
95
+ switch (trouble.type) {
96
+ case 'gateway_port_missing':
97
+ if (!config.gateway) {
98
+ config.gateway = {};
99
+ }
100
+ if (!config.gateway.port) {
101
+ config.gateway.port = 8000;
102
+ fixed = true;
103
+ }
104
+ break;
105
+ case 'auth_missing':
106
+ if (!config.apiKey) {
107
+ config.apiKey = this.generateApiKey();
108
+ fixed = true;
109
+ }
110
+ break;
111
+ }
112
+ return fixed;
113
+ }
114
+ generateApiKey() {
115
+ return `api_key_${Math.random().toString(36).substring(2, 15)}${Math.random().toString(36).substring(2, 15)}`;
116
+ }
117
+ validateConfig() {
118
+ const errors = [];
119
+ if (!existsSync(this.configPath)) {
120
+ errors.push('Configuration file does not exist');
121
+ return { valid: false, errors };
122
+ }
123
+ try {
124
+ const config = JSON.parse(readFileSync(this.configPath, 'utf-8'));
125
+ if (!config.gateway) {
126
+ errors.push('Missing gateway configuration');
127
+ }
128
+ else {
129
+ if (typeof config.gateway.port !== 'number') {
130
+ errors.push('Gateway port must be a number');
131
+ }
132
+ if (config.gateway.port < 1 || config.gateway.port > 65535) {
133
+ errors.push('Gateway port must be between 1 and 65535');
134
+ }
135
+ }
136
+ if (!config.agents) {
137
+ errors.push('Missing agents configuration');
138
+ }
139
+ else {
140
+ if (!Array.isArray(config.agents.list)) {
141
+ errors.push('Agents list must be an array');
142
+ }
143
+ }
144
+ if (!config.skills || !Array.isArray(config.skills)) {
145
+ errors.push('Skills must be an array');
146
+ }
147
+ }
148
+ catch (error) {
149
+ errors.push(`Configuration parse error: ${error instanceof Error ? error.message : String(error)}`);
150
+ }
151
+ return {
152
+ valid: errors.length === 0,
153
+ errors
154
+ };
155
+ }
156
+ backupConfig() {
157
+ const backupPath = `${this.configPath}.backup`;
158
+ if (existsSync(this.configPath)) {
159
+ const content = readFileSync(this.configPath, 'utf-8');
160
+ writeFileSync(backupPath, content, 'utf-8');
161
+ }
162
+ return backupPath;
163
+ }
164
+ }
165
+ //# sourceMappingURL=config-fixer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-fixer.js","sourceRoot":"","sources":["../src/config-fixer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface AgentConfig {
2
+ server: {
3
+ url: string;
4
+ reconnectInterval?: number;
5
+ heartbeatInterval?: number;
6
+ };
7
+ node: {
8
+ id?: string;
9
+ name: string;
10
+ tags?: string[];
11
+ };
12
+ openclaw?: {
13
+ configPath?: string;
14
+ apiPort?: number;
15
+ };
16
+ auth?: {
17
+ token?: string;
18
+ };
19
+ }
20
+ export declare class Agent {
21
+ private wsClient;
22
+ private collector;
23
+ private nodeId;
24
+ constructor(config: AgentConfig, debug?: boolean);
25
+ start(): Promise<void>;
26
+ stop(): void;
27
+ getNodeId(): string;
28
+ }
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,IAAI,EAAE;QACJ,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,IAAI,CAAC,EAAE;QACL,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,OAAe;IAoBjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,IAAI,IAAI,IAAI;IAKZ,SAAS,IAAI,MAAM;CAGpB"}
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { WebSocketClient } from './websocket.js';
3
+ import { StatusCollector } from './collector.js';
4
+ export class Agent {
5
+ wsClient;
6
+ collector;
7
+ nodeId;
8
+ constructor(config, debug = false) {
9
+ this.nodeId = config.node.id || randomUUID();
10
+ this.collector = new StatusCollector();
11
+ this.wsClient = new WebSocketClient({
12
+ url: config.server.url,
13
+ reconnectInterval: config.server.reconnectInterval,
14
+ heartbeatInterval: config.server.heartbeatInterval,
15
+ nodeId: this.nodeId,
16
+ name: config.node.name,
17
+ tags: config.node.tags || [],
18
+ version: '0.1.0',
19
+ authToken: config.auth?.token
20
+ }, () => this.collector.collect(), debug);
21
+ }
22
+ async start() {
23
+ if (this.wsClient['debug']) {
24
+ console.log('[Agent] [DEBUG] ===== Starting Caribbean Agent =====');
25
+ console.log('[Agent] [DEBUG] Node ID:', this.nodeId);
26
+ console.log('[Agent] [DEBUG] Agent version: 0.1.0');
27
+ }
28
+ console.log(`[Agent] Starting node ${this.nodeId}`);
29
+ if (this.wsClient['debug']) {
30
+ console.log('[Agent] [DEBUG] Initiating WebSocket connection...');
31
+ }
32
+ this.wsClient.connect();
33
+ }
34
+ stop() {
35
+ console.log('[Agent] Stopping');
36
+ this.wsClient.disconnect();
37
+ }
38
+ getNodeId() {
39
+ return this.nodeId;
40
+ }
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAsBjD,MAAM,OAAO,KAAK;IACR,QAAQ,CAAkB;IAC1B,SAAS,CAAkB;IAC3B,MAAM,CAAS;IAEvB,YAAY,MAAmB,EAAE,QAAiB,KAAK;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QAEvC,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CACjC;YACE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;YACtB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB;YAClD,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB;YAClD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;YAC5B,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK;SAC9B,EACD,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAC9B,KAAK,CACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { NodeStatus } from '@openclaw-caribbean/shared';
2
+ export interface WebSocketClientConfig {
3
+ url: string;
4
+ reconnectInterval?: number;
5
+ heartbeatInterval?: number;
6
+ nodeId: string;
7
+ name: string;
8
+ tags: string[];
9
+ version: string;
10
+ authToken?: string;
11
+ }
12
+ export declare class WebSocketClient {
13
+ private ws;
14
+ private config;
15
+ private heartbeatTimer;
16
+ private reconnectTimer;
17
+ private statusCollector;
18
+ private debug;
19
+ constructor(config: WebSocketClientConfig, statusCollector: () => NodeStatus, debug?: boolean);
20
+ private debugLog;
21
+ connect(): void;
22
+ disconnect(): void;
23
+ private sendConnect;
24
+ private startHeartbeat;
25
+ private sendHeartbeat;
26
+ private sendImmediateHeartbeat;
27
+ private stopHeartbeat;
28
+ private scheduleReconnect;
29
+ private stopReconnect;
30
+ private send;
31
+ private getLocalIp;
32
+ private getReadyStateName;
33
+ private getCloseCodeMeaning;
34
+ private handleMessage;
35
+ private handleCommand;
36
+ private executeCommand;
37
+ }
38
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAK7D,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,KAAK,CAAU;gBAGrB,MAAM,EAAE,qBAAqB,EAC7B,eAAe,EAAE,MAAM,UAAU,EACjC,KAAK,GAAE,OAAe;IAgBxB,OAAO,CAAC,QAAQ;IAMhB,OAAO,IAAI,IAAI;IAwEf,UAAU,IAAI,IAAI;IASlB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,mBAAmB;IAuB3B,OAAO,CAAC,aAAa;YAgCP,aAAa;YAiCb,cAAc;CAuC7B"}
@@ -0,0 +1,324 @@
1
+ import WebSocket from 'ws';
2
+ import { execSync } from 'child_process';
3
+ import os from 'os';
4
+ import { readFileSync, existsSync } from 'fs';
5
+ import { join } from 'path';
6
+ export class WebSocketClient {
7
+ ws = null;
8
+ config;
9
+ heartbeatTimer = null;
10
+ reconnectTimer = null;
11
+ statusCollector;
12
+ debug;
13
+ constructor(config, statusCollector, debug = false) {
14
+ this.config = {
15
+ url: config.url,
16
+ reconnectInterval: config.reconnectInterval || 5000,
17
+ heartbeatInterval: config.heartbeatInterval || 30000,
18
+ nodeId: config.nodeId,
19
+ name: config.name,
20
+ tags: config.tags || [],
21
+ version: config.version || '0.1.0',
22
+ authToken: config.authToken || ''
23
+ };
24
+ this.statusCollector = statusCollector;
25
+ this.debug = debug;
26
+ }
27
+ debugLog(...args) {
28
+ if (this.debug) {
29
+ console.log('[Agent] [DEBUG]', ...args);
30
+ }
31
+ }
32
+ connect() {
33
+ this.debugLog('===== Starting WebSocket Connection =====');
34
+ this.debugLog('Target URL:', this.config.url);
35
+ this.debugLog('Node ID:', this.config.nodeId);
36
+ this.debugLog('Node Name:', this.config.name);
37
+ this.debugLog('Node Tags:', this.config.tags);
38
+ this.debugLog('Version:', this.config.version);
39
+ this.debugLog('Reconnect Interval:', this.config.reconnectInterval, 'ms');
40
+ this.debugLog('Heartbeat Interval:', this.config.heartbeatInterval, 'ms');
41
+ this.debugLog('Auth Token:', this.config.authToken ? '***' + this.config.authToken.slice(-4) : 'None');
42
+ this.debugLog('Local IP:', this.getLocalIp());
43
+ this.disconnect();
44
+ const headers = {};
45
+ if (this.config.authToken) {
46
+ headers['Authorization'] = `Bearer ${this.config.authToken}`;
47
+ }
48
+ this.debugLog('Request Headers:', JSON.stringify(headers, null, 2));
49
+ const url = this.config.url;
50
+ this.debugLog('Creating WebSocket instance...');
51
+ this.ws = new WebSocket(url, { headers });
52
+ this.debugLog('WebSocket instance created, readyState:', this.getReadyStateName(this.ws.readyState));
53
+ this.ws.on('open', () => {
54
+ this.debugLog('===== WebSocket OPEN Event =====');
55
+ this.debugLog('Connection established successfully');
56
+ this.debugLog('Connected to:', this.config.url);
57
+ this.debugLog('Current readyState:', this.getReadyStateName(this.ws?.readyState || 0));
58
+ this.sendConnect();
59
+ this.startHeartbeat();
60
+ this.sendImmediateHeartbeat();
61
+ });
62
+ this.ws.on('message', (data) => {
63
+ this.debugLog('===== WebSocket MESSAGE Event =====');
64
+ this.debugLog('Message size:', data.length, 'bytes');
65
+ this.debugLog('Raw message:', data.toString());
66
+ try {
67
+ const message = JSON.parse(data.toString());
68
+ this.debugLog('Parsed message type:', message.type);
69
+ this.debugLog('Parsed message timestamp:', message.timestamp);
70
+ this.handleMessage(message);
71
+ }
72
+ catch (error) {
73
+ console.error('[Agent] [DEBUG] Failed to parse message');
74
+ console.error('[Agent] [DEBUG] Parse error:', error);
75
+ }
76
+ });
77
+ this.ws.on('error', (error) => {
78
+ this.debugLog('===== WebSocket ERROR Event =====');
79
+ this.debugLog('Error type:', error.name);
80
+ this.debugLog('Error message:', error.message);
81
+ this.debugLog('Error stack:', error.stack);
82
+ this.debugLog('Current readyState:', this.getReadyStateName(this.ws?.readyState || 0));
83
+ this.debugLog('WebSocket URL:', this.config.url);
84
+ });
85
+ this.ws.on('close', (code, reason) => {
86
+ this.debugLog('===== WebSocket CLOSE Event =====');
87
+ this.debugLog('Close code:', code);
88
+ this.debugLog('Close reason:', reason.toString());
89
+ this.debugLog('Close code meaning:', this.getCloseCodeMeaning(code));
90
+ this.debugLog('Current readyState:', this.getReadyStateName(this.ws?.readyState || 0));
91
+ console.log('[Agent] Disconnected');
92
+ this.stopHeartbeat();
93
+ this.scheduleReconnect();
94
+ });
95
+ }
96
+ disconnect() {
97
+ if (this.ws) {
98
+ this.ws.close();
99
+ this.ws = null;
100
+ }
101
+ this.stopHeartbeat();
102
+ this.stopReconnect();
103
+ }
104
+ sendConnect() {
105
+ this.debugLog('===== Sending CONNECT Message =====');
106
+ const message = {
107
+ type: 'connect',
108
+ timestamp: new Date().toISOString(),
109
+ payload: {
110
+ nodeId: this.config.nodeId,
111
+ name: this.config.name,
112
+ tags: this.config.tags,
113
+ version: this.config.version,
114
+ clientIp: this.getLocalIp()
115
+ }
116
+ };
117
+ this.debugLog('Connect message:', JSON.stringify(message, null, 2));
118
+ this.send(message);
119
+ this.debugLog('Connect message sent');
120
+ }
121
+ startHeartbeat() {
122
+ this.heartbeatTimer = setInterval(() => {
123
+ this.sendHeartbeat();
124
+ }, this.config.heartbeatInterval);
125
+ }
126
+ sendHeartbeat() {
127
+ this.debugLog('===== Sending HEARTBEAT Message =====');
128
+ const message = {
129
+ type: 'heartbeat',
130
+ timestamp: new Date().toISOString(),
131
+ payload: {
132
+ nodeId: this.config.nodeId,
133
+ timestamp: new Date().toISOString(),
134
+ status: this.statusCollector()
135
+ }
136
+ };
137
+ this.debugLog('Heartbeat message:', JSON.stringify(message, null, 2));
138
+ this.send(message);
139
+ this.debugLog('Heartbeat message sent');
140
+ }
141
+ sendImmediateHeartbeat() {
142
+ console.log('[Agent] Sending immediate heartbeat with openclaw status check');
143
+ this.sendHeartbeat();
144
+ }
145
+ stopHeartbeat() {
146
+ if (this.heartbeatTimer) {
147
+ clearInterval(this.heartbeatTimer);
148
+ this.heartbeatTimer = null;
149
+ }
150
+ }
151
+ scheduleReconnect() {
152
+ this.debugLog('===== Scheduling Reconnection =====');
153
+ this.debugLog('Reconnect interval:', this.config.reconnectInterval, 'ms');
154
+ this.debugLog('Will reconnect to:', this.config.url);
155
+ this.stopReconnect();
156
+ this.reconnectTimer = setTimeout(() => {
157
+ console.log('[Agent] Attempting to reconnect...');
158
+ this.connect();
159
+ }, this.config.reconnectInterval);
160
+ this.debugLog('Reconnect timer set');
161
+ }
162
+ stopReconnect() {
163
+ if (this.reconnectTimer) {
164
+ clearTimeout(this.reconnectTimer);
165
+ this.reconnectTimer = null;
166
+ }
167
+ }
168
+ send(message) {
169
+ const readyState = this.ws?.readyState;
170
+ const readyStateName = this.getReadyStateName(readyState || 0);
171
+ this.debugLog('===== Sending Message =====');
172
+ this.debugLog('Current readyState:', readyStateName);
173
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
174
+ const messageStr = JSON.stringify(message);
175
+ this.debugLog('Message length:', messageStr.length, 'bytes');
176
+ this.ws.send(messageStr);
177
+ this.debugLog('Message sent successfully');
178
+ }
179
+ else {
180
+ this.debugLog('Cannot send message - WebSocket not OPEN');
181
+ }
182
+ }
183
+ getLocalIp() {
184
+ const interfaces = os.networkInterfaces();
185
+ for (const name in interfaces) {
186
+ const iface = interfaces[name];
187
+ if (!iface)
188
+ continue;
189
+ for (const alias of iface) {
190
+ if (alias.family === 'IPv4' && !alias.internal) {
191
+ return alias.address;
192
+ }
193
+ }
194
+ }
195
+ return '127.0.0.1';
196
+ }
197
+ getReadyStateName(state) {
198
+ const states = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];
199
+ return states[state] || `UNKNOWN(${state})`;
200
+ }
201
+ getCloseCodeMeaning(code) {
202
+ const codes = {
203
+ 1000: 'Normal Closure',
204
+ 1001: 'Going Away',
205
+ 1002: 'Protocol Error',
206
+ 1003: 'Unsupported Data',
207
+ 1004: '(Reserved)',
208
+ 1005: 'No Status Received',
209
+ 1006: 'Abnormal Closure',
210
+ 1007: 'Invalid frame payload data',
211
+ 1008: 'Policy Violation',
212
+ 1009: 'Message Too Big',
213
+ 1010: 'Missing Extension',
214
+ 1011: 'Internal Error',
215
+ 1012: 'Service Restart',
216
+ 1013: 'Try Again Later',
217
+ 1014: 'Bad Gateway',
218
+ 1015: 'TLS Handshake',
219
+ 4000: 'Unknown'
220
+ };
221
+ return codes[code] || `Unknown code ${code}`;
222
+ }
223
+ handleMessage(message) {
224
+ this.debugLog('===== Handling Received Message =====');
225
+ this.debugLog('Message type:', message.type);
226
+ this.debugLog('Message timestamp:', message.timestamp);
227
+ switch (message.type) {
228
+ case 'heartbeat':
229
+ case 'connect':
230
+ case 'connected':
231
+ case 'disconnect':
232
+ this.debugLog('Message payload:', JSON.stringify(message.payload, null, 2));
233
+ break;
234
+ case 'command':
235
+ this.debugLog('Command ID:', message.id);
236
+ this.debugLog('Command action:', message.action);
237
+ this.debugLog('Command params:', JSON.stringify(message.params, null, 2));
238
+ this.debugLog('Processing command message');
239
+ this.handleCommand(message);
240
+ break;
241
+ case 'ack':
242
+ this.debugLog('===== ACK Message Received =====');
243
+ this.debugLog('ACK ID:', message.id);
244
+ this.debugLog('ACK Success:', message.success);
245
+ if (!message.success && message.error) {
246
+ this.debugLog('ACK Error:', message.error);
247
+ }
248
+ break;
249
+ default:
250
+ this.debugLog('Unknown message type:', message.type);
251
+ }
252
+ }
253
+ async handleCommand(message) {
254
+ this.debugLog('===== Executing Command =====');
255
+ this.debugLog('Command ID:', message.id);
256
+ this.debugLog('Command action:', message.action);
257
+ this.debugLog('Command params:', JSON.stringify(message.params, null, 2));
258
+ this.debugLog('Command timestamp:', message.timestamp);
259
+ try {
260
+ const result = await this.executeCommand(message.action, message.params);
261
+ this.debugLog('Command executed successfully, sending result');
262
+ const resultMessage = {
263
+ type: 'result',
264
+ timestamp: new Date().toISOString(),
265
+ id: message.id,
266
+ success: true,
267
+ data: result
268
+ };
269
+ this.send(resultMessage);
270
+ }
271
+ catch (error) {
272
+ this.debugLog('Command execution failed, sending error result');
273
+ this.debugLog('Execution error:', error);
274
+ const resultMessage = {
275
+ type: 'result',
276
+ timestamp: new Date().toISOString(),
277
+ id: message.id,
278
+ success: false,
279
+ error: error instanceof Error ? error.message : 'Unknown error'
280
+ };
281
+ this.send(resultMessage);
282
+ }
283
+ }
284
+ async executeCommand(action, params) {
285
+ switch (action) {
286
+ case 'restart_agent':
287
+ console.log('[Agent] Restarting agent:', params);
288
+ return { message: 'Restart command received' };
289
+ case 'update_config':
290
+ console.log('[Agent] Updating config:', params);
291
+ return { message: 'Update config command received' };
292
+ case 'openclaw_gateway_start':
293
+ console.log('[Agent] Starting OpenClaw gateway...');
294
+ execSync('openclaw gateway start', { timeout: 30000 });
295
+ console.log('[Agent] OpenClaw gateway started successfully');
296
+ this.sendHeartbeat();
297
+ return { message: 'Gateway started successfully' };
298
+ case 'openclaw_gateway_stop':
299
+ console.log('[Agent] Stopping OpenClaw gateway...');
300
+ execSync('openclaw gateway stop', { timeout: 30000 });
301
+ console.log('[Agent] OpenClaw gateway stopped successfully');
302
+ this.sendHeartbeat();
303
+ return { message: 'Gateway stopped successfully' };
304
+ case 'read_config':
305
+ console.log('[Agent] Reading openclaw.json config...');
306
+ const configPath = join(process.env.HOME || '', '.openclaw', 'openclaw.json');
307
+ if (!existsSync(configPath)) {
308
+ throw new Error('Config file not found');
309
+ }
310
+ const configContent = readFileSync(configPath, 'utf-8');
311
+ const config = JSON.parse(configContent);
312
+ console.log('[Agent] Config read successfully');
313
+ return { config };
314
+ case 'read_logs':
315
+ console.log('[Agent] Reading openclaw logs...');
316
+ const logs = execSync('openclaw logs | tail -n 20', { encoding: 'utf-8', timeout: 5000 });
317
+ console.log('[Agent] Logs read successfully');
318
+ return { logs: logs.trim() };
319
+ default:
320
+ throw new Error(`Unknown command: ${action}`);
321
+ }
322
+ }
323
+ }
324
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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"}