@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,30 @@
1
+ /**
2
+ * Knowledgebase permission levels
3
+ */
4
+ export var KnowledgebasePermission;
5
+ (function (KnowledgebasePermission) {
6
+ /**
7
+ * Only visible to you
8
+ * @default
9
+ */
10
+ KnowledgebasePermission["Private"] = "private";
11
+ /**
12
+ * Visible to all members in the organization
13
+ */
14
+ KnowledgebasePermission["Organization"] = "organization";
15
+ /**
16
+ * Visible to all members in the tenant
17
+ */
18
+ KnowledgebasePermission["Public"] = "public";
19
+ })(KnowledgebasePermission || (KnowledgebasePermission = {}));
20
+ export var AiModelTypeEnum;
21
+ (function (AiModelTypeEnum) {
22
+ AiModelTypeEnum["LLM"] = "llm";
23
+ AiModelTypeEnum["TEXT_EMBEDDING"] = "text-embedding";
24
+ AiModelTypeEnum["RERANK"] = "rerank";
25
+ AiModelTypeEnum["SPEECH2TEXT"] = "speech2text";
26
+ AiModelTypeEnum["MODERATION"] = "moderation";
27
+ AiModelTypeEnum["TTS"] = "tts";
28
+ AiModelTypeEnum["TEXT2IMG"] = "text2img";
29
+ })(AiModelTypeEnum || (AiModelTypeEnum = {}));
30
+ //# sourceMappingURL=schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.mjs","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AA+aA;;GAEG;AACH,MAAM,CAAN,IAAY,uBAcX;AAdD,WAAY,uBAAuB;IACjC;;;OAGG;IACH,8CAAmB,CAAA;IACnB;;OAEG;IACH,wDAA6B,CAAA;IAC7B;;OAEG;IACH,4CAAiB,CAAA;AACnB,CAAC,EAdW,uBAAuB,KAAvB,uBAAuB,QAclC;AA+BD,MAAM,CAAN,IAAY,eAQX;AARD,WAAY,eAAe;IACzB,8BAAW,CAAA;IACX,oDAAiC,CAAA;IACjC,oCAAiB,CAAA;IACjB,8CAA2B,CAAA;IAC3B,4CAAyB,CAAA;IACzB,8BAAW,CAAA;IACX,wCAAqB,CAAA;AACvB,CAAC,EARW,eAAe,KAAf,eAAe,QAQ1B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Overrides the fetch implementation used for LangSmith calls.
3
+ * You should use this if you need to use an implementation of fetch
4
+ * other than the default global (e.g. for dealing with proxies).
5
+ * @param fetch The new fetch function to use.
6
+ */
7
+ export declare const overrideFetchImplementation: (fetchImplementation: typeof fetch) => void;
@@ -0,0 +1,24 @@
1
+ // Wrap the default fetch call due to issues with illegal invocations
2
+ // in some environments:
3
+ // https://stackoverflow.com/questions/69876859/why-does-bind-fix-failed-to-execute-fetch-on-window-illegal-invocation-err
4
+ const DEFAULT_FETCH_IMPLEMENTATION = (...args) => fetch(...args);
5
+ const LANGSMITH_FETCH_IMPLEMENTATION_KEY = Symbol.for('lg:fetch_implementation');
6
+ /**
7
+ * Overrides the fetch implementation used for LangSmith calls.
8
+ * You should use this if you need to use an implementation of fetch
9
+ * other than the default global (e.g. for dealing with proxies).
10
+ * @param fetch The new fetch function to use.
11
+ */
12
+ export const overrideFetchImplementation = (fetchImplementation) => {
13
+ Reflect.set(globalThis, LANGSMITH_FETCH_IMPLEMENTATION_KEY, fetchImplementation);
14
+ };
15
+ /**
16
+ * @internal
17
+ */
18
+ export const _getFetchImplementation = () => {
19
+ const implementation = Reflect.get(globalThis, LANGSMITH_FETCH_IMPLEMENTATION_KEY);
20
+ if (typeof implementation !== 'function')
21
+ return DEFAULT_FETCH_IMPLEMENTATION;
22
+ return (...args) => implementation(...args);
23
+ };
24
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/singletons/fetch.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,wBAAwB;AACxB,0HAA0H;AAC1H,MAAM,4BAA4B,GAAiB,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAE9E,MAAM,kCAAkC,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,mBAAiC,EAAE,EAAE;IAC/E,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,kCAAkC,EAAE,mBAAmB,CAAC,CAAA;AAClF,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAiB,EAAE;IACxD,MAAM,cAAc,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,kCAAkC,CAAC,CAAA;IAC3F,IAAI,OAAO,cAAc,KAAK,UAAU;QAAE,OAAO,4BAA4B,CAAA;IAC7E,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAA"}
@@ -0,0 +1,24 @@
1
+ // Wrap the default fetch call due to issues with illegal invocations
2
+ // in some environments:
3
+ // https://stackoverflow.com/questions/69876859/why-does-bind-fix-failed-to-execute-fetch-on-window-illegal-invocation-err
4
+ const DEFAULT_FETCH_IMPLEMENTATION = (...args) => fetch(...args);
5
+ const LANGSMITH_FETCH_IMPLEMENTATION_KEY = Symbol.for('lg:fetch_implementation');
6
+ /**
7
+ * Overrides the fetch implementation used for LangSmith calls.
8
+ * You should use this if you need to use an implementation of fetch
9
+ * other than the default global (e.g. for dealing with proxies).
10
+ * @param fetch The new fetch function to use.
11
+ */
12
+ export const overrideFetchImplementation = (fetchImplementation) => {
13
+ Reflect.set(globalThis, LANGSMITH_FETCH_IMPLEMENTATION_KEY, fetchImplementation);
14
+ };
15
+ /**
16
+ * @internal
17
+ */
18
+ export const _getFetchImplementation = () => {
19
+ const implementation = Reflect.get(globalThis, LANGSMITH_FETCH_IMPLEMENTATION_KEY);
20
+ if (typeof implementation !== 'function')
21
+ return DEFAULT_FETCH_IMPLEMENTATION;
22
+ return (...args) => implementation(...args);
23
+ };
24
+ //# sourceMappingURL=fetch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/singletons/fetch.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,wBAAwB;AACxB,0HAA0H;AAC1H,MAAM,4BAA4B,GAAiB,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAE9E,MAAM,kCAAkC,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,mBAAiC,EAAE,EAAE;IAC/E,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,kCAAkC,EAAE,mBAAmB,CAAC,CAAA;AAClF,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAiB,EAAE;IACxD,MAAM,cAAc,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,kCAAkC,CAAC,CAAA;IAC3F,IAAI,OAAO,cAAc,KAAK,UAAU;QAAE,OAAO,4BAA4B,CAAA;IAC7E,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,460 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { Client } from "../client.js";
3
+ import { overrideFetchImplementation } from "../singletons/fetch.js";
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.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.test.js","sourceRoot":"","sources":["../../src/tests/fetch.test.ts"],"names":[],"mappings":"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"}