@axiom-lattice/client-sdk 5.0.1 → 6.0.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/dist/__tests__/commands.test.d.ts +2 -0
- package/dist/__tests__/commands.test.d.ts.map +1 -0
- package/dist/__tests__/commands.test.js +96 -0
- package/dist/__tests__/commands.test.js.map +1 -0
- package/dist/__tests__/crons.test.d.ts +2 -0
- package/dist/__tests__/crons.test.d.ts.map +1 -0
- package/dist/__tests__/crons.test.js +103 -0
- package/dist/__tests__/crons.test.js.map +1 -0
- package/dist/__tests__/info.test.d.ts +2 -0
- package/dist/__tests__/info.test.d.ts.map +1 -0
- package/dist/__tests__/info.test.js +109 -0
- package/dist/__tests__/info.test.js.map +1 -0
- package/dist/__tests__/project-rooms.test.js +12 -0
- package/dist/__tests__/project-rooms.test.js.map +1 -1
- package/dist/__tests__/resume-last-event-id.test.d.ts +2 -0
- package/dist/__tests__/resume-last-event-id.test.d.ts.map +1 -0
- package/dist/__tests__/resume-last-event-id.test.js +111 -0
- package/dist/__tests__/resume-last-event-id.test.js.map +1 -0
- package/dist/__tests__/resume-stream-http-error.test.d.ts +2 -0
- package/dist/__tests__/resume-stream-http-error.test.d.ts.map +1 -0
- package/dist/__tests__/resume-stream-http-error.test.js +45 -0
- package/dist/__tests__/resume-stream-http-error.test.js.map +1 -0
- package/dist/__tests__/runs-task-queue.test.d.ts +2 -0
- package/dist/__tests__/runs-task-queue.test.d.ts.map +1 -0
- package/dist/__tests__/runs-task-queue.test.js +159 -0
- package/dist/__tests__/runs-task-queue.test.js.map +1 -0
- package/dist/__tests__/runs.test.d.ts +2 -0
- package/dist/__tests__/runs.test.d.ts.map +1 -0
- package/dist/__tests__/runs.test.js +135 -0
- package/dist/__tests__/runs.test.js.map +1 -0
- package/dist/__tests__/runtime-client.test.js +29 -0
- package/dist/__tests__/runtime-client.test.js.map +1 -1
- package/dist/__tests__/store.test.d.ts +2 -0
- package/dist/__tests__/store.test.d.ts.map +1 -0
- package/dist/__tests__/store.test.js +100 -0
- package/dist/__tests__/store.test.js.map +1 -0
- package/dist/__tests__/thread-event-stream.test.d.ts +2 -0
- package/dist/__tests__/thread-event-stream.test.d.ts.map +1 -0
- package/dist/__tests__/thread-event-stream.test.js +109 -0
- package/dist/__tests__/thread-event-stream.test.js.map +1 -0
- package/dist/__tests__/thread-maintenance.test.d.ts +2 -0
- package/dist/__tests__/thread-maintenance.test.d.ts.map +1 -0
- package/dist/__tests__/thread-maintenance.test.js +98 -0
- package/dist/__tests__/thread-maintenance.test.js.map +1 -0
- package/dist/abstract-client.d.ts +234 -1
- package/dist/abstract-client.d.ts.map +1 -1
- package/dist/abstract-client.js +406 -1
- package/dist/abstract-client.js.map +1 -1
- package/dist/client.d.ts +9 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +35 -5
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +588 -3
- package/dist/index.js +622 -121
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +622 -121
- package/dist/index.mjs.map +1 -1
- package/dist/project-rooms.d.ts +3 -0
- package/dist/project-rooms.d.ts.map +1 -1
- package/dist/project-rooms.js +1 -0
- package/dist/project-rooms.js.map +1 -1
- package/dist/runtime-client.d.ts.map +1 -1
- package/dist/runtime-client.js +2 -6
- package/dist/runtime-client.js.map +1 -1
- package/dist/types.d.ts +342 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { Client } from "../client";
|
|
2
|
+
const mockFetch = jest.fn();
|
|
3
|
+
global.fetch = mockFetch;
|
|
4
|
+
function makeClient() {
|
|
5
|
+
return new Client({
|
|
6
|
+
baseURL: "http://localhost:3000",
|
|
7
|
+
apiKey: "test-key",
|
|
8
|
+
assistantId: "agent-1",
|
|
9
|
+
transport: "sse",
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function response(body, status = 200) {
|
|
13
|
+
mockFetch.mockResolvedValue({
|
|
14
|
+
ok: status >= 200 && status < 300,
|
|
15
|
+
status,
|
|
16
|
+
json: async () => body,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function lastFetch() {
|
|
20
|
+
return mockFetch.mock.calls[mockFetch.mock.calls.length - 1];
|
|
21
|
+
}
|
|
22
|
+
const pendingRun = {
|
|
23
|
+
runId: "run-1",
|
|
24
|
+
status: "pending",
|
|
25
|
+
owner: null,
|
|
26
|
+
attempts: 0,
|
|
27
|
+
error: null,
|
|
28
|
+
cancelRequested: false,
|
|
29
|
+
createdAt: 10,
|
|
30
|
+
updatedAt: 10,
|
|
31
|
+
startedAt: null,
|
|
32
|
+
finishedAt: null,
|
|
33
|
+
};
|
|
34
|
+
const runningRun = {
|
|
35
|
+
runId: "run-1",
|
|
36
|
+
status: "running",
|
|
37
|
+
owner: "replica-a",
|
|
38
|
+
attempts: 1,
|
|
39
|
+
error: null,
|
|
40
|
+
cancelRequested: false,
|
|
41
|
+
createdAt: 10,
|
|
42
|
+
updatedAt: 20,
|
|
43
|
+
startedAt: 15,
|
|
44
|
+
finishedAt: null,
|
|
45
|
+
};
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
jest.clearAllMocks();
|
|
48
|
+
});
|
|
49
|
+
describe("Client.runs task queue", () => {
|
|
50
|
+
it("creates a command run and sends multitask_strategy", async () => {
|
|
51
|
+
const created = { runId: "run-command", status: "pending" };
|
|
52
|
+
response({ success: true, data: created }, 202);
|
|
53
|
+
const resume = { "0123456789abcdef0123456789abcdef": { action: "approve" } };
|
|
54
|
+
const result = await makeClient().runs.create("thread-1", undefined, {
|
|
55
|
+
command: { resume },
|
|
56
|
+
config: { model: "x" },
|
|
57
|
+
multitaskStrategy: "rollback",
|
|
58
|
+
}, "agent-2");
|
|
59
|
+
const [url, init] = lastFetch();
|
|
60
|
+
expect(url).toBe("http://localhost:3000/api/assistants/agent-2/threads/thread-1/runs");
|
|
61
|
+
expect(init.method).toBe("POST");
|
|
62
|
+
expect(JSON.parse(init.body)).toEqual({
|
|
63
|
+
command: { resume },
|
|
64
|
+
config: { model: "x" },
|
|
65
|
+
multitask_strategy: "rollback",
|
|
66
|
+
});
|
|
67
|
+
expect(result).toEqual(created);
|
|
68
|
+
});
|
|
69
|
+
it("keeps input creation compatible while sending enqueue", async () => {
|
|
70
|
+
response({ success: true, data: { runId: "run-9", messageId: "message-9", status: "pending" } }, 202);
|
|
71
|
+
await makeClient().runs.create("thread-1", { message: "hello" }, { multitaskStrategy: "enqueue" });
|
|
72
|
+
expect(JSON.parse(lastFetch()[1].body)).toEqual({
|
|
73
|
+
input: { message: "hello" },
|
|
74
|
+
multitask_strategy: "enqueue",
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it.each(["reject", "interrupt"])("forwards the %s multitask strategy", async (strategy) => {
|
|
78
|
+
response({ success: true, data: { runId: "run-1", status: "pending" } }, 202);
|
|
79
|
+
await makeClient().runs.create("thread-1", { message: "hello" }, { multitaskStrategy: strategy });
|
|
80
|
+
expect(JSON.parse(lastFetch()[1].body)).toEqual({
|
|
81
|
+
input: { message: "hello" },
|
|
82
|
+
multitask_strategy: strategy,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
it("parses pending run records from list and get", async () => {
|
|
86
|
+
const client = makeClient();
|
|
87
|
+
response({ success: true, data: { runs: [pendingRun] } });
|
|
88
|
+
await expect(client.runs.list("thread-1")).resolves.toEqual([pendingRun]);
|
|
89
|
+
response({ success: true, data: pendingRun });
|
|
90
|
+
await expect(client.runs.get("thread-1", "run-1")).resolves.toEqual(pendingRun);
|
|
91
|
+
});
|
|
92
|
+
it("joins a run through the join endpoint and returns its terminal record", async () => {
|
|
93
|
+
const terminal = {
|
|
94
|
+
...runningRun,
|
|
95
|
+
status: "success",
|
|
96
|
+
finishedAt: 30,
|
|
97
|
+
cancelRequested: false,
|
|
98
|
+
};
|
|
99
|
+
response({ success: true, data: terminal });
|
|
100
|
+
const result = await makeClient().runs.join("thread-1", "run-1");
|
|
101
|
+
expect(lastFetch()[0]).toBe("http://localhost:3000/api/assistants/agent-1/threads/thread-1/runs/run-1/join");
|
|
102
|
+
expect(lastFetch()[1].method ?? "GET").toBe("GET");
|
|
103
|
+
expect(result).toEqual(terminal);
|
|
104
|
+
});
|
|
105
|
+
it.each([
|
|
106
|
+
[504, "RUN_JOIN_TIMEOUT", "Timed out waiting for the run to reach a terminal status"],
|
|
107
|
+
[404, "RUN_NOT_FOUND", "Run not found"],
|
|
108
|
+
])("surfaces join %s with its code", async (status, code, message) => {
|
|
109
|
+
response({ success: false, code, error: message }, status);
|
|
110
|
+
await expect(makeClient().runs.join("thread-1", "run-1")).rejects.toMatchObject({
|
|
111
|
+
name: "ApiError",
|
|
112
|
+
statusCode: status,
|
|
113
|
+
message,
|
|
114
|
+
responseBody: expect.objectContaining({ code }),
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
it("sends an explicit cancel action and parses interrupted", async () => {
|
|
118
|
+
const interrupted = {
|
|
119
|
+
...runningRun,
|
|
120
|
+
status: "interrupted",
|
|
121
|
+
cancelRequested: true,
|
|
122
|
+
finishedAt: 30,
|
|
123
|
+
};
|
|
124
|
+
const resultBody = {
|
|
125
|
+
success: true,
|
|
126
|
+
accepted: true,
|
|
127
|
+
status: "interrupted",
|
|
128
|
+
terminal: true,
|
|
129
|
+
run: interrupted,
|
|
130
|
+
};
|
|
131
|
+
response(resultBody);
|
|
132
|
+
const result = await makeClient().runs.cancel("thread-1", "run-1", {
|
|
133
|
+
action: "interrupt",
|
|
134
|
+
wait: true,
|
|
135
|
+
});
|
|
136
|
+
const url = new URL(lastFetch()[0]);
|
|
137
|
+
expect(url.pathname).toBe("/api/assistants/agent-1/threads/thread-1/runs/run-1/cancel");
|
|
138
|
+
expect(url.searchParams.get("action")).toBe("interrupt");
|
|
139
|
+
expect(url.searchParams.get("wait")).toBe("true");
|
|
140
|
+
expect(result).toEqual(resultBody);
|
|
141
|
+
expect(result.status).toBe("interrupted");
|
|
142
|
+
});
|
|
143
|
+
it("accepts a rolled_back cancel result with no run", async () => {
|
|
144
|
+
const resultBody = {
|
|
145
|
+
success: true,
|
|
146
|
+
accepted: true,
|
|
147
|
+
status: "rolled_back",
|
|
148
|
+
terminal: true,
|
|
149
|
+
};
|
|
150
|
+
response(resultBody);
|
|
151
|
+
const result = await makeClient().runs.cancel("thread-1", "run-1", {
|
|
152
|
+
action: "rollback",
|
|
153
|
+
});
|
|
154
|
+
expect(new URL(lastFetch()[0]).searchParams.get("action")).toBe("rollback");
|
|
155
|
+
expect(result).toEqual(resultBody);
|
|
156
|
+
expect(result.run).toBeUndefined();
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
//# sourceMappingURL=runs-task-queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs-task-queue.test.js","sourceRoot":"","sources":["../../src/__tests__/runs-task-queue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/runs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Client } from "../client";
|
|
2
|
+
const mockFetch = jest.fn();
|
|
3
|
+
global.fetch = mockFetch;
|
|
4
|
+
function makeClient() {
|
|
5
|
+
return new Client({
|
|
6
|
+
baseURL: "http://localhost:3000",
|
|
7
|
+
apiKey: "test-key",
|
|
8
|
+
assistantId: "agent-1",
|
|
9
|
+
transport: "sse",
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function response(body, status = 200) {
|
|
13
|
+
mockFetch.mockResolvedValue({
|
|
14
|
+
ok: status >= 200 && status < 300,
|
|
15
|
+
status,
|
|
16
|
+
json: async () => body,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function lastFetch() {
|
|
20
|
+
return mockFetch.mock.calls[mockFetch.mock.calls.length - 1];
|
|
21
|
+
}
|
|
22
|
+
const runningRun = {
|
|
23
|
+
runId: "run-1",
|
|
24
|
+
status: "running",
|
|
25
|
+
owner: "replica-a",
|
|
26
|
+
attempts: 1,
|
|
27
|
+
error: null,
|
|
28
|
+
cancelRequested: false,
|
|
29
|
+
createdAt: 10,
|
|
30
|
+
updatedAt: 20,
|
|
31
|
+
startedAt: 15,
|
|
32
|
+
finishedAt: null,
|
|
33
|
+
};
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
jest.clearAllMocks();
|
|
36
|
+
});
|
|
37
|
+
describe("Client.runs", () => {
|
|
38
|
+
it("creates a run and parses the 202 payload", async () => {
|
|
39
|
+
const created = {
|
|
40
|
+
runId: "run-9",
|
|
41
|
+
messageId: "message-9",
|
|
42
|
+
status: "pending",
|
|
43
|
+
};
|
|
44
|
+
response({ success: true, data: created }, 202);
|
|
45
|
+
const result = await makeClient().runs.create("thread-1", { message: "hello" }, { config: { model: "x" }, mode: "enqueue" });
|
|
46
|
+
const [url, init] = lastFetch();
|
|
47
|
+
expect(url).toBe("http://localhost:3000/api/assistants/agent-1/threads/thread-1/runs");
|
|
48
|
+
expect(init.method).toBe("POST");
|
|
49
|
+
expect(JSON.parse(init.body)).toEqual({
|
|
50
|
+
input: { message: "hello" },
|
|
51
|
+
config: { model: "x" },
|
|
52
|
+
mode: "enqueue",
|
|
53
|
+
});
|
|
54
|
+
expect(result).toEqual(created);
|
|
55
|
+
});
|
|
56
|
+
it("uses an explicit assistant id override", async () => {
|
|
57
|
+
response({ success: true, data: { runId: "run-9", messageId: "m9", status: "pending" } }, 202);
|
|
58
|
+
await makeClient().runs.create("thread-1", { message: "hello" }, undefined, "agent-2");
|
|
59
|
+
expect(lastFetch()[0]).toBe("http://localhost:3000/api/assistants/agent-2/threads/thread-1/runs");
|
|
60
|
+
});
|
|
61
|
+
it("lists and gets run records", async () => {
|
|
62
|
+
const client = makeClient();
|
|
63
|
+
response({ success: true, data: { runs: [runningRun] } });
|
|
64
|
+
await expect(client.runs.list("thread-1")).resolves.toEqual([runningRun]);
|
|
65
|
+
expect(lastFetch()[0]).toBe("http://localhost:3000/api/assistants/agent-1/threads/thread-1/runs");
|
|
66
|
+
expect(lastFetch()[1].method ?? "GET").toBe("GET");
|
|
67
|
+
response({ success: true, data: runningRun });
|
|
68
|
+
await expect(client.runs.get("thread-1", "run-1")).resolves.toEqual(runningRun);
|
|
69
|
+
expect(lastFetch()[0]).toBe("http://localhost:3000/api/assistants/agent-1/threads/thread-1/runs/run-1");
|
|
70
|
+
});
|
|
71
|
+
it("cancels with wait=true and returns a terminal status", async () => {
|
|
72
|
+
const terminalRun = {
|
|
73
|
+
...runningRun,
|
|
74
|
+
status: "cancelled",
|
|
75
|
+
cancelRequested: true,
|
|
76
|
+
finishedAt: 30,
|
|
77
|
+
};
|
|
78
|
+
const cancelled = {
|
|
79
|
+
success: true,
|
|
80
|
+
accepted: true,
|
|
81
|
+
status: "cancelled",
|
|
82
|
+
terminal: true,
|
|
83
|
+
run: terminalRun,
|
|
84
|
+
};
|
|
85
|
+
response(cancelled);
|
|
86
|
+
const result = await makeClient().runs.cancel("thread-1", "run-1", { wait: true });
|
|
87
|
+
const [url, init] = lastFetch();
|
|
88
|
+
expect(url).toBe("http://localhost:3000/api/assistants/agent-1/threads/thread-1/runs/run-1/cancel?wait=true");
|
|
89
|
+
expect(init.method).toBe("POST");
|
|
90
|
+
expect(result).toEqual(cancelled);
|
|
91
|
+
});
|
|
92
|
+
it("returns the accepted non-terminal cancel response without wait", async () => {
|
|
93
|
+
const accepted = {
|
|
94
|
+
success: true,
|
|
95
|
+
accepted: true,
|
|
96
|
+
status: "requested",
|
|
97
|
+
terminal: false,
|
|
98
|
+
run: runningRun,
|
|
99
|
+
};
|
|
100
|
+
response(accepted, 202);
|
|
101
|
+
await expect(makeClient().runs.cancel("thread-1", "run-1")).resolves.toEqual(accepted);
|
|
102
|
+
expect(lastFetch()[0]).toBe("http://localhost:3000/api/assistants/agent-1/threads/thread-1/runs/run-1/cancel");
|
|
103
|
+
});
|
|
104
|
+
it("surfaces 400, 409, and 503 API errors", async () => {
|
|
105
|
+
const client = makeClient();
|
|
106
|
+
response({ success: false, code: "COLLECT_NOT_SUPPORTED", error: "collect unsupported" }, 400);
|
|
107
|
+
await expect(client.runs.create("thread-1", { message: "hello" })).rejects.toMatchObject({
|
|
108
|
+
name: "ApiError",
|
|
109
|
+
statusCode: 400,
|
|
110
|
+
message: "collect unsupported",
|
|
111
|
+
responseBody: { success: false, code: "COLLECT_NOT_SUPPORTED", error: "collect unsupported" },
|
|
112
|
+
});
|
|
113
|
+
response({
|
|
114
|
+
success: false,
|
|
115
|
+
code: "RUN_TERMINAL",
|
|
116
|
+
error: "Run is already terminal",
|
|
117
|
+
terminal: true,
|
|
118
|
+
run: { ...runningRun, status: "success", finishedAt: 30 },
|
|
119
|
+
}, 409);
|
|
120
|
+
await expect(client.runs.cancel("thread-1", "run-1")).rejects.toMatchObject({
|
|
121
|
+
name: "ApiError",
|
|
122
|
+
statusCode: 409,
|
|
123
|
+
message: "Run is already terminal",
|
|
124
|
+
responseBody: expect.objectContaining({ code: "RUN_TERMINAL", terminal: true }),
|
|
125
|
+
});
|
|
126
|
+
response({ success: false, code: "RUN_LEDGER_UNAVAILABLE", error: "ledger unavailable" }, 503);
|
|
127
|
+
await expect(client.runs.list("thread-1")).rejects.toMatchObject({
|
|
128
|
+
name: "ApiError",
|
|
129
|
+
statusCode: 503,
|
|
130
|
+
message: "ledger unavailable",
|
|
131
|
+
responseBody: { success: false, code: "RUN_LEDGER_UNAVAILABLE", error: "ledger unavailable" },
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=runs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.test.js","sourceRoot":"","sources":["../../src/__tests__/runs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAuC,CAAC;AAChE,MAAkC,CAAC,KAAK,GAAG,SAAS,CAAC;AAEtD,SAAS,UAAU;IACjB,OAAO,IAAI,MAAM,CAAC;QAChB,OAAO,EAAE,uBAAuB;QAChC,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IAC3C,SAAS,CAAC,iBAAiB,CAAC;QAC1B,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QACjC,MAAM;QACN,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;KACX,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAA0B,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,GAAc;IAC5B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,WAAW;IAClB,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,KAAK;IACtB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,CAAC,aAAa,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,OAAO,GAAoB;YAC/B,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAC3C,UAAU,EACV,EAAE,OAAO,EAAE,OAAO,EAAE,EACpB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAC5C,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9C,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;YAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;YACtB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAE/F,MAAM,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAEvF,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACzB,oEAAoE,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACzB,oEAAoE,CACrE,CAAC;QACF,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnD,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChF,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACzB,0EAA0E,CAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,WAAW,GAAc;YAC7B,GAAG,UAAU;YACb,MAAM,EAAE,WAAW;YACnB,eAAe,EAAE,IAAI;YACrB,UAAU,EAAE,EAAE;SACf,CAAC;QACF,MAAM,SAAS,GAAoB;YACjC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,WAAW;SACjB,CAAC;QACF,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnF,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CACd,2FAA2F,CAC5F,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,QAAQ,GAAoB;YAChC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,UAAU;SAChB,CAAC;QACF,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAExB,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvF,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACzB,iFAAiF,CAClF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/F,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACvF,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,qBAAqB;YAC9B,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,qBAAqB,EAAE;SAC9F,CAAC,CAAC;QAEH,QAAQ,CACN;YACE,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,yBAAyB;YAChC,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;SAC1D,EACD,GAAG,CACJ,CAAC;QACF,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAC1E,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,yBAAyB;YAClC,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;SAChF,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/F,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAC/D,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,oBAAoB;YAC7B,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,oBAAoB,EAAE;SAC9F,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -85,6 +85,35 @@ describe("RuntimeAxiomClient", () => {
|
|
|
85
85
|
await listThreads(client);
|
|
86
86
|
expect(lastRequest()[0]).toContain("/api/web-apps/webapp_1/runtime/api/");
|
|
87
87
|
});
|
|
88
|
+
it("streams thread events through the runtime mirror with identity and cursor", async () => {
|
|
89
|
+
const client = makeUnverifiedClient();
|
|
90
|
+
mockFetch.mockResolvedValueOnce({ ok: true, status: 200, body: null });
|
|
91
|
+
const stop = client.streamThreadEvents("thread-1", { channels: ["messages"], since: "42" }, () => undefined, () => undefined);
|
|
92
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
93
|
+
const [url, init] = lastRequest();
|
|
94
|
+
expect(url).toBe("http://gw.test/api/web-apps/webapp_1/runtime/api/assistants/asst-1/threads/thread-1/stream/events");
|
|
95
|
+
expect(init.method).toBe("POST");
|
|
96
|
+
const headers = new Headers(init.headers);
|
|
97
|
+
expect(headers.get("X-Axiom-External-User-Id")).toBe("vendor-user-42");
|
|
98
|
+
expect(headers.get("Authorization")).toBeNull();
|
|
99
|
+
expect(headers.get("Accept")).toBe("text/event-stream");
|
|
100
|
+
expect(JSON.parse(init.body)).toEqual({ channels: ["messages"], since: "42" });
|
|
101
|
+
stop();
|
|
102
|
+
});
|
|
103
|
+
it("routes commands and thread status through the runtime mirror", async () => {
|
|
104
|
+
const client = makeVerifiedClient();
|
|
105
|
+
mockJsonResponse({ success: true, data: { messageId: "m1", queued: true, mode: "enqueue" } });
|
|
106
|
+
await client.commands.runStart("thread-1", {
|
|
107
|
+
input: { message: "hi" },
|
|
108
|
+
multitask_strategy: "enqueue",
|
|
109
|
+
});
|
|
110
|
+
expect(lastRequest()[0]).toBe("http://gw.test/api/web-apps/webapp_1/runtime/api/assistants/asst-1/threads/thread-1/commands");
|
|
111
|
+
expect(new Headers(lastRequest()[1].headers).get("Authorization")).toBe("Bearer tok-1");
|
|
112
|
+
mockFetch.mockClear();
|
|
113
|
+
mockJsonResponse({ success: true, data: { status: "idle", pendingMessages: 0, interrupts: [] } });
|
|
114
|
+
await client.getThreadStatus("thread-1");
|
|
115
|
+
expect(lastRequest()[0]).toBe("http://gw.test/api/web-apps/webapp_1/runtime/api/assistants/asst-1/threads/thread-1/status");
|
|
116
|
+
});
|
|
88
117
|
it("rejects an unverified identity with an empty userId", () => {
|
|
89
118
|
expect(() => new RuntimeAxiomClient({
|
|
90
119
|
gatewayUrl: "http://gw.test",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-client.test.js","sourceRoot":"","sources":["../../src/__tests__/runtime-client.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime-client.test.js","sourceRoot":"","sources":["../../src/__tests__/runtime-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Client } from "../client";
|
|
2
|
+
const mockFetch = jest.fn();
|
|
3
|
+
global.fetch = mockFetch;
|
|
4
|
+
const item = {
|
|
5
|
+
namespace: ["phase-b", "store"],
|
|
6
|
+
key: "item-1",
|
|
7
|
+
value: { message: "stored", tag: "e2e" },
|
|
8
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
9
|
+
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
10
|
+
};
|
|
11
|
+
function makeClient() {
|
|
12
|
+
return new Client({
|
|
13
|
+
baseURL: "http://localhost:3000",
|
|
14
|
+
apiKey: "test-key",
|
|
15
|
+
assistantId: "agent-1",
|
|
16
|
+
transport: "sse",
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function response(body, status = 200) {
|
|
20
|
+
mockFetch.mockResolvedValue({
|
|
21
|
+
ok: status >= 200 && status < 300,
|
|
22
|
+
status,
|
|
23
|
+
json: async () => body,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function lastFetch() {
|
|
27
|
+
return mockFetch.mock.calls[mockFetch.mock.calls.length - 1];
|
|
28
|
+
}
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
jest.clearAllMocks();
|
|
31
|
+
});
|
|
32
|
+
describe("Client.store", () => {
|
|
33
|
+
it("puts and gets an item with repeated namespace params", async () => {
|
|
34
|
+
const client = makeClient();
|
|
35
|
+
response({ success: true, data: item });
|
|
36
|
+
await expect(client.store.put({
|
|
37
|
+
namespace: item.namespace,
|
|
38
|
+
key: item.key,
|
|
39
|
+
value: item.value,
|
|
40
|
+
ttlMinutes: 10,
|
|
41
|
+
})).resolves.toEqual(item);
|
|
42
|
+
const [putUrl, putInit] = lastFetch();
|
|
43
|
+
expect(putUrl).toBe("http://localhost:3000/api/store/items");
|
|
44
|
+
expect(putInit.method).toBe("PUT");
|
|
45
|
+
expect(JSON.parse(putInit.body)).toEqual({
|
|
46
|
+
namespace: item.namespace,
|
|
47
|
+
key: item.key,
|
|
48
|
+
value: item.value,
|
|
49
|
+
ttlMinutes: 10,
|
|
50
|
+
});
|
|
51
|
+
await expect(client.store.get(["a b", "c/d"], "k&1")).resolves.toEqual(item);
|
|
52
|
+
expect(lastFetch()[0]).toBe("http://localhost:3000/api/store/items?namespace=a%20b&namespace=c%2Fd&key=k%261");
|
|
53
|
+
});
|
|
54
|
+
it("searches and lists namespaces", async () => {
|
|
55
|
+
const client = makeClient();
|
|
56
|
+
response({ success: true, data: { items: [item] } });
|
|
57
|
+
await expect(client.store.search({ namespacePrefix: ["phase-b"], query: "stored", limit: 20 }))
|
|
58
|
+
.resolves.toEqual([item]);
|
|
59
|
+
const [searchUrl, searchInit] = lastFetch();
|
|
60
|
+
expect(searchUrl).toBe("http://localhost:3000/api/store/items/search");
|
|
61
|
+
expect(searchInit.method).toBe("POST");
|
|
62
|
+
expect(JSON.parse(searchInit.body)).toEqual({
|
|
63
|
+
namespacePrefix: ["phase-b"],
|
|
64
|
+
query: "stored",
|
|
65
|
+
limit: 20,
|
|
66
|
+
});
|
|
67
|
+
response({ success: true, data: { namespaces: [["a"], ["a", "b"]] } });
|
|
68
|
+
await expect(client.store.namespaces(["a"], 5)).resolves.toEqual([["a"], ["a", "b"]]);
|
|
69
|
+
expect(lastFetch()[0]).toBe("http://localhost:3000/api/store/namespaces");
|
|
70
|
+
expect(JSON.parse(lastFetch()[1].body)).toEqual({ prefix: ["a"], limit: 5 });
|
|
71
|
+
});
|
|
72
|
+
it("deletes an item", async () => {
|
|
73
|
+
const client = makeClient();
|
|
74
|
+
response({ success: true, data: { deleted: true } });
|
|
75
|
+
await expect(client.store.delete(["a"], "k")).resolves.toBe(true);
|
|
76
|
+
const [url, init] = lastFetch();
|
|
77
|
+
expect(url).toBe("http://localhost:3000/api/store/items");
|
|
78
|
+
expect(init.method).toBe("DELETE");
|
|
79
|
+
expect(JSON.parse(init.body)).toEqual({ namespace: ["a"], key: "k" });
|
|
80
|
+
});
|
|
81
|
+
it("surfaces 404 and 400 errors using the gateway error envelope", async () => {
|
|
82
|
+
response({ success: false, error: "Store item not found" }, 404);
|
|
83
|
+
await expect(makeClient().store.get(["a"], "missing")).rejects.toMatchObject({
|
|
84
|
+
name: "ApiError",
|
|
85
|
+
statusCode: 404,
|
|
86
|
+
message: "Store item not found",
|
|
87
|
+
});
|
|
88
|
+
response({ success: false, error: "namespace must be a non-empty string array" }, 400);
|
|
89
|
+
await expect(makeClient().store.put({
|
|
90
|
+
namespace: [],
|
|
91
|
+
key: "k",
|
|
92
|
+
value: {},
|
|
93
|
+
})).rejects.toMatchObject({
|
|
94
|
+
name: "ApiError",
|
|
95
|
+
statusCode: 400,
|
|
96
|
+
message: "namespace must be a non-empty string array",
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../src/__tests__/store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-event-stream.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread-event-stream.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Client } from "../client";
|
|
2
|
+
const mockFetch = jest.fn();
|
|
3
|
+
global.fetch = mockFetch;
|
|
4
|
+
function sseBody(frames, close = true) {
|
|
5
|
+
const encoder = new TextEncoder();
|
|
6
|
+
return new ReadableStream({
|
|
7
|
+
start(controller) {
|
|
8
|
+
for (const frame of frames)
|
|
9
|
+
controller.enqueue(encoder.encode(frame));
|
|
10
|
+
if (close)
|
|
11
|
+
controller.close();
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function sseResponse(frames, close = true) {
|
|
16
|
+
return { ok: true, status: 200, headers: new Headers({ "content-type": "text/event-stream" }), body: sseBody(frames, close) };
|
|
17
|
+
}
|
|
18
|
+
async function waitFor(predicate) {
|
|
19
|
+
for (let i = 0; i < 100; i++) {
|
|
20
|
+
if (predicate())
|
|
21
|
+
return;
|
|
22
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
23
|
+
}
|
|
24
|
+
throw new Error("condition was not met");
|
|
25
|
+
}
|
|
26
|
+
function makeClient() {
|
|
27
|
+
return new Client({
|
|
28
|
+
baseURL: "http://localhost:3000",
|
|
29
|
+
apiKey: "token",
|
|
30
|
+
assistantId: "agent-1",
|
|
31
|
+
transport: "sse",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
jest.clearAllMocks();
|
|
36
|
+
});
|
|
37
|
+
describe("Client.streamThreadEvents", () => {
|
|
38
|
+
it("posts filters/headers and yields projected events", async () => {
|
|
39
|
+
const event = {
|
|
40
|
+
type: "event",
|
|
41
|
+
event_id: "e1",
|
|
42
|
+
seq: "1-0",
|
|
43
|
+
method: "messages",
|
|
44
|
+
params: { namespace: [], timestamp: 1, data: { content: "hi" } },
|
|
45
|
+
};
|
|
46
|
+
mockFetch.mockResolvedValueOnce(sseResponse([`id: 1-0\nevent: event\ndata: ${JSON.stringify(event)}\n\n`]));
|
|
47
|
+
const client = makeClient();
|
|
48
|
+
client.setTenantId("tenant-1");
|
|
49
|
+
client.setWorkspaceContext("ws-1", "p-1");
|
|
50
|
+
const onEvent = jest.fn();
|
|
51
|
+
const onError = jest.fn();
|
|
52
|
+
client.streamThreadEvents("thread-1", { channels: ["messages"], since: "0-0" }, onEvent, onError);
|
|
53
|
+
await waitFor(() => onEvent.mock.calls.length === 1);
|
|
54
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
55
|
+
expect(url).toBe("http://localhost:3000/api/assistants/agent-1/threads/thread-1/stream/events");
|
|
56
|
+
expect(init.method).toBe("POST");
|
|
57
|
+
expect(init.headers).toEqual(expect.objectContaining({
|
|
58
|
+
"Content-Type": "application/json",
|
|
59
|
+
Accept: "text/event-stream",
|
|
60
|
+
Authorization: "Bearer token",
|
|
61
|
+
"x-tenant-id": "tenant-1",
|
|
62
|
+
"x-workspace-id": "ws-1",
|
|
63
|
+
"x-project-id": "p-1",
|
|
64
|
+
}));
|
|
65
|
+
expect(JSON.parse(init.body)).toEqual({ channels: ["messages"], since: "0-0" });
|
|
66
|
+
expect(onEvent).toHaveBeenCalledWith(event);
|
|
67
|
+
expect(onError).not.toHaveBeenCalled();
|
|
68
|
+
});
|
|
69
|
+
it("surfaces CURSOR_EXPIRED error frames and stops", async () => {
|
|
70
|
+
mockFetch.mockResolvedValueOnce(sseResponse([
|
|
71
|
+
'event: error\ndata: {"type":"error","code":"CURSOR_EXPIRED","message":"gone"}\n\n',
|
|
72
|
+
]));
|
|
73
|
+
const onEvent = jest.fn();
|
|
74
|
+
const onError = jest.fn();
|
|
75
|
+
makeClient().streamThreadEvents("thread-1", {}, onEvent, onError);
|
|
76
|
+
await waitFor(() => onError.mock.calls.length === 1);
|
|
77
|
+
expect(onEvent).not.toHaveBeenCalled();
|
|
78
|
+
expect(onError.mock.calls[0][0]).toMatchObject({
|
|
79
|
+
name: "Error",
|
|
80
|
+
message: "gone",
|
|
81
|
+
code: "CURSOR_EXPIRED",
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
it("returns an abort function tied to the fetch signal", async () => {
|
|
85
|
+
mockFetch.mockResolvedValueOnce(sseResponse([], false));
|
|
86
|
+
const client = makeClient();
|
|
87
|
+
const abort = client.streamThreadEvents("thread-1", {}, jest.fn());
|
|
88
|
+
await waitFor(() => mockFetch.mock.calls.length === 1);
|
|
89
|
+
abort();
|
|
90
|
+
const signal = mockFetch.mock.calls[0][1].signal;
|
|
91
|
+
expect(signal.aborted).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
it("maps non-OK responses through onError with status and body", async () => {
|
|
94
|
+
mockFetch.mockResolvedValueOnce({
|
|
95
|
+
ok: false,
|
|
96
|
+
status: 501,
|
|
97
|
+
json: async () => ({ success: false, error: "THREAD_EVENTS_UNAVAILABLE" }),
|
|
98
|
+
});
|
|
99
|
+
const onError = jest.fn();
|
|
100
|
+
makeClient().streamThreadEvents("thread-1", {}, jest.fn(), onError);
|
|
101
|
+
await waitFor(() => onError.mock.calls.length === 1);
|
|
102
|
+
expect(onError.mock.calls[0][0]).toMatchObject({
|
|
103
|
+
message: "THREAD_EVENTS_UNAVAILABLE",
|
|
104
|
+
status: 501,
|
|
105
|
+
responseBody: { success: false, error: "THREAD_EVENTS_UNAVAILABLE" },
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=thread-event-stream.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-event-stream.test.js","sourceRoot":"","sources":["../../src/__tests__/thread-event-stream.test.ts"],"names":[],"mappings":"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"}
|