poe-code 1.2.1 → 2.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.
Files changed (156) hide show
  1. package/README.md +16 -20
  2. package/dist/cli/bootstrap.d.ts +4 -0
  3. package/dist/cli/bootstrap.js +75 -0
  4. package/dist/cli/bootstrap.js.map +1 -0
  5. package/dist/cli/commands/configure.d.ts +2 -1
  6. package/dist/cli/commands/configure.js +7 -7
  7. package/dist/cli/commands/configure.js.map +1 -1
  8. package/dist/cli/container.d.ts +0 -5
  9. package/dist/cli/container.js +0 -8
  10. package/dist/cli/container.js.map +1 -1
  11. package/dist/cli/error-logger.d.ts +17 -2
  12. package/dist/cli/error-logger.js.map +1 -1
  13. package/dist/cli/errors.d.ts +6 -0
  14. package/dist/cli/errors.js +8 -0
  15. package/dist/cli/errors.js.map +1 -1
  16. package/dist/cli/program.js +6 -26
  17. package/dist/cli/program.js.map +1 -1
  18. package/dist/cli/prompt-runner.d.ts +3 -0
  19. package/dist/cli/prompt-runner.js +9 -0
  20. package/dist/cli/prompt-runner.js.map +1 -0
  21. package/dist/cli/service-registry.d.ts +8 -0
  22. package/dist/cli/service-registry.js.map +1 -1
  23. package/dist/cli/ui/service-menu.d.ts +6 -0
  24. package/dist/cli/ui/service-menu.js +37 -0
  25. package/dist/cli/ui/service-menu.js.map +1 -0
  26. package/dist/cli/ui/theme.d.ts +16 -0
  27. package/dist/cli/ui/theme.js +78 -0
  28. package/dist/cli/ui/theme.js.map +1 -0
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.js +2 -74
  31. package/dist/index.js.map +1 -1
  32. package/dist/providers/claude-code-adapter.js +6 -0
  33. package/dist/providers/claude-code-adapter.js.map +1 -1
  34. package/dist/providers/codex-adapter.js +6 -0
  35. package/dist/providers/codex-adapter.js.map +1 -1
  36. package/dist/providers/opencode-adapter.js +6 -0
  37. package/dist/providers/opencode-adapter.js.map +1 -1
  38. package/package.json +13 -34
  39. package/dist/cli/api-client.d.ts +0 -14
  40. package/dist/cli/api-client.js +0 -140
  41. package/dist/cli/api-client.js.map +0 -1
  42. package/dist/cli/chat.d.ts +0 -32
  43. package/dist/cli/chat.js +0 -2
  44. package/dist/cli/chat.js.map +0 -1
  45. package/dist/cli/commands/agent.d.ts +0 -18
  46. package/dist/cli/commands/agent.js +0 -84
  47. package/dist/cli/commands/agent.js.map +0 -1
  48. package/dist/cli/commands/configure-agents.d.ts +0 -3
  49. package/dist/cli/commands/configure-agents.js +0 -72
  50. package/dist/cli/commands/configure-agents.js.map +0 -1
  51. package/dist/cli/commands/init.d.ts +0 -8
  52. package/dist/cli/commands/init.js +0 -45
  53. package/dist/cli/commands/init.js.map +0 -1
  54. package/dist/cli/commands/interactive.d.ts +0 -3
  55. package/dist/cli/commands/interactive.js +0 -17
  56. package/dist/cli/commands/interactive.js.map +0 -1
  57. package/dist/cli/commands/login.d.ts +0 -6
  58. package/dist/cli/commands/login.js +0 -51
  59. package/dist/cli/commands/login.js.map +0 -1
  60. package/dist/cli/commands/logout.d.ts +0 -3
  61. package/dist/cli/commands/logout.js +0 -31
  62. package/dist/cli/commands/logout.js.map +0 -1
  63. package/dist/cli/commands/prerequisites.d.ts +0 -3
  64. package/dist/cli/commands/prerequisites.js +0 -23
  65. package/dist/cli/commands/prerequisites.js.map +0 -1
  66. package/dist/cli/commands/query.d.ts +0 -7
  67. package/dist/cli/commands/query.js +0 -46
  68. package/dist/cli/commands/query.js.map +0 -1
  69. package/dist/cli/commands/remove.d.ts +0 -6
  70. package/dist/cli/commands/remove.js +0 -80
  71. package/dist/cli/commands/remove.js.map +0 -1
  72. package/dist/cli/commands/root.d.ts +0 -3
  73. package/dist/cli/commands/root.js +0 -7
  74. package/dist/cli/commands/root.js.map +0 -1
  75. package/dist/cli/commands/spawn-worktree.d.ts +0 -6
  76. package/dist/cli/commands/spawn-worktree.js +0 -91
  77. package/dist/cli/commands/spawn-worktree.js.map +0 -1
  78. package/dist/cli/commands/spawn.d.ts +0 -7
  79. package/dist/cli/commands/spawn.js +0 -112
  80. package/dist/cli/commands/spawn.js.map +0 -1
  81. package/dist/cli/commands/test.d.ts +0 -6
  82. package/dist/cli/commands/test.js +0 -26
  83. package/dist/cli/commands/test.js.map +0 -1
  84. package/dist/cli/file-mentions.d.ts +0 -13
  85. package/dist/cli/file-mentions.js +0 -87
  86. package/dist/cli/file-mentions.js.map +0 -1
  87. package/dist/cli/file-picker-state.d.ts +0 -14
  88. package/dist/cli/file-picker-state.js +0 -23
  89. package/dist/cli/file-picker-state.js.map +0 -1
  90. package/dist/cli/interactive-command-runner.d.ts +0 -11
  91. package/dist/cli/interactive-command-runner.js +0 -142
  92. package/dist/cli/interactive-command-runner.js.map +0 -1
  93. package/dist/cli/interactive-launcher.d.ts +0 -2
  94. package/dist/cli/interactive-launcher.js +0 -404
  95. package/dist/cli/interactive-launcher.js.map +0 -1
  96. package/dist/cli/interactive-tasks.d.ts +0 -7
  97. package/dist/cli/interactive-tasks.js +0 -199
  98. package/dist/cli/interactive-tasks.js.map +0 -1
  99. package/dist/cli/interactive.d.ts +0 -19
  100. package/dist/cli/interactive.js +0 -479
  101. package/dist/cli/interactive.js.map +0 -1
  102. package/dist/cli/markdown-renderer.d.ts +0 -27
  103. package/dist/cli/markdown-renderer.js +0 -178
  104. package/dist/cli/markdown-renderer.js.map +0 -1
  105. package/dist/cli/markdown-renderer.test.d.ts +0 -1
  106. package/dist/cli/markdown-renderer.test.js +0 -105
  107. package/dist/cli/markdown-renderer.test.js.map +0 -1
  108. package/dist/commands/init.d.ts +0 -9
  109. package/dist/commands/init.js +0 -43
  110. package/dist/commands/init.js.map +0 -1
  111. package/dist/commands/spawn-worktree.d.ts +0 -25
  112. package/dist/commands/spawn-worktree.js +0 -139
  113. package/dist/commands/spawn-worktree.js.map +0 -1
  114. package/dist/services/agent-config-manager.d.ts +0 -32
  115. package/dist/services/agent-config-manager.js +0 -130
  116. package/dist/services/agent-config-manager.js.map +0 -1
  117. package/dist/services/agent-registry.d.ts +0 -27
  118. package/dist/services/agent-registry.js +0 -89
  119. package/dist/services/agent-registry.js.map +0 -1
  120. package/dist/services/agent-session.d.ts +0 -24
  121. package/dist/services/agent-session.js +0 -107
  122. package/dist/services/agent-session.js.map +0 -1
  123. package/dist/services/agent-task-registry.d.ts +0 -131
  124. package/dist/services/agent-task-registry.js +0 -491
  125. package/dist/services/agent-task-registry.js.map +0 -1
  126. package/dist/services/chat.d.ts +0 -94
  127. package/dist/services/chat.js +0 -241
  128. package/dist/services/chat.js.map +0 -1
  129. package/dist/services/mcp-client.d.ts +0 -38
  130. package/dist/services/mcp-client.js +0 -170
  131. package/dist/services/mcp-client.js.map +0 -1
  132. package/dist/services/mcp-manager.d.ts +0 -28
  133. package/dist/services/mcp-manager.js +0 -157
  134. package/dist/services/mcp-manager.js.map +0 -1
  135. package/dist/services/poe-code.d.ts +0 -7
  136. package/dist/services/poe-code.js +0 -5
  137. package/dist/services/poe-code.js.map +0 -1
  138. package/dist/services/task-logger.d.ts +0 -24
  139. package/dist/services/task-logger.js +0 -73
  140. package/dist/services/task-logger.js.map +0 -1
  141. package/dist/services/task-runner.d.ts +0 -19
  142. package/dist/services/task-runner.js +0 -157
  143. package/dist/services/task-runner.js.map +0 -1
  144. package/dist/services/tools.d.ts +0 -76
  145. package/dist/services/tools.js +0 -870
  146. package/dist/services/tools.js.map +0 -1
  147. package/dist/utils/e2e-flags.d.ts +0 -1
  148. package/dist/utils/e2e-flags.js +0 -9
  149. package/dist/utils/e2e-flags.js.map +0 -1
  150. package/dist/utils/worktree.d.ts +0 -40
  151. package/dist/utils/worktree.js +0 -179
  152. package/dist/utils/worktree.js.map +0 -1
  153. package/shared/conversation-layout.cjs +0 -11
  154. package/shared/conversation-layout.d.ts +0 -7
  155. package/shared/conversation-layout.js +0 -11
  156. package/shared/package.json +0 -13
