rush-ai 0.2.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.
@@ -0,0 +1,499 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ consumeSSEStreamWithReconnect
4
+ } from "./chunk-ISJJIX7U.js";
5
+ import {
6
+ createClient,
7
+ getAuthToken
8
+ } from "./chunk-7H2T3KCJ.js";
9
+
10
+ // src/commands/mcp/server.ts
11
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import {
14
+ CallToolRequestSchema,
15
+ ListToolsRequestSchema
16
+ } from "@modelcontextprotocol/sdk/types.js";
17
+ async function startMcpServer() {
18
+ const server = new Server(
19
+ {
20
+ name: "rush-ai",
21
+ version: "0.2.0"
22
+ },
23
+ {
24
+ capabilities: {
25
+ tools: {}
26
+ }
27
+ }
28
+ );
29
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
30
+ return {
31
+ tools: [
32
+ {
33
+ name: "rush_agent_list",
34
+ description: "List available Rush AI agents",
35
+ inputSchema: {
36
+ type: "object",
37
+ properties: {}
38
+ }
39
+ },
40
+ {
41
+ name: "rush_task_run",
42
+ description: "Run a task synchronously on a Rush AI agent",
43
+ inputSchema: {
44
+ type: "object",
45
+ properties: {
46
+ agent: {
47
+ type: "string",
48
+ description: "Agent name"
49
+ },
50
+ prompt: {
51
+ type: "string",
52
+ description: "Task prompt"
53
+ },
54
+ skills: {
55
+ type: "array",
56
+ items: { type: "string" },
57
+ description: "Optional skills to add"
58
+ },
59
+ mcpServers: {
60
+ type: "array",
61
+ items: { type: "string" },
62
+ description: "Optional MCP servers to add"
63
+ }
64
+ },
65
+ required: ["agent", "prompt"]
66
+ }
67
+ },
68
+ {
69
+ name: "rush_task_create",
70
+ description: "Create an asynchronous task on a Rush AI agent",
71
+ inputSchema: {
72
+ type: "object",
73
+ properties: {
74
+ agent: {
75
+ type: "string",
76
+ description: "Agent name"
77
+ },
78
+ prompt: {
79
+ type: "string",
80
+ description: "Task prompt"
81
+ },
82
+ skills: {
83
+ type: "array",
84
+ items: { type: "string" },
85
+ description: "Optional skills to add"
86
+ },
87
+ mcpServers: {
88
+ type: "array",
89
+ items: { type: "string" },
90
+ description: "Optional MCP servers to add"
91
+ }
92
+ },
93
+ required: ["agent", "prompt"]
94
+ }
95
+ },
96
+ {
97
+ name: "rush_task_status",
98
+ description: "Get the status of a task",
99
+ inputSchema: {
100
+ type: "object",
101
+ properties: {
102
+ id: {
103
+ type: "string",
104
+ description: "Task ID"
105
+ }
106
+ },
107
+ required: ["id"]
108
+ }
109
+ },
110
+ {
111
+ name: "rush_task_result",
112
+ description: "Get the result of a completed task",
113
+ inputSchema: {
114
+ type: "object",
115
+ properties: {
116
+ id: {
117
+ type: "string",
118
+ description: "Task ID"
119
+ }
120
+ },
121
+ required: ["id"]
122
+ }
123
+ },
124
+ {
125
+ name: "rush_task_list",
126
+ description: "List tasks",
127
+ inputSchema: {
128
+ type: "object",
129
+ properties: {
130
+ limit: {
131
+ type: "number",
132
+ description: "Max results (default: 20)"
133
+ },
134
+ status: {
135
+ type: "string",
136
+ description: "Filter by status: pending, running, completed, failed, cancelled"
137
+ }
138
+ }
139
+ }
140
+ },
141
+ {
142
+ name: "rush_task_files",
143
+ description: "List files generated by a task (code, images, documents, etc.)",
144
+ inputSchema: {
145
+ type: "object",
146
+ properties: {
147
+ id: {
148
+ type: "string",
149
+ description: "Task ID"
150
+ },
151
+ category: {
152
+ type: "string",
153
+ enum: ["code", "image", "document", "other"],
154
+ description: "Optional filter by file category"
155
+ }
156
+ },
157
+ required: ["id"]
158
+ }
159
+ },
160
+ {
161
+ name: "rush_task_watch",
162
+ description: "Watch task execution in real-time. Blocks until task completes or timeout. Returns accumulated events.",
163
+ inputSchema: {
164
+ type: "object",
165
+ properties: {
166
+ id: {
167
+ type: "string",
168
+ description: "Task ID"
169
+ },
170
+ timeout: {
171
+ type: "number",
172
+ description: "Max seconds to watch (default: 300, max: 600)"
173
+ }
174
+ },
175
+ required: ["id"]
176
+ }
177
+ },
178
+ {
179
+ name: "rush_task_cancel",
180
+ description: "Cancel a running task",
181
+ inputSchema: {
182
+ type: "object",
183
+ properties: {
184
+ id: {
185
+ type: "string",
186
+ description: "Task ID"
187
+ }
188
+ },
189
+ required: ["id"]
190
+ }
191
+ },
192
+ {
193
+ name: "rush_agent_info",
194
+ description: "Get detailed information about a specific agent",
195
+ inputSchema: {
196
+ type: "object",
197
+ properties: {
198
+ id: {
199
+ type: "string",
200
+ description: "Agent ID"
201
+ }
202
+ },
203
+ required: ["id"]
204
+ }
205
+ },
206
+ {
207
+ name: "rush_mcp_list",
208
+ description: "List available MCP servers registered on the platform. Use to discover what MCP servers can be passed to the --mcp parameter when creating tasks.",
209
+ inputSchema: {
210
+ type: "object",
211
+ properties: {
212
+ category: {
213
+ type: "string",
214
+ description: "Filter by category (knowledge, dev-tools, observability, data, design, ci-cd, utilities)"
215
+ },
216
+ search: {
217
+ type: "string",
218
+ description: "Search by name or description"
219
+ },
220
+ page: {
221
+ type: "number",
222
+ description: "Page number (default: 1)"
223
+ }
224
+ }
225
+ }
226
+ }
227
+ ]
228
+ };
229
+ });
230
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
231
+ const token = getAuthToken();
232
+ if (!token) {
233
+ return {
234
+ content: [
235
+ {
236
+ type: "text",
237
+ text: "Error: Not authenticated. Run `rush-ai auth login` first."
238
+ }
239
+ ],
240
+ isError: true
241
+ };
242
+ }
243
+ const client = createClient();
244
+ const args = request.params.arguments ?? {};
245
+ try {
246
+ switch (request.params.name) {
247
+ case "rush_agent_list": {
248
+ const { data } = await client.get("/api/agents");
249
+ return {
250
+ content: [
251
+ {
252
+ type: "text",
253
+ text: JSON.stringify(data, null, 2)
254
+ }
255
+ ]
256
+ };
257
+ }
258
+ case "rush_task_run": {
259
+ const { data } = await client.post(
260
+ "/api/agent/invoke",
261
+ {
262
+ agent: args.agent,
263
+ prompt: args.prompt,
264
+ skills: args.skills,
265
+ mcpServers: args.mcpServers
266
+ }
267
+ );
268
+ return {
269
+ content: [
270
+ {
271
+ type: "text",
272
+ text: JSON.stringify(data, null, 2)
273
+ }
274
+ ]
275
+ };
276
+ }
277
+ case "rush_task_create": {
278
+ const { data } = await client.post("/api/tasks", {
279
+ agent: args.agent,
280
+ prompt: args.prompt,
281
+ skills: args.skills,
282
+ mcpServers: args.mcpServers
283
+ });
284
+ return {
285
+ content: [
286
+ {
287
+ type: "text",
288
+ text: JSON.stringify(data, null, 2)
289
+ }
290
+ ]
291
+ };
292
+ }
293
+ case "rush_task_status": {
294
+ const { data } = await client.get(
295
+ `/api/tasks/${encodeURIComponent(String(args.id))}`
296
+ );
297
+ return {
298
+ content: [
299
+ {
300
+ type: "text",
301
+ text: JSON.stringify(data, null, 2)
302
+ }
303
+ ]
304
+ };
305
+ }
306
+ case "rush_task_result": {
307
+ const { data } = await client.get(`/api/tasks/${encodeURIComponent(String(args.id))}/result`);
308
+ return {
309
+ content: [
310
+ {
311
+ type: "text",
312
+ text: JSON.stringify(data, null, 2)
313
+ }
314
+ ]
315
+ };
316
+ }
317
+ case "rush_task_list": {
318
+ const params = new URLSearchParams();
319
+ if (args.limit) params.set("limit", String(args.limit));
320
+ if (args.status) params.set("status", String(args.status));
321
+ const { data } = await client.get(
322
+ `/api/tasks?${params.toString()}`
323
+ );
324
+ return {
325
+ content: [
326
+ {
327
+ type: "text",
328
+ text: JSON.stringify(data, null, 2)
329
+ }
330
+ ]
331
+ };
332
+ }
333
+ case "rush_task_files": {
334
+ const { data } = await client.get(
335
+ `/api/chat/${encodeURIComponent(String(args.id))}/files`
336
+ );
337
+ const validCategories = ["code", "image", "document", "other"];
338
+ let files = data.files;
339
+ if (args.category && typeof args.category === "string" && validCategories.includes(args.category)) {
340
+ files = files.filter((f) => f.category === args.category);
341
+ }
342
+ return {
343
+ content: [
344
+ {
345
+ type: "text",
346
+ text: JSON.stringify(
347
+ { files, totalCount: files.length },
348
+ null,
349
+ 2
350
+ )
351
+ }
352
+ ]
353
+ };
354
+ }
355
+ case "rush_task_watch": {
356
+ const TERMINAL_STATUSES = ["completed", "failed", "cancelled"];
357
+ const timeoutSec = Math.min(
358
+ Math.max(Number(args.timeout) || 300, 1),
359
+ 600
360
+ );
361
+ const events = [];
362
+ let truncated = false;
363
+ let watchError = null;
364
+ const controller = new AbortController();
365
+ const timeoutId = setTimeout(() => {
366
+ truncated = true;
367
+ controller.abort();
368
+ }, timeoutSec * 1e3);
369
+ try {
370
+ const connectFn = async () => {
371
+ const response = await client.fetchRaw(
372
+ `/api/tasks/${encodeURIComponent(String(args.id))}/events`,
373
+ { method: "GET" }
374
+ );
375
+ if (!response.body) throw new Error("No response body");
376
+ return response.body;
377
+ };
378
+ await consumeSSEStreamWithReconnect(
379
+ connectFn,
380
+ (event) => {
381
+ events.push(event);
382
+ },
383
+ {
384
+ signal: controller.signal,
385
+ isTerminal: (event) => event.type === "status" && TERMINAL_STATUSES.includes(event.data)
386
+ }
387
+ );
388
+ } catch (err) {
389
+ if (!truncated) {
390
+ watchError = err instanceof Error ? err.message : "Unknown error";
391
+ }
392
+ } finally {
393
+ clearTimeout(timeoutId);
394
+ }
395
+ if (events.length === 0 && watchError) {
396
+ return {
397
+ content: [
398
+ {
399
+ type: "text",
400
+ text: `Error: ${watchError}`
401
+ }
402
+ ],
403
+ isError: true
404
+ };
405
+ }
406
+ return {
407
+ content: [
408
+ {
409
+ type: "text",
410
+ text: JSON.stringify(
411
+ {
412
+ events,
413
+ truncated,
414
+ eventCount: events.length,
415
+ ...watchError ? { error: watchError } : {}
416
+ },
417
+ null,
418
+ 2
419
+ )
420
+ }
421
+ ]
422
+ };
423
+ }
424
+ case "rush_task_cancel": {
425
+ await client.delete(
426
+ `/api/tasks/${encodeURIComponent(String(args.id))}`
427
+ );
428
+ return {
429
+ content: [
430
+ {
431
+ type: "text",
432
+ text: JSON.stringify(
433
+ { id: args.id, status: "cancelled" },
434
+ null,
435
+ 2
436
+ )
437
+ }
438
+ ]
439
+ };
440
+ }
441
+ case "rush_agent_info": {
442
+ const { data } = await client.get(
443
+ `/api/agents/${encodeURIComponent(String(args.id))}`
444
+ );
445
+ return {
446
+ content: [
447
+ {
448
+ type: "text",
449
+ text: JSON.stringify(data, null, 2)
450
+ }
451
+ ]
452
+ };
453
+ }
454
+ case "rush_mcp_list": {
455
+ const params = new URLSearchParams();
456
+ if (args.category) params.set("category", String(args.category));
457
+ if (args.search) params.set("search", String(args.search));
458
+ if (args.page) params.set("page", String(args.page));
459
+ params.set("limit", "100");
460
+ const { data } = await client.get(`/api/mcp-registry?${params.toString()}`);
461
+ return {
462
+ content: [
463
+ {
464
+ type: "text",
465
+ text: JSON.stringify(data, null, 2)
466
+ }
467
+ ]
468
+ };
469
+ }
470
+ default:
471
+ return {
472
+ content: [
473
+ {
474
+ type: "text",
475
+ text: `Unknown tool: ${request.params.name}`
476
+ }
477
+ ],
478
+ isError: true
479
+ };
480
+ }
481
+ } catch (err) {
482
+ return {
483
+ content: [
484
+ {
485
+ type: "text",
486
+ text: `Error: ${err instanceof Error ? err.message : "Unknown error"}`
487
+ }
488
+ ],
489
+ isError: true
490
+ };
491
+ }
492
+ });
493
+ const transport = new StdioServerTransport();
494
+ await server.connect(transport);
495
+ }
496
+ export {
497
+ startMcpServer
498
+ };
499
+ //# sourceMappingURL=server-PVZOTJZA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/mcp/server.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { getAuthToken } from '../../util/auth.js';\nimport { createClient } from '../../util/client.js';\nimport {\n consumeSSEStreamWithReconnect,\n type SSEEvent,\n} from '../../util/sse.js';\nimport type { McpServer as McpRegistryServer } from './index.js';\n\ninterface AgentListResponse {\n agents: Array<{\n id: string;\n name: string;\n description: string;\n capabilities: string[];\n skillCount: number;\n mcpCount: number;\n status: string;\n }>;\n total: number;\n}\n\ninterface InvokeResponse {\n id: string;\n status: string;\n result: unknown;\n}\n\ninterface TaskCreateResponse {\n id: string;\n status: string;\n}\n\ninterface TaskStatusResponse {\n id: string;\n status: string;\n agent: string;\n prompt: string;\n result?: unknown;\n error?: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface TaskListResponse {\n tasks: TaskStatusResponse[];\n total: number;\n}\n\ninterface AgentDetailResponse {\n agent: {\n id: string;\n name: string;\n description: string | null;\n capabilities: string[] | null;\n skills: string[] | null;\n mcp_servers: unknown[] | null;\n status: string;\n visibility: string;\n provider_type: string;\n provider_model: string | null;\n system_prompt: string | null;\n created_at: string;\n updated_at: string;\n created_by_id: string | null;\n is_builtin: boolean;\n };\n}\n\ninterface TaskFile {\n id: string;\n filePath: string;\n fileName: string;\n ossPath?: string;\n ossUrl?: string;\n category: string;\n source: string;\n timestamp?: number;\n url?: string;\n conversationId?: string;\n}\n\ninterface TaskFilesResponse {\n files: TaskFile[];\n totalCount: number;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = new Server(\n {\n name: 'rush-ai',\n version: '0.2.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'rush_agent_list',\n description: 'List available Rush AI agents',\n inputSchema: {\n type: 'object' as const,\n properties: {},\n },\n },\n {\n name: 'rush_task_run',\n description: 'Run a task synchronously on a Rush AI agent',\n inputSchema: {\n type: 'object' as const,\n properties: {\n agent: {\n type: 'string',\n description: 'Agent name',\n },\n prompt: {\n type: 'string',\n description: 'Task prompt',\n },\n skills: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional skills to add',\n },\n mcpServers: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional MCP servers to add',\n },\n },\n required: ['agent', 'prompt'],\n },\n },\n {\n name: 'rush_task_create',\n description: 'Create an asynchronous task on a Rush AI agent',\n inputSchema: {\n type: 'object' as const,\n properties: {\n agent: {\n type: 'string',\n description: 'Agent name',\n },\n prompt: {\n type: 'string',\n description: 'Task prompt',\n },\n skills: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional skills to add',\n },\n mcpServers: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional MCP servers to add',\n },\n },\n required: ['agent', 'prompt'],\n },\n },\n {\n name: 'rush_task_status',\n description: 'Get the status of a task',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Task ID',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'rush_task_result',\n description: 'Get the result of a completed task',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Task ID',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'rush_task_list',\n description: 'List tasks',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: {\n type: 'number',\n description: 'Max results (default: 20)',\n },\n status: {\n type: 'string',\n description:\n 'Filter by status: pending, running, completed, failed, cancelled',\n },\n },\n },\n },\n {\n name: 'rush_task_files',\n description:\n 'List files generated by a task (code, images, documents, etc.)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Task ID',\n },\n category: {\n type: 'string',\n enum: ['code', 'image', 'document', 'other'],\n description: 'Optional filter by file category',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'rush_task_watch',\n description:\n 'Watch task execution in real-time. Blocks until task completes or timeout. Returns accumulated events.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Task ID',\n },\n timeout: {\n type: 'number',\n description: 'Max seconds to watch (default: 300, max: 600)',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'rush_task_cancel',\n description: 'Cancel a running task',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Task ID',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'rush_agent_info',\n description: 'Get detailed information about a specific agent',\n inputSchema: {\n type: 'object' as const,\n properties: {\n id: {\n type: 'string',\n description: 'Agent ID',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'rush_mcp_list',\n description:\n 'List available MCP servers registered on the platform. Use to discover what MCP servers can be passed to the --mcp parameter when creating tasks.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n category: {\n type: 'string',\n description:\n 'Filter by category (knowledge, dev-tools, observability, data, design, ci-cd, utilities)',\n },\n search: {\n type: 'string',\n description: 'Search by name or description',\n },\n page: {\n type: 'number',\n description: 'Page number (default: 1)',\n },\n },\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const token = getAuthToken();\n if (!token) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'Error: Not authenticated. Run `rush-ai auth login` first.',\n },\n ],\n isError: true,\n };\n }\n\n const client = createClient();\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n\n try {\n switch (request.params.name) {\n case 'rush_agent_list': {\n const { data } = await client.get<AgentListResponse>('/api/agents');\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n case 'rush_task_run': {\n const { data } = await client.post<InvokeResponse>(\n '/api/agent/invoke',\n {\n agent: args.agent,\n prompt: args.prompt,\n skills: args.skills,\n mcpServers: args.mcpServers,\n }\n );\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n case 'rush_task_create': {\n const { data } = await client.post<TaskCreateResponse>('/api/tasks', {\n agent: args.agent,\n prompt: args.prompt,\n skills: args.skills,\n mcpServers: args.mcpServers,\n });\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n case 'rush_task_status': {\n const { data } = await client.get<TaskStatusResponse>(\n `/api/tasks/${encodeURIComponent(String(args.id))}`\n );\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n case 'rush_task_result': {\n const { data } = await client.get<{\n result: unknown;\n }>(`/api/tasks/${encodeURIComponent(String(args.id))}/result`);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n case 'rush_task_list': {\n const params = new URLSearchParams();\n if (args.limit) params.set('limit', String(args.limit));\n if (args.status) params.set('status', String(args.status));\n const { data } = await client.get<TaskListResponse>(\n `/api/tasks?${params.toString()}`\n );\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n case 'rush_task_files': {\n const { data } = await client.get<TaskFilesResponse>(\n `/api/chat/${encodeURIComponent(String(args.id))}/files`\n );\n const validCategories = ['code', 'image', 'document', 'other'];\n let files = data.files;\n if (\n args.category &&\n typeof args.category === 'string' &&\n validCategories.includes(args.category)\n ) {\n files = files.filter((f) => f.category === args.category);\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(\n { files, totalCount: files.length },\n null,\n 2\n ),\n },\n ],\n };\n }\n\n case 'rush_task_watch': {\n const TERMINAL_STATUSES = ['completed', 'failed', 'cancelled'];\n const timeoutSec = Math.min(\n Math.max(Number(args.timeout) || 300, 1),\n 600\n );\n const events: SSEEvent[] = [];\n let truncated = false;\n let watchError: string | null = null;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n truncated = true;\n controller.abort();\n }, timeoutSec * 1000);\n\n try {\n const connectFn = async () => {\n const response = await client.fetchRaw(\n `/api/tasks/${encodeURIComponent(String(args.id))}/events`,\n { method: 'GET' }\n );\n if (!response.body) throw new Error('No response body');\n return response.body;\n };\n\n await consumeSSEStreamWithReconnect(\n connectFn,\n (event) => {\n events.push(event);\n },\n {\n signal: controller.signal,\n isTerminal: (event) =>\n event.type === 'status' &&\n TERMINAL_STATUSES.includes(event.data),\n }\n );\n } catch (err) {\n if (!truncated) {\n // Real error (not timeout) — report it\n watchError = err instanceof Error ? err.message : 'Unknown error';\n }\n } finally {\n clearTimeout(timeoutId);\n }\n\n // If we got no events and there was an error, return as error\n if (events.length === 0 && watchError) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error: ${watchError}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(\n {\n events,\n truncated,\n eventCount: events.length,\n ...(watchError ? { error: watchError } : {}),\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n\n case 'rush_task_cancel': {\n await client.delete(\n `/api/tasks/${encodeURIComponent(String(args.id))}`\n );\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(\n { id: args.id, status: 'cancelled' },\n null,\n 2\n ),\n },\n ],\n };\n }\n\n case 'rush_agent_info': {\n const { data } = await client.get<AgentDetailResponse>(\n `/api/agents/${encodeURIComponent(String(args.id))}`\n );\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n case 'rush_mcp_list': {\n const params = new URLSearchParams();\n if (args.category) params.set('category', String(args.category));\n if (args.search) params.set('search', String(args.search));\n if (args.page) params.set('page', String(args.page));\n params.set('limit', '100');\n const { data } = await client.get<{\n data: McpRegistryServer[];\n }>(`/api/mcp-registry?${params.toString()}`);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n default:\n return {\n content: [\n {\n type: 'text' as const,\n text: `Unknown tool: ${request.params.name}`,\n },\n ],\n isError: true,\n };\n }\n } catch (err) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error: ${err instanceof Error ? err.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "rush-ai",
3
+ "version": "0.2.0",
4
+ "description": "Rush CLI - Command-line interface for the Rush AI platform",
5
+ "private": false,
6
+ "type": "module",
7
+ "license": "MIT",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "bin": {
11
+ "rush-ai": "./dist/index.js"
12
+ },
13
+ "exports": {
14
+ ".": "./dist/index.js"
15
+ },
16
+ "files": ["dist", "README.md", "LICENSE"],
17
+ "publishConfig": {
18
+ "access": "public",
19
+ "registry": "https://registry.npmjs.org/"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/kanyun-inc/rush-app",
24
+ "directory": "packages/rush-cli"
25
+ },
26
+ "keywords": ["rush", "ai", "cli", "agent", "mcp"],
27
+ "scripts": {
28
+ "build": "tsup",
29
+ "dev": "tsup --watch",
30
+ "typecheck": "tsc --noEmit",
31
+ "test": "vitest run",
32
+ "test:watch": "vitest",
33
+ "test:e2e": "vitest --config vitest.e2e.config.ts --no-watch",
34
+ "test:smoke": "vitest --config vitest.smoke.config.ts --no-watch",
35
+ "test:all": "pnpm test && pnpm test:e2e",
36
+ "clean": "rm -rf dist node_modules"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.12.1",
40
+ "chalk": "^5.4.1",
41
+ "commander": "^13.1.0",
42
+ "conf": "^13.1.0",
43
+ "open": "^10.1.2",
44
+ "ora": "^8.2.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.15.0",
48
+ "tsup": "^8.4.0",
49
+ "typescript": "^5.8.2",
50
+ "vitest": "^4.0.4"
51
+ }
52
+ }