lua-cli 3.2.0 → 3.4.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.
Files changed (121) hide show
  1. package/dist/api/logs.api.service.d.ts +1 -1
  2. package/dist/api/logs.api.service.js.map +1 -1
  3. package/dist/api/products.api.service.d.ts +17 -5
  4. package/dist/api/products.api.service.js +21 -9
  5. package/dist/api/products.api.service.js.map +1 -1
  6. package/dist/api/webhook.api.service.d.ts +4 -0
  7. package/dist/api/webhook.api.service.js.map +1 -1
  8. package/dist/api-exports.d.ts +19 -7
  9. package/dist/api-exports.js +20 -5
  10. package/dist/api-exports.js.map +1 -1
  11. package/dist/cli/command-definitions.js +323 -88
  12. package/dist/cli/command-definitions.js.map +1 -1
  13. package/dist/commands/apiKey.d.ts +5 -2
  14. package/dist/commands/apiKey.js +8 -2
  15. package/dist/commands/apiKey.js.map +1 -1
  16. package/dist/commands/channels.d.ts +4 -9
  17. package/dist/commands/channels.js +140 -84
  18. package/dist/commands/channels.js.map +1 -1
  19. package/dist/commands/chat.d.ts +4 -2
  20. package/dist/commands/chat.js +126 -32
  21. package/dist/commands/chat.js.map +1 -1
  22. package/dist/commands/chatClear.d.ts +3 -2
  23. package/dist/commands/chatClear.js +16 -15
  24. package/dist/commands/chatClear.js.map +1 -1
  25. package/dist/commands/compile.d.ts +5 -4
  26. package/dist/commands/compile.js +73 -9
  27. package/dist/commands/compile.js.map +1 -1
  28. package/dist/commands/deploy.d.ts +5 -24
  29. package/dist/commands/deploy.js +75 -48
  30. package/dist/commands/deploy.js.map +1 -1
  31. package/dist/commands/destroy.d.ts +5 -2
  32. package/dist/commands/destroy.js +14 -2
  33. package/dist/commands/destroy.js.map +1 -1
  34. package/dist/commands/env.d.ts +3 -1
  35. package/dist/commands/env.js +322 -122
  36. package/dist/commands/env.js.map +1 -1
  37. package/dist/commands/features.d.ts +5 -9
  38. package/dist/commands/features.js +249 -129
  39. package/dist/commands/features.js.map +1 -1
  40. package/dist/commands/init.d.ts +7 -1
  41. package/dist/commands/init.js +242 -59
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/jobs.d.ts +5 -13
  44. package/dist/commands/jobs.js +523 -360
  45. package/dist/commands/jobs.js.map +1 -1
  46. package/dist/commands/logs.d.ts +5 -10
  47. package/dist/commands/logs.js +259 -103
  48. package/dist/commands/logs.js.map +1 -1
  49. package/dist/commands/marketplace.d.ts +23 -2
  50. package/dist/commands/marketplace.js +530 -7
  51. package/dist/commands/marketplace.js.map +1 -1
  52. package/dist/commands/mcp.d.ts +5 -11
  53. package/dist/commands/mcp.js +304 -294
  54. package/dist/commands/mcp.js.map +1 -1
  55. package/dist/commands/persona.d.ts +5 -9
  56. package/dist/commands/persona.js +349 -232
  57. package/dist/commands/persona.js.map +1 -1
  58. package/dist/commands/postprocessors.d.ts +6 -2
  59. package/dist/commands/postprocessors.js +387 -280
  60. package/dist/commands/postprocessors.js.map +1 -1
  61. package/dist/commands/preprocessors.d.ts +6 -2
  62. package/dist/commands/preprocessors.js +387 -280
  63. package/dist/commands/preprocessors.js.map +1 -1
  64. package/dist/commands/production.d.ts +5 -8
  65. package/dist/commands/production.js +317 -228
  66. package/dist/commands/production.js.map +1 -1
  67. package/dist/commands/push.js +385 -427
  68. package/dist/commands/push.js.map +1 -1
  69. package/dist/commands/resources.d.ts +5 -10
  70. package/dist/commands/resources.js +219 -154
  71. package/dist/commands/resources.js.map +1 -1
  72. package/dist/commands/skills.d.ts +5 -9
  73. package/dist/commands/skills.js +435 -275
  74. package/dist/commands/skills.js.map +1 -1
  75. package/dist/commands/sync.d.ts +10 -8
  76. package/dist/commands/sync.js +110 -19
  77. package/dist/commands/sync.js.map +1 -1
  78. package/dist/commands/test.d.ts +1 -11
  79. package/dist/commands/test.js +395 -438
  80. package/dist/commands/test.js.map +1 -1
  81. package/dist/commands/webhooks.d.ts +5 -11
  82. package/dist/commands/webhooks.js +431 -287
  83. package/dist/commands/webhooks.js.map +1 -1
  84. package/dist/interfaces/index.d.ts +1 -1
  85. package/dist/interfaces/mcp.d.ts +39 -19
  86. package/dist/interfaces/mcp.js +3 -0
  87. package/dist/interfaces/mcp.js.map +1 -1
  88. package/dist/interfaces/product.d.ts +26 -0
  89. package/dist/interfaces/skills.d.ts +5 -0
  90. package/dist/types/api-contracts.d.ts +8 -4
  91. package/dist/types/index.d.ts +1 -1
  92. package/dist/types/index.js.map +1 -1
  93. package/dist/types/skill.d.ts +146 -35
  94. package/dist/types/skill.js +31 -37
  95. package/dist/types/skill.js.map +1 -1
  96. package/dist/utils/bundling.d.ts +17 -0
  97. package/dist/utils/bundling.js +96 -0
  98. package/dist/utils/bundling.js.map +1 -1
  99. package/dist/utils/compile.d.ts +4 -0
  100. package/dist/utils/compile.js +5 -0
  101. package/dist/utils/compile.js.map +1 -1
  102. package/dist/utils/dev-helpers.d.ts +3 -2
  103. package/dist/utils/dev-helpers.js +3 -5
  104. package/dist/utils/dev-helpers.js.map +1 -1
  105. package/dist/utils/job-management.d.ts +4 -1
  106. package/dist/utils/job-management.js +15 -29
  107. package/dist/utils/job-management.js.map +1 -1
  108. package/dist/utils/mcp-server-management.d.ts +5 -2
  109. package/dist/utils/mcp-server-management.js +27 -43
  110. package/dist/utils/mcp-server-management.js.map +1 -1
  111. package/dist/utils/push-helpers.d.ts +1 -1
  112. package/dist/utils/push-helpers.js +5 -1
  113. package/dist/utils/push-helpers.js.map +1 -1
  114. package/dist/utils/skill-management.d.ts +7 -2
  115. package/dist/utils/skill-management.js +21 -30
  116. package/dist/utils/skill-management.js.map +1 -1
  117. package/dist/utils/webhook-management.d.ts +4 -1
  118. package/dist/utils/webhook-management.js +15 -29
  119. package/dist/utils/webhook-management.js.map +1 -1
  120. package/package.json +1 -1
  121. package/template/package.json +1 -1
