@tryhamster/gerbil 1.0.0-rc.0 → 1.0.0-rc.2

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 (94) hide show
  1. package/README.md +79 -14
  2. package/dist/auto-update-DsWBBnEk.mjs +3 -0
  3. package/dist/browser/index.d.mts +401 -5
  4. package/dist/browser/index.d.mts.map +1 -1
  5. package/dist/browser/index.mjs +1772 -146
  6. package/dist/browser/index.mjs.map +1 -1
  7. package/dist/{chrome-backend-CtwPENIW.mjs → chrome-backend-JEPeM2YE.mjs} +1 -1
  8. package/dist/{chrome-backend-C5Un08O4.mjs → chrome-backend-Y9F7W5VQ.mjs} +514 -73
  9. package/dist/chrome-backend-Y9F7W5VQ.mjs.map +1 -0
  10. package/dist/cli.mjs +3359 -646
  11. package/dist/cli.mjs.map +1 -1
  12. package/dist/frameworks/express.d.mts +1 -1
  13. package/dist/frameworks/express.mjs +3 -3
  14. package/dist/frameworks/fastify.d.mts +1 -1
  15. package/dist/frameworks/fastify.mjs +3 -3
  16. package/dist/frameworks/hono.d.mts +1 -1
  17. package/dist/frameworks/hono.mjs +3 -3
  18. package/dist/frameworks/next.d.mts +2 -2
  19. package/dist/frameworks/next.mjs +3 -3
  20. package/dist/frameworks/react.d.mts +1 -1
  21. package/dist/frameworks/trpc.d.mts +1 -1
  22. package/dist/frameworks/trpc.mjs +3 -3
  23. package/dist/gerbil-DeQlX_Mt.mjs +5 -0
  24. package/dist/gerbil-POAz8peb.d.mts +431 -0
  25. package/dist/gerbil-POAz8peb.d.mts.map +1 -0
  26. package/dist/gerbil-yoSpRHgv.mjs +1463 -0
  27. package/dist/gerbil-yoSpRHgv.mjs.map +1 -0
  28. package/dist/index.d.mts +395 -9
  29. package/dist/index.d.mts.map +1 -1
  30. package/dist/index.mjs +8 -6
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/integrations/ai-sdk.d.mts +122 -4
  33. package/dist/integrations/ai-sdk.d.mts.map +1 -1
  34. package/dist/integrations/ai-sdk.mjs +239 -11
  35. package/dist/integrations/ai-sdk.mjs.map +1 -1
  36. package/dist/integrations/langchain.d.mts +132 -2
  37. package/dist/integrations/langchain.d.mts.map +1 -1
  38. package/dist/integrations/langchain.mjs +176 -8
  39. package/dist/integrations/langchain.mjs.map +1 -1
  40. package/dist/integrations/llamaindex.d.mts +1 -1
  41. package/dist/integrations/llamaindex.mjs +3 -3
  42. package/dist/integrations/mcp-client.mjs +4 -4
  43. package/dist/integrations/mcp-client.mjs.map +1 -1
  44. package/dist/integrations/mcp.d.mts +2 -2
  45. package/dist/integrations/mcp.d.mts.map +1 -1
  46. package/dist/integrations/mcp.mjs +6 -6
  47. package/dist/{mcp-R8kRLIKb.mjs → mcp-Bitg4sjX.mjs} +10 -37
  48. package/dist/mcp-Bitg4sjX.mjs.map +1 -0
  49. package/dist/microphone-D-6y9aiE.mjs +3 -0
  50. package/dist/{models-DKULvhOr.mjs → models-BAtL8qsA.mjs} +42 -7
  51. package/dist/models-BAtL8qsA.mjs.map +1 -0
  52. package/dist/{models-De2-_GmQ.d.mts → models-CE0fBq0U.d.mts} +2 -2
  53. package/dist/models-CE0fBq0U.d.mts.map +1 -0
  54. package/dist/{one-liner-BUQR0nqq.mjs → one-liner-B1rmFto6.mjs} +2 -2
  55. package/dist/{one-liner-BUQR0nqq.mjs.map → one-liner-B1rmFto6.mjs.map} +1 -1
  56. package/dist/repl-D20JO260.mjs +10 -0
  57. package/dist/skills/index.d.mts +303 -12
  58. package/dist/skills/index.d.mts.map +1 -1
  59. package/dist/skills/index.mjs +6 -6
  60. package/dist/skills-5DxAV-rn.mjs +1435 -0
  61. package/dist/skills-5DxAV-rn.mjs.map +1 -0
  62. package/dist/stt-Bv_dum-R.mjs +433 -0
  63. package/dist/stt-Bv_dum-R.mjs.map +1 -0
  64. package/dist/stt-KzSoNvwI.mjs +3 -0
  65. package/dist/{tools-BsiEE6f2.mjs → tools-IYPrqoek.mjs} +6 -7
  66. package/dist/{tools-BsiEE6f2.mjs.map → tools-IYPrqoek.mjs.map} +1 -1
  67. package/dist/tts-5yWeP_I0.mjs +3 -0
  68. package/dist/tts-DG6denWG.mjs +729 -0
  69. package/dist/tts-DG6denWG.mjs.map +1 -0
  70. package/dist/types-s6Py2_DL.d.mts +353 -0
  71. package/dist/types-s6Py2_DL.d.mts.map +1 -0
  72. package/dist/{utils-7vXqtq2Q.mjs → utils-CkB4Roi6.mjs} +1 -1
  73. package/dist/{utils-7vXqtq2Q.mjs.map → utils-CkB4Roi6.mjs.map} +1 -1
  74. package/docs/ai-sdk.md +137 -21
  75. package/docs/browser.md +241 -2
  76. package/docs/memory.md +72 -0
  77. package/docs/stt.md +494 -0
  78. package/docs/tts.md +569 -0
  79. package/docs/vision.md +396 -0
  80. package/package.json +17 -18
  81. package/dist/auto-update-BbNHbSU1.mjs +0 -3
  82. package/dist/chrome-backend-C5Un08O4.mjs.map +0 -1
  83. package/dist/gerbil-BfnsFWRE.mjs +0 -644
  84. package/dist/gerbil-BfnsFWRE.mjs.map +0 -1
  85. package/dist/gerbil-BjW-z7Fq.mjs +0 -5
  86. package/dist/gerbil-DZ1k3ChC.d.mts +0 -138
  87. package/dist/gerbil-DZ1k3ChC.d.mts.map +0 -1
  88. package/dist/mcp-R8kRLIKb.mjs.map +0 -1
  89. package/dist/models-DKULvhOr.mjs.map +0 -1
  90. package/dist/models-De2-_GmQ.d.mts.map +0 -1
  91. package/dist/skills-D3CEpgDc.mjs +0 -630
  92. package/dist/skills-D3CEpgDc.mjs.map +0 -1
  93. package/dist/types-BS1N92Jt.d.mts +0 -183
  94. package/dist/types-BS1N92Jt.d.mts.map +0 -1
@@ -1,18 +1,45 @@
1
- import { a as GenerateOptions, s as GerbilConfig } from "../types-BS1N92Jt.mjs";
1
+ import { O as TranscribeOptions, S as SpeakOptions, c as GerbilConfig, d as ImageInput, o as GenerateOptions } from "../types-s6Py2_DL.mjs";
2
2
 
3
3
  //#region src/integrations/langchain.d.ts
4
4
 
5
5
  /**
6
6
  * Gerbil LLM for LangChain
7
+ *
8
+ * Supports text generation with optional vision (images) input.
7
9
  */
