@nils.del/supergrok 1.0.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/.env +45 -0
- package/.grok/settings.json +13 -0
- package/dist/agent/index.d.ts +35 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +244 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +242 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +33 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +134 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +15 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +123 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/transports.d.ts +24 -0
- package/dist/mcp/transports.d.ts.map +1 -0
- package/dist/mcp/transports.js +91 -0
- package/dist/mcp/transports.js.map +1 -0
- package/dist/tools/bash.d.ts +28 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +70 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/index.d.ts +77 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +80 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/text-editor.d.ts +69 -0
- package/dist/tools/text-editor.d.ts.map +1 -0
- package/dist/tools/text-editor.js +178 -0
- package/dist/tools/text-editor.js.map +1 -0
- package/dist/tools/types.d.ts +14 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/ui/readline-ui.d.ts +32 -0
- package/dist/ui/readline-ui.d.ts.map +1 -0
- package/dist/ui/readline-ui.js +256 -0
- package/dist/ui/readline-ui.js.map +1 -0
- package/dist/utils/settings.d.ts +20 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +101 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +51 -0
- package/src/agent/index.ts +302 -0
- package/src/index.ts +275 -0
- package/src/mcp/client.ts +178 -0
- package/src/mcp/config.ts +149 -0
- package/src/mcp/transports.ts +142 -0
- package/src/tools/bash.ts +84 -0
- package/src/tools/index.ts +91 -0
- package/src/tools/text-editor.ts +222 -0
- package/src/tools/types.ts +14 -0
- package/src/ui/readline-ui.ts +294 -0
- package/src/utils/settings.ts +129 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { EventEmitter } from "events";
|
|
3
|
+
import { createTransport } from "./transports.js";
|
|
4
|
+
export class MCPManager extends EventEmitter {
|
|
5
|
+
clients = new Map();
|
|
6
|
+
transports = new Map();
|
|
7
|
+
tools = new Map();
|
|
8
|
+
initPromise = null;
|
|
9
|
+
async addServer(config) {
|
|
10
|
+
try {
|
|
11
|
+
let transportConfig = config.transport;
|
|
12
|
+
if (!transportConfig && config.command) {
|
|
13
|
+
transportConfig = {
|
|
14
|
+
type: 'stdio',
|
|
15
|
+
command: config.command,
|
|
16
|
+
args: config.args,
|
|
17
|
+
env: config.env
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (!transportConfig) {
|
|
21
|
+
throw new Error('Transport configuration is required');
|
|
22
|
+
}
|
|
23
|
+
const transport = createTransport(transportConfig);
|
|
24
|
+
this.transports.set(config.name, transport);
|
|
25
|
+
const client = new Client({
|
|
26
|
+
name: "grok-cli-fixed",
|
|
27
|
+
version: "1.0.0"
|
|
28
|
+
});
|
|
29
|
+
this.clients.set(config.name, client);
|
|
30
|
+
const sdkTransport = await transport.connect();
|
|
31
|
+
await client.connect(sdkTransport);
|
|
32
|
+
const toolsResult = await client.listTools();
|
|
33
|
+
for (const tool of toolsResult.tools) {
|
|
34
|
+
const mcpTool = {
|
|
35
|
+
name: `mcp__${config.name}__${tool.name}`,
|
|
36
|
+
description: tool.description || `Tool from ${config.name} server`,
|
|
37
|
+
inputSchema: tool.inputSchema,
|
|
38
|
+
serverName: config.name
|
|
39
|
+
};
|
|
40
|
+
this.tools.set(mcpTool.name, mcpTool);
|
|
41
|
+
}
|
|
42
|
+
this.emit('serverAdded', config.name, toolsResult.tools.length);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
this.emit('serverError', config.name, error);
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async removeServer(serverName) {
|
|
50
|
+
for (const [toolName, tool] of this.tools.entries()) {
|
|
51
|
+
if (tool.serverName === serverName) {
|
|
52
|
+
this.tools.delete(toolName);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const client = this.clients.get(serverName);
|
|
56
|
+
if (client) {
|
|
57
|
+
await client.close();
|
|
58
|
+
this.clients.delete(serverName);
|
|
59
|
+
}
|
|
60
|
+
const transport = this.transports.get(serverName);
|
|
61
|
+
if (transport) {
|
|
62
|
+
await transport.disconnect();
|
|
63
|
+
this.transports.delete(serverName);
|
|
64
|
+
}
|
|
65
|
+
this.emit('serverRemoved', serverName);
|
|
66
|
+
}
|
|
67
|
+
async callTool(toolName, arguments_) {
|
|
68
|
+
const tool = this.tools.get(toolName);
|
|
69
|
+
if (!tool) {
|
|
70
|
+
throw new Error(`Tool ${toolName} not found`);
|
|
71
|
+
}
|
|
72
|
+
const client = this.clients.get(tool.serverName);
|
|
73
|
+
if (!client) {
|
|
74
|
+
throw new Error(`Server ${tool.serverName} not connected`);
|
|
75
|
+
}
|
|
76
|
+
const originalToolName = toolName.replace(`mcp__${tool.serverName}__`, '');
|
|
77
|
+
const result = await client.callTool({
|
|
78
|
+
name: originalToolName,
|
|
79
|
+
arguments: arguments_
|
|
80
|
+
});
|
|
81
|
+
// Ensure result has proper content structure
|
|
82
|
+
return {
|
|
83
|
+
content: result.content || [],
|
|
84
|
+
isError: result.isError,
|
|
85
|
+
_meta: result._meta
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
getTools() {
|
|
89
|
+
return Array.from(this.tools.values());
|
|
90
|
+
}
|
|
91
|
+
getServers() {
|
|
92
|
+
return Array.from(this.clients.keys());
|
|
93
|
+
}
|
|
94
|
+
async shutdown() {
|
|
95
|
+
const serverNames = Array.from(this.clients.keys());
|
|
96
|
+
await Promise.all(serverNames.map(name => this.removeServer(name)));
|
|
97
|
+
}
|
|
98
|
+
getTransportType(serverName) {
|
|
99
|
+
const transport = this.transports.get(serverName);
|
|
100
|
+
return transport?.getType();
|
|
101
|
+
}
|
|
102
|
+
async ensureServersInitialized() {
|
|
103
|
+
if (this.initPromise) {
|
|
104
|
+
return this.initPromise;
|
|
105
|
+
}
|
|
106
|
+
if (this.clients.size > 0) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.initPromise = this.initializeServers();
|
|
110
|
+
return this.initPromise;
|
|
111
|
+
}
|
|
112
|
+
async initializeServers() {
|
|
113
|
+
const { loadMCPConfig } = await import('./config.js');
|
|
114
|
+
const config = loadMCPConfig();
|
|
115
|
+
const initPromises = config.servers.map(async (serverConfig) => {
|
|
116
|
+
try {
|
|
117
|
+
await this.addServer(serverConfig);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// Silently fail for individual servers
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
await Promise.all(initPromises);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Singleton instance
|
|
127
|
+
let mcpManager = null;
|
|
128
|
+
export function getMCPManager() {
|
|
129
|
+
if (!mcpManager) {
|
|
130
|
+
mcpManager = new MCPManager();
|
|
131
|
+
}
|
|
132
|
+
return mcpManager;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TransportConfig } from './transports.js';
|
|
2
|
+
export interface MCPServerConfig {
|
|
3
|
+
name: string;
|
|
4
|
+
transport: TransportConfig;
|
|
5
|
+
command?: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface MCPConfig {
|
|
10
|
+
servers: MCPServerConfig[];
|
|
11
|
+
}
|
|
12
|
+
export declare function loadMCPConfig(): MCPConfig;
|
|
13
|
+
export declare function saveMCPServerConfig(serverConfig: MCPServerConfig): void;
|
|
14
|
+
export declare function removeMCPServerConfig(serverName: string): boolean;
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAUD,wBAAgB,aAAa,IAAI,SAAS,CA6DzC;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,CAsCvE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAoBjE"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
function getProjectSettingsPath() {
|
|
5
|
+
return path.join(process.cwd(), '.grok', 'settings.json');
|
|
6
|
+
}
|
|
7
|
+
function getUserSettingsPath() {
|
|
8
|
+
return path.join(os.homedir(), '.grok', 'user-settings.json');
|
|
9
|
+
}
|
|
10
|
+
export function loadMCPConfig() {
|
|
11
|
+
const config = { servers: [] };
|
|
12
|
+
// Try loading project-level settings first
|
|
13
|
+
const projectSettingsPath = getProjectSettingsPath();
|
|
14
|
+
if (fs.existsSync(projectSettingsPath)) {
|
|
15
|
+
try {
|
|
16
|
+
const projectSettings = JSON.parse(fs.readFileSync(projectSettingsPath, 'utf-8'));
|
|
17
|
+
if (projectSettings.mcpServers) {
|
|
18
|
+
for (const [name, serverConfig] of Object.entries(projectSettings.mcpServers)) {
|
|
19
|
+
const server = serverConfig;
|
|
20
|
+
config.servers.push({
|
|
21
|
+
name,
|
|
22
|
+
transport: server.transport || {
|
|
23
|
+
type: 'stdio',
|
|
24
|
+
command: server.command,
|
|
25
|
+
args: server.args,
|
|
26
|
+
env: server.env
|
|
27
|
+
},
|
|
28
|
+
command: server.command,
|
|
29
|
+
args: server.args,
|
|
30
|
+
env: server.env
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.warn('Failed to parse project MCP settings:', error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Also check user-level settings for global MCP servers
|
|
40
|
+
const userSettingsPath = getUserSettingsPath();
|
|
41
|
+
if (fs.existsSync(userSettingsPath)) {
|
|
42
|
+
try {
|
|
43
|
+
const userSettings = JSON.parse(fs.readFileSync(userSettingsPath, 'utf-8'));
|
|
44
|
+
if (userSettings.mcpServers) {
|
|
45
|
+
for (const [name, serverConfig] of Object.entries(userSettings.mcpServers)) {
|
|
46
|
+
// Don't duplicate if already defined in project settings
|
|
47
|
+
if (!config.servers.find(s => s.name === name)) {
|
|
48
|
+
const server = serverConfig;
|
|
49
|
+
config.servers.push({
|
|
50
|
+
name,
|
|
51
|
+
transport: server.transport || {
|
|
52
|
+
type: 'stdio',
|
|
53
|
+
command: server.command,
|
|
54
|
+
args: server.args,
|
|
55
|
+
env: server.env
|
|
56
|
+
},
|
|
57
|
+
command: server.command,
|
|
58
|
+
args: server.args,
|
|
59
|
+
env: server.env
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.warn('Failed to parse user MCP settings:', error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return config;
|
|
70
|
+
}
|
|
71
|
+
export function saveMCPServerConfig(serverConfig) {
|
|
72
|
+
const settingsPath = getProjectSettingsPath();
|
|
73
|
+
const settingsDir = path.dirname(settingsPath);
|
|
74
|
+
if (!fs.existsSync(settingsDir)) {
|
|
75
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
let settings = {};
|
|
78
|
+
if (fs.existsSync(settingsPath)) {
|
|
79
|
+
try {
|
|
80
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
// Start fresh if parsing fails
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!settings.mcpServers) {
|
|
87
|
+
settings.mcpServers = {};
|
|
88
|
+
}
|
|
89
|
+
// Save the server configuration
|
|
90
|
+
const serverData = {
|
|
91
|
+
name: serverConfig.name,
|
|
92
|
+
transport: serverConfig.transport.type
|
|
93
|
+
};
|
|
94
|
+
if (serverConfig.transport.type === 'stdio') {
|
|
95
|
+
serverData.command = serverConfig.transport.command;
|
|
96
|
+
serverData.args = serverConfig.transport.args;
|
|
97
|
+
serverData.env = serverConfig.transport.env;
|
|
98
|
+
}
|
|
99
|
+
else if (serverConfig.transport.type === 'http' || serverConfig.transport.type === 'sse') {
|
|
100
|
+
serverData.url = serverConfig.transport.url;
|
|
101
|
+
}
|
|
102
|
+
settings.mcpServers[serverConfig.name] = serverData;
|
|
103
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
104
|
+
}
|
|
105
|
+
export function removeMCPServerConfig(serverName) {
|
|
106
|
+
const settingsPath = getProjectSettingsPath();
|
|
107
|
+
if (!fs.existsSync(settingsPath)) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
112
|
+
if (!settings.mcpServers || !settings.mcpServers[serverName]) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
delete settings.mcpServers[serverName];
|
|
116
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
export type TransportType = 'stdio' | 'http' | 'sse';
|
|
3
|
+
export interface StdioTransportConfig {
|
|
4
|
+
type: 'stdio';
|
|
5
|
+
command: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface HttpTransportConfig {
|
|
10
|
+
type: 'http';
|
|
11
|
+
url: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SSETransportConfig {
|
|
14
|
+
type: 'sse';
|
|
15
|
+
url: string;
|
|
16
|
+
}
|
|
17
|
+
export type TransportConfig = StdioTransportConfig | HttpTransportConfig | SSETransportConfig;
|
|
18
|
+
export interface MCPTransport {
|
|
19
|
+
connect(): Promise<Transport>;
|
|
20
|
+
disconnect(): Promise<void>;
|
|
21
|
+
getType(): TransportType;
|
|
22
|
+
}
|
|
23
|
+
export declare function createTransport(config: TransportConfig): MCPTransport;
|
|
24
|
+
//# sourceMappingURL=transports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transports.d.ts","sourceRoot":"","sources":["../../src/mcp/transports.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAE9F,MAAM,WAAW,YAAY;IAC3B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,aAAa,CAAC;CAC1B;AAoGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAWrE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
2
|
+
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
3
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
4
|
+
class StdioMCPTransport {
|
|
5
|
+
config;
|
|
6
|
+
transport = null;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
async connect() {
|
|
11
|
+
const env = {};
|
|
12
|
+
// Copy process.env, filtering out undefined values
|
|
13
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
14
|
+
if (value !== undefined) {
|
|
15
|
+
env[key] = value;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// Merge with config env
|
|
19
|
+
if (this.config.env) {
|
|
20
|
+
Object.assign(env, this.config.env);
|
|
21
|
+
}
|
|
22
|
+
this.transport = new StdioClientTransport({
|
|
23
|
+
command: this.config.command,
|
|
24
|
+
args: this.config.args || [],
|
|
25
|
+
env
|
|
26
|
+
});
|
|
27
|
+
return this.transport;
|
|
28
|
+
}
|
|
29
|
+
async disconnect() {
|
|
30
|
+
if (this.transport) {
|
|
31
|
+
await this.transport.close();
|
|
32
|
+
this.transport = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
getType() {
|
|
36
|
+
return 'stdio';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
class HttpMCPTransport {
|
|
40
|
+
config;
|
|
41
|
+
transport = null;
|
|
42
|
+
constructor(config) {
|
|
43
|
+
this.config = config;
|
|
44
|
+
}
|
|
45
|
+
async connect() {
|
|
46
|
+
this.transport = new StreamableHTTPClientTransport(new URL(this.config.url));
|
|
47
|
+
return this.transport;
|
|
48
|
+
}
|
|
49
|
+
async disconnect() {
|
|
50
|
+
if (this.transport) {
|
|
51
|
+
await this.transport.close();
|
|
52
|
+
this.transport = null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
getType() {
|
|
56
|
+
return 'http';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
class SSEMCPTransport {
|
|
60
|
+
config;
|
|
61
|
+
transport = null;
|
|
62
|
+
constructor(config) {
|
|
63
|
+
this.config = config;
|
|
64
|
+
}
|
|
65
|
+
async connect() {
|
|
66
|
+
this.transport = new SSEClientTransport(new URL(this.config.url));
|
|
67
|
+
return this.transport;
|
|
68
|
+
}
|
|
69
|
+
async disconnect() {
|
|
70
|
+
if (this.transport) {
|
|
71
|
+
await this.transport.close();
|
|
72
|
+
this.transport = null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
getType() {
|
|
76
|
+
return 'sse';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function createTransport(config) {
|
|
80
|
+
switch (config.type) {
|
|
81
|
+
case 'stdio':
|
|
82
|
+
return new StdioMCPTransport(config);
|
|
83
|
+
case 'http':
|
|
84
|
+
return new HttpMCPTransport(config);
|
|
85
|
+
case 'sse':
|
|
86
|
+
return new SSEMCPTransport(config);
|
|
87
|
+
default:
|
|
88
|
+
throw new Error(`Unknown transport type: ${config.type}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=transports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/mcp/transports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ToolResult } from './types.js';
|
|
2
|
+
export interface BashToolArgs {
|
|
3
|
+
command: string;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function executeBashCommand(args: BashToolArgs): Promise<ToolResult>;
|
|
7
|
+
export declare const bashToolDefinition: {
|
|
8
|
+
type: "function";
|
|
9
|
+
function: {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
parameters: {
|
|
13
|
+
type: string;
|
|
14
|
+
properties: {
|
|
15
|
+
command: {
|
|
16
|
+
type: string;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
timeout: {
|
|
20
|
+
type: string;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
required: string[];
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=bash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAqDhF;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;CAoB9B,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
export async function executeBashCommand(args) {
|
|
3
|
+
const { command, timeout = 120000 } = args;
|
|
4
|
+
return new Promise((resolve) => {
|
|
5
|
+
const childProcess = spawn('bash', ['-c', command], {
|
|
6
|
+
cwd: process.cwd(),
|
|
7
|
+
env: process.env,
|
|
8
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
9
|
+
});
|
|
10
|
+
let stdout = '';
|
|
11
|
+
let stderr = '';
|
|
12
|
+
const timer = setTimeout(() => {
|
|
13
|
+
childProcess.kill('SIGTERM');
|
|
14
|
+
resolve({
|
|
15
|
+
success: false,
|
|
16
|
+
error: `Command timed out after ${timeout}ms`
|
|
17
|
+
});
|
|
18
|
+
}, timeout);
|
|
19
|
+
childProcess.stdout.on('data', (data) => {
|
|
20
|
+
stdout += data.toString();
|
|
21
|
+
});
|
|
22
|
+
childProcess.stderr.on('data', (data) => {
|
|
23
|
+
stderr += data.toString();
|
|
24
|
+
});
|
|
25
|
+
childProcess.on('close', (code) => {
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
if (code === 0) {
|
|
28
|
+
resolve({
|
|
29
|
+
success: true,
|
|
30
|
+
output: stdout.trim() || stderr.trim() || 'Command completed successfully'
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
resolve({
|
|
35
|
+
success: false,
|
|
36
|
+
error: stderr.trim() || stdout.trim() || `Command failed with exit code ${code}`
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
childProcess.on('error', (error) => {
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
resolve({
|
|
43
|
+
success: false,
|
|
44
|
+
error: `Failed to execute command: ${error.message}`
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export const bashToolDefinition = {
|
|
50
|
+
type: "function",
|
|
51
|
+
function: {
|
|
52
|
+
name: "bash",
|
|
53
|
+
description: "Execute a bash command and return the output. Use this for running shell commands, file operations, git commands, etc.",
|
|
54
|
+
parameters: {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
command: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: "The bash command to execute"
|
|
60
|
+
},
|
|
61
|
+
timeout: {
|
|
62
|
+
type: "number",
|
|
63
|
+
description: "Optional timeout in milliseconds (default: 120000)"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
required: ["command"]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAQtC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAkB;IACzD,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAE3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YAClD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,2BAA2B,OAAO,IAAI;aAC9C,CAAC,CAAC;QACL,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,YAAY,CAAC,KAAK,CAAC,CAAC;YAEpB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC;oBACN,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,gCAAgC;iBAC3E,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,iCAAiC,IAAI,EAAE;iBACjF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,8BAA8B,KAAK,CAAC,OAAO,EAAE;aACrD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,UAAmB;IACzB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,wHAAwH;QACrI,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oDAAoD;iBAClE;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ToolResult, ToolCall } from './types.js';
|
|
2
|
+
export { ToolResult, ToolCall };
|
|
3
|
+
export declare function getBuiltInTools(): ({
|
|
4
|
+
type: "function";
|
|
5
|
+
function: {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
parameters: {
|
|
9
|
+
type: string;
|
|
10
|
+
properties: {
|
|
11
|
+
command: {
|
|
12
|
+
type: string;
|
|
13
|
+
description: string;
|
|
14
|
+
};
|
|
15
|
+
timeout: {
|
|
16
|
+
type: string;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
required: string[];
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
} | {
|
|
24
|
+
type: "function";
|
|
25
|
+
function: {
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
parameters: {
|
|
29
|
+
type: string;
|
|
30
|
+
properties: {
|
|
31
|
+
command: {
|
|
32
|
+
type: string;
|
|
33
|
+
enum: string[];
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
path: {
|
|
37
|
+
type: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
file_text: {
|
|
41
|
+
type: string;
|
|
42
|
+
description: string;
|
|
43
|
+
};
|
|
44
|
+
old_str: {
|
|
45
|
+
type: string;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
new_str: {
|
|
49
|
+
type: string;
|
|
50
|
+
description: string;
|
|
51
|
+
};
|
|
52
|
+
insert_line: {
|
|
53
|
+
type: string;
|
|
54
|
+
description: string;
|
|
55
|
+
};
|
|
56
|
+
view_range: {
|
|
57
|
+
type: string;
|
|
58
|
+
items: {
|
|
59
|
+
type: string;
|
|
60
|
+
};
|
|
61
|
+
description: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
required: string[];
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
})[];
|
|
68
|
+
export declare function getAllTools(): Promise<{
|
|
69
|
+
type: "function";
|
|
70
|
+
function: {
|
|
71
|
+
name: string;
|
|
72
|
+
description: string;
|
|
73
|
+
parameters: any;
|
|
74
|
+
};
|
|
75
|
+
}[]>;
|
|
76
|
+
export declare function executeToolCall(toolCall: ToolCall): Promise<ToolResult>;
|
|
77
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKlD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAEhC,wBAAgB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAE9B;AAED,wBAAsB,WAAW;;;;;;;KAiBhC;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CA4D7E"}
|