@dainprotocol/service-sdk 2.0.53 → 2.0.54
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/README.md +78 -0
- package/dist/__tests__/api-sdk.test.d.ts +1 -0
- package/dist/__tests__/api-sdk.test.js +102 -0
- package/dist/__tests__/api-sdk.test.js.map +1 -0
- package/dist/__tests__/auth.test.d.ts +1 -0
- package/dist/__tests__/auth.test.js +110 -0
- package/dist/__tests__/auth.test.js.map +1 -0
- package/dist/__tests__/citations-plugin.test.d.ts +1 -0
- package/dist/__tests__/citations-plugin.test.js +491 -0
- package/dist/__tests__/citations-plugin.test.js.map +1 -0
- package/dist/__tests__/context-behavior.test.d.ts +1 -0
- package/dist/__tests__/context-behavior.test.js +290 -0
- package/dist/__tests__/context-behavior.test.js.map +1 -0
- package/dist/__tests__/convertToVercelTool.test.d.ts +1 -0
- package/dist/__tests__/convertToVercelTool.test.js +527 -0
- package/dist/__tests__/convertToVercelTool.test.js.map +1 -0
- package/dist/__tests__/core.test.d.ts +1 -0
- package/dist/__tests__/core.test.js +154 -0
- package/dist/__tests__/core.test.js.map +1 -0
- package/dist/__tests__/crypto-plugin.test.d.ts +1 -0
- package/dist/__tests__/crypto-plugin.test.js +694 -0
- package/dist/__tests__/crypto-plugin.test.js.map +1 -0
- package/dist/__tests__/humanActions.test.d.ts +1 -0
- package/dist/__tests__/humanActions.test.js +221 -0
- package/dist/__tests__/humanActions.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +1 -0
- package/dist/__tests__/integration.test.js +1573 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/mealMeSchemas.test.d.ts +576 -0
- package/dist/__tests__/mealMeSchemas.test.js +627 -0
- package/dist/__tests__/mealMeSchemas.test.js.map +1 -0
- package/dist/__tests__/oauth-context-simple.test.d.ts +1 -0
- package/dist/__tests__/oauth-context-simple.test.js +90 -0
- package/dist/__tests__/oauth-context-simple.test.js.map +1 -0
- package/dist/__tests__/oauth-context.test.d.ts +1 -0
- package/dist/__tests__/oauth-context.test.js +282 -0
- package/dist/__tests__/oauth-context.test.js.map +1 -0
- package/dist/__tests__/oauth.test.d.ts +1 -0
- package/dist/__tests__/oauth.test.js +378 -0
- package/dist/__tests__/oauth.test.js.map +1 -0
- package/dist/__tests__/oauth2-client-context.test.d.ts +1 -0
- package/dist/__tests__/oauth2-client-context.test.js +165 -0
- package/dist/__tests__/oauth2-client-context.test.js.map +1 -0
- package/dist/__tests__/oauth2-client-integration.test.d.ts +1 -0
- package/dist/__tests__/oauth2-client-integration.test.js +182 -0
- package/dist/__tests__/oauth2-client-integration.test.js.map +1 -0
- package/dist/__tests__/oauth2-client-simple.test.d.ts +1 -0
- package/dist/__tests__/oauth2-client-simple.test.js +144 -0
- package/dist/__tests__/oauth2-client-simple.test.js.map +1 -0
- package/dist/__tests__/oauth2-context.test.d.ts +1 -0
- package/dist/__tests__/oauth2-context.test.js +201 -0
- package/dist/__tests__/oauth2-context.test.js.map +1 -0
- package/dist/__tests__/oauth2-datasource.test.d.ts +1 -0
- package/dist/__tests__/oauth2-datasource.test.js +251 -0
- package/dist/__tests__/oauth2-datasource.test.js.map +1 -0
- package/dist/__tests__/plugin.test.d.ts +1 -0
- package/dist/__tests__/plugin.test.js +900 -0
- package/dist/__tests__/plugin.test.js.map +1 -0
- package/dist/__tests__/processes.test.d.ts +1 -0
- package/dist/__tests__/processes.test.js +239 -0
- package/dist/__tests__/processes.test.js.map +1 -0
- package/dist/__tests__/streaming.test.d.ts +1 -0
- package/dist/__tests__/streaming.test.js +592 -0
- package/dist/__tests__/streaming.test.js.map +1 -0
- package/dist/__tests__/testEnums.d.ts +1 -0
- package/dist/__tests__/testEnums.js +73 -0
- package/dist/__tests__/testEnums.js.map +1 -0
- package/dist/__tests__/testOptionals.test.d.ts +1 -0
- package/dist/__tests__/testOptionals.test.js +83 -0
- package/dist/__tests__/testOptionals.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +1 -0
- package/dist/__tests__/types.test.js +98 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/client/client.d.ts +18 -5
- package/dist/client/client.js +25 -4
- package/dist/client/client.js.map +1 -1
- package/dist/client/types.d.ts +38 -0
- package/dist/client/types.js +35 -1
- package/dist/client/types.js.map +1 -1
- package/dist/service/actionable-tools.d.ts +135 -0
- package/dist/service/actionable-tools.js +144 -0
- package/dist/service/actionable-tools.js.map +1 -0
- package/dist/service/direct-auth-setup.d.ts +154 -0
- package/dist/service/direct-auth-setup.js +308 -0
- package/dist/service/direct-auth-setup.js.map +1 -0
- package/dist/service/index.d.ts +3 -1
- package/dist/service/index.js +10 -1
- package/dist/service/index.js.map +1 -1
- package/dist/service/nodeService.js +2 -0
- package/dist/service/nodeService.js.map +1 -1
- package/dist/service/oauth2.d.ts +40 -1
- package/dist/service/oauth2.js +46 -0
- package/dist/service/oauth2.js.map +1 -1
- package/dist/service/oauth2Manager.d.ts +31 -4
- package/dist/service/oauth2Manager.js +119 -8
- package/dist/service/oauth2Manager.js.map +1 -1
- package/dist/service/server.js +93 -19
- package/dist/service/server.js.map +1 -1
- package/dist/service/service.js +6 -1
- package/dist/service/service.js.map +1 -1
- package/dist/service/types.d.ts +59 -0
- package/dist/service/zod-json-converter.d.ts +14 -0
- package/dist/service/zod-json-converter.js +203 -0
- package/dist/service/zod-json-converter.js.map +1 -0
- package/package.json +9 -10
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const client_auth_1 = require("@/client/client-auth");
|
|
5
|
+
const client_1 = require("@/client/client");
|
|
6
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
7
|
+
const bs58_1 = tslib_1.__importDefault(require("bs58"));
|
|
8
|
+
const nodeService_1 = require("@/service/nodeService");
|
|
9
|
+
const core_1 = require("@/service/core");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
describe("DAIN Framework Streaming", () => {
|
|
12
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
13
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
14
|
+
const address = bs58_1.default.encode(publicKey);
|
|
15
|
+
const clientPrivateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
16
|
+
const agentAuth = new client_auth_1.DainClientAuth({
|
|
17
|
+
privateKeyBase58: bs58_1.default.encode(clientPrivateKey),
|
|
18
|
+
agentId: "agent-12",
|
|
19
|
+
orgId: "org-12",
|
|
20
|
+
});
|
|
21
|
+
// Initialize the connection to the DAIN service
|
|
22
|
+
const dainConnection = new client_1.DainServiceConnection("http://localhost:4483", agentAuth);
|
|
23
|
+
// Create a test tool with streaming updates
|
|
24
|
+
const streamingTool = (0, core_1.createTool)({
|
|
25
|
+
id: "streaming-test",
|
|
26
|
+
name: "Streaming Test Tool",
|
|
27
|
+
description: "Tool to test streaming functionality",
|
|
28
|
+
input: zod_1.z.object({ message: zod_1.z.string() }),
|
|
29
|
+
output: zod_1.z.object({ result: zod_1.z.string() }),
|
|
30
|
+
handler: async ({ message }, agentInfo, context) => {
|
|
31
|
+
console.log("Starting tool handler execution");
|
|
32
|
+
// Send initial loading state
|
|
33
|
+
if (context.updateUI) {
|
|
34
|
+
console.log("Sending initial UI update");
|
|
35
|
+
await context.updateUI({ ui: { type: "loading", message: "Starting..." } });
|
|
36
|
+
console.log("Initial UI update sent");
|
|
37
|
+
}
|
|
38
|
+
// Add a delay - this is crucial for the test
|
|
39
|
+
console.log("Starting first delay");
|
|
40
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
41
|
+
console.log("First delay completed");
|
|
42
|
+
// Create a process
|
|
43
|
+
console.log("Creating process");
|
|
44
|
+
const processId = await context.app.processes.createProcess(agentInfo, "one-time", "Streaming Test", `Testing streaming with: ${message}`);
|
|
45
|
+
console.log("Process created with ID:", processId);
|
|
46
|
+
// Notify about process creation
|
|
47
|
+
if (context.addProcess) {
|
|
48
|
+
console.log("Sending process update");
|
|
49
|
+
await context.addProcess(processId);
|
|
50
|
+
console.log("Process update sent");
|
|
51
|
+
}
|
|
52
|
+
// Add another delay
|
|
53
|
+
console.log("Starting second delay");
|
|
54
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
55
|
+
console.log("Second delay completed");
|
|
56
|
+
// Send progress update
|
|
57
|
+
if (context.updateUI) {
|
|
58
|
+
console.log("Sending progress UI update");
|
|
59
|
+
await context.updateUI({ ui: { type: "progress", message: "Processing..." } });
|
|
60
|
+
console.log("Progress UI update sent");
|
|
61
|
+
}
|
|
62
|
+
// Final delay before result
|
|
63
|
+
console.log("Starting final delay");
|
|
64
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
65
|
+
console.log("Final delay completed");
|
|
66
|
+
console.log("Returning final result");
|
|
67
|
+
return {
|
|
68
|
+
text: `Streaming test completed: ${message}`,
|
|
69
|
+
data: { result: `completed-${message}` },
|
|
70
|
+
ui: null,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
// Add a streaming tool that accepts optional parameters
|
|
75
|
+
const optionalStreamingTool = (0, core_1.createTool)({
|
|
76
|
+
id: "optional-streaming-test",
|
|
77
|
+
name: "Optional Streaming Test Tool",
|
|
78
|
+
description: "Tool to test streaming with optional parameters",
|
|
79
|
+
input: zod_1.z.object({
|
|
80
|
+
message: zod_1.z.string().optional(),
|
|
81
|
+
delay: zod_1.z.number().optional()
|
|
82
|
+
}),
|
|
83
|
+
output: zod_1.z.object({ result: zod_1.z.string() }),
|
|
84
|
+
handler: async (params, agentInfo, context) => {
|
|
85
|
+
console.log("Starting optional streaming tool with params:", params);
|
|
86
|
+
// Get parameters or use defaults
|
|
87
|
+
const message = params?.message || "Default message";
|
|
88
|
+
const delay = params?.delay || 500; // Default delay
|
|
89
|
+
// Send initial loading state
|
|
90
|
+
if (context.updateUI) {
|
|
91
|
+
console.log("Sending initial UI update");
|
|
92
|
+
await context.updateUI({ ui: { type: "loading", message: "Starting optional streaming..." } });
|
|
93
|
+
}
|
|
94
|
+
// Add a delay
|
|
95
|
+
console.log(`Delaying for ${delay}ms`);
|
|
96
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
97
|
+
// Send progress update
|
|
98
|
+
if (context.updateUI) {
|
|
99
|
+
console.log("Sending progress UI update");
|
|
100
|
+
await context.updateUI({ ui: { type: "progress", message: "Processing with optional params..." } });
|
|
101
|
+
}
|
|
102
|
+
// Final delay before result
|
|
103
|
+
await new Promise(resolve => setTimeout(resolve, delay / 2));
|
|
104
|
+
console.log("Returning final result");
|
|
105
|
+
return {
|
|
106
|
+
text: `Optional streaming completed: ${message}`,
|
|
107
|
+
data: { result: `completed-${message}-with-delay-${delay}` },
|
|
108
|
+
ui: null,
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
// Create an error-throwing tool for testing
|
|
113
|
+
const errorTool = (0, core_1.createTool)({
|
|
114
|
+
id: "error-tool",
|
|
115
|
+
name: "Error Tool",
|
|
116
|
+
description: "Tool that throws errors",
|
|
117
|
+
input: zod_1.z.object({ shouldThrow: zod_1.z.boolean() }),
|
|
118
|
+
output: zod_1.z.object({ result: zod_1.z.string() }),
|
|
119
|
+
handler: async ({ shouldThrow }) => {
|
|
120
|
+
if (shouldThrow) {
|
|
121
|
+
throw new Error("Intentional test error");
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
text: "No error occurred",
|
|
125
|
+
data: { result: "success" },
|
|
126
|
+
ui: null
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
const dainService = (0, nodeService_1.defineDAINService)({
|
|
131
|
+
metadata: {
|
|
132
|
+
title: "Streaming Test Service",
|
|
133
|
+
description: "A DAIN service for testing streaming",
|
|
134
|
+
version: "1.0.0",
|
|
135
|
+
author: "Test Author",
|
|
136
|
+
tags: ["streaming", "test"],
|
|
137
|
+
},
|
|
138
|
+
identity: {
|
|
139
|
+
publicKey: bs58_1.default.encode(publicKey),
|
|
140
|
+
agentId: "streaming-agent",
|
|
141
|
+
orgId: "streaming-org",
|
|
142
|
+
privateKey: bs58_1.default.encode(privateKey),
|
|
143
|
+
},
|
|
144
|
+
tools: [streamingTool, optionalStreamingTool, errorTool],
|
|
145
|
+
});
|
|
146
|
+
let server;
|
|
147
|
+
beforeAll(async () => {
|
|
148
|
+
server = await dainService.startNode({ port: 4483 });
|
|
149
|
+
});
|
|
150
|
+
afterAll(async () => {
|
|
151
|
+
// Use a more robust approach to shutting down with proper cleanup
|
|
152
|
+
if (server) {
|
|
153
|
+
// Set a timeout for shutdown to complete
|
|
154
|
+
const timeout = setTimeout(() => {
|
|
155
|
+
console.warn('Server shutdown timed out, process may still have open handles');
|
|
156
|
+
}, 5000);
|
|
157
|
+
try {
|
|
158
|
+
await server.shutdown();
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
console.error('Error shutting down server:', err);
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
clearTimeout(timeout);
|
|
165
|
+
server = null;
|
|
166
|
+
// Wait a moment to allow any lingering connections to close
|
|
167
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
it("Sends SSE events immediately rather than buffering", async () => {
|
|
172
|
+
const events = [];
|
|
173
|
+
let lastTimestamp = Date.now();
|
|
174
|
+
// Add a longer delay before starting to ensure clean timing
|
|
175
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
176
|
+
console.log("=".repeat(80));
|
|
177
|
+
console.log("STARTING STREAMING TEST", new Date().toISOString());
|
|
178
|
+
console.log("=".repeat(80));
|
|
179
|
+
const startTime = Date.now();
|
|
180
|
+
lastTimestamp = startTime;
|
|
181
|
+
console.log("Starting test at:", new Date(lastTimestamp).toISOString());
|
|
182
|
+
const resultPromise = dainConnection.callTool("streaming-test", { message: "test message" }, {
|
|
183
|
+
onUIUpdate: (update) => {
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
const delay = now - lastTimestamp;
|
|
186
|
+
const elapsedFromStart = now - startTime;
|
|
187
|
+
console.log(`[${elapsedFromStart}ms] UI Update received:`, JSON.stringify(update.ui));
|
|
188
|
+
console.log(`Delay since last event: ${delay}ms`);
|
|
189
|
+
events.push({ type: 'ui', timestamp: now, delay, data: update.ui });
|
|
190
|
+
lastTimestamp = now;
|
|
191
|
+
},
|
|
192
|
+
onProcess: (processId) => {
|
|
193
|
+
const now = Date.now();
|
|
194
|
+
const delay = now - lastTimestamp;
|
|
195
|
+
const elapsedFromStart = now - startTime;
|
|
196
|
+
console.log(`[${elapsedFromStart}ms] Process Update received:`, processId);
|
|
197
|
+
console.log(`Delay since last event: ${delay}ms`);
|
|
198
|
+
events.push({ type: 'process', timestamp: now, delay, data: processId });
|
|
199
|
+
lastTimestamp = now;
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
// Wait for result
|
|
203
|
+
const result = await resultPromise;
|
|
204
|
+
const now = Date.now();
|
|
205
|
+
const finalDelay = now - lastTimestamp;
|
|
206
|
+
const totalTime = now - startTime;
|
|
207
|
+
console.log(`[${totalTime}ms] Final result received, delay: ${finalDelay}ms`);
|
|
208
|
+
events.push({ type: 'result', timestamp: now, delay: finalDelay, data: result });
|
|
209
|
+
// Log all events with timing info
|
|
210
|
+
console.log("\nDETAILED EVENT TIMELINE:");
|
|
211
|
+
console.log("=".repeat(80));
|
|
212
|
+
events.forEach((event, i) => {
|
|
213
|
+
const timeFromStart = event.timestamp - startTime;
|
|
214
|
+
const eventDate = new Date(event.timestamp).toISOString();
|
|
215
|
+
console.log(`Event ${i + 1}: ${event.type}`);
|
|
216
|
+
console.log(` Time: ${eventDate} (${timeFromStart}ms from start)`);
|
|
217
|
+
console.log(` Delay since previous: ${event.delay}ms`);
|
|
218
|
+
if (event.data) {
|
|
219
|
+
if (typeof event.data === 'object') {
|
|
220
|
+
console.log(` Data: ${JSON.stringify(event.data)}`);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
console.log(` Data: ${event.data}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
console.log("-".repeat(40));
|
|
227
|
+
});
|
|
228
|
+
// Verify we got all expected events
|
|
229
|
+
expect(events).toHaveLength(4);
|
|
230
|
+
// Check that events are received in the correct order
|
|
231
|
+
expect(events[0].type).toBe('ui');
|
|
232
|
+
expect(events[1].type).toBe('process');
|
|
233
|
+
expect(events[2].type).toBe('ui');
|
|
234
|
+
expect(events[3].type).toBe('result');
|
|
235
|
+
// Adjust expectations for the timing
|
|
236
|
+
// First UI update might take longer due to connection setup
|
|
237
|
+
expect(events[0].timestamp - startTime).toBeLessThan(10000);
|
|
238
|
+
// For the delays between events, we need to be more lenient
|
|
239
|
+
// as network conditions can vary, but there should be SOME delay
|
|
240
|
+
expect(events[1].delay).toBeGreaterThan(10);
|
|
241
|
+
expect(events[2].delay).toBeGreaterThan(10);
|
|
242
|
+
expect(events[3].delay).toBeGreaterThan(10);
|
|
243
|
+
// Verify spacing between events - they should align roughly with
|
|
244
|
+
// our 1000ms delays in the handler
|
|
245
|
+
const timeBetweenFirstAndProcess = events[1].timestamp - events[0].timestamp;
|
|
246
|
+
const timeBetweenProcessAndSecondUI = events[2].timestamp - events[1].timestamp;
|
|
247
|
+
const timeBetweenSecondUIAndResult = events[3].timestamp - events[2].timestamp;
|
|
248
|
+
console.log("\nTIMES BETWEEN EVENTS:");
|
|
249
|
+
console.log(`First UI to Process: ${timeBetweenFirstAndProcess}ms`);
|
|
250
|
+
console.log(`Process to Second UI: ${timeBetweenProcessAndSecondUI}ms`);
|
|
251
|
+
console.log(`Second UI to Result: ${timeBetweenSecondUIAndResult}ms`);
|
|
252
|
+
// These should each be at least 500ms given our 1000ms delays
|
|
253
|
+
// but we allow for some variance in timing
|
|
254
|
+
expect(timeBetweenFirstAndProcess).toBeGreaterThan(100);
|
|
255
|
+
expect(timeBetweenProcessAndSecondUI).toBeGreaterThan(100);
|
|
256
|
+
expect(timeBetweenSecondUIAndResult).toBeGreaterThan(100);
|
|
257
|
+
});
|
|
258
|
+
it("Maintains backwards compatibility with non-streaming clients", async () => {
|
|
259
|
+
const result = await dainConnection.callTool("streaming-test", {
|
|
260
|
+
message: "test message"
|
|
261
|
+
});
|
|
262
|
+
expect(result).toEqual({
|
|
263
|
+
text: "Streaming test completed: test message",
|
|
264
|
+
data: { result: "completed-test message" },
|
|
265
|
+
ui: null,
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
it("Can stream UI updates with callToolAndGetNewContext", async () => {
|
|
269
|
+
const events = [];
|
|
270
|
+
let lastTimestamp = Date.now();
|
|
271
|
+
// Add a longer delay before starting to ensure clean timing
|
|
272
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
273
|
+
console.log("=".repeat(80));
|
|
274
|
+
console.log("STARTING CONTEXT STREAMING TEST", new Date().toISOString());
|
|
275
|
+
console.log("=".repeat(80));
|
|
276
|
+
const startTime = Date.now();
|
|
277
|
+
lastTimestamp = startTime;
|
|
278
|
+
console.log("Starting context test at:", new Date(lastTimestamp).toISOString());
|
|
279
|
+
const resultPromise = dainConnection.callToolAndGetNewContext("streaming-test", { message: "test message" }, {
|
|
280
|
+
onUIUpdate: (update) => {
|
|
281
|
+
const now = Date.now();
|
|
282
|
+
const delay = now - lastTimestamp;
|
|
283
|
+
const elapsedFromStart = now - startTime;
|
|
284
|
+
console.log(`[${elapsedFromStart}ms] Context UI Update received:`, JSON.stringify(update.ui));
|
|
285
|
+
console.log(`Delay since last event: ${delay}ms`);
|
|
286
|
+
events.push({ type: 'ui', timestamp: now, delay, data: update.ui });
|
|
287
|
+
lastTimestamp = now;
|
|
288
|
+
},
|
|
289
|
+
onProcess: (processId) => {
|
|
290
|
+
const now = Date.now();
|
|
291
|
+
const delay = now - lastTimestamp;
|
|
292
|
+
const elapsedFromStart = now - startTime;
|
|
293
|
+
console.log(`[${elapsedFromStart}ms] Context Process Update received:`, processId);
|
|
294
|
+
console.log(`Delay since last event: ${delay}ms`);
|
|
295
|
+
events.push({ type: 'process', timestamp: now, delay, data: processId });
|
|
296
|
+
lastTimestamp = now;
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
// Wait for result
|
|
300
|
+
const result = await resultPromise;
|
|
301
|
+
const now = Date.now();
|
|
302
|
+
const finalDelay = now - lastTimestamp;
|
|
303
|
+
const totalTime = now - startTime;
|
|
304
|
+
console.log(`[${totalTime}ms] Context final result received, delay: ${finalDelay}ms`);
|
|
305
|
+
events.push({ type: 'result', timestamp: now, delay: finalDelay, data: result });
|
|
306
|
+
// Log all events with timing info
|
|
307
|
+
console.log("\nDETAILED CONTEXT EVENT TIMELINE:");
|
|
308
|
+
console.log("=".repeat(80));
|
|
309
|
+
events.forEach((event, i) => {
|
|
310
|
+
const timeFromStart = event.timestamp - startTime;
|
|
311
|
+
const eventDate = new Date(event.timestamp).toISOString();
|
|
312
|
+
console.log(`Event ${i + 1}: ${event.type}`);
|
|
313
|
+
console.log(` Time: ${eventDate} (${timeFromStart}ms from start)`);
|
|
314
|
+
console.log(` Delay since previous: ${event.delay}ms`);
|
|
315
|
+
if (event.data) {
|
|
316
|
+
if (typeof event.data === 'object') {
|
|
317
|
+
console.log(` Data: ${JSON.stringify(event.data)}`);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
console.log(` Data: ${event.data}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
console.log("-".repeat(40));
|
|
324
|
+
});
|
|
325
|
+
// Verify we got at least the UI updates
|
|
326
|
+
expect(events.length).toBeGreaterThan(1);
|
|
327
|
+
// Check if we have UI updates
|
|
328
|
+
const uiEvents = events.filter(e => e.type === 'ui');
|
|
329
|
+
expect(uiEvents.length).toBeGreaterThan(0);
|
|
330
|
+
// Check the first UI event
|
|
331
|
+
if (uiEvents.length >= 1) {
|
|
332
|
+
expect(uiEvents[0].data).toEqual({ type: "loading", message: "Starting..." });
|
|
333
|
+
}
|
|
334
|
+
// Check the second UI event if it exists
|
|
335
|
+
if (uiEvents.length >= 2) {
|
|
336
|
+
expect(uiEvents[1].data).toEqual({ type: "progress", message: "Processing..." });
|
|
337
|
+
}
|
|
338
|
+
// Verify final result
|
|
339
|
+
const resultEvent = events.find(e => e.type === 'result');
|
|
340
|
+
expect(resultEvent).toBeDefined();
|
|
341
|
+
expect(resultEvent.data.toolResult).toEqual({
|
|
342
|
+
text: "Streaming test completed: test message",
|
|
343
|
+
data: { result: "completed-test message" },
|
|
344
|
+
ui: null,
|
|
345
|
+
});
|
|
346
|
+
// If we have more than one event, check that there are delays between them
|
|
347
|
+
if (events.length > 1) {
|
|
348
|
+
for (let i = 1; i < events.length; i++) {
|
|
349
|
+
expect(events[i].delay).toBeGreaterThan(10);
|
|
350
|
+
}
|
|
351
|
+
// Calculate time between events
|
|
352
|
+
if (events.length >= 3) {
|
|
353
|
+
console.log("\nTIMES BETWEEN CONTEXT EVENTS:");
|
|
354
|
+
for (let i = 1; i < events.length; i++) {
|
|
355
|
+
const timeFromPrevious = events[i].timestamp - events[i - 1].timestamp;
|
|
356
|
+
console.log(`From ${events[i - 1].type} to ${events[i].type}: ${timeFromPrevious}ms`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
// Add test for streaming with empty parameters
|
|
362
|
+
it("Can stream updates with empty parameter calls", async () => {
|
|
363
|
+
const events = [];
|
|
364
|
+
let lastTimestamp = Date.now();
|
|
365
|
+
// Add a short delay before starting
|
|
366
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
367
|
+
console.log("=".repeat(80));
|
|
368
|
+
console.log("STARTING EMPTY PARAMS STREAMING TEST", new Date().toISOString());
|
|
369
|
+
console.log("=".repeat(80));
|
|
370
|
+
const startTime = Date.now();
|
|
371
|
+
lastTimestamp = startTime;
|
|
372
|
+
// Call with empty parameters
|
|
373
|
+
const result = await dainConnection.callTool("optional-streaming-test", {}, // Empty parameters object
|
|
374
|
+
{
|
|
375
|
+
onUIUpdate: (update) => {
|
|
376
|
+
const now = Date.now();
|
|
377
|
+
const delay = now - lastTimestamp;
|
|
378
|
+
const elapsedFromStart = now - startTime;
|
|
379
|
+
console.log(`[${elapsedFromStart}ms] Empty params UI Update:`, JSON.stringify(update.ui));
|
|
380
|
+
events.push({ type: 'ui', timestamp: now, data: update.ui });
|
|
381
|
+
lastTimestamp = now;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
const now = Date.now();
|
|
385
|
+
const totalTime = now - startTime;
|
|
386
|
+
console.log(`[${totalTime}ms] Empty params final result received`);
|
|
387
|
+
events.push({ type: 'result', timestamp: now, data: result });
|
|
388
|
+
// Verify we got UI updates
|
|
389
|
+
expect(events.length).toBeGreaterThan(1);
|
|
390
|
+
expect(events[0].type).toBe('ui');
|
|
391
|
+
// Check the result
|
|
392
|
+
expect(result.text).toBe("Optional streaming completed: Default message");
|
|
393
|
+
expect(result.data.result).toBe("completed-Default message-with-delay-500");
|
|
394
|
+
});
|
|
395
|
+
// Test with undefined parameters
|
|
396
|
+
it("Handles undefined parameters in streaming calls", async () => {
|
|
397
|
+
// Call with undefined parameters
|
|
398
|
+
const result = await dainConnection.callTool("optional-streaming-test", undefined, // Undefined parameters
|
|
399
|
+
{
|
|
400
|
+
onUIUpdate: () => { }
|
|
401
|
+
});
|
|
402
|
+
// Check the result - should use defaults
|
|
403
|
+
expect(result.text).toBe("Optional streaming completed: Default message");
|
|
404
|
+
expect(result.data.result).toBe("completed-Default message-with-delay-500");
|
|
405
|
+
});
|
|
406
|
+
it("Compares streaming between callTool and callToolAndGetNewContext", async () => {
|
|
407
|
+
const callToolEvents = [];
|
|
408
|
+
const callContextEvents = [];
|
|
409
|
+
console.log("=".repeat(80));
|
|
410
|
+
console.log("STARTING COMPARISON TEST", new Date().toISOString());
|
|
411
|
+
console.log("=".repeat(80));
|
|
412
|
+
// First use callTool with streaming
|
|
413
|
+
const toolResult = await dainConnection.callTool("streaming-test", { message: "comparison-test" }, {
|
|
414
|
+
onUIUpdate: (update) => {
|
|
415
|
+
console.log("callTool UI Update:", JSON.stringify(update.ui));
|
|
416
|
+
callToolEvents.push({ type: 'ui', data: update.ui });
|
|
417
|
+
},
|
|
418
|
+
onProcess: (processId) => {
|
|
419
|
+
console.log("callTool Process Update:", processId);
|
|
420
|
+
callToolEvents.push({ type: 'process', data: processId });
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
callToolEvents.push({ type: 'result', data: toolResult });
|
|
424
|
+
// Then use callToolAndGetNewContext with streaming
|
|
425
|
+
const contextResult = await dainConnection.callToolAndGetNewContext("streaming-test", { message: "comparison-test" }, {
|
|
426
|
+
onUIUpdate: (update) => {
|
|
427
|
+
console.log("callToolAndGetNewContext UI Update:", JSON.stringify(update.ui));
|
|
428
|
+
callContextEvents.push({ type: 'ui', data: update.ui });
|
|
429
|
+
},
|
|
430
|
+
onProcess: (processId) => {
|
|
431
|
+
console.log("callToolAndGetNewContext Process Update:", processId);
|
|
432
|
+
callContextEvents.push({ type: 'process', data: processId });
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
callContextEvents.push({ type: 'result', data: contextResult });
|
|
436
|
+
// Log all events for comparison
|
|
437
|
+
console.log("\nCALL TOOL EVENTS:");
|
|
438
|
+
console.log("-".repeat(80));
|
|
439
|
+
callToolEvents.forEach((event, i) => {
|
|
440
|
+
console.log(`Event ${i + 1}: ${event.type}`);
|
|
441
|
+
if (event.data && typeof event.data === 'object') {
|
|
442
|
+
console.log(` Data: ${JSON.stringify(event.data).substring(0, 200)}${JSON.stringify(event.data).length > 200 ? '...' : ''}`);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
console.log(` Data: ${event.data}`);
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
console.log("\nCALL TOOL AND GET NEW CONTEXT EVENTS:");
|
|
449
|
+
console.log("-".repeat(80));
|
|
450
|
+
callContextEvents.forEach((event, i) => {
|
|
451
|
+
console.log(`Event ${i + 1}: ${event.type}`);
|
|
452
|
+
if (event.data && typeof event.data === 'object') {
|
|
453
|
+
console.log(` Data: ${JSON.stringify(event.data).substring(0, 200)}${JSON.stringify(event.data).length > 200 ? '...' : ''}`);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
console.log(` Data: ${event.data}`);
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
// COMPARISONS
|
|
460
|
+
// Verify both received the same number of UI and process updates
|
|
461
|
+
expect(callToolEvents.filter(e => e.type === 'ui').length)
|
|
462
|
+
.toEqual(callContextEvents.filter(e => e.type === 'ui').length);
|
|
463
|
+
expect(callToolEvents.filter(e => e.type === 'process').length)
|
|
464
|
+
.toEqual(callContextEvents.filter(e => e.type === 'process').length);
|
|
465
|
+
// Verify UI updates were identical
|
|
466
|
+
const toolUiEvents = callToolEvents.filter(e => e.type === 'ui');
|
|
467
|
+
const contextUiEvents = callContextEvents.filter(e => e.type === 'ui');
|
|
468
|
+
toolUiEvents.forEach((toolEvent, i) => {
|
|
469
|
+
expect(toolEvent.data).toEqual(contextUiEvents[i].data);
|
|
470
|
+
});
|
|
471
|
+
// Verify process IDs follow the same format
|
|
472
|
+
const toolProcessEvents = callToolEvents.filter(e => e.type === 'process');
|
|
473
|
+
const contextProcessEvents = callContextEvents.filter(e => e.type === 'process');
|
|
474
|
+
toolProcessEvents.forEach((toolEvent, i) => {
|
|
475
|
+
expect(typeof toolEvent.data).toEqual(typeof contextProcessEvents[i].data);
|
|
476
|
+
expect(toolEvent.data).toMatch(/^service_.*_.*$/);
|
|
477
|
+
});
|
|
478
|
+
// Verify final results have the expected structure
|
|
479
|
+
const toolResultEvent = callToolEvents.find(e => e.type === 'result');
|
|
480
|
+
const contextResultEvent = callContextEvents.find(e => e.type === 'result');
|
|
481
|
+
// callTool returns the direct result
|
|
482
|
+
expect(toolResultEvent.data).toEqual({
|
|
483
|
+
text: "Streaming test completed: comparison-test",
|
|
484
|
+
data: { result: "completed-comparison-test" },
|
|
485
|
+
ui: null,
|
|
486
|
+
});
|
|
487
|
+
// callToolAndGetNewContext returns { toolResult, context }
|
|
488
|
+
expect(contextResultEvent.data).toHaveProperty('toolResult');
|
|
489
|
+
expect(contextResultEvent.data).toHaveProperty('context');
|
|
490
|
+
expect(contextResultEvent.data.toolResult).toEqual({
|
|
491
|
+
text: "Streaming test completed: comparison-test",
|
|
492
|
+
data: { result: "completed-comparison-test" },
|
|
493
|
+
ui: null,
|
|
494
|
+
});
|
|
495
|
+
expect(Array.isArray(contextResultEvent.data.context)).toBe(true);
|
|
496
|
+
}, 30000);
|
|
497
|
+
it("Tests error handling in streaming mode", async () => {
|
|
498
|
+
// Test callTool with error - we'll simulate an error by using an invalid tool ID
|
|
499
|
+
let callToolError = null;
|
|
500
|
+
try {
|
|
501
|
+
const events = [];
|
|
502
|
+
await dainConnection.callTool("non-existent-tool", { message: "error-test" }, {
|
|
503
|
+
onUIUpdate: (update) => {
|
|
504
|
+
events.push({ type: 'ui', data: update.ui });
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
catch (err) {
|
|
509
|
+
callToolError = err;
|
|
510
|
+
}
|
|
511
|
+
expect(callToolError).not.toBeNull();
|
|
512
|
+
// Test callToolAndGetNewContext with error - also using invalid tool ID
|
|
513
|
+
let callContextError = null;
|
|
514
|
+
try {
|
|
515
|
+
const events = [];
|
|
516
|
+
await dainConnection.callToolAndGetNewContext("non-existent-tool", { message: "error-test" }, {
|
|
517
|
+
onUIUpdate: (update) => {
|
|
518
|
+
events.push({ type: 'ui', data: update.ui });
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
catch (err) {
|
|
523
|
+
callContextError = err;
|
|
524
|
+
}
|
|
525
|
+
expect(callContextError).not.toBeNull();
|
|
526
|
+
// Test success case to ensure the streaming still works
|
|
527
|
+
const result = await dainConnection.callTool("streaming-test", { message: "success-test" });
|
|
528
|
+
expect(result).toEqual({
|
|
529
|
+
text: "Streaming test completed: success-test",
|
|
530
|
+
data: { result: "completed-success-test" },
|
|
531
|
+
ui: null,
|
|
532
|
+
});
|
|
533
|
+
}, 30000);
|
|
534
|
+
// Add a test for the new error handling in tool handlers
|
|
535
|
+
it("Handles and formats tool handler errors correctly", async () => {
|
|
536
|
+
// First test basic non-streaming error case
|
|
537
|
+
console.log("\nTesting non-streaming error...");
|
|
538
|
+
const basicErrorResult = await dainConnection.callTool("error-tool", { shouldThrow: true });
|
|
539
|
+
// Verify the error format matches what we expect
|
|
540
|
+
expect(basicErrorResult).toHaveProperty('error');
|
|
541
|
+
expect(basicErrorResult).toHaveProperty('text');
|
|
542
|
+
expect(basicErrorResult.error).toBe("Intentional test error");
|
|
543
|
+
expect(basicErrorResult.text).toBe("Error: Intentional test error");
|
|
544
|
+
expect(basicErrorResult.data).toBeNull();
|
|
545
|
+
expect(basicErrorResult.ui).toBeNull();
|
|
546
|
+
// Test context endpoint error format
|
|
547
|
+
console.log("\nTesting context error...");
|
|
548
|
+
const contextErrorResult = await dainConnection.callToolAndGetNewContext("error-tool", { shouldThrow: true });
|
|
549
|
+
// Verify the context error format
|
|
550
|
+
expect(contextErrorResult).toHaveProperty('toolResult');
|
|
551
|
+
expect(contextErrorResult).toHaveProperty('context');
|
|
552
|
+
expect(contextErrorResult.toolResult).toHaveProperty('error');
|
|
553
|
+
expect(contextErrorResult.toolResult.error).toBe("Intentional test error");
|
|
554
|
+
expect(contextErrorResult.toolResult.text).toBe("Error: Intentional test error");
|
|
555
|
+
expect(contextErrorResult.toolResult.data).toBeNull();
|
|
556
|
+
expect(contextErrorResult.toolResult.ui).toBeNull();
|
|
557
|
+
expect(Array.isArray(contextErrorResult.context)).toBe(true);
|
|
558
|
+
expect(contextErrorResult.context.length).toBe(0);
|
|
559
|
+
// Test streaming error format
|
|
560
|
+
console.log("\nTesting streaming error...");
|
|
561
|
+
let streamingErrorEvents = [];
|
|
562
|
+
const streamingErrorResult = await dainConnection.callTool("error-tool", { shouldThrow: true }, {
|
|
563
|
+
onUIUpdate: (update) => {
|
|
564
|
+
streamingErrorEvents.push({ type: 'ui', data: update.ui });
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
// Verify streaming error format is the same
|
|
568
|
+
expect(streamingErrorResult).toHaveProperty('error');
|
|
569
|
+
expect(streamingErrorResult.error).toBe("Intentional test error");
|
|
570
|
+
expect(streamingErrorResult.text).toBe("Error: Intentional test error");
|
|
571
|
+
expect(streamingErrorResult.data).toBeNull();
|
|
572
|
+
expect(streamingErrorResult.ui).toBeNull();
|
|
573
|
+
// Test streaming context error format
|
|
574
|
+
console.log("\nTesting streaming context error...");
|
|
575
|
+
let streamingContextErrorEvents = [];
|
|
576
|
+
const streamingContextErrorResult = await dainConnection.callToolAndGetNewContext("error-tool", { shouldThrow: true }, {
|
|
577
|
+
onUIUpdate: (update) => {
|
|
578
|
+
streamingContextErrorEvents.push({ type: 'ui', data: update.ui });
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
// Verify streaming context error format
|
|
582
|
+
expect(streamingContextErrorResult).toHaveProperty('toolResult');
|
|
583
|
+
expect(streamingContextErrorResult).toHaveProperty('context');
|
|
584
|
+
expect(streamingContextErrorResult.toolResult).toHaveProperty('error');
|
|
585
|
+
expect(streamingContextErrorResult.toolResult.error).toBe("Intentional test error");
|
|
586
|
+
expect(streamingContextErrorResult.toolResult.text).toBe("Error: Intentional test error");
|
|
587
|
+
expect(streamingContextErrorResult.toolResult.data).toBeNull();
|
|
588
|
+
expect(streamingContextErrorResult.toolResult.ui).toBeNull();
|
|
589
|
+
expect(Array.isArray(streamingContextErrorResult.context)).toBe(true);
|
|
590
|
+
}, 30000);
|
|
591
|
+
});
|
|
592
|
+
//# sourceMappingURL=streaming.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.test.js","sourceRoot":"","sources":["../../src/__tests__/streaming.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|