@@ -1,241 +0,0 @@
1
- import { ModelStrategyFactory, StrategyConfigManager, } from "./model-strategy.js";
2
- export class PoeChatService {
3
- constructor(apiKey, model = "Claude-Sonnet-4.5", toolExecutor, onToolCall, systemPrompt, taskRegistry) {
4
- this.conversationHistory = [];
5
- this.strategyEnabled = false;
6
- this.apiKey = apiKey;
7
- this.baseUrl = "https://api.poe.com/v1";
8
- this.currentModel = model;
9
- this.toolExecutor = toolExecutor;
10
- this.onToolCall = onToolCall;
11
- this.taskRegistry = taskRegistry;
12
- // Load saved strategy configuration
13
- const savedConfig = StrategyConfigManager.loadConfig();
14
- if (savedConfig) {
15
- this.modelStrategy = ModelStrategyFactory.createStrategy(savedConfig);
16
- // Enable strategy if it's not a fixed strategy with the same model
17
- this.strategyEnabled = !(savedConfig.type === "fixed" && savedConfig.fixedModel === model);
18
- }
19
- // Add system prompt if provided
20
- if (systemPrompt) {
21
- this.conversationHistory.push({
22
- role: "system",
23
- content: systemPrompt
24
- });
25
- }
26
- }
27
- setToolCallCallback(callback) {
28
- this.onToolCall = callback;
29
- }
30
- setModel(model) {
31
- this.currentModel = model;
32
- }
33
- getModel() {
34
- return this.currentModel;
35
- }
36
- setStrategy(config) {
37
- this.modelStrategy = ModelStrategyFactory.createStrategy(config);
38
- this.strategyEnabled = true;
39
- StrategyConfigManager.saveConfig(config);
40
- }
41
- getStrategy() {
42
- return this.modelStrategy;
43
- }
44
- getStrategyInfo() {
45
- if (!this.modelStrategy) {
46
- return "No strategy enabled (using fixed model)";
47
- }
48
- return `${this.modelStrategy.getName()}: ${this.modelStrategy.getDescription()}`;
49
- }
50
- disableStrategy() {
51
- this.strategyEnabled = false;
52
- }
53
- enableStrategy() {
54
- if (this.modelStrategy) {
55
- this.strategyEnabled = true;
56
- }
57
- }
58
- isStrategyEnabled() {
59
- return this.strategyEnabled;
60
- }
61
- getHistory() {
62
- return [...this.conversationHistory];
63
- }
64
- clearHistory() {
65
- this.conversationHistory = [];
66
- }
67
- addSystemMessage(content) {
68
- this.conversationHistory.push({
69
- role: "system",
70
- content
71
- });
72
- }
73
- async sendMessage(userMessage, tools, options) {
74
- this.injectCompletedTasks();
75
- // Add user message to history
76
- this.conversationHistory.push({
77
- role: "user",
78
- content: userMessage
79
- });
80
- // Use strategy to select model if enabled
81
- if (this.strategyEnabled && this.modelStrategy) {
82
- const context = this.detectMessageContext(userMessage);
83
- const selectedModel = this.modelStrategy.getNextModel(context);
84
- this.currentModel = selectedModel;
85
- }
86
- let attempts = 0;
87
- const maxAttempts = 100;
88
- while (attempts < maxAttempts) {
89
- const response = await this.makeApiRequest(tools, options?.signal);
90
- const assistantMessage = response.choices[0].message;
91
- this.conversationHistory.push(assistantMessage);
92
- // Check if the model wants to call tools
93
- if (assistantMessage.tool_calls &&
94
- assistantMessage.tool_calls.length > 0 &&
95
- this.toolExecutor) {
96
- // Execute all tool calls
97
- for (const toolCall of assistantMessage.tool_calls) {
98
- let result;
99
- let error;
100
- try {
101
- const args = JSON.parse(toolCall.function.arguments);
102
- // Notify callback that tool call is starting
103
- if (this.onToolCall) {
104
- this.onToolCall({
105
- toolName: toolCall.function.name,
106
- args
107
- });
108
- }
109
- result = await this.toolExecutor.executeTool(toolCall.function.name, args);
110
- // Notify callback of success
111
- if (this.onToolCall) {
112
- this.onToolCall({
113
- toolName: toolCall.function.name,
114
- args,
115
- result
116
- });
117
- }
118
- // Add tool result to conversation
119
- this.conversationHistory.push({
120
- role: "tool",
121
- tool_call_id: toolCall.id,
122
- name: toolCall.function.name,
123
- content: result
124
- });
125
- }
126
- catch (err) {
127
- error = err instanceof Error ? err.message : String(err);
128
- // Notify callback of error
129
- if (this.onToolCall) {
130
- this.onToolCall({
131
- toolName: toolCall.function.name,
132
- args: JSON.parse(toolCall.function.arguments),
133
- error
134
- });
135
- }
136
- // Add error as tool result
137
- this.conversationHistory.push({
138
- role: "tool",
139
- tool_call_id: toolCall.id,
140
- name: toolCall.function.name,
141
- content: `Error: ${error}`
142
- });
143
- }
144
- }
145
- // Continue the conversation with tool results
146
- attempts++;
147
- continue;
148
- }
149
- // No more tool calls, return the final message
150
- if (assistantMessage.content && assistantMessage.content.length > 0) {
151
- options?.onChunk?.(assistantMessage.content);
152
- }
153
- return assistantMessage;
154
- }
155
- throw new Error("Maximum tool call iterations reached");
156
- }
157
- injectCompletedTasks() {
158
- if (!this.taskRegistry) {
159
- return;
160
- }
161
- const completed = this.taskRegistry.getCompletedTasks();
162
- if (completed.length === 0) {
163
- return;
164
- }
165
- for (const task of completed) {
166
- const symbol = task.status === "completed" ? "✅" : task.status === "failed" ? "❌" : "⏹";
167
- const details = task.result ?? task.error ?? "Task finished.";
168
- this.conversationHistory.push({
169
- role: "system",
170
- content: `${symbol} Task ${task.id} finished\n\n${details}`
171
- });
172
- }
173
- this.taskRegistry.clearCompleted();
174
- }
175
- detectMessageContext(message) {
176
- const lowerMessage = message.toLowerCase();
177
- // Detect code-related keywords
178
- const codeKeywords = [
179
- "code", "function", "class", "implement", "debug", "error",
180
- "refactor", "optimize", "algorithm", "bug", "fix", "compile",
181
- "typescript", "javascript", "python", "java", "react", "component"
182
- ];
183
- // Detect reasoning keywords
184
- const reasoningKeywords = [
185
- "why", "how", "explain", "analyze", "compare", "evaluate",
186
- "reasoning", "logic", "understand", "clarify"
187
- ];
188
- const hasCodeKeywords = codeKeywords.some(keyword => lowerMessage.includes(keyword));
189
- const hasReasoningKeywords = reasoningKeywords.some(keyword => lowerMessage.includes(keyword));
190
- // Determine message type
191
- let messageType = "general";
192
- if (hasCodeKeywords) {
193
- messageType = "code";
194
- }
195
- else if (hasReasoningKeywords) {
196
- messageType = "reasoning";
197
- }
198
- else if (message.length < 100) {
199
- messageType = "chat";
200
- }
201
- // Determine complexity based on message length and structure
202
- let complexity = "medium";
203
- if (message.length > 500 || message.split("\n").length > 10) {
204
- complexity = "complex";
205
- }
206
- else if (message.length < 100) {
207
- complexity = "simple";
208
- }
209
- return {
210
- messageType,
211
- complexity,
212
- previousModel: this.currentModel
213
- };
214
- }
215
- async makeApiRequest(tools, signal) {
216
- const request = {
217
- model: this.currentModel,
218
- messages: this.conversationHistory,
219
- temperature: 0.7
220
- };
221
- if (tools && tools.length > 0) {
222
- request.tools = tools;
223
- }
224
- const response = await fetch(`${this.baseUrl}/chat/completions`, {
225
- method: "POST",
226
- headers: {
227
- "Content-Type": "application/json",
228
- Authorization: `Bearer ${this.apiKey}`
229
- },
230
- body: JSON.stringify(request),
231
- signal
232
- });
233
- if (!response.ok) {
234
- const errorText = await response.text();
235
- throw new Error(`Poe API request failed (${response.status}): ${errorText}`);
236
- }
237
- const result = await response.json();
238
- return result;
239
- }
240
- }
241
- //# sourceMappingURL=chat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/services/chat.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- export interface McpTool {
3
- name: string;
4
- description: string;
5
- inputSchema: {
6
- type: "object";
7
- properties: Record<string, unknown>;
8
- required?: string[];
9
- };
10
- }
11
- export interface McpServerConfig {
12
- name: string;
13
- command: string;
14
- args: string[];
15
- env?: Record<string, string>;
16
- }
17
- export declare class McpClient extends EventEmitter {
18
- private process;
19
- private requestId;
20
- private pendingRequests;
21
- private buffer;
22
- private tools;
23
- private config;
24
- private initialized;
25
- constructor(config: McpServerConfig);
26
- connect(): Promise<void>;
27
- private initialize;
28
- private discoverTools;
29
- getTools(): McpTool[];
30
- callTool(name: string, args: Record<string, unknown>): Promise<string>;
31
- private handleData;
32
- private handleMessage;
33
- private sendRequest;
34
- disconnect(): Promise<void>;
35
- private cleanup;
36
- isConnected(): boolean;
37
- getName(): string;
38
- }
@@ -1,170 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { EventEmitter } from "node:events";
3
- export class McpClient extends EventEmitter {
4
- constructor(config) {
5
- super();
6
- this.process = null;
7
- this.requestId = 0;
8
- this.pendingRequests = new Map();
9
- this.buffer = "";
10
- this.tools = [];
11
- this.initialized = false;
12
- this.config = config;
13
- }
14
- async connect() {
15
- if (this.process) {
16
- throw new Error("Already connected");
17
- }
18
- return new Promise((resolve, reject) => {
19
- this.process = spawn(this.config.command, this.config.args, {
20
- env: { ...process.env, ...this.config.env },
21
- stdio: ["pipe", "pipe", "pipe"]
22
- });
23
- this.process.on("error", (error) => {
24
- this.emit("error", error);
25
- reject(error);
26
- });
27
- if (this.process.stdout) {
28
- this.process.stdout.on("data", (data) => {
29
- this.handleData(data.toString());
30
- });
31
- }
32
- if (this.process.stderr) {
33
- this.process.stderr.on("data", (data) => {
34
- this.emit("log", `[${this.config.name}] ${data.toString()}`);
35
- });
36
- }
37
- this.process.on("close", (code) => {
38
- this.emit("close", code);
39
- this.cleanup();
40
- });
41
- // Initialize the connection
42
- this.initialize()
43
- .then(() => resolve())
44
- .catch(reject);
45
- });
46
- }
47
- async initialize() {
48
- const response = await this.sendRequest("initialize", {
49
- protocolVersion: "2024-11-05",
50
- capabilities: {
51
- tools: {}
52
- },
53
- clientInfo: {
54
- name: "poe-code",
55
- version: "0.1.0"
56
- }
57
- });
58
- this.initialized = true;
59
- this.emit("initialized", response);
60
- // Discover available tools
61
- await this.discoverTools();
62
- }
63
- async discoverTools() {
64
- const response = (await this.sendRequest("tools/list", {}));
65
- this.tools = response.tools || [];
66
- this.emit("tools-discovered", this.tools);
67
- }
68
- getTools() {
69
- return [...this.tools];
70
- }
71
- async callTool(name, args) {
72
- if (!this.initialized) {
73
- throw new Error("Client not initialized");
74
- }
75
- const response = (await this.sendRequest("tools/call", {
76
- name,
77
- arguments: args
78
- }));
79
- // Extract text content from response
80
- if (response.content && Array.isArray(response.content)) {
81
- const textContent = response.content
82
- .filter((c) => c.type === "text" && c.text)
83
- .map((c) => c.text)
84
- .join("\n");
85
- return textContent;
86
- }
87
- return JSON.stringify(response);
88
- }
89
- handleData(data) {
90
- this.buffer += data;
91
- // Process complete JSON-RPC messages (newline-delimited)
92
- const lines = this.buffer.split("\n");
93
- this.buffer = lines.pop() || "";
94
- for (const line of lines) {
95
- if (!line.trim())
96
- continue;
97
- try {
98
- const message = JSON.parse(line);
99
- this.handleMessage(message);
100
- }
101
- catch (error) {
102
- this.emit("error", new Error(`Failed to parse message: ${line}, error: ${error}`));
103
- }
104
- }
105
- }
106
- handleMessage(message) {
107
- const pending = this.pendingRequests.get(message.id);
108
- if (!pending) {
109
- this.emit("error", new Error(`Unexpected message id: ${message.id}`));
110
- return;
111
- }
112
- this.pendingRequests.delete(message.id);
113
- if (message.error) {
114
- pending.reject(new Error(`MCP Error: ${message.error.message} (${message.error.code})`));
115
- }
116
- else {
117
- pending.resolve(message.result);
118
- }
119
- }
120
- sendRequest(method, params) {
121
- if (!this.process || !this.process.stdin) {
122
- return Promise.reject(new Error("Not connected"));
123
- }
124
- const id = ++this.requestId;
125
- const request = {
126
- jsonrpc: "2.0",
127
- id,
128
- method,
129
- params
130
- };
131
- return new Promise((resolve, reject) => {
132
- this.pendingRequests.set(id, { resolve, reject });
133
- const requestStr = JSON.stringify(request) + "\n";
134
- this.process.stdin.write(requestStr, (error) => {
135
- if (error) {
136
- this.pendingRequests.delete(id);
137
- reject(error);
138
- }
139
- });
140
- // Add timeout
141
- setTimeout(() => {
142
- if (this.pendingRequests.has(id)) {
143
- this.pendingRequests.delete(id);
144
- reject(new Error(`Request timeout: ${method}`));
145
- }
146
- }, 30000);
147
- });
148
- }
149
- async disconnect() {
150
- if (!this.process) {
151
- return;
152
- }
153
- this.process.kill();
154
- this.cleanup();
155
- }
156
- cleanup() {
157
- this.process = null;
158
- this.initialized = false;
159
- this.tools = [];
160
- this.pendingRequests.clear();
161
- this.buffer = "";
162
- }
163
- isConnected() {
164
- return this.process !== null && this.initialized;
165
- }
166
- getName() {
167
- return this.config.name;
168
- }
169
- }
170
- //# sourceMappingURL=mcp-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/services/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- import { type McpServerConfig } from "./mcp-client.js";
2
- import type { Tool } from "./chat.js";
3
- import type { FileSystem } from "../utils/file-system.js";
4
- export interface McpManagerConfig {
5
- servers: McpServerConfig[];
6
- }
7
- export declare class McpManager {
8
- private clients;
9
- private fs;
10
- private configPath;
11
- constructor(fs: FileSystem, homeDir: string);
12
- loadConfig(): Promise<McpManagerConfig>;
13
- saveConfig(config: McpManagerConfig): Promise<void>;
14
- addServer(config: McpServerConfig): Promise<void>;
15
- removeServer(name: string): Promise<boolean>;
16
- connectServer(name: string): Promise<void>;
17
- disconnectServer(name: string): Promise<void>;
18
- connectAll(): Promise<void>;
19
- disconnectAll(): Promise<void>;
20
- getAllTools(): Tool[];
21
- executeTool(toolName: string, args: Record<string, unknown>): Promise<string>;
22
- getConnectedServers(): string[];
23
- listServers(): Promise<Array<{
24
- name: string;
25
- connected: boolean;
26
- toolCount: number;
27
- }>>;
28
- }
@@ -1,157 +0,0 @@
1
- import { McpClient } from "./mcp-client.js";
2
- import path from "node:path";
3
- export class McpManager {
4
- constructor(fs, homeDir) {
5
- this.clients = new Map();
6
- this.fs = fs;
7
- this.configPath = path.join(homeDir, ".poe-code", "mcp-servers.json");
8
- }
9
- async loadConfig() {
10
- try {
11
- const content = await this.fs.readFile(this.configPath, "utf8");
12
- return JSON.parse(content);
13
- }
14
- catch {
15
- // Config doesn't exist, return empty
16
- return { servers: [] };
17
- }
18
- }
19
- async saveConfig(config) {
20
- const dir = path.dirname(this.configPath);
21
- try {
22
- await this.fs.stat(dir);
23
- }
24
- catch {
25
- await this.fs.mkdir(dir, { recursive: true });
26
- }
27
- await this.fs.writeFile(this.configPath, JSON.stringify(config, null, 2), { encoding: "utf8" });
28
- }
29
- async addServer(config) {
30
- const currentConfig = await this.loadConfig();
31
- // Check if server already exists
32
- const existingIndex = currentConfig.servers.findIndex((s) => s.name === config.name);
33
- if (existingIndex >= 0) {
34
- currentConfig.servers[existingIndex] = config;
35
- }
36
- else {
37
- currentConfig.servers.push(config);
38
- }
39
- await this.saveConfig(currentConfig);
40
- }
41
- async removeServer(name) {
42
- const currentConfig = await this.loadConfig();
43
- const initialLength = currentConfig.servers.length;
44
- currentConfig.servers = currentConfig.servers.filter((s) => s.name !== name);
45
- if (currentConfig.servers.length < initialLength) {
46
- await this.saveConfig(currentConfig);
47
- // Also disconnect the client if running
48
- await this.disconnectServer(name);
49
- return true;
50
- }
51
- return false;
52
- }
53
- async connectServer(name) {
54
- const config = await this.loadConfig();
55
- const serverConfig = config.servers.find((s) => s.name === name);
56
- if (!serverConfig) {
57
- throw new Error(`MCP server "${name}" not found in configuration`);
58
- }
59
- if (this.clients.has(name)) {
60
- throw new Error(`MCP server "${name}" is already connected`);
61
- }
62
- const client = new McpClient(serverConfig);
63
- client.on("error", (error) => {
64
- console.error(`[MCP ${name}] Error:`, error);
65
- });
66
- client.on("log", (message) => {
67
- console.log(`[MCP ${name}]`, message);
68
- });
69
- client.on("close", () => {
70
- this.clients.delete(name);
71
- });
72
- await client.connect();
73
- this.clients.set(name, client);
74
- }
75
- async disconnectServer(name) {
76
- const client = this.clients.get(name);
77
- if (client) {
78
- await client.disconnect();
79
- this.clients.delete(name);
80
- }
81
- }
82
- async connectAll() {
83
- const config = await this.loadConfig();
84
- for (const serverConfig of config.servers) {
85
- try {
86
- if (!this.clients.has(serverConfig.name)) {
87
- await this.connectServer(serverConfig.name);
88
- }
89
- }
90
- catch (error) {
91
- console.error(`Failed to connect to MCP server "${serverConfig.name}":`, error);
92
- }
93
- }
94
- }
95
- async disconnectAll() {
96
- const names = Array.from(this.clients.keys());
97
- for (const name of names) {
98
- await this.disconnectServer(name);
99
- }
100
- }
101
- getAllTools() {
102
- const tools = [];
103
- for (const [serverName, client] of this.clients.entries()) {
104
- if (!client.isConnected())
105
- continue;
106
- const mcpTools = client.getTools();
107
- for (const mcpTool of mcpTools) {
108
- tools.push({
109
- type: "function",
110
- function: {
111
- name: `mcp__${serverName}__${mcpTool.name}`,
112
- description: `[MCP: ${serverName}] ${mcpTool.description}`,
113
- parameters: {
114
- type: "object",
115
- properties: mcpTool.inputSchema.properties,
116
- required: mcpTool.inputSchema.required
117
- }
118
- }
119
- });
120
- }
121
- }
122
- return tools;
123
- }
124
- async executeTool(toolName, args) {
125
- // Tool name format: mcp__<servername>__<toolname>
126
- if (!toolName.startsWith("mcp__")) {
127
- throw new Error(`Not an MCP tool: ${toolName}`);
128
- }
129
- const parts = toolName.substring(5).split("__");
130
- if (parts.length !== 2) {
131
- throw new Error(`Invalid MCP tool name format: ${toolName}`);
132
- }
133
- const [serverName, actualToolName] = parts;
134
- const client = this.clients.get(serverName);
135
- if (!client || !client.isConnected()) {
136
- throw new Error(`MCP server "${serverName}" is not connected`);
137
- }
138
- return await client.callTool(actualToolName, args);
139
- }
140
- getConnectedServers() {
141
- return Array.from(this.clients.keys()).filter((name) => this.clients.get(name)?.isConnected());
142
- }
143
- async listServers() {
144
- const config = await this.loadConfig();
145
- return config.servers.map((server) => {
146
- const client = this.clients.get(server.name);
147
- const connected = client?.isConnected() || false;
148
- const toolCount = connected ? client.getTools().length : 0;
149
- return {
150
- name: server.name,
151
- connected,
152
- toolCount
153
- };
154
- });
155
- }
156
- }
157
- //# sourceMappingURL=mcp-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-manager.js","sourceRoot":"","sources":["../../src/services/mcp-manager.ts"],"names":[],"mappings":"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"}