@lichen-ai/lichen-sdk 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 (122) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth/error.d.ts +9 -0
  3. package/dist/auth/error.js +76 -0
  4. package/dist/auth/error.js.map +1 -0
  5. package/dist/auth/error.mjs +76 -0
  6. package/dist/auth/error.mjs.map +1 -0
  7. package/dist/auth/index.d.ts +18 -0
  8. package/dist/auth/index.js +35 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/index.mjs +35 -0
  11. package/dist/auth/index.mjs.map +1 -0
  12. package/dist/auth/types.d.ts +297 -0
  13. package/dist/auth/types.js +2 -0
  14. package/dist/auth/types.js.map +1 -0
  15. package/dist/auth/types.mjs +2 -0
  16. package/dist/auth/types.mjs.map +1 -0
  17. package/dist/client.d.ts +773 -0
  18. package/dist/client.js +1544 -0
  19. package/dist/client.js.map +1 -0
  20. package/dist/client.mjs +1544 -0
  21. package/dist/client.mjs.map +1 -0
  22. package/dist/index.d.ts +7 -0
  23. package/dist/index.js +3 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/index.mjs +3 -0
  26. package/dist/index.mjs.map +1 -0
  27. package/dist/logging/index.d.ts +43 -0
  28. package/dist/logging/index.js +33 -0
  29. package/dist/logging/index.js.map +1 -0
  30. package/dist/logging/index.mjs +33 -0
  31. package/dist/logging/index.mjs.map +1 -0
  32. package/dist/schema.d.ts +661 -0
  33. package/dist/schema.js +30 -0
  34. package/dist/schema.js.map +1 -0
  35. package/dist/schema.mjs +30 -0
  36. package/dist/schema.mjs.map +1 -0
  37. package/dist/singletons/fetch.d.ts +7 -0
  38. package/dist/singletons/fetch.js +24 -0
  39. package/dist/singletons/fetch.js.map +1 -0
  40. package/dist/singletons/fetch.mjs +24 -0
  41. package/dist/singletons/fetch.mjs.map +1 -0
  42. package/dist/tests/fetch.test.d.ts +1 -0
  43. package/dist/tests/fetch.test.js +460 -0
  44. package/dist/tests/fetch.test.js.map +1 -0
  45. package/dist/tests/fetch.test.mjs +460 -0
  46. package/dist/tests/fetch.test.mjs.map +1 -0
  47. package/dist/tests/sse.test.d.ts +1 -0
  48. package/dist/tests/sse.test.js +132 -0
  49. package/dist/tests/sse.test.js.map +1 -0
  50. package/dist/tests/sse.test.mjs +132 -0
  51. package/dist/tests/sse.test.mjs.map +1 -0
  52. package/dist/types.d.ts +178 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/types.messages.d.ts +86 -0
  56. package/dist/types.messages.js +2 -0
  57. package/dist/types.messages.js.map +1 -0
  58. package/dist/types.messages.mjs +2 -0
  59. package/dist/types.messages.mjs.map +1 -0
  60. package/dist/types.mjs +2 -0
  61. package/dist/types.mjs.map +1 -0
  62. package/dist/types.stream.d.ts +212 -0
  63. package/dist/types.stream.js +2 -0
  64. package/dist/types.stream.js.map +1 -0
  65. package/dist/types.stream.mjs +2 -0
  66. package/dist/types.stream.mjs.map +1 -0
  67. package/dist/ui/branching.d.ts +35 -0
  68. package/dist/ui/branching.js +143 -0
  69. package/dist/ui/branching.js.map +1 -0
  70. package/dist/ui/branching.mjs +143 -0
  71. package/dist/ui/branching.mjs.map +1 -0
  72. package/dist/ui/branching.test.d.ts +1 -0
  73. package/dist/ui/branching.test.js +369 -0
  74. package/dist/ui/branching.test.js.map +1 -0
  75. package/dist/ui/branching.test.mjs +369 -0
  76. package/dist/ui/branching.test.mjs.map +1 -0
  77. package/dist/ui/errors.d.ts +12 -0
  78. package/dist/ui/errors.js +10 -0
  79. package/dist/ui/errors.js.map +1 -0
  80. package/dist/ui/errors.mjs +10 -0
  81. package/dist/ui/errors.mjs.map +1 -0
  82. package/dist/ui/manager.d.ts +87 -0
  83. package/dist/ui/manager.js +158 -0
  84. package/dist/ui/manager.js.map +1 -0
  85. package/dist/ui/manager.mjs +158 -0
  86. package/dist/ui/manager.mjs.map +1 -0
  87. package/dist/ui/messages.d.ts +18 -0
  88. package/dist/ui/messages.js +64 -0
  89. package/dist/ui/messages.js.map +1 -0
  90. package/dist/ui/messages.mjs +64 -0
  91. package/dist/ui/messages.mjs.map +1 -0
  92. package/dist/ui/utils.d.ts +2 -0
  93. package/dist/ui/utils.js +11 -0
  94. package/dist/ui/utils.js.map +1 -0
  95. package/dist/ui/utils.mjs +11 -0
  96. package/dist/ui/utils.mjs.map +1 -0
  97. package/dist/utils/async_caller.d.ts +48 -0
  98. package/dist/utils/async_caller.js +153 -0
  99. package/dist/utils/async_caller.js.map +1 -0
  100. package/dist/utils/async_caller.mjs +153 -0
  101. package/dist/utils/async_caller.mjs.map +1 -0
  102. package/dist/utils/env.d.ts +1 -0
  103. package/dist/utils/env.js +13 -0
  104. package/dist/utils/env.js.map +1 -0
  105. package/dist/utils/env.mjs +13 -0
  106. package/dist/utils/env.mjs.map +1 -0
  107. package/dist/utils/signals.d.ts +1 -0
  108. package/dist/utils/signals.js +19 -0
  109. package/dist/utils/signals.js.map +1 -0
  110. package/dist/utils/signals.mjs +19 -0
  111. package/dist/utils/signals.mjs.map +1 -0
  112. package/dist/utils/sse.d.ts +8 -0
  113. package/dist/utils/sse.js +151 -0
  114. package/dist/utils/sse.js.map +1 -0
  115. package/dist/utils/sse.mjs +151 -0
  116. package/dist/utils/sse.mjs.map +1 -0
  117. package/dist/utils/stream.d.ts +13 -0
  118. package/dist/utils/stream.js +109 -0
  119. package/dist/utils/stream.js.map +1 -0
  120. package/dist/utils/stream.mjs +109 -0
  121. package/dist/utils/stream.mjs.map +1 -0
  122. package/package.json +63 -0