@@ -9,21 +9,21 @@ import { BASE_URLS } from '../config/constants.js';
9
9
  import { safePrompt } from '../utils/prompt-handler.js';
10
10
  import { validateConfig, validateAgentConfig, } from '../utils/dev-helpers.js';
11
11
  import DeveloperApi from '../api/developer.api.service.js';
12
+ // ─────────────────────────────────────────────────────────────────────────────
13
+ // Main Command Entry
14
+ // ─────────────────────────────────────────────────────────────────────────────
12
15
  /**
13
- * Main MCP command - manages MCP servers
16
+ * Main MCP command - manages MCP servers.
14
17
  *
15
- * Subcommands:
16
- * - lua mcp list - List all MCP servers
17
- * - lua mcp activate - Activate an MCP server
18
- * - lua mcp deactivate - Deactivate an MCP server
19
- * - lua mcp delete - Delete an MCP server
20
- *
21
- * @param action - Optional action ('list', 'activate', 'deactivate', 'delete')
22
- * @param serverName - Optional server name for actions
23
- * @returns Promise that resolves when command completes
18
+ * Supports both interactive and non-interactive modes:
19
+ * - Interactive: menu-driven server management
20
+ * - Non-interactive: action + -i flag or positional server name
24
21
  */
25
- export async function mcpCommand(action, serverName) {
22
+ export async function mcpCommand(action, serverNamePositional, cmdObj) {
26
23
  return withErrorHandling(async () => {
24
+ const options = {
25
+ serverName: cmdObj?.serverName || serverNamePositional || null,
26
+ };
27
27
  // Step 1: Load configuration
28
28
  const config = readSkillConfig();
29
29
  validateConfig(config);
@@ -43,352 +43,362 @@ export async function mcpCommand(action, serverName) {
43
43
  apiKey,
44
44
  developerApi,
45
45
  };
46
- // Step 3: Handle action or show interactive menu
46
+ // Determine mode
47
47
  if (action) {
48
- const normalizedAction = action.toLowerCase();
49
- switch (normalizedAction) {
50
- case 'list':
51
- case 'ls':
52
- await listMCPServers(context);
53
- break;
54
- case 'activate':
55
- case 'enable':
56
- await activateMCPServer(context, serverName);
57
- break;
58
- case 'deactivate':
59
- case 'disable':
60
- await deactivateMCPServer(context, serverName);
61
- break;
62
- case 'delete':
63
- case 'rm':
64
- await deleteMCPServer(context, serverName);
65
- break;
66
- default:
67
- console.error(`❌ Unknown action: "${action}"`);
68
- showUsage();
69
- process.exit(1);
70
- }
48
+ await executeNonInteractive(context, action, options);
71
49
  }
72
50
  else {
73
- // Interactive mode
74
51
  await interactiveMCPManagement(context);
75
52
  }
76
53
  }, "mcp");
77
54
  }
55
+ // ─────────────────────────────────────────────────────────────────────────────
56
+ // Shared Core Functions
57
+ // ─────────────────────────────────────────────────────────────────────────────
78
58
  /**
79
- * Show usage information
59
+ * Fetches all MCP servers from the API.
80
60
  */
81
- function showUsage() {
82
- console.log('\nUsage:');
83
- console.log(' lua mcp - Interactive MCP server management');
84
- console.log(' lua mcp list - List all MCP servers');
85
- console.log(' lua mcp activate [name] - Activate an MCP server');
86
- console.log(' lua mcp deactivate [name] - Deactivate an MCP server');
87
- console.log(' lua mcp delete [name] - Delete an MCP server');
88
- console.log('\nAliases:');
89
- console.log(' list → ls');
90
- console.log(' activate → enable');
91
- console.log(' deactivate → disable');
92
- console.log(' delete → rm');
93
- }
94
- /**
95
- * Interactive MCP management
96
- */
97
- async function interactiveMCPManagement(context) {
98
- let continueManaging = true;
99
- while (continueManaging) {
100
- console.log("\n" + "=".repeat(60));
101
- console.log("🔌 MCP Server Management");
102
- console.log("=".repeat(60) + "\n");
103
- const actionAnswer = await safePrompt([
104
- {
105
- type: 'list',
106
- name: 'action',
107
- message: 'What would you like to do?',
108
- choices: [
109
- { name: '📋 List MCP servers', value: 'list' },
110
- { name: '✅ Activate a server', value: 'activate' },
111
- { name: '⏸️ Deactivate a server', value: 'deactivate' },
112
- { name: '🗑️ Delete a server', value: 'delete' },
113
- { name: '❌ Exit', value: 'exit' }
114
- ]
115
- }
116
- ]);
117
- if (!actionAnswer)
118
- return;
119
- const { action } = actionAnswer;
120
- switch (action) {
121
- case 'list':
122
- await listMCPServers(context);
123
- break;
124
- case 'activate':
125
- await activateMCPServer(context);
126
- break;
127
- case 'deactivate':
128
- await deactivateMCPServer(context);
129
- break;
130
- case 'delete':
131
- await deleteMCPServer(context);
132
- break;
133
- case 'exit':
134
- continueManaging = false;
135
- console.log("\n👋 Goodbye!\n");
136
- break;
137
- }
138
- }
139
- }
140
- /**
141
- * List all MCP servers
142
- */
143
- async function listMCPServers(context) {
144
- writeProgress("🔄 Loading MCP servers...");
61
+ async function fetchServersCore(context) {
145
62
  try {
146
63
  const result = await context.developerApi.getMCPServers();
147
64
  if (!result.success) {
148
- console.error(`\n❌ Failed to load MCP servers: ${result.error?.message}\n`);
149
- return;
65
+ console.error(`❌ Failed to load MCP servers: ${result.error?.message}`);
66
+ return null;
150
67
  }
151
- const servers = result.data || [];
152
- console.log("\n" + "=".repeat(60));
153
- console.log("🔌 MCP Servers");
154
- console.log("=".repeat(60) + "\n");
155
- if (servers.length === 0) {
156
- console.log("ℹ️ No MCP servers found.");
157
- console.log("💡 Define MCP servers in your LuaAgent configuration and run 'lua push all'.\n");
158
- return;
159
- }
160
- // Separate active and inactive servers
161
- const activeServers = servers.filter((s) => s.active);
162
- const inactiveServers = servers.filter((s) => !s.active);
163
- if (activeServers.length > 0) {
164
- console.log("✅ Active Servers:\n");
165
- activeServers.forEach((server) => {
166
- printServerInfo(server);
167
- });
168
- }
169
- if (inactiveServers.length > 0) {
170
- if (activeServers.length > 0)
171
- console.log("─".repeat(40) + "\n");
172
- console.log("⏸️ Inactive Servers:\n");
173
- inactiveServers.forEach((server) => {
174
- printServerInfo(server);
175
- });
176
- }
177
- console.log("=".repeat(60) + "\n");
68
+ return result.data || [];
178
69
  }
179
70
  catch (error) {
180
- console.error('\n❌ Error loading MCP servers:', error.message);
71
+ console.error('❌ Error loading MCP servers:', error.message);
72
+ return null;
181
73
  }
182
74
  }
183
75
  /**
184
- * Print server information
76
+ * Displays all MCP servers with status.
77
+ */
78
+ function displayServersCore(servers) {
79
+ console.log("\n" + "=".repeat(60));
80
+ console.log("🔌 MCP Servers");
81
+ console.log("=".repeat(60) + "\n");
82
+ if (servers.length === 0) {
83
+ console.log("ℹ️ No MCP servers found.");
84
+ console.log("💡 Define MCP servers in your LuaAgent configuration and run 'lua push all'.\n");
85
+ return;
86
+ }
87
+ const activeServers = servers.filter((s) => s.active);
88
+ const inactiveServers = servers.filter((s) => !s.active);
89
+ if (activeServers.length > 0) {
90
+ console.log("✅ Active Servers:\n");
91
+ activeServers.forEach((server) => printServerInfo(server));
92
+ }
93
+ if (inactiveServers.length > 0) {
94
+ if (activeServers.length > 0)
95
+ console.log("─".repeat(40) + "\n");
96
+ console.log("⏸️ Inactive Servers:\n");
97
+ inactiveServers.forEach((server) => printServerInfo(server));
98
+ }
99
+ console.log("=".repeat(60));
100
+ }
101
+ /**
102
+ * Print server information.
185
103
  */
186
104
  function printServerInfo(server) {
187
105
  const statusIcon = server.active ? '🟢' : '⚪';
188
106
  console.log(`${statusIcon} ${server.name}`);
189
107
  console.log(` Transport: ${server.transport}`);
190
- if (server.transport === 'stdio') {
191
- console.log(` Command: ${server.command} ${(server.args || []).join(' ')}`);
192
- }
193
- else {
194
- console.log(` URL: ${server.url}`);
195
- }
108
+ console.log(` URL: ${server.url}`);
196
109
  console.log(` ID: ${server.id}`);
197
110
  console.log();
198
111
  }
199
112
  /**
200
- * Activate an MCP server
113
+ * Activates an MCP server.
201
114
  */
202
- async function activateMCPServer(context, serverName) {
115
+ async function activateServerCore(context, server) {
116
+ if (server.active) {
117
+ console.log(`ℹ️ Server "${server.name}" is already active.`);
118
+ return true;
119
+ }
120
+ writeProgress(`🔄 Activating ${server.name}...`);
203
121
  try {
204
- // Get all servers
205
- const result = await context.developerApi.getMCPServers();
206
- if (!result.success) {
207
- console.error(`\n❌ Failed to load MCP servers: ${result.error?.message}\n`);
208
- return;
209
- }
210
- const servers = result.data || [];
211
- const inactiveServers = servers.filter((s) => !s.active);
212
- if (inactiveServers.length === 0) {
213
- console.log("\nℹ️ All MCP servers are already active.\n");
214
- return;
215
- }
216
- let serverToActivate;
217
- if (serverName) {
218
- // Find by name
219
- const server = inactiveServers.find((s) => s.name.toLowerCase() === serverName.toLowerCase());
220
- if (!server) {
221
- console.error(`\n❌ Inactive MCP server "${serverName}" not found.\n`);
222
- console.log("Available inactive servers:");
223
- inactiveServers.forEach((s) => console.log(` - ${s.name}`));
224
- return;
225
- }
226
- serverToActivate = server;
227
- }
228
- else {
229
- // Prompt for selection
230
- const answer = await safePrompt([
231
- {
232
- type: 'list',
233
- name: 'server',
234
- message: 'Select an MCP server to activate:',
235
- choices: inactiveServers.map((s) => ({
236
- name: `${s.name} (${s.transport})`,
237
- value: s
238
- }))
239
- }
240
- ]);
241
- if (!answer)
242
- return;
243
- serverToActivate = answer.server;
244
- }
245
- writeProgress(`🔄 Activating ${serverToActivate.name}...`);
246
- const activateResult = await context.developerApi.activateMCPServer(serverToActivate.id);
247
- if (activateResult.success) {
248
- writeSuccess(`\n✅ MCP server "${serverToActivate.name}" activated successfully!\n`);
122
+ const result = await context.developerApi.activateMCPServer(server.id);
123
+ if (result.success) {
124
+ writeSuccess(`✅ MCP server "${server.name}" activated successfully!`);
249
125
  writeInfo("💡 The server's tools are now available to your agent.");
126
+ return true;
250
127
  }
251
128
  else {
252
- console.error(`\n❌ Failed to activate: ${activateResult.error?.message}\n`);
129
+ console.error(`❌ Failed to activate: ${result.error?.message}`);
130
+ return false;
253
131
  }
254
132
  }
255
133
  catch (error) {
256
- console.error('\n❌ Error activating MCP server:', error.message);
134
+ console.error('❌ Error activating MCP server:', error.message);
135
+ return false;
257
136
  }
258
137
  }
259
138
  /**
260
- * Deactivate an MCP server
139
+ * Deactivates an MCP server.
261
140
  */
262
- async function deactivateMCPServer(context, serverName) {
141
+ async function deactivateServerCore(context, server) {
142
+ if (!server.active) {
143
+ console.log(`ℹ️ Server "${server.name}" is already inactive.`);
144
+ return true;
145
+ }
146
+ writeProgress(`🔄 Deactivating ${server.name}...`);
263
147
  try {
264
- // Get all servers
265
- const result = await context.developerApi.getMCPServers();
266
- if (!result.success) {
267
- console.error(`\n❌ Failed to load MCP servers: ${result.error?.message}\n`);
268
- return;
269
- }
270
- const servers = result.data || [];
271
- const activeServers = servers.filter((s) => s.active);
272
- if (activeServers.length === 0) {
273
- console.log("\nℹ️ No active MCP servers to deactivate.\n");
274
- return;
275
- }
276
- let serverToDeactivate;
277
- if (serverName) {
278
- // Find by name
279
- const server = activeServers.find((s) => s.name.toLowerCase() === serverName.toLowerCase());
280
- if (!server) {
281
- console.error(`\n❌ Active MCP server "${serverName}" not found.\n`);
282
- console.log("Available active servers:");
283
- activeServers.forEach((s) => console.log(` - ${s.name}`));
284
- return;
285
- }
286
- serverToDeactivate = server;
148
+ const result = await context.developerApi.deactivateMCPServer(server.id);
149
+ if (result.success) {
150
+ writeSuccess(`✅ MCP server "${server.name}" deactivated successfully!`);
151
+ writeInfo("💡 The server's tools are no longer available to your agent.");
152
+ return true;
287
153
  }
288
154
  else {
289
- // Prompt for selection
290
- const answer = await safePrompt([
291
- {
292
- type: 'list',
293
- name: 'server',
294
- message: 'Select an MCP server to deactivate:',
295
- choices: activeServers.map((s) => ({
296
- name: `${s.name} (${s.transport})`,
297
- value: s
298
- }))
299
- }
300
- ]);
301
- if (!answer)
302
- return;
303
- serverToDeactivate = answer.server;
155
+ console.error(`❌ Failed to deactivate: ${result.error?.message}`);
156
+ return false;
304
157
  }
305
- writeProgress(`🔄 Deactivating ${serverToDeactivate.name}...`);
306
- const deactivateResult = await context.developerApi.deactivateMCPServer(serverToDeactivate.id);
307
- if (deactivateResult.success) {
308
- writeSuccess(`\n✅ MCP server "${serverToDeactivate.name}" deactivated successfully!\n`);
309
- writeInfo("💡 The server's tools are no longer available to your agent.");
158
+ }
159
+ catch (error) {
160
+ console.error('❌ Error deactivating MCP server:', error.message);
161
+ return false;
162
+ }
163
+ }
164
+ /**
165
+ * Deletes an MCP server.
166
+ */
167
+ async function deleteServerCore(context, server) {
168
+ writeProgress(`🔄 Deleting ${server.name}...`);
169
+ try {
170
+ const result = await context.developerApi.deleteMCPServer(server.id);
171
+ if (result.success) {
172
+ writeSuccess(`✅ MCP server "${server.name}" deleted successfully!`);
173
+ return true;
310
174
  }
311
175
  else {
312
- console.error(`\n❌ Failed to deactivate: ${deactivateResult.error?.message}\n`);
176
+ console.error(`❌ Failed to delete: ${result.error?.message}`);
177
+ return false;
313
178
  }
314
179
  }
315
180
  catch (error) {
316
- console.error('\n❌ Error deactivating MCP server:', error.message);
181
+ console.error('❌ Error deleting MCP server:', error.message);
182
+ return false;
317
183
  }
318
184
  }
319
185
  /**
320
- * Delete an MCP server
186
+ * Finds a server by name (case-insensitive).
321
187
  */
322
- async function deleteMCPServer(context, serverName) {
323
- try {
324
- // Get all servers
325
- const result = await context.developerApi.getMCPServers();
326
- if (!result.success) {
327
- console.error(`\n❌ Failed to load MCP servers: ${result.error?.message}\n`);
328
- return;
188
+ function findServer(servers, serverName) {
189
+ const normalizedName = serverName.toLowerCase();
190
+ return servers.find(s => s.name.toLowerCase() === normalizedName) || null;
191
+ }
192
+ /**
193
+ * Prompts user to select a server from a list.
194
+ */
195
+ async function promptServerSelection(servers, message) {
196
+ const answer = await safePrompt([
197
+ {
198
+ type: 'list',
199
+ name: 'server',
200
+ message,
201
+ choices: servers.map((s) => ({
202
+ name: `${s.name} (${s.transport}) ${s.active ? '🟢' : '⚪'}`,
203
+ value: s
204
+ }))
329
205
  }
330
- const servers = result.data || [];
331
- if (servers.length === 0) {
332
- console.log("\nℹ️ No MCP servers to delete.\n");
333
- return;
206
+ ]);
207
+ return answer?.server || null;
208
+ }
209
+ /**
210
+ * Show usage information.
211
+ */
212
+ function showUsage() {
213
+ console.log('\nUsage:');
214
+ console.log(' lua mcp Interactive MCP server management');
215
+ console.log(' lua mcp list List all MCP servers');
216
+ console.log(' lua mcp activate -i <name> Activate an MCP server');
217
+ console.log(' lua mcp deactivate -i <name> Deactivate an MCP server');
218
+ console.log(' lua mcp delete -i <name> Delete an MCP server');
219
+ console.log('\nNote: Positional server name is also supported (e.g., lua mcp activate myServer)');
220
+ }
221
+ // ─────────────────────────────────────────────────────────────────────────────
222
+ // Non-Interactive Mode
223
+ // ─────────────────────────────────────────────────────────────────────────────
224
+ async function executeNonInteractive(context, action, options) {
225
+ const normalizedAction = action.toLowerCase();
226
+ // Support aliases
227
+ const actionMap = {
228
+ 'list': 'list',
229
+ 'ls': 'list',
230
+ 'activate': 'activate',
231
+ 'enable': 'activate',
232
+ 'deactivate': 'deactivate',
233
+ 'disable': 'deactivate',
234
+ 'delete': 'delete',
235
+ 'rm': 'delete',
236
+ };
237
+ const resolvedAction = actionMap[normalizedAction];
238
+ if (!resolvedAction) {
239
+ console.error(`❌ Invalid action: "${action}"`);
240
+ showUsage();
241
+ process.exit(1);
242
+ }
243
+ writeProgress("🔄 Loading MCP servers...");
244
+ const servers = await fetchServersCore(context);
245
+ if (!servers)
246
+ process.exit(1);
247
+ // List action doesn't require server selection
248
+ if (resolvedAction === 'list') {
249
+ displayServersCore(servers);
250
+ return;
251
+ }
252
+ // All other actions require server selection
253
+ if (!options.serverName) {
254
+ console.error(`❌ --server-name is required for action "${resolvedAction}"`);
255
+ console.log(`\nUsage: lua mcp ${resolvedAction} --server-name <name>`);
256
+ if (servers.length > 0) {
257
+ console.log('\nAvailable servers:');
258
+ servers.forEach(s => console.log(` - ${s.name} ${s.active ? '(active)' : '(inactive)'}`));
334
259
  }
335
- let serverToDelete;
336
- if (serverName) {
337
- // Find by name
338
- const server = servers.find((s) => s.name.toLowerCase() === serverName.toLowerCase());
339
- if (!server) {
340
- console.error(`\n❌ MCP server "${serverName}" not found.\n`);
341
- console.log("Available servers:");
342
- servers.forEach((s) => console.log(` - ${s.name}`));
343
- return;
344
- }
345
- serverToDelete = server;
260
+ process.exit(1);
261
+ }
262
+ const selectedServer = findServer(servers, options.serverName);
263
+ if (!selectedServer) {
264
+ console.error(`❌ MCP server "${options.serverName}" not found`);
265
+ if (servers.length > 0) {
266
+ console.log('\nAvailable servers:');
267
+ servers.forEach(s => console.log(` - ${s.name}`));
346
268
  }
347
- else {
348
- // Prompt for selection
349
- const answer = await safePrompt([
350
- {
351
- type: 'list',
352
- name: 'server',
353
- message: 'Select an MCP server to delete:',
354
- choices: servers.map((s) => ({
355
- name: `${s.name} (${s.transport}) ${s.active ? '🟢' : '⚪'}`,
356
- value: s
357
- }))
358
- }
359
- ]);
360
- if (!answer)
361
- return;
362
- serverToDelete = answer.server;
269
+ process.exit(1);
270
+ }
271
+ switch (resolvedAction) {
272
+ case 'activate': {
273
+ const success = await activateServerCore(context, selectedServer);
274
+ if (!success)
275
+ process.exit(1);
276
+ break;
277
+ }
278
+ case 'deactivate': {
279
+ const success = await deactivateServerCore(context, selectedServer);
280
+ if (!success)
281
+ process.exit(1);
282
+ break;
363
283
  }
364
- // Confirm deletion
365
- console.log(`\n⚠️ You are about to delete MCP server: ${serverToDelete.name}`);
366
- if (serverToDelete.active) {
367
- console.log("⚠️ WARNING: This server is currently ACTIVE!");
284
+ case 'delete': {
285
+ // In non-interactive mode, delete directly without confirmation
286
+ const success = await deleteServerCore(context, selectedServer);
287
+ if (!success)
288
+ process.exit(1);
289
+ break;
368
290
  }
369
- const confirmAnswer = await safePrompt([
291
+ }
292
+ }
293
+ // ─────────────────────────────────────────────────────────────────────────────
294
+ // Interactive Mode
295
+ // ─────────────────────────────────────────────────────────────────────────────
296
+ async function interactiveMCPManagement(context) {
297
+ let continueManaging = true;
298
+ while (continueManaging) {
299
+ console.log("\n" + "=".repeat(60));
300
+ console.log("🔌 MCP Server Management");
301
+ console.log("=".repeat(60) + "\n");
302
+ const actionAnswer = await safePrompt([
370
303
  {
371
- type: 'confirm',
372
- name: 'confirm',
373
- message: 'Are you sure you want to delete this MCP server?',
374
- default: false
304
+ type: 'list',
305
+ name: 'action',
306
+ message: 'What would you like to do?',
307
+ choices: [
308
+ { name: '📋 List MCP servers', value: 'list' },
309
+ { name: '✅ Activate a server', value: 'activate' },
310
+ { name: '⏸️ Deactivate a server', value: 'deactivate' },
311
+ { name: '🗑️ Delete a server', value: 'delete' },
312
+ { name: '❌ Exit', value: 'exit' }
313
+ ]
375
314
  }
376
315
  ]);
377
- if (!confirmAnswer || !confirmAnswer.confirm) {
378
- console.log("\n❌ Deletion cancelled.\n");
316
+ if (!actionAnswer)
379
317
  return;
380
- }
381
- writeProgress(`🔄 Deleting ${serverToDelete.name}...`);
382
- const deleteResult = await context.developerApi.deleteMCPServer(serverToDelete.id);
383
- if (deleteResult.success) {
384
- writeSuccess(`\n✅ MCP server "${serverToDelete.name}" deleted successfully!\n`);
385
- }
386
- else {
387
- console.error(`\n❌ Failed to delete: ${deleteResult.error?.message}\n`);
318
+ const { action } = actionAnswer;
319
+ switch (action) {
320
+ case 'list':
321
+ await listServersInteractive(context);
322
+ break;
323
+ case 'activate':
324
+ await activateServerInteractive(context);
325
+ break;
326
+ case 'deactivate':
327
+ await deactivateServerInteractive(context);
328
+ break;
329
+ case 'delete':
330
+ await deleteServerInteractive(context);
331
+ break;
332
+ case 'exit':
333
+ continueManaging = false;
334
+ console.log("\n👋 Goodbye!\n");
335
+ break;
388
336
  }
389
337
  }
390
- catch (error) {
391
- console.error('\n❌ Error deleting MCP server:', error.message);
338
+ }
339
+ async function listServersInteractive(context) {
340
+ writeProgress("🔄 Loading MCP servers...");
341
+ const servers = await fetchServersCore(context);
342
+ if (servers) {
343
+ displayServersCore(servers);
344
+ }
345
+ }
346
+ async function activateServerInteractive(context) {
347
+ const servers = await fetchServersCore(context);
348
+ if (!servers)
349
+ return;
350
+ const inactiveServers = servers.filter((s) => !s.active);
351
+ if (inactiveServers.length === 0) {
352
+ console.log("\nℹ️ All MCP servers are already active.\n");
353
+ return;
354
+ }
355
+ const server = await promptServerSelection(inactiveServers, 'Select an MCP server to activate:');
356
+ if (!server)
357
+ return;
358
+ await activateServerCore(context, server);
359
+ }
360
+ async function deactivateServerInteractive(context) {
361
+ const servers = await fetchServersCore(context);
362
+ if (!servers)
363
+ return;
364
+ const activeServers = servers.filter((s) => s.active);
365
+ if (activeServers.length === 0) {
366
+ console.log("\nℹ️ No active MCP servers to deactivate.\n");
367
+ return;
368
+ }
369
+ const server = await promptServerSelection(activeServers, 'Select an MCP server to deactivate:');
370
+ if (!server)
371
+ return;
372
+ await deactivateServerCore(context, server);
373
+ }
374
+ async function deleteServerInteractive(context) {
375
+ const servers = await fetchServersCore(context);
376
+ if (!servers)
377
+ return;
378
+ if (servers.length === 0) {
379
+ console.log("\nℹ️ No MCP servers to delete.\n");
380
+ return;
381
+ }
382
+ const server = await promptServerSelection(servers, 'Select an MCP server to delete:');
383
+ if (!server)
384
+ return;
385
+ // Confirm deletion in interactive mode
386
+ console.log(`\n⚠️ You are about to delete MCP server: ${server.name}`);
387
+ if (server.active) {
388
+ console.log("⚠️ WARNING: This server is currently ACTIVE!");
389
+ }
390
+ const confirmAnswer = await safePrompt([
391
+ {
392
+ type: 'confirm',
393
+ name: 'confirm',
394
+ message: 'Are you sure you want to delete this MCP server?',
395
+ default: false
396
+ }
397
+ ]);
398
+ if (!confirmAnswer || !confirmAnswer.confirm) {
399
+ console.log("\n❌ Deletion cancelled.\n");
400
+ return;
392
401
  }
402
+ await deleteServerCore(context, server);
393
403
  }
394
404
  //# sourceMappingURL=mcp.js.map