@tonk/cli 0.3.3 → 0.6.5

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 (129) hide show
  1. package/README.md +15 -202
  2. package/bin/tonk.js +36 -1
  3. package/package.json +23 -89
  4. package/dist/commands/auth.d.ts +0 -3
  5. package/dist/commands/auth.d.ts.map +0 -1
  6. package/dist/commands/auth.js +0 -184
  7. package/dist/commands/auth.js.map +0 -1
  8. package/dist/commands/create.d.ts +0 -3
  9. package/dist/commands/create.d.ts.map +0 -1
  10. package/dist/commands/create.js +0 -55
  11. package/dist/commands/create.js.map +0 -1
  12. package/dist/commands/delete.d.ts +0 -3
  13. package/dist/commands/delete.d.ts.map +0 -1
  14. package/dist/commands/delete.js +0 -67
  15. package/dist/commands/delete.js.map +0 -1
  16. package/dist/commands/deploy.d.ts +0 -3
  17. package/dist/commands/deploy.d.ts.map +0 -1
  18. package/dist/commands/deploy.js +0 -336
  19. package/dist/commands/deploy.js.map +0 -1
  20. package/dist/commands/hello/index.d.ts +0 -3
  21. package/dist/commands/hello/index.d.ts.map +0 -1
  22. package/dist/commands/hello/index.js +0 -296
  23. package/dist/commands/hello/index.js.map +0 -1
  24. package/dist/commands/hello.d.ts +0 -3
  25. package/dist/commands/hello.d.ts.map +0 -1
  26. package/dist/commands/hello.js +0 -83
  27. package/dist/commands/hello.js.map +0 -1
  28. package/dist/commands/init.d.ts +0 -3
  29. package/dist/commands/init.d.ts.map +0 -1
  30. package/dist/commands/init.js +0 -137
  31. package/dist/commands/init.js.map +0 -1
  32. package/dist/commands/kill.d.ts +0 -3
  33. package/dist/commands/kill.d.ts.map +0 -1
  34. package/dist/commands/kill.js +0 -66
  35. package/dist/commands/kill.js.map +0 -1
  36. package/dist/commands/ls.d.ts +0 -3
  37. package/dist/commands/ls.d.ts.map +0 -1
  38. package/dist/commands/ls.js +0 -52
  39. package/dist/commands/ls.js.map +0 -1
  40. package/dist/commands/proxy.d.ts +0 -3
  41. package/dist/commands/proxy.d.ts.map +0 -1
  42. package/dist/commands/proxy.js +0 -86
  43. package/dist/commands/proxy.js.map +0 -1
  44. package/dist/commands/ps.d.ts +0 -3
  45. package/dist/commands/ps.d.ts.map +0 -1
  46. package/dist/commands/ps.js +0 -56
  47. package/dist/commands/ps.js.map +0 -1
  48. package/dist/commands/push.d.ts +0 -3
  49. package/dist/commands/push.d.ts.map +0 -1
  50. package/dist/commands/push.js +0 -238
  51. package/dist/commands/push.js.map +0 -1
  52. package/dist/commands/server.d.ts +0 -3
  53. package/dist/commands/server.d.ts.map +0 -1
  54. package/dist/commands/server.js +0 -676
  55. package/dist/commands/server.js.map +0 -1
  56. package/dist/commands/start.d.ts +0 -3
  57. package/dist/commands/start.d.ts.map +0 -1
  58. package/dist/commands/start.js +0 -82
  59. package/dist/commands/start.js.map +0 -1
  60. package/dist/commands/worker/commands.d.ts +0 -42
  61. package/dist/commands/worker/commands.d.ts.map +0 -1
  62. package/dist/commands/worker/commands.js +0 -968
  63. package/dist/commands/worker/commands.js.map +0 -1
  64. package/dist/commands/worker/index.d.ts +0 -7
  65. package/dist/commands/worker/index.d.ts.map +0 -1
  66. package/dist/commands/worker/index.js +0 -30
  67. package/dist/commands/worker/index.js.map +0 -1
  68. package/dist/commands/worker/utils/config.d.ts +0 -26
  69. package/dist/commands/worker/utils/config.d.ts.map +0 -1
  70. package/dist/commands/worker/utils/config.js +0 -197
  71. package/dist/commands/worker/utils/config.js.map +0 -1
  72. package/dist/commands/worker/utils/display.d.ts +0 -6
  73. package/dist/commands/worker/utils/display.d.ts.map +0 -1
  74. package/dist/commands/worker/utils/display.js +0 -32
  75. package/dist/commands/worker/utils/display.js.map +0 -1
  76. package/dist/commands/worker/utils/finder.d.ts +0 -12
  77. package/dist/commands/worker/utils/finder.d.ts.map +0 -1
  78. package/dist/commands/worker/utils/finder.js +0 -60
  79. package/dist/commands/worker/utils/finder.js.map +0 -1
  80. package/dist/config/environment.d.ts +0 -52
  81. package/dist/config/environment.d.ts.map +0 -1
  82. package/dist/config/environment.js +0 -83
  83. package/dist/config/environment.js.map +0 -1
  84. package/dist/index.d.ts +0 -1
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/index.js +0 -3
  87. package/dist/index.js.map +0 -1
  88. package/dist/lib/tonkAuth.d.ts +0 -21
  89. package/dist/lib/tonkAuth.d.ts.map +0 -1
  90. package/dist/lib/tonkAuth.js +0 -140
  91. package/dist/lib/tonkAuth.js.map +0 -1
  92. package/dist/lib/workerManager.d.ts +0 -60
  93. package/dist/lib/workerManager.d.ts.map +0 -1
  94. package/dist/lib/workerManager.js +0 -417
  95. package/dist/lib/workerManager.js.map +0 -1
  96. package/dist/scripts/aws/create-key.sh +0 -20
  97. package/dist/scripts/aws/ec2-dns.sh +0 -20
  98. package/dist/scripts/aws/provision.sh +0 -93
  99. package/dist/tonk.d.ts +0 -2
  100. package/dist/tonk.d.ts.map +0 -1
  101. package/dist/tonk.js +0 -106
  102. package/dist/tonk.js.map +0 -1
  103. package/dist/types/worker.d.ts +0 -161
  104. package/dist/types/worker.d.ts.map +0 -1
  105. package/dist/types/worker.js +0 -7
  106. package/dist/types/worker.js.map +0 -1
  107. package/dist/types/workerConfig.d.ts +0 -164
  108. package/dist/types/workerConfig.d.ts.map +0 -1
  109. package/dist/types/workerConfig.js +0 -80
  110. package/dist/types/workerConfig.js.map +0 -1
  111. package/dist/utils/analytics.d.ts +0 -26
  112. package/dist/utils/analytics.d.ts.map +0 -1
  113. package/dist/utils/analytics.js +0 -218
  114. package/dist/utils/analytics.js.map +0 -1
  115. package/dist/utils/messages.d.ts +0 -6
  116. package/dist/utils/messages.d.ts.map +0 -1
  117. package/dist/utils/messages.js +0 -18
  118. package/dist/utils/messages.js.map +0 -1
  119. package/dist/utils/serverUtils.d.ts +0 -5
  120. package/dist/utils/serverUtils.d.ts.map +0 -1
  121. package/dist/utils/serverUtils.js +0 -34
  122. package/dist/utils/serverUtils.js.map +0 -1
  123. package/dist/utils/version.d.ts +0 -2
  124. package/dist/utils/version.d.ts.map +0 -1
  125. package/dist/utils/version.js +0 -3
  126. package/dist/utils/version.js.map +0 -1
  127. package/scripts/aws/create-key.sh +0 -20
  128. package/scripts/aws/ec2-dns.sh +0 -20
  129. package/scripts/aws/provision.sh +0 -93
