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.
- 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/webhook.api.service.d.ts +4 -0
- package/dist/api/webhook.api.service.js.map +1 -1
- package/dist/api-exports.d.ts +19 -7
- package/dist/api-exports.js +20 -5
- package/dist/api-exports.js.map +1 -1
- package/dist/cli/command-definitions.js +323 -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.d.ts +5 -4
- package/dist/commands/compile.js +73 -9
- 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 +523 -360
- 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 +304 -294
- 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 +435 -275
- 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 +431 -287
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/interfaces/index.d.ts +1 -1
- package/dist/interfaces/mcp.d.ts +39 -19
- package/dist/interfaces/mcp.js +3 -0
- package/dist/interfaces/mcp.js.map +1 -1
- package/dist/interfaces/product.d.ts +26 -0
- package/dist/interfaces/skills.d.ts +5 -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 +146 -35
- package/dist/types/skill.js +31 -37
- 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/job-management.d.ts +4 -1
- package/dist/utils/job-management.js +15 -29
- package/dist/utils/job-management.js.map +1 -1
- package/dist/utils/mcp-server-management.d.ts +5 -2
- package/dist/utils/mcp-server-management.js +27 -43
- package/dist/utils/mcp-server-management.js.map +1 -1
- package/dist/utils/push-helpers.d.ts +1 -1
- package/dist/utils/push-helpers.js +5 -1
- package/dist/utils/push-helpers.js.map +1 -1
- package/dist/utils/skill-management.d.ts +7 -2
- package/dist/utils/skill-management.js +21 -30
- package/dist/utils/skill-management.js.map +1 -1
- package/dist/utils/webhook-management.d.ts +4 -1
- package/dist/utils/webhook-management.js +15 -29
- package/dist/utils/webhook-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,352 +43,362 @@ 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
|
-
*
|
|
59
|
+
* Fetches all MCP servers from the API.
|
|
80
60
|
*/
|
|
81
|
-
function
|
|
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(
|
|
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 ? '🟢' : '⚪';
|
|
188
106
|
console.log(`${statusIcon} ${server.name}`);
|
|
189
107
|
console.log(` Transport: ${server.transport}`);
|
|
190
|
-
|
|
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
|
-
*
|
|
113
|
+
* Activates an MCP server.
|
|
201
114
|
*/
|
|
202
|
-
async function
|
|
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
|
-
|
|
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`);
|
|
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(
|
|
129
|
+
console.error(`❌ Failed to activate: ${result.error?.message}`);
|
|
130
|
+
return false;
|
|
253
131
|
}
|
|
254
132
|
}
|
|
255
133
|
catch (error) {
|
|
256
|
-
console.error('
|
|
134
|
+
console.error('❌ Error activating MCP server:', error.message);
|
|
135
|
+
return false;
|
|
257
136
|
}
|
|
258
137
|
}
|
|
259
138
|
/**
|
|
260
|
-
*
|
|
139
|
+
* Deactivates an MCP server.
|
|
261
140
|
*/
|
|
262
|
-
async function
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
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;
|
|
155
|
+
console.error(`❌ Failed to deactivate: ${result.error?.message}`);
|
|
156
|
+
return false;
|
|
304
157
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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(
|
|
176
|
+
console.error(`❌ Failed to delete: ${result.error?.message}`);
|
|
177
|
+
return false;
|
|
313
178
|
}
|
|
314
179
|
}
|
|
315
180
|
catch (error) {
|
|
316
|
-
console.error('
|
|
181
|
+
console.error('❌ Error deleting MCP server:', error.message);
|
|
182
|
+
return false;
|
|
317
183
|
}
|
|
318
184
|
}
|
|
319
185
|
/**
|
|
320
|
-
*
|
|
186
|
+
* Finds a server by name (case-insensitive).
|
|
321
187
|
*/
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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
|
-
|
|
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: '
|
|
372
|
-
name: '
|
|
373
|
-
message: '
|
|
374
|
-
|
|
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 (!
|
|
378
|
-
console.log("\n❌ Deletion cancelled.\n");
|
|
316
|
+
if (!actionAnswer)
|
|
379
317
|
return;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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
|
-
|
|
391
|
-
|
|
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
|