@dainprotocol/service-sdk 1.1.48 → 1.2.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__/context-behavior.test.js +290 -0
- package/dist/__tests__/context-behavior.test.js.map +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.js +251 -0
- package/dist/__tests__/oauth2-datasource.test.js.map +1 -0
- package/dist/client/client-auth.d.ts +24 -8
- package/dist/client/client-auth.js +103 -16
- package/dist/client/client-auth.js.map +1 -1
- package/dist/service/auth.d.ts +38 -1
- package/dist/service/auth.js +77 -5
- package/dist/service/auth.js.map +1 -1
- package/dist/service/core.js.map +1 -1
- package/dist/service/oauth2.d.ts +3 -2
- package/dist/service/oauth2.js +1 -0
- package/dist/service/oauth2.js.map +1 -1
- package/dist/service/oauth2Manager.d.ts +2 -0
- package/dist/service/oauth2Manager.js +5 -2
- package/dist/service/oauth2Manager.js.map +1 -1
- package/dist/service/server.js +54 -11
- package/dist/service/server.js.map +1 -1
- package/dist/service/types.d.ts +9 -0
- package/package.json +3 -3
- package/dist/__tests__/oauth-context-simple.test.js +0 -90
- package/dist/__tests__/oauth-context-simple.test.js.map +0 -1
- package/dist/__tests__/oauth-context.test.js +0 -282
- package/dist/__tests__/oauth-context.test.js.map +0 -1
- package/dist/__tests__/oauth2-client-context.test.js +0 -165
- package/dist/__tests__/oauth2-client-context.test.js.map +0 -1
- package/dist/__tests__/oauth2-client-simple.test.d.ts +0 -1
- package/dist/__tests__/oauth2-client-simple.test.js +0 -144
- package/dist/__tests__/oauth2-client-simple.test.js.map +0 -1
- /package/dist/__tests__/{oauth-context-simple.test.d.ts → context-behavior.test.d.ts} +0 -0
- /package/dist/__tests__/{oauth-context.test.d.ts → oauth2-context.test.d.ts} +0 -0
- /package/dist/__tests__/{oauth2-client-context.test.d.ts → oauth2-datasource.test.d.ts} +0 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const nodeService_1 = require("../service/nodeService");
|
|
6
|
+
const core_1 = require("../service/core");
|
|
7
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
8
|
+
const bs58_1 = tslib_1.__importDefault(require("bs58"));
|
|
9
|
+
const client_auth_1 = require("../client/client-auth");
|
|
10
|
+
const client_1 = require("../client/client");
|
|
11
|
+
describe("Context Behavior", () => {
|
|
12
|
+
let server;
|
|
13
|
+
const port = 4591; // Changed port to avoid conflicts
|
|
14
|
+
// Generate keys for the service
|
|
15
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
16
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
17
|
+
// Generate keys for the client
|
|
18
|
+
const clientPrivateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
19
|
+
const agentAuth = new client_auth_1.DainClientAuth({
|
|
20
|
+
privateKeyBase58: bs58_1.default.encode(clientPrivateKey),
|
|
21
|
+
agentId: "context-test-agent",
|
|
22
|
+
orgId: "context-test-org",
|
|
23
|
+
});
|
|
24
|
+
// Initialize the connection
|
|
25
|
+
let dainConnection;
|
|
26
|
+
// Use a closure to track context calls properly
|
|
27
|
+
const contextState = {
|
|
28
|
+
callCount: 0,
|
|
29
|
+
callHistory: [],
|
|
30
|
+
oauth2ClientPresent: false,
|
|
31
|
+
oauth2ClientCalls: []
|
|
32
|
+
};
|
|
33
|
+
// Create a context that tracks when it's called
|
|
34
|
+
const trackableContext = (0, core_1.createContext)({
|
|
35
|
+
id: "trackable-context",
|
|
36
|
+
name: "Trackable Context",
|
|
37
|
+
description: "Context that tracks when it's called",
|
|
38
|
+
getContextData: async (agentInfo, extraData) => {
|
|
39
|
+
contextState.callCount++;
|
|
40
|
+
// Track oauth2Client presence
|
|
41
|
+
const hasOAuth2Client = !!extraData?.oauth2Client;
|
|
42
|
+
contextState.oauth2ClientPresent = hasOAuth2Client;
|
|
43
|
+
contextState.oauth2ClientCalls.push(hasOAuth2Client);
|
|
44
|
+
const callInfo = {
|
|
45
|
+
callNumber: contextState.callCount,
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
agentInfo,
|
|
48
|
+
hasPlugins: !!extraData?.plugins,
|
|
49
|
+
hasOAuth2Client: hasOAuth2Client,
|
|
50
|
+
oauth2ClientType: hasOAuth2Client ? typeof extraData.oauth2Client : 'undefined',
|
|
51
|
+
oauth2ClientMethods: hasOAuth2Client && extraData.oauth2Client ? Object.keys(extraData.oauth2Client) : [],
|
|
52
|
+
pluginKeys: Object.keys(extraData?.plugins || {}),
|
|
53
|
+
extraDataKeys: Object.keys(extraData || {})
|
|
54
|
+
};
|
|
55
|
+
contextState.callHistory.push(callInfo);
|
|
56
|
+
console.log(`Context called! Count: ${contextState.callCount}, OAuth2Client present: ${hasOAuth2Client}, Stack trace:`, new Error().stack?.split('\n').slice(1, 5).join('\n'));
|
|
57
|
+
return {
|
|
58
|
+
callCount: contextState.callCount,
|
|
59
|
+
lastCall: callInfo,
|
|
60
|
+
hasOAuth2Client: hasOAuth2Client,
|
|
61
|
+
message: `Context called ${contextState.callCount} times`
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Create a simple tool
|
|
66
|
+
const testTool = (0, core_1.createTool)({
|
|
67
|
+
id: "test-tool",
|
|
68
|
+
name: "Test Tool",
|
|
69
|
+
description: "Tool for testing context behavior",
|
|
70
|
+
input: zod_1.z.object({
|
|
71
|
+
message: zod_1.z.string()
|
|
72
|
+
}),
|
|
73
|
+
output: zod_1.z.object({
|
|
74
|
+
result: zod_1.z.string(),
|
|
75
|
+
contextCallsAtExecution: zod_1.z.number()
|
|
76
|
+
}),
|
|
77
|
+
handler: async (input, agentInfo, context) => {
|
|
78
|
+
// Track how many times context was called at tool execution time
|
|
79
|
+
const currentCount = contextState.callCount;
|
|
80
|
+
console.log(`Tool executing with message: "${input.message}", context count at execution: ${currentCount}`);
|
|
81
|
+
return {
|
|
82
|
+
text: `Processed: ${input.message}`,
|
|
83
|
+
data: {
|
|
84
|
+
result: `Tool executed with message: ${input.message}`,
|
|
85
|
+
contextCallsAtExecution: currentCount
|
|
86
|
+
},
|
|
87
|
+
ui: undefined
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
const dainService = (0, nodeService_1.defineDAINService)({
|
|
92
|
+
metadata: {
|
|
93
|
+
title: "Context Behavior Test",
|
|
94
|
+
description: "Testing when contexts are called",
|
|
95
|
+
version: "1.0.0",
|
|
96
|
+
author: "Test",
|
|
97
|
+
tags: ["test", "context"]
|
|
98
|
+
},
|
|
99
|
+
identity: {
|
|
100
|
+
publicKey: bs58_1.default.encode(publicKey),
|
|
101
|
+
privateKey: bs58_1.default.encode(privateKey),
|
|
102
|
+
agentId: "test-service-agent",
|
|
103
|
+
orgId: "test-service-org"
|
|
104
|
+
},
|
|
105
|
+
tools: [testTool],
|
|
106
|
+
contexts: [trackableContext]
|
|
107
|
+
});
|
|
108
|
+
beforeAll(async () => {
|
|
109
|
+
// Reset state
|
|
110
|
+
contextState.callCount = 0;
|
|
111
|
+
contextState.callHistory = [];
|
|
112
|
+
server = await dainService.startNode({ port });
|
|
113
|
+
dainConnection = new client_1.DainServiceConnection(`http://localhost:${port}`, agentAuth);
|
|
114
|
+
});
|
|
115
|
+
afterAll(async () => {
|
|
116
|
+
if (server && server.shutdown) {
|
|
117
|
+
await server.shutdown();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
beforeEach(() => {
|
|
121
|
+
// Reset counters before each test
|
|
122
|
+
contextState.callCount = 0;
|
|
123
|
+
contextState.callHistory = [];
|
|
124
|
+
contextState.oauth2ClientPresent = false;
|
|
125
|
+
contextState.oauth2ClientCalls = [];
|
|
126
|
+
});
|
|
127
|
+
describe("Context endpoint calls", () => {
|
|
128
|
+
it("should call context when listing contexts", async () => {
|
|
129
|
+
const contexts = await dainConnection.listContexts();
|
|
130
|
+
expect(contexts).toHaveLength(1);
|
|
131
|
+
expect(contexts[0].id).toBe("trackable-context");
|
|
132
|
+
// listContexts doesn't call getContextData, just lists them
|
|
133
|
+
expect(contextState.callCount).toBe(0);
|
|
134
|
+
});
|
|
135
|
+
it("should call context when getting all contexts with data", async () => {
|
|
136
|
+
const contexts = await dainConnection.getAllContexts();
|
|
137
|
+
expect(contextState.callCount).toBe(1);
|
|
138
|
+
expect(contexts).toHaveLength(1);
|
|
139
|
+
expect(contexts[0].id).toBe("trackable-context");
|
|
140
|
+
expect(contexts[0].data.callCount).toBe(1);
|
|
141
|
+
expect(contexts[0].data.message).toBe("Context called 1 times");
|
|
142
|
+
});
|
|
143
|
+
it("should call context each time getAllContexts is called", async () => {
|
|
144
|
+
// First call
|
|
145
|
+
const contexts1 = await dainConnection.getAllContexts();
|
|
146
|
+
expect(contextState.callCount).toBe(1);
|
|
147
|
+
expect(contexts1[0].data.callCount).toBe(1);
|
|
148
|
+
// Second call
|
|
149
|
+
const contexts2 = await dainConnection.getAllContexts();
|
|
150
|
+
expect(contextState.callCount).toBe(2);
|
|
151
|
+
expect(contexts2[0].data.callCount).toBe(2);
|
|
152
|
+
// Third call
|
|
153
|
+
const contexts3 = await dainConnection.getAllContexts();
|
|
154
|
+
expect(contextState.callCount).toBe(3);
|
|
155
|
+
expect(contexts3[0].data.callCount).toBe(3);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("Tool execution and context", () => {
|
|
159
|
+
it("should NOT call context during regular tool execution", async () => {
|
|
160
|
+
console.log("TEST: Starting regular tool execution test");
|
|
161
|
+
const initialCount = contextState.callCount;
|
|
162
|
+
const result = await dainConnection.callTool("test-tool", {
|
|
163
|
+
message: "Hello"
|
|
164
|
+
});
|
|
165
|
+
console.log("TEST: After regular tool call, context count:", contextState.callCount);
|
|
166
|
+
// Context should NOT be called during regular tool execution
|
|
167
|
+
expect(contextState.callCount).toBe(initialCount);
|
|
168
|
+
expect(result.text).toBe("Processed: Hello");
|
|
169
|
+
expect(result.data.result).toBe("Tool executed with message: Hello");
|
|
170
|
+
expect(result.data.contextCallsAtExecution).toBe(initialCount);
|
|
171
|
+
// No context field in regular tool response
|
|
172
|
+
expect(result.context).toBeUndefined();
|
|
173
|
+
});
|
|
174
|
+
it("should call context when using callToolAndGetNewContext", async () => {
|
|
175
|
+
console.log("TEST: Starting callToolAndGetNewContext test");
|
|
176
|
+
const initialCount = contextState.callCount;
|
|
177
|
+
const result = await dainConnection.callToolAndGetNewContext("test-tool", {
|
|
178
|
+
message: "Hello with context"
|
|
179
|
+
});
|
|
180
|
+
console.log("TEST: After callToolAndGetNewContext, context count:", contextState.callCount);
|
|
181
|
+
// Context SHOULD be called when using callToolAndGetNewContext
|
|
182
|
+
expect(contextState.callCount).toBe(initialCount + 1);
|
|
183
|
+
// Check tool result
|
|
184
|
+
expect(result.toolResult).toBeDefined();
|
|
185
|
+
expect(result.toolResult.text).toBe("Processed: Hello with context");
|
|
186
|
+
expect(result.toolResult.data.result).toBe("Tool executed with message: Hello with context");
|
|
187
|
+
// Tool was executed BEFORE context was gathered
|
|
188
|
+
expect(result.toolResult.data.contextCallsAtExecution).toBe(initialCount);
|
|
189
|
+
// Check context was returned
|
|
190
|
+
expect(result.context).toBeDefined();
|
|
191
|
+
expect(Array.isArray(result.context)).toBe(true);
|
|
192
|
+
expect(result.context).toHaveLength(1);
|
|
193
|
+
const context = result.context[0];
|
|
194
|
+
expect(context.id).toBe("trackable-context");
|
|
195
|
+
expect(context.data.callCount).toBe(initialCount + 1);
|
|
196
|
+
});
|
|
197
|
+
it("should call context AFTER tool execution when using callToolAndGetNewContext", async () => {
|
|
198
|
+
console.log("TEST: Starting execution order test");
|
|
199
|
+
// First verify context hasn't been called yet in this test
|
|
200
|
+
const initialCount = contextState.callCount;
|
|
201
|
+
const result = await dainConnection.callToolAndGetNewContext("test-tool", {
|
|
202
|
+
message: "Testing execution order"
|
|
203
|
+
});
|
|
204
|
+
// The tool handler captured contextCallCount at execution time
|
|
205
|
+
expect(result.toolResult.data.contextCallsAtExecution).toBe(initialCount);
|
|
206
|
+
// But the context was called after tool execution
|
|
207
|
+
expect(contextState.callCount).toBe(initialCount + 1);
|
|
208
|
+
expect(result.context[0].data.callCount).toBe(initialCount + 1);
|
|
209
|
+
});
|
|
210
|
+
it("should call context each time callToolAndGetNewContext is used", async () => {
|
|
211
|
+
const startCount = contextState.callCount;
|
|
212
|
+
// First call
|
|
213
|
+
const result1 = await dainConnection.callToolAndGetNewContext("test-tool", {
|
|
214
|
+
message: "First call"
|
|
215
|
+
});
|
|
216
|
+
expect(contextState.callCount).toBe(startCount + 1);
|
|
217
|
+
expect(result1.context[0].data.callCount).toBe(startCount + 1);
|
|
218
|
+
// Second call
|
|
219
|
+
const result2 = await dainConnection.callToolAndGetNewContext("test-tool", {
|
|
220
|
+
message: "Second call"
|
|
221
|
+
});
|
|
222
|
+
expect(contextState.callCount).toBe(startCount + 2);
|
|
223
|
+
expect(result2.context[0].data.callCount).toBe(startCount + 2);
|
|
224
|
+
// Third call
|
|
225
|
+
const result3 = await dainConnection.callToolAndGetNewContext("test-tool", {
|
|
226
|
+
message: "Third call"
|
|
227
|
+
});
|
|
228
|
+
expect(contextState.callCount).toBe(startCount + 3);
|
|
229
|
+
expect(result3.context[0].data.callCount).toBe(startCount + 3);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
describe("Context calling patterns", () => {
|
|
233
|
+
it("demonstrates the intended behavior: context is opt-in per request", async () => {
|
|
234
|
+
const startCount = contextState.callCount;
|
|
235
|
+
// Context is NOT automatically called before every tool
|
|
236
|
+
const regularResult = await dainConnection.callTool("test-tool", {
|
|
237
|
+
message: "Regular call"
|
|
238
|
+
});
|
|
239
|
+
expect(contextState.callCount).toBe(startCount);
|
|
240
|
+
// Context IS called when explicitly requested
|
|
241
|
+
const contextResult = await dainConnection.callToolAndGetNewContext("test-tool", {
|
|
242
|
+
message: "Call with context"
|
|
243
|
+
});
|
|
244
|
+
expect(contextState.callCount).toBe(startCount + 1);
|
|
245
|
+
// You can also get context data separately without tool execution
|
|
246
|
+
const contexts = await dainConnection.getAllContexts();
|
|
247
|
+
expect(contextState.callCount).toBe(startCount + 2); // Called again for getAllContexts
|
|
248
|
+
// This design allows:
|
|
249
|
+
// 1. Efficient tool execution without context overhead when not needed
|
|
250
|
+
// 2. Fresh context data when explicitly requested
|
|
251
|
+
// 3. Flexibility for the client to decide when context is needed
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe("OAuth2Client passing to context", () => {
|
|
255
|
+
it("should NOT pass oauth2Client when oauth2 is not configured", async () => {
|
|
256
|
+
// Since our test service doesn't have oauth2 configured, oauth2Client should be undefined
|
|
257
|
+
const contexts = await dainConnection.getAllContexts();
|
|
258
|
+
expect(contexts).toHaveLength(1);
|
|
259
|
+
const lastCall = contextState.callHistory[contextState.callHistory.length - 1];
|
|
260
|
+
// Verify oauth2Client was passed but undefined (service has no oauth2 config)
|
|
261
|
+
expect(lastCall.hasOAuth2Client).toBe(false);
|
|
262
|
+
expect(lastCall.oauth2ClientType).toBe('undefined');
|
|
263
|
+
expect(lastCall.extraDataKeys).toContain('plugins');
|
|
264
|
+
// oauth2Client key is present but value is undefined when oauth2 is not configured
|
|
265
|
+
expect(lastCall.extraDataKeys).toContain('oauth2Client');
|
|
266
|
+
});
|
|
267
|
+
it("should track oauth2Client presence across different endpoint calls", async () => {
|
|
268
|
+
// Reset tracking
|
|
269
|
+
contextState.oauth2ClientCalls = [];
|
|
270
|
+
// Call various endpoints that trigger context
|
|
271
|
+
await dainConnection.getAllContexts();
|
|
272
|
+
await dainConnection.callToolAndGetNewContext("test-tool", { message: "test" });
|
|
273
|
+
// All calls should consistently show no oauth2Client (since not configured)
|
|
274
|
+
expect(contextState.oauth2ClientCalls).toHaveLength(2);
|
|
275
|
+
expect(contextState.oauth2ClientCalls.every(hasClient => hasClient === false)).toBe(true);
|
|
276
|
+
});
|
|
277
|
+
it("should include oauth2Client in extraData keys when present", async () => {
|
|
278
|
+
// Get context to check the extraData structure
|
|
279
|
+
await dainConnection.getAllContexts();
|
|
280
|
+
const lastCall = contextState.callHistory[contextState.callHistory.length - 1];
|
|
281
|
+
// Verify the structure of extraData
|
|
282
|
+
expect(lastCall.extraDataKeys).toBeDefined();
|
|
283
|
+
expect(Array.isArray(lastCall.extraDataKeys)).toBe(true);
|
|
284
|
+
// Should have plugins but not oauth2Client (not configured in this test)
|
|
285
|
+
expect(lastCall.extraDataKeys).toContain('plugins');
|
|
286
|
+
expect(lastCall.hasOAuth2Client).toBe(false);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
//# sourceMappingURL=context-behavior.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-behavior.test.js","sourceRoot":"","sources":["../../src/__tests__/context-behavior.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const nodeService_1 = require("../service/nodeService");
|
|
6
|
+
const core_1 = require("../service/core");
|
|
7
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
8
|
+
const bs58_1 = tslib_1.__importDefault(require("bs58"));
|
|
9
|
+
const client_auth_1 = require("../client/client-auth");
|
|
10
|
+
const client_1 = require("../client/client");
|
|
11
|
+
const oauth2_token_manager_1 = require("@dainprotocol/oauth2-token-manager");
|
|
12
|
+
describe("OAuth2Client in Context", () => {
|
|
13
|
+
let server;
|
|
14
|
+
const port = 4592; // Different port to avoid conflicts
|
|
15
|
+
// Generate keys for the service
|
|
16
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
17
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
18
|
+
// Generate keys for the client
|
|
19
|
+
const clientPrivateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
20
|
+
const agentAuth = new client_auth_1.DainClientAuth({
|
|
21
|
+
privateKeyBase58: bs58_1.default.encode(clientPrivateKey),
|
|
22
|
+
agentId: "oauth2-context-test-agent",
|
|
23
|
+
orgId: "oauth2-context-test-org",
|
|
24
|
+
});
|
|
25
|
+
let dainConnection;
|
|
26
|
+
// Track oauth2Client details
|
|
27
|
+
const oauth2ClientInfo = {
|
|
28
|
+
wasPresent: false,
|
|
29
|
+
hadGetAccessTokenMethod: false,
|
|
30
|
+
hadGetValidTokenMethod: false,
|
|
31
|
+
methodsFound: [],
|
|
32
|
+
callCount: 0
|
|
33
|
+
};
|
|
34
|
+
// Create a context that verifies oauth2Client
|
|
35
|
+
const oauth2VerifyContext = (0, core_1.createContext)({
|
|
36
|
+
id: "oauth2-verify-context",
|
|
37
|
+
name: "OAuth2 Verify Context",
|
|
38
|
+
description: "Context that verifies oauth2Client is passed",
|
|
39
|
+
getContextData: async (agentInfo, extraData) => {
|
|
40
|
+
oauth2ClientInfo.callCount++;
|
|
41
|
+
// Check if oauth2Client is present
|
|
42
|
+
oauth2ClientInfo.wasPresent = !!extraData?.oauth2Client;
|
|
43
|
+
if (extraData?.oauth2Client) {
|
|
44
|
+
// Get all property names including methods from the prototype
|
|
45
|
+
const allProps = [...Object.keys(extraData.oauth2Client)];
|
|
46
|
+
const prototypeMethods = Object.getOwnPropertyNames(Object.getPrototypeOf(extraData.oauth2Client));
|
|
47
|
+
oauth2ClientInfo.methodsFound = [...new Set([...allProps, ...prototypeMethods])].filter(m => m !== 'constructor');
|
|
48
|
+
// Check for expected methods
|
|
49
|
+
oauth2ClientInfo.hadGetAccessTokenMethod = typeof extraData.oauth2Client.getAccessToken === 'function';
|
|
50
|
+
oauth2ClientInfo.hadGetValidTokenMethod = typeof extraData.oauth2Client.getValidToken === 'function';
|
|
51
|
+
console.log("OAuth2Client detected with methods:", oauth2ClientInfo.methodsFound);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log("No OAuth2Client in extraData");
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
oauth2ClientPresent: oauth2ClientInfo.wasPresent,
|
|
58
|
+
oauth2ClientMethods: oauth2ClientInfo.methodsFound,
|
|
59
|
+
hasGetAccessToken: oauth2ClientInfo.hadGetAccessTokenMethod,
|
|
60
|
+
hasGetValidToken: oauth2ClientInfo.hadGetValidTokenMethod,
|
|
61
|
+
callCount: oauth2ClientInfo.callCount
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Create a simple tool
|
|
66
|
+
const testTool = (0, core_1.createTool)({
|
|
67
|
+
id: "oauth2-test-tool",
|
|
68
|
+
name: "OAuth2 Test Tool",
|
|
69
|
+
description: "Tool for testing oauth2 context",
|
|
70
|
+
input: zod_1.z.object({
|
|
71
|
+
message: zod_1.z.string()
|
|
72
|
+
}),
|
|
73
|
+
output: zod_1.z.object({
|
|
74
|
+
result: zod_1.z.string()
|
|
75
|
+
}),
|
|
76
|
+
handler: async (input) => {
|
|
77
|
+
return {
|
|
78
|
+
text: `Processed: ${input.message}`,
|
|
79
|
+
data: {
|
|
80
|
+
result: `Executed: ${input.message}`
|
|
81
|
+
},
|
|
82
|
+
ui: undefined
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const dainService = (0, nodeService_1.defineDAINService)({
|
|
87
|
+
metadata: {
|
|
88
|
+
title: "OAuth2 Context Test",
|
|
89
|
+
description: "Testing oauth2Client in contexts",
|
|
90
|
+
version: "1.0.0",
|
|
91
|
+
author: "Test",
|
|
92
|
+
tags: ["test", "oauth2", "context"]
|
|
93
|
+
},
|
|
94
|
+
identity: {
|
|
95
|
+
publicKey: bs58_1.default.encode(publicKey),
|
|
96
|
+
privateKey: bs58_1.default.encode(privateKey),
|
|
97
|
+
agentId: "test-oauth2-service-agent",
|
|
98
|
+
orgId: "test-oauth2-service-org"
|
|
99
|
+
},
|
|
100
|
+
// Configure OAuth2
|
|
101
|
+
oauth2: {
|
|
102
|
+
baseUrl: `http://localhost:${port}`,
|
|
103
|
+
providers: {
|
|
104
|
+
test: {
|
|
105
|
+
clientId: "test-client-id",
|
|
106
|
+
clientSecret: "test-client-secret",
|
|
107
|
+
authorizationUrl: "https://example.com/oauth/authorize",
|
|
108
|
+
tokenUrl: "https://example.com/oauth/token",
|
|
109
|
+
scopes: ["read", "write"]
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
tokenStore: new oauth2_token_manager_1.InMemoryStorageAdapter()
|
|
113
|
+
},
|
|
114
|
+
tools: [testTool],
|
|
115
|
+
contexts: [oauth2VerifyContext]
|
|
116
|
+
});
|
|
117
|
+
beforeAll(async () => {
|
|
118
|
+
// Reset tracking
|
|
119
|
+
oauth2ClientInfo.wasPresent = false;
|
|
120
|
+
oauth2ClientInfo.hadGetAccessTokenMethod = false;
|
|
121
|
+
oauth2ClientInfo.hadGetValidTokenMethod = false;
|
|
122
|
+
oauth2ClientInfo.methodsFound = [];
|
|
123
|
+
oauth2ClientInfo.callCount = 0;
|
|
124
|
+
server = await dainService.startNode({ port });
|
|
125
|
+
dainConnection = new client_1.DainServiceConnection(`http://localhost:${port}`, agentAuth);
|
|
126
|
+
});
|
|
127
|
+
afterAll(async () => {
|
|
128
|
+
if (server && server.shutdown) {
|
|
129
|
+
await server.shutdown();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
beforeEach(() => {
|
|
133
|
+
// Reset tracking before each test
|
|
134
|
+
oauth2ClientInfo.wasPresent = false;
|
|
135
|
+
oauth2ClientInfo.hadGetAccessTokenMethod = false;
|
|
136
|
+
oauth2ClientInfo.hadGetValidTokenMethod = false;
|
|
137
|
+
oauth2ClientInfo.methodsFound = [];
|
|
138
|
+
oauth2ClientInfo.callCount = 0;
|
|
139
|
+
});
|
|
140
|
+
describe("OAuth2Client availability in context", () => {
|
|
141
|
+
it("should pass oauth2Client to context when OAuth2 is configured", async () => {
|
|
142
|
+
const contexts = await dainConnection.getAllContexts();
|
|
143
|
+
expect(contexts).toHaveLength(1);
|
|
144
|
+
expect(contexts[0].id).toBe("oauth2-verify-context");
|
|
145
|
+
// Verify oauth2Client was passed
|
|
146
|
+
expect(oauth2ClientInfo.wasPresent).toBe(true);
|
|
147
|
+
expect(contexts[0].data.oauth2ClientPresent).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
it("should provide oauth2Client with expected methods", async () => {
|
|
150
|
+
const contexts = await dainConnection.getAllContexts();
|
|
151
|
+
// Check that oauth2Client has the expected methods
|
|
152
|
+
expect(oauth2ClientInfo.hadGetAccessTokenMethod).toBe(true);
|
|
153
|
+
expect(oauth2ClientInfo.hadGetValidTokenMethod).toBe(true);
|
|
154
|
+
// Verify through the returned data
|
|
155
|
+
expect(contexts[0].data.hasGetAccessToken).toBe(true);
|
|
156
|
+
expect(contexts[0].data.hasGetValidToken).toBe(true);
|
|
157
|
+
// Check that methods array contains expected methods
|
|
158
|
+
expect(oauth2ClientInfo.methodsFound).toContain('getAccessToken');
|
|
159
|
+
expect(oauth2ClientInfo.methodsFound).toContain('getValidToken');
|
|
160
|
+
});
|
|
161
|
+
it("should pass oauth2Client when using callToolAndGetNewContext", async () => {
|
|
162
|
+
const result = await dainConnection.callToolAndGetNewContext("oauth2-test-tool", {
|
|
163
|
+
message: "Testing with OAuth2"
|
|
164
|
+
});
|
|
165
|
+
// Verify tool executed
|
|
166
|
+
expect(result.toolResult.text).toBe("Processed: Testing with OAuth2");
|
|
167
|
+
// Verify context was called with oauth2Client
|
|
168
|
+
expect(oauth2ClientInfo.wasPresent).toBe(true);
|
|
169
|
+
expect(result.context[0].data.oauth2ClientPresent).toBe(true);
|
|
170
|
+
expect(result.context[0].data.hasGetAccessToken).toBe(true);
|
|
171
|
+
expect(result.context[0].data.hasGetValidToken).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
it("should consistently pass oauth2Client across multiple context calls", async () => {
|
|
174
|
+
// Reset counter
|
|
175
|
+
oauth2ClientInfo.callCount = 0;
|
|
176
|
+
// Make multiple calls
|
|
177
|
+
await dainConnection.getAllContexts();
|
|
178
|
+
await dainConnection.callToolAndGetNewContext("oauth2-test-tool", { message: "call 1" });
|
|
179
|
+
await dainConnection.getAllContexts();
|
|
180
|
+
// Should have been called 3 times
|
|
181
|
+
expect(oauth2ClientInfo.callCount).toBe(3);
|
|
182
|
+
// OAuth2Client should have been present in all calls
|
|
183
|
+
// (we only track the last state, but if it's true after 3 calls, it was passed)
|
|
184
|
+
expect(oauth2ClientInfo.wasPresent).toBe(true);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
describe("OAuth2Client methods accessibility", () => {
|
|
188
|
+
it("should provide a functional oauth2Client object", async () => {
|
|
189
|
+
const contexts = await dainConnection.getAllContexts();
|
|
190
|
+
// The context should report having the oauth2Client
|
|
191
|
+
expect(contexts[0].data.oauth2ClientPresent).toBe(true);
|
|
192
|
+
// Verify the methods are actually functions (checked in our context)
|
|
193
|
+
expect(contexts[0].data.hasGetAccessToken).toBe(true);
|
|
194
|
+
expect(contexts[0].data.hasGetValidToken).toBe(true);
|
|
195
|
+
// Verify we found multiple methods (should be more than just 2)
|
|
196
|
+
expect(oauth2ClientInfo.methodsFound.length).toBeGreaterThan(0);
|
|
197
|
+
expect(oauth2ClientInfo.methodsFound).toEqual(expect.arrayContaining(['getAccessToken', 'getValidToken']));
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
//# sourceMappingURL=oauth2-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth2-context.test.js","sourceRoot":"","sources":["../../src/__tests__/oauth2-context.test.ts"],"names":[],"mappings":"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"}
|