xibecode 0.0.3 → 0.0.4
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/README.md +192 -2
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +52 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +168 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/mcp.d.ts +11 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +217 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/punycode.d.ts +5 -0
- package/dist/commands/punycode.d.ts.map +1 -0
- package/dist/commands/punycode.js +48 -0
- package/dist/commands/punycode.js.map +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +24 -0
- package/dist/commands/run.js.map +1 -1
- package/dist/core/agent.d.ts +5 -1
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +317 -11
- package/dist/core/agent.js.map +1 -1
- package/dist/core/mcp-client.d.ts +80 -0
- package/dist/core/mcp-client.d.ts.map +1 -0
- package/dist/core/mcp-client.js +250 -0
- package/dist/core/mcp-client.js.map +1 -0
- package/dist/core/modes.d.ts +125 -0
- package/dist/core/modes.d.ts.map +1 -0
- package/dist/core/modes.js +459 -0
- package/dist/core/modes.js.map +1 -0
- package/dist/core/tools.d.ts +3 -0
- package/dist/core/tools.d.ts.map +1 -1
- package/dist/core/tools.js +32 -1
- package/dist/core/tools.js.map +1 -1
- package/dist/index.js +43 -2
- package/dist/index.js.map +1 -1
- package/dist/ui/enhanced-tui.js +1 -1
- package/dist/utils/config.d.ts +40 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +80 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/mcp-servers-file.d.ts +39 -0
- package/dist/utils/mcp-servers-file.d.ts.map +1 -0
- package/dist/utils/mcp-servers-file.js +160 -0
- package/dist/utils/mcp-servers-file.js.map +1 -0
- package/package.json +10 -8
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages connections to MCP servers and provides unified access to their capabilities
|
|
5
|
+
*/
|
|
6
|
+
export class MCPClientManager {
|
|
7
|
+
clients = new Map();
|
|
8
|
+
serverConfigs = new Map();
|
|
9
|
+
tools = new Map();
|
|
10
|
+
resources = new Map();
|
|
11
|
+
prompts = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Connect to an MCP server
|
|
14
|
+
*/
|
|
15
|
+
async connect(serverConfig) {
|
|
16
|
+
if (this.clients.has(serverConfig.name)) {
|
|
17
|
+
throw new Error(`Already connected to MCP server: ${serverConfig.name}`);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const client = new Client({
|
|
21
|
+
name: 'xibecode',
|
|
22
|
+
version: '1.0.0',
|
|
23
|
+
}, {
|
|
24
|
+
capabilities: {},
|
|
25
|
+
});
|
|
26
|
+
if (serverConfig.transport !== 'stdio') {
|
|
27
|
+
throw new Error(`Currently only 'stdio' transport is supported. Server: ${serverConfig.name}`);
|
|
28
|
+
}
|
|
29
|
+
if (!serverConfig.command) {
|
|
30
|
+
throw new Error(`stdio transport requires 'command' for server ${serverConfig.name}`);
|
|
31
|
+
}
|
|
32
|
+
const transport = new StdioClientTransport({
|
|
33
|
+
command: serverConfig.command,
|
|
34
|
+
args: serverConfig.args || [],
|
|
35
|
+
env: serverConfig.env,
|
|
36
|
+
});
|
|
37
|
+
await client.connect(transport);
|
|
38
|
+
// Store client and config
|
|
39
|
+
this.clients.set(serverConfig.name, client);
|
|
40
|
+
this.serverConfigs.set(serverConfig.name, serverConfig);
|
|
41
|
+
// Discover and cache capabilities
|
|
42
|
+
await this.discoverCapabilities(serverConfig.name);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw new Error(`Failed to connect to MCP server ${serverConfig.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Disconnect from an MCP server
|
|
50
|
+
*/
|
|
51
|
+
async disconnect(serverName) {
|
|
52
|
+
const client = this.clients.get(serverName);
|
|
53
|
+
if (!client) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await client.close();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Log but don't throw - we're disconnecting anyway
|
|
61
|
+
console.error(`Error disconnecting from ${serverName}:`, error);
|
|
62
|
+
}
|
|
63
|
+
this.clients.delete(serverName);
|
|
64
|
+
this.serverConfigs.delete(serverName);
|
|
65
|
+
// Remove cached capabilities
|
|
66
|
+
for (const [key, tool] of this.tools.entries()) {
|
|
67
|
+
if (tool.serverName === serverName) {
|
|
68
|
+
this.tools.delete(key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const [key, resource] of this.resources.entries()) {
|
|
72
|
+
if (resource.serverName === serverName) {
|
|
73
|
+
this.resources.delete(key);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const [key, prompt] of this.prompts.entries()) {
|
|
77
|
+
if (prompt.serverName === serverName) {
|
|
78
|
+
this.prompts.delete(key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Disconnect from all MCP servers
|
|
84
|
+
*/
|
|
85
|
+
async disconnectAll() {
|
|
86
|
+
const serverNames = Array.from(this.clients.keys());
|
|
87
|
+
await Promise.all(serverNames.map(name => this.disconnect(name)));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Discover and cache capabilities from a connected server
|
|
91
|
+
*/
|
|
92
|
+
async discoverCapabilities(serverName) {
|
|
93
|
+
const client = this.clients.get(serverName);
|
|
94
|
+
if (!client) {
|
|
95
|
+
throw new Error(`Not connected to server: ${serverName}`);
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
// Discover tools
|
|
99
|
+
const toolsList = await client.listTools();
|
|
100
|
+
if (toolsList.tools) {
|
|
101
|
+
for (const tool of toolsList.tools) {
|
|
102
|
+
const mcpTool = { ...tool, serverName };
|
|
103
|
+
this.tools.set(`${serverName}::${tool.name}`, mcpTool);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Discover resources
|
|
107
|
+
const resourcesList = await client.listResources();
|
|
108
|
+
if (resourcesList.resources) {
|
|
109
|
+
for (const resource of resourcesList.resources) {
|
|
110
|
+
const mcpResource = { ...resource, serverName };
|
|
111
|
+
this.resources.set(`${serverName}::${resource.uri}`, mcpResource);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Discover prompts
|
|
115
|
+
const promptsList = await client.listPrompts();
|
|
116
|
+
if (promptsList.prompts) {
|
|
117
|
+
for (const prompt of promptsList.prompts) {
|
|
118
|
+
const mcpPrompt = { ...prompt, serverName };
|
|
119
|
+
this.prompts.set(`${serverName}::${prompt.name}`, mcpPrompt);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw new Error(`Failed to discover capabilities for ${serverName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get all available tools from all connected MCP servers
|
|
129
|
+
*/
|
|
130
|
+
getAvailableTools() {
|
|
131
|
+
return Array.from(this.tools.values());
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get all available resources from all connected MCP servers
|
|
135
|
+
*/
|
|
136
|
+
getAvailableResources() {
|
|
137
|
+
return Array.from(this.resources.values());
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get all available prompts from all connected MCP servers
|
|
141
|
+
*/
|
|
142
|
+
getAvailablePrompts() {
|
|
143
|
+
return Array.from(this.prompts.values());
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Execute a tool from an MCP server
|
|
147
|
+
*/
|
|
148
|
+
async executeMCPTool(toolName, args) {
|
|
149
|
+
// Parse server name from toolName (format: "serverName::actualToolName")
|
|
150
|
+
const parts = toolName.split('::');
|
|
151
|
+
if (parts.length !== 2) {
|
|
152
|
+
throw new Error(`Invalid MCP tool name format: ${toolName}. Expected format: serverName::toolName`);
|
|
153
|
+
}
|
|
154
|
+
const [serverName, actualToolName] = parts;
|
|
155
|
+
const client = this.clients.get(serverName);
|
|
156
|
+
if (!client) {
|
|
157
|
+
throw new Error(`Not connected to MCP server: ${serverName}`);
|
|
158
|
+
}
|
|
159
|
+
const tool = this.tools.get(toolName);
|
|
160
|
+
if (!tool) {
|
|
161
|
+
throw new Error(`Tool not found: ${toolName}`);
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const result = await client.callTool({
|
|
165
|
+
name: actualToolName,
|
|
166
|
+
arguments: args,
|
|
167
|
+
});
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
throw new Error(`Failed to execute MCP tool ${toolName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Read a resource from an MCP server
|
|
176
|
+
*/
|
|
177
|
+
async readResource(resourceUri) {
|
|
178
|
+
// Parse server name from resourceUri (format: "serverName::actualUri")
|
|
179
|
+
const parts = resourceUri.split('::');
|
|
180
|
+
if (parts.length !== 2) {
|
|
181
|
+
throw new Error(`Invalid MCP resource URI format: ${resourceUri}. Expected format: serverName::uri`);
|
|
182
|
+
}
|
|
183
|
+
const [serverName, actualUri] = parts;
|
|
184
|
+
const client = this.clients.get(serverName);
|
|
185
|
+
if (!client) {
|
|
186
|
+
throw new Error(`Not connected to MCP server: ${serverName}`);
|
|
187
|
+
}
|
|
188
|
+
const resource = this.resources.get(resourceUri);
|
|
189
|
+
if (!resource) {
|
|
190
|
+
throw new Error(`Resource not found: ${resourceUri}`);
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
const result = await client.readResource({
|
|
194
|
+
uri: actualUri,
|
|
195
|
+
});
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
throw new Error(`Failed to read MCP resource ${resourceUri}: ${error instanceof Error ? error.message : String(error)}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get a prompt from an MCP server
|
|
204
|
+
*/
|
|
205
|
+
async getPrompt(promptName, args) {
|
|
206
|
+
// Parse server name from promptName (format: "serverName::actualPromptName")
|
|
207
|
+
const parts = promptName.split('::');
|
|
208
|
+
if (parts.length !== 2) {
|
|
209
|
+
throw new Error(`Invalid MCP prompt name format: ${promptName}. Expected format: serverName::promptName`);
|
|
210
|
+
}
|
|
211
|
+
const [serverName, actualPromptName] = parts;
|
|
212
|
+
const client = this.clients.get(serverName);
|
|
213
|
+
if (!client) {
|
|
214
|
+
throw new Error(`Not connected to MCP server: ${serverName}`);
|
|
215
|
+
}
|
|
216
|
+
const prompt = this.prompts.get(promptName);
|
|
217
|
+
if (!prompt) {
|
|
218
|
+
throw new Error(`Prompt not found: ${promptName}`);
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const result = await client.getPrompt({
|
|
222
|
+
name: actualPromptName,
|
|
223
|
+
arguments: args,
|
|
224
|
+
});
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw new Error(`Failed to get MCP prompt ${promptName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get list of connected servers
|
|
233
|
+
*/
|
|
234
|
+
getConnectedServers() {
|
|
235
|
+
return Array.from(this.clients.keys());
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Check if connected to a specific server
|
|
239
|
+
*/
|
|
240
|
+
isConnected(serverName) {
|
|
241
|
+
return this.clients.has(serverName);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get server configuration
|
|
245
|
+
*/
|
|
246
|
+
getServerConfig(serverName) {
|
|
247
|
+
return this.serverConfigs.get(serverName);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/core/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-mode architecture for XibeCode
|
|
3
|
+
* Defines different operating modes with specific capabilities and restrictions
|
|
4
|
+
*/
|
|
5
|
+
export type AgentMode = 'plan' | 'agent' | 'debugger' | 'security' | 'review';
|
|
6
|
+
export type ToolCategory = 'read_only' | 'write_fs' | 'git_read' | 'git_mutation' | 'shell_command' | 'tests' | 'network' | 'context';
|
|
7
|
+
export interface ModeCapabilities {
|
|
8
|
+
/** Human-readable mode name */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Short description of the mode */
|
|
11
|
+
description: string;
|
|
12
|
+
/** Agent persona name (friendly name for this mode) */
|
|
13
|
+
personaName: string;
|
|
14
|
+
/** Agent persona role description */
|
|
15
|
+
personaRole: string;
|
|
16
|
+
/** Tool categories allowed in this mode */
|
|
17
|
+
allowedCategories: ToolCategory[];
|
|
18
|
+
/** Whether this mode can modify files */
|
|
19
|
+
canModify: boolean;
|
|
20
|
+
/** Whether dry-run is enabled by default */
|
|
21
|
+
defaultDryRun: boolean;
|
|
22
|
+
/** Color for TUI display (for chalk) */
|
|
23
|
+
displayColor: string;
|
|
24
|
+
/** Icon/emoji for TUI display */
|
|
25
|
+
icon: string;
|
|
26
|
+
/** Additional system prompt instructions for this mode */
|
|
27
|
+
promptSuffix: string;
|
|
28
|
+
/** Risk tolerance level for operations */
|
|
29
|
+
riskTolerance: 'low' | 'medium' | 'high';
|
|
30
|
+
/** Whether mode transitions require confirmation */
|
|
31
|
+
requiresConfirmation: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare const MODE_CONFIG: Record<AgentMode, ModeCapabilities>;
|
|
34
|
+
export declare function isToolAllowed(mode: AgentMode, toolName: string): {
|
|
35
|
+
allowed: boolean;
|
|
36
|
+
reason?: string;
|
|
37
|
+
};
|
|
38
|
+
export declare function getAllowedTools(mode: AgentMode): string[];
|
|
39
|
+
export declare function requiresModeTransitionConfirmation(fromMode: AgentMode, toMode: AgentMode): boolean;
|
|
40
|
+
export declare function getModeTransitionMessage(fromMode: AgentMode, toMode: AgentMode): string;
|
|
41
|
+
/**
|
|
42
|
+
* Mode state for tracking in agent session
|
|
43
|
+
*/
|
|
44
|
+
export interface ModeState {
|
|
45
|
+
current: AgentMode;
|
|
46
|
+
previous?: AgentMode;
|
|
47
|
+
history: Array<{
|
|
48
|
+
mode: AgentMode;
|
|
49
|
+
timestamp: number;
|
|
50
|
+
reason?: string;
|
|
51
|
+
}>;
|
|
52
|
+
transitionInProgress?: {
|
|
53
|
+
from: AgentMode;
|
|
54
|
+
to: AgentMode;
|
|
55
|
+
awaitingConfirmation: boolean;
|
|
56
|
+
};
|
|
57
|
+
pendingRequest?: ModeTransitionRequest;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Mode transition request
|
|
61
|
+
*/
|
|
62
|
+
export interface ModeTransitionRequest {
|
|
63
|
+
targetMode: AgentMode;
|
|
64
|
+
reason: string;
|
|
65
|
+
source: 'model' | 'user' | 'system';
|
|
66
|
+
timestamp: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Auto-approval policy for mode escalation
|
|
70
|
+
*/
|
|
71
|
+
export type AutoApprovalPolicy = 'never' | 'prompt-only' | 'always-for-debugger' | 'always';
|
|
72
|
+
/**
|
|
73
|
+
* Mode transition policy configuration
|
|
74
|
+
*/
|
|
75
|
+
export interface ModeTransitionPolicy {
|
|
76
|
+
autoApprovalPolicy: AutoApprovalPolicy;
|
|
77
|
+
allowAutoEscalation: boolean;
|
|
78
|
+
}
|
|
79
|
+
export declare function createModeState(initialMode?: AgentMode): ModeState;
|
|
80
|
+
export declare function transitionMode(state: ModeState, newMode: AgentMode, reason?: string): ModeState;
|
|
81
|
+
/**
|
|
82
|
+
* Mode Orchestrator - manages mode transitions and policies
|
|
83
|
+
*/
|
|
84
|
+
export declare class ModeOrchestrator {
|
|
85
|
+
private policy;
|
|
86
|
+
constructor(policy?: ModeTransitionPolicy);
|
|
87
|
+
/**
|
|
88
|
+
* Request a mode change
|
|
89
|
+
*/
|
|
90
|
+
requestModeChange(state: ModeState, targetMode: AgentMode, reason: string, source?: 'model' | 'user' | 'system'): ModeState;
|
|
91
|
+
/**
|
|
92
|
+
* Evaluate if a mode transition should be auto-approved
|
|
93
|
+
*/
|
|
94
|
+
evaluateModeChangeRequest(state: ModeState): {
|
|
95
|
+
approved: boolean;
|
|
96
|
+
requiresConfirmation: boolean;
|
|
97
|
+
reason?: string;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Clear pending mode change request
|
|
101
|
+
*/
|
|
102
|
+
clearPendingRequest(state: ModeState): ModeState;
|
|
103
|
+
/**
|
|
104
|
+
* Update policy
|
|
105
|
+
*/
|
|
106
|
+
updatePolicy(policy: Partial<ModeTransitionPolicy>): void;
|
|
107
|
+
/**
|
|
108
|
+
* Get current policy
|
|
109
|
+
*/
|
|
110
|
+
getPolicy(): ModeTransitionPolicy;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse mode request from text (looks for [[REQUEST_MODE: ...]] tags)
|
|
114
|
+
*/
|
|
115
|
+
export declare function parseModeRequest(text: string): {
|
|
116
|
+
mode: AgentMode;
|
|
117
|
+
reason: string;
|
|
118
|
+
} | null;
|
|
119
|
+
/**
|
|
120
|
+
* Strip mode request tags from text (for display)
|
|
121
|
+
*/
|
|
122
|
+
export declare function stripModeRequests(text: string): string;
|
|
123
|
+
export declare function isValidMode(mode: string): mode is AgentMode;
|
|
124
|
+
export declare function getAllModes(): AgentMode[];
|
|
125
|
+
//# sourceMappingURL=modes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../src/core/modes.ts"],"names":[],"mappings":"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"}
|