@cogitator-ai/core 0.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/__tests__/agent.test.d.ts +2 -0
  4. package/dist/__tests__/agent.test.d.ts.map +1 -0
  5. package/dist/__tests__/agent.test.js +91 -0
  6. package/dist/__tests__/agent.test.js.map +1 -0
  7. package/dist/__tests__/base64.test.d.ts +2 -0
  8. package/dist/__tests__/base64.test.d.ts.map +1 -0
  9. package/dist/__tests__/base64.test.js +62 -0
  10. package/dist/__tests__/base64.test.js.map +1 -0
  11. package/dist/__tests__/calculator.test.d.ts +2 -0
  12. package/dist/__tests__/calculator.test.d.ts.map +1 -0
  13. package/dist/__tests__/calculator.test.js +146 -0
  14. package/dist/__tests__/calculator.test.js.map +1 -0
  15. package/dist/__tests__/cogitator-memory.test.d.ts +2 -0
  16. package/dist/__tests__/cogitator-memory.test.d.ts.map +1 -0
  17. package/dist/__tests__/cogitator-memory.test.js +176 -0
  18. package/dist/__tests__/cogitator-memory.test.js.map +1 -0
  19. package/dist/__tests__/datetime.test.d.ts +2 -0
  20. package/dist/__tests__/datetime.test.d.ts.map +1 -0
  21. package/dist/__tests__/datetime.test.js +87 -0
  22. package/dist/__tests__/datetime.test.js.map +1 -0
  23. package/dist/__tests__/exec.test.d.ts +2 -0
  24. package/dist/__tests__/exec.test.d.ts.map +1 -0
  25. package/dist/__tests__/exec.test.js +59 -0
  26. package/dist/__tests__/exec.test.js.map +1 -0
  27. package/dist/__tests__/filesystem.test.d.ts +2 -0
  28. package/dist/__tests__/filesystem.test.d.ts.map +1 -0
  29. package/dist/__tests__/filesystem.test.js +148 -0
  30. package/dist/__tests__/filesystem.test.js.map +1 -0
  31. package/dist/__tests__/google-backend.test.d.ts +5 -0
  32. package/dist/__tests__/google-backend.test.d.ts.map +1 -0
  33. package/dist/__tests__/google-backend.test.js +429 -0
  34. package/dist/__tests__/google-backend.test.js.map +1 -0
  35. package/dist/__tests__/hash.test.d.ts +2 -0
  36. package/dist/__tests__/hash.test.d.ts.map +1 -0
  37. package/dist/__tests__/hash.test.js +50 -0
  38. package/dist/__tests__/hash.test.js.map +1 -0
  39. package/dist/__tests__/http.test.d.ts +2 -0
  40. package/dist/__tests__/http.test.d.ts.map +1 -0
  41. package/dist/__tests__/http.test.js +64 -0
  42. package/dist/__tests__/http.test.js.map +1 -0
  43. package/dist/__tests__/json.test.d.ts +2 -0
  44. package/dist/__tests__/json.test.d.ts.map +1 -0
  45. package/dist/__tests__/json.test.js +65 -0
  46. package/dist/__tests__/json.test.js.map +1 -0
  47. package/dist/__tests__/logger.test.d.ts +2 -0
  48. package/dist/__tests__/logger.test.d.ts.map +1 -0
  49. package/dist/__tests__/logger.test.js +186 -0
  50. package/dist/__tests__/logger.test.js.map +1 -0
  51. package/dist/__tests__/random.test.d.ts +2 -0
  52. package/dist/__tests__/random.test.d.ts.map +1 -0
  53. package/dist/__tests__/random.test.js +81 -0
  54. package/dist/__tests__/random.test.js.map +1 -0
  55. package/dist/__tests__/regex.test.d.ts +2 -0
  56. package/dist/__tests__/regex.test.d.ts.map +1 -0
  57. package/dist/__tests__/regex.test.js +75 -0
  58. package/dist/__tests__/regex.test.js.map +1 -0
  59. package/dist/__tests__/registry.test.d.ts +2 -0
  60. package/dist/__tests__/registry.test.d.ts.map +1 -0
  61. package/dist/__tests__/registry.test.js +102 -0
  62. package/dist/__tests__/registry.test.js.map +1 -0
  63. package/dist/__tests__/sleep.test.d.ts +2 -0
  64. package/dist/__tests__/sleep.test.d.ts.map +1 -0
  65. package/dist/__tests__/sleep.test.js +29 -0
  66. package/dist/__tests__/sleep.test.js.map +1 -0
  67. package/dist/__tests__/tool.test.d.ts +2 -0
  68. package/dist/__tests__/tool.test.d.ts.map +1 -0
  69. package/dist/__tests__/tool.test.js +103 -0
  70. package/dist/__tests__/tool.test.js.map +1 -0
  71. package/dist/__tests__/uuid.test.d.ts +2 -0
  72. package/dist/__tests__/uuid.test.d.ts.map +1 -0
  73. package/dist/__tests__/uuid.test.js +37 -0
  74. package/dist/__tests__/uuid.test.js.map +1 -0
  75. package/dist/agent.d.ts +15 -0
  76. package/dist/agent.d.ts.map +1 -0
  77. package/dist/agent.js +35 -0
  78. package/dist/agent.js.map +1 -0
  79. package/dist/cogitator.d.ts +66 -0
  80. package/dist/cogitator.d.ts.map +1 -0
  81. package/dist/cogitator.js +538 -0
  82. package/dist/cogitator.js.map +1 -0
  83. package/dist/index.d.ts +19 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +15 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/llm/anthropic.d.ts +19 -0
  88. package/dist/llm/anthropic.d.ts.map +1 -0
  89. package/dist/llm/anthropic.js +188 -0
  90. package/dist/llm/anthropic.js.map +1 -0
  91. package/dist/llm/base.d.ts +11 -0
  92. package/dist/llm/base.d.ts.map +1 -0
  93. package/dist/llm/base.js +9 -0
  94. package/dist/llm/base.js.map +1 -0
  95. package/dist/llm/google.d.ts +32 -0
  96. package/dist/llm/google.d.ts.map +1 -0
  97. package/dist/llm/google.js +282 -0
  98. package/dist/llm/google.js.map +1 -0
  99. package/dist/llm/index.d.ts +22 -0
  100. package/dist/llm/index.d.ts.map +1 -0
  101. package/dist/llm/index.js +67 -0
  102. package/dist/llm/index.js.map +1 -0
  103. package/dist/llm/ollama.d.ts +20 -0
  104. package/dist/llm/ollama.d.ts.map +1 -0
  105. package/dist/llm/ollama.js +134 -0
  106. package/dist/llm/ollama.js.map +1 -0
  107. package/dist/llm/openai.d.ts +21 -0
  108. package/dist/llm/openai.d.ts.map +1 -0
  109. package/dist/llm/openai.js +154 -0
  110. package/dist/llm/openai.js.map +1 -0
  111. package/dist/logger.d.ts +48 -0
  112. package/dist/logger.d.ts.map +1 -0
  113. package/dist/logger.js +118 -0
  114. package/dist/logger.js.map +1 -0
  115. package/dist/registry.d.ts +15 -0
  116. package/dist/registry.d.ts.map +1 -0
  117. package/dist/registry.js +31 -0
  118. package/dist/registry.js.map +1 -0
  119. package/dist/tool.d.ts +13 -0
  120. package/dist/tool.d.ts.map +1 -0
  121. package/dist/tool.js +44 -0
  122. package/dist/tool.js.map +1 -0
  123. package/dist/tools/base64.d.ts +23 -0
  124. package/dist/tools/base64.d.ts.map +1 -0
  125. package/dist/tools/base64.js +53 -0
  126. package/dist/tools/base64.js.map +1 -0
  127. package/dist/tools/calculator.d.ts +15 -0
  128. package/dist/tools/calculator.d.ts.map +1 -0
  129. package/dist/tools/calculator.js +193 -0
  130. package/dist/tools/calculator.js.map +1 -0
  131. package/dist/tools/datetime.d.ts +23 -0
  132. package/dist/tools/datetime.d.ts.map +1 -0
  133. package/dist/tools/datetime.js +95 -0
  134. package/dist/tools/datetime.js.map +1 -0
  135. package/dist/tools/exec.d.ts +46 -0
  136. package/dist/tools/exec.d.ts.map +1 -0
  137. package/dist/tools/exec.js +87 -0
  138. package/dist/tools/exec.js.map +1 -0
  139. package/dist/tools/filesystem.d.ts +100 -0
  140. package/dist/tools/filesystem.d.ts.map +1 -0
  141. package/dist/tools/filesystem.js +186 -0
  142. package/dist/tools/filesystem.js.map +1 -0
  143. package/dist/tools/hash.d.ts +19 -0
  144. package/dist/tools/hash.d.ts.map +1 -0
  145. package/dist/tools/hash.js +32 -0
  146. package/dist/tools/hash.js.map +1 -0
  147. package/dist/tools/http.d.ts +29 -0
  148. package/dist/tools/http.d.ts.map +1 -0
  149. package/dist/tools/http.js +82 -0
  150. package/dist/tools/http.js.map +1 -0
  151. package/dist/tools/index.d.ts +323 -0
  152. package/dist/tools/index.d.ts.map +1 -0
  153. package/dist/tools/index.js +50 -0
  154. package/dist/tools/index.js.map +1 -0
  155. package/dist/tools/json.d.ts +28 -0
  156. package/dist/tools/json.d.ts.map +1 -0
  157. package/dist/tools/json.js +42 -0
  158. package/dist/tools/json.js.map +1 -0
  159. package/dist/tools/random.d.ts +29 -0
  160. package/dist/tools/random.d.ts.map +1 -0
  161. package/dist/tools/random.js +56 -0
  162. package/dist/tools/random.js.map +1 -0
  163. package/dist/tools/regex.d.ts +43 -0
  164. package/dist/tools/regex.d.ts.map +1 -0
  165. package/dist/tools/regex.js +68 -0
  166. package/dist/tools/regex.js.map +1 -0
  167. package/dist/tools/sleep.d.ts +10 -0
  168. package/dist/tools/sleep.d.ts.map +1 -0
  169. package/dist/tools/sleep.js +25 -0
  170. package/dist/tools/sleep.js.map +1 -0
  171. package/dist/tools/uuid.d.ts +15 -0
  172. package/dist/tools/uuid.d.ts.map +1 -0
  173. package/dist/tools/uuid.js +25 -0
  174. package/dist/tools/uuid.js.map +1 -0
  175. package/dist/utils/circuit-breaker.d.ts +127 -0
  176. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  177. package/dist/utils/circuit-breaker.js +235 -0
  178. package/dist/utils/circuit-breaker.js.map +1 -0
  179. package/dist/utils/fallback.d.ts +66 -0
  180. package/dist/utils/fallback.d.ts.map +1 -0
  181. package/dist/utils/fallback.js +99 -0
  182. package/dist/utils/fallback.js.map +1 -0
  183. package/dist/utils/index.d.ts +4 -0
  184. package/dist/utils/index.d.ts.map +1 -0
  185. package/dist/utils/index.js +4 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/dist/utils/retry.d.ts +51 -0
  188. package/dist/utils/retry.d.ts.map +1 -0
  189. package/dist/utils/retry.js +115 -0
  190. package/dist/utils/retry.js.map +1 -0
  191. package/package.json +56 -0
