@tonk/cli 0.2.5 → 0.2.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/dist/commands/worker/commands.d.ts +42 -0
- package/dist/commands/worker/commands.d.ts.map +1 -0
- package/dist/commands/worker/commands.js +580 -0
- package/dist/commands/worker/commands.js.map +1 -0
- package/dist/commands/worker/index.d.ts +7 -0
- package/dist/commands/worker/index.d.ts.map +1 -0
- package/dist/commands/worker/index.js +28 -0
- package/dist/commands/worker/index.js.map +1 -0
- package/dist/commands/worker/utils/config.d.ts +26 -0
- package/dist/commands/worker/utils/config.d.ts.map +1 -0
- package/dist/commands/worker/utils/config.js +197 -0
- package/dist/commands/worker/utils/config.js.map +1 -0
- package/dist/commands/worker/utils/display.d.ts +6 -0
- package/dist/commands/worker/utils/display.d.ts.map +1 -0
- package/dist/commands/worker/utils/display.js +32 -0
- package/dist/commands/worker/utils/display.js.map +1 -0
- package/dist/commands/worker/utils/finder.d.ts +12 -0
- package/dist/commands/worker/utils/finder.d.ts.map +1 -0
- package/dist/commands/worker/utils/finder.js +60 -0
- package/dist/commands/worker/utils/finder.js.map +1 -0
- package/dist/lib/workerManager.d.ts +60 -0
- package/dist/lib/workerManager.d.ts.map +1 -0
- package/dist/lib/workerManager.js +426 -0
- package/dist/lib/workerManager.js.map +1 -0
- package/dist/tonk.js +2 -0
- package/dist/tonk.js.map +1 -1
- package/dist/types/worker.d.ts +102 -0
- package/dist/types/worker.d.ts.map +1 -0
- package/dist/types/worker.js +7 -0
- package/dist/types/worker.js.map +1 -0
- package/dist/types/workerConfig.d.ts +164 -0
- package/dist/types/workerConfig.d.ts.map +1 -0
- package/dist/types/workerConfig.js +80 -0
- package/dist/types/workerConfig.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Register the inspect command
|
|
4
|
+
*/
|
|
5
|
+
export declare function registerInspectCommand(workerCommand: Command): void;
|
|
6
|
+
/**
|
|
7
|
+
* Register the list command
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerListCommand(workerCommand: Command): void;
|
|
10
|
+
/**
|
|
11
|
+
* Register the remove command
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerRemoveCommand(workerCommand: Command): void;
|
|
14
|
+
/**
|
|
15
|
+
* Register the ping command
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerPingCommand(workerCommand: Command): void;
|
|
18
|
+
/**
|
|
19
|
+
* Register the start command
|
|
20
|
+
*/
|
|
21
|
+
export declare function registerStartCommand(workerCommand: Command): void;
|
|
22
|
+
/**
|
|
23
|
+
* Register the stop command
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerStopCommand(workerCommand: Command): void;
|
|
26
|
+
/**
|
|
27
|
+
* Register the logs command
|
|
28
|
+
*/
|
|
29
|
+
export declare function registerLogsCommand(workerCommand: Command): void;
|
|
30
|
+
/**
|
|
31
|
+
* Register the register command
|
|
32
|
+
*/
|
|
33
|
+
export declare function registerRegisterCommand(workerCommand: Command): void;
|
|
34
|
+
/**
|
|
35
|
+
* Register the install command
|
|
36
|
+
*/
|
|
37
|
+
export declare function registerInstallCommand(workerCommand: Command): void;
|
|
38
|
+
/**
|
|
39
|
+
* Register the init command
|
|
40
|
+
*/
|
|
41
|
+
export declare function registerInitCommand(workerCommand: Command): void;
|
|
42
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/commands/worker/commands.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAelC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAmFnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAgEhE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CA8BlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAqChE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CA4BjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CA4BhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAkGhE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAyIpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAkFnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAmJhE"}
|
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import Table from 'cli-table3';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { exec } from 'node:child_process';
|
|
7
|
+
import { TonkWorkerManager } from '../../lib/workerManager.js';
|
|
8
|
+
import { displayWorkerDetails } from './utils/display.js';
|
|
9
|
+
import { findWorkerRoot, findAvailablePort } from './utils/finder.js';
|
|
10
|
+
import { readPackageJson, readWorkerConfigJs, updateWorkerConfig, promptForMissingOptions, generatePackageJsonContent, generateWorkerConfigJsContent, } from './utils/config.js';
|
|
11
|
+
/**
|
|
12
|
+
* Register the inspect command
|
|
13
|
+
*/
|
|
14
|
+
export function registerInspectCommand(workerCommand) {
|
|
15
|
+
workerCommand
|
|
16
|
+
.command('inspect <nameOrId>')
|
|
17
|
+
.description('Inspect a specific worker')
|
|
18
|
+
.option('-s, --start', 'Start the worker')
|
|
19
|
+
.option('-S, --stop', 'Stop the worker')
|
|
20
|
+
.option('-c, --config <path>', 'Path to worker configuration file')
|
|
21
|
+
.option('-p, --ping', 'Ping the worker to check its status')
|
|
22
|
+
.action(async (nameOrId, options) => {
|
|
23
|
+
try {
|
|
24
|
+
// Create worker manager
|
|
25
|
+
const workerManager = new TonkWorkerManager();
|
|
26
|
+
// Get worker
|
|
27
|
+
const worker = await workerManager.findByNameOrId(nameOrId);
|
|
28
|
+
if (!worker) {
|
|
29
|
+
console.error(chalk.red(`Worker with name or ID '${nameOrId}' not found.`));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// If no options provided, show worker details
|
|
33
|
+
if (!options.start &&
|
|
34
|
+
!options.stop &&
|
|
35
|
+
!options.config &&
|
|
36
|
+
!options.ping) {
|
|
37
|
+
displayWorkerDetails(worker);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Handle ping option
|
|
41
|
+
if (options.ping) {
|
|
42
|
+
console.log(chalk.blue(`Pinging worker '${worker.name}' at ${worker.endpoint}...`));
|
|
43
|
+
// Check worker health
|
|
44
|
+
const isHealthy = await workerManager.checkHealth(worker.id);
|
|
45
|
+
if (isHealthy) {
|
|
46
|
+
console.log(chalk.green(`Worker '${worker.name}' is active!`));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(chalk.red(`Worker '${worker.name}' is not responding.`));
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Handle start option
|
|
54
|
+
if (options.start) {
|
|
55
|
+
console.log(chalk.blue(`Starting worker '${worker.name}'...`));
|
|
56
|
+
await workerManager.start(worker.id);
|
|
57
|
+
console.log(chalk.green(`Worker '${worker.name}' started successfully!`));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Handle stop option
|
|
61
|
+
if (options.stop) {
|
|
62
|
+
console.log(chalk.blue(`Stopping worker '${worker.name}'...`));
|
|
63
|
+
await workerManager.stop(worker.id);
|
|
64
|
+
console.log(chalk.green(`Worker '${worker.name}' stopped successfully!`));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Handle config option
|
|
68
|
+
if (options.config) {
|
|
69
|
+
await updateWorkerConfig(workerManager, worker.id, options.config);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error(chalk.red('Failed to manage worker:'), error);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Register the list command
|
|
79
|
+
*/
|
|
80
|
+
export function registerListCommand(workerCommand) {
|
|
81
|
+
workerCommand
|
|
82
|
+
.command('ls')
|
|
83
|
+
.description('List all registered workers')
|
|
84
|
+
.action(async () => {
|
|
85
|
+
try {
|
|
86
|
+
// Create worker manager
|
|
87
|
+
const workerManager = new TonkWorkerManager();
|
|
88
|
+
// Get all workers
|
|
89
|
+
const workers = await workerManager.list();
|
|
90
|
+
if (workers.length === 0) {
|
|
91
|
+
console.log(chalk.yellow('No workers registered yet.'));
|
|
92
|
+
console.log(chalk.blue(`Use '${chalk.bold('tonk worker register')}' to register a worker.`));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Create a table for display
|
|
96
|
+
const table = new Table({
|
|
97
|
+
head: [
|
|
98
|
+
chalk.cyan('ID'),
|
|
99
|
+
chalk.cyan('Name'),
|
|
100
|
+
chalk.cyan('Endpoint'),
|
|
101
|
+
chalk.cyan('Protocol'),
|
|
102
|
+
chalk.cyan('Status'),
|
|
103
|
+
chalk.cyan('Last Seen'),
|
|
104
|
+
],
|
|
105
|
+
colWidths: [24, 20, 30, 10, 10, 20],
|
|
106
|
+
});
|
|
107
|
+
// Add workers to table
|
|
108
|
+
workers.forEach(worker => {
|
|
109
|
+
const lastSeen = worker.status.lastSeen
|
|
110
|
+
? new Date(worker.status.lastSeen).toLocaleString()
|
|
111
|
+
: 'Never';
|
|
112
|
+
table.push([
|
|
113
|
+
worker.id,
|
|
114
|
+
worker.name,
|
|
115
|
+
worker.endpoint,
|
|
116
|
+
worker.protocol,
|
|
117
|
+
worker.status.active
|
|
118
|
+
? chalk.green('Active')
|
|
119
|
+
: chalk.yellow('Inactive'),
|
|
120
|
+
lastSeen,
|
|
121
|
+
]);
|
|
122
|
+
});
|
|
123
|
+
console.log(chalk.bold(`Registered Workers (${workers.length}):`));
|
|
124
|
+
console.log(table.toString());
|
|
125
|
+
console.log(chalk.blue(`\nUse '${chalk.bold('tonk worker inspect <name or id>')}' to view details of a specific worker.`));
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error(chalk.red('Failed to list workers:'), error);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Register the remove command
|
|
134
|
+
*/
|
|
135
|
+
export function registerRemoveCommand(workerCommand) {
|
|
136
|
+
workerCommand
|
|
137
|
+
.command('rm <nameOrId>')
|
|
138
|
+
.description('Remove a registered worker')
|
|
139
|
+
.action(async (nameOrId) => {
|
|
140
|
+
try {
|
|
141
|
+
// Create worker manager
|
|
142
|
+
const workerManager = new TonkWorkerManager();
|
|
143
|
+
// Get worker
|
|
144
|
+
const worker = await workerManager.findByNameOrId(nameOrId);
|
|
145
|
+
if (!worker) {
|
|
146
|
+
console.error(chalk.red(`Worker with name or ID '${nameOrId}' not found.`));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// Remove worker
|
|
150
|
+
await workerManager.remove(worker.id);
|
|
151
|
+
console.log(chalk.green(`Worker '${worker.name}' (${worker.id}) removed successfully.`));
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error(chalk.red('Failed to remove worker:'), error);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Register the ping command
|
|
160
|
+
*/
|
|
161
|
+
export function registerPingCommand(workerCommand) {
|
|
162
|
+
workerCommand
|
|
163
|
+
.command('ping <nameOrId>')
|
|
164
|
+
.description('Ping a worker to check its status')
|
|
165
|
+
.action(async (nameOrId) => {
|
|
166
|
+
try {
|
|
167
|
+
// Create worker manager
|
|
168
|
+
const workerManager = new TonkWorkerManager();
|
|
169
|
+
// Get worker
|
|
170
|
+
const worker = await workerManager.findByNameOrId(nameOrId);
|
|
171
|
+
if (!worker) {
|
|
172
|
+
console.error(chalk.red(`Worker with name or ID '${nameOrId}' not found.`));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
console.log(chalk.blue(`Pinging worker '${worker.name}' at ${worker.endpoint}...`));
|
|
176
|
+
// Check worker health
|
|
177
|
+
const isHealthy = await workerManager.checkHealth(worker.id);
|
|
178
|
+
if (isHealthy) {
|
|
179
|
+
console.log(chalk.green(`Worker '${worker.name}' is active!`));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(chalk.red(`Worker '${worker.name}' is not responding.`));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
console.error(chalk.red('Failed to ping worker:'), error);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Register the start command
|
|
192
|
+
*/
|
|
193
|
+
export function registerStartCommand(workerCommand) {
|
|
194
|
+
workerCommand
|
|
195
|
+
.command('start <nameOrId>')
|
|
196
|
+
.description('Start a worker')
|
|
197
|
+
.action(async (nameOrId) => {
|
|
198
|
+
try {
|
|
199
|
+
// Create worker manager
|
|
200
|
+
const workerManager = new TonkWorkerManager();
|
|
201
|
+
// Get worker
|
|
202
|
+
const worker = await workerManager.findByNameOrId(nameOrId);
|
|
203
|
+
if (!worker) {
|
|
204
|
+
console.error(chalk.red(`Worker with name or ID '${nameOrId}' not found.`));
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
console.log(chalk.blue(`Starting worker '${worker.name}'...`));
|
|
208
|
+
await workerManager.start(worker.id);
|
|
209
|
+
console.log(chalk.green(`Worker '${worker.name}' started successfully!`));
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error(chalk.red('Failed to start worker:'), error);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Register the stop command
|
|
218
|
+
*/
|
|
219
|
+
export function registerStopCommand(workerCommand) {
|
|
220
|
+
workerCommand
|
|
221
|
+
.command('stop <nameOrId>')
|
|
222
|
+
.description('Stop a worker')
|
|
223
|
+
.action(async (nameOrId) => {
|
|
224
|
+
try {
|
|
225
|
+
// Create worker manager
|
|
226
|
+
const workerManager = new TonkWorkerManager();
|
|
227
|
+
// Get worker
|
|
228
|
+
const worker = await workerManager.findByNameOrId(nameOrId);
|
|
229
|
+
if (!worker) {
|
|
230
|
+
console.error(chalk.red(`Worker with name or ID '${nameOrId}' not found.`));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
console.log(chalk.blue(`Stopping worker '${worker.name}'...`));
|
|
234
|
+
await workerManager.stop(worker.id);
|
|
235
|
+
console.log(chalk.green(`Worker '${worker.name}' stopped successfully!`));
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.error(chalk.red('Failed to stop worker:'), error);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Register the logs command
|
|
244
|
+
*/
|
|
245
|
+
export function registerLogsCommand(workerCommand) {
|
|
246
|
+
workerCommand
|
|
247
|
+
.command('logs <nameOrId>')
|
|
248
|
+
.description('View logs for a worker')
|
|
249
|
+
.option('-f, --follow', 'Follow log output')
|
|
250
|
+
.option('-l, --lines <n>', 'Number of lines to show', '100')
|
|
251
|
+
.option('-e, --error', 'Show only error logs')
|
|
252
|
+
.option('-o, --out', 'Show only standard output logs')
|
|
253
|
+
.action(async (nameOrId, options) => {
|
|
254
|
+
try {
|
|
255
|
+
// Create worker manager
|
|
256
|
+
const workerManager = new TonkWorkerManager();
|
|
257
|
+
// Get worker
|
|
258
|
+
const worker = await workerManager.findByNameOrId(nameOrId);
|
|
259
|
+
if (!worker) {
|
|
260
|
+
console.error(chalk.red(`Worker with name or ID '${nameOrId}' not found.`));
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
console.log(chalk.blue(`Fetching logs for worker '${worker.name}'...`));
|
|
264
|
+
const { spawn } = await import('node:child_process');
|
|
265
|
+
try {
|
|
266
|
+
// Build the PM2 logs command arguments
|
|
267
|
+
const args = ['logs', worker.id];
|
|
268
|
+
// Add options
|
|
269
|
+
if (options.lines) {
|
|
270
|
+
args.push('--lines', options.lines);
|
|
271
|
+
}
|
|
272
|
+
if (options.error) {
|
|
273
|
+
args.push('--err');
|
|
274
|
+
}
|
|
275
|
+
else if (options.out) {
|
|
276
|
+
args.push('--out');
|
|
277
|
+
}
|
|
278
|
+
// Always use --raw to get cleaner output
|
|
279
|
+
args.push('--raw');
|
|
280
|
+
// For non-follow mode, we'll use --lines and then kill the process after a short delay
|
|
281
|
+
if (!options.follow) {
|
|
282
|
+
console.log(chalk.blue(`Showing last ${options.lines || '100'} lines of logs...`));
|
|
283
|
+
const child = spawn('pm2', args, {
|
|
284
|
+
stdio: 'inherit',
|
|
285
|
+
});
|
|
286
|
+
// Kill the process after a short delay to get just the initial output
|
|
287
|
+
setTimeout(() => {
|
|
288
|
+
child.kill('SIGINT');
|
|
289
|
+
}, 1000);
|
|
290
|
+
// Wait for the child process to exit
|
|
291
|
+
await new Promise(resolve => {
|
|
292
|
+
child.on('exit', resolve);
|
|
293
|
+
});
|
|
294
|
+
console.log(chalk.blue('\nUse -f or --follow to stream logs in real-time'));
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// For follow mode
|
|
298
|
+
console.log(chalk.blue('Streaming logs in real-time. Press Ctrl+C to exit.'));
|
|
299
|
+
const child = spawn('pm2', args, {
|
|
300
|
+
stdio: 'inherit',
|
|
301
|
+
});
|
|
302
|
+
// Handle process exit
|
|
303
|
+
process.on('SIGINT', () => {
|
|
304
|
+
child.kill();
|
|
305
|
+
process.exit(0);
|
|
306
|
+
});
|
|
307
|
+
// Wait for the child process to exit
|
|
308
|
+
await new Promise(resolve => {
|
|
309
|
+
child.on('exit', resolve);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
console.error(chalk.red('Failed to fetch logs:'), error);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
console.error(chalk.red('Failed to fetch worker logs:'), error);
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Register the register command
|
|
324
|
+
*/
|
|
325
|
+
export function registerRegisterCommand(workerCommand) {
|
|
326
|
+
workerCommand
|
|
327
|
+
.command('register')
|
|
328
|
+
.description('Register a worker with Tonk')
|
|
329
|
+
.argument('[dir]', 'Path to worker directory (defaults to current directory)')
|
|
330
|
+
.option('-n, --name <n>', 'Name of the worker')
|
|
331
|
+
.option('-e, --endpoint <endpoint>', 'Endpoint URL of the worker')
|
|
332
|
+
.option('-p, --port <port>', 'Port number for the worker')
|
|
333
|
+
.option('-d, --description <description>', 'Description of the worker')
|
|
334
|
+
.action(async (dir = '.', options) => {
|
|
335
|
+
try {
|
|
336
|
+
// Create worker manager
|
|
337
|
+
const workerManager = new TonkWorkerManager();
|
|
338
|
+
// If options are provided, use them directly
|
|
339
|
+
if (options.name && options.endpoint) {
|
|
340
|
+
// Register worker using provided options
|
|
341
|
+
const worker = await workerManager.register({
|
|
342
|
+
name: options.name,
|
|
343
|
+
description: options.description || `Worker at ${options.endpoint}`,
|
|
344
|
+
endpoint: options.endpoint,
|
|
345
|
+
protocol: 'http',
|
|
346
|
+
env: options.port ? [`WORKER_PORT=${options.port}`] : [],
|
|
347
|
+
});
|
|
348
|
+
console.log(chalk.green(`Worker '${worker.name}' registered successfully!`));
|
|
349
|
+
console.log(chalk.cyan('Worker ID:'), chalk.bold(worker.id));
|
|
350
|
+
console.log(chalk.cyan('Endpoint:'), chalk.bold(worker.endpoint));
|
|
351
|
+
console.log(chalk.cyan('Protocol:'), chalk.bold(worker.protocol));
|
|
352
|
+
console.log(chalk.cyan('Status:'), worker.status.active
|
|
353
|
+
? chalk.green('Active')
|
|
354
|
+
: chalk.yellow('Inactive'));
|
|
355
|
+
if (Object.keys(worker.env).length > 0) {
|
|
356
|
+
console.log(chalk.cyan('Environment Variables:'));
|
|
357
|
+
Object.entries(worker.env).forEach(([key, value]) => {
|
|
358
|
+
console.log(` ${key}=${value}`);
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
// Look for package.json and worker.config.js files
|
|
364
|
+
const workerDir = await findWorkerRoot(dir);
|
|
365
|
+
if (!workerDir) {
|
|
366
|
+
console.error(chalk.red(`No package.json or worker.config.js found in ${path.resolve(dir)} or its parent directories.`));
|
|
367
|
+
console.log(chalk.yellow('Make sure you are in a valid worker directory or specify the path to one, or provide --name and --endpoint options.'));
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
console.log(chalk.blue(`Found worker directory at: ${workerDir}`));
|
|
371
|
+
// Read package.json for worker metadata
|
|
372
|
+
const packageJsonPath = path.join(workerDir, 'package.json');
|
|
373
|
+
const packageJson = await readPackageJson(packageJsonPath);
|
|
374
|
+
if (!packageJson) {
|
|
375
|
+
console.error(chalk.red(`Failed to parse package.json file at ${packageJsonPath}`));
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
// Read worker.config.js for configuration
|
|
379
|
+
const workerConfigPath = path.join(workerDir, 'worker.config.js');
|
|
380
|
+
const workerConfig = await readWorkerConfigJs(workerConfigPath);
|
|
381
|
+
if (!workerConfig) {
|
|
382
|
+
console.error(chalk.red(`Failed to parse worker.config.js file at ${workerConfigPath}`));
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
// Determine port from config or use default
|
|
386
|
+
const port = options.port || workerConfig.runtime?.port || 5555;
|
|
387
|
+
// Create worker registration options
|
|
388
|
+
const registrationOptions = {
|
|
389
|
+
name: packageJson.name,
|
|
390
|
+
description: packageJson.description || 'Tonk worker',
|
|
391
|
+
endpoint: options.endpoint || `http://localhost:${port}/tonk`,
|
|
392
|
+
protocol: 'http',
|
|
393
|
+
env: [`WORKER_PORT=${port}`],
|
|
394
|
+
config: {
|
|
395
|
+
...workerConfig,
|
|
396
|
+
version: packageJson.version,
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
// Register worker
|
|
400
|
+
const worker = await workerManager.register(registrationOptions);
|
|
401
|
+
console.log(chalk.green(`Worker '${worker.name}' registered successfully!`));
|
|
402
|
+
console.log(chalk.cyan('Worker ID:'), chalk.bold(worker.id));
|
|
403
|
+
console.log(chalk.cyan('Endpoint:'), chalk.bold(worker.endpoint));
|
|
404
|
+
console.log(chalk.cyan('Protocol:'), chalk.bold(worker.protocol));
|
|
405
|
+
console.log(chalk.cyan('Status:'), worker.status.active
|
|
406
|
+
? chalk.green('Active')
|
|
407
|
+
: chalk.yellow('Inactive'));
|
|
408
|
+
if (Object.keys(worker.env).length > 0) {
|
|
409
|
+
console.log(chalk.cyan('Environment Variables:'));
|
|
410
|
+
Object.entries(worker.env).forEach(([key, value]) => {
|
|
411
|
+
console.log(` ${key}=${value}`);
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
console.error(chalk.red('Failed to register worker:'), error);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Register the install command
|
|
422
|
+
*/
|
|
423
|
+
export function registerInstallCommand(workerCommand) {
|
|
424
|
+
workerCommand
|
|
425
|
+
.command('install <package>')
|
|
426
|
+
.description('Install and start a worker from npm')
|
|
427
|
+
.option('-p, --port <port>', 'Specify a port for the worker (default: auto-detect)')
|
|
428
|
+
.option('-n, --name <n>', 'Custom name for the worker (default: npm package name)')
|
|
429
|
+
.action(async (packageName, options) => {
|
|
430
|
+
try {
|
|
431
|
+
console.log(chalk.blue(`Installing worker from npm package: ${packageName}...`));
|
|
432
|
+
// Create worker manager
|
|
433
|
+
const workerManager = new TonkWorkerManager();
|
|
434
|
+
// Execute npm install
|
|
435
|
+
const execAsync = promisify(exec);
|
|
436
|
+
try {
|
|
437
|
+
console.log(chalk.blue('Installing package...'));
|
|
438
|
+
await execAsync(`npm install -g ${packageName}`);
|
|
439
|
+
console.log(chalk.green('Package installed successfully!'));
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
console.error(chalk.red('Failed to install package:'), error);
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
// Find an available port starting from 5555
|
|
446
|
+
let port = options.port;
|
|
447
|
+
if (!port) {
|
|
448
|
+
port = await findAvailablePort(5555);
|
|
449
|
+
console.log(chalk.blue(`Found available port: ${port}`));
|
|
450
|
+
}
|
|
451
|
+
// Get package info to determine the worker name and entry point
|
|
452
|
+
let packageInfo;
|
|
453
|
+
try {
|
|
454
|
+
const { stdout } = await execAsync(`npm view ${packageName} --json`);
|
|
455
|
+
packageInfo = JSON.parse(stdout);
|
|
456
|
+
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
console.error(chalk.red('Failed to get package info:'), error);
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
// Register the worker with the npm package name (use display name in description)
|
|
462
|
+
const worker = await workerManager.register({
|
|
463
|
+
name: packageName, // Use the actual package name for npm resolution
|
|
464
|
+
description: packageInfo.description || `Worker from npm package ${packageName}`,
|
|
465
|
+
endpoint: `http://localhost:${port}/tonk`,
|
|
466
|
+
protocol: 'http',
|
|
467
|
+
env: [`WORKER_PORT=${port}`],
|
|
468
|
+
type: 'npm',
|
|
469
|
+
});
|
|
470
|
+
console.log(chalk.green(`Worker '${worker.name}' registered successfully!`));
|
|
471
|
+
// Start the worker
|
|
472
|
+
console.log(chalk.blue(`Starting worker '${worker.name}'...`));
|
|
473
|
+
const success = await workerManager.start(worker.id);
|
|
474
|
+
if (success) {
|
|
475
|
+
console.log(chalk.green(`Worker '${worker.name}' started successfully!`));
|
|
476
|
+
console.log(chalk.cyan('Worker ID:'), chalk.bold(worker.id));
|
|
477
|
+
console.log(chalk.cyan('Endpoint:'), chalk.bold(worker.endpoint));
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
console.error(chalk.red(`Failed to start worker '${worker.name}'.`));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
console.error(chalk.red('Failed to install worker:'), error);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Register the init command
|
|
490
|
+
*/
|
|
491
|
+
export function registerInitCommand(workerCommand) {
|
|
492
|
+
workerCommand
|
|
493
|
+
.command('init')
|
|
494
|
+
.description('Initialise a new worker configuration file')
|
|
495
|
+
.option('-d, --dir <directory>', 'Directory to create the configuration file in', '.')
|
|
496
|
+
.option('-n, --name <n>', 'Name of the worker')
|
|
497
|
+
.option('-p, --port <port>', 'Port number for the worker', '5555')
|
|
498
|
+
.option('-D, --description <description>', 'Description of the worker')
|
|
499
|
+
.action(async (options) => {
|
|
500
|
+
try {
|
|
501
|
+
// Prompt for missing options
|
|
502
|
+
const answers = await promptForMissingOptions(options);
|
|
503
|
+
const mergedOptions = { ...options, ...answers };
|
|
504
|
+
// Create the directory if it doesn't exist
|
|
505
|
+
const targetDir = path.resolve(mergedOptions.dir);
|
|
506
|
+
if (!fs.existsSync(targetDir)) {
|
|
507
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
508
|
+
console.log(chalk.blue(`Created directory: ${targetDir}`));
|
|
509
|
+
}
|
|
510
|
+
// Generate the package.json content if it doesn't exist
|
|
511
|
+
const packageJsonPath = path.join(targetDir, 'package.json');
|
|
512
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
513
|
+
const packageJsonContent = generatePackageJsonContent(mergedOptions);
|
|
514
|
+
fs.writeFileSync(packageJsonPath, packageJsonContent);
|
|
515
|
+
console.log(chalk.green(`Created package.json at: ${packageJsonPath}`));
|
|
516
|
+
}
|
|
517
|
+
// Generate the worker.config.js content
|
|
518
|
+
const workerConfigContent = generateWorkerConfigJsContent();
|
|
519
|
+
const workerConfigPath = path.join(targetDir, 'worker.config.js');
|
|
520
|
+
fs.writeFileSync(workerConfigPath, workerConfigContent);
|
|
521
|
+
// Create src directory if it doesn't exist
|
|
522
|
+
const srcDir = path.join(targetDir, 'src');
|
|
523
|
+
if (!fs.existsSync(srcDir)) {
|
|
524
|
+
fs.mkdirSync(srcDir, { recursive: true });
|
|
525
|
+
console.log(chalk.blue(`Created src directory: ${srcDir}`));
|
|
526
|
+
}
|
|
527
|
+
// Copy CLI template file
|
|
528
|
+
const cliTemplatePath = path.join(__dirname, 'templates', 'cli.ts.template');
|
|
529
|
+
const cliDestPath = path.join(srcDir, 'cli.ts');
|
|
530
|
+
if (fs.existsSync(cliTemplatePath)) {
|
|
531
|
+
let cliContent = fs.readFileSync(cliTemplatePath, 'utf-8');
|
|
532
|
+
// Replace template variables
|
|
533
|
+
cliContent = cliContent
|
|
534
|
+
.replace(/{{name}}/g, mergedOptions.name)
|
|
535
|
+
.replace(/{{description}}/g, mergedOptions.description || 'A Tonk worker')
|
|
536
|
+
.replace(/{{version}}/g, '1.0.0');
|
|
537
|
+
fs.writeFileSync(cliDestPath, cliContent);
|
|
538
|
+
console.log(chalk.green(`Created CLI file at: ${cliDestPath}`));
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
console.warn(chalk.yellow(`CLI template not found at: ${cliTemplatePath}`));
|
|
542
|
+
}
|
|
543
|
+
// Copy index.ts template file
|
|
544
|
+
const indexTemplatePath = path.join(__dirname, 'templates', 'index.ts.template');
|
|
545
|
+
const indexDestPath = path.join(srcDir, 'index.ts');
|
|
546
|
+
if (!fs.existsSync(indexDestPath) && fs.existsSync(indexTemplatePath)) {
|
|
547
|
+
let indexContent = fs.readFileSync(indexTemplatePath, 'utf-8');
|
|
548
|
+
// Replace template variables
|
|
549
|
+
indexContent = indexContent
|
|
550
|
+
.replace(/{{name}}/g, mergedOptions.name)
|
|
551
|
+
.replace(/{{description}}/g, mergedOptions.description || 'A Tonk worker')
|
|
552
|
+
.replace(/{{port}}/g, mergedOptions.port);
|
|
553
|
+
fs.writeFileSync(indexDestPath, indexContent);
|
|
554
|
+
console.log(chalk.green(`Created index.ts file at: ${indexDestPath}`));
|
|
555
|
+
}
|
|
556
|
+
else if (!fs.existsSync(indexTemplatePath)) {
|
|
557
|
+
console.warn(chalk.yellow(`Index template not found at: ${indexTemplatePath}`));
|
|
558
|
+
}
|
|
559
|
+
// Copy tsconfig.json template file
|
|
560
|
+
const tsconfigTemplatePath = path.join(__dirname, 'templates', 'tsconfig.json.template');
|
|
561
|
+
const tsconfigDestPath = path.join(targetDir, 'tsconfig.json');
|
|
562
|
+
if (!fs.existsSync(tsconfigDestPath) &&
|
|
563
|
+
fs.existsSync(tsconfigTemplatePath)) {
|
|
564
|
+
const tsconfigContent = fs.readFileSync(tsconfigTemplatePath, 'utf-8');
|
|
565
|
+
fs.writeFileSync(tsconfigDestPath, tsconfigContent);
|
|
566
|
+
console.log(chalk.green(`Created tsconfig.json file at: ${tsconfigDestPath}`));
|
|
567
|
+
}
|
|
568
|
+
else if (!fs.existsSync(tsconfigTemplatePath)) {
|
|
569
|
+
console.warn(chalk.yellow(`tsconfig.json template not found at: ${tsconfigTemplatePath}`));
|
|
570
|
+
}
|
|
571
|
+
console.log(chalk.green(`Worker configuration file created at: ${workerConfigPath}`));
|
|
572
|
+
console.log(chalk.blue(`\nYou can now register this worker with:`));
|
|
573
|
+
console.log(chalk.cyan(` tonk worker register ${targetDir}`));
|
|
574
|
+
}
|
|
575
|
+
catch (error) {
|
|
576
|
+
console.error(chalk.red('Failed to initialise worker configuration:'), error);
|
|
577
|
+
}
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/commands/worker/commands.ts"],"names":[],"mappings":"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"}
|