@openclaw-caribbean/server 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.
- package/dist/api.d.ts +43 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +354 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +8 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +15 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +242 -0
- package/dist/cli.js.map +1 -0
- package/dist/database.d.ts +34 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +236 -0
- package/dist/database.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/node-manager.d.ts +16 -0
- package/dist/node-manager.d.ts.map +1 -0
- package/dist/node-manager.js +70 -0
- package/dist/node-manager.js.map +1 -0
- package/dist/web/android-chrome-192x192.png +0 -0
- package/dist/web/android-chrome-512x512.png +0 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/index-BeNjTVfM.css +1 -0
- package/dist/web/assets/index-nlzc5Vy-.js +217 -0
- package/dist/web/favicon-16x16.png +0 -0
- package/dist/web/favicon-32x32.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/img/caribbean-logo.png +0 -0
- package/dist/web/img/openclaw-logo.svg +60 -0
- package/dist/web/index.html +18 -0
- package/dist/web/site.webmanifest +11 -0
- package/dist/websocket-hub.d.ts +37 -0
- package/dist/websocket-hub.d.ts.map +1 -0
- package/dist/websocket-hub.js +218 -0
- package/dist/websocket-hub.js.map +1 -0
- package/package.json +42 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { CaribbeanServer } from './index.js';
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
5
|
+
import { join, dirname } from 'path';
|
|
6
|
+
import { homedir } from 'os';
|
|
7
|
+
import { readPid, removePid, processExists, spawnDaemon, stopDaemon, } from '@openclaw-caribbean/shared';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
const CONFIG_PATH = join(homedir(), '.caribbean', 'server.json');
|
|
10
|
+
const PID_PATH = join(homedir(), '.caribbean', 'server.pid');
|
|
11
|
+
const LOG_PATH = join(homedir(), '.caribbean', 'server.log');
|
|
12
|
+
program
|
|
13
|
+
.name('caribbean-server')
|
|
14
|
+
.description('Caribbean Server - Cluster management hub')
|
|
15
|
+
.version('0.1.0');
|
|
16
|
+
program
|
|
17
|
+
.command('init')
|
|
18
|
+
.description('Initialize server configuration')
|
|
19
|
+
.option('--port <number>', 'WebSocket port', '8080')
|
|
20
|
+
.option('--token <token>', 'Authentication token')
|
|
21
|
+
.action((options) => {
|
|
22
|
+
const config = {
|
|
23
|
+
websocket: {
|
|
24
|
+
port: parseInt(options.port, 10),
|
|
25
|
+
path: '/ws/agent',
|
|
26
|
+
maxConnections: 1000
|
|
27
|
+
},
|
|
28
|
+
api: {
|
|
29
|
+
port: 3000,
|
|
30
|
+
host: '0.0.0.0',
|
|
31
|
+
webDistPath: join(process.cwd(), 'dist/web')
|
|
32
|
+
},
|
|
33
|
+
database: {
|
|
34
|
+
type: 'sqlite',
|
|
35
|
+
path: './data/caribbean.db'
|
|
36
|
+
},
|
|
37
|
+
auth: {
|
|
38
|
+
enabled: !!options.token,
|
|
39
|
+
tokens: options.token ? [options.token] : [],
|
|
40
|
+
user: undefined,
|
|
41
|
+
jwtSecret: undefined
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const configDir = dirname(CONFIG_PATH);
|
|
45
|
+
if (!existsSync(configDir)) {
|
|
46
|
+
mkdirSync(configDir, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
49
|
+
console.log(`\n✓ Server configuration created at ${CONFIG_PATH}`);
|
|
50
|
+
console.log(`\nConfiguration:`);
|
|
51
|
+
console.log(` WebSocket Port: ${config.websocket.port}`);
|
|
52
|
+
console.log(` API Port: ${config.api.port}`);
|
|
53
|
+
console.log(` Web UI: http://localhost:${config.api.port}`);
|
|
54
|
+
console.log(` Auth Enabled: ${config.auth.enabled}`);
|
|
55
|
+
console.log(`\nNext steps:`);
|
|
56
|
+
console.log(` caribbean-server start`);
|
|
57
|
+
});
|
|
58
|
+
program
|
|
59
|
+
.command('start')
|
|
60
|
+
.description('Start the server')
|
|
61
|
+
.option('--config <path>', 'Config file path', CONFIG_PATH)
|
|
62
|
+
.option('--port <number>', 'Override WebSocket port')
|
|
63
|
+
.option('--foreground', 'Run in foreground')
|
|
64
|
+
.action(async (options) => {
|
|
65
|
+
const configPath = options.config;
|
|
66
|
+
if (!options.foreground) {
|
|
67
|
+
const existingPid = readPid(PID_PATH);
|
|
68
|
+
if (existingPid && processExists(existingPid)) {
|
|
69
|
+
console.error(`Server is already running (PID: ${existingPid})`);
|
|
70
|
+
console.error('Use `caribbean-server stop` to stop it first.');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
if (existingPid)
|
|
74
|
+
removePid(PID_PATH);
|
|
75
|
+
const args = [process.argv[1], 'start', '--foreground'];
|
|
76
|
+
if (configPath !== CONFIG_PATH)
|
|
77
|
+
args.push('--config', configPath);
|
|
78
|
+
if (options.port)
|
|
79
|
+
args.push('--port', options.port);
|
|
80
|
+
const pid = spawnDaemon({
|
|
81
|
+
pidPath: PID_PATH,
|
|
82
|
+
logPath: LOG_PATH,
|
|
83
|
+
spawnArgs: args,
|
|
84
|
+
});
|
|
85
|
+
console.log(`Server started in background (PID: ${pid})`);
|
|
86
|
+
console.log(`Log file: ${LOG_PATH}`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let config;
|
|
90
|
+
try {
|
|
91
|
+
const configContent = readFileSync(configPath, 'utf-8');
|
|
92
|
+
config = JSON.parse(configContent);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error(`Failed to read config file: ${configPath}`);
|
|
96
|
+
console.error('Run `caribbean-server init` first.');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
if (options.port) {
|
|
100
|
+
config.websocket.port = parseInt(options.port, 10);
|
|
101
|
+
}
|
|
102
|
+
const server = new CaribbeanServer(config);
|
|
103
|
+
await server.start();
|
|
104
|
+
process.on('SIGINT', () => {
|
|
105
|
+
console.log('\n[Server] Shutting down...');
|
|
106
|
+
server.stop();
|
|
107
|
+
removePid(PID_PATH);
|
|
108
|
+
process.exit(0);
|
|
109
|
+
});
|
|
110
|
+
process.on('SIGTERM', () => {
|
|
111
|
+
console.log('\n[Server] Shutting down...');
|
|
112
|
+
server.stop();
|
|
113
|
+
removePid(PID_PATH);
|
|
114
|
+
process.exit(0);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
program
|
|
118
|
+
.command('status')
|
|
119
|
+
.description('Show server status')
|
|
120
|
+
.option('--config <path>', 'Config file path', CONFIG_PATH)
|
|
121
|
+
.action((options) => {
|
|
122
|
+
try {
|
|
123
|
+
const configContent = readFileSync(options.config, 'utf-8');
|
|
124
|
+
const config = JSON.parse(configContent);
|
|
125
|
+
const pid = readPid(PID_PATH);
|
|
126
|
+
const running = pid !== null && processExists(pid);
|
|
127
|
+
console.log('\nServer Status:');
|
|
128
|
+
console.log(` Running: ${running ? `Yes (PID: ${pid})` : 'No'}`);
|
|
129
|
+
console.log(` WebSocket Port: ${config.websocket.port}`);
|
|
130
|
+
console.log(` WebSocket Path: ${config.websocket.path}`);
|
|
131
|
+
console.log(` Max Connections: ${config.websocket.maxConnections}`);
|
|
132
|
+
console.log(` API Port: ${config.api.port}`);
|
|
133
|
+
console.log(` Web UI: http://${config.api.host}:${config.api.port}`);
|
|
134
|
+
console.log(` Auth Enabled: ${config.auth.enabled}`);
|
|
135
|
+
if (config.auth.user) {
|
|
136
|
+
console.log(` Username: ${config.auth.user.username}`);
|
|
137
|
+
console.log(` Password: ${'*'.repeat(config.auth.user.password.length)}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error(`Failed to read config file: ${options.config}`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
program
|
|
146
|
+
.command('set-auth')
|
|
147
|
+
.description('Set username and password for web UI authentication')
|
|
148
|
+
.option('--config <path>', 'Config file path', CONFIG_PATH)
|
|
149
|
+
.option('--username <username>', 'Username')
|
|
150
|
+
.option('--password <password>', 'Password')
|
|
151
|
+
.option('--disable', 'Disable authentication')
|
|
152
|
+
.action((options) => {
|
|
153
|
+
try {
|
|
154
|
+
let configContent;
|
|
155
|
+
try {
|
|
156
|
+
configContent = readFileSync(options.config, 'utf-8');
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error(`Failed to read config file: ${options.config}`);
|
|
160
|
+
console.error('Run `caribbean-server init` first.');
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
const config = JSON.parse(configContent);
|
|
164
|
+
if (options.disable) {
|
|
165
|
+
config.auth.enabled = false;
|
|
166
|
+
config.auth.user = undefined;
|
|
167
|
+
config.auth.jwtSecret = undefined;
|
|
168
|
+
}
|
|
169
|
+
else if (options.username && options.password) {
|
|
170
|
+
config.auth.enabled = true;
|
|
171
|
+
config.auth.user = {
|
|
172
|
+
username: options.username,
|
|
173
|
+
password: options.password
|
|
174
|
+
};
|
|
175
|
+
config.auth.jwtSecret = 'caribbean-jwt-secret-' + Date.now();
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.error('Error: Please provide --username and --password, or use --disable to remove authentication.');
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
writeFileSync(options.config, JSON.stringify(config, null, 2));
|
|
182
|
+
if (options.disable) {
|
|
183
|
+
console.log('\n✓ Authentication disabled');
|
|
184
|
+
console.log(`\nConfiguration updated at ${options.config}`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
console.log('\n✓ Authentication enabled');
|
|
188
|
+
console.log(` Username: ${options.username}`);
|
|
189
|
+
console.log(` Password: ${'*'.repeat(options.password.length)}`);
|
|
190
|
+
console.log(`\nConfiguration updated at ${options.config}`);
|
|
191
|
+
}
|
|
192
|
+
console.log('\nNote: You may need to restart the server for changes to take effect.');
|
|
193
|
+
console.log('Run: caribbean-server restart');
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
console.error('Failed to set authentication:', error);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
program
|
|
201
|
+
.command('stop')
|
|
202
|
+
.description('Stop the server')
|
|
203
|
+
.action(async () => {
|
|
204
|
+
await stopDaemon(PID_PATH, 'Server');
|
|
205
|
+
});
|
|
206
|
+
program
|
|
207
|
+
.command('restart')
|
|
208
|
+
.description('Restart the server')
|
|
209
|
+
.option('--config <path>', 'Config file path', CONFIG_PATH)
|
|
210
|
+
.option('--port <number>', 'Override WebSocket port')
|
|
211
|
+
.action(async (options) => {
|
|
212
|
+
await stopDaemon(PID_PATH, 'Server');
|
|
213
|
+
const configPath = options.config;
|
|
214
|
+
const args = [process.argv[1], 'start', '--foreground'];
|
|
215
|
+
if (configPath !== CONFIG_PATH)
|
|
216
|
+
args.push('--config', configPath);
|
|
217
|
+
if (options.port)
|
|
218
|
+
args.push('--port', options.port);
|
|
219
|
+
const pid = spawnDaemon({
|
|
220
|
+
pidPath: PID_PATH,
|
|
221
|
+
logPath: LOG_PATH,
|
|
222
|
+
spawnArgs: args,
|
|
223
|
+
});
|
|
224
|
+
console.log(`Server restarted in background (PID: ${pid})`);
|
|
225
|
+
console.log(`Log file: ${LOG_PATH}`);
|
|
226
|
+
});
|
|
227
|
+
program
|
|
228
|
+
.command('logs')
|
|
229
|
+
.description('Show server logs')
|
|
230
|
+
.option('--lines <number>', 'Number of lines to show', '50')
|
|
231
|
+
.action((options) => {
|
|
232
|
+
if (!existsSync(LOG_PATH)) {
|
|
233
|
+
console.log('No log file found');
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const content = readFileSync(LOG_PATH, 'utf-8');
|
|
237
|
+
const n = parseInt(options.lines, 10);
|
|
238
|
+
const lines = content.split('\n').slice(-n);
|
|
239
|
+
console.log(lines.join('\n'));
|
|
240
|
+
});
|
|
241
|
+
program.parse();
|
|
242
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { NodeInfo } from '@openclaw-caribbean/shared';
|
|
2
|
+
export interface DatabaseConfig {
|
|
3
|
+
type: 'sqlite' | 'postgresql';
|
|
4
|
+
path?: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface Migration {
|
|
8
|
+
version: number;
|
|
9
|
+
name: string;
|
|
10
|
+
up: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class DatabaseManager {
|
|
13
|
+
private db;
|
|
14
|
+
private config;
|
|
15
|
+
constructor(config: DatabaseConfig);
|
|
16
|
+
connect(): Promise<void>;
|
|
17
|
+
private initSchema;
|
|
18
|
+
private runMigrations;
|
|
19
|
+
private getMigrations;
|
|
20
|
+
cleanupHistory(): Promise<void>;
|
|
21
|
+
saveNode(node: NodeInfo): Promise<void>;
|
|
22
|
+
saveNodeHistory(nodeId: string, statusJson: string, openclawStatus: string): Promise<void>;
|
|
23
|
+
updateNodeHeartbeat(nodeId: string): Promise<void>;
|
|
24
|
+
getNode(nodeId: string): Promise<NodeInfo | null>;
|
|
25
|
+
getAllNodes(): Promise<NodeInfo[]>;
|
|
26
|
+
getNodeStatusHistory(nodeId: string, limit?: number): Promise<any[]>;
|
|
27
|
+
updateNodeName(nodeId: string, name: string): Promise<void>;
|
|
28
|
+
updateNodeConnected(nodeId: string, clientIp?: string): Promise<void>;
|
|
29
|
+
updateNodeDisconnected(nodeId: string): Promise<void>;
|
|
30
|
+
deleteNode(nodeId: string): Promise<void>;
|
|
31
|
+
private rowToNodeInfo;
|
|
32
|
+
disconnect(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAK3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA8D;IACxE,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAI5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAmBhB,UAAU;YAyCV,aAAa;IAuB3B,OAAO,CAAC,aAAa;IAUf,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDvC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1F,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAajD,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAUlC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAoBvE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3D,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrE,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,OAAO,CAAC,aAAa;IAaf,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAMlC"}
|
package/dist/database.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { open } from 'sqlite';
|
|
2
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import sqlite3 from 'sqlite3';
|
|
5
|
+
export class DatabaseManager {
|
|
6
|
+
db = null;
|
|
7
|
+
config;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
async connect() {
|
|
12
|
+
if (this.config.type === 'sqlite') {
|
|
13
|
+
const dbPath = this.config.path || './data/caribbean.db';
|
|
14
|
+
const dbDir = dirname(dbPath);
|
|
15
|
+
if (!existsSync(dbDir)) {
|
|
16
|
+
mkdirSync(dbDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
this.db = await open({
|
|
19
|
+
filename: dbPath,
|
|
20
|
+
driver: sqlite3.Database
|
|
21
|
+
});
|
|
22
|
+
await this.initSchema();
|
|
23
|
+
await this.runMigrations();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async initSchema() {
|
|
27
|
+
if (!this.db)
|
|
28
|
+
return;
|
|
29
|
+
await this.db.exec(`
|
|
30
|
+
CREATE TABLE IF NOT EXISTS migrations (
|
|
31
|
+
version INTEGER PRIMARY KEY,
|
|
32
|
+
name TEXT NOT NULL,
|
|
33
|
+
executed_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS nodes (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
name TEXT NOT NULL,
|
|
39
|
+
tags TEXT,
|
|
40
|
+
connected INTEGER DEFAULT 0,
|
|
41
|
+
last_seen TEXT,
|
|
42
|
+
status TEXT,
|
|
43
|
+
openclaw_status TEXT DEFAULT 'unknown',
|
|
44
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
45
|
+
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS status_history (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
node_id TEXT NOT NULL,
|
|
51
|
+
status TEXT NOT NULL,
|
|
52
|
+
openclaw_status TEXT DEFAULT 'unknown',
|
|
53
|
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
54
|
+
FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_connected ON nodes(connected);
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_openclaw_status ON nodes(openclaw_status);
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_status_history_node_id ON status_history(node_id);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_status_history_timestamp ON status_history(timestamp);
|
|
61
|
+
`);
|
|
62
|
+
// 初始化后,清理过多的历史记录
|
|
63
|
+
await this.cleanupHistory();
|
|
64
|
+
}
|
|
65
|
+
async runMigrations() {
|
|
66
|
+
if (!this.db)
|
|
67
|
+
return;
|
|
68
|
+
const migrations = this.getMigrations();
|
|
69
|
+
for (const migration of migrations) {
|
|
70
|
+
const executed = await this.db.get(`SELECT version FROM migrations WHERE version = ?`, [migration.version]);
|
|
71
|
+
if (!executed) {
|
|
72
|
+
console.log(`[Database] Running migration: ${migration.name}`);
|
|
73
|
+
await this.db.exec(migration.up);
|
|
74
|
+
await this.db.run(`INSERT INTO migrations (version, name) VALUES (?, ?)`, [migration.version, migration.name]);
|
|
75
|
+
console.log(`[Database] Migration completed: ${migration.name}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
getMigrations() {
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
version: 1,
|
|
83
|
+
name: 'add_client_ip_column',
|
|
84
|
+
up: `ALTER TABLE nodes ADD COLUMN client_ip TEXT;`
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
async cleanupHistory() {
|
|
89
|
+
if (!this.db)
|
|
90
|
+
return;
|
|
91
|
+
// 只保留每个节点的最近 5 条历史记录
|
|
92
|
+
await this.db.exec(`
|
|
93
|
+
DELETE FROM status_history
|
|
94
|
+
WHERE id NOT IN (
|
|
95
|
+
SELECT id FROM status_history AS sh
|
|
96
|
+
WHERE sh.node_id = status_history.node_id
|
|
97
|
+
ORDER BY sh.id DESC
|
|
98
|
+
LIMIT 5
|
|
99
|
+
)
|
|
100
|
+
`);
|
|
101
|
+
console.log('[Database] History cleaned - keeping only last 5 records per node');
|
|
102
|
+
}
|
|
103
|
+
async saveNode(node) {
|
|
104
|
+
if (!this.db)
|
|
105
|
+
return;
|
|
106
|
+
const now = new Date().toISOString();
|
|
107
|
+
const tagsJson = JSON.stringify(node.tags);
|
|
108
|
+
const statusJson = node.status ? JSON.stringify(node.status) : null;
|
|
109
|
+
// Check if node exists
|
|
110
|
+
const existingNode = await this.db.get(`SELECT id, name FROM nodes WHERE id = ?`, [node.id]);
|
|
111
|
+
if (existingNode) {
|
|
112
|
+
// Update existing node - only update necessary fields, preserve name
|
|
113
|
+
await this.db.run(`UPDATE nodes SET tags = ?, connected = ?, last_seen = ?, status = ?, openclaw_status = ?, client_ip = ?, updated_at = ? WHERE id = ?`, [
|
|
114
|
+
tagsJson,
|
|
115
|
+
node.connected ? 1 : 0,
|
|
116
|
+
node.lastSeen.toISOString(),
|
|
117
|
+
statusJson,
|
|
118
|
+
node.openclawStatus || 'unknown',
|
|
119
|
+
node.clientIp || null,
|
|
120
|
+
now,
|
|
121
|
+
node.id
|
|
122
|
+
]);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Insert new node
|
|
126
|
+
await this.db.run(`INSERT INTO nodes (id, name, tags, connected, last_seen, status, openclaw_status, client_ip, updated_at)
|
|
127
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
128
|
+
node.id,
|
|
129
|
+
node.name,
|
|
130
|
+
tagsJson,
|
|
131
|
+
node.connected ? 1 : 0,
|
|
132
|
+
node.lastSeen.toISOString(),
|
|
133
|
+
statusJson,
|
|
134
|
+
node.openclawStatus || 'unknown',
|
|
135
|
+
node.clientIp || null,
|
|
136
|
+
now
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
// 只保留每个节点的最近 5 条历史记录
|
|
140
|
+
if (node.status && statusJson) {
|
|
141
|
+
await this.saveNodeHistory(node.id, statusJson, node.openclawStatus || 'unknown');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async saveNodeHistory(nodeId, statusJson, openclawStatus) {
|
|
145
|
+
if (!this.db)
|
|
146
|
+
return;
|
|
147
|
+
const now = new Date().toISOString();
|
|
148
|
+
await this.db.run(`INSERT OR REPLACE INTO status_history (node_id, status, openclaw_status, timestamp)
|
|
149
|
+
VALUES (?, ?, ?, ?)`, [nodeId, statusJson, openclawStatus || 'unknown', now]);
|
|
150
|
+
// 清理旧的历史记录,只保留最近 5 条
|
|
151
|
+
await this.cleanupHistory();
|
|
152
|
+
}
|
|
153
|
+
async updateNodeHeartbeat(nodeId) {
|
|
154
|
+
if (!this.db)
|
|
155
|
+
return;
|
|
156
|
+
const now = new Date().toISOString();
|
|
157
|
+
// 收到心跳只更新 last_seen 和 updated_at,不改变 connected 状态
|
|
158
|
+
await this.db.run(`UPDATE nodes SET last_seen = ?, updated_at = ? WHERE id = ?`, [now, now, nodeId]);
|
|
159
|
+
}
|
|
160
|
+
async getNode(nodeId) {
|
|
161
|
+
if (!this.db)
|
|
162
|
+
return null;
|
|
163
|
+
const row = await this.db.get(`SELECT * FROM nodes WHERE id = ?`, [nodeId]);
|
|
164
|
+
if (!row)
|
|
165
|
+
return null;
|
|
166
|
+
return this.rowToNodeInfo(row);
|
|
167
|
+
}
|
|
168
|
+
async getAllNodes() {
|
|
169
|
+
if (!this.db)
|
|
170
|
+
return [];
|
|
171
|
+
const rows = await this.db.all(`SELECT * FROM nodes ORDER BY name`);
|
|
172
|
+
return rows.map(row => this.rowToNodeInfo(row));
|
|
173
|
+
}
|
|
174
|
+
async getNodeStatusHistory(nodeId, limit = 5) {
|
|
175
|
+
if (!this.db)
|
|
176
|
+
return [];
|
|
177
|
+
const rows = await this.db.all(`SELECT * FROM status_history
|
|
178
|
+
WHERE node_id = ?
|
|
179
|
+
ORDER BY timestamp DESC
|
|
180
|
+
LIMIT ?`, [nodeId, limit]);
|
|
181
|
+
return rows.map(row => ({
|
|
182
|
+
id: row.id,
|
|
183
|
+
nodeId: row.node_id,
|
|
184
|
+
status: JSON.parse(row.status),
|
|
185
|
+
openclawStatus: row.openclaw_status,
|
|
186
|
+
timestamp: new Date(row.timestamp)
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
async updateNodeName(nodeId, name) {
|
|
190
|
+
if (!this.db)
|
|
191
|
+
return;
|
|
192
|
+
const now = new Date().toISOString();
|
|
193
|
+
await this.db.run(`UPDATE nodes SET name = ?, updated_at = ? WHERE id = ?`, [name, now, nodeId]);
|
|
194
|
+
}
|
|
195
|
+
async updateNodeConnected(nodeId, clientIp) {
|
|
196
|
+
if (!this.db)
|
|
197
|
+
return;
|
|
198
|
+
const now = new Date().toISOString();
|
|
199
|
+
if (clientIp) {
|
|
200
|
+
await this.db.run(`UPDATE nodes SET connected = 1, last_seen = ?, client_ip = ?, updated_at = ? WHERE id = ?`, [now, clientIp, now, nodeId]);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
await this.db.run(`UPDATE nodes SET connected = 1, last_seen = ?, updated_at = ? WHERE id = ?`, [now, now, nodeId]);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async updateNodeDisconnected(nodeId) {
|
|
207
|
+
if (!this.db)
|
|
208
|
+
return;
|
|
209
|
+
const now = new Date().toISOString();
|
|
210
|
+
await this.db.run(`UPDATE nodes SET connected = 0, openclaw_status = 'unknown', updated_at = ? WHERE id = ?`, [now, nodeId]);
|
|
211
|
+
}
|
|
212
|
+
async deleteNode(nodeId) {
|
|
213
|
+
if (!this.db)
|
|
214
|
+
return;
|
|
215
|
+
await this.db.run(`DELETE FROM nodes WHERE id = ?`, [nodeId]);
|
|
216
|
+
}
|
|
217
|
+
rowToNodeInfo(row) {
|
|
218
|
+
return {
|
|
219
|
+
id: row.id,
|
|
220
|
+
name: row.name,
|
|
221
|
+
tags: JSON.parse(row.tags || '[]'),
|
|
222
|
+
connected: row.connected === 1,
|
|
223
|
+
lastSeen: new Date(row.last_seen),
|
|
224
|
+
status: row.status ? JSON.parse(row.status) : undefined,
|
|
225
|
+
openclawStatus: row.openclaw_status || 'unknown',
|
|
226
|
+
clientIp: row.client_ip || undefined
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
async disconnect() {
|
|
230
|
+
if (this.db) {
|
|
231
|
+
await this.db.close();
|
|
232
|
+
this.db = null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { NodeManager } from './node-manager.js';
|
|
2
|
+
import { WebSocketHub } from './websocket-hub.js';
|
|
3
|
+
import { DatabaseManager } from './database.js';
|
|
4
|
+
export interface ServerConfig {
|
|
5
|
+
websocket: {
|
|
6
|
+
port: number;
|
|
7
|
+
path: string;
|
|
8
|
+
maxConnections: number;
|
|
9
|
+
};
|
|
10
|
+
api?: {
|
|
11
|
+
port: number;
|
|
12
|
+
host: string;
|
|
13
|
+
webDistPath?: string;
|
|
14
|
+
};
|
|
15
|
+
database?: {
|
|
16
|
+
type: 'sqlite' | 'postgresql';
|
|
17
|
+
path?: string;
|
|
18
|
+
url?: string;
|
|
19
|
+
};
|
|
20
|
+
auth?: {
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
tokens: string[];
|
|
23
|
+
user?: {
|
|
24
|
+
username: string;
|
|
25
|
+
password: string;
|
|
26
|
+
};
|
|
27
|
+
jwtSecret?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare class CaribbeanServer {
|
|
31
|
+
private nodeManager;
|
|
32
|
+
private websocketHub;
|
|
33
|
+
private apiServer;
|
|
34
|
+
private database;
|
|
35
|
+
private config;
|
|
36
|
+
constructor(config: ServerConfig);
|
|
37
|
+
start(): Promise<void>;
|
|
38
|
+
stop(): void;
|
|
39
|
+
getNodeManager(): NodeManager;
|
|
40
|
+
getWebSocketHub(): WebSocketHub;
|
|
41
|
+
getDatabase(): DatabaseManager | null;
|
|
42
|
+
private logStatus;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAoE1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B,IAAI,IAAI,IAAI;IAYZ,cAAc,IAAI,WAAW;IAI7B,eAAe,IAAI,YAAY;IAI/B,WAAW,IAAI,eAAe,GAAG,IAAI;IAIrC,OAAO,CAAC,SAAS;CAKlB"}
|