lua-cli 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/logs.api.service.d.ts +1 -1
- package/dist/api/logs.api.service.js.map +1 -1
- package/dist/api/products.api.service.d.ts +17 -5
- package/dist/api/products.api.service.js +21 -9
- package/dist/api/products.api.service.js.map +1 -1
- package/dist/api-exports.d.ts +17 -5
- package/dist/api-exports.js +20 -5
- package/dist/api-exports.js.map +1 -1
- package/dist/cli/command-definitions.js +320 -88
- package/dist/cli/command-definitions.js.map +1 -1
- package/dist/commands/apiKey.d.ts +5 -2
- package/dist/commands/apiKey.js +8 -2
- package/dist/commands/apiKey.js.map +1 -1
- package/dist/commands/channels.d.ts +4 -9
- package/dist/commands/channels.js +140 -84
- package/dist/commands/channels.js.map +1 -1
- package/dist/commands/chat.d.ts +4 -2
- package/dist/commands/chat.js +126 -32
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/chatClear.d.ts +3 -2
- package/dist/commands/chatClear.js +16 -15
- package/dist/commands/chatClear.js.map +1 -1
- package/dist/commands/compile.js +67 -4
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/deploy.d.ts +5 -24
- package/dist/commands/deploy.js +75 -48
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/destroy.d.ts +5 -2
- package/dist/commands/destroy.js +14 -2
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/env.d.ts +3 -1
- package/dist/commands/env.js +322 -122
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/features.d.ts +5 -9
- package/dist/commands/features.js +249 -129
- package/dist/commands/features.js.map +1 -1
- package/dist/commands/init.d.ts +7 -1
- package/dist/commands/init.js +242 -59
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/jobs.d.ts +5 -13
- package/dist/commands/jobs.js +449 -364
- package/dist/commands/jobs.js.map +1 -1
- package/dist/commands/logs.d.ts +5 -10
- package/dist/commands/logs.js +259 -103
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/marketplace.d.ts +23 -2
- package/dist/commands/marketplace.js +530 -7
- package/dist/commands/marketplace.js.map +1 -1
- package/dist/commands/mcp.d.ts +5 -11
- package/dist/commands/mcp.js +303 -288
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/persona.d.ts +5 -9
- package/dist/commands/persona.js +349 -232
- package/dist/commands/persona.js.map +1 -1
- package/dist/commands/postprocessors.d.ts +6 -2
- package/dist/commands/postprocessors.js +387 -280
- package/dist/commands/postprocessors.js.map +1 -1
- package/dist/commands/preprocessors.d.ts +6 -2
- package/dist/commands/preprocessors.js +387 -280
- package/dist/commands/preprocessors.js.map +1 -1
- package/dist/commands/production.d.ts +5 -8
- package/dist/commands/production.js +317 -228
- package/dist/commands/production.js.map +1 -1
- package/dist/commands/push.js +385 -427
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/resources.d.ts +5 -10
- package/dist/commands/resources.js +219 -154
- package/dist/commands/resources.js.map +1 -1
- package/dist/commands/skills.d.ts +5 -9
- package/dist/commands/skills.js +354 -277
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/sync.d.ts +10 -8
- package/dist/commands/sync.js +110 -19
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/test.d.ts +1 -11
- package/dist/commands/test.js +395 -438
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/webhooks.d.ts +5 -11
- package/dist/commands/webhooks.js +356 -290
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/interfaces/mcp.d.ts +28 -1
- package/dist/interfaces/product.d.ts +26 -0
- package/dist/types/api-contracts.d.ts +8 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/skill.d.ts +92 -17
- package/dist/types/skill.js +15 -11
- package/dist/types/skill.js.map +1 -1
- package/dist/utils/bundling.d.ts +17 -0
- package/dist/utils/bundling.js +96 -0
- package/dist/utils/bundling.js.map +1 -1
- package/dist/utils/compile.d.ts +4 -0
- package/dist/utils/compile.js +5 -0
- package/dist/utils/compile.js.map +1 -1
- package/dist/utils/dev-helpers.d.ts +3 -2
- package/dist/utils/dev-helpers.js +3 -5
- package/dist/utils/dev-helpers.js.map +1 -1
- package/dist/utils/mcp-server-management.d.ts +1 -1
- package/dist/utils/mcp-server-management.js +13 -14
- package/dist/utils/mcp-server-management.js.map +1 -1
- package/package.json +1 -1
- package/template/package.json +1 -1
package/dist/commands/mcp.js
CHANGED
|
@@ -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
|
-
*
|
|
16
|
-
* -
|
|
17
|
-
* -
|
|
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,
|
|
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,145 +43,63 @@ export async function mcpCommand(action, serverName) {
|
|
|
43
43
|
apiKey,
|
|
44
44
|
developerApi,
|
|
45
45
|
};
|
|
46
|
-
//
|
|
46
|
+
// Determine mode
|
|
47
47
|
if (action) {
|
|
48
|
-
|
|
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
|
-
*
|
|
80
|
-
*/
|
|
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
|
|
59
|
+
* Fetches all MCP servers from the API.
|
|
142
60
|
*/
|
|
143
|
-
async function
|
|
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(
|
|
149
|
-
return;
|
|
65
|
+
console.error(`❌ Failed to load MCP servers: ${result.error?.message}`);
|
|
66
|
+
return null;
|
|
150
67
|
}
|
|
151
|
-
|
|
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('
|
|
71
|
+
console.error('❌ Error loading MCP servers:', error.message);
|
|
72
|
+
return null;
|
|
181
73
|
}
|
|
182
74
|
}
|
|
183
75
|
/**
|
|
184
|
-
*
|
|
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 ? '🟢' : '⚪';
|
|
@@ -197,198 +115,295 @@ function printServerInfo(server) {
|
|
|
197
115
|
console.log();
|
|
198
116
|
}
|
|
199
117
|
/**
|
|
200
|
-
*
|
|
118
|
+
* Activates an MCP server.
|
|
201
119
|
*/
|
|
202
|
-
async function
|
|
120
|
+
async function activateServerCore(context, server) {
|
|
121
|
+
if (server.active) {
|
|
122
|
+
console.log(`ℹ️ Server "${server.name}" is already active.`);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
writeProgress(`🔄 Activating ${server.name}...`);
|
|
203
126
|
try {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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`);
|
|
127
|
+
const result = await context.developerApi.activateMCPServer(server.id);
|
|
128
|
+
if (result.success) {
|
|
129
|
+
writeSuccess(`✅ MCP server "${server.name}" activated successfully!`);
|
|
249
130
|
writeInfo("💡 The server's tools are now available to your agent.");
|
|
131
|
+
return true;
|
|
250
132
|
}
|
|
251
133
|
else {
|
|
252
|
-
console.error(
|
|
134
|
+
console.error(`❌ Failed to activate: ${result.error?.message}`);
|
|
135
|
+
return false;
|
|
253
136
|
}
|
|
254
137
|
}
|
|
255
138
|
catch (error) {
|
|
256
|
-
console.error('
|
|
139
|
+
console.error('❌ Error activating MCP server:', error.message);
|
|
140
|
+
return false;
|
|
257
141
|
}
|
|
258
142
|
}
|
|
259
143
|
/**
|
|
260
|
-
*
|
|
144
|
+
* Deactivates an MCP server.
|
|
261
145
|
*/
|
|
262
|
-
async function
|
|
146
|
+
async function deactivateServerCore(context, server) {
|
|
147
|
+
if (!server.active) {
|
|
148
|
+
console.log(`ℹ️ Server "${server.name}" is already inactive.`);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
writeProgress(`🔄 Deactivating ${server.name}...`);
|
|
263
152
|
try {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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;
|
|
153
|
+
const result = await context.developerApi.deactivateMCPServer(server.id);
|
|
154
|
+
if (result.success) {
|
|
155
|
+
writeSuccess(`✅ MCP server "${server.name}" deactivated successfully!`);
|
|
156
|
+
writeInfo("💡 The server's tools are no longer available to your agent.");
|
|
157
|
+
return true;
|
|
287
158
|
}
|
|
288
159
|
else {
|
|
289
|
-
|
|
290
|
-
|
|
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;
|
|
160
|
+
console.error(`❌ Failed to deactivate: ${result.error?.message}`);
|
|
161
|
+
return false;
|
|
304
162
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error('❌ Error deactivating MCP server:', error.message);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Deletes an MCP server.
|
|
171
|
+
*/
|
|
172
|
+
async function deleteServerCore(context, server) {
|
|
173
|
+
writeProgress(`🔄 Deleting ${server.name}...`);
|
|
174
|
+
try {
|
|
175
|
+
const result = await context.developerApi.deleteMCPServer(server.id);
|
|
176
|
+
if (result.success) {
|
|
177
|
+
writeSuccess(`✅ MCP server "${server.name}" deleted successfully!`);
|
|
178
|
+
return true;
|
|
310
179
|
}
|
|
311
180
|
else {
|
|
312
|
-
console.error(
|
|
181
|
+
console.error(`❌ Failed to delete: ${result.error?.message}`);
|
|
182
|
+
return false;
|
|
313
183
|
}
|
|
314
184
|
}
|
|
315
185
|
catch (error) {
|
|
316
|
-
console.error('
|
|
186
|
+
console.error('❌ Error deleting MCP server:', error.message);
|
|
187
|
+
return false;
|
|
317
188
|
}
|
|
318
189
|
}
|
|
319
190
|
/**
|
|
320
|
-
*
|
|
191
|
+
* Finds a server by name (case-insensitive).
|
|
321
192
|
*/
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
193
|
+
function findServer(servers, serverName) {
|
|
194
|
+
const normalizedName = serverName.toLowerCase();
|
|
195
|
+
return servers.find(s => s.name.toLowerCase() === normalizedName) || null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Prompts user to select a server from a list.
|
|
199
|
+
*/
|
|
200
|
+
async function promptServerSelection(servers, message) {
|
|
201
|
+
const answer = await safePrompt([
|
|
202
|
+
{
|
|
203
|
+
type: 'list',
|
|
204
|
+
name: 'server',
|
|
205
|
+
message,
|
|
206
|
+
choices: servers.map((s) => ({
|
|
207
|
+
name: `${s.name} (${s.transport}) ${s.active ? '🟢' : '⚪'}`,
|
|
208
|
+
value: s
|
|
209
|
+
}))
|
|
329
210
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
211
|
+
]);
|
|
212
|
+
return answer?.server || null;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Show usage information.
|
|
216
|
+
*/
|
|
217
|
+
function showUsage() {
|
|
218
|
+
console.log('\nUsage:');
|
|
219
|
+
console.log(' lua mcp Interactive MCP server management');
|
|
220
|
+
console.log(' lua mcp list List all MCP servers');
|
|
221
|
+
console.log(' lua mcp activate -i <name> Activate an MCP server');
|
|
222
|
+
console.log(' lua mcp deactivate -i <name> Deactivate an MCP server');
|
|
223
|
+
console.log(' lua mcp delete -i <name> Delete an MCP server');
|
|
224
|
+
console.log('\nNote: Positional server name is also supported (e.g., lua mcp activate myServer)');
|
|
225
|
+
}
|
|
226
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
227
|
+
// Non-Interactive Mode
|
|
228
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
229
|
+
async function executeNonInteractive(context, action, options) {
|
|
230
|
+
const normalizedAction = action.toLowerCase();
|
|
231
|
+
// Support aliases
|
|
232
|
+
const actionMap = {
|
|
233
|
+
'list': 'list',
|
|
234
|
+
'ls': 'list',
|
|
235
|
+
'activate': 'activate',
|
|
236
|
+
'enable': 'activate',
|
|
237
|
+
'deactivate': 'deactivate',
|
|
238
|
+
'disable': 'deactivate',
|
|
239
|
+
'delete': 'delete',
|
|
240
|
+
'rm': 'delete',
|
|
241
|
+
};
|
|
242
|
+
const resolvedAction = actionMap[normalizedAction];
|
|
243
|
+
if (!resolvedAction) {
|
|
244
|
+
console.error(`❌ Invalid action: "${action}"`);
|
|
245
|
+
showUsage();
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
writeProgress("🔄 Loading MCP servers...");
|
|
249
|
+
const servers = await fetchServersCore(context);
|
|
250
|
+
if (!servers)
|
|
251
|
+
process.exit(1);
|
|
252
|
+
// List action doesn't require server selection
|
|
253
|
+
if (resolvedAction === 'list') {
|
|
254
|
+
displayServersCore(servers);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
// All other actions require server selection
|
|
258
|
+
if (!options.serverName) {
|
|
259
|
+
console.error(`❌ --server-name is required for action "${resolvedAction}"`);
|
|
260
|
+
console.log(`\nUsage: lua mcp ${resolvedAction} --server-name <name>`);
|
|
261
|
+
if (servers.length > 0) {
|
|
262
|
+
console.log('\nAvailable servers:');
|
|
263
|
+
servers.forEach(s => console.log(` - ${s.name} ${s.active ? '(active)' : '(inactive)'}`));
|
|
334
264
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
serverToDelete = server;
|
|
265
|
+
process.exit(1);
|
|
266
|
+
}
|
|
267
|
+
const selectedServer = findServer(servers, options.serverName);
|
|
268
|
+
if (!selectedServer) {
|
|
269
|
+
console.error(`❌ MCP server "${options.serverName}" not found`);
|
|
270
|
+
if (servers.length > 0) {
|
|
271
|
+
console.log('\nAvailable servers:');
|
|
272
|
+
servers.forEach(s => console.log(` - ${s.name}`));
|
|
346
273
|
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
name: `${s.name} (${s.transport}) ${s.active ? '🟢' : '⚪'}`,
|
|
356
|
-
value: s
|
|
357
|
-
}))
|
|
358
|
-
}
|
|
359
|
-
]);
|
|
360
|
-
if (!answer)
|
|
361
|
-
return;
|
|
362
|
-
serverToDelete = answer.server;
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
switch (resolvedAction) {
|
|
277
|
+
case 'activate': {
|
|
278
|
+
const success = await activateServerCore(context, selectedServer);
|
|
279
|
+
if (!success)
|
|
280
|
+
process.exit(1);
|
|
281
|
+
break;
|
|
363
282
|
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
283
|
+
case 'deactivate': {
|
|
284
|
+
const success = await deactivateServerCore(context, selectedServer);
|
|
285
|
+
if (!success)
|
|
286
|
+
process.exit(1);
|
|
287
|
+
break;
|
|
368
288
|
}
|
|
369
|
-
|
|
289
|
+
case 'delete': {
|
|
290
|
+
// In non-interactive mode, delete directly without confirmation
|
|
291
|
+
const success = await deleteServerCore(context, selectedServer);
|
|
292
|
+
if (!success)
|
|
293
|
+
process.exit(1);
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
299
|
+
// Interactive Mode
|
|
300
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
301
|
+
async function interactiveMCPManagement(context) {
|
|
302
|
+
let continueManaging = true;
|
|
303
|
+
while (continueManaging) {
|
|
304
|
+
console.log("\n" + "=".repeat(60));
|
|
305
|
+
console.log("🔌 MCP Server Management");
|
|
306
|
+
console.log("=".repeat(60) + "\n");
|
|
307
|
+
const actionAnswer = await safePrompt([
|
|
370
308
|
{
|
|
371
|
-
type: '
|
|
372
|
-
name: '
|
|
373
|
-
message: '
|
|
374
|
-
|
|
309
|
+
type: 'list',
|
|
310
|
+
name: 'action',
|
|
311
|
+
message: 'What would you like to do?',
|
|
312
|
+
choices: [
|
|
313
|
+
{ name: '📋 List MCP servers', value: 'list' },
|
|
314
|
+
{ name: '✅ Activate a server', value: 'activate' },
|
|
315
|
+
{ name: '⏸️ Deactivate a server', value: 'deactivate' },
|
|
316
|
+
{ name: '🗑️ Delete a server', value: 'delete' },
|
|
317
|
+
{ name: '❌ Exit', value: 'exit' }
|
|
318
|
+
]
|
|
375
319
|
}
|
|
376
320
|
]);
|
|
377
|
-
if (!
|
|
378
|
-
console.log("\n❌ Deletion cancelled.\n");
|
|
321
|
+
if (!actionAnswer)
|
|
379
322
|
return;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
323
|
+
const { action } = actionAnswer;
|
|
324
|
+
switch (action) {
|
|
325
|
+
case 'list':
|
|
326
|
+
await listServersInteractive(context);
|
|
327
|
+
break;
|
|
328
|
+
case 'activate':
|
|
329
|
+
await activateServerInteractive(context);
|
|
330
|
+
break;
|
|
331
|
+
case 'deactivate':
|
|
332
|
+
await deactivateServerInteractive(context);
|
|
333
|
+
break;
|
|
334
|
+
case 'delete':
|
|
335
|
+
await deleteServerInteractive(context);
|
|
336
|
+
break;
|
|
337
|
+
case 'exit':
|
|
338
|
+
continueManaging = false;
|
|
339
|
+
console.log("\n👋 Goodbye!\n");
|
|
340
|
+
break;
|
|
388
341
|
}
|
|
389
342
|
}
|
|
390
|
-
|
|
391
|
-
|
|
343
|
+
}
|
|
344
|
+
async function listServersInteractive(context) {
|
|
345
|
+
writeProgress("🔄 Loading MCP servers...");
|
|
346
|
+
const servers = await fetchServersCore(context);
|
|
347
|
+
if (servers) {
|
|
348
|
+
displayServersCore(servers);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async function activateServerInteractive(context) {
|
|
352
|
+
const servers = await fetchServersCore(context);
|
|
353
|
+
if (!servers)
|
|
354
|
+
return;
|
|
355
|
+
const inactiveServers = servers.filter((s) => !s.active);
|
|
356
|
+
if (inactiveServers.length === 0) {
|
|
357
|
+
console.log("\nℹ️ All MCP servers are already active.\n");
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
const server = await promptServerSelection(inactiveServers, 'Select an MCP server to activate:');
|
|
361
|
+
if (!server)
|
|
362
|
+
return;
|
|
363
|
+
await activateServerCore(context, server);
|
|
364
|
+
}
|
|
365
|
+
async function deactivateServerInteractive(context) {
|
|
366
|
+
const servers = await fetchServersCore(context);
|
|
367
|
+
if (!servers)
|
|
368
|
+
return;
|
|
369
|
+
const activeServers = servers.filter((s) => s.active);
|
|
370
|
+
if (activeServers.length === 0) {
|
|
371
|
+
console.log("\nℹ️ No active MCP servers to deactivate.\n");
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
const server = await promptServerSelection(activeServers, 'Select an MCP server to deactivate:');
|
|
375
|
+
if (!server)
|
|
376
|
+
return;
|
|
377
|
+
await deactivateServerCore(context, server);
|
|
378
|
+
}
|
|
379
|
+
async function deleteServerInteractive(context) {
|
|
380
|
+
const servers = await fetchServersCore(context);
|
|
381
|
+
if (!servers)
|
|
382
|
+
return;
|
|
383
|
+
if (servers.length === 0) {
|
|
384
|
+
console.log("\nℹ️ No MCP servers to delete.\n");
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const server = await promptServerSelection(servers, 'Select an MCP server to delete:');
|
|
388
|
+
if (!server)
|
|
389
|
+
return;
|
|
390
|
+
// Confirm deletion in interactive mode
|
|
391
|
+
console.log(`\n⚠️ You are about to delete MCP server: ${server.name}`);
|
|
392
|
+
if (server.active) {
|
|
393
|
+
console.log("⚠️ WARNING: This server is currently ACTIVE!");
|
|
394
|
+
}
|
|
395
|
+
const confirmAnswer = await safePrompt([
|
|
396
|
+
{
|
|
397
|
+
type: 'confirm',
|
|
398
|
+
name: 'confirm',
|
|
399
|
+
message: 'Are you sure you want to delete this MCP server?',
|
|
400
|
+
default: false
|
|
401
|
+
}
|
|
402
|
+
]);
|
|
403
|
+
if (!confirmAnswer || !confirmAnswer.confirm) {
|
|
404
|
+
console.log("\n❌ Deletion cancelled.\n");
|
|
405
|
+
return;
|
|
392
406
|
}
|
|
407
|
+
await deleteServerCore(context, server);
|
|
393
408
|
}
|
|
394
409
|
//# sourceMappingURL=mcp.js.map
|