@@ -0,0 +1,429 @@
1
+ /**
2
+ * Tests for Google Gemini Backend
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ import { GoogleBackend } from '../llm/google';
6
+ const mockFetch = vi.fn();
7
+ vi.stubGlobal('fetch', mockFetch);
8
+ describe('GoogleBackend', () => {
9
+ let backend;
10
+ beforeEach(() => {
11
+ backend = new GoogleBackend({
12
+ apiKey: 'test-api-key',
13
+ });
14
+ mockFetch.mockReset();
15
+ });
16
+ afterEach(() => {
17
+ vi.clearAllMocks();
18
+ });
19
+ describe('constructor', () => {
20
+ it('should create instance with default baseUrl', () => {
21
+ expect(backend.provider).toBe('google');
22
+ });
23
+ it('should accept custom baseUrl', () => {
24
+ const customBackend = new GoogleBackend({
25
+ apiKey: 'test-key',
26
+ baseUrl: 'https://custom.api.com',
27
+ });
28
+ expect(customBackend.provider).toBe('google');
29
+ });
30
+ });
31
+ describe('chat', () => {
32
+ it('should make correct API request', async () => {
33
+ mockFetch.mockResolvedValueOnce({
34
+ ok: true,
35
+ json: async () => ({
36
+ candidates: [
37
+ {
38
+ content: {
39
+ role: 'model',
40
+ parts: [{ text: 'Hello! How can I help you?' }],
41
+ },
42
+ finishReason: 'STOP',
43
+ },
44
+ ],
45
+ usageMetadata: {
46
+ promptTokenCount: 10,
47
+ candidatesTokenCount: 8,
48
+ totalTokenCount: 18,
49
+ },
50
+ }),
51
+ });
52
+ await backend.chat({
53
+ model: 'gemini-1.5-flash',
54
+ messages: [
55
+ { role: 'system', content: 'You are helpful.' },
56
+ { role: 'user', content: 'Hello' },
57
+ ],
58
+ });
59
+ expect(mockFetch).toHaveBeenCalledTimes(1);
60
+ const [url, options] = mockFetch.mock.calls[0];
61
+ expect(url).toContain('gemini-1.5-flash:generateContent');
62
+ expect(url).toContain('key=test-api-key');
63
+ expect(options.method).toBe('POST');
64
+ const body = JSON.parse(options.body);
65
+ expect(body.systemInstruction).toBeDefined();
66
+ expect(body.contents).toHaveLength(1);
67
+ expect(body.contents[0].role).toBe('user');
68
+ });
69
+ it('should return correct response structure', async () => {
70
+ mockFetch.mockResolvedValueOnce({
71
+ ok: true,
72
+ json: async () => ({
73
+ candidates: [
74
+ {
75
+ content: {
76
+ role: 'model',
77
+ parts: [{ text: 'Hello!' }],
78
+ },
79
+ finishReason: 'STOP',
80
+ },
81
+ ],
82
+ usageMetadata: {
83
+ promptTokenCount: 5,
84
+ candidatesTokenCount: 3,
85
+ totalTokenCount: 8,
86
+ },
87
+ }),
88
+ });
89
+ const response = await backend.chat({
90
+ model: 'gemini-1.5-flash',
91
+ messages: [{ role: 'user', content: 'Hi' }],
92
+ });
93
+ expect(response.content).toBe('Hello!');
94
+ expect(response.finishReason).toBe('stop');
95
+ expect(response.usage.inputTokens).toBe(5);
96
+ expect(response.usage.outputTokens).toBe(3);
97
+ expect(response.usage.totalTokens).toBe(8);
98
+ });
99
+ it('should handle tool calls', async () => {
100
+ mockFetch.mockResolvedValueOnce({
101
+ ok: true,
102
+ json: async () => ({
103
+ candidates: [
104
+ {
105
+ content: {
106
+ role: 'model',
107
+ parts: [
108
+ {
109
+ functionCall: {
110
+ name: 'get_weather',
111
+ args: { city: 'Tokyo' },
112
+ },
113
+ },
114
+ ],
115
+ },
116
+ finishReason: 'STOP',
117
+ },
118
+ ],
119
+ usageMetadata: {
120
+ promptTokenCount: 20,
121
+ candidatesTokenCount: 15,
122
+ totalTokenCount: 35,
123
+ },
124
+ }),
125
+ });
126
+ const response = await backend.chat({
127
+ model: 'gemini-1.5-flash',
128
+ messages: [{ role: 'user', content: 'What is the weather in Tokyo?' }],
129
+ tools: [
130
+ {
131
+ name: 'get_weather',
132
+ description: 'Get weather for a city',
133
+ parameters: {
134
+ type: 'object',
135
+ properties: {
136
+ city: { type: 'string' },
137
+ },
138
+ required: ['city'],
139
+ },
140
+ },
141
+ ],
142
+ });
143
+ expect(response.toolCalls).toBeDefined();
144
+ expect(response.toolCalls).toHaveLength(1);
145
+ expect(response.toolCalls[0].name).toBe('get_weather');
146
+ expect(response.toolCalls[0].arguments).toEqual({ city: 'Tokyo' });
147
+ });
148
+ it('should include tools in request', async () => {
149
+ mockFetch.mockResolvedValueOnce({
150
+ ok: true,
151
+ json: async () => ({
152
+ candidates: [
153
+ {
154
+ content: { role: 'model', parts: [{ text: 'OK' }] },
155
+ finishReason: 'STOP',
156
+ },
157
+ ],
158
+ usageMetadata: {
159
+ promptTokenCount: 10,
160
+ candidatesTokenCount: 2,
161
+ totalTokenCount: 12,
162
+ },
163
+ }),
164
+ });
165
+ await backend.chat({
166
+ model: 'gemini-1.5-flash',
167
+ messages: [{ role: 'user', content: 'Test' }],
168
+ tools: [
169
+ {
170
+ name: 'my_tool',
171
+ description: 'A test tool',
172
+ parameters: {
173
+ type: 'object',
174
+ properties: {
175
+ param1: { type: 'string' },
176
+ },
177
+ },
178
+ },
179
+ ],
180
+ });
181
+ const [, options] = mockFetch.mock.calls[0];
182
+ const body = JSON.parse(options.body);
183
+ expect(body.tools).toBeDefined();
184
+ expect(body.tools[0].functionDeclarations).toHaveLength(1);
185
+ expect(body.tools[0].functionDeclarations[0].name).toBe('my_tool');
186
+ });
187
+ it('should handle tool results in messages', async () => {
188
+ mockFetch.mockResolvedValueOnce({
189
+ ok: true,
190
+ json: async () => ({
191
+ candidates: [
192
+ {
193
+ content: {
194
+ role: 'model',
195
+ parts: [{ text: 'The weather in Tokyo is sunny.' }],
196
+ },
197
+ finishReason: 'STOP',
198
+ },
199
+ ],
200
+ usageMetadata: {
201
+ promptTokenCount: 30,
202
+ candidatesTokenCount: 10,
203
+ totalTokenCount: 40,
204
+ },
205
+ }),
206
+ });
207
+ await backend.chat({
208
+ model: 'gemini-1.5-flash',
209
+ messages: [
210
+ { role: 'user', content: 'What is the weather?' },
211
+ { role: 'assistant', content: '' },
212
+ {
213
+ role: 'tool',
214
+ content: '{"temperature": 25, "condition": "sunny"}',
215
+ toolCallId: 'call_1',
216
+ name: 'get_weather',
217
+ },
218
+ ],
219
+ });
220
+ const [, options] = mockFetch.mock.calls[0];
221
+ const body = JSON.parse(options.body);
222
+ const functionResponseContent = body.contents.find((c) => c.parts.some((p) => typeof p === 'object' && p !== null && 'functionResponse' in p));
223
+ expect(functionResponseContent).toBeDefined();
224
+ });
225
+ it('should handle API errors', async () => {
226
+ mockFetch.mockResolvedValueOnce({
227
+ ok: false,
228
+ status: 400,
229
+ text: async () => 'Bad Request: Invalid model',
230
+ });
231
+ await expect(backend.chat({
232
+ model: 'invalid-model',
233
+ messages: [{ role: 'user', content: 'Test' }],
234
+ })).rejects.toThrow('Gemini API error: 400');
235
+ });
236
+ it('should normalize model aliases', async () => {
237
+ mockFetch.mockResolvedValueOnce({
238
+ ok: true,
239
+ json: async () => ({
240
+ candidates: [
241
+ {
242
+ content: { role: 'model', parts: [{ text: 'OK' }] },
243
+ finishReason: 'STOP',
244
+ },
245
+ ],
246
+ usageMetadata: {
247
+ promptTokenCount: 5,
248
+ candidatesTokenCount: 2,
249
+ totalTokenCount: 7,
250
+ },
251
+ }),
252
+ });
253
+ await backend.chat({
254
+ model: 'gemini-flash',
255
+ messages: [{ role: 'user', content: 'Test' }],
256
+ });
257
+ const [url] = mockFetch.mock.calls[0];
258
+ expect(url).toContain('gemini-1.5-flash:generateContent');
259
+ });
260
+ it('should include generation config', async () => {
261
+ mockFetch.mockResolvedValueOnce({
262
+ ok: true,
263
+ json: async () => ({
264
+ candidates: [
265
+ {
266
+ content: { role: 'model', parts: [{ text: 'OK' }] },
267
+ finishReason: 'STOP',
268
+ },
269
+ ],
270
+ usageMetadata: {
271
+ promptTokenCount: 5,
272
+ candidatesTokenCount: 2,
273
+ totalTokenCount: 7,
274
+ },
275
+ }),
276
+ });
277
+ await backend.chat({
278
+ model: 'gemini-1.5-flash',
279
+ messages: [{ role: 'user', content: 'Test' }],
280
+ temperature: 0.7,
281
+ topP: 0.9,
282
+ maxTokens: 1000,
283
+ stop: ['END'],
284
+ });
285
+ const [, options] = mockFetch.mock.calls[0];
286
+ const body = JSON.parse(options.body);
287
+ expect(body.generationConfig).toEqual({
288
+ temperature: 0.7,
289
+ topP: 0.9,
290
+ maxOutputTokens: 1000,
291
+ stopSequences: ['END'],
292
+ });
293
+ });
294
+ it('should map finish reasons correctly', async () => {
295
+ const testCases = [
296
+ { reason: 'STOP', expected: 'stop' },
297
+ { reason: 'MAX_TOKENS', expected: 'length' },
298
+ { reason: 'SAFETY', expected: 'error' },
299
+ ];
300
+ for (const { reason, expected } of testCases) {
301
+ mockFetch.mockResolvedValueOnce({
302
+ ok: true,
303
+ json: async () => ({
304
+ candidates: [
305
+ {
306
+ content: { role: 'model', parts: [{ text: 'OK' }] },
307
+ finishReason: reason,
308
+ },
309
+ ],
310
+ usageMetadata: {
311
+ promptTokenCount: 5,
312
+ candidatesTokenCount: 2,
313
+ totalTokenCount: 7,
314
+ },
315
+ }),
316
+ });
317
+ const response = await backend.chat({
318
+ model: 'gemini-1.5-flash',
319
+ messages: [{ role: 'user', content: 'Test' }],
320
+ });
321
+ expect(response.finishReason).toBe(expected);
322
+ }
323
+ });
324
+ });
325
+ describe('chatStream', () => {
326
+ it('should stream text responses', async () => {
327
+ const encoder = new TextEncoder();
328
+ const chunks = [
329
+ 'data: {"candidates":[{"content":{"parts":[{"text":"Hello"}]}}]}\n\n',
330
+ 'data: {"candidates":[{"content":{"parts":[{"text":" world"}]},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":5,"candidatesTokenCount":2,"totalTokenCount":7}}\n\n',
331
+ ];
332
+ let chunkIndex = 0;
333
+ const mockReader = {
334
+ read: vi.fn().mockImplementation(async () => {
335
+ if (chunkIndex < chunks.length) {
336
+ return { done: false, value: encoder.encode(chunks[chunkIndex++]) };
337
+ }
338
+ return { done: true, value: undefined };
339
+ }),
340
+ releaseLock: vi.fn(),
341
+ };
342
+ mockFetch.mockResolvedValueOnce({
343
+ ok: true,
344
+ body: {
345
+ getReader: () => mockReader,
346
+ },
347
+ });
348
+ const results = [];
349
+ for await (const chunk of backend.chatStream({
350
+ model: 'gemini-1.5-flash',
351
+ messages: [{ role: 'user', content: 'Hi' }],
352
+ })) {
353
+ if (chunk.delta.content) {
354
+ results.push(chunk.delta.content);
355
+ }
356
+ }
357
+ expect(results).toEqual(['Hello', ' world']);
358
+ });
359
+ it('should stream tool calls', async () => {
360
+ const encoder = new TextEncoder();
361
+ const chunks = [
362
+ 'data: {"candidates":[{"content":{"parts":[{"functionCall":{"name":"get_weather","args":{"city":"Tokyo"}}}]},"finishReason":"STOP"}]}\n\n',
363
+ ];
364
+ let chunkIndex = 0;
365
+ const mockReader = {
366
+ read: vi.fn().mockImplementation(async () => {
367
+ if (chunkIndex < chunks.length) {
368
+ return { done: false, value: encoder.encode(chunks[chunkIndex++]) };
369
+ }
370
+ return { done: true, value: undefined };
371
+ }),
372
+ releaseLock: vi.fn(),
373
+ };
374
+ mockFetch.mockResolvedValueOnce({
375
+ ok: true,
376
+ body: {
377
+ getReader: () => mockReader,
378
+ },
379
+ });
380
+ const toolCalls = [];
381
+ for await (const chunk of backend.chatStream({
382
+ model: 'gemini-1.5-flash',
383
+ messages: [{ role: 'user', content: 'Weather?' }],
384
+ })) {
385
+ if (chunk.delta.toolCalls) {
386
+ toolCalls.push(...chunk.delta.toolCalls);
387
+ }
388
+ }
389
+ expect(toolCalls).toHaveLength(1);
390
+ expect(toolCalls[0]).toMatchObject({
391
+ name: 'get_weather',
392
+ arguments: { city: 'Tokyo' },
393
+ });
394
+ });
395
+ it('should use correct streaming endpoint', async () => {
396
+ const mockReader = {
397
+ read: vi.fn().mockResolvedValue({ done: true, value: undefined }),
398
+ releaseLock: vi.fn(),
399
+ };
400
+ mockFetch.mockResolvedValueOnce({
401
+ ok: true,
402
+ body: {
403
+ getReader: () => mockReader,
404
+ },
405
+ });
406
+ for await (const _ of backend.chatStream({
407
+ model: 'gemini-1.5-flash',
408
+ messages: [{ role: 'user', content: 'Test' }],
409
+ })) { /* consume stream */ }
410
+ const [url] = mockFetch.mock.calls[0];
411
+ expect(url).toContain('streamGenerateContent');
412
+ expect(url).toContain('alt=sse');
413
+ });
414
+ it('should handle streaming API errors', async () => {
415
+ mockFetch.mockResolvedValueOnce({
416
+ ok: false,
417
+ status: 401,
418
+ text: async () => 'Unauthorized',
419
+ });
420
+ await expect(async () => {
421
+ for await (const _ of backend.chatStream({
422
+ model: 'gemini-1.5-flash',
423
+ messages: [{ role: 'user', content: 'Test' }],
424
+ })) { /* consume stream */ }
425
+ }).rejects.toThrow('Gemini API error: 401');
426
+ });
427
+ });
428
+ });
429
+ //# sourceMappingURL=google-backend.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-backend.test.js","sourceRoot":"","sources":["../../src/__tests__/google-backend.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hash.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hash.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { hash } from '../tools/hash';
3
+ const mockContext = {
4
+ agentId: 'agent_test',
5
+ runId: 'run_test',
6
+ signal: new AbortController().signal,
7
+ };
8
+ describe('hash tool', () => {
9
+ it('computes sha256 by default', async () => {
10
+ const result = await hash.execute({ data: 'hello' }, mockContext);
11
+ expect(result).toHaveProperty('hash');
12
+ expect(result).toHaveProperty('algorithm', 'sha256');
13
+ expect(result).toHaveProperty('encoding', 'hex');
14
+ expect(result.hash).toBe('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824');
15
+ });
16
+ it('computes md5', async () => {
17
+ const result = await hash.execute({ data: 'hello', algorithm: 'md5' }, mockContext);
18
+ expect(result.hash).toBe('5d41402abc4b2a76b9719d911017c592');
19
+ });
20
+ it('computes sha1', async () => {
21
+ const result = await hash.execute({ data: 'hello', algorithm: 'sha1' }, mockContext);
22
+ expect(result.hash).toBe('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d');
23
+ });
24
+ it('computes sha512', async () => {
25
+ const result = await hash.execute({ data: 'hello', algorithm: 'sha512' }, mockContext);
26
+ const hashValue = result.hash;
27
+ expect(hashValue).toHaveLength(128);
28
+ });
29
+ it('supports base64 encoding', async () => {
30
+ const result = await hash.execute({ data: 'hello', algorithm: 'sha256', encoding: 'base64' }, mockContext);
31
+ expect(result.hash).toBe('LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=');
32
+ });
33
+ it('produces consistent hashes', async () => {
34
+ const result1 = await hash.execute({ data: 'test data' }, mockContext);
35
+ const result2 = await hash.execute({ data: 'test data' }, mockContext);
36
+ expect(result1.hash).toBe(result2.hash);
37
+ });
38
+ it('produces different hashes for different data', async () => {
39
+ const result1 = await hash.execute({ data: 'data1' }, mockContext);
40
+ const result2 = await hash.execute({ data: 'data2' }, mockContext);
41
+ expect(result1.hash).not.toBe(result2.hash);
42
+ });
43
+ it('has correct metadata', () => {
44
+ expect(hash.name).toBe('hash');
45
+ const schema = hash.toJSON();
46
+ expect(schema.parameters.properties).toHaveProperty('data');
47
+ expect(schema.parameters.properties).toHaveProperty('algorithm');
48
+ });
49
+ });
50
+ //# sourceMappingURL=hash.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../src/__tests__/hash.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=http.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/http.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { httpRequest } from '../tools/http';
3
+ const mockContext = {
4
+ agentId: 'agent_test',
5
+ runId: 'run_test',
6
+ signal: new AbortController().signal,
7
+ };
8
+ describe('httpRequest tool', () => {
9
+ it('makes GET request', async () => {
10
+ const result = await httpRequest.execute({ url: 'https://httpbin.org/get' }, mockContext);
11
+ expect(result).toHaveProperty('status', 200);
12
+ expect(result).toHaveProperty('method', 'GET');
13
+ expect(result).toHaveProperty('body');
14
+ expect(result).toHaveProperty('headers');
15
+ });
16
+ it('makes POST request with body', async () => {
17
+ const result = await httpRequest.execute({
18
+ url: 'https://httpbin.org/post',
19
+ method: 'POST',
20
+ headers: { 'Content-Type': 'application/json' },
21
+ body: JSON.stringify({ test: 'data' }),
22
+ }, mockContext);
23
+ expect(result).toHaveProperty('status', 200);
24
+ expect(result).toHaveProperty('method', 'POST');
25
+ const body = JSON.parse(result.body);
26
+ expect(body.json).toEqual({ test: 'data' });
27
+ });
28
+ it('includes custom headers', async () => {
29
+ const result = await httpRequest.execute({
30
+ url: 'https://httpbin.org/headers',
31
+ headers: { 'X-Custom-Header': 'test-value' },
32
+ }, mockContext);
33
+ const body = JSON.parse(result.body);
34
+ expect(body.headers['X-Custom-Header']).toBe('test-value');
35
+ });
36
+ it('returns error for invalid URL', async () => {
37
+ const result = await httpRequest.execute({ url: 'https://this-domain-does-not-exist-12345.com/' }, mockContext);
38
+ expect(result).toHaveProperty('error');
39
+ });
40
+ it('handles timeout', async () => {
41
+ const result = await httpRequest.execute({ url: 'https://httpbin.org/delay/10', timeout: 1000 }, mockContext);
42
+ expect(result).toHaveProperty('error');
43
+ expect(result.error).toContain('timed out');
44
+ });
45
+ it('returns response headers', async () => {
46
+ const result = await httpRequest.execute({ url: 'https://httpbin.org/response-headers?X-Test=hello' }, mockContext);
47
+ const headers = result.headers;
48
+ expect(headers['x-test']).toBe('hello');
49
+ });
50
+ it('handles non-2xx status codes', async () => {
51
+ const result = await httpRequest.execute({ url: 'https://httpbin.org/status/404' }, mockContext);
52
+ expect(result).toHaveProperty('status', 404);
53
+ });
54
+ it('has sideEffects declared', () => {
55
+ expect(httpRequest.sideEffects).toContain('network');
56
+ });
57
+ it('has correct metadata', () => {
58
+ expect(httpRequest.name).toBe('http_request');
59
+ const schema = httpRequest.toJSON();
60
+ expect(schema.parameters.properties).toHaveProperty('url');
61
+ expect(schema.parameters.properties).toHaveProperty('method');
62
+ });
63
+ });
64
+ //# sourceMappingURL=http.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.test.js","sourceRoot":"","sources":["../../src/__tests__/http.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/json.test.ts"],"names":[],"mappings":""}