@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.
Files changed (35) hide show
  1. package/dist/commands/worker/commands.d.ts +42 -0
  2. package/dist/commands/worker/commands.d.ts.map +1 -0
  3. package/dist/commands/worker/commands.js +580 -0
  4. package/dist/commands/worker/commands.js.map +1 -0
  5. package/dist/commands/worker/index.d.ts +7 -0
  6. package/dist/commands/worker/index.d.ts.map +1 -0
  7. package/dist/commands/worker/index.js +28 -0
  8. package/dist/commands/worker/index.js.map +1 -0
  9. package/dist/commands/worker/utils/config.d.ts +26 -0
  10. package/dist/commands/worker/utils/config.d.ts.map +1 -0
  11. package/dist/commands/worker/utils/config.js +197 -0
  12. package/dist/commands/worker/utils/config.js.map +1 -0
  13. package/dist/commands/worker/utils/display.d.ts +6 -0
  14. package/dist/commands/worker/utils/display.d.ts.map +1 -0
  15. package/dist/commands/worker/utils/display.js +32 -0
  16. package/dist/commands/worker/utils/display.js.map +1 -0
  17. package/dist/commands/worker/utils/finder.d.ts +12 -0
  18. package/dist/commands/worker/utils/finder.d.ts.map +1 -0
  19. package/dist/commands/worker/utils/finder.js +60 -0
  20. package/dist/commands/worker/utils/finder.js.map +1 -0
  21. package/dist/lib/workerManager.d.ts +60 -0
  22. package/dist/lib/workerManager.d.ts.map +1 -0
  23. package/dist/lib/workerManager.js +426 -0
  24. package/dist/lib/workerManager.js.map +1 -0
  25. package/dist/tonk.js +2 -0
  26. package/dist/tonk.js.map +1 -1
  27. package/dist/types/worker.d.ts +102 -0
  28. package/dist/types/worker.d.ts.map +1 -0
  29. package/dist/types/worker.js +7 -0
  30. package/dist/types/worker.js.map +1 -0
  31. package/dist/types/workerConfig.d.ts +164 -0
  32. package/dist/types/workerConfig.d.ts.map +1 -0
  33. package/dist/types/workerConfig.js +80 -0
  34. package/dist/types/workerConfig.js.map +1 -0
  35. 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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"}