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,356 @@
1
+ import { z } from 'zod';
2
+ export declare const ProviderConfigSchema: z.ZodObject<{
3
+ api_key: z.ZodOptional<z.ZodString>;
4
+ base_url: z.ZodString;
5
+ models: z.ZodArray<z.ZodString, "many">;
6
+ default_model: z.ZodString;
7
+ nickname: z.ZodString;
8
+ temperature: z.ZodOptional<z.ZodNumber>;
9
+ system_prompt: z.ZodOptional<z.ZodString>;
10
+ timeout: z.ZodOptional<z.ZodNumber>;
11
+ max_retries: z.ZodOptional<z.ZodNumber>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ base_url: string;
14
+ models: string[];
15
+ default_model: string;
16
+ nickname: string;
17
+ api_key?: string | undefined;
18
+ temperature?: number | undefined;
19
+ system_prompt?: string | undefined;
20
+ timeout?: number | undefined;
21
+ max_retries?: number | undefined;
22
+ }, {
23
+ base_url: string;
24
+ models: string[];
25
+ default_model: string;
26
+ nickname: string;
27
+ api_key?: string | undefined;
28
+ temperature?: number | undefined;
29
+ system_prompt?: string | undefined;
30
+ timeout?: number | undefined;
31
+ max_retries?: number | undefined;
32
+ }>;
33
+ export declare const MCPServerConfigSchema: z.ZodObject<{
34
+ name: z.ZodString;
35
+ type: z.ZodEnum<["stdio", "http"]>;
36
+ command: z.ZodOptional<z.ZodString>;
37
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
38
+ url: z.ZodOptional<z.ZodString>;
39
+ apiKey: z.ZodOptional<z.ZodString>;
40
+ enabled: z.ZodDefault<z.ZodBoolean>;
41
+ retryAttempts: z.ZodDefault<z.ZodNumber>;
42
+ retryDelay: z.ZodDefault<z.ZodNumber>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ type: "stdio" | "http";
45
+ name: string;
46
+ enabled: boolean;
47
+ retryAttempts: number;
48
+ retryDelay: number;
49
+ command?: string | undefined;
50
+ args?: string[] | undefined;
51
+ url?: string | undefined;
52
+ apiKey?: string | undefined;
53
+ }, {
54
+ type: "stdio" | "http";
55
+ name: string;
56
+ command?: string | undefined;
57
+ args?: string[] | undefined;
58
+ url?: string | undefined;
59
+ apiKey?: string | undefined;
60
+ enabled?: boolean | undefined;
61
+ retryAttempts?: number | undefined;
62
+ retryDelay?: number | undefined;
63
+ }>;
64
+ export declare const MCPBridgeConfigSchema: z.ZodObject<{
65
+ enabled: z.ZodDefault<z.ZodBoolean>;
66
+ approval_mode: z.ZodDefault<z.ZodEnum<["always", "trusted", "never"]>>;
67
+ approval_timeout: z.ZodDefault<z.ZodNumber>;
68
+ trusted_tools: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
69
+ trusted_tools_by_server: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString, "many">>>;
70
+ mcp_servers: z.ZodDefault<z.ZodArray<z.ZodObject<{
71
+ name: z.ZodString;
72
+ type: z.ZodEnum<["stdio", "http"]>;
73
+ command: z.ZodOptional<z.ZodString>;
74
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
75
+ url: z.ZodOptional<z.ZodString>;
76
+ apiKey: z.ZodOptional<z.ZodString>;
77
+ enabled: z.ZodDefault<z.ZodBoolean>;
78
+ retryAttempts: z.ZodDefault<z.ZodNumber>;
79
+ retryDelay: z.ZodDefault<z.ZodNumber>;
80
+ }, "strip", z.ZodTypeAny, {
81
+ type: "stdio" | "http";
82
+ name: string;
83
+ enabled: boolean;
84
+ retryAttempts: number;
85
+ retryDelay: number;
86
+ command?: string | undefined;
87
+ args?: string[] | undefined;
88
+ url?: string | undefined;
89
+ apiKey?: string | undefined;
90
+ }, {
91
+ type: "stdio" | "http";
92
+ name: string;
93
+ command?: string | undefined;
94
+ args?: string[] | undefined;
95
+ url?: string | undefined;
96
+ apiKey?: string | undefined;
97
+ enabled?: boolean | undefined;
98
+ retryAttempts?: number | undefined;
99
+ retryDelay?: number | undefined;
100
+ }>, "many">>;
101
+ }, "strip", z.ZodTypeAny, {
102
+ enabled: boolean;
103
+ approval_mode: "never" | "always" | "trusted";
104
+ approval_timeout: number;
105
+ trusted_tools: string[];
106
+ mcp_servers: {
107
+ type: "stdio" | "http";
108
+ name: string;
109
+ enabled: boolean;
110
+ retryAttempts: number;
111
+ retryDelay: number;
112
+ command?: string | undefined;
113
+ args?: string[] | undefined;
114
+ url?: string | undefined;
115
+ apiKey?: string | undefined;
116
+ }[];
117
+ trusted_tools_by_server?: Record<string, string[]> | undefined;
118
+ }, {
119
+ enabled?: boolean | undefined;
120
+ approval_mode?: "never" | "always" | "trusted" | undefined;
121
+ approval_timeout?: number | undefined;
122
+ trusted_tools?: string[] | undefined;
123
+ trusted_tools_by_server?: Record<string, string[]> | undefined;
124
+ mcp_servers?: {
125
+ type: "stdio" | "http";
126
+ name: string;
127
+ command?: string | undefined;
128
+ args?: string[] | undefined;
129
+ url?: string | undefined;
130
+ apiKey?: string | undefined;
131
+ enabled?: boolean | undefined;
132
+ retryAttempts?: number | undefined;
133
+ retryDelay?: number | undefined;
134
+ }[] | undefined;
135
+ }>;
136
+ export declare const ConfigSchema: z.ZodObject<{
137
+ providers: z.ZodRecord<z.ZodString, z.ZodObject<{
138
+ api_key: z.ZodOptional<z.ZodString>;
139
+ base_url: z.ZodString;
140
+ models: z.ZodArray<z.ZodString, "many">;
141
+ default_model: z.ZodString;
142
+ nickname: z.ZodString;
143
+ temperature: z.ZodOptional<z.ZodNumber>;
144
+ system_prompt: z.ZodOptional<z.ZodString>;
145
+ timeout: z.ZodOptional<z.ZodNumber>;
146
+ max_retries: z.ZodOptional<z.ZodNumber>;
147
+ }, "strip", z.ZodTypeAny, {
148
+ base_url: string;
149
+ models: string[];
150
+ default_model: string;
151
+ nickname: string;
152
+ api_key?: string | undefined;
153
+ temperature?: number | undefined;
154
+ system_prompt?: string | undefined;
155
+ timeout?: number | undefined;
156
+ max_retries?: number | undefined;
157
+ }, {
158
+ base_url: string;
159
+ models: string[];
160
+ default_model: string;
161
+ nickname: string;
162
+ api_key?: string | undefined;
163
+ temperature?: number | undefined;
164
+ system_prompt?: string | undefined;
165
+ timeout?: number | undefined;
166
+ max_retries?: number | undefined;
167
+ }>>;
168
+ default_provider: z.ZodOptional<z.ZodString>;
169
+ default_temperature: z.ZodDefault<z.ZodNumber>;
170
+ cache_ttl: z.ZodDefault<z.ZodNumber>;
171
+ enable_failover: z.ZodDefault<z.ZodBoolean>;
172
+ log_level: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
173
+ mcp_bridge: z.ZodOptional<z.ZodObject<{
174
+ enabled: z.ZodDefault<z.ZodBoolean>;
175
+ approval_mode: z.ZodDefault<z.ZodEnum<["always", "trusted", "never"]>>;
176
+ approval_timeout: z.ZodDefault<z.ZodNumber>;
177
+ trusted_tools: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
178
+ trusted_tools_by_server: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString, "many">>>;
179
+ mcp_servers: z.ZodDefault<z.ZodArray<z.ZodObject<{
180
+ name: z.ZodString;
181
+ type: z.ZodEnum<["stdio", "http"]>;
182
+ command: z.ZodOptional<z.ZodString>;
183
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
184
+ url: z.ZodOptional<z.ZodString>;
185
+ apiKey: z.ZodOptional<z.ZodString>;
186
+ enabled: z.ZodDefault<z.ZodBoolean>;
187
+ retryAttempts: z.ZodDefault<z.ZodNumber>;
188
+ retryDelay: z.ZodDefault<z.ZodNumber>;
189
+ }, "strip", z.ZodTypeAny, {
190
+ type: "stdio" | "http";
191
+ name: string;
192
+ enabled: boolean;
193
+ retryAttempts: number;
194
+ retryDelay: number;
195
+ command?: string | undefined;
196
+ args?: string[] | undefined;
197
+ url?: string | undefined;
198
+ apiKey?: string | undefined;
199
+ }, {
200
+ type: "stdio" | "http";
201
+ name: string;
202
+ command?: string | undefined;
203
+ args?: string[] | undefined;
204
+ url?: string | undefined;
205
+ apiKey?: string | undefined;
206
+ enabled?: boolean | undefined;
207
+ retryAttempts?: number | undefined;
208
+ retryDelay?: number | undefined;
209
+ }>, "many">>;
210
+ }, "strip", z.ZodTypeAny, {
211
+ enabled: boolean;
212
+ approval_mode: "never" | "always" | "trusted";
213
+ approval_timeout: number;
214
+ trusted_tools: string[];
215
+ mcp_servers: {
216
+ type: "stdio" | "http";
217
+ name: string;
218
+ enabled: boolean;
219
+ retryAttempts: number;
220
+ retryDelay: number;
221
+ command?: string | undefined;
222
+ args?: string[] | undefined;
223
+ url?: string | undefined;
224
+ apiKey?: string | undefined;
225
+ }[];
226
+ trusted_tools_by_server?: Record<string, string[]> | undefined;
227
+ }, {
228
+ enabled?: boolean | undefined;
229
+ approval_mode?: "never" | "always" | "trusted" | undefined;
230
+ approval_timeout?: number | undefined;
231
+ trusted_tools?: string[] | undefined;
232
+ trusted_tools_by_server?: Record<string, string[]> | undefined;
233
+ mcp_servers?: {
234
+ type: "stdio" | "http";
235
+ name: string;
236
+ command?: string | undefined;
237
+ args?: string[] | undefined;
238
+ url?: string | undefined;
239
+ apiKey?: string | undefined;
240
+ enabled?: boolean | undefined;
241
+ retryAttempts?: number | undefined;
242
+ retryDelay?: number | undefined;
243
+ }[] | undefined;
244
+ }>>;
245
+ }, "strip", z.ZodTypeAny, {
246
+ providers: Record<string, {
247
+ base_url: string;
248
+ models: string[];
249
+ default_model: string;
250
+ nickname: string;
251
+ api_key?: string | undefined;
252
+ temperature?: number | undefined;
253
+ system_prompt?: string | undefined;
254
+ timeout?: number | undefined;
255
+ max_retries?: number | undefined;
256
+ }>;
257
+ default_temperature: number;
258
+ cache_ttl: number;
259
+ enable_failover: boolean;
260
+ log_level: "debug" | "info" | "warn" | "error";
261
+ default_provider?: string | undefined;
262
+ mcp_bridge?: {
263
+ enabled: boolean;
264
+ approval_mode: "never" | "always" | "trusted";
265
+ approval_timeout: number;
266
+ trusted_tools: string[];
267
+ mcp_servers: {
268
+ type: "stdio" | "http";
269
+ name: string;
270
+ enabled: boolean;
271
+ retryAttempts: number;
272
+ retryDelay: number;
273
+ command?: string | undefined;
274
+ args?: string[] | undefined;
275
+ url?: string | undefined;
276
+ apiKey?: string | undefined;
277
+ }[];
278
+ trusted_tools_by_server?: Record<string, string[]> | undefined;
279
+ } | undefined;
280
+ }, {
281
+ providers: Record<string, {
282
+ base_url: string;
283
+ models: string[];
284
+ default_model: string;
285
+ nickname: string;
286
+ api_key?: string | undefined;
287
+ temperature?: number | undefined;
288
+ system_prompt?: string | undefined;
289
+ timeout?: number | undefined;
290
+ max_retries?: number | undefined;
291
+ }>;
292
+ default_provider?: string | undefined;
293
+ default_temperature?: number | undefined;
294
+ cache_ttl?: number | undefined;
295
+ enable_failover?: boolean | undefined;
296
+ log_level?: "debug" | "info" | "warn" | "error" | undefined;
297
+ mcp_bridge?: {
298
+ enabled?: boolean | undefined;
299
+ approval_mode?: "never" | "always" | "trusted" | undefined;
300
+ approval_timeout?: number | undefined;
301
+ trusted_tools?: string[] | undefined;
302
+ trusted_tools_by_server?: Record<string, string[]> | undefined;
303
+ mcp_servers?: {
304
+ type: "stdio" | "http";
305
+ name: string;
306
+ command?: string | undefined;
307
+ args?: string[] | undefined;
308
+ url?: string | undefined;
309
+ apiKey?: string | undefined;
310
+ enabled?: boolean | undefined;
311
+ retryAttempts?: number | undefined;
312
+ retryDelay?: number | undefined;
313
+ }[] | undefined;
314
+ } | undefined;
315
+ }>;
316
+ export type ProviderConfig = z.infer<typeof ProviderConfigSchema>;
317
+ export type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>;
318
+ export type MCPBridgeConfig = z.infer<typeof MCPBridgeConfigSchema>;
319
+ export type Config = z.infer<typeof ConfigSchema>;
320
+ export interface ConversationMessage {
321
+ role: 'system' | 'user' | 'assistant';
322
+ content: string;
323
+ timestamp: Date;
324
+ provider?: string;
325
+ }
326
+ export interface Conversation {
327
+ id: string;
328
+ messages: ConversationMessage[];
329
+ provider: string;
330
+ createdAt: Date;
331
+ updatedAt: Date;
332
+ }
333
+ export interface ProviderHealth {
334
+ provider: string;
335
+ healthy: boolean;
336
+ latency?: number;
337
+ lastCheck: Date;
338
+ error?: string;
339
+ }
340
+ export interface DuckResponse {
341
+ provider: string;
342
+ nickname: string;
343
+ model: string;
344
+ content: string;
345
+ usage?: {
346
+ prompt_tokens: number;
347
+ completion_tokens: number;
348
+ total_tokens: number;
349
+ promptTokens?: number;
350
+ completionTokens?: number;
351
+ totalTokens?: number;
352
+ };
353
+ latency: number;
354
+ cached: boolean;
355
+ }
356
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOhC,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB"}
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ export const ProviderConfigSchema = z.object({
3
+ api_key: z.string().optional(),
4
+ base_url: z.string().url(),
5
+ models: z.array(z.string()),
6
+ default_model: z.string(),
7
+ nickname: z.string(),
8
+ temperature: z.number().min(0).max(2).optional(),
9
+ system_prompt: z.string().optional(),
10
+ timeout: z.number().positive().optional(),
11
+ max_retries: z.number().min(0).max(5).optional(),
12
+ });
13
+ export const MCPServerConfigSchema = z.object({
14
+ name: z.string(),
15
+ type: z.enum(['stdio', 'http']),
16
+ command: z.string().optional(),
17
+ args: z.array(z.string()).optional(),
18
+ url: z.string().url().optional(),
19
+ apiKey: z.string().optional(),
20
+ enabled: z.boolean().default(true),
21
+ retryAttempts: z.number().min(0).max(10).default(3),
22
+ retryDelay: z.number().min(100).max(30000).default(1000),
23
+ });
24
+ export const MCPBridgeConfigSchema = z.object({
25
+ enabled: z.boolean().default(false),
26
+ approval_mode: z.enum(['always', 'trusted', 'never']).default('always'),
27
+ approval_timeout: z.number().min(30).max(3600).default(300), // 5 minutes
28
+ trusted_tools: z.array(z.string()).default([]), // Global fallback trusted tools
29
+ trusted_tools_by_server: z.record(z.string(), z.array(z.string())).optional(), // Per-server trusted tools
30
+ mcp_servers: z.array(MCPServerConfigSchema).default([]),
31
+ });
32
+ export const ConfigSchema = z.object({
33
+ providers: z.record(z.string(), ProviderConfigSchema),
34
+ default_provider: z.string().optional(),
35
+ default_temperature: z.number().min(0).max(2).default(0.7),
36
+ cache_ttl: z.number().min(0).default(300), // 5 minutes
37
+ enable_failover: z.boolean().default(true),
38
+ log_level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
39
+ mcp_bridge: MCPBridgeConfigSchema.optional(),
40
+ });
41
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ import { RubberDuckServer } from './server.js';
3
+ import { logger } from './utils/logger.js';
4
+ // Global error handlers for crash diagnosis
5
+ process.on('uncaughtException', (error) => {
6
+ logger.error('FATAL: Uncaught Exception', {
7
+ error: error.message,
8
+ stack: error.stack,
9
+ pid: process.pid,
10
+ memory: process.memoryUsage(),
11
+ uptime: process.uptime(),
12
+ });
13
+ process.exit(1);
14
+ });
15
+ process.on('unhandledRejection', (reason, _promise) => {
16
+ logger.error('FATAL: Unhandled Promise Rejection', {
17
+ reason: reason instanceof Error ? reason.message : String(reason),
18
+ stack: reason instanceof Error ? reason.stack : undefined,
19
+ promise: '[Promise object]',
20
+ pid: process.pid,
21
+ memory: process.memoryUsage(),
22
+ uptime: process.uptime(),
23
+ });
24
+ process.exit(1);
25
+ });
26
+ async function main() {
27
+ logger.info('Starting MCP Rubber Duck Server', {
28
+ pid: process.pid,
29
+ nodeVersion: process.version,
30
+ platform: process.platform,
31
+ arch: process.arch,
32
+ cwd: process.cwd(),
33
+ argv: process.argv,
34
+ env: {
35
+ NODE_ENV: process.env.NODE_ENV,
36
+ LOG_LEVEL: process.env.LOG_LEVEL,
37
+ MCP_SERVER: process.env.MCP_SERVER,
38
+ MCP_BRIDGE_ENABLED: process.env.MCP_BRIDGE_ENABLED,
39
+ MCP_APPROVAL_MODE: process.env.MCP_APPROVAL_MODE,
40
+ }
41
+ });
42
+ try {
43
+ const server = new RubberDuckServer();
44
+ // Handle graceful shutdown
45
+ process.on('SIGINT', () => {
46
+ void (async () => {
47
+ logger.info('Received SIGINT, shutting down gracefully...', {
48
+ pid: process.pid,
49
+ uptime: process.uptime(),
50
+ });
51
+ try {
52
+ await server.stop();
53
+ logger.info('Server stopped gracefully');
54
+ process.exit(0);
55
+ }
56
+ catch (error) {
57
+ logger.error('Error during graceful shutdown:', error);
58
+ process.exit(1);
59
+ }
60
+ })();
61
+ });
62
+ process.on('SIGTERM', () => {
63
+ void (async () => {
64
+ logger.info('Received SIGTERM, shutting down gracefully...', {
65
+ pid: process.pid,
66
+ uptime: process.uptime(),
67
+ });
68
+ try {
69
+ await server.stop();
70
+ logger.info('Server stopped gracefully');
71
+ process.exit(0);
72
+ }
73
+ catch (error) {
74
+ logger.error('Error during graceful shutdown:', error);
75
+ process.exit(1);
76
+ }
77
+ })();
78
+ });
79
+ // Start the server
80
+ logger.info('Initializing server...');
81
+ await server.start();
82
+ logger.info('Server started successfully', {
83
+ pid: process.pid,
84
+ memory: process.memoryUsage(),
85
+ });
86
+ }
87
+ catch (error) {
88
+ logger.error('Failed to start server:', {
89
+ error: error instanceof Error ? error.message : String(error),
90
+ stack: error instanceof Error ? error.stack : undefined,
91
+ pid: process.pid,
92
+ memory: process.memoryUsage(),
93
+ uptime: process.uptime(),
94
+ });
95
+ process.exit(1);
96
+ }
97
+ }
98
+ // Run the server
99
+ main().catch((error) => {
100
+ logger.error('Unhandled error in main:', {
101
+ error: error instanceof Error ? error.message : String(error),
102
+ stack: error instanceof Error ? error.stack : undefined,
103
+ pid: process.pid,
104
+ memory: process.memoryUsage(),
105
+ uptime: process.uptime(),
106
+ });
107
+ process.exit(1);
108
+ });
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { DuckProvider } from './provider.js';
2
+ import { ChatOptions, ChatResponse, ProviderOptions, MCPResult } from './types.js';
3
+ import { FunctionBridge } from '../services/function-bridge.js';
4
+ import { ConversationMessage } from '../config/types.js';
5
+ export interface EnhancedChatResponse extends ChatResponse {
6
+ pendingApprovals?: {
7
+ id: string;
8
+ message: string;
9
+ }[];
10
+ mcpResults?: MCPResult[];
11
+ }
12
+ export declare class EnhancedDuckProvider extends DuckProvider {
13
+ private functionBridge;
14
+ private mcpEnabled;
15
+ constructor(name: string, nickname: string, options: ProviderOptions, functionBridge: FunctionBridge, mcpEnabled?: boolean);
16
+ chat(options: ChatOptions): Promise<EnhancedChatResponse>;
17
+ private handleToolCalls;
18
+ retryWithApproval(approvalId: string, originalMessages: ConversationMessage[], options: ChatOptions): Promise<EnhancedChatResponse>;
19
+ getMCPFunctionCount(): Promise<number>;
20
+ getMCPStats(): {
21
+ totalFunctions: number;
22
+ serverCount: number;
23
+ trustedToolCount: number;
24
+ connectedServers: string[];
25
+ } | null;
26
+ setMCPEnabled(enabled: boolean): void;
27
+ isMCPEnabled(): boolean;
28
+ }
29
+ //# sourceMappingURL=duck-provider-enhanced.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duck-provider-enhanced.d.ts","sourceRoot":"","sources":["../../src/providers/duck-provider-enhanced.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAmC,SAAS,EAAkB,MAAM,YAAY,CAAC;AACpI,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAIzD,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,gBAAgB,CAAC,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;KACjB,EAAE,CAAC;IACJ,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAU;gBAG1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,cAAc,EAC9B,UAAU,GAAE,OAAc;IAOtB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAyEjD,eAAe;IAgIvB,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,mBAAmB,EAAE,EACvC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC;IA0B1B,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAc5C,WAAW;;;;;;IASX,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKrC,YAAY,IAAI,OAAO;CAGxB"}