@@ -0,0 +1,460 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { Client } from "../client.mjs";
3
+ import { overrideFetchImplementation } from "../singletons/fetch.mjs";
4
+ describe.each([['global'], ['mocked']])('Client uses %s fetch', (description) => {
5
+ let globalFetchMock;
6
+ let overriddenFetch;
7
+ let expectedFetchMock;
8
+ let unexpectedFetchMock;
9
+ beforeEach(() => {
10
+ globalFetchMock = vi.fn(() => Promise.resolve({
11
+ ok: true,
12
+ json: () => Promise.resolve({
13
+ batch_ingest_config: {
14
+ use_multipart_endpoint: true
15
+ }
16
+ }),
17
+ text: () => Promise.resolve(''),
18
+ headers: new Headers({})
19
+ }));
20
+ overriddenFetch = vi.fn(() => Promise.resolve({
21
+ ok: true,
22
+ json: () => Promise.resolve({
23
+ batch_ingest_config: {
24
+ use_multipart_endpoint: true
25
+ }
26
+ }),
27
+ text: () => Promise.resolve(''),
28
+ headers: new Headers({})
29
+ }));
30
+ expectedFetchMock = description === 'mocked' ? overriddenFetch : globalFetchMock;
31
+ unexpectedFetchMock = description === 'mocked' ? globalFetchMock : overriddenFetch;
32
+ if (description === 'mocked') {
33
+ overrideFetchImplementation(overriddenFetch);
34
+ }
35
+ else {
36
+ overrideFetchImplementation(globalFetchMock);
37
+ }
38
+ // Mock global fetch
39
+ globalThis.fetch = globalFetchMock;
40
+ });
41
+ afterEach(() => {
42
+ vi.restoreAllMocks();
43
+ });
44
+ describe('createRuns', () => {
45
+ it('should create an example with the given input and generation', async () => {
46
+ const client = new Client({ apiKey: 'test-api-key' });
47
+ const thread = await client.threads.create();
48
+ expect(expectedFetchMock).toHaveBeenCalledTimes(1);
49
+ expect(unexpectedFetchMock).not.toHaveBeenCalled();
50
+ vi.clearAllMocks(); // Clear all mocks before the next operation
51
+ // Then clear & run the function
52
+ await client.runs.create(thread.thread_id, 'somegraph', {
53
+ input: { action: 'send', message: { input: { input: 'test' } } }
54
+ });
55
+ expect(expectedFetchMock).toHaveBeenCalledTimes(1);
56
+ expect(unexpectedFetchMock).not.toHaveBeenCalled();
57
+ });
58
+ });
59
+ describe('assistants runtime capabilities', () => {
60
+ it('should fetch runtime capabilities with the expected path and signal', async () => {
61
+ const controller = new AbortController();
62
+ const payload = {
63
+ skills: [
64
+ {
65
+ id: 'skill-default',
66
+ workspaceId: 'workspace-1',
67
+ label: 'Default Skill',
68
+ meta: {
69
+ icon: {
70
+ type: 'svg',
71
+ value: '<svg viewBox="0 0 16 16" />'
72
+ }
73
+ },
74
+ default: true
75
+ }
76
+ ],
77
+ plugins: [
78
+ {
79
+ nodeKey: 'middleware-1',
80
+ provider: 'sandbox',
81
+ label: 'Sandbox',
82
+ meta: {
83
+ icon: {
84
+ type: 'svg',
85
+ value: '<svg viewBox="0 0 16 16" />'
86
+ }
87
+ },
88
+ toolNames: ['run_command']
89
+ }
90
+ ],
91
+ subAgents: [
92
+ {
93
+ nodeKey: 'researcher',
94
+ type: 'agent',
95
+ label: 'Researcher',
96
+ name: 'researcher',
97
+ description: 'Research helper',
98
+ toolNames: ['search'],
99
+ toolsetNames: ['Search Tools'],
100
+ knowledgebaseNames: ['Docs']
101
+ }
102
+ ]
103
+ };
104
+ expectedFetchMock.mockImplementationOnce(async (url, init) => {
105
+ expect(url).toBeInstanceOf(URL);
106
+ expect(url.pathname).toBe('/assistants/assistant-1/runtime-capabilities');
107
+ expect(init?.signal).toBe(controller.signal);
108
+ return {
109
+ ok: true,
110
+ status: 200,
111
+ json: () => Promise.resolve(payload),
112
+ text: () => Promise.resolve(JSON.stringify(payload)),
113
+ headers: new Headers({})
114
+ };
115
+ });
116
+ const client = new Client({ apiKey: 'test-api-key' });
117
+ await expect(client.assistants.getRuntimeCapabilities('assistant-1', {
118
+ signal: controller.signal
119
+ })).resolves.toEqual(payload);
120
+ });
121
+ it('should reject 404 responses with a status field', async () => {
122
+ expectedFetchMock.mockImplementationOnce(async () => {
123
+ return {
124
+ ok: false,
125
+ status: 404,
126
+ statusText: 'Not Found',
127
+ text: () => Promise.resolve('not found'),
128
+ headers: new Headers({})
129
+ };
130
+ });
131
+ const client = new Client({ apiKey: 'test-api-key' });
132
+ await expect(client.assistants.getRuntimeCapabilities('assistant-1')).rejects.toMatchObject({ status: 404 });
133
+ });
134
+ });
135
+ describe('sandbox managed services', () => {
136
+ it('should derive the sandbox API URL and list thread services', async () => {
137
+ const controller = new AbortController();
138
+ const payload = [
139
+ {
140
+ id: 'service-1',
141
+ conversationId: 'conversation-1',
142
+ provider: 'local-shell-sandbox',
143
+ name: 'web',
144
+ command: 'npm run dev',
145
+ workingDirectory: '/workspace/project-1',
146
+ status: 'running',
147
+ transportMode: 'http'
148
+ }
149
+ ];
150
+ expectedFetchMock.mockImplementationOnce(async (url, init) => {
151
+ expect(url).toBeInstanceOf(URL);
152
+ expect(url.origin).toBe('https://xpert.local');
153
+ expect(url.pathname).toBe('/api/sandbox/threads/thread-1/services');
154
+ expect(url.searchParams.get('organizationId')).toBe('org-1');
155
+ expect(init?.signal).toBe(controller.signal);
156
+ return {
157
+ ok: true,
158
+ status: 200,
159
+ json: () => Promise.resolve(payload),
160
+ text: () => Promise.resolve(JSON.stringify(payload)),
161
+ headers: new Headers({})
162
+ };
163
+ });
164
+ const client = new Client({
165
+ apiUrl: 'https://xpert.local/api/ai',
166
+ apiKey: 'test-api-key'
167
+ });
168
+ await expect(client.sandbox.listThreadServices('thread-1', {
169
+ organizationId: 'org-1',
170
+ signal: controller.signal
171
+ })).resolves.toEqual(payload);
172
+ });
173
+ it('should stop a thread service with the expected path', async () => {
174
+ const payload = {
175
+ id: 'service-1',
176
+ conversationId: 'conversation-1',
177
+ provider: 'local-shell-sandbox',
178
+ name: 'web',
179
+ command: 'npm run dev',
180
+ workingDirectory: '/workspace/project-1',
181
+ status: 'stopped',
182
+ transportMode: 'http'
183
+ };
184
+ expectedFetchMock.mockImplementationOnce(async (url, init) => {
185
+ expect(url).toBeInstanceOf(URL);
186
+ expect(url.pathname).toBe('/api/sandbox/threads/thread-1/services/service-1/stop');
187
+ expect(init?.method).toBe('POST');
188
+ return {
189
+ ok: true,
190
+ status: 200,
191
+ json: () => Promise.resolve(payload),
192
+ text: () => Promise.resolve(JSON.stringify(payload)),
193
+ headers: new Headers({})
194
+ };
195
+ });
196
+ const client = new Client({
197
+ apiUrl: 'https://xpert.local/api/ai/',
198
+ apiKey: 'test-api-key'
199
+ });
200
+ await expect(client.sandbox.stopThreadService('thread-1', 'service-1')).resolves.toEqual(payload);
201
+ });
202
+ it('should manage conversation services through the sandbox API', async () => {
203
+ const servicePayload = {
204
+ id: 'service-1',
205
+ conversationId: 'conversation-1',
206
+ provider: 'local-shell-sandbox',
207
+ name: 'web',
208
+ command: 'npm run dev',
209
+ workingDirectory: '/workspace/project-1',
210
+ status: 'running',
211
+ transportMode: 'http'
212
+ };
213
+ const logsPayload = { stdout: 'ready', stderr: '' };
214
+ const previewPayload = {
215
+ expiresAt: '2026-05-02T12:00:00.000Z',
216
+ previewUrl: '/api/sandbox/conversations/conversation-1/services/service-1/proxy/'
217
+ };
218
+ const expectations = [
219
+ {
220
+ path: '/api/sandbox/conversations/conversation-1/services',
221
+ method: 'GET',
222
+ payload: [servicePayload]
223
+ },
224
+ {
225
+ path: '/api/sandbox/conversations/conversation-1/services/service-1',
226
+ method: 'GET',
227
+ payload: servicePayload
228
+ },
229
+ {
230
+ path: '/api/sandbox/conversations/conversation-1/services/start',
231
+ method: 'POST',
232
+ payload: servicePayload
233
+ },
234
+ {
235
+ path: '/api/sandbox/conversations/conversation-1/services/service-1/logs',
236
+ method: 'GET',
237
+ payload: logsPayload,
238
+ tail: '120'
239
+ },
240
+ {
241
+ path: '/api/sandbox/conversations/conversation-1/services/service-1/stop',
242
+ method: 'POST',
243
+ payload: { ...servicePayload, status: 'stopped' }
244
+ },
245
+ {
246
+ path: '/api/sandbox/conversations/conversation-1/services/service-1/restart',
247
+ method: 'POST',
248
+ payload: servicePayload
249
+ },
250
+ {
251
+ path: '/api/sandbox/conversations/conversation-1/services/service-1/preview-session',
252
+ method: 'POST',
253
+ payload: previewPayload
254
+ }
255
+ ];
256
+ for (const expectation of expectations) {
257
+ expectedFetchMock.mockImplementationOnce(async (url, init) => {
258
+ expect(url.pathname).toBe(expectation.path);
259
+ expect(url.searchParams.get('organizationId')).toBe('org-1');
260
+ if (expectation.tail) {
261
+ expect(url.searchParams.get('tail')).toBe(expectation.tail);
262
+ }
263
+ expect(init?.method ?? 'GET').toBe(expectation.method);
264
+ return {
265
+ ok: true,
266
+ status: 200,
267
+ json: () => Promise.resolve(expectation.payload),
268
+ text: () => Promise.resolve(JSON.stringify(expectation.payload)),
269
+ headers: new Headers({})
270
+ };
271
+ });
272
+ }
273
+ const client = new Client({
274
+ apiUrl: 'https://xpert.local/api/ai',
275
+ apiKey: 'test-api-key'
276
+ });
277
+ const options = { organizationId: 'org-1' };
278
+ await expect(client.sandbox.listConversationServices('conversation-1', options)).resolves.toEqual([
279
+ servicePayload
280
+ ]);
281
+ await expect(client.sandbox.getConversationService('conversation-1', 'service-1', options)).resolves.toEqual(servicePayload);
282
+ await expect(client.sandbox.startConversationService('conversation-1', {
283
+ name: 'web',
284
+ command: 'npm run dev',
285
+ port: 4173
286
+ }, options)).resolves.toEqual(servicePayload);
287
+ await expect(client.sandbox.getConversationServiceLogs('conversation-1', 'service-1', { ...options, tail: 120 })).resolves.toEqual(logsPayload);
288
+ await expect(client.sandbox.stopConversationService('conversation-1', 'service-1', options)).resolves.toMatchObject({ status: 'stopped' });
289
+ await expect(client.sandbox.restartConversationService('conversation-1', 'service-1', options)).resolves.toEqual(servicePayload);
290
+ await expect(client.sandbox.createConversationServicePreviewSession('conversation-1', 'service-1', options)).resolves.toEqual(previewPayload);
291
+ expect(client.sandbox.getConversationServiceProxyUrl('conversation-1', 'service-1', 'index.html')).toBe('https://xpert.local/api/sandbox/conversations/conversation-1/services/service-1/proxy/index.html');
292
+ });
293
+ it('should manage thread services through the sandbox API', async () => {
294
+ const servicePayload = {
295
+ id: 'service-1',
296
+ conversationId: 'conversation-1',
297
+ provider: 'local-shell-sandbox',
298
+ name: 'web',
299
+ command: 'npm run dev',
300
+ workingDirectory: '/workspace/project-1',
301
+ status: 'running',
302
+ transportMode: 'http'
303
+ };
304
+ const logsPayload = { stdout: 'ready', stderr: '' };
305
+ const previewPayload = {
306
+ expiresAt: '2026-05-02T12:00:00.000Z',
307
+ previewUrl: '/api/sandbox/conversations/conversation-1/services/service-1/proxy/'
308
+ };
309
+ const expectations = [
310
+ {
311
+ path: '/api/sandbox/threads/thread-1/services/service-1',
312
+ method: 'GET',
313
+ payload: servicePayload
314
+ },
315
+ {
316
+ path: '/api/sandbox/threads/thread-1/services/start',
317
+ method: 'POST',
318
+ payload: servicePayload
319
+ },
320
+ {
321
+ path: '/api/sandbox/threads/thread-1/services/service-1/logs',
322
+ method: 'GET',
323
+ payload: logsPayload
324
+ },
325
+ {
326
+ path: '/api/sandbox/threads/thread-1/services/service-1/restart',
327
+ method: 'POST',
328
+ payload: servicePayload
329
+ },
330
+ {
331
+ path: '/api/sandbox/threads/thread-1/services/service-1/preview-session',
332
+ method: 'POST',
333
+ payload: previewPayload
334
+ }
335
+ ];
336
+ for (const expectation of expectations) {
337
+ expectedFetchMock.mockImplementationOnce(async (url, init) => {
338
+ expect(url.pathname).toBe(expectation.path);
339
+ expect(init?.method ?? 'GET').toBe(expectation.method);
340
+ return {
341
+ ok: true,
342
+ status: 200,
343
+ json: () => Promise.resolve(expectation.payload),
344
+ text: () => Promise.resolve(JSON.stringify(expectation.payload)),
345
+ headers: new Headers({})
346
+ };
347
+ });
348
+ }
349
+ const client = new Client({
350
+ apiUrl: 'https://xpert.local/api/ai',
351
+ apiKey: 'test-api-key'
352
+ });
353
+ await expect(client.sandbox.getThreadService('thread-1', 'service-1')).resolves.toEqual(servicePayload);
354
+ await expect(client.sandbox.startThreadService('thread-1', {
355
+ name: 'web',
356
+ command: 'npm run dev'
357
+ })).resolves.toEqual(servicePayload);
358
+ await expect(client.sandbox.getThreadServiceLogs('thread-1', 'service-1')).resolves.toEqual(logsPayload);
359
+ await expect(client.sandbox.restartThreadService('thread-1', 'service-1')).resolves.toEqual(servicePayload);
360
+ await expect(client.sandbox.createThreadServicePreviewSession('thread-1', 'service-1')).resolves.toEqual(previewPayload);
361
+ });
362
+ });
363
+ describe('header coalescing', () => {
364
+ it('should properly merge headers with conflicting name casing', async () => {
365
+ const client = new Client({ apiKey: 'test-api-key' });
366
+ await client.threads.fetch('/test', {
367
+ headers: { 'X-Api-Key': 'custom-value' }
368
+ });
369
+ expect(expectedFetchMock).toHaveBeenCalledWith(expect.any(URL), expect.objectContaining({
370
+ headers: expect.objectContaining({
371
+ 'x-api-key': 'custom-value'
372
+ })
373
+ }));
374
+ });
375
+ it('should properly merge headers from multiple sources', async () => {
376
+ const client = new Client({
377
+ apiKey: 'test-api-key',
378
+ defaultHeaders: {
379
+ 'x-default': 'default-value',
380
+ 'x-override': 'default-value'
381
+ }
382
+ });
383
+ await client.threads.fetch('/test', {
384
+ headers: {
385
+ 'x-custom': 'custom-value',
386
+ 'x-override': 'custom-value'
387
+ }
388
+ });
389
+ expect(expectedFetchMock).toHaveBeenCalledWith(expect.any(URL), expect.objectContaining({
390
+ headers: expect.objectContaining({
391
+ 'x-api-key': 'test-api-key',
392
+ 'x-default': 'default-value',
393
+ 'x-custom': 'custom-value',
394
+ 'x-override': 'custom-value'
395
+ })
396
+ }));
397
+ vi.clearAllMocks();
398
+ // Test with null/undefined values
399
+ await client.threads.fetch('/test', {
400
+ headers: {
401
+ 'x-null': null,
402
+ 'x-undefined': undefined,
403
+ 'x-empty': ''
404
+ }
405
+ });
406
+ expect(expectedFetchMock).toHaveBeenCalledWith(expect.any(URL), expect.objectContaining({
407
+ headers: expect.objectContaining({
408
+ 'x-api-key': 'test-api-key',
409
+ 'x-default': 'default-value'
410
+ })
411
+ }));
412
+ expect(expectedFetchMock).not.toHaveBeenCalledWith(expect.any(URL), expect.objectContaining({
413
+ headers: expect.objectContaining({
414
+ 'x-null': null,
415
+ 'x-undefined': undefined
416
+ })
417
+ }));
418
+ });
419
+ it('should handle Headers object input', async () => {
420
+ const client = new Client({ apiKey: 'test-api-key' });
421
+ const headers = new Headers();
422
+ headers.append('x-custom', 'custom-value');
423
+ headers.append('x-multi', 'value1');
424
+ headers.append('x-multi', 'value2');
425
+ await client.threads.fetch('/test', {
426
+ headers
427
+ });
428
+ expect(expectedFetchMock).toHaveBeenCalledWith(expect.any(URL), expect.objectContaining({
429
+ headers: expect.objectContaining({
430
+ 'x-api-key': 'test-api-key',
431
+ 'x-custom': 'custom-value',
432
+ 'x-multi': 'value1, value2'
433
+ })
434
+ }));
435
+ });
436
+ it('should handle array of header tuples', async () => {
437
+ const client = new Client({
438
+ apiKey: 'test-api-key',
439
+ defaultHeaders: {
440
+ 'x-custom': 'custom-value'
441
+ }
442
+ });
443
+ const headers = [
444
+ ['x-multi', 'value1'],
445
+ ['x-multi', 'value2']
446
+ ];
447
+ await client.threads.fetch('/test', {
448
+ headers
449
+ });
450
+ expect(expectedFetchMock).toHaveBeenCalledWith(expect.any(URL), expect.objectContaining({
451
+ headers: expect.objectContaining({
452
+ 'x-api-key': 'test-api-key',
453
+ 'x-custom': 'custom-value',
454
+ 'x-multi': 'value1, value2'
455
+ })
456
+ }));
457
+ });
458
+ });
459
+ });
460
+ //# sourceMappingURL=fetch.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.test.mjs","sourceRoot":"","sources":["../../src/tests/fetch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,132 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import { Readable } from 'node:stream';
3
+ import { IterableReadableStream } from "../utils/stream.js";
4
+ import { BytesLineDecoder, SSEDecoder } from "../utils/sse.js";
5
+ const gather = async (stream) => {
6
+ const results = [];
7
+ const iterator = IterableReadableStream.fromReadableStream(stream);
8
+ for await (const chunk of iterator)
9
+ results.push(chunk);
10
+ return results;
11
+ };
12
+ const textEncoder = new TextEncoder();
13
+ const textDecoder = new TextDecoder();
14
+ describe('BytesLineDecoder', () => {
15
+ const createStream = (chunks) => {
16
+ return Readable.toWeb(Readable.from(chunks));
17
+ };
18
+ test('handles single line with newline', async () => {
19
+ const input = createStream([textEncoder.encode('hello\n')]);
20
+ const decoded = input.pipeThrough(BytesLineDecoder());
21
+ const results = await gather(decoded);
22
+ expect(results.length).toBe(1);
23
+ expect(textDecoder.decode(results[0])).toBe('hello');
24
+ });
25
+ test('handles multiple lines', async () => {
26
+ const input = createStream([textEncoder.encode('line1\nline2\nline3\n')]);
27
+ const decoded = input.pipeThrough(BytesLineDecoder());
28
+ const results = await gather(decoded);
29
+ expect(results.length).toBe(3);
30
+ expect(textDecoder.decode(results[0])).toBe('line1');
31
+ expect(textDecoder.decode(results[1])).toBe('line2');
32
+ expect(textDecoder.decode(results[2])).toBe('line3');
33
+ });
34
+ test('handles split chunks', async () => {
35
+ const input = createStream([textEncoder.encode('li'), textEncoder.encode('ne1\nli'), textEncoder.encode('ne2\n')]);
36
+ const decoded = input.pipeThrough(BytesLineDecoder());
37
+ const results = await gather(decoded);
38
+ expect(results.length).toBe(2);
39
+ expect(textDecoder.decode(results[0])).toBe('line1');
40
+ expect(textDecoder.decode(results[1])).toBe('line2');
41
+ });
42
+ test('handles CR LF line endings', async () => {
43
+ const input = createStream([textEncoder.encode('line1\r\nline2\r\n')]);
44
+ const decoded = input.pipeThrough(BytesLineDecoder());
45
+ const results = await gather(decoded);
46
+ expect(results.length).toBe(2);
47
+ expect(textDecoder.decode(results[0])).toBe('line1');
48
+ expect(textDecoder.decode(results[1])).toBe('line2');
49
+ });
50
+ test('handles split CR LF', async () => {
51
+ const input = createStream([textEncoder.encode('line1\r'), textEncoder.encode('\nline2\r\n')]);
52
+ const decoded = input.pipeThrough(BytesLineDecoder());
53
+ const results = await gather(decoded);
54
+ expect(results.length).toBe(2);
55
+ expect(textDecoder.decode(results[0])).toBe('line1');
56
+ expect(textDecoder.decode(results[1])).toBe('line2');
57
+ });
58
+ test('handles stale line', async () => {
59
+ const input = createStream([textEncoder.encode('hello')]);
60
+ const decoded = input.pipeThrough(BytesLineDecoder());
61
+ const results = await gather(decoded);
62
+ expect(results.length).toBe(1);
63
+ expect(textDecoder.decode(results[0])).toBe('hello');
64
+ });
65
+ });
66
+ describe('SSEDecoder', () => {
67
+ const createStream = (lines) => {
68
+ return Readable.toWeb(Readable.from(lines.map((line) => textEncoder.encode(line))));
69
+ };
70
+ test('decodes simple event', async () => {
71
+ const input = createStream(['event: test\n', 'data: {"message": "hello"}\n', '\n']);
72
+ const decoded = input.pipeThrough(BytesLineDecoder()).pipeThrough(SSEDecoder());
73
+ const results = await gather(decoded);
74
+ expect(results.length).toBe(1);
75
+ expect(results[0]).toEqual({
76
+ event: 'test',
77
+ data: { message: 'hello' }
78
+ });
79
+ });
80
+ test('ignores comments', async () => {
81
+ const input = createStream([': this is a comment\n', 'event: test\n', 'data: {"message": "hello"}\n']);
82
+ const decoded = input.pipeThrough(BytesLineDecoder()).pipeThrough(SSEDecoder());
83
+ const results = await gather(decoded);
84
+ expect(results.length).toBe(1);
85
+ expect(results[0]).toEqual({
86
+ event: 'test',
87
+ data: { message: 'hello' }
88
+ });
89
+ });
90
+ test('handles multiple events', async () => {
91
+ const input = createStream([
92
+ 'event: test1\n',
93
+ 'data: {"message": "hello"}\n',
94
+ '\n',
95
+ 'event: test2\n',
96
+ 'data: {"message": "world"}\n',
97
+ '\n'
98
+ ]);
99
+ const decoded = input.pipeThrough(BytesLineDecoder()).pipeThrough(SSEDecoder());
100
+ const results = await gather(decoded);
101
+ expect(results.length).toBe(2);
102
+ expect(results[0]).toEqual({
103
+ event: 'test1',
104
+ data: { message: 'hello' }
105
+ });
106
+ expect(results[1]).toEqual({
107
+ event: 'test2',
108
+ data: { message: 'world' }
109
+ });
110
+ });
111
+ test('end event without data', async () => {
112
+ const input = createStream(['event: test\n']);
113
+ const decoded = input.pipeThrough(BytesLineDecoder()).pipeThrough(SSEDecoder());
114
+ const results = await gather(decoded);
115
+ expect(results.length).toBe(1);
116
+ expect(results[0]).toEqual({
117
+ event: 'test',
118
+ data: null
119
+ });
120
+ });
121
+ test('end event without newline', async () => {
122
+ const input = createStream(['event: end']);
123
+ const decoded = input.pipeThrough(BytesLineDecoder()).pipeThrough(SSEDecoder());
124
+ const results = await gather(decoded);
125
+ expect(results.length).toBe(1);
126
+ expect(results[0]).toEqual({
127
+ event: 'end',
128
+ data: null
129
+ });
130
+ });
131
+ });
132
+ //# sourceMappingURL=sse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.test.js","sourceRoot":"","sources":["../../src/tests/sse.test.ts"],"names":[],"mappings":"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"}