mcp-rubber-duck 1.1.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 (184) hide show
  1. package/.dockerignore +19 -0
  2. package/.env.desktop.example +145 -0
  3. package/.env.example +45 -0
  4. package/.env.pi.example +106 -0
  5. package/.env.template +165 -0
  6. package/.eslintrc.json +40 -0
  7. package/.github/ISSUE_TEMPLATE/bug_report.md +65 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.md +58 -0
  9. package/.github/ISSUE_TEMPLATE/question.md +67 -0
  10. package/.github/pull_request_template.md +111 -0
  11. package/.github/workflows/docker-build.yml +138 -0
  12. package/.github/workflows/release.yml +182 -0
  13. package/.github/workflows/security.yml +141 -0
  14. package/.github/workflows/semantic-release.yml +89 -0
  15. package/.prettierrc +10 -0
  16. package/.releaserc.json +66 -0
  17. package/CHANGELOG.md +95 -0
  18. package/CONTRIBUTING.md +242 -0
  19. package/Dockerfile +62 -0
  20. package/LICENSE +21 -0
  21. package/README.md +803 -0
  22. package/audit-ci.json +8 -0
  23. package/config/claude_desktop.json +14 -0
  24. package/config/config.example.json +91 -0
  25. package/dist/config/config.d.ts +51 -0
  26. package/dist/config/config.d.ts.map +1 -0
  27. package/dist/config/config.js +301 -0
  28. package/dist/config/config.js.map +1 -0
  29. package/dist/config/types.d.ts +356 -0
  30. package/dist/config/types.d.ts.map +1 -0
  31. package/dist/config/types.js +41 -0
  32. package/dist/config/types.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +109 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/providers/duck-provider-enhanced.d.ts +29 -0
  38. package/dist/providers/duck-provider-enhanced.d.ts.map +1 -0
  39. package/dist/providers/duck-provider-enhanced.js +230 -0
  40. package/dist/providers/duck-provider-enhanced.js.map +1 -0
  41. package/dist/providers/enhanced-manager.d.ts +54 -0
  42. package/dist/providers/enhanced-manager.d.ts.map +1 -0
  43. package/dist/providers/enhanced-manager.js +217 -0
  44. package/dist/providers/enhanced-manager.js.map +1 -0
  45. package/dist/providers/manager.d.ts +28 -0
  46. package/dist/providers/manager.d.ts.map +1 -0
  47. package/dist/providers/manager.js +204 -0
  48. package/dist/providers/manager.js.map +1 -0
  49. package/dist/providers/provider.d.ts +29 -0
  50. package/dist/providers/provider.d.ts.map +1 -0
  51. package/dist/providers/provider.js +179 -0
  52. package/dist/providers/provider.js.map +1 -0
  53. package/dist/providers/types.d.ts +69 -0
  54. package/dist/providers/types.d.ts.map +1 -0
  55. package/dist/providers/types.js +2 -0
  56. package/dist/providers/types.js.map +1 -0
  57. package/dist/server.d.ts +24 -0
  58. package/dist/server.d.ts.map +1 -0
  59. package/dist/server.js +501 -0
  60. package/dist/server.js.map +1 -0
  61. package/dist/services/approval.d.ts +44 -0
  62. package/dist/services/approval.d.ts.map +1 -0
  63. package/dist/services/approval.js +159 -0
  64. package/dist/services/approval.js.map +1 -0
  65. package/dist/services/cache.d.ts +21 -0
  66. package/dist/services/cache.d.ts.map +1 -0
  67. package/dist/services/cache.js +63 -0
  68. package/dist/services/cache.js.map +1 -0
  69. package/dist/services/conversation.d.ts +24 -0
  70. package/dist/services/conversation.d.ts.map +1 -0
  71. package/dist/services/conversation.js +108 -0
  72. package/dist/services/conversation.js.map +1 -0
  73. package/dist/services/function-bridge.d.ts +41 -0
  74. package/dist/services/function-bridge.d.ts.map +1 -0
  75. package/dist/services/function-bridge.js +259 -0
  76. package/dist/services/function-bridge.js.map +1 -0
  77. package/dist/services/health.d.ts +17 -0
  78. package/dist/services/health.d.ts.map +1 -0
  79. package/dist/services/health.js +77 -0
  80. package/dist/services/health.js.map +1 -0
  81. package/dist/services/mcp-client-manager.d.ts +49 -0
  82. package/dist/services/mcp-client-manager.d.ts.map +1 -0
  83. package/dist/services/mcp-client-manager.js +279 -0
  84. package/dist/services/mcp-client-manager.js.map +1 -0
  85. package/dist/tools/approve-mcp-request.d.ts +9 -0
  86. package/dist/tools/approve-mcp-request.d.ts.map +1 -0
  87. package/dist/tools/approve-mcp-request.js +111 -0
  88. package/dist/tools/approve-mcp-request.js.map +1 -0
  89. package/dist/tools/ask-duck.d.ts +9 -0
  90. package/dist/tools/ask-duck.d.ts.map +1 -0
  91. package/dist/tools/ask-duck.js +43 -0
  92. package/dist/tools/ask-duck.js.map +1 -0
  93. package/dist/tools/chat-duck.d.ts +9 -0
  94. package/dist/tools/chat-duck.d.ts.map +1 -0
  95. package/dist/tools/chat-duck.js +57 -0
  96. package/dist/tools/chat-duck.js.map +1 -0
  97. package/dist/tools/clear-conversations.d.ts +8 -0
  98. package/dist/tools/clear-conversations.d.ts.map +1 -0
  99. package/dist/tools/clear-conversations.js +17 -0
  100. package/dist/tools/clear-conversations.js.map +1 -0
  101. package/dist/tools/compare-ducks.d.ts +8 -0
  102. package/dist/tools/compare-ducks.d.ts.map +1 -0
  103. package/dist/tools/compare-ducks.js +49 -0
  104. package/dist/tools/compare-ducks.js.map +1 -0
  105. package/dist/tools/duck-council.d.ts +8 -0
  106. package/dist/tools/duck-council.d.ts.map +1 -0
  107. package/dist/tools/duck-council.js +69 -0
  108. package/dist/tools/duck-council.js.map +1 -0
  109. package/dist/tools/get-pending-approvals.d.ts +15 -0
  110. package/dist/tools/get-pending-approvals.d.ts.map +1 -0
  111. package/dist/tools/get-pending-approvals.js +74 -0
  112. package/dist/tools/get-pending-approvals.js.map +1 -0
  113. package/dist/tools/list-ducks.d.ts +9 -0
  114. package/dist/tools/list-ducks.d.ts.map +1 -0
  115. package/dist/tools/list-ducks.js +47 -0
  116. package/dist/tools/list-ducks.js.map +1 -0
  117. package/dist/tools/list-models.d.ts +8 -0
  118. package/dist/tools/list-models.d.ts.map +1 -0
  119. package/dist/tools/list-models.js +72 -0
  120. package/dist/tools/list-models.js.map +1 -0
  121. package/dist/tools/mcp-status.d.ts +17 -0
  122. package/dist/tools/mcp-status.d.ts.map +1 -0
  123. package/dist/tools/mcp-status.js +100 -0
  124. package/dist/tools/mcp-status.js.map +1 -0
  125. package/dist/utils/ascii-art.d.ts +19 -0
  126. package/dist/utils/ascii-art.d.ts.map +1 -0
  127. package/dist/utils/ascii-art.js +73 -0
  128. package/dist/utils/ascii-art.js.map +1 -0
  129. package/dist/utils/logger.d.ts +3 -0
  130. package/dist/utils/logger.d.ts.map +1 -0
  131. package/dist/utils/logger.js +86 -0
  132. package/dist/utils/logger.js.map +1 -0
  133. package/dist/utils/safe-logger.d.ts +23 -0
  134. package/dist/utils/safe-logger.d.ts.map +1 -0
  135. package/dist/utils/safe-logger.js +145 -0
  136. package/dist/utils/safe-logger.js.map +1 -0
  137. package/docker-compose.yml +161 -0
  138. package/jest.config.js +26 -0
  139. package/package.json +65 -0
  140. package/scripts/build-multiarch.sh +290 -0
  141. package/scripts/deploy-raspbian.sh +410 -0
  142. package/scripts/deploy.sh +322 -0
  143. package/scripts/gh-deploy.sh +343 -0
  144. package/scripts/setup-docker-raspbian.sh +530 -0
  145. package/server.json +8 -0
  146. package/src/config/config.ts +357 -0
  147. package/src/config/types.ts +89 -0
  148. package/src/index.ts +114 -0
  149. package/src/providers/duck-provider-enhanced.ts +294 -0
  150. package/src/providers/enhanced-manager.ts +290 -0
  151. package/src/providers/manager.ts +257 -0
  152. package/src/providers/provider.ts +207 -0
  153. package/src/providers/types.ts +78 -0
  154. package/src/server.ts +603 -0
  155. package/src/services/approval.ts +225 -0
  156. package/src/services/cache.ts +79 -0
  157. package/src/services/conversation.ts +146 -0
  158. package/src/services/function-bridge.ts +329 -0
  159. package/src/services/health.ts +107 -0
  160. package/src/services/mcp-client-manager.ts +362 -0
  161. package/src/tools/approve-mcp-request.ts +126 -0
  162. package/src/tools/ask-duck.ts +74 -0
  163. package/src/tools/chat-duck.ts +82 -0
  164. package/src/tools/clear-conversations.ts +24 -0
  165. package/src/tools/compare-ducks.ts +67 -0
  166. package/src/tools/duck-council.ts +88 -0
  167. package/src/tools/get-pending-approvals.ts +90 -0
  168. package/src/tools/list-ducks.ts +65 -0
  169. package/src/tools/list-models.ts +101 -0
  170. package/src/tools/mcp-status.ts +117 -0
  171. package/src/utils/ascii-art.ts +85 -0
  172. package/src/utils/logger.ts +116 -0
  173. package/src/utils/safe-logger.ts +165 -0
  174. package/systemd/mcp-rubber-duck-with-ollama.service +55 -0
  175. package/systemd/mcp-rubber-duck.service +58 -0
  176. package/test-functionality.js +147 -0
  177. package/test-mcp-interface.js +221 -0
  178. package/tests/ascii-art.test.ts +36 -0
  179. package/tests/config.test.ts +239 -0
  180. package/tests/conversation.test.ts +308 -0
  181. package/tests/mcp-bridge.test.ts +291 -0
  182. package/tests/providers.test.ts +269 -0
  183. package/tests/tools/clear-conversations.test.ts +163 -0
  184. package/tsconfig.json +26 -0