@@ -1,676 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import inquirer from 'inquirer';
4
- import ora from 'ora';
5
- import { trackCommand, trackCommandError, trackCommandSuccess, shutdownAnalytics, } from '../utils/analytics.js';
6
- // Lazy-load authHook to prevent initialization on import
7
- async function getAuthHook() {
8
- const { authHook } = await import('../lib/tonkAuth.js');
9
- return authHook;
10
- }
11
- // Lazy-load tonkAuth to get auth token
12
- async function getTonkAuth() {
13
- const { tonkAuth } = await import('../lib/tonkAuth.js');
14
- return tonkAuth;
15
- }
16
- import { getDeploymentServiceUrl, config } from '../config/environment.js';
17
- import { fetchUserServers } from '../utils/serverUtils.js';
18
- // Privileged subdomain names that cannot be used as server names
19
- const PRIVILEGED_SUBDOMAINS = [
20
- 'accounts',
21
- 'clerk',
22
- 'clkmail',
23
- 'dashboard',
24
- 'tinyfoot',
25
- ];
26
- /**
27
- * Checks if the deployment service is reachable
28
- */
29
- async function checkDeploymentService() {
30
- try {
31
- const response = await fetch(`${getDeploymentServiceUrl()}/health`);
32
- if (!response.ok) {
33
- throw new Error(`Service returned ${response.status}`);
34
- }
35
- }
36
- catch {
37
- console.error(chalk.red('Error: Tonk deployment service is not available.'));
38
- console.log(chalk.yellow('Please reach out for support or try again later.'));
39
- await shutdownAnalytics();
40
- process.exitCode = 1;
41
- return;
42
- }
43
- }
44
- /**
45
- * Validates that a server name is not a privileged subdomain
46
- */
47
- function validateServerName(serverName) {
48
- if (!serverName || serverName.trim().length === 0) {
49
- return 'Server name is required';
50
- }
51
- if (PRIVILEGED_SUBDOMAINS.includes(serverName.toLowerCase())) {
52
- return `Server name "${serverName}" is reserved and cannot be used. Please choose a different name.`;
53
- }
54
- return true;
55
- }
56
- /**
57
- * Gets server name from user if not provided
58
- */
59
- async function getServerName(serverName) {
60
- if (serverName) {
61
- return serverName;
62
- }
63
- const { inputName } = await inquirer.prompt([
64
- {
65
- type: 'input',
66
- name: 'inputName',
67
- message: 'Enter your Tonk server name:',
68
- validate: validateServerName,
69
- },
70
- ]);
71
- return inputName.trim();
72
- }
73
- /**
74
- * Deletes a server
75
- */
76
- async function deleteServer(serverName) {
77
- // Get auth token
78
- const tonkAuth = await getTonkAuth();
79
- const authToken = await tonkAuth.getAuthToken();
80
- if (!authToken) {
81
- throw new Error('Failed to get authentication token');
82
- }
83
- const formData = new FormData();
84
- formData.append('serverData', JSON.stringify({
85
- serverName,
86
- }));
87
- const response = await fetch(`${getDeploymentServiceUrl()}/delete-server`, {
88
- method: 'POST',
89
- headers: {
90
- Authorization: `Bearer ${authToken}`,
91
- },
92
- body: formData,
93
- });
94
- // Get response text first to check if it's HTML
95
- const responseText = await response.text();
96
- // Try to parse as JSON
97
- let result;
98
- try {
99
- result = JSON.parse(responseText);
100
- }
101
- catch {
102
- console.error('Failed to parse response as JSON');
103
- console.error('Full response:', responseText);
104
- throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
105
- }
106
- if (!response.ok || !result.success) {
107
- throw new Error(result.error || 'Failed to delete server');
108
- }
109
- console.log(chalk.green('Server deleted successfully!'));
110
- console.log(chalk.green(result.message));
111
- }
112
- /**
113
- * Creates a new Tonk server
114
- */
115
- async function createServer(serverName, options) {
116
- const spinner = ora('Creating Tonk server...').start();
117
- try {
118
- // Get auth token
119
- const tonkAuth = await getTonkAuth();
120
- const authToken = await tonkAuth.getAuthToken();
121
- if (!authToken) {
122
- throw new Error('Failed to get authentication token');
123
- }
124
- // Prepare form data for server creation
125
- const formData = new FormData();
126
- const serverData = {
127
- serverName,
128
- region: options.region || 'ord',
129
- memory: options.memory || '1gb',
130
- cpus: options.cpus || '1',
131
- remote: options.remote || false,
132
- deployType: 'server',
133
- };
134
- formData.append('serverData', JSON.stringify(serverData));
135
- const url = `${getDeploymentServiceUrl()}/create-server`;
136
- // Send server creation request
137
- spinner.text = 'Creating server...';
138
- const response = await fetch(url, {
139
- method: 'POST',
140
- headers: {
141
- Authorization: `Bearer ${authToken}`,
142
- },
143
- body: formData,
144
- });
145
- // Get response text first to check if it's HTML
146
- const responseText = await response.text();
147
- // Try to parse as JSON
148
- let result;
149
- try {
150
- result = JSON.parse(responseText);
151
- }
152
- catch {
153
- console.error('Failed to parse response as JSON');
154
- console.error('Full response:', responseText);
155
- throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
156
- }
157
- if (!response.ok || !result.success) {
158
- const errorMessage = result.error || 'Server creation failed';
159
- // Check for name conflict errors
160
- if (errorMessage.toLowerCase().includes('already exists') ||
161
- errorMessage.toLowerCase().includes('name is taken') ||
162
- errorMessage.toLowerCase().includes('name already taken') ||
163
- errorMessage.toLowerCase().includes('already in use') ||
164
- errorMessage.toLowerCase().includes('conflict')) {
165
- throw new Error(`Server name "${serverName}" is already taken. Please choose a different server name and try again.`);
166
- }
167
- throw new Error(errorMessage);
168
- }
169
- spinner.succeed('Server created successfully!');
170
- console.log(chalk.green(`🚀 Your Tonk server is ready!`));
171
- console.log(chalk.blue(` URL: ${result.serverUrl}`));
172
- console.log(chalk.yellow(` Use this server name for future bundle deployments: ${serverName}`));
173
- }
174
- catch (error) {
175
- spinner.fail('Server creation failed');
176
- throw error;
177
- }
178
- }
179
- /**
180
- * Lists bundles on a remote server
181
- */
182
- async function listRemoteBundles(serverName) {
183
- // Get auth token
184
- const tonkAuth = await getTonkAuth();
185
- const authToken = await tonkAuth.getAuthToken();
186
- if (!authToken) {
187
- throw new Error('Failed to get authentication token');
188
- }
189
- const formData = new FormData();
190
- formData.append('requestData', JSON.stringify({
191
- serverName,
192
- action: 'ls',
193
- }));
194
- const response = await fetch(`${getDeploymentServiceUrl()}/server-action`, {
195
- method: 'POST',
196
- headers: {
197
- Authorization: `Bearer ${authToken}`,
198
- },
199
- body: formData,
200
- });
201
- // Get response text first to check if it's HTML
202
- const responseText = await response.text();
203
- // Try to parse as JSON
204
- let result;
205
- try {
206
- result = JSON.parse(responseText);
207
- }
208
- catch {
209
- console.error('Failed to parse response as JSON');
210
- console.error('Full response:', responseText);
211
- throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
212
- }
213
- if (!response.ok || !result.success) {
214
- throw new Error(result.error || 'Failed to list bundles');
215
- }
216
- if (result.bundles && result.bundles.length > 0) {
217
- console.log(chalk.green(`📦 Bundles on server "${serverName}":`));
218
- result.bundles.forEach((bundle) => {
219
- console.log(chalk.blue(` • ${bundle}`));
220
- });
221
- }
222
- else {
223
- console.log(chalk.yellow(`No bundles found on server "${serverName}"`));
224
- }
225
- }
226
- /**
227
- * Lists running bundles on a remote server
228
- */
229
- async function listRunningBundles(serverName) {
230
- // Get auth token
231
- const tonkAuth = await getTonkAuth();
232
- const authToken = await tonkAuth.getAuthToken();
233
- if (!authToken) {
234
- throw new Error('Failed to get authentication token');
235
- }
236
- const formData = new FormData();
237
- formData.append('requestData', JSON.stringify({
238
- serverName,
239
- action: 'ps',
240
- }));
241
- const response = await fetch(`${getDeploymentServiceUrl()}/server-action`, {
242
- method: 'POST',
243
- headers: {
244
- Authorization: `Bearer ${authToken}`,
245
- },
246
- body: formData,
247
- });
248
- // Get response text first to check if it's HTML
249
- const responseText = await response.text();
250
- // Try to parse as JSON
251
- let result;
252
- try {
253
- result = JSON.parse(responseText);
254
- }
255
- catch {
256
- console.error('Failed to parse response as JSON');
257
- console.error('Full response:', responseText);
258
- throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
259
- }
260
- if (!response.ok || !result.success) {
261
- throw new Error(result.error || 'Failed to list running bundles');
262
- }
263
- if (result.processes && result.processes.length > 0) {
264
- console.log(chalk.green(`🏃 Running bundles on server "${serverName}":`));
265
- result.processes.forEach((process) => {
266
- console.log(chalk.blue(` • ${process.bundleName} (${process.id})`));
267
- console.log(chalk.gray(` Route: ${process.route}`));
268
- console.log(chalk.gray(` Status: ${process.status}`));
269
- if (process.url) {
270
- console.log(chalk.gray(` URL: ${process.url}`));
271
- }
272
- console.log('');
273
- });
274
- }
275
- else {
276
- console.log(chalk.yellow(`No running bundles on server "${serverName}"`));
277
- }
278
- }
279
- /**
280
- * Deletes a bundle from a remote server
281
- */
282
- async function deleteRemoteBundle(bundleName, serverName) {
283
- // Get auth token
284
- const tonkAuth = await getTonkAuth();
285
- const authToken = await tonkAuth.getAuthToken();
286
- if (!authToken) {
287
- throw new Error('Failed to get authentication token');
288
- }
289
- const formData = new FormData();
290
- formData.append('deleteData', JSON.stringify({
291
- bundleName,
292
- serverName,
293
- deployType: 'delete',
294
- }));
295
- const response = await fetch(`${getDeploymentServiceUrl()}/delete-bundle`, {
296
- method: 'POST',
297
- headers: {
298
- Authorization: `Bearer ${authToken}`,
299
- },
300
- body: formData,
301
- });
302
- // Get response text first to check if it's HTML
303
- const responseText = await response.text();
304
- // Try to parse as JSON
305
- let result;
306
- try {
307
- result = JSON.parse(responseText);
308
- }
309
- catch {
310
- console.error('Failed to parse response as JSON');
311
- console.error('Full response:', responseText);
312
- throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
313
- }
314
- if (!response.ok || !result.success) {
315
- throw new Error(result.error || 'Failed to delete bundle');
316
- }
317
- console.log(chalk.green('Bundle deleted successfully!'));
318
- console.log(chalk.green(result.message));
319
- }
320
- /**
321
- * Server create command handler
322
- */
323
- async function handleServerCreateCommand(options) {
324
- const startTime = Date.now();
325
- let tonkAuth = null;
326
- try {
327
- // Run auth check (replaces the preAction hook)
328
- const authHook = await getAuthHook();
329
- await authHook();
330
- // Get TonkAuth instance for cleanup
331
- tonkAuth = await getTonkAuth();
332
- trackCommand('server-create', {
333
- name: options.name,
334
- region: options.region,
335
- memory: options.memory,
336
- cpus: options.cpus,
337
- remote: options.remote,
338
- });
339
- console.log(chalk.cyan('🔧 Tonk Server Create\n'));
340
- // Check prerequisites
341
- console.log(chalk.blue('Checking prerequisites...'));
342
- await checkDeploymentService();
343
- // Determine server name
344
- let serverName = options.name;
345
- if (!serverName) {
346
- const { inputName } = await inquirer.prompt([
347
- {
348
- type: 'input',
349
- name: 'inputName',
350
- message: 'Enter server name:',
351
- validate: validateServerName,
352
- },
353
- ]);
354
- serverName = inputName
355
- .trim()
356
- .replace(/[^a-zA-Z0-9-]/g, '-')
357
- .toLowerCase();
358
- }
359
- else {
360
- // Validate provided server name
361
- const validation = validateServerName(serverName);
362
- if (validation !== true) {
363
- throw new Error(validation);
364
- }
365
- }
366
- console.log(chalk.green(`✓ Server name: ${serverName}`));
367
- // Confirm server creation
368
- const { confirm } = await inquirer.prompt([
369
- {
370
- type: 'confirm',
371
- name: 'confirm',
372
- message: `Create Tonk server "${serverName}"?`,
373
- default: true,
374
- },
375
- ]);
376
- if (!confirm) {
377
- console.log(chalk.yellow('Server creation cancelled'));
378
- await shutdownAnalytics();
379
- return;
380
- }
381
- // Create the server
382
- await createServer(serverName, options);
383
- const duration = Date.now() - startTime;
384
- trackCommandSuccess('server-create', duration, {
385
- serverName,
386
- region: options.region,
387
- memory: options.memory,
388
- cpus: options.cpus,
389
- remote: options.remote,
390
- });
391
- await shutdownAnalytics();
392
- if (tonkAuth)
393
- tonkAuth.destroy();
394
- }
395
- catch (error) {
396
- const duration = Date.now() - startTime;
397
- trackCommandError('server-create', error, duration, {
398
- name: options.name,
399
- region: options.region,
400
- });
401
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
402
- await shutdownAnalytics();
403
- if (tonkAuth)
404
- tonkAuth.destroy();
405
- process.exitCode = 1;
406
- }
407
- }
408
- // Server create command
409
- const serverCreateCommand = new Command('create')
410
- .description('Create a new Tonk server')
411
- .option('-n, --name <name>', 'Name for the server')
412
- .option('-r, --region <region>', 'Region to deploy to', config.deployment.defaultRegion)
413
- .option('-m, --memory <memory>', 'Memory allocation (e.g., 256mb, 1gb)', config.deployment.defaultMemory)
414
- .option('-c, --cpus <cpus>', 'Number of CPUs', config.deployment.defaultCpus)
415
- .option('--remote', 'Use remote Docker build (slower but works with limited local resources)')
416
- .action(handleServerCreateCommand);
417
- // Server ls command
418
- const serverLsCommand = new Command('ls')
419
- .description('List bundles on a remote Tonk server')
420
- .option('-s, --server <server>', 'Name of the Tonk server')
421
- .action(async (options) => {
422
- const startTime = Date.now();
423
- let tonkAuth = null;
424
- try {
425
- // Run auth check (replaces the preAction hook)
426
- const authHook = await getAuthHook();
427
- await authHook();
428
- // Get TonkAuth instance for cleanup
429
- tonkAuth = await getTonkAuth();
430
- trackCommand('server-ls', {
431
- server: options.server,
432
- });
433
- console.log(chalk.cyan('📋 Server Bundle List\n'));
434
- // Check prerequisites
435
- await checkDeploymentService();
436
- // Get server name
437
- const serverName = await getServerName(options.server);
438
- // List bundles
439
- await listRemoteBundles(serverName);
440
- const duration = Date.now() - startTime;
441
- trackCommandSuccess('server-ls', duration, {
442
- serverName,
443
- });
444
- await shutdownAnalytics();
445
- if (tonkAuth)
446
- tonkAuth.destroy();
447
- }
448
- catch (error) {
449
- const duration = Date.now() - startTime;
450
- trackCommandError('server-ls', error, duration, {
451
- server: options.server,
452
- });
453
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
454
- await shutdownAnalytics();
455
- if (tonkAuth)
456
- tonkAuth.destroy();
457
- process.exitCode = 1;
458
- }
459
- });
460
- // Server ps command
461
- const serverPsCommand = new Command('ps')
462
- .description('List running bundles on a remote Tonk server')
463
- .option('-s, --server <server>', 'Name of the Tonk server')
464
- .action(async (options) => {
465
- const startTime = Date.now();
466
- let tonkAuth = null;
467
- try {
468
- // Run auth check (replaces the preAction hook)
469
- const authHook = await getAuthHook();
470
- await authHook();
471
- // Get TonkAuth instance for cleanup
472
- tonkAuth = await getTonkAuth();
473
- trackCommand('server-ps', {
474
- server: options.server,
475
- });
476
- console.log(chalk.cyan('🏃 Server Running Bundles\n'));
477
- // Check prerequisites
478
- await checkDeploymentService();
479
- // Get server name
480
- const serverName = await getServerName(options.server);
481
- // List running bundles
482
- await listRunningBundles(serverName);
483
- const duration = Date.now() - startTime;
484
- trackCommandSuccess('server-ps', duration, {
485
- serverName,
486
- });
487
- await shutdownAnalytics();
488
- if (tonkAuth)
489
- tonkAuth.destroy();
490
- }
491
- catch (error) {
492
- const duration = Date.now() - startTime;
493
- trackCommandError('server-ps', error, duration, {
494
- server: options.server,
495
- });
496
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
497
- await shutdownAnalytics();
498
- if (tonkAuth)
499
- tonkAuth.destroy();
500
- process.exitCode = 1;
501
- }
502
- });
503
- // Server destroy command
504
- const serverDestroyCommand = new Command('destroy')
505
- .description('Permanently delete a Tonk server and all its data')
506
- .action(async () => {
507
- const startTime = Date.now();
508
- let tonkAuth = null;
509
- try {
510
- // Run auth check
511
- const authHook = await getAuthHook();
512
- await authHook();
513
- // Get TonkAuth instance for cleanup
514
- tonkAuth = await getTonkAuth();
515
- trackCommand('server-destroy', {});
516
- console.log(chalk.red('⚠️ Server Destruction\n'));
517
- console.log(chalk.yellow('WARNING: This will permanently delete your server and all data!'));
518
- console.log(chalk.yellow('This action cannot be undone.\n'));
519
- // Check prerequisites
520
- await checkDeploymentService();
521
- // Fetch user's servers
522
- console.log(chalk.blue('Fetching your servers...'));
523
- let userServers = [];
524
- try {
525
- userServers = await fetchUserServers();
526
- }
527
- catch (error) {
528
- console.error(chalk.red(`Error fetching servers: ${error instanceof Error ? error.message : String(error)}`));
529
- await shutdownAnalytics();
530
- process.exitCode = 1;
531
- return;
532
- }
533
- if (userServers.length === 0) {
534
- console.log(chalk.yellow('No servers found in your account.'));
535
- await shutdownAnalytics();
536
- return;
537
- }
538
- // Server selection
539
- let serverName;
540
- if (userServers.length === 1) {
541
- const { confirmSingle } = await inquirer.prompt([
542
- {
543
- type: 'confirm',
544
- name: 'confirmSingle',
545
- message: `Delete your only server '${userServers[0]}'?`,
546
- default: false,
547
- },
548
- ]);
549
- if (!confirmSingle) {
550
- console.log(chalk.yellow('Server deletion cancelled'));
551
- await shutdownAnalytics();
552
- return;
553
- }
554
- serverName = userServers[0];
555
- }
556
- else {
557
- const { selectedServer } = await inquirer.prompt([
558
- {
559
- type: 'list',
560
- name: 'selectedServer',
561
- message: `Select a server to PERMANENTLY DELETE (${userServers.length} available):`,
562
- choices: userServers,
563
- },
564
- ]);
565
- serverName = selectedServer;
566
- }
567
- // Final confirmation - require typing server name
568
- const { confirmName } = await inquirer.prompt([
569
- {
570
- type: 'input',
571
- name: 'confirmName',
572
- message: `Type the server name '${serverName}' to confirm deletion:`,
573
- validate: (input) => {
574
- if (input.trim() !== serverName) {
575
- return `Please type exactly '${serverName}' to confirm`;
576
- }
577
- return true;
578
- },
579
- },
580
- ]);
581
- if (confirmName.trim() !== serverName) {
582
- console.log(chalk.yellow('Server deletion cancelled'));
583
- await shutdownAnalytics();
584
- return;
585
- }
586
- // Delete the server
587
- console.log(chalk.red(`\nDeleting server '${serverName}'...`));
588
- await deleteServer(serverName);
589
- const duration = Date.now() - startTime;
590
- trackCommandSuccess('server-destroy', duration, {
591
- serverName,
592
- });
593
- await shutdownAnalytics();
594
- if (tonkAuth)
595
- tonkAuth.destroy();
596
- }
597
- catch (error) {
598
- const duration = Date.now() - startTime;
599
- trackCommandError('server-destroy', error, duration, {});
600
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
601
- await shutdownAnalytics();
602
- if (tonkAuth)
603
- tonkAuth.destroy();
604
- process.exitCode = 1;
605
- }
606
- });
607
- // Server rm command
608
- const serverRmCommand = new Command('rm')
609
- .alias('delete')
610
- .description('Delete a bundle from a remote Tonk server')
611
- .option('-s, --server <server>', 'Name of the Tonk server')
612
- .argument('<bundleName>', 'Name of the bundle to delete')
613
- .action(async (bundleName, options) => {
614
- const startTime = Date.now();
615
- let tonkAuth = null;
616
- try {
617
- // Run auth check (replaces the preAction hook)
618
- const authHook = await getAuthHook();
619
- await authHook();
620
- // Get TonkAuth instance for cleanup
621
- tonkAuth = await getTonkAuth();
622
- trackCommand('server-rm', {
623
- bundleName,
624
- server: options.server,
625
- });
626
- console.log(chalk.cyan('🗑️ Server Bundle Delete\n'));
627
- // Check prerequisites
628
- await checkDeploymentService();
629
- // Get server name
630
- const serverName = await getServerName(options.server);
631
- // Confirm deletion
632
- const { confirm } = await inquirer.prompt([
633
- {
634
- type: 'confirm',
635
- name: 'confirm',
636
- message: `Delete bundle "${bundleName}" from server "${serverName}"?`,
637
- default: false,
638
- },
639
- ]);
640
- if (!confirm) {
641
- console.log(chalk.yellow('Bundle deletion cancelled'));
642
- await shutdownAnalytics();
643
- return;
644
- }
645
- // Delete bundle
646
- await deleteRemoteBundle(bundleName, serverName);
647
- const duration = Date.now() - startTime;
648
- trackCommandSuccess('server-rm', duration, {
649
- bundleName,
650
- serverName,
651
- });
652
- await shutdownAnalytics();
653
- if (tonkAuth)
654
- tonkAuth.destroy();
655
- }
656
- catch (error) {
657
- const duration = Date.now() - startTime;
658
- trackCommandError('server-rm', error, duration, {
659
- bundleName,
660
- server: options.server,
661
- });
662
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
663
- await shutdownAnalytics();
664
- if (tonkAuth)
665
- tonkAuth.destroy();
666
- process.exitCode = 1;
667
- }
668
- });
669
- // Main server command
670
- export const serverCommand = new Command('server').description('Manage Tonk servers');
671
- serverCommand.addCommand(serverCreateCommand);
672
- serverCommand.addCommand(serverLsCommand);
673
- serverCommand.addCommand(serverPsCommand);
674
- serverCommand.addCommand(serverRmCommand);
675
- serverCommand.addCommand(serverDestroyCommand);
676
- //# sourceMappingURL=server.js.map