@xpert-ai/xpert-sdk 0.6.0 → 0.8.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.
@@ -0,0 +1,63 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { Client } from "../client.mjs";
3
+ const grantUrl = 'https://xpert.example/api/workspace-files/content/session/grant/01-%E8%AF%81%E6%98%8E.png';
4
+ describe('ViewHostsClient.readFileAccess', () => {
5
+ it('reads binary bytes through the configured authenticated SDK transport', async () => {
6
+ const bytes = new Uint8Array([137, 80, 78, 71, 0, 255]);
7
+ const fetchMock = vi.fn().mockResolvedValue(new Response(bytes, {
8
+ headers: { 'content-type': 'image/png' },
9
+ }));
10
+ const onRequest = vi.fn((url, init) => ({
11
+ ...init,
12
+ headers: { ...init.headers, 'x-test-context': 'current' },
13
+ }));
14
+ const client = new Client({
15
+ apiUrl: 'https://xpert.example/api/ai',
16
+ onRequest,
17
+ callerOptions: { fetch: fetchMock, maxRetries: 0 },
18
+ });
19
+ const signal = new AbortController().signal;
20
+ const blob = await client.viewHosts.readFileAccess(grantUrl, { signal });
21
+ expect(blob.type).toBe('image/png');
22
+ expect(new Uint8Array(await blob.arrayBuffer())).toEqual(bytes);
23
+ const [url, init] = fetchMock.mock.calls[0];
24
+ expect(String(url)).toBe(grantUrl);
25
+ expect(init).toMatchObject({
26
+ credentials: 'include',
27
+ redirect: 'error',
28
+ signal,
29
+ headers: { 'x-test-context': 'current' },
30
+ });
31
+ expect(onRequest).toHaveBeenCalledOnce();
32
+ });
33
+ it.each([
34
+ 'https://other.example/api/workspace-files/content/session/grant/image.png',
35
+ 'https://xpert.example/api/ai/threads',
36
+ 'https://xpert.example/api/workspace-files/content/../../ai/threads',
37
+ 'https://xpert.example/api/workspace-files/content/session/grant/image.png?token=secret',
38
+ 'https://user:password@xpert.example/api/workspace-files/content/session/grant/image.png',
39
+ 'data:image/png;base64,AAAA',
40
+ ])('rejects non-grant URLs before credentials are attached: %s', async (url) => {
41
+ const fetchMock = vi.fn();
42
+ const onRequest = vi.fn();
43
+ const client = new Client({
44
+ apiUrl: 'https://xpert.example/api/ai',
45
+ onRequest,
46
+ callerOptions: { fetch: fetchMock, maxRetries: 0 },
47
+ });
48
+ await expect(client.viewHosts.readFileAccess(url)).rejects.toThrow();
49
+ expect(onRequest).not.toHaveBeenCalled();
50
+ expect(fetchMock).not.toHaveBeenCalled();
51
+ });
52
+ it('propagates access-denied responses instead of returning an error page as an image', async () => {
53
+ const client = new Client({
54
+ apiUrl: 'https://xpert.example/api/ai',
55
+ callerOptions: {
56
+ fetch: vi.fn().mockResolvedValue(new Response('Forbidden', { status: 403 })),
57
+ maxRetries: 0,
58
+ },
59
+ });
60
+ await expect(client.viewHosts.readFileAccess(grantUrl)).rejects.toThrow();
61
+ });
62
+ });
63
+ //# sourceMappingURL=view-file-content.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-file-content.test.mjs","sourceRoot":"","sources":["../../src/tests/view-file-content.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TMessageContentResourceCard } from './resource-card.js';
2
+ /** Complete discovery snapshot. Reconnect replaces discovery state; tokens use runs.joinStream. */
3
+ export interface ThreadActivitySnapshot {
4
+ version: 1;
5
+ threadId: string;
6
+ runs: Array<{
7
+ id: string;
8
+ status: string;
9
+ updatedAt: string;
10
+ createdAt: string;
11
+ messageRevision: string;
12
+ }>;
13
+ cards: TMessageContentResourceCard[];
14
+ }
15
+ export declare function isThreadActivitySnapshot(value: unknown): value is ThreadActivitySnapshot;
@@ -0,0 +1,15 @@
1
+ export function isThreadActivitySnapshot(value) {
2
+ if (!value || typeof value !== 'object' || !('version' in value) || value.version !== 1 ||
3
+ !('threadId' in value) || typeof value.threadId !== 'string' ||
4
+ !('runs' in value) || !Array.isArray(value.runs) ||
5
+ !('cards' in value) || !Array.isArray(value.cards))
6
+ return false;
7
+ // Card payloads use the shared resource-card parser at the rendering boundary.
8
+ return value.runs.every((run) => !!run && typeof run === 'object' &&
9
+ 'id' in run && typeof run.id === 'string' &&
10
+ 'status' in run && typeof run.status === 'string' &&
11
+ 'createdAt' in run && typeof run.createdAt === 'string' &&
12
+ 'updatedAt' in run && typeof run.updatedAt === 'string' &&
13
+ 'messageRevision' in run && typeof run.messageRevision === 'string');
14
+ }
15
+ //# sourceMappingURL=thread-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-activity.js","sourceRoot":"","sources":["../src/thread-activity.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC;QACnF,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAC5D,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAChD,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,+EAA+E;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QACxE,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QACzC,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QACjD,WAAW,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACvD,WAAW,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACvD,iBAAiB,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,15 @@
1
+ export function isThreadActivitySnapshot(value) {
2
+ if (!value || typeof value !== 'object' || !('version' in value) || value.version !== 1 ||
3
+ !('threadId' in value) || typeof value.threadId !== 'string' ||
4
+ !('runs' in value) || !Array.isArray(value.runs) ||
5
+ !('cards' in value) || !Array.isArray(value.cards))
6
+ return false;
7
+ // Card payloads use the shared resource-card parser at the rendering boundary.
8
+ return value.runs.every((run) => !!run && typeof run === 'object' &&
9
+ 'id' in run && typeof run.id === 'string' &&
10
+ 'status' in run && typeof run.status === 'string' &&
11
+ 'createdAt' in run && typeof run.createdAt === 'string' &&
12
+ 'updatedAt' in run && typeof run.updatedAt === 'string' &&
13
+ 'messageRevision' in run && typeof run.messageRevision === 'string');
14
+ }
15
+ //# sourceMappingURL=thread-activity.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-activity.mjs","sourceRoot":"","sources":["../src/thread-activity.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC;QACnF,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAC5D,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAChD,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,+EAA+E;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QACxE,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QACzC,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QACjD,WAAW,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACvD,WAAW,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACvD,iBAAiB,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC;AACzE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xpert-ai/xpert-sdk",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "SDK Core functionality package",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",