@xpert-ai/xpert-sdk 0.0.14 → 0.0.16
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/dist/auth/types.d.ts +1 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.js +210 -25
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +210 -25
- package/dist/client.mjs.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/mcp/apps.d.ts +11 -0
- package/dist/mcp/apps.js +49 -0
- package/dist/mcp/apps.js.map +1 -0
- package/dist/mcp/apps.mjs +49 -0
- package/dist/mcp/apps.mjs.map +1 -0
- package/dist/mcp/apps.test.d.ts +1 -0
- package/dist/mcp/apps.test.js +77 -0
- package/dist/mcp/apps.test.js.map +1 -0
- package/dist/mcp/apps.test.mjs +77 -0
- package/dist/mcp/apps.test.mjs.map +1 -0
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +13 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/index.mjs +13 -0
- package/dist/mcp/index.mjs.map +1 -0
- package/dist/mcp/publications.d.ts +27 -0
- package/dist/mcp/publications.js +101 -0
- package/dist/mcp/publications.js.map +1 -0
- package/dist/mcp/publications.mjs +101 -0
- package/dist/mcp/publications.mjs.map +1 -0
- package/dist/mcp/publications.test.d.ts +1 -0
- package/dist/mcp/publications.test.js +176 -0
- package/dist/mcp/publications.test.js.map +1 -0
- package/dist/mcp/publications.test.mjs +176 -0
- package/dist/mcp/publications.test.mjs.map +1 -0
- package/dist/mcp/transport.d.ts +10 -0
- package/dist/mcp/transport.js +2 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/mcp/transport.mjs +2 -0
- package/dist/mcp/transport.mjs.map +1 -0
- package/dist/mcp/types.d.ts +326 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/types.mjs +2 -0
- package/dist/mcp/types.mjs.map +1 -0
- package/dist/tests/fetch.test.js +16 -0
- package/dist/tests/fetch.test.js.map +1 -1
- package/dist/tests/fetch.test.mjs +16 -0
- package/dist/tests/fetch.test.mjs.map +1 -1
- package/dist/tests/view-hosts.test.d.ts +1 -0
- package/dist/tests/view-hosts.test.js +222 -0
- package/dist/tests/view-hosts.test.js.map +1 -0
- package/dist/tests/view-hosts.test.mjs +222 -0
- package/dist/tests/view-hosts.test.mjs.map +1 -0
- package/dist/view-extension.d.ts +428 -0
- package/dist/view-extension.js +10 -0
- package/dist/view-extension.js.map +1 -0
- package/dist/view-extension.mjs +10 -0
- package/dist/view-extension.mjs.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ASSISTANT_CHAT_SEND_MESSAGE_COMMAND, ASSISTANT_CITATION_OPEN_EVENT, ASSISTANT_CONTEXT_SET_COMMAND, Client, } from "../index.js";
|
|
3
|
+
function jsonResponse(value) {
|
|
4
|
+
return new Response(JSON.stringify(value), {
|
|
5
|
+
status: 200,
|
|
6
|
+
headers: { "content-type": "application/json" },
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
describe("ViewHostsClient", () => {
|
|
10
|
+
it("exports Remote View runtime constants and public contract types", () => {
|
|
11
|
+
const inputSchema = {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: {
|
|
14
|
+
approved: { type: "boolean" },
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
const manifest = {
|
|
18
|
+
key: "provider__view",
|
|
19
|
+
title: { en_US: "View" },
|
|
20
|
+
hostType: "agent",
|
|
21
|
+
slot: "agent.workbench.fixed",
|
|
22
|
+
source: { provider: "provider" },
|
|
23
|
+
view: { type: "raw_json" },
|
|
24
|
+
dataSource: { mode: "platform" },
|
|
25
|
+
actions: [
|
|
26
|
+
{
|
|
27
|
+
key: "approve",
|
|
28
|
+
label: { en_US: "Approve" },
|
|
29
|
+
actionType: "invoke",
|
|
30
|
+
inputSchema,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
expect(manifest.actions?.[0]?.inputSchema).toBe(inputSchema);
|
|
35
|
+
expect(ASSISTANT_CHAT_SEND_MESSAGE_COMMAND).toBe("assistant.chat.send_message");
|
|
36
|
+
expect(ASSISTANT_CONTEXT_SET_COMMAND).toBe("assistant.context.set");
|
|
37
|
+
expect(ASSISTANT_CITATION_OPEN_EVENT).toBe("assistant.citation.open");
|
|
38
|
+
});
|
|
39
|
+
it("loads slot manifests and an individual manifest", async () => {
|
|
40
|
+
const manifest = {
|
|
41
|
+
key: "provider__view",
|
|
42
|
+
title: { en_US: "View" },
|
|
43
|
+
hostType: "agent",
|
|
44
|
+
slot: "agent.workbench.fixed",
|
|
45
|
+
source: { provider: "provider" },
|
|
46
|
+
view: { type: "raw_json" },
|
|
47
|
+
dataSource: { mode: "platform" },
|
|
48
|
+
};
|
|
49
|
+
const fetchMock = vi
|
|
50
|
+
.fn()
|
|
51
|
+
.mockResolvedValueOnce(jsonResponse([manifest]))
|
|
52
|
+
.mockResolvedValueOnce(jsonResponse(manifest));
|
|
53
|
+
const client = new Client({
|
|
54
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
55
|
+
callerOptions: { fetch: fetchMock },
|
|
56
|
+
});
|
|
57
|
+
await expect(client.viewHosts.listSlotViews("agent", "agent/1", "agent.workbench.fixed")).resolves.toEqual([manifest]);
|
|
58
|
+
await expect(client.viewHosts.getManifest("agent", "agent/1", "provider__view")).resolves.toEqual(manifest);
|
|
59
|
+
expect((fetchMock.mock.calls[0]?.[0]).pathname).toBe("/api/view-hosts/agent/agent%2F1/slots/agent.workbench.fixed/views");
|
|
60
|
+
expect((fetchMock.mock.calls[1]?.[0]).pathname).toBe("/api/view-hosts/agent/agent%2F1/views/provider__view/manifest");
|
|
61
|
+
});
|
|
62
|
+
it("derives service URLs, encodes path/query values, and preserves request hooks", async () => {
|
|
63
|
+
const signal = new AbortController().signal;
|
|
64
|
+
const fetchMock = vi.fn().mockResolvedValue(jsonResponse([]));
|
|
65
|
+
const onRequest = vi.fn((_url, init) => ({
|
|
66
|
+
...init,
|
|
67
|
+
headers: { ...init.headers, "x-workspace": "workspace-1" },
|
|
68
|
+
}));
|
|
69
|
+
const client = new Client({
|
|
70
|
+
apiUrl: "https://xpert.example/api/ai/",
|
|
71
|
+
callerOptions: { fetch: fetchMock },
|
|
72
|
+
onRequest,
|
|
73
|
+
});
|
|
74
|
+
await client.viewHosts.getData("agent", "agent/1", "provider__view 1", {
|
|
75
|
+
page: 2,
|
|
76
|
+
pageSize: 25,
|
|
77
|
+
search: "quarterly report",
|
|
78
|
+
filters: [{ key: "status", operator: "eq", value: "ready" }],
|
|
79
|
+
parameters: { table: "documents", enabled: true },
|
|
80
|
+
}, { signal });
|
|
81
|
+
const [url, init] = fetchMock.mock.calls[0] ?? [];
|
|
82
|
+
expect(url).toBeInstanceOf(URL);
|
|
83
|
+
expect(url.origin).toBe("https://xpert.example");
|
|
84
|
+
expect(url.pathname).toBe("/api/view-hosts/agent/agent%2F1/views/provider__view%201/data");
|
|
85
|
+
expect(url.searchParams.get("page")).toBe("2");
|
|
86
|
+
expect(url.searchParams.get("pageSize")).toBe("25");
|
|
87
|
+
expect(url.searchParams.get("search")).toBe("quarterly report");
|
|
88
|
+
expect(JSON.parse(url.searchParams.get("filters") ?? "")).toEqual([
|
|
89
|
+
{ key: "status", operator: "eq", value: "ready" },
|
|
90
|
+
]);
|
|
91
|
+
expect(JSON.parse(url.searchParams.get("parameters") ?? "")).toEqual({
|
|
92
|
+
table: "documents",
|
|
93
|
+
enabled: true,
|
|
94
|
+
});
|
|
95
|
+
expect(init?.signal).toBe(signal);
|
|
96
|
+
expect(new Headers(init?.headers).get("x-workspace")).toBe("workspace-1");
|
|
97
|
+
expect(onRequest).toHaveBeenCalledOnce();
|
|
98
|
+
});
|
|
99
|
+
it("returns remote component entry HTML as text", async () => {
|
|
100
|
+
const fetchMock = vi
|
|
101
|
+
.fn()
|
|
102
|
+
.mockResolvedValue(new Response('<!doctype html><div id="root"></div>', { status: 200 }));
|
|
103
|
+
const client = new Client({
|
|
104
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
105
|
+
callerOptions: { fetch: fetchMock },
|
|
106
|
+
});
|
|
107
|
+
await expect(client.viewHosts.getRemoteComponentEntry("agent", "agent-1", "view-1")).resolves.toContain('id="root"');
|
|
108
|
+
const [, init] = fetchMock.mock.calls[0] ?? [];
|
|
109
|
+
expect(new Headers(init?.headers).get("accept")).toBe("text/html");
|
|
110
|
+
});
|
|
111
|
+
it("serializes JSON actions and multipart file actions", async () => {
|
|
112
|
+
const fetchMock = vi
|
|
113
|
+
.fn()
|
|
114
|
+
.mockImplementation(async () => jsonResponse({ success: true }));
|
|
115
|
+
const client = new Client({
|
|
116
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
117
|
+
callerOptions: { fetch: fetchMock },
|
|
118
|
+
});
|
|
119
|
+
await client.viewHosts.executeAction("agent", "agent-1", "view-1", "approve", {
|
|
120
|
+
targetId: "doc-1",
|
|
121
|
+
input: { approved: true },
|
|
122
|
+
parameters: { source: "review" },
|
|
123
|
+
});
|
|
124
|
+
await client.viewHosts.executeFileAction("agent", "agent-1", "view-1", "upload", {
|
|
125
|
+
file: new Uint8Array([1, 2, 3]),
|
|
126
|
+
fileName: "evidence.bin",
|
|
127
|
+
targetId: "doc-1",
|
|
128
|
+
input: { replace: true },
|
|
129
|
+
parameters: { source: "review" },
|
|
130
|
+
});
|
|
131
|
+
const [, jsonInit] = fetchMock.mock.calls[0] ?? [];
|
|
132
|
+
expect(jsonInit?.body).toBe(JSON.stringify({
|
|
133
|
+
targetId: "doc-1",
|
|
134
|
+
input: { approved: true },
|
|
135
|
+
parameters: { source: "review" },
|
|
136
|
+
}));
|
|
137
|
+
const [, fileInit] = fetchMock.mock.calls[1] ?? [];
|
|
138
|
+
expect(fileInit?.body).toBeInstanceOf(FormData);
|
|
139
|
+
const formData = fileInit?.body;
|
|
140
|
+
expect(formData.get("targetId")).toBe("doc-1");
|
|
141
|
+
expect(formData.get("input")).toBe(JSON.stringify({ replace: true }));
|
|
142
|
+
expect(formData.get("parameters")).toBe(JSON.stringify({ source: "review" }));
|
|
143
|
+
const file = formData.get("file");
|
|
144
|
+
expect(file).toBeInstanceOf(Blob);
|
|
145
|
+
expect(file.name).toBe("evidence.bin");
|
|
146
|
+
});
|
|
147
|
+
it("uses the workspace-files service and credentials for file sessions", async () => {
|
|
148
|
+
const fetchMock = vi
|
|
149
|
+
.fn()
|
|
150
|
+
.mockResolvedValueOnce(jsonResponse({
|
|
151
|
+
sessionId: "session/1",
|
|
152
|
+
expiresAt: "2030-01-01T00:00:00.000Z",
|
|
153
|
+
}))
|
|
154
|
+
.mockResolvedValueOnce(jsonResponse({
|
|
155
|
+
url: "/content/session-1/grant-1/report.pdf",
|
|
156
|
+
expiresAt: "2030-01-01T00:00:00.000Z",
|
|
157
|
+
fileName: "report.pdf",
|
|
158
|
+
mimeType: "application/pdf",
|
|
159
|
+
}))
|
|
160
|
+
.mockResolvedValueOnce(jsonResponse({ success: true }));
|
|
161
|
+
const client = new Client({
|
|
162
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
163
|
+
callerOptions: { fetch: fetchMock },
|
|
164
|
+
});
|
|
165
|
+
await client.viewHosts.createFileAccessSession("agent", "agent-1", "view-1");
|
|
166
|
+
await client.viewHosts.createFileAccessGrant("session/1", {
|
|
167
|
+
fileKey: "report",
|
|
168
|
+
purpose: "preview",
|
|
169
|
+
});
|
|
170
|
+
await client.viewHosts.revokeFileAccessSession("session/1");
|
|
171
|
+
const [createUrl, createInit] = fetchMock.mock.calls[0] ?? [];
|
|
172
|
+
expect(createUrl.pathname).toBe("/api/workspace-files/view-sessions");
|
|
173
|
+
expect(createInit?.credentials).toBe("include");
|
|
174
|
+
const [grantUrl] = fetchMock.mock.calls[1] ?? [];
|
|
175
|
+
expect(grantUrl.pathname).toBe("/api/workspace-files/view-sessions/session%2F1/grants");
|
|
176
|
+
const [revokeUrl, revokeInit] = fetchMock.mock.calls[2] ?? [];
|
|
177
|
+
expect(revokeUrl.pathname).toBe("/api/workspace-files/view-sessions/session%2F1");
|
|
178
|
+
expect(revokeInit?.credentials).toBe("include");
|
|
179
|
+
expect(revokeInit?.method).toBe("DELETE");
|
|
180
|
+
});
|
|
181
|
+
it("reuses API key, authentication, and organization headers across both services", async () => {
|
|
182
|
+
const fetchMock = vi
|
|
183
|
+
.fn()
|
|
184
|
+
.mockResolvedValueOnce(jsonResponse([]))
|
|
185
|
+
.mockResolvedValueOnce(jsonResponse({
|
|
186
|
+
sessionId: "session-1",
|
|
187
|
+
expiresAt: "2030-01-01T00:00:00.000Z",
|
|
188
|
+
}));
|
|
189
|
+
const client = new Client({
|
|
190
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
191
|
+
apiKey: "api-key-secret",
|
|
192
|
+
defaultHeaders: {
|
|
193
|
+
authorization: "Bearer secret",
|
|
194
|
+
"organization-id": "organization-1",
|
|
195
|
+
},
|
|
196
|
+
callerOptions: { fetch: fetchMock },
|
|
197
|
+
});
|
|
198
|
+
await client.viewHosts.listSlotViews("agent", "agent-1", "agent.workbench.fixed");
|
|
199
|
+
await client.viewHosts.createFileAccessSession("agent", "agent-1", "view-1");
|
|
200
|
+
for (const [, init] of fetchMock.mock.calls) {
|
|
201
|
+
const headers = new Headers(init?.headers);
|
|
202
|
+
expect(headers.get("authorization")).toBe("Bearer secret");
|
|
203
|
+
expect(headers.get("x-api-key")).toBe("api-key-secret");
|
|
204
|
+
expect(headers.get("organization-id")).toBe("organization-1");
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
it("converts remote entry HTTP errors through the shared caller", async () => {
|
|
208
|
+
const fetchMock = vi.fn().mockResolvedValue(new Response("remote entry unavailable", {
|
|
209
|
+
status: 503,
|
|
210
|
+
statusText: "Service Unavailable",
|
|
211
|
+
}));
|
|
212
|
+
const client = new Client({
|
|
213
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
214
|
+
callerOptions: { fetch: fetchMock, maxRetries: 0 },
|
|
215
|
+
});
|
|
216
|
+
await expect(client.viewHosts.getRemoteComponentEntry("agent", "agent-1", "view-1")).rejects.toMatchObject({
|
|
217
|
+
status: 503,
|
|
218
|
+
message: expect.stringContaining("remote entry unavailable"),
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
//# sourceMappingURL=view-hosts.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-hosts.test.js","sourceRoot":"","sources":["../../src/tests/view-hosts.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ASSISTANT_CHAT_SEND_MESSAGE_COMMAND, ASSISTANT_CITATION_OPEN_EVENT, ASSISTANT_CONTEXT_SET_COMMAND, Client, } from "../index.mjs";
|
|
3
|
+
function jsonResponse(value) {
|
|
4
|
+
return new Response(JSON.stringify(value), {
|
|
5
|
+
status: 200,
|
|
6
|
+
headers: { "content-type": "application/json" },
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
describe("ViewHostsClient", () => {
|
|
10
|
+
it("exports Remote View runtime constants and public contract types", () => {
|
|
11
|
+
const inputSchema = {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: {
|
|
14
|
+
approved: { type: "boolean" },
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
const manifest = {
|
|
18
|
+
key: "provider__view",
|
|
19
|
+
title: { en_US: "View" },
|
|
20
|
+
hostType: "agent",
|
|
21
|
+
slot: "agent.workbench.fixed",
|
|
22
|
+
source: { provider: "provider" },
|
|
23
|
+
view: { type: "raw_json" },
|
|
24
|
+
dataSource: { mode: "platform" },
|
|
25
|
+
actions: [
|
|
26
|
+
{
|
|
27
|
+
key: "approve",
|
|
28
|
+
label: { en_US: "Approve" },
|
|
29
|
+
actionType: "invoke",
|
|
30
|
+
inputSchema,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
expect(manifest.actions?.[0]?.inputSchema).toBe(inputSchema);
|
|
35
|
+
expect(ASSISTANT_CHAT_SEND_MESSAGE_COMMAND).toBe("assistant.chat.send_message");
|
|
36
|
+
expect(ASSISTANT_CONTEXT_SET_COMMAND).toBe("assistant.context.set");
|
|
37
|
+
expect(ASSISTANT_CITATION_OPEN_EVENT).toBe("assistant.citation.open");
|
|
38
|
+
});
|
|
39
|
+
it("loads slot manifests and an individual manifest", async () => {
|
|
40
|
+
const manifest = {
|
|
41
|
+
key: "provider__view",
|
|
42
|
+
title: { en_US: "View" },
|
|
43
|
+
hostType: "agent",
|
|
44
|
+
slot: "agent.workbench.fixed",
|
|
45
|
+
source: { provider: "provider" },
|
|
46
|
+
view: { type: "raw_json" },
|
|
47
|
+
dataSource: { mode: "platform" },
|
|
48
|
+
};
|
|
49
|
+
const fetchMock = vi
|
|
50
|
+
.fn()
|
|
51
|
+
.mockResolvedValueOnce(jsonResponse([manifest]))
|
|
52
|
+
.mockResolvedValueOnce(jsonResponse(manifest));
|
|
53
|
+
const client = new Client({
|
|
54
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
55
|
+
callerOptions: { fetch: fetchMock },
|
|
56
|
+
});
|
|
57
|
+
await expect(client.viewHosts.listSlotViews("agent", "agent/1", "agent.workbench.fixed")).resolves.toEqual([manifest]);
|
|
58
|
+
await expect(client.viewHosts.getManifest("agent", "agent/1", "provider__view")).resolves.toEqual(manifest);
|
|
59
|
+
expect((fetchMock.mock.calls[0]?.[0]).pathname).toBe("/api/view-hosts/agent/agent%2F1/slots/agent.workbench.fixed/views");
|
|
60
|
+
expect((fetchMock.mock.calls[1]?.[0]).pathname).toBe("/api/view-hosts/agent/agent%2F1/views/provider__view/manifest");
|
|
61
|
+
});
|
|
62
|
+
it("derives service URLs, encodes path/query values, and preserves request hooks", async () => {
|
|
63
|
+
const signal = new AbortController().signal;
|
|
64
|
+
const fetchMock = vi.fn().mockResolvedValue(jsonResponse([]));
|
|
65
|
+
const onRequest = vi.fn((_url, init) => ({
|
|
66
|
+
...init,
|
|
67
|
+
headers: { ...init.headers, "x-workspace": "workspace-1" },
|
|
68
|
+
}));
|
|
69
|
+
const client = new Client({
|
|
70
|
+
apiUrl: "https://xpert.example/api/ai/",
|
|
71
|
+
callerOptions: { fetch: fetchMock },
|
|
72
|
+
onRequest,
|
|
73
|
+
});
|
|
74
|
+
await client.viewHosts.getData("agent", "agent/1", "provider__view 1", {
|
|
75
|
+
page: 2,
|
|
76
|
+
pageSize: 25,
|
|
77
|
+
search: "quarterly report",
|
|
78
|
+
filters: [{ key: "status", operator: "eq", value: "ready" }],
|
|
79
|
+
parameters: { table: "documents", enabled: true },
|
|
80
|
+
}, { signal });
|
|
81
|
+
const [url, init] = fetchMock.mock.calls[0] ?? [];
|
|
82
|
+
expect(url).toBeInstanceOf(URL);
|
|
83
|
+
expect(url.origin).toBe("https://xpert.example");
|
|
84
|
+
expect(url.pathname).toBe("/api/view-hosts/agent/agent%2F1/views/provider__view%201/data");
|
|
85
|
+
expect(url.searchParams.get("page")).toBe("2");
|
|
86
|
+
expect(url.searchParams.get("pageSize")).toBe("25");
|
|
87
|
+
expect(url.searchParams.get("search")).toBe("quarterly report");
|
|
88
|
+
expect(JSON.parse(url.searchParams.get("filters") ?? "")).toEqual([
|
|
89
|
+
{ key: "status", operator: "eq", value: "ready" },
|
|
90
|
+
]);
|
|
91
|
+
expect(JSON.parse(url.searchParams.get("parameters") ?? "")).toEqual({
|
|
92
|
+
table: "documents",
|
|
93
|
+
enabled: true,
|
|
94
|
+
});
|
|
95
|
+
expect(init?.signal).toBe(signal);
|
|
96
|
+
expect(new Headers(init?.headers).get("x-workspace")).toBe("workspace-1");
|
|
97
|
+
expect(onRequest).toHaveBeenCalledOnce();
|
|
98
|
+
});
|
|
99
|
+
it("returns remote component entry HTML as text", async () => {
|
|
100
|
+
const fetchMock = vi
|
|
101
|
+
.fn()
|
|
102
|
+
.mockResolvedValue(new Response('<!doctype html><div id="root"></div>', { status: 200 }));
|
|
103
|
+
const client = new Client({
|
|
104
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
105
|
+
callerOptions: { fetch: fetchMock },
|
|
106
|
+
});
|
|
107
|
+
await expect(client.viewHosts.getRemoteComponentEntry("agent", "agent-1", "view-1")).resolves.toContain('id="root"');
|
|
108
|
+
const [, init] = fetchMock.mock.calls[0] ?? [];
|
|
109
|
+
expect(new Headers(init?.headers).get("accept")).toBe("text/html");
|
|
110
|
+
});
|
|
111
|
+
it("serializes JSON actions and multipart file actions", async () => {
|
|
112
|
+
const fetchMock = vi
|
|
113
|
+
.fn()
|
|
114
|
+
.mockImplementation(async () => jsonResponse({ success: true }));
|
|
115
|
+
const client = new Client({
|
|
116
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
117
|
+
callerOptions: { fetch: fetchMock },
|
|
118
|
+
});
|
|
119
|
+
await client.viewHosts.executeAction("agent", "agent-1", "view-1", "approve", {
|
|
120
|
+
targetId: "doc-1",
|
|
121
|
+
input: { approved: true },
|
|
122
|
+
parameters: { source: "review" },
|
|
123
|
+
});
|
|
124
|
+
await client.viewHosts.executeFileAction("agent", "agent-1", "view-1", "upload", {
|
|
125
|
+
file: new Uint8Array([1, 2, 3]),
|
|
126
|
+
fileName: "evidence.bin",
|
|
127
|
+
targetId: "doc-1",
|
|
128
|
+
input: { replace: true },
|
|
129
|
+
parameters: { source: "review" },
|
|
130
|
+
});
|
|
131
|
+
const [, jsonInit] = fetchMock.mock.calls[0] ?? [];
|
|
132
|
+
expect(jsonInit?.body).toBe(JSON.stringify({
|
|
133
|
+
targetId: "doc-1",
|
|
134
|
+
input: { approved: true },
|
|
135
|
+
parameters: { source: "review" },
|
|
136
|
+
}));
|
|
137
|
+
const [, fileInit] = fetchMock.mock.calls[1] ?? [];
|
|
138
|
+
expect(fileInit?.body).toBeInstanceOf(FormData);
|
|
139
|
+
const formData = fileInit?.body;
|
|
140
|
+
expect(formData.get("targetId")).toBe("doc-1");
|
|
141
|
+
expect(formData.get("input")).toBe(JSON.stringify({ replace: true }));
|
|
142
|
+
expect(formData.get("parameters")).toBe(JSON.stringify({ source: "review" }));
|
|
143
|
+
const file = formData.get("file");
|
|
144
|
+
expect(file).toBeInstanceOf(Blob);
|
|
145
|
+
expect(file.name).toBe("evidence.bin");
|
|
146
|
+
});
|
|
147
|
+
it("uses the workspace-files service and credentials for file sessions", async () => {
|
|
148
|
+
const fetchMock = vi
|
|
149
|
+
.fn()
|
|
150
|
+
.mockResolvedValueOnce(jsonResponse({
|
|
151
|
+
sessionId: "session/1",
|
|
152
|
+
expiresAt: "2030-01-01T00:00:00.000Z",
|
|
153
|
+
}))
|
|
154
|
+
.mockResolvedValueOnce(jsonResponse({
|
|
155
|
+
url: "/content/session-1/grant-1/report.pdf",
|
|
156
|
+
expiresAt: "2030-01-01T00:00:00.000Z",
|
|
157
|
+
fileName: "report.pdf",
|
|
158
|
+
mimeType: "application/pdf",
|
|
159
|
+
}))
|
|
160
|
+
.mockResolvedValueOnce(jsonResponse({ success: true }));
|
|
161
|
+
const client = new Client({
|
|
162
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
163
|
+
callerOptions: { fetch: fetchMock },
|
|
164
|
+
});
|
|
165
|
+
await client.viewHosts.createFileAccessSession("agent", "agent-1", "view-1");
|
|
166
|
+
await client.viewHosts.createFileAccessGrant("session/1", {
|
|
167
|
+
fileKey: "report",
|
|
168
|
+
purpose: "preview",
|
|
169
|
+
});
|
|
170
|
+
await client.viewHosts.revokeFileAccessSession("session/1");
|
|
171
|
+
const [createUrl, createInit] = fetchMock.mock.calls[0] ?? [];
|
|
172
|
+
expect(createUrl.pathname).toBe("/api/workspace-files/view-sessions");
|
|
173
|
+
expect(createInit?.credentials).toBe("include");
|
|
174
|
+
const [grantUrl] = fetchMock.mock.calls[1] ?? [];
|
|
175
|
+
expect(grantUrl.pathname).toBe("/api/workspace-files/view-sessions/session%2F1/grants");
|
|
176
|
+
const [revokeUrl, revokeInit] = fetchMock.mock.calls[2] ?? [];
|
|
177
|
+
expect(revokeUrl.pathname).toBe("/api/workspace-files/view-sessions/session%2F1");
|
|
178
|
+
expect(revokeInit?.credentials).toBe("include");
|
|
179
|
+
expect(revokeInit?.method).toBe("DELETE");
|
|
180
|
+
});
|
|
181
|
+
it("reuses API key, authentication, and organization headers across both services", async () => {
|
|
182
|
+
const fetchMock = vi
|
|
183
|
+
.fn()
|
|
184
|
+
.mockResolvedValueOnce(jsonResponse([]))
|
|
185
|
+
.mockResolvedValueOnce(jsonResponse({
|
|
186
|
+
sessionId: "session-1",
|
|
187
|
+
expiresAt: "2030-01-01T00:00:00.000Z",
|
|
188
|
+
}));
|
|
189
|
+
const client = new Client({
|
|
190
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
191
|
+
apiKey: "api-key-secret",
|
|
192
|
+
defaultHeaders: {
|
|
193
|
+
authorization: "Bearer secret",
|
|
194
|
+
"organization-id": "organization-1",
|
|
195
|
+
},
|
|
196
|
+
callerOptions: { fetch: fetchMock },
|
|
197
|
+
});
|
|
198
|
+
await client.viewHosts.listSlotViews("agent", "agent-1", "agent.workbench.fixed");
|
|
199
|
+
await client.viewHosts.createFileAccessSession("agent", "agent-1", "view-1");
|
|
200
|
+
for (const [, init] of fetchMock.mock.calls) {
|
|
201
|
+
const headers = new Headers(init?.headers);
|
|
202
|
+
expect(headers.get("authorization")).toBe("Bearer secret");
|
|
203
|
+
expect(headers.get("x-api-key")).toBe("api-key-secret");
|
|
204
|
+
expect(headers.get("organization-id")).toBe("organization-1");
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
it("converts remote entry HTTP errors through the shared caller", async () => {
|
|
208
|
+
const fetchMock = vi.fn().mockResolvedValue(new Response("remote entry unavailable", {
|
|
209
|
+
status: 503,
|
|
210
|
+
statusText: "Service Unavailable",
|
|
211
|
+
}));
|
|
212
|
+
const client = new Client({
|
|
213
|
+
apiUrl: "https://xpert.example/api/ai",
|
|
214
|
+
callerOptions: { fetch: fetchMock, maxRetries: 0 },
|
|
215
|
+
});
|
|
216
|
+
await expect(client.viewHosts.getRemoteComponentEntry("agent", "agent-1", "view-1")).rejects.toMatchObject({
|
|
217
|
+
status: 503,
|
|
218
|
+
message: expect.stringContaining("remote entry unavailable"),
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
//# sourceMappingURL=view-hosts.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-hosts.test.mjs","sourceRoot":"","sources":["../../src/tests/view-hosts.test.ts"],"names":[],"mappings":"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"}
|