8
10
  declare class GerbilLLM {
9
11
  private readonly model;
10
12
  private readonly options;
11
13
  constructor(config?: GerbilConfig & GenerateOptions);
12
14
  get _llmType(): string;
15
+ /**
16
+ * Generate text from a prompt
17
+ */
13
18
  invoke(prompt: string, options?: GenerateOptions): Promise<string>;
19
+ /**
20
+ * Generate text with images (vision)
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const llm = new GerbilLLM({ model: "ministral-3b" });
25
+ * const result = await llm.invokeWithImages("Describe this image", [
26
+ * { source: "https://example.com/photo.jpg" }
27
+ * ]);
28
+ * ```
29
+ */
30
+ invokeWithImages(prompt: string, images: ImageInput[], options?: GenerateOptions): Promise<string>;
31
+ /**
32
+ * Stream text generation
33
+ */
14
34
  stream(prompt: string, options?: GenerateOptions): AsyncGenerator<string>;
35
+ /**
36
+ * Batch generate text for multiple prompts
37
+ */
15
38
  batch(prompts: string[], options?: GenerateOptions): Promise<string[]>;
39
+ /**
40
+ * Check if the model supports vision input
41
+ */
42
+ supportsVision(): Promise<boolean>;
16
43
  call(prompt: string): Promise<string>;
17
44
  predict(text: string): Promise<string>;
18
45
  generate(prompts: string[]): Promise<{
@@ -32,10 +59,113 @@ declare class GerbilEmbeddings {
32
59
  embedQuery(text: string): Promise<number[]>;
33
60
  embedDocuments(documents: string[]): Promise<number[][]>;
34
61
  }
62
+ /**
63
+ * Gerbil Text-to-Speech for LangChain
64
+ *
65
+ * Note: LangChain doesn't have a standard TTS interface, so this is a
66
+ * utility class for use in LangChain pipelines.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * import { GerbilTTS } from "gerbil/langchain";
71
+ *
72
+ * const tts = new GerbilTTS({ voice: "af_heart" });
73
+ * const result = await tts.speak("Hello world!");
74
+ * // result.audio = Float32Array, result.sampleRate = 24000
75
+ *
76
+ * // List voices
77
+ * const voices = await tts.listVoices();
78
+ * ```
79
+ */
80
+ declare class GerbilTTS {
81
+ private readonly voice;
82
+ private readonly speed;
83
+ private gerbil;
84
+ constructor(config?: {
85
+ voice?: string;
86
+ speed?: number;
87
+ });
88
+ private getInstance;
89
+ /**
90
+ * Generate speech from text
91
+ */
92
+ speak(text: string, options?: SpeakOptions): Promise<{
93
+ audio: Float32Array;
94
+ sampleRate: number;
95
+ duration: number;
96
+ }>;
97
+ /**
98
+ * Stream speech generation for long text
99
+ */
100
+ speakStream(text: string, options?: SpeakOptions): AsyncGenerator<{
101
+ samples: Float32Array;
102
+ index: number;
103
+ isFinal: boolean;
104
+ }>;
105
+ /**
106
+ * List available voices
107
+ */
108
+ listVoices(): Promise<Array<{
109
+ id: string;
110
+ name: string;
111
+ gender: string;
112
+ language: string;
113
+ }>>;
114
+ }
115
+ /**
116
+ * Gerbil Speech-to-Text for LangChain
117
+ *
118
+ * Note: LangChain doesn't have a standard STT interface, so this is a
119
+ * utility class for use in LangChain pipelines.
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * import { GerbilSTT } from "gerbil/langchain";
124
+ * import { readFileSync } from "fs";
125
+ *
126
+ * const stt = new GerbilSTT({ model: "whisper-tiny.en" });
127
+ * const audio = new Uint8Array(readFileSync("audio.wav"));
128
+ * const result = await stt.transcribe(audio);
129
+ * console.log(result.text);
130
+ * ```
131
+ */
132
+ declare class GerbilSTT {
133
+ private readonly model;
134
+ private gerbil;
135
+ constructor(config?: {
136
+ model?: string;
137
+ });
138
+ private getInstance;
139
+ /**
140
+ * Transcribe audio to text
141
+ *
142
+ * @param audio - WAV file as Uint8Array or Float32Array at 16kHz
143
+ */
144
+ transcribe(audio: Uint8Array | Float32Array, options?: TranscribeOptions): Promise<{
145
+ text: string;
146
+ language?: string;
147
+ duration?: number;
148
+ segments?: Array<{
149
+ text: string;
150
+ start: number;
151
+ end: number;
152
+ }>;
153
+ }>;
154
+ /**
155
+ * List available STT models
156
+ */
157
+ listModels(): Promise<Array<{
158
+ id: string;
159
+ size: string;
160
+ multilingual: boolean;
161
+ }>>;
162
+ }
35
163
  declare const _default: {
36
164
  GerbilLLM: typeof GerbilLLM;
37
165
  GerbilEmbeddings: typeof GerbilEmbeddings;
166
+ GerbilTTS: typeof GerbilTTS;
167
+ GerbilSTT: typeof GerbilSTT;
38
168
  };
39
169
  //#endregion
40
- export { GerbilEmbeddings, GerbilLLM, _default as default };
170
+ export { GerbilEmbeddings, GerbilLLM, GerbilSTT, GerbilTTS, _default as default };
41
171
  //# sourceMappingURL=langchain.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"langchain.d.mts","names":[],"sources":["../../src/integrations/langchain.ts"],"sourcesContent":[],"mappings":";;;;;AA2FA;AAkBC;cAtEY,SAAA;;;uBAIS,eAAe;;mCASI,kBAAkB;mCAMjB,kBAAkB;qCAKjB,kBAAkB;wBAS/B;yBAIC;+BAIM;;;;;;;;;cAWxB,gBAAA;;;;;4BAOqB;uCAMW;;cAK5C;oBAAA;2BAAA"}
1
+ {"version":3,"file":"langchain.d.mts","names":[],"sources":["../../src/integrations/langchain.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AA0T8B,cA1PjB,SAAA,CA0PiB;EAAR,iBAAA,KAAA;EAAO,iBAAA,OAAA;EAS5B,WAAA,CAAA,MAAA,CAAA,EA/PqB,YA+PrB,GA/PoC,eA+PpC;;;;;mCAnPwC,kBAAkB;;;;;;;;;;;;2CAmB/C,wBACE,kBACT;;;;mCASqC,kBAAkB;;;;qCAQjB,kBAAkB;;;;oBAWnC;wBAMI;yBAIC;+BAIM;;;;;;;;;cAWxB,gBAAA;;;;;4BAOqB;uCAMW;;;;;;;;;;;;;;;;;;;;cAyBhC,SAAA;;;;;;;;;;;;gCAuBC,eACT;WAAiB;;;;;;;sCAkBR,eACT;aAA0B;;;;;;;gBAWT,QAClB;;;;;;;;;;;;;;;;;;;;;;;;cAwBS,SAAA;;;;;;;;;;;;oBAsBF,aAAa,wBACV,oBACT;;;;eAIU;;;;;;;;;gBAeO,QAAQ;;;;;;cAS7B"}
@@ -1,21 +1,38 @@
1
- import "../models-DKULvhOr.mjs";
2
- import "../utils-7vXqtq2Q.mjs";
3
- import { t as Gerbil } from "../gerbil-BfnsFWRE.mjs";
1
+ import { t as Gerbil } from "../gerbil-yoSpRHgv.mjs";
2
+ import "../models-BAtL8qsA.mjs";
3
+ import "../utils-CkB4Roi6.mjs";
4
4
 
5
5
  //#region src/integrations/langchain.ts
6
6
  /**
7
7
  * Gerbil LangChain Integration
8
8
  *
9
- * @example
9
+ * @example Text Generation
10
10
  * ```ts
11
- * import { GerbilLLM, GerbilEmbeddings } from "gerbil/langchain";
12
- *
11
+ * import { GerbilLLM } from "gerbil/langchain";
13
12
  * const llm = new GerbilLLM({ model: "qwen3-0.6b" });
14
13
  * const result = await llm.invoke("Hello!");
14
+ * ```
15
15
  *
16
+ * @example Embeddings
17
+ * ```ts
18
+ * import { GerbilEmbeddings } from "gerbil/langchain";
16
19
  * const embeddings = new GerbilEmbeddings();
17
20
  * const vectors = await embeddings.embedDocuments(["Hello", "World"]);
18
21
  * ```
22
+ *
23
+ * @example Text-to-Speech
24
+ * ```ts
25
+ * import { GerbilTTS } from "gerbil/langchain";
26
+ * const tts = new GerbilTTS({ voice: "af_heart" });
27
+ * const audio = await tts.speak("Hello world!");
28
+ * ```
29
+ *
30
+ * @example Speech-to-Text
31
+ * ```ts
32
+ * import { GerbilSTT } from "gerbil/langchain";
33
+ * const stt = new GerbilSTT({ model: "whisper-tiny.en" });
34
+ * const text = await stt.transcribe(audioBuffer);
35
+ * ```
19
36
  */
20
37
  let instance = null;
21
38
  let loadPromise = null;
@@ -30,6 +47,8 @@ async function getInstance(model) {
30
47
  }
31
48
  /**
32
49
  * Gerbil LLM for LangChain
50
+ *
51
+ * Supports text generation with optional vision (images) input.
33
52
  */
34
53
  var GerbilLLM = class {
35
54
  model;
@@ -41,23 +60,56 @@ var GerbilLLM = class {
41
60
  get _llmType() {
42
61
  return "gerbil";
43
62
  }
63
+ /**
64
+ * Generate text from a prompt
65
+ */
44
66
  async invoke(prompt, options) {
45
67
  return (await (await getInstance(this.model)).generate(prompt, {
46
68
  ...this.options,
47
69
  ...options
48
70
  })).text;
49
71
  }
72
+ /**
73
+ * Generate text with images (vision)
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * const llm = new GerbilLLM({ model: "ministral-3b" });
78
+ * const result = await llm.invokeWithImages("Describe this image", [
79
+ * { source: "https://example.com/photo.jpg" }
80
+ * ]);
81
+ * ```
82
+ */
83
+ async invokeWithImages(prompt, images, options) {
84
+ return (await (await getInstance(this.model)).generate(prompt, {
85
+ ...this.options,
86
+ ...options,
87
+ images
88
+ })).text;
89
+ }
90
+ /**
91
+ * Stream text generation
92
+ */
50
93
  async *stream(prompt, options) {
51
94
  yield* (await getInstance(this.model)).stream(prompt, {
52
95
  ...this.options,
53
96
  ...options
54
97
  });
55
98
  }
99
+ /**
100
+ * Batch generate text for multiple prompts
101
+ */
56
102
  async batch(prompts, options) {
57
103
  const results = [];
58
104
  for (const prompt of prompts) results.push(await this.invoke(prompt, options));
59
105
  return results;
60
106
  }
107
+ /**
108
+ * Check if the model supports vision input
109
+ */
110
+ async supportsVision() {
111
+ return (await getInstance(this.model)).supportsVision();
112
+ }
61
113
  async call(prompt) {
62
114
  return this.invoke(prompt);
63
115
  }
@@ -83,11 +135,127 @@ var GerbilEmbeddings = class {
83
135
  return (await (await getInstance(this.model)).embedBatch(documents)).map((r) => r.vector);
84
136
  }
85
137
  };
138
+ /**
139
+ * Gerbil Text-to-Speech for LangChain
140
+ *
141
+ * Note: LangChain doesn't have a standard TTS interface, so this is a
142
+ * utility class for use in LangChain pipelines.
143
+ *
144
+ * @example
145
+ * ```ts
146
+ * import { GerbilTTS } from "gerbil/langchain";
147
+ *
148
+ * const tts = new GerbilTTS({ voice: "af_heart" });
149
+ * const result = await tts.speak("Hello world!");
150
+ * // result.audio = Float32Array, result.sampleRate = 24000
151
+ *
152
+ * // List voices
153
+ * const voices = await tts.listVoices();
154
+ * ```
155
+ */
156
+ var GerbilTTS = class {
157
+ voice;
158
+ speed;
159
+ gerbil = null;
160
+ constructor(config = {}) {
161
+ this.voice = config.voice || "af_heart";
162
+ this.speed = config.speed || 1;
163
+ }
164
+ async getInstance() {
165
+ if (!this.gerbil) this.gerbil = new Gerbil();
166
+ await this.gerbil.ensureTTSLoaded();
167
+ return this.gerbil;
168
+ }
169
+ /**
170
+ * Generate speech from text
171
+ */
172
+ async speak(text, options) {
173
+ const result = await (await this.getInstance()).speak(text, {
174
+ voice: options?.voice || this.voice,
175
+ speed: options?.speed || this.speed
176
+ });
177
+ return {
178
+ audio: result.audio,
179
+ sampleRate: result.sampleRate,
180
+ duration: result.duration
181
+ };
182
+ }
183
+ /**
184
+ * Stream speech generation for long text
185
+ */
186
+ async *speakStream(text, options) {
187
+ yield* (await this.getInstance()).speakStream(text, {
188
+ voice: options?.voice || this.voice,
189
+ speed: options?.speed || this.speed
190
+ });
191
+ }
192
+ /**
193
+ * List available voices
194
+ */
195
+ async listVoices() {
196
+ return (await this.getInstance()).listVoices();
197
+ }
198
+ };
199
+ /**
200
+ * Gerbil Speech-to-Text for LangChain
201
+ *
202
+ * Note: LangChain doesn't have a standard STT interface, so this is a
203
+ * utility class for use in LangChain pipelines.
204
+ *
205
+ * @example
206
+ * ```ts
207
+ * import { GerbilSTT } from "gerbil/langchain";
208
+ * import { readFileSync } from "fs";
209
+ *
210
+ * const stt = new GerbilSTT({ model: "whisper-tiny.en" });
211
+ * const audio = new Uint8Array(readFileSync("audio.wav"));
212
+ * const result = await stt.transcribe(audio);
213
+ * console.log(result.text);
214
+ * ```
215
+ */
216
+ var GerbilSTT = class {
217
+ model;
218
+ gerbil = null;
219
+ constructor(config = {}) {
220
+ this.model = config.model || "whisper-tiny.en";
221
+ }
222
+ async getInstance() {
223
+ if (!this.gerbil) this.gerbil = new Gerbil();
224
+ await this.gerbil.loadSTT(this.model);
225
+ return this.gerbil;
226
+ }
227
+ /**
228
+ * Transcribe audio to text
229
+ *
230
+ * @param audio - WAV file as Uint8Array or Float32Array at 16kHz
231
+ */
232
+ async transcribe(audio, options) {
233
+ const result = await (await this.getInstance()).transcribe(audio, options);
234
+ return {
235
+ text: result.text,
236
+ language: result.language,
237
+ duration: result.duration,
238
+ segments: result.segments
239
+ };
240
+ }
241
+ /**
242
+ * List available STT models
243
+ */
244
+ async listModels() {
245
+ return (await (await this.getInstance()).listSTTModels()).map((m) => ({
246
+ id: m.id,
247
+ size: m.size,
248
+ multilingual: m.multilingual
249
+ }));
250
+ }
251
+ };
86
252
  var langchain_default = {
87
253
  GerbilLLM,
88
- GerbilEmbeddings
254
+ GerbilEmbeddings,
255
+ GerbilTTS,
256
+ GerbilSTT
89
257
  };
90
258
 
91
259
  //#endregion
92
- export { GerbilEmbeddings, GerbilLLM, langchain_default as default };
260
+ export { GerbilEmbeddings, GerbilLLM, GerbilSTT, GerbilTTS, langchain_default as default };
93
261
  //# sourceMappingURL=langchain.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"langchain.mjs","names":["instance: Gerbil | null","loadPromise: Promise<void> | null","results: string[]"],"sources":["../../src/integrations/langchain.ts"],"sourcesContent":["/**\n * Gerbil LangChain Integration\n *\n * @example\n * ```ts\n * import { GerbilLLM, GerbilEmbeddings } from \"gerbil/langchain\";\n *\n * const llm = new GerbilLLM({ model: \"qwen3-0.6b\" });\n * const result = await llm.invoke(\"Hello!\");\n *\n * const embeddings = new GerbilEmbeddings();\n * const vectors = await embeddings.embedDocuments([\"Hello\", \"World\"]);\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GenerateOptions, GerbilConfig } from \"../core/types.js\";\n\n// Singleton Gerbil instance\nlet instance: Gerbil | null = null;\nlet loadPromise: Promise<void> | null = null;\n\nasync function getInstance(model: string): Promise<Gerbil> {\n if (!instance) {\n instance = new Gerbil();\n }\n if (!(instance.isLoaded() || loadPromise)) {\n loadPromise = instance.loadModel(model);\n }\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n return instance;\n}\n\n/**\n * Gerbil LLM for LangChain\n */\nexport class GerbilLLM {\n private readonly model: string;\n private readonly options: GenerateOptions;\n\n constructor(config: GerbilConfig & GenerateOptions = {}) {\n this.model = config.model || \"qwen3-0.6b\";\n this.options = config;\n }\n\n get _llmType(): string {\n return \"gerbil\";\n }\n\n async invoke(prompt: string, options?: GenerateOptions): Promise<string> {\n const g = await getInstance(this.model);\n const result = await g.generate(prompt, { ...this.options, ...options });\n return result.text;\n }\n\n async *stream(prompt: string, options?: GenerateOptions): AsyncGenerator<string> {\n const g = await getInstance(this.model);\n yield* g.stream(prompt, { ...this.options, ...options });\n }\n\n async batch(prompts: string[], options?: GenerateOptions): Promise<string[]> {\n const results: string[] = [];\n for (const prompt of prompts) {\n results.push(await this.invoke(prompt, options));\n }\n return results;\n }\n\n // LangChain compatibility methods\n async call(prompt: string): Promise<string> {\n return this.invoke(prompt);\n }\n\n async predict(text: string): Promise<string> {\n return this.invoke(text);\n }\n\n async generate(prompts: string[]): Promise<{ generations: { text: string }[][] }> {\n const results = await this.batch(prompts);\n return {\n generations: results.map((text) => [{ text }]),\n };\n }\n}\n\n/**\n * Gerbil Embeddings for LangChain\n */\nexport class GerbilEmbeddings {\n private readonly model: string;\n\n constructor(config: { model?: string } = {}) {\n this.model = config.model || \"qwen3-0.6b\";\n }\n\n async embedQuery(text: string): Promise<number[]> {\n const g = await getInstance(this.model);\n const result = await g.embed(text);\n return result.vector;\n }\n\n async embedDocuments(documents: string[]): Promise<number[][]> {\n const g = await getInstance(this.model);\n const results = await g.embedBatch(documents);\n return results.map((r) => r.vector);\n }\n}\n\nexport default { GerbilLLM, GerbilEmbeddings };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,IAAIA,WAA0B;AAC9B,IAAIC,cAAoC;AAExC,eAAe,YAAY,OAAgC;AACzD,KAAI,CAAC,SACH,YAAW,IAAI,QAAQ;AAEzB,KAAI,EAAE,SAAS,UAAU,IAAI,aAC3B,eAAc,SAAS,UAAU,MAAM;AAEzC,KAAI,aAAa;AACf,QAAM;AACN,gBAAc;;AAEhB,QAAO;;;;;AAMT,IAAa,YAAb,MAAuB;CACrB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAAyC,EAAE,EAAE;AACvD,OAAK,QAAQ,OAAO,SAAS;AAC7B,OAAK,UAAU;;CAGjB,IAAI,WAAmB;AACrB,SAAO;;CAGT,MAAM,OAAO,QAAgB,SAA4C;AAGvE,UADe,OADL,MAAM,YAAY,KAAK,MAAM,EAChB,SAAS,QAAQ;GAAE,GAAG,KAAK;GAAS,GAAG;GAAS,CAAC,EAC1D;;CAGhB,OAAO,OAAO,QAAgB,SAAmD;AAE/E,UADU,MAAM,YAAY,KAAK,MAAM,EAC9B,OAAO,QAAQ;GAAE,GAAG,KAAK;GAAS,GAAG;GAAS,CAAC;;CAG1D,MAAM,MAAM,SAAmB,SAA8C;EAC3E,MAAMC,UAAoB,EAAE;AAC5B,OAAK,MAAM,UAAU,QACnB,SAAQ,KAAK,MAAM,KAAK,OAAO,QAAQ,QAAQ,CAAC;AAElD,SAAO;;CAIT,MAAM,KAAK,QAAiC;AAC1C,SAAO,KAAK,OAAO,OAAO;;CAG5B,MAAM,QAAQ,MAA+B;AAC3C,SAAO,KAAK,OAAO,KAAK;;CAG1B,MAAM,SAAS,SAAmE;AAEhF,SAAO,EACL,cAFc,MAAM,KAAK,MAAM,QAAQ,EAElB,KAAK,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,EAC/C;;;;;;AAOL,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CAEjB,YAAY,SAA6B,EAAE,EAAE;AAC3C,OAAK,QAAQ,OAAO,SAAS;;CAG/B,MAAM,WAAW,MAAiC;AAGhD,UADe,OADL,MAAM,YAAY,KAAK,MAAM,EAChB,MAAM,KAAK,EACpB;;CAGhB,MAAM,eAAe,WAA0C;AAG7D,UADgB,OADN,MAAM,YAAY,KAAK,MAAM,EACf,WAAW,UAAU,EAC9B,KAAK,MAAM,EAAE,OAAO;;;AAIvC,wBAAe;CAAE;CAAW;CAAkB"}
1
+ {"version":3,"file":"langchain.mjs","names":["instance: Gerbil | null","loadPromise: Promise<void> | null","results: string[]"],"sources":["../../src/integrations/langchain.ts"],"sourcesContent":["/**\n * Gerbil LangChain Integration\n *\n * @example Text Generation\n * ```ts\n * import { GerbilLLM } from \"gerbil/langchain\";\n * const llm = new GerbilLLM({ model: \"qwen3-0.6b\" });\n * const result = await llm.invoke(\"Hello!\");\n * ```\n *\n * @example Embeddings\n * ```ts\n * import { GerbilEmbeddings } from \"gerbil/langchain\";\n * const embeddings = new GerbilEmbeddings();\n * const vectors = await embeddings.embedDocuments([\"Hello\", \"World\"]);\n * ```\n *\n * @example Text-to-Speech\n * ```ts\n * import { GerbilTTS } from \"gerbil/langchain\";\n * const tts = new GerbilTTS({ voice: \"af_heart\" });\n * const audio = await tts.speak(\"Hello world!\");\n * ```\n *\n * @example Speech-to-Text\n * ```ts\n * import { GerbilSTT } from \"gerbil/langchain\";\n * const stt = new GerbilSTT({ model: \"whisper-tiny.en\" });\n * const text = await stt.transcribe(audioBuffer);\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type {\n GenerateOptions,\n GerbilConfig,\n ImageInput,\n SpeakOptions,\n TranscribeOptions,\n} from \"../core/types.js\";\n\n// Singleton Gerbil instance\nlet instance: Gerbil | null = null;\nlet loadPromise: Promise<void> | null = null;\n\nasync function getInstance(model: string): Promise<Gerbil> {\n if (!instance) {\n instance = new Gerbil();\n }\n if (!(instance.isLoaded() || loadPromise)) {\n loadPromise = instance.loadModel(model);\n }\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n return instance;\n}\n\n/**\n * Gerbil LLM for LangChain\n *\n * Supports text generation with optional vision (images) input.\n */\nexport class GerbilLLM {\n private readonly model: string;\n private readonly options: GenerateOptions;\n\n constructor(config: GerbilConfig & GenerateOptions = {}) {\n this.model = config.model || \"qwen3-0.6b\";\n this.options = config;\n }\n\n get _llmType(): string {\n return \"gerbil\";\n }\n\n /**\n * Generate text from a prompt\n */\n async invoke(prompt: string, options?: GenerateOptions): Promise<string> {\n const g = await getInstance(this.model);\n const result = await g.generate(prompt, { ...this.options, ...options });\n return result.text;\n }\n\n /**\n * Generate text with images (vision)\n *\n * @example\n * ```ts\n * const llm = new GerbilLLM({ model: \"ministral-3b\" });\n * const result = await llm.invokeWithImages(\"Describe this image\", [\n * { source: \"https://example.com/photo.jpg\" }\n * ]);\n * ```\n */\n async invokeWithImages(\n prompt: string,\n images: ImageInput[],\n options?: GenerateOptions,\n ): Promise<string> {\n const g = await getInstance(this.model);\n const result = await g.generate(prompt, { ...this.options, ...options, images });\n return result.text;\n }\n\n /**\n * Stream text generation\n */\n async *stream(prompt: string, options?: GenerateOptions): AsyncGenerator<string> {\n const g = await getInstance(this.model);\n yield* g.stream(prompt, { ...this.options, ...options });\n }\n\n /**\n * Batch generate text for multiple prompts\n */\n async batch(prompts: string[], options?: GenerateOptions): Promise<string[]> {\n const results: string[] = [];\n for (const prompt of prompts) {\n results.push(await this.invoke(prompt, options));\n }\n return results;\n }\n\n /**\n * Check if the model supports vision input\n */\n async supportsVision(): Promise<boolean> {\n const g = await getInstance(this.model);\n return g.supportsVision();\n }\n\n // LangChain compatibility methods\n async call(prompt: string): Promise<string> {\n return this.invoke(prompt);\n }\n\n async predict(text: string): Promise<string> {\n return this.invoke(text);\n }\n\n async generate(prompts: string[]): Promise<{ generations: { text: string }[][] }> {\n const results = await this.batch(prompts);\n return {\n generations: results.map((text) => [{ text }]),\n };\n }\n}\n\n/**\n * Gerbil Embeddings for LangChain\n */\nexport class GerbilEmbeddings {\n private readonly model: string;\n\n constructor(config: { model?: string } = {}) {\n this.model = config.model || \"qwen3-0.6b\";\n }\n\n async embedQuery(text: string): Promise<number[]> {\n const g = await getInstance(this.model);\n const result = await g.embed(text);\n return result.vector;\n }\n\n async embedDocuments(documents: string[]): Promise<number[][]> {\n const g = await getInstance(this.model);\n const results = await g.embedBatch(documents);\n return results.map((r) => r.vector);\n }\n}\n\n/**\n * Gerbil Text-to-Speech for LangChain\n *\n * Note: LangChain doesn't have a standard TTS interface, so this is a\n * utility class for use in LangChain pipelines.\n *\n * @example\n * ```ts\n * import { GerbilTTS } from \"gerbil/langchain\";\n *\n * const tts = new GerbilTTS({ voice: \"af_heart\" });\n * const result = await tts.speak(\"Hello world!\");\n * // result.audio = Float32Array, result.sampleRate = 24000\n *\n * // List voices\n * const voices = await tts.listVoices();\n * ```\n */\nexport class GerbilTTS {\n private readonly voice: string;\n private readonly speed: number;\n private gerbil: Gerbil | null = null;\n\n constructor(config: { voice?: string; speed?: number } = {}) {\n this.voice = config.voice || \"af_heart\";\n this.speed = config.speed || 1.0;\n }\n\n private async getInstance(): Promise<Gerbil> {\n if (!this.gerbil) {\n this.gerbil = new Gerbil();\n }\n await this.gerbil.ensureTTSLoaded();\n return this.gerbil;\n }\n\n /**\n * Generate speech from text\n */\n async speak(\n text: string,\n options?: SpeakOptions,\n ): Promise<{ audio: Float32Array; sampleRate: number; duration: number }> {\n const g = await this.getInstance();\n const result = await g.speak(text, {\n voice: options?.voice || this.voice,\n speed: options?.speed || this.speed,\n });\n return {\n audio: result.audio,\n sampleRate: result.sampleRate,\n duration: result.duration,\n };\n }\n\n /**\n * Stream speech generation for long text\n */\n async *speakStream(\n text: string,\n options?: SpeakOptions,\n ): AsyncGenerator<{ samples: Float32Array; index: number; isFinal: boolean }> {\n const g = await this.getInstance();\n yield* g.speakStream(text, {\n voice: options?.voice || this.voice,\n speed: options?.speed || this.speed,\n });\n }\n\n /**\n * List available voices\n */\n async listVoices(): Promise<\n Array<{ id: string; name: string; gender: string; language: string }>\n > {\n const g = await this.getInstance();\n return g.listVoices();\n }\n}\n\n/**\n * Gerbil Speech-to-Text for LangChain\n *\n * Note: LangChain doesn't have a standard STT interface, so this is a\n * utility class for use in LangChain pipelines.\n *\n * @example\n * ```ts\n * import { GerbilSTT } from \"gerbil/langchain\";\n * import { readFileSync } from \"fs\";\n *\n * const stt = new GerbilSTT({ model: \"whisper-tiny.en\" });\n * const audio = new Uint8Array(readFileSync(\"audio.wav\"));\n * const result = await stt.transcribe(audio);\n * console.log(result.text);\n * ```\n */\nexport class GerbilSTT {\n private readonly model: string;\n private gerbil: Gerbil | null = null;\n\n constructor(config: { model?: string } = {}) {\n this.model = config.model || \"whisper-tiny.en\";\n }\n\n private async getInstance(): Promise<Gerbil> {\n if (!this.gerbil) {\n this.gerbil = new Gerbil();\n }\n await this.gerbil.loadSTT(this.model);\n return this.gerbil;\n }\n\n /**\n * Transcribe audio to text\n *\n * @param audio - WAV file as Uint8Array or Float32Array at 16kHz\n */\n async transcribe(\n audio: Uint8Array | Float32Array,\n options?: TranscribeOptions,\n ): Promise<{\n text: string;\n language?: string;\n duration?: number;\n segments?: Array<{ text: string; start: number; end: number }>;\n }> {\n const g = await this.getInstance();\n const result = await g.transcribe(audio, options);\n return {\n text: result.text,\n language: result.language,\n duration: result.duration,\n segments: result.segments,\n };\n }\n\n /**\n * List available STT models\n */\n async listModels(): Promise<Array<{ id: string; size: string; multilingual: boolean }>> {\n const g = await this.getInstance();\n const models = await g.listSTTModels();\n return models.map((m) => ({\n id: m.id,\n size: m.size,\n multilingual: m.multilingual,\n }));\n }\n}\n\nexport default { GerbilLLM, GerbilEmbeddings, GerbilTTS, GerbilSTT };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { a as GenerateOptions, s as GerbilConfig } from "../types-BS1N92Jt.mjs";
1
+ import { c as GerbilConfig, o as GenerateOptions } from "../types-s6Py2_DL.mjs";
2
2
 
3
3
  //#region src/integrations/llamaindex.d.ts
4
4
 
@@ -1,6 +1,6 @@
1
- import "../models-DKULvhOr.mjs";
2
- import "../utils-7vXqtq2Q.mjs";
3
- import { t as Gerbil } from "../gerbil-BfnsFWRE.mjs";
1
+ import { t as Gerbil } from "../gerbil-yoSpRHgv.mjs";
2
+ import "../models-BAtL8qsA.mjs";
3
+ import "../utils-CkB4Roi6.mjs";
4
4
 
5
5
  //#region src/integrations/llamaindex.ts
6
6
  /**
@@ -1,5 +1,5 @@
1
- import "../utils-7vXqtq2Q.mjs";
2
- import { t as defineTool } from "../tools-BsiEE6f2.mjs";
1
+ import "../utils-CkB4Roi6.mjs";
2
+ import { t as defineTool } from "../tools-IYPrqoek.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region src/integrations/mcp-client.ts
@@ -112,7 +112,7 @@ var MCPClient = class {
112
112
  */
113
113
  async connectFallback() {
114
114
  this.useFallback = true;
115
- const { spawn } = await import("child_process");
115
+ const { spawn } = await import("node:child_process");
116
116
  this.fallbackProcess = spawn(this.config.command, this.config.args || [], {
117
117
  cwd: this.config.cwd,
118
118
  env: {
@@ -172,7 +172,7 @@ var MCPClient = class {
172
172
  reject(/* @__PURE__ */ new Error("Not connected"));
173
173
  return;
174
174
  }
175
- const id = ++this.fallbackRequestId;
175
+ const id = this.fallbackRequestId += 1;
176
176
  const request = {
177
177
  jsonrpc: "2.0",
178
178
  id,
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-client.mjs","names":["result: any","tools: Array<{ server: string; tool: MCPTool }>","shape: Record<string, z.ZodType<any>>","zodType: z.ZodType<any>","defaultHub: MCPHub | null","byServer: Record<string, string[]>"],"sources":["../../src/integrations/mcp-client.ts"],"sourcesContent":["/**\n * Gerbil MCP Client\n *\n * Connect to external MCP servers and use their tools.\n * Uses the official @modelcontextprotocol/sdk for protocol compliance.\n *\n * @example\n * ```typescript\n * import { MCPClient, MCPHub } from \"gerbil/mcp-client\";\n *\n * // Connect to a single server\n * const client = new MCPClient({\n * name: \"filesystem\",\n * command: \"uvx\",\n * args: [\"mcp-server-filesystem\", \"/tmp\"]\n * });\n * await client.connect();\n * const tools = await client.listTools();\n * const result = await client.callTool(\"read_file\", { path: \"/tmp/test.txt\" });\n *\n * // Or use the hub for multiple servers\n * const hub = new MCPHub();\n * await hub.addServer(\"filesystem\", { command: \"uvx\", args: [\"mcp-server-filesystem\", \"/tmp\"] });\n * await hub.addServer(\"browser\", { command: \"npx\", args: [\"-y\", \"@anthropic/mcp-server-puppeteer\"] });\n *\n * // All tools from all servers are available\n * const allTools = hub.getAllTools();\n * ```\n */\n\nimport { z } from \"zod\";\nimport { defineTool } from \"../core/tools.js\";\n\n// ============================================\n// Types\n// ============================================\n\nexport type MCPServerConfig = {\n /** Command to run the MCP server */\n command: string;\n\n /** Arguments for the command */\n args?: string[];\n\n /** Environment variables */\n env?: Record<string, string>;\n\n /** Working directory */\n cwd?: string;\n\n /** Timeout for requests (ms, default: 30000) */\n timeout?: number;\n};\n\nexport type MCPTool = {\n name: string;\n description?: string;\n inputSchema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n};\n\nexport type MCPResource = {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n};\n\n// ============================================\n// MCP Client (uses official SDK)\n// ============================================\n\n/**\n * Client for a single MCP server.\n *\n * Uses @modelcontextprotocol/sdk when available, falls back to\n * a minimal stdio implementation otherwise.\n */\nexport class MCPClient {\n private readonly config: MCPServerConfig;\n private client: any = null;\n private transport: any = null;\n private connected = false;\n private _tools: MCPTool[] = [];\n private _resources: MCPResource[] = [];\n private readonly serverName: string;\n private useFallback = false;\n\n // Fallback implementation state\n private fallbackProcess: any = null;\n private fallbackRequestId = 0;\n private readonly fallbackPending = new Map<\n number,\n { resolve: (v: any) => void; reject: (e: Error) => void }\n >();\n private fallbackBuffer = \"\";\n\n constructor(config: MCPServerConfig & { name?: string }) {\n this.config = {\n timeout: 30_000,\n ...config,\n };\n this.serverName = config.name || \"mcp\";\n }\n\n /**\n * Connect to the MCP server\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n // Try to use official SDK\n const sdk = await this.loadSDK();\n if (sdk) {\n await this.connectWithSDK(sdk);\n } else {\n // Fallback to minimal implementation\n await this.connectFallback();\n }\n\n this.connected = true;\n await this.refreshCapabilities();\n } catch (e) {\n this.connected = false;\n throw e;\n }\n }\n\n /**\n * Try to load the official MCP SDK\n * Uses dynamic import to avoid bundling issues when SDK is not installed\n */\n private async loadSDK(): Promise<any | null> {\n try {\n // Use Function constructor to create truly dynamic imports\n // This prevents TypeScript/bundlers from trying to resolve the module\n const importDynamic = new Function(\"modulePath\", \"return import(modulePath)\");\n const clientModule = await importDynamic(\"@modelcontextprotocol/sdk/client\");\n const stdioModule = await importDynamic(\"@modelcontextprotocol/sdk/client/stdio\");\n return {\n Client: clientModule.Client,\n StdioClientTransport: stdioModule.StdioClientTransport,\n };\n } catch {\n // SDK not installed - use fallback\n return null;\n }\n }\n\n /**\n * Connect using the official SDK\n */\n private async connectWithSDK(sdk: any): Promise<void> {\n const { Client, StdioClientTransport } = sdk;\n\n this.transport = new StdioClientTransport({\n command: this.config.command,\n args: this.config.args || [],\n env: this.config.env,\n });\n\n this.client = new Client({ name: \"gerbil\", version: \"1.0.0\" }, { capabilities: {} });\n\n await this.client.connect(this.transport);\n }\n\n /**\n * Fallback: Connect without SDK using raw stdio\n */\n private async connectFallback(): Promise<void> {\n this.useFallback = true;\n\n const { spawn } = await import(\"child_process\");\n\n this.fallbackProcess = spawn(this.config.command, this.config.args || [], {\n cwd: this.config.cwd,\n env: { ...process.env, ...this.config.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n this.fallbackProcess.stdout?.on(\"data\", (data: Buffer) => {\n this.fallbackBuffer += data.toString();\n this.processFallbackBuffer();\n });\n\n this.fallbackProcess.on(\"error\", (err: Error) => {\n this.connected = false;\n throw new Error(`MCP server error: ${err.message}`);\n });\n\n this.fallbackProcess.on(\"exit\", (code: number) => {\n this.connected = false;\n for (const [_, req] of this.fallbackPending) {\n req.reject(new Error(`MCP server exited with code ${code}`));\n }\n this.fallbackPending.clear();\n });\n\n // Initialize\n await this.fallbackRequest(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"gerbil\", version: \"0.1.0\" },\n });\n\n // Send initialized notification\n this.fallbackNotify(\"notifications/initialized\", {});\n }\n\n private processFallbackBuffer(): void {\n const lines = this.fallbackBuffer.split(\"\\n\");\n this.fallbackBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n try {\n const response = JSON.parse(line);\n if (response.id !== undefined) {\n const pending = this.fallbackPending.get(response.id);\n if (pending) {\n this.fallbackPending.delete(response.id);\n if (response.error) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n }\n } catch {}\n }\n }\n\n private fallbackRequest(method: string, params?: any): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.fallbackProcess?.stdin) {\n reject(new Error(\"Not connected\"));\n return;\n }\n\n const id = ++this.fallbackRequestId;\n const request = { jsonrpc: \"2.0\", id, method, params };\n\n const timeout = setTimeout(() => {\n this.fallbackPending.delete(id);\n reject(new Error(`Request timeout: ${method}`));\n }, this.config.timeout);\n\n this.fallbackPending.set(id, {\n resolve: (v) => {\n clearTimeout(timeout);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timeout);\n reject(e);\n },\n });\n\n this.fallbackProcess.stdin.write(`${JSON.stringify(request)}\\n`);\n });\n }\n\n private fallbackNotify(method: string, params?: any): void {\n if (!this.fallbackProcess?.stdin) {\n return;\n }\n this.fallbackProcess.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", method, params })}\\n`);\n }\n\n /**\n * Disconnect from the MCP server\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n if (this.useFallback && this.fallbackProcess) {\n this.fallbackProcess.kill(\"SIGTERM\");\n this.fallbackProcess = null;\n } else if (this.client) {\n await this.client.close();\n this.client = null;\n this.transport = null;\n }\n\n this.connected = false;\n this._tools = [];\n this._resources = [];\n }\n\n /**\n * Refresh tools and resources from the server\n */\n async refreshCapabilities(): Promise<void> {\n try {\n if (this.useFallback) {\n const result = await this.fallbackRequest(\"tools/list\", {});\n this._tools = result.tools || [];\n } else if (this.client) {\n const result = await this.client.listTools();\n this._tools = result.tools || [];\n }\n } catch {\n this._tools = [];\n }\n\n try {\n if (this.useFallback) {\n const result = await this.fallbackRequest(\"resources/list\", {});\n this._resources = result.resources || [];\n } else if (this.client) {\n const result = await this.client.listResources();\n this._resources = result.resources || [];\n }\n } catch {\n this._resources = [];\n }\n }\n\n /**\n * List available tools\n */\n listTools(): MCPTool[] {\n return this._tools;\n }\n\n /**\n * List available resources\n */\n listResources(): MCPResource[] {\n return this._resources;\n }\n\n /**\n * Call a tool\n */\n async callTool(name: string, args: Record<string, any> = {}): Promise<any> {\n let result: any;\n\n if (this.useFallback) {\n result = await this.fallbackRequest(\"tools/call\", {\n name,\n arguments: args,\n });\n } else if (this.client) {\n result = await this.client.callTool({ name, arguments: args });\n } else {\n throw new Error(\"Not connected\");\n }\n\n // MCP returns content array\n if (result.content && Array.isArray(result.content)) {\n return result.content.map((c: any) => c.text || JSON.stringify(c)).join(\"\\n\");\n }\n\n return result;\n }\n\n /**\n * Read a resource\n */\n async readResource(uri: string): Promise<string> {\n let result: any;\n\n if (this.useFallback) {\n result = await this.fallbackRequest(\"resources/read\", { uri });\n } else if (this.client) {\n result = await this.client.readResource({ uri });\n } else {\n throw new Error(\"Not connected\");\n }\n\n if (result.contents && Array.isArray(result.contents)) {\n return result.contents.map((c: any) => c.text || c.blob || \"\").join(\"\\n\");\n }\n\n return typeof result === \"string\" ? result : JSON.stringify(result);\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get server name\n */\n getName(): string {\n return this.serverName;\n }\n}\n\n// ============================================\n// MCP Hub (manage multiple servers)\n// ============================================\n\n/**\n * Hub for managing multiple MCP server connections\n */\nexport class MCPHub {\n private readonly clients = new Map<string, MCPClient>();\n private readonly toolPrefix = \"mcp\";\n\n /**\n * Add and connect to an MCP server\n */\n async addServer(name: string, config: MCPServerConfig): Promise<MCPClient> {\n // Disconnect existing if same name\n if (this.clients.has(name)) {\n await this.removeServer(name);\n }\n\n const client = new MCPClient({ ...config, name });\n await client.connect();\n this.clients.set(name, client);\n\n // Register tools from this server\n this.registerServerTools(name, client);\n\n return client;\n }\n\n /**\n * Remove and disconnect an MCP server\n */\n async removeServer(name: string): Promise<void> {\n const client = this.clients.get(name);\n if (client) {\n await client.disconnect();\n this.clients.delete(name);\n }\n }\n\n /**\n * Get a specific client\n */\n getClient(name: string): MCPClient | undefined {\n return this.clients.get(name);\n }\n\n /**\n * List connected servers\n */\n listServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Get all tools from all servers\n */\n getAllTools(): Array<{ server: string; tool: MCPTool }> {\n const tools: Array<{ server: string; tool: MCPTool }> = [];\n\n for (const [serverName, client] of this.clients) {\n for (const tool of client.listTools()) {\n tools.push({ server: serverName, tool });\n }\n }\n\n return tools;\n }\n\n /**\n * Call a tool from any connected server\n * Tool name format: \"server_name:tool_name\" or just \"tool_name\" (searches all)\n */\n async callTool(toolName: string, args: Record<string, any> = {}): Promise<any> {\n // Check if prefixed with server name\n if (toolName.includes(\":\")) {\n const [serverName, actualToolName] = toolName.split(\":\", 2);\n const client = this.clients.get(serverName);\n if (!client) {\n throw new Error(`MCP server \"${serverName}\" not connected`);\n }\n return client.callTool(actualToolName, args);\n }\n\n // Search all servers for the tool\n for (const [_, client] of this.clients) {\n const tools = client.listTools();\n if (tools.some((t) => t.name === toolName)) {\n return client.callTool(toolName, args);\n }\n }\n\n throw new Error(`Tool \"${toolName}\" not found in any connected MCP server`);\n }\n\n /**\n * Disconnect all servers\n */\n async disconnectAll(): Promise<void> {\n for (const [name] of this.clients) {\n await this.removeServer(name);\n }\n }\n\n /**\n * Register tools from an MCP server into Gerbil's tool registry\n */\n private registerServerTools(serverName: string, client: MCPClient): void {\n const tools = client.listTools();\n\n for (const tool of tools) {\n // Create a Gerbil tool that wraps the MCP tool\n const gerbilToolName = `${this.toolPrefix}_${serverName}_${tool.name}`;\n\n // Build Zod schema from MCP input schema\n const zodSchema = this.mcpSchemaToZod(tool.inputSchema);\n\n defineTool({\n name: gerbilToolName,\n description: `[MCP:${serverName}] ${tool.description || tool.name}`,\n parameters: zodSchema,\n execute: async (params) => {\n const result = await client.callTool(tool.name, params);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n },\n });\n }\n }\n\n /**\n * Convert MCP JSON Schema to Zod schema (simplified)\n */\n private mcpSchemaToZod(schema?: MCPTool[\"inputSchema\"]): z.ZodType<any> {\n if (!schema || schema.type !== \"object\") {\n return z.object({}).passthrough();\n }\n\n const shape: Record<string, z.ZodType<any>> = {};\n const properties = schema.properties || {};\n const required = new Set(schema.required || []);\n\n for (const [key, prop] of Object.entries(properties)) {\n let zodType: z.ZodType<any>;\n\n switch ((prop as any).type) {\n case \"string\":\n zodType = z.string();\n if ((prop as any).description) {\n zodType = zodType.describe((prop as any).description);\n }\n break;\n case \"number\":\n case \"integer\":\n zodType = z.number();\n break;\n case \"boolean\":\n zodType = z.boolean();\n break;\n case \"array\":\n zodType = z.array(z.any());\n break;\n default:\n zodType = z.any();\n }\n\n if (!required.has(key)) {\n zodType = zodType.optional();\n }\n\n shape[key] = zodType;\n }\n\n return z.object(shape).passthrough();\n }\n}\n\n// ============================================\n// Convenience functions\n// ============================================\n\nlet defaultHub: MCPHub | null = null;\n\n/**\n * Get the default MCP hub (singleton)\n */\nexport function getMCPHub(): MCPHub {\n if (!defaultHub) {\n defaultHub = new MCPHub();\n }\n return defaultHub;\n}\n\n/**\n * Connect to an MCP server\n */\nexport async function connectMCP(name: string, config: MCPServerConfig): Promise<MCPClient> {\n return getMCPHub().addServer(name, config);\n}\n\n/**\n * Disconnect from an MCP server\n */\nexport async function disconnectMCP(name: string): Promise<void> {\n return getMCPHub().removeServer(name);\n}\n\n/**\n * Call an MCP tool\n */\nexport async function callMCPTool(toolName: string, args?: Record<string, any>): Promise<any> {\n return getMCPHub().callTool(toolName, args);\n}\n\n// ============================================\n// Built-in MCP tools for chat\n// ============================================\n\n/**\n * Tool for the LLM to call MCP tools\n */\ndefineTool({\n name: \"mcp_call\",\n description:\n \"Call a tool from a connected MCP server. Use this when you need to interact with external tools like file systems, browsers, databases, etc.\",\n parameters: z.object({\n server: z.string().describe(\"The MCP server name (e.g., 'filesystem', 'browser')\"),\n tool: z.string().describe(\"The tool name to call\"),\n args: z.record(z.any()).optional().describe(\"Arguments to pass to the tool\"),\n }),\n execute: async ({ server, tool, args }) => {\n const hub = getMCPHub();\n const client = hub.getClient(server);\n\n if (!client) {\n const servers = hub.listServers();\n if (servers.length === 0) {\n return \"No MCP servers are connected. Use the MCP settings to connect to servers first.\";\n }\n return `Server \"${server}\" not found. Available servers: ${servers.join(\", \")}`;\n }\n\n try {\n const result = await client.callTool(tool, args || {});\n return typeof result === \"string\" ? result : JSON.stringify(result, null, 2);\n } catch (e) {\n return `Error calling ${server}:${tool}: ${e}`;\n }\n },\n});\n\n/**\n * Tool to list available MCP tools\n */\ndefineTool({\n name: \"mcp_list\",\n description: \"List all tools available from connected MCP servers\",\n parameters: z.object({\n server: z.string().optional().describe(\"Filter by server name (optional)\"),\n }),\n execute: async ({ server }) => {\n const hub = getMCPHub();\n\n if (server) {\n const client = hub.getClient(server);\n if (!client) {\n return `Server \"${server}\" not connected`;\n }\n const tools = client.listTools();\n return tools.map((t) => `- ${t.name}: ${t.description || \"(no description)\"}`).join(\"\\n\");\n }\n\n const allTools = hub.getAllTools();\n if (allTools.length === 0) {\n return \"No MCP servers connected. Connect to MCP servers to use external tools.\";\n }\n\n const byServer: Record<string, string[]> = {};\n for (const { server: s, tool } of allTools) {\n if (!byServer[s]) {\n byServer[s] = [];\n }\n byServer[s].push(` - ${tool.name}: ${tool.description || \"(no description)\"}`);\n }\n\n return Object.entries(byServer)\n .map(([s, tools]) => `[${s}]\\n${tools.join(\"\\n\")}`)\n .join(\"\\n\\n\");\n },\n});\n\nexport default {\n MCPClient,\n MCPHub,\n getMCPHub,\n connectMCP,\n disconnectMCP,\n callMCPTool,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"mcp-client.mjs","names":["result: any","tools: Array<{ server: string; tool: MCPTool }>","shape: Record<string, z.ZodType<any>>","zodType: z.ZodType<any>","defaultHub: MCPHub | null","byServer: Record<string, string[]>"],"sources":["../../src/integrations/mcp-client.ts"],"sourcesContent":["/**\n * Gerbil MCP Client\n *\n * Connect to external MCP servers and use their tools.\n * Uses the official @modelcontextprotocol/sdk for protocol compliance.\n *\n * @example\n * ```typescript\n * import { MCPClient, MCPHub } from \"gerbil/mcp-client\";\n *\n * // Connect to a single server\n * const client = new MCPClient({\n * name: \"filesystem\",\n * command: \"uvx\",\n * args: [\"mcp-server-filesystem\", \"/tmp\"]\n * });\n * await client.connect();\n * const tools = await client.listTools();\n * const result = await client.callTool(\"read_file\", { path: \"/tmp/test.txt\" });\n *\n * // Or use the hub for multiple servers\n * const hub = new MCPHub();\n * await hub.addServer(\"filesystem\", { command: \"uvx\", args: [\"mcp-server-filesystem\", \"/tmp\"] });\n * await hub.addServer(\"browser\", { command: \"npx\", args: [\"-y\", \"@anthropic/mcp-server-puppeteer\"] });\n *\n * // All tools from all servers are available\n * const allTools = hub.getAllTools();\n * ```\n */\n\nimport { z } from \"zod\";\nimport { defineTool } from \"../core/tools.js\";\n\n// ============================================\n// Types\n// ============================================\n\nexport type MCPServerConfig = {\n /** Command to run the MCP server */\n command: string;\n\n /** Arguments for the command */\n args?: string[];\n\n /** Environment variables */\n env?: Record<string, string>;\n\n /** Working directory */\n cwd?: string;\n\n /** Timeout for requests (ms, default: 30000) */\n timeout?: number;\n};\n\nexport type MCPTool = {\n name: string;\n description?: string;\n inputSchema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n};\n\nexport type MCPResource = {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n};\n\n// ============================================\n// MCP Client (uses official SDK)\n// ============================================\n\n/**\n * Client for a single MCP server.\n *\n * Uses @modelcontextprotocol/sdk when available, falls back to\n * a minimal stdio implementation otherwise.\n */\nexport class MCPClient {\n private readonly config: MCPServerConfig;\n private client: any = null;\n private transport: any = null;\n private connected = false;\n private _tools: MCPTool[] = [];\n private _resources: MCPResource[] = [];\n private readonly serverName: string;\n private useFallback = false;\n\n // Fallback implementation state\n private fallbackProcess: any = null;\n private fallbackRequestId = 0;\n private readonly fallbackPending = new Map<\n number,\n { resolve: (v: any) => void; reject: (e: Error) => void }\n >();\n private fallbackBuffer = \"\";\n\n constructor(config: MCPServerConfig & { name?: string }) {\n this.config = {\n timeout: 30_000,\n ...config,\n };\n this.serverName = config.name || \"mcp\";\n }\n\n /**\n * Connect to the MCP server\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n // Try to use official SDK\n const sdk = await this.loadSDK();\n if (sdk) {\n await this.connectWithSDK(sdk);\n } else {\n // Fallback to minimal implementation\n await this.connectFallback();\n }\n\n this.connected = true;\n await this.refreshCapabilities();\n } catch (e) {\n this.connected = false;\n throw e;\n }\n }\n\n /**\n * Try to load the official MCP SDK\n * Uses dynamic import to avoid bundling issues when SDK is not installed\n */\n private async loadSDK(): Promise<any | null> {\n try {\n // Use Function constructor to create truly dynamic imports\n // This prevents TypeScript/bundlers from trying to resolve the module\n const importDynamic = new Function(\"modulePath\", \"return import(modulePath)\");\n const clientModule = await importDynamic(\"@modelcontextprotocol/sdk/client\");\n const stdioModule = await importDynamic(\"@modelcontextprotocol/sdk/client/stdio\");\n return {\n Client: clientModule.Client,\n StdioClientTransport: stdioModule.StdioClientTransport,\n };\n } catch {\n // SDK not installed - use fallback\n return null;\n }\n }\n\n /**\n * Connect using the official SDK\n */\n private async connectWithSDK(sdk: any): Promise<void> {\n const { Client, StdioClientTransport } = sdk;\n\n this.transport = new StdioClientTransport({\n command: this.config.command,\n args: this.config.args || [],\n env: this.config.env,\n });\n\n this.client = new Client({ name: \"gerbil\", version: \"1.0.0\" }, { capabilities: {} });\n\n await this.client.connect(this.transport);\n }\n\n /**\n * Fallback: Connect without SDK using raw stdio\n */\n private async connectFallback(): Promise<void> {\n this.useFallback = true;\n\n const { spawn } = await import(\"node:child_process\");\n\n this.fallbackProcess = spawn(this.config.command, this.config.args || [], {\n cwd: this.config.cwd,\n env: { ...process.env, ...this.config.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n this.fallbackProcess.stdout?.on(\"data\", (data: Buffer) => {\n this.fallbackBuffer += data.toString();\n this.processFallbackBuffer();\n });\n\n this.fallbackProcess.on(\"error\", (err: Error) => {\n this.connected = false;\n throw new Error(`MCP server error: ${err.message}`);\n });\n\n this.fallbackProcess.on(\"exit\", (code: number) => {\n this.connected = false;\n for (const [_, req] of this.fallbackPending) {\n req.reject(new Error(`MCP server exited with code ${code}`));\n }\n this.fallbackPending.clear();\n });\n\n // Initialize\n await this.fallbackRequest(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"gerbil\", version: \"0.1.0\" },\n });\n\n // Send initialized notification\n this.fallbackNotify(\"notifications/initialized\", {});\n }\n\n private processFallbackBuffer(): void {\n const lines = this.fallbackBuffer.split(\"\\n\");\n this.fallbackBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n try {\n const response = JSON.parse(line);\n if (response.id !== undefined) {\n const pending = this.fallbackPending.get(response.id);\n if (pending) {\n this.fallbackPending.delete(response.id);\n if (response.error) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n }\n } catch {}\n }\n }\n\n private fallbackRequest(method: string, params?: any): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.fallbackProcess?.stdin) {\n reject(new Error(\"Not connected\"));\n return;\n }\n\n const id = (this.fallbackRequestId += 1);\n const request = { jsonrpc: \"2.0\", id, method, params };\n\n const timeout = setTimeout(() => {\n this.fallbackPending.delete(id);\n reject(new Error(`Request timeout: ${method}`));\n }, this.config.timeout);\n\n this.fallbackPending.set(id, {\n resolve: (v) => {\n clearTimeout(timeout);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timeout);\n reject(e);\n },\n });\n\n this.fallbackProcess.stdin.write(`${JSON.stringify(request)}\\n`);\n });\n }\n\n private fallbackNotify(method: string, params?: any): void {\n if (!this.fallbackProcess?.stdin) {\n return;\n }\n this.fallbackProcess.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", method, params })}\\n`);\n }\n\n /**\n * Disconnect from the MCP server\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n if (this.useFallback && this.fallbackProcess) {\n this.fallbackProcess.kill(\"SIGTERM\");\n this.fallbackProcess = null;\n } else if (this.client) {\n await this.client.close();\n this.client = null;\n this.transport = null;\n }\n\n this.connected = false;\n this._tools = [];\n this._resources = [];\n }\n\n /**\n * Refresh tools and resources from the server\n */\n async refreshCapabilities(): Promise<void> {\n try {\n if (this.useFallback) {\n const result = await this.fallbackRequest(\"tools/list\", {});\n this._tools = result.tools || [];\n } else if (this.client) {\n const result = await this.client.listTools();\n this._tools = result.tools || [];\n }\n } catch {\n this._tools = [];\n }\n\n try {\n if (this.useFallback) {\n const result = await this.fallbackRequest(\"resources/list\", {});\n this._resources = result.resources || [];\n } else if (this.client) {\n const result = await this.client.listResources();\n this._resources = result.resources || [];\n }\n } catch {\n this._resources = [];\n }\n }\n\n /**\n * List available tools\n */\n listTools(): MCPTool[] {\n return this._tools;\n }\n\n /**\n * List available resources\n */\n listResources(): MCPResource[] {\n return this._resources;\n }\n\n /**\n * Call a tool\n */\n async callTool(name: string, args: Record<string, any> = {}): Promise<any> {\n let result: any;\n\n if (this.useFallback) {\n result = await this.fallbackRequest(\"tools/call\", {\n name,\n arguments: args,\n });\n } else if (this.client) {\n result = await this.client.callTool({ name, arguments: args });\n } else {\n throw new Error(\"Not connected\");\n }\n\n // MCP returns content array\n if (result.content && Array.isArray(result.content)) {\n return result.content.map((c: any) => c.text || JSON.stringify(c)).join(\"\\n\");\n }\n\n return result;\n }\n\n /**\n * Read a resource\n */\n async readResource(uri: string): Promise<string> {\n let result: any;\n\n if (this.useFallback) {\n result = await this.fallbackRequest(\"resources/read\", { uri });\n } else if (this.client) {\n result = await this.client.readResource({ uri });\n } else {\n throw new Error(\"Not connected\");\n }\n\n if (result.contents && Array.isArray(result.contents)) {\n return result.contents.map((c: any) => c.text || c.blob || \"\").join(\"\\n\");\n }\n\n return typeof result === \"string\" ? result : JSON.stringify(result);\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get server name\n */\n getName(): string {\n return this.serverName;\n }\n}\n\n// ============================================\n// MCP Hub (manage multiple servers)\n// ============================================\n\n/**\n * Hub for managing multiple MCP server connections\n */\nexport class MCPHub {\n private readonly clients = new Map<string, MCPClient>();\n private readonly toolPrefix = \"mcp\";\n\n /**\n * Add and connect to an MCP server\n */\n async addServer(name: string, config: MCPServerConfig): Promise<MCPClient> {\n // Disconnect existing if same name\n if (this.clients.has(name)) {\n await this.removeServer(name);\n }\n\n const client = new MCPClient({ ...config, name });\n await client.connect();\n this.clients.set(name, client);\n\n // Register tools from this server\n this.registerServerTools(name, client);\n\n return client;\n }\n\n /**\n * Remove and disconnect an MCP server\n */\n async removeServer(name: string): Promise<void> {\n const client = this.clients.get(name);\n if (client) {\n await client.disconnect();\n this.clients.delete(name);\n }\n }\n\n /**\n * Get a specific client\n */\n getClient(name: string): MCPClient | undefined {\n return this.clients.get(name);\n }\n\n /**\n * List connected servers\n */\n listServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Get all tools from all servers\n */\n getAllTools(): Array<{ server: string; tool: MCPTool }> {\n const tools: Array<{ server: string; tool: MCPTool }> = [];\n\n for (const [serverName, client] of this.clients) {\n for (const tool of client.listTools()) {\n tools.push({ server: serverName, tool });\n }\n }\n\n return tools;\n }\n\n /**\n * Call a tool from any connected server\n * Tool name format: \"server_name:tool_name\" or just \"tool_name\" (searches all)\n */\n async callTool(toolName: string, args: Record<string, any> = {}): Promise<any> {\n // Check if prefixed with server name\n if (toolName.includes(\":\")) {\n const [serverName, actualToolName] = toolName.split(\":\", 2);\n const client = this.clients.get(serverName);\n if (!client) {\n throw new Error(`MCP server \"${serverName}\" not connected`);\n }\n return client.callTool(actualToolName, args);\n }\n\n // Search all servers for the tool\n for (const [_, client] of this.clients) {\n const tools = client.listTools();\n if (tools.some((t) => t.name === toolName)) {\n return client.callTool(toolName, args);\n }\n }\n\n throw new Error(`Tool \"${toolName}\" not found in any connected MCP server`);\n }\n\n /**\n * Disconnect all servers\n */\n async disconnectAll(): Promise<void> {\n for (const [name] of this.clients) {\n await this.removeServer(name);\n }\n }\n\n /**\n * Register tools from an MCP server into Gerbil's tool registry\n */\n private registerServerTools(serverName: string, client: MCPClient): void {\n const tools = client.listTools();\n\n for (const tool of tools) {\n // Create a Gerbil tool that wraps the MCP tool\n const gerbilToolName = `${this.toolPrefix}_${serverName}_${tool.name}`;\n\n // Build Zod schema from MCP input schema\n const zodSchema = this.mcpSchemaToZod(tool.inputSchema);\n\n defineTool({\n name: gerbilToolName,\n description: `[MCP:${serverName}] ${tool.description || tool.name}`,\n parameters: zodSchema,\n execute: async (params) => {\n const result = await client.callTool(tool.name, params);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n },\n });\n }\n }\n\n /**\n * Convert MCP JSON Schema to Zod schema (simplified)\n */\n private mcpSchemaToZod(schema?: MCPTool[\"inputSchema\"]): z.ZodType<any> {\n if (!schema || schema.type !== \"object\") {\n return z.object({}).passthrough();\n }\n\n const shape: Record<string, z.ZodType<any>> = {};\n const properties = schema.properties || {};\n const required = new Set(schema.required || []);\n\n for (const [key, prop] of Object.entries(properties)) {\n let zodType: z.ZodType<any>;\n\n switch ((prop as any).type) {\n case \"string\":\n zodType = z.string();\n if ((prop as any).description) {\n zodType = zodType.describe((prop as any).description);\n }\n break;\n case \"number\":\n case \"integer\":\n zodType = z.number();\n break;\n case \"boolean\":\n zodType = z.boolean();\n break;\n case \"array\":\n zodType = z.array(z.any());\n break;\n default:\n zodType = z.any();\n }\n\n if (!required.has(key)) {\n zodType = zodType.optional();\n }\n\n shape[key] = zodType;\n }\n\n return z.object(shape).passthrough();\n }\n}\n\n// ============================================\n// Convenience functions\n// ============================================\n\nlet defaultHub: MCPHub | null = null;\n\n/**\n * Get the default MCP hub (singleton)\n */\nexport function getMCPHub(): MCPHub {\n if (!defaultHub) {\n defaultHub = new MCPHub();\n }\n return defaultHub;\n}\n\n/**\n * Connect to an MCP server\n */\nexport async function connectMCP(name: string, config: MCPServerConfig): Promise<MCPClient> {\n return getMCPHub().addServer(name, config);\n}\n\n/**\n * Disconnect from an MCP server\n */\nexport async function disconnectMCP(name: string): Promise<void> {\n return getMCPHub().removeServer(name);\n}\n\n/**\n * Call an MCP tool\n */\nexport async function callMCPTool(toolName: string, args?: Record<string, any>): Promise<any> {\n return getMCPHub().callTool(toolName, args);\n}\n\n// ============================================\n// Built-in MCP tools for chat\n// ============================================\n\n/**\n * Tool for the LLM to call MCP tools\n */\ndefineTool({\n name: \"mcp_call\",\n description:\n \"Call a tool from a connected MCP server. Use this when you need to interact with external tools like file systems, browsers, databases, etc.\",\n parameters: z.object({\n server: z.string().describe(\"The MCP server name (e.g., 'filesystem', 'browser')\"),\n tool: z.string().describe(\"The tool name to call\"),\n args: z.record(z.any()).optional().describe(\"Arguments to pass to the tool\"),\n }),\n execute: async ({ server, tool, args }) => {\n const hub = getMCPHub();\n const client = hub.getClient(server);\n\n if (!client) {\n const servers = hub.listServers();\n if (servers.length === 0) {\n return \"No MCP servers are connected. Use the MCP settings to connect to servers first.\";\n }\n return `Server \"${server}\" not found. Available servers: ${servers.join(\", \")}`;\n }\n\n try {\n const result = await client.callTool(tool, args || {});\n return typeof result === \"string\" ? result : JSON.stringify(result, null, 2);\n } catch (e) {\n return `Error calling ${server}:${tool}: ${e}`;\n }\n },\n});\n\n/**\n * Tool to list available MCP tools\n */\ndefineTool({\n name: \"mcp_list\",\n description: \"List all tools available from connected MCP servers\",\n parameters: z.object({\n server: z.string().optional().describe(\"Filter by server name (optional)\"),\n }),\n execute: async ({ server }) => {\n const hub = getMCPHub();\n\n if (server) {\n const client = hub.getClient(server);\n if (!client) {\n return `Server \"${server}\" not connected`;\n }\n const tools = client.listTools();\n return tools.map((t) => `- ${t.name}: ${t.description || \"(no description)\"}`).join(\"\\n\");\n }\n\n const allTools = hub.getAllTools();\n if (allTools.length === 0) {\n return \"No MCP servers connected. Connect to MCP servers to use external tools.\";\n }\n\n const byServer: Record<string, string[]> = {};\n for (const { server: s, tool } of allTools) {\n if (!byServer[s]) {\n byServer[s] = [];\n }\n byServer[s].push(` - ${tool.name}: ${tool.description || \"(no description)\"}`);\n }\n\n return Object.entries(byServer)\n .map(([s, tools]) => `[${s}]\\n${tools.join(\"\\n\")}`)\n .join(\"\\n\\n\");\n },\n});\n\nexport default {\n MCPClient,\n MCPHub,\n getMCPHub,\n connectMCP,\n disconnectMCP,\n callMCPTool,\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { s as GerbilConfig } from "../types-BS1N92Jt.mjs";
2
- import { t as Gerbil } from "../gerbil-DZ1k3ChC.mjs";
1
+ import { c as GerbilConfig } from "../types-s6Py2_DL.mjs";
2
+ import { t as Gerbil } from "../gerbil-POAz8peb.mjs";
3
3
 
4
4
  //#region src/integrations/mcp.d.ts
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.mts","names":[],"sources":["../../src/integrations/mcp.ts"],"sourcesContent":[],"mappings":";;;;;UA2BiB,gBAAA,SAAyB;;;;;;;;;iBA2GpB,eAAA,WAAyB,mBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAwGxB;;;;;;iBAgBtB,cAAA,WAAwB,mBAAqB;cA6DlE;0BAAA;yBAAA"}
1
+ {"version":3,"file":"mcp.d.mts","names":[],"sources":["../../src/integrations/mcp.ts"],"sourcesContent":[],"mappings":";;;;;UA2BiB,gBAAA,SAAyB;;;;;;;;;iBA2GpB,eAAA,WAAyB,mBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAwGxB;;;;;;iBAgBtB,cAAA,WAAwB,mBAAqB;cAyClE;0BAAA;yBAAA"}
@@ -1,8 +1,8 @@
1
- import "../models-DKULvhOr.mjs";
2
- import "../utils-7vXqtq2Q.mjs";
3
- import "../gerbil-BfnsFWRE.mjs";
4
- import "../one-liner-BUQR0nqq.mjs";
5
- import "../skills-D3CEpgDc.mjs";
6
- import { n as mcp_default, r as startMCPServer, t as createMCPServer } from "../mcp-R8kRLIKb.mjs";
1
+ import "../gerbil-yoSpRHgv.mjs";
2
+ import "../models-BAtL8qsA.mjs";
3
+ import "../utils-CkB4Roi6.mjs";
4
+ import "../one-liner-B1rmFto6.mjs";
5
+ import "../skills-5DxAV-rn.mjs";
6
+ import { n as mcp_default, r as startMCPServer, t as createMCPServer } from "../mcp-Bitg4sjX.mjs";
7
7
 
8
8
  export { createMCPServer, mcp_default as default, startMCPServer };