@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.
- package/LICENSE +21 -0
- package/dist/auth/error.d.ts +9 -0
- package/dist/auth/error.js +76 -0
- package/dist/auth/error.js.map +1 -0
- package/dist/auth/error.mjs +76 -0
- package/dist/auth/error.mjs.map +1 -0
- package/dist/auth/index.d.ts +18 -0
- package/dist/auth/index.js +35 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +35 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth/types.d.ts +297 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/types.mjs +2 -0
- package/dist/auth/types.mjs.map +1 -0
- package/dist/client.d.ts +773 -0
- package/dist/client.js +1544 -0
- package/dist/client.js.map +1 -0
- package/dist/client.mjs +1544 -0
- package/dist/client.mjs.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logging/index.d.ts +43 -0
- package/dist/logging/index.js +33 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/index.mjs +33 -0
- package/dist/logging/index.mjs.map +1 -0
- package/dist/schema.d.ts +661 -0
- package/dist/schema.js +30 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.mjs +30 -0
- package/dist/schema.mjs.map +1 -0
- package/dist/singletons/fetch.d.ts +7 -0
- package/dist/singletons/fetch.js +24 -0
- package/dist/singletons/fetch.js.map +1 -0
- package/dist/singletons/fetch.mjs +24 -0
- package/dist/singletons/fetch.mjs.map +1 -0
- package/dist/tests/fetch.test.d.ts +1 -0
- package/dist/tests/fetch.test.js +460 -0
- package/dist/tests/fetch.test.js.map +1 -0
- package/dist/tests/fetch.test.mjs +460 -0
- package/dist/tests/fetch.test.mjs.map +1 -0
- package/dist/tests/sse.test.d.ts +1 -0
- package/dist/tests/sse.test.js +132 -0
- package/dist/tests/sse.test.js.map +1 -0
- package/dist/tests/sse.test.mjs +132 -0
- package/dist/tests/sse.test.mjs.map +1 -0
- package/dist/types.d.ts +178 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/types.messages.d.ts +86 -0
- package/dist/types.messages.js +2 -0
- package/dist/types.messages.js.map +1 -0
- package/dist/types.messages.mjs +2 -0
- package/dist/types.messages.mjs.map +1 -0
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/dist/types.stream.d.ts +212 -0
- package/dist/types.stream.js +2 -0
- package/dist/types.stream.js.map +1 -0
- package/dist/types.stream.mjs +2 -0
- package/dist/types.stream.mjs.map +1 -0
- package/dist/ui/branching.d.ts +35 -0
- package/dist/ui/branching.js +143 -0
- package/dist/ui/branching.js.map +1 -0
- package/dist/ui/branching.mjs +143 -0
- package/dist/ui/branching.mjs.map +1 -0
- package/dist/ui/branching.test.d.ts +1 -0
- package/dist/ui/branching.test.js +369 -0
- package/dist/ui/branching.test.js.map +1 -0
- package/dist/ui/branching.test.mjs +369 -0
- package/dist/ui/branching.test.mjs.map +1 -0
- package/dist/ui/errors.d.ts +12 -0
- package/dist/ui/errors.js +10 -0
- package/dist/ui/errors.js.map +1 -0
- package/dist/ui/errors.mjs +10 -0
- package/dist/ui/errors.mjs.map +1 -0
- package/dist/ui/manager.d.ts +87 -0
- package/dist/ui/manager.js +158 -0
- package/dist/ui/manager.js.map +1 -0
- package/dist/ui/manager.mjs +158 -0
- package/dist/ui/manager.mjs.map +1 -0
- package/dist/ui/messages.d.ts +18 -0
- package/dist/ui/messages.js +64 -0
- package/dist/ui/messages.js.map +1 -0
- package/dist/ui/messages.mjs +64 -0
- package/dist/ui/messages.mjs.map +1 -0
- package/dist/ui/utils.d.ts +2 -0
- package/dist/ui/utils.js +11 -0
- package/dist/ui/utils.js.map +1 -0
- package/dist/ui/utils.mjs +11 -0
- package/dist/ui/utils.mjs.map +1 -0
- package/dist/utils/async_caller.d.ts +48 -0
- package/dist/utils/async_caller.js +153 -0
- package/dist/utils/async_caller.js.map +1 -0
- package/dist/utils/async_caller.mjs +153 -0
- package/dist/utils/async_caller.mjs.map +1 -0
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/env.js +13 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/env.mjs +13 -0
- package/dist/utils/env.mjs.map +1 -0
- package/dist/utils/signals.d.ts +1 -0
- package/dist/utils/signals.js +19 -0
- package/dist/utils/signals.js.map +1 -0
- package/dist/utils/signals.mjs +19 -0
- package/dist/utils/signals.mjs.map +1 -0
- package/dist/utils/sse.d.ts +8 -0
- package/dist/utils/sse.js +151 -0
- package/dist/utils/sse.js.map +1 -0
- package/dist/utils/sse.mjs +151 -0
- package/dist/utils/sse.mjs.map +1 -0
- package/dist/utils/stream.d.ts +13 -0
- package/dist/utils/stream.js +109 -0
- package/dist/utils/stream.js.map +1 -0
- package/dist/utils/stream.mjs +109 -0
- package/dist/utils/stream.mjs.map +1 -0
- package/package.json +63 -0
package/dist/schema.mjs
ADDED
|
@@ -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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"}
|