@@ -0,0 +1,279 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ import { logger } from '../utils/logger.js';
5
+ import { SafeLogger } from '../utils/safe-logger.js';
6
+ export class MCPClientManager {
7
+ clients = new Map();
8
+ configs = [];
9
+ connectionStatus = new Map();
10
+ retryInfo = new Map();
11
+ constructor(configs = []) {
12
+ this.configs = configs.filter(config => config.enabled !== false);
13
+ }
14
+ async initialize() {
15
+ logger.info(`Initializing MCP Client Manager with ${this.configs.length} servers`);
16
+ const connectionPromises = this.configs.map(config => this.connectToServer(config));
17
+ // Connect to all servers in parallel, but don't fail if some fail
18
+ const results = await Promise.allSettled(connectionPromises);
19
+ let successCount = 0;
20
+ results.forEach((result, index) => {
21
+ const serverName = this.configs[index].name;
22
+ if (result.status === 'fulfilled') {
23
+ successCount++;
24
+ logger.info(`Successfully connected to MCP server: ${serverName}`);
25
+ }
26
+ else {
27
+ logger.error(`Failed to connect to MCP server ${serverName}:`, result.reason);
28
+ this.connectionStatus.set(serverName, 'error');
29
+ }
30
+ });
31
+ logger.info(`MCP Client Manager initialized: ${successCount}/${this.configs.length} servers connected`);
32
+ }
33
+ async connectToServer(config) {
34
+ const { name, type } = config;
35
+ const maxRetries = config.retryAttempts ?? 3;
36
+ const initialDelay = config.retryDelay ?? 1000;
37
+ if (this.clients.has(name)) {
38
+ logger.warn(`MCP server ${name} already connected`);
39
+ return this.clients.get(name);
40
+ }
41
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
42
+ try {
43
+ this.connectionStatus.set(name, 'connecting');
44
+ this.retryInfo.set(name, { attempts: attempt, lastAttempt: Date.now() });
45
+ if (attempt > 0) {
46
+ const delay = initialDelay * Math.pow(2, attempt - 1); // Exponential backoff
47
+ logger.info(`Retrying connection to MCP server ${name} (attempt ${attempt}/${maxRetries}) after ${delay}ms`);
48
+ await this.sleep(delay);
49
+ }
50
+ // Create client
51
+ const client = new Client({
52
+ name: 'mcp-rubber-duck',
53
+ version: '1.0.0',
54
+ }, {
55
+ capabilities: {
56
+ tools: {},
57
+ },
58
+ });
59
+ // Create transport based on type
60
+ let transport;
61
+ if (type === 'stdio') {
62
+ if (!config.command) {
63
+ throw new Error(`stdio server ${name} requires command`);
64
+ }
65
+ transport = new StdioClientTransport({
66
+ command: config.command,
67
+ args: config.args || [],
68
+ });
69
+ }
70
+ else if (type === 'http') {
71
+ if (!config.url) {
72
+ throw new Error(`http server ${name} requires url`);
73
+ }
74
+ // HTTP transport using StreamableHTTPClientTransport
75
+ const url = new URL(config.url);
76
+ const transportOptions = {};
77
+ if (config.apiKey) {
78
+ transportOptions.requestInit = {
79
+ headers: {
80
+ 'Authorization': `Bearer ${config.apiKey}`,
81
+ },
82
+ };
83
+ }
84
+ transport = new StreamableHTTPClientTransport(url, transportOptions);
85
+ }
86
+ else {
87
+ throw new Error(`Unsupported transport type: ${String(type)}`);
88
+ }
89
+ // Connect to server with timeout
90
+ const connectTimeout = new Promise((_, reject) => setTimeout(() => reject(new Error('Connection timeout')), 30000));
91
+ await Promise.race([
92
+ client.connect(transport),
93
+ connectTimeout
94
+ ]);
95
+ this.clients.set(name, client);
96
+ this.connectionStatus.set(name, 'connected');
97
+ this.retryInfo.delete(name); // Clear retry info on success
98
+ logger.info(`Connected to MCP server: ${name} (${type}) after ${attempt} retries`);
99
+ return client;
100
+ }
101
+ catch (error) {
102
+ logger.warn(`Failed to connect to MCP server ${name} (attempt ${attempt + 1}/${maxRetries + 1}):`, error instanceof Error ? error.message : String(error));
103
+ if (attempt === maxRetries) {
104
+ this.connectionStatus.set(name, 'error');
105
+ this.retryInfo.set(name, { attempts: attempt + 1, lastAttempt: Date.now() });
106
+ logger.error(`All retry attempts exhausted for MCP server ${name}`);
107
+ throw error;
108
+ }
109
+ }
110
+ }
111
+ throw new Error(`Failed to connect to MCP server ${name} after ${maxRetries + 1} attempts`);
112
+ }
113
+ sleep(ms) {
114
+ return new Promise(resolve => setTimeout(resolve, ms));
115
+ }
116
+ async disconnectAll() {
117
+ logger.info('Disconnecting all MCP clients');
118
+ const disconnectPromises = Array.from(this.clients.entries()).map(async ([name, client]) => {
119
+ try {
120
+ await client.close();
121
+ this.connectionStatus.set(name, 'disconnected');
122
+ logger.info(`Disconnected from MCP server: ${name}`);
123
+ }
124
+ catch (error) {
125
+ const errorMessage = error instanceof Error ? error.message : String(error);
126
+ logger.error(`Error disconnecting from MCP server ${name}:`, errorMessage);
127
+ }
128
+ });
129
+ await Promise.allSettled(disconnectPromises);
130
+ this.clients.clear();
131
+ logger.info('All MCP clients disconnected');
132
+ }
133
+ getClient(serverName) {
134
+ const client = this.clients.get(serverName);
135
+ const status = this.connectionStatus.get(serverName);
136
+ if (!client || status !== 'connected') {
137
+ return undefined;
138
+ }
139
+ return client;
140
+ }
141
+ getConnectionStatus(serverName) {
142
+ return this.connectionStatus.get(serverName) || 'unknown';
143
+ }
144
+ getConnectedServers() {
145
+ return Array.from(this.clients.keys()).filter(name => this.connectionStatus.get(name) === 'connected');
146
+ }
147
+ async listAllTools() {
148
+ const allTools = [];
149
+ for (const [serverName, client] of this.clients.entries()) {
150
+ if (this.connectionStatus.get(serverName) !== 'connected') {
151
+ continue;
152
+ }
153
+ try {
154
+ const toolsResult = await client.listTools();
155
+ if (toolsResult.tools) {
156
+ const serverTools = toolsResult.tools.map(tool => ({
157
+ serverName,
158
+ name: tool.name,
159
+ description: tool.description || '',
160
+ inputSchema: tool.inputSchema,
161
+ }));
162
+ allTools.push(...serverTools);
163
+ logger.debug(`Listed ${serverTools.length} tools from ${serverName}`);
164
+ }
165
+ }
166
+ catch (error) {
167
+ const errorMessage = error instanceof Error ? error.message : String(error);
168
+ logger.error(`Failed to list tools from ${serverName}:`, errorMessage);
169
+ }
170
+ }
171
+ logger.debug(`Total MCP tools available: ${allTools.length}`);
172
+ return allTools;
173
+ }
174
+ async listServerTools(serverName) {
175
+ const client = this.getClient(serverName);
176
+ if (!client) {
177
+ throw new Error(`MCP server ${serverName} not connected`);
178
+ }
179
+ try {
180
+ const toolsResult = await client.listTools();
181
+ if (!toolsResult.tools) {
182
+ return [];
183
+ }
184
+ return toolsResult.tools.map(tool => ({
185
+ serverName,
186
+ name: tool.name,
187
+ description: tool.description || '',
188
+ inputSchema: tool.inputSchema,
189
+ }));
190
+ }
191
+ catch (error) {
192
+ logger.error(`Failed to list tools from ${serverName}:`, error instanceof Error ? error.message : String(error));
193
+ throw error;
194
+ }
195
+ }
196
+ async callTool(serverName, toolName, args) {
197
+ const client = this.getClient(serverName);
198
+ if (!client) {
199
+ throw new Error(`MCP server ${serverName} not connected`);
200
+ }
201
+ try {
202
+ SafeLogger.debug(`Calling MCP tool ${serverName}:${toolName} with args:`, args);
203
+ const result = await client.callTool({
204
+ name: toolName,
205
+ arguments: args,
206
+ });
207
+ SafeLogger.debug(`MCP tool ${serverName}:${toolName} returned:`, result);
208
+ return result;
209
+ }
210
+ catch (error) {
211
+ logger.error(`Failed to call MCP tool ${serverName}:${toolName}:`, error instanceof Error ? error.message : String(error));
212
+ throw error;
213
+ }
214
+ }
215
+ // Health check for all connected servers
216
+ async healthCheck() {
217
+ const healthStatus = {};
218
+ for (const [serverName, client] of this.clients.entries()) {
219
+ try {
220
+ // Try to list tools as a health check
221
+ await client.listTools();
222
+ healthStatus[serverName] = true;
223
+ this.connectionStatus.set(serverName, 'connected');
224
+ }
225
+ catch (error) {
226
+ healthStatus[serverName] = false;
227
+ this.connectionStatus.set(serverName, 'error');
228
+ logger.warn(`Health check failed for MCP server ${serverName}:`, error instanceof Error ? error.message : String(error));
229
+ }
230
+ }
231
+ return healthStatus;
232
+ }
233
+ // Get status of all servers
234
+ getStatus() {
235
+ const status = {};
236
+ this.configs.forEach(config => {
237
+ const retryInfo = this.retryInfo.get(config.name);
238
+ status[config.name] = {
239
+ status: this.connectionStatus.get(config.name) || 'unknown',
240
+ type: config.type,
241
+ ...(retryInfo && {
242
+ retryAttempts: retryInfo.attempts,
243
+ lastAttempt: retryInfo.lastAttempt,
244
+ }),
245
+ };
246
+ });
247
+ return status;
248
+ }
249
+ // Get retry information for a specific server
250
+ getRetryInfo(serverName) {
251
+ return this.retryInfo.get(serverName);
252
+ }
253
+ // Retry connection for a specific server
254
+ async retryConnection(serverName) {
255
+ const config = this.configs.find(c => c.name === serverName);
256
+ if (!config) {
257
+ logger.error(`Server config not found for ${serverName}`);
258
+ return false;
259
+ }
260
+ try {
261
+ // Disconnect first if connected
262
+ const existingClient = this.clients.get(serverName);
263
+ if (existingClient) {
264
+ await existingClient.close();
265
+ this.clients.delete(serverName);
266
+ }
267
+ // Reset retry info
268
+ this.retryInfo.delete(serverName);
269
+ // Attempt to connect
270
+ await this.connectToServer(config);
271
+ return true;
272
+ }
273
+ catch (error) {
274
+ logger.error(`Manual retry failed for ${serverName}:`, error instanceof Error ? error.message : String(error));
275
+ return false;
276
+ }
277
+ }
278
+ }
279
+ //# sourceMappingURL=mcp-client-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client-manager.js","sourceRoot":"","sources":["../../src/services/mcp-client-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ApprovalService } from '../services/approval.js';
2
+ export declare function approveMCPRequestTool(approvalService: ApprovalService, args: Record<string, unknown>): {
3
+ content: {
4
+ type: string;
5
+ text: string;
6
+ }[];
7
+ isError: boolean;
8
+ };
9
+ //# sourceMappingURL=approve-mcp-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve-mcp-request.d.ts","sourceRoot":"","sources":["../../src/tools/approve-mcp-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;EAyH9B"}
@@ -0,0 +1,111 @@
1
+ export function approveMCPRequestTool(approvalService, args) {
2
+ const { approval_id, decision, reason } = args;
3
+ if (!approval_id || !decision) {
4
+ return {
5
+ content: [
6
+ {
7
+ type: 'text',
8
+ text: '❌ Missing required parameters: approval_id and decision are required',
9
+ },
10
+ ],
11
+ isError: true,
12
+ };
13
+ }
14
+ if (!['approve', 'deny'].includes(decision)) {
15
+ return {
16
+ content: [
17
+ {
18
+ type: 'text',
19
+ text: '❌ Decision must be either "approve" or "deny"',
20
+ },
21
+ ],
22
+ isError: true,
23
+ };
24
+ }
25
+ try {
26
+ // Get the request details before processing
27
+ const request = approvalService.getApprovalRequest(approval_id);
28
+ if (!request) {
29
+ return {
30
+ content: [
31
+ {
32
+ type: 'text',
33
+ text: `❌ Approval request ${approval_id} not found`,
34
+ },
35
+ ],
36
+ isError: true,
37
+ };
38
+ }
39
+ if (request.status !== 'pending') {
40
+ return {
41
+ content: [
42
+ {
43
+ type: 'text',
44
+ text: `❌ Request ${approval_id} is not pending (status: ${request.status})`,
45
+ },
46
+ ],
47
+ isError: true,
48
+ };
49
+ }
50
+ let success = false;
51
+ let message = '';
52
+ if (decision === 'approve') {
53
+ success = approvalService.approveRequest(approval_id);
54
+ if (success) {
55
+ message = `✅ Approved: ${request.duckName} can now call ${request.mcpServer}:${request.toolName}`;
56
+ }
57
+ else {
58
+ message = `❌ Failed to approve request ${approval_id}`;
59
+ }
60
+ }
61
+ else {
62
+ success = approvalService.denyRequest(approval_id, reason);
63
+ if (success) {
64
+ message = `❌ Denied: ${request.duckName} cannot call ${request.mcpServer}:${request.toolName}`;
65
+ if (reason) {
66
+ message += `\nReason: ${reason}`;
67
+ }
68
+ }
69
+ else {
70
+ message = `❌ Failed to deny request ${approval_id}`;
71
+ }
72
+ }
73
+ // Add request details for context
74
+ const detailsLines = [
75
+ message,
76
+ '',
77
+ '📋 **Request Details:**',
78
+ `- Duck: ${request.duckName}`,
79
+ `- MCP Server: ${request.mcpServer}`,
80
+ `- Tool: ${request.toolName}`,
81
+ `- Arguments: \`${JSON.stringify(request.arguments)}\``,
82
+ `- Request ID: \`${request.id}\``,
83
+ ];
84
+ // Add next steps
85
+ if (decision === 'approve') {
86
+ detailsLines.push('');
87
+ detailsLines.push('💡 The duck can now retry their request with the approval.');
88
+ }
89
+ return {
90
+ content: [
91
+ {
92
+ type: 'text',
93
+ text: detailsLines.join('\n'),
94
+ },
95
+ ],
96
+ isError: !success,
97
+ };
98
+ }
99
+ catch (error) {
100
+ return {
101
+ content: [
102
+ {
103
+ type: 'text',
104
+ text: `❌ Error processing approval: ${error instanceof Error ? error.message : String(error)}`,
105
+ },
106
+ ],
107
+ isError: true,
108
+ };
109
+ }
110
+ }
111
+ //# sourceMappingURL=approve-mcp-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve-mcp-request.js","sourceRoot":"","sources":["../../src/tools/approve-mcp-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ProviderManager } from '../providers/manager.js';
2
+ import { ResponseCache } from '../services/cache.js';
3
+ export declare function askDuckTool(providerManager: ProviderManager, cache: ResponseCache, args: Record<string, unknown>): Promise<{
4
+ content: {
5
+ type: string;
6
+ text: string;
7
+ }[];
8
+ }>;
9
+ //# sourceMappingURL=ask-duck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-duck.d.ts","sourceRoot":"","sources":["../../src/tools/ask-duck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD,wBAAsB,WAAW,CAC/B,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;GAiE9B"}
@@ -0,0 +1,43 @@
1
+ import { formatDuckResponse } from '../utils/ascii-art.js';
2
+ import { logger } from '../utils/logger.js';
3
+ export async function askDuckTool(providerManager, cache, args) {
4
+ const { prompt, provider, model, temperature } = args;
5
+ if (!prompt) {
6
+ throw new Error('Prompt is required');
7
+ }
8
+ // Validate model if provided
9
+ if (model && provider) {
10
+ const isValid = providerManager.validateModel(provider, model);
11
+ if (!isValid) {
12
+ logger.warn(`Model ${model} may not be valid for provider ${provider}`);
13
+ }
14
+ }
15
+ // Generate cache key
16
+ const cacheKey = cache.generateKey(provider || 'default', prompt, { model, temperature });
17
+ // Try to get cached response
18
+ const { value: response, cached } = await cache.getOrSet(cacheKey, async () => {
19
+ return await providerManager.askDuck(provider, prompt, {
20
+ model,
21
+ temperature,
22
+ });
23
+ });
24
+ // Format the response
25
+ const formattedResponse = formatDuckResponse(response.nickname, response.content, response.model);
26
+ // Add usage info if available
27
+ let usageInfo = '';
28
+ if (response.usage) {
29
+ usageInfo = `\n\n📊 Tokens used: ${response.usage.total_tokens} (${response.usage.prompt_tokens} prompt, ${response.usage.completion_tokens} completion)`;
30
+ }
31
+ // Add cache and latency info
32
+ const metaInfo = `\n⏱️ Latency: ${response.latency}ms | ${cached ? '💾 Cached' : '🔄 Fresh'}`;
33
+ logger.info(`Duck ${response.nickname} responded to query ${cached ? '(cached)' : ''}`);
34
+ return {
35
+ content: [
36
+ {
37
+ type: 'text',
38
+ text: formattedResponse + usageInfo + metaInfo,
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ //# sourceMappingURL=ask-duck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-duck.js","sourceRoot":"","sources":["../../src/tools/ask-duck.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,eAAgC,EAChC,KAAoB,EACpB,IAA6B;IAE7B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAKhD,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,kCAAkC,QAAQ,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAChC,QAAQ,IAAI,SAAS,EACrB,MAAM,EACN,EAAE,KAAK,EAAE,WAAW,EAAE,CACvB,CAAC;IAEF,6BAA6B;IAC7B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,CACtD,QAAQ,EACR,KAAK,IAAI,EAAE;QACT,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE;YACrD,KAAK;YACL,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,iBAAiB,GAAG,kBAAkB,CAC1C,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,KAAK,CACf,CAAC;IAEF,8BAA8B;IAC9B,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,SAAS,GAAG,uBAAuB,QAAQ,CAAC,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,KAAK,CAAC,aAAa,YAAY,QAAQ,CAAC,KAAK,CAAC,iBAAiB,cAAc,CAAC;IAC5J,CAAC;IAED,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,iBAAiB,QAAQ,CAAC,OAAO,QAAQ,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAE9F,MAAM,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,uBAAuB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAExF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,QAAQ;aAC/C;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { ProviderManager } from '../providers/manager.js';
2
+ import { ConversationManager } from '../services/conversation.js';
3
+ export declare function chatDuckTool(providerManager: ProviderManager, conversationManager: ConversationManager, args: Record<string, unknown>): Promise<{
4
+ content: {
5
+ type: string;
6
+ text: string;
7
+ }[];
8
+ }>;
9
+ //# sourceMappingURL=chat-duck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-duck.d.ts","sourceRoot":"","sources":["../../src/tools/chat-duck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAIlE,wBAAsB,YAAY,CAChC,eAAe,EAAE,eAAe,EAChC,mBAAmB,EAAE,mBAAmB,EACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;GAyE9B"}
@@ -0,0 +1,57 @@
1
+ import { formatDuckResponse } from '../utils/ascii-art.js';
2
+ import { logger } from '../utils/logger.js';
3
+ export async function chatDuckTool(providerManager, conversationManager, args) {
4
+ const { conversation_id, message, provider, model } = args;
5
+ if (!conversation_id || !message) {
6
+ throw new Error('conversation_id and message are required');
7
+ }
8
+ // Get or create conversation
9
+ let conversation = conversationManager.getConversation(conversation_id);
10
+ if (!conversation) {
11
+ // Create new conversation with specified or default provider
12
+ const providerName = provider || providerManager.getProviderNames()[0];
13
+ conversation = conversationManager.createConversation(conversation_id, providerName);
14
+ logger.info(`Created new conversation: ${conversation_id} with ${providerName}`);
15
+ }
16
+ else if (provider && provider !== conversation.provider) {
17
+ // Switch provider if requested
18
+ conversation = conversationManager.switchProvider(conversation_id, provider);
19
+ logger.info(`Switched conversation ${conversation_id} to ${provider}`);
20
+ }
21
+ // Add user message to conversation
22
+ conversationManager.addMessage(conversation_id, {
23
+ role: 'user',
24
+ content: message,
25
+ timestamp: new Date(),
26
+ });
27
+ // Get conversation context
28
+ const messages = conversationManager.getConversationContext(conversation_id);
29
+ // Get response from provider
30
+ const providerToUse = provider || conversation.provider;
31
+ const response = await providerManager.askDuck(providerToUse, '', {
32
+ messages,
33
+ model,
34
+ });
35
+ // Add assistant response to conversation
36
+ conversationManager.addMessage(conversation_id, {
37
+ role: 'assistant',
38
+ content: response.content,
39
+ timestamp: new Date(),
40
+ provider: providerToUse,
41
+ });
42
+ // Format response
43
+ const formattedResponse = formatDuckResponse(response.nickname, response.content, response.model);
44
+ // Add conversation info
45
+ const conversationInfo = `\n\n💬 Conversation: ${conversation_id} | Messages: ${messages.length + 1}`;
46
+ const latencyInfo = `\n⏱️ Latency: ${response.latency}ms`;
47
+ logger.info(`Duck ${response.nickname} responded in conversation ${conversation_id}`);
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: formattedResponse + conversationInfo + latencyInfo,
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ //# sourceMappingURL=chat-duck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-duck.js","sourceRoot":"","sources":["../../src/tools/chat-duck.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,eAAgC,EAChC,mBAAwC,EACxC,IAA6B;IAE7B,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAKrD,CAAC;IAEF,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,6BAA6B;IAC7B,IAAI,YAAY,GAAG,mBAAmB,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IAExE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,6DAA6D;QAC7D,MAAM,YAAY,GAAG,QAAQ,IAAI,eAAe,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,YAAY,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,6BAA6B,eAAe,SAAS,YAAY,EAAE,CAAC,CAAC;IACnF,CAAC;SAAM,IAAI,QAAQ,IAAI,QAAQ,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC1D,+BAA+B;QAC/B,YAAY,GAAG,mBAAmB,CAAC,cAAc,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,yBAAyB,eAAe,OAAO,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,mCAAmC;IACnC,mBAAmB,CAAC,UAAU,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;IAE7E,6BAA6B;IAC7B,MAAM,aAAa,GAAG,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,EAAE;QAChE,QAAQ;QACR,KAAK;KACN,CAAC,CAAC;IAEH,yCAAyC;IACzC,mBAAmB,CAAC,UAAU,CAAC,eAAe,EAAE;QAC9C,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,QAAQ,EAAE,aAAa;KACxB,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,iBAAiB,GAAG,kBAAkB,CAC1C,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,KAAK,CACf,CAAC;IAEF,wBAAwB;IACxB,MAAM,gBAAgB,GAAG,wBAAwB,eAAe,gBAAgB,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IACtG,MAAM,WAAW,GAAG,iBAAiB,QAAQ,CAAC,OAAO,IAAI,CAAC;IAE1D,MAAM,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,8BAA8B,eAAe,EAAE,CAAC,CAAC;IAEtF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,WAAW;aACzD;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ConversationManager } from '../services/conversation.js';
2
+ export declare function clearConversationsTool(conversationManager: ConversationManager, _args: Record<string, unknown>): {
3
+ content: {
4
+ type: string;
5
+ text: string;
6
+ }[];
7
+ };
8
+ //# sourceMappingURL=clear-conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-conversations.d.ts","sourceRoot":"","sources":["../../src/tools/clear-conversations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGlE,wBAAgB,sBAAsB,CACpC,mBAAmB,EAAE,mBAAmB,EACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;EAkB/B"}
@@ -0,0 +1,17 @@
1
+ import { logger } from '../utils/logger.js';
2
+ export function clearConversationsTool(conversationManager, _args) {
3
+ const result = conversationManager.clearAll();
4
+ logger.info(`User cleared ${result.conversationsCleared} conversations`);
5
+ const message = result.conversationsCleared === 0
6
+ ? '🧹 No conversations to clear - memory is already empty!'
7
+ : `🧹 Cleared ${result.conversationsCleared} conversation${result.conversationsCleared === 1 ? '' : 's'} (${result.messagesCleared} message${result.messagesCleared === 1 ? '' : 's'})`;
8
+ return {
9
+ content: [
10
+ {
11
+ type: 'text',
12
+ text: `${message}\n\n🦆 All ducks now have a fresh start! Previous conversation context has been removed.`,
13
+ },
14
+ ],
15
+ };
16
+ }
17
+ //# sourceMappingURL=clear-conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-conversations.js","sourceRoot":"","sources":["../../src/tools/clear-conversations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,sBAAsB,CACpC,mBAAwC,EACxC,KAA8B;IAE9B,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,EAAE,CAAC;IAE9C,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,oBAAoB,gBAAgB,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,KAAK,CAAC;QAC/C,CAAC,CAAC,yDAAyD;QAC3D,CAAC,CAAC,cAAc,MAAM,CAAC,oBAAoB,gBAAgB,MAAM,CAAC,oBAAoB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,eAAe,WAAW,MAAM,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAE1L,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,GAAG,OAAO,0FAA0F;aAC3G;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ProviderManager } from '../providers/manager.js';
2
+ export declare function compareDucksTool(providerManager: ProviderManager, _cache: unknown, args: Record<string, unknown>): Promise<{
3
+ content: {
4
+ type: string;
5
+ text: string;
6
+ }[];
7
+ }>;
8
+ //# sourceMappingURL=compare-ducks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-ducks.d.ts","sourceRoot":"","sources":["../../src/tools/compare-ducks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI1D,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;GA2D9B"}