agent0-sdk 0.2.1
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/LICENSE +21 -0
- package/README.md +234 -0
- package/dist/core/agent.d.ts +76 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +477 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/contracts.d.ts +688 -0
- package/dist/core/contracts.d.ts.map +1 -0
- package/dist/core/contracts.js +348 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/endpoint-crawler.d.ts +44 -0
- package/dist/core/endpoint-crawler.d.ts.map +1 -0
- package/dist/core/endpoint-crawler.js +280 -0
- package/dist/core/endpoint-crawler.js.map +1 -0
- package/dist/core/feedback-manager.d.ts +98 -0
- package/dist/core/feedback-manager.d.ts.map +1 -0
- package/dist/core/feedback-manager.js +543 -0
- package/dist/core/feedback-manager.js.map +1 -0
- package/dist/core/indexer.d.ts +37 -0
- package/dist/core/indexer.d.ts.map +1 -0
- package/dist/core/indexer.js +189 -0
- package/dist/core/indexer.js.map +1 -0
- package/dist/core/ipfs-client.d.ts +88 -0
- package/dist/core/ipfs-client.d.ts.map +1 -0
- package/dist/core/ipfs-client.js +334 -0
- package/dist/core/ipfs-client.js.map +1 -0
- package/dist/core/sdk.d.ts +177 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +544 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/subgraph-client.d.ts +68 -0
- package/dist/core/subgraph-client.d.ts.map +1 -0
- package/dist/core/subgraph-client.js +635 -0
- package/dist/core/subgraph-client.js.map +1 -0
- package/dist/core/web3-client.d.ts +94 -0
- package/dist/core/web3-client.d.ts.map +1 -0
- package/dist/core/web3-client.js +197 -0
- package/dist/core/web3-client.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/models/enums.d.ts +22 -0
- package/dist/models/enums.d.ts.map +1 -0
- package/dist/models/enums.js +24 -0
- package/dist/models/enums.js.map +1 -0
- package/dist/models/generated/subgraph-types.d.ts +208 -0
- package/dist/models/generated/subgraph-types.d.ts.map +1 -0
- package/dist/models/generated/subgraph-types.js +2 -0
- package/dist/models/generated/subgraph-types.js.map +1 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +8 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/interfaces.d.ts +125 -0
- package/dist/models/interfaces.d.ts.map +1 -0
- package/dist/models/interfaces.js +5 -0
- package/dist/models/interfaces.js.map +1 -0
- package/dist/models/types.d.ts +11 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +5 -0
- package/dist/models/types.js.map +1 -0
- package/dist/utils/constants.d.ts +24 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +28 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/id-format.d.ts +30 -0
- package/dist/utils/id-format.d.ts.map +1 -0
- package/dist/utils/id-format.js +67 -0
- package/dist/utils/id-format.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/validation.d.ts +25 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +61 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subgraph client for querying The Graph network
|
|
3
|
+
*/
|
|
4
|
+
import { GraphQLClient } from 'graphql-request';
|
|
5
|
+
import { normalizeAddress } from '../utils/validation';
|
|
6
|
+
/**
|
|
7
|
+
* Client for querying the subgraph GraphQL API
|
|
8
|
+
*/
|
|
9
|
+
export class SubgraphClient {
|
|
10
|
+
constructor(subgraphUrl) {
|
|
11
|
+
this.client = new GraphQLClient(subgraphUrl, {
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute a GraphQL query against the subgraph
|
|
19
|
+
*/
|
|
20
|
+
async query(query, variables) {
|
|
21
|
+
try {
|
|
22
|
+
const data = await this.client.request(query, variables || {});
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new Error(`Failed to query subgraph: ${error}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Query agents from the subgraph
|
|
31
|
+
*/
|
|
32
|
+
async getAgents(options = {}) {
|
|
33
|
+
const { where = {}, first = 100, skip = 0, orderBy = 'createdAt', orderDirection = 'desc', includeRegistrationFile = true, } = options;
|
|
34
|
+
// Support Agent-level filters and nested registrationFile filters
|
|
35
|
+
const supportedWhere = {};
|
|
36
|
+
if (where.agentId)
|
|
37
|
+
supportedWhere.agentId = where.agentId;
|
|
38
|
+
if (where.owner)
|
|
39
|
+
supportedWhere.owner = where.owner;
|
|
40
|
+
if (where.agentURI)
|
|
41
|
+
supportedWhere.agentURI = where.agentURI;
|
|
42
|
+
if (where.registrationFile_not !== undefined)
|
|
43
|
+
supportedWhere.registrationFile_not = where.registrationFile_not;
|
|
44
|
+
// Support nested registrationFile filters (pushed to subgraph level)
|
|
45
|
+
// Note: Python SDK uses "registrationFile_" (with underscore) for nested filters
|
|
46
|
+
if (where.registrationFile) {
|
|
47
|
+
supportedWhere.registrationFile_ = where.registrationFile;
|
|
48
|
+
}
|
|
49
|
+
if (where.registrationFile_) {
|
|
50
|
+
supportedWhere.registrationFile_ = where.registrationFile_;
|
|
51
|
+
}
|
|
52
|
+
// Build WHERE clause with support for nested filters
|
|
53
|
+
let whereClause = '';
|
|
54
|
+
if (Object.keys(supportedWhere).length > 0) {
|
|
55
|
+
const conditions = [];
|
|
56
|
+
for (const [key, value] of Object.entries(supportedWhere)) {
|
|
57
|
+
if ((key === 'registrationFile' || key === 'registrationFile_') && typeof value === 'object') {
|
|
58
|
+
// Handle nested registrationFile filters
|
|
59
|
+
// Python SDK uses "registrationFile_" (with underscore) for nested filters in GraphQL
|
|
60
|
+
const nestedConditions = [];
|
|
61
|
+
for (const [nestedKey, nestedValue] of Object.entries(value)) {
|
|
62
|
+
if (typeof nestedValue === 'boolean') {
|
|
63
|
+
nestedConditions.push(`${nestedKey}: ${nestedValue.toString().toLowerCase()}`);
|
|
64
|
+
}
|
|
65
|
+
else if (typeof nestedValue === 'string') {
|
|
66
|
+
nestedConditions.push(`${nestedKey}: "${nestedValue}"`);
|
|
67
|
+
}
|
|
68
|
+
else if (nestedValue === null) {
|
|
69
|
+
if (nestedKey.endsWith('_not')) {
|
|
70
|
+
nestedConditions.push(`${nestedKey}: null`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
nestedConditions.push(`${nestedKey}_not: null`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (nestedConditions.length > 0) {
|
|
78
|
+
conditions.push(`registrationFile_: { ${nestedConditions.join(', ')} }`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (typeof value === 'boolean') {
|
|
82
|
+
conditions.push(`${key}: ${value.toString().toLowerCase()}`);
|
|
83
|
+
}
|
|
84
|
+
else if (typeof value === 'string') {
|
|
85
|
+
conditions.push(`${key}: "${value}"`);
|
|
86
|
+
}
|
|
87
|
+
else if (typeof value === 'number') {
|
|
88
|
+
conditions.push(`${key}: ${value}`);
|
|
89
|
+
}
|
|
90
|
+
else if (Array.isArray(value)) {
|
|
91
|
+
conditions.push(`${key}: ${JSON.stringify(value)}`);
|
|
92
|
+
}
|
|
93
|
+
else if (value === null) {
|
|
94
|
+
// Don't add _not if the key already ends with _not (e.g., registrationFile_not)
|
|
95
|
+
const filterKey = key.endsWith('_not') ? key : `${key}_not`;
|
|
96
|
+
conditions.push(`${filterKey}: null`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (conditions.length > 0) {
|
|
100
|
+
whereClause = `where: { ${conditions.join(', ')} }`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Build registration file fragment
|
|
104
|
+
const regFileFragment = includeRegistrationFile
|
|
105
|
+
? `
|
|
106
|
+
registrationFile {
|
|
107
|
+
id
|
|
108
|
+
agentId
|
|
109
|
+
name
|
|
110
|
+
description
|
|
111
|
+
image
|
|
112
|
+
active
|
|
113
|
+
x402support
|
|
114
|
+
supportedTrusts
|
|
115
|
+
mcpEndpoint
|
|
116
|
+
mcpVersion
|
|
117
|
+
a2aEndpoint
|
|
118
|
+
a2aVersion
|
|
119
|
+
ens
|
|
120
|
+
did
|
|
121
|
+
agentWallet
|
|
122
|
+
agentWalletChainId
|
|
123
|
+
mcpTools
|
|
124
|
+
mcpPrompts
|
|
125
|
+
mcpResources
|
|
126
|
+
a2aSkills
|
|
127
|
+
}
|
|
128
|
+
`
|
|
129
|
+
: '';
|
|
130
|
+
const query = `
|
|
131
|
+
query GetAgents($first: Int!, $skip: Int!, $orderBy: Agent_orderBy!, $orderDirection: OrderDirection!) {
|
|
132
|
+
agents(
|
|
133
|
+
${whereClause}
|
|
134
|
+
first: $first
|
|
135
|
+
skip: $skip
|
|
136
|
+
orderBy: $orderBy
|
|
137
|
+
orderDirection: $orderDirection
|
|
138
|
+
) {
|
|
139
|
+
id
|
|
140
|
+
chainId
|
|
141
|
+
agentId
|
|
142
|
+
owner
|
|
143
|
+
operators
|
|
144
|
+
agentURI
|
|
145
|
+
createdAt
|
|
146
|
+
updatedAt
|
|
147
|
+
${regFileFragment}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
`;
|
|
151
|
+
// GraphQL enum expects lowercase
|
|
152
|
+
const variables = {
|
|
153
|
+
first,
|
|
154
|
+
skip,
|
|
155
|
+
orderBy,
|
|
156
|
+
orderDirection: orderDirection.toLowerCase(),
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
const data = await this.query(query, variables);
|
|
160
|
+
return (data.agents || []).map((agent) => this._transformAgent(agent));
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
throw new Error(`Failed to get agents from subgraph: ${error}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get a single agent by ID
|
|
168
|
+
*/
|
|
169
|
+
async getAgentById(agentId) {
|
|
170
|
+
const query = `
|
|
171
|
+
query GetAgent($agentId: String!) {
|
|
172
|
+
agent(id: $agentId) {
|
|
173
|
+
id
|
|
174
|
+
chainId
|
|
175
|
+
agentId
|
|
176
|
+
owner
|
|
177
|
+
operators
|
|
178
|
+
agentURI
|
|
179
|
+
createdAt
|
|
180
|
+
updatedAt
|
|
181
|
+
registrationFile {
|
|
182
|
+
id
|
|
183
|
+
agentId
|
|
184
|
+
name
|
|
185
|
+
description
|
|
186
|
+
image
|
|
187
|
+
active
|
|
188
|
+
x402support
|
|
189
|
+
supportedTrusts
|
|
190
|
+
mcpEndpoint
|
|
191
|
+
mcpVersion
|
|
192
|
+
a2aEndpoint
|
|
193
|
+
a2aVersion
|
|
194
|
+
ens
|
|
195
|
+
did
|
|
196
|
+
agentWallet
|
|
197
|
+
agentWalletChainId
|
|
198
|
+
mcpTools
|
|
199
|
+
mcpPrompts
|
|
200
|
+
mcpResources
|
|
201
|
+
a2aSkills
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
`;
|
|
206
|
+
try {
|
|
207
|
+
const data = await this.query(query, { agentId });
|
|
208
|
+
if (!data.agent) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
return this._transformAgent(data.agent);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
throw new Error(`Failed to get agent from subgraph: ${error}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Transform raw subgraph agent data to AgentSummary
|
|
219
|
+
*/
|
|
220
|
+
_transformAgent(agent) {
|
|
221
|
+
// Fields from Agent entity
|
|
222
|
+
const chainId = parseInt(agent.chainId?.toString() || '0', 10);
|
|
223
|
+
const agentIdStr = agent.id || `${chainId}:${agent.agentId?.toString() || '0'}`;
|
|
224
|
+
// Fields from AgentRegistrationFile (registrationFile)
|
|
225
|
+
const regFile = agent.registrationFile;
|
|
226
|
+
// Transform operators from Bytes array to Address array
|
|
227
|
+
const operators = (agent.operators || []).map((op) => typeof op === 'string' ? normalizeAddress(op) : op);
|
|
228
|
+
return {
|
|
229
|
+
chainId,
|
|
230
|
+
agentId: agentIdStr,
|
|
231
|
+
name: regFile?.name || '',
|
|
232
|
+
image: regFile?.image || undefined,
|
|
233
|
+
description: regFile?.description || '',
|
|
234
|
+
owners: agent.owner ? [normalizeAddress(agent.owner)] : [],
|
|
235
|
+
operators,
|
|
236
|
+
mcp: !!regFile?.mcpEndpoint,
|
|
237
|
+
a2a: !!regFile?.a2aEndpoint,
|
|
238
|
+
ens: regFile?.ens || undefined,
|
|
239
|
+
did: regFile?.did || undefined,
|
|
240
|
+
walletAddress: regFile?.agentWallet ? normalizeAddress(regFile.agentWallet) : undefined,
|
|
241
|
+
supportedTrusts: regFile?.supportedTrusts || [],
|
|
242
|
+
a2aSkills: regFile?.a2aSkills || [],
|
|
243
|
+
mcpTools: regFile?.mcpTools || [],
|
|
244
|
+
mcpPrompts: regFile?.mcpPrompts || [],
|
|
245
|
+
mcpResources: regFile?.mcpResources || [],
|
|
246
|
+
active: regFile?.active ?? false,
|
|
247
|
+
x402support: regFile?.x402support ?? false,
|
|
248
|
+
extras: {},
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Search agents with filters (delegates to getAgents with WHERE clause)
|
|
253
|
+
* @param params Search parameters
|
|
254
|
+
* @param first Maximum number of results to return (default: 100)
|
|
255
|
+
* @param skip Number of results to skip for pagination (default: 0)
|
|
256
|
+
*/
|
|
257
|
+
async searchAgents(params, first = 100, skip = 0) {
|
|
258
|
+
const where = {
|
|
259
|
+
registrationFile_not: null // Only get agents with registration files
|
|
260
|
+
};
|
|
261
|
+
// Note: Most search fields are in registrationFile, so we need to filter after fetching
|
|
262
|
+
// For now, we'll do basic filtering on Agent fields and then filter on registrationFile fields
|
|
263
|
+
if (params.active !== undefined || params.mcp !== undefined || params.a2a !== undefined ||
|
|
264
|
+
params.x402support !== undefined || params.ens || params.walletAddress ||
|
|
265
|
+
params.supportedTrust || params.a2aSkills || params.mcpTools || params.name) {
|
|
266
|
+
// Push basic filters to subgraph using nested registrationFile filters
|
|
267
|
+
const registrationFileFilters = {};
|
|
268
|
+
if (params.active !== undefined)
|
|
269
|
+
registrationFileFilters.active = params.active;
|
|
270
|
+
if (params.x402support !== undefined)
|
|
271
|
+
registrationFileFilters.x402support = params.x402support;
|
|
272
|
+
if (params.ens)
|
|
273
|
+
registrationFileFilters.ens = params.ens.toLowerCase();
|
|
274
|
+
if (params.walletAddress)
|
|
275
|
+
registrationFileFilters.agentWallet = params.walletAddress.toLowerCase();
|
|
276
|
+
if (params.mcp !== undefined) {
|
|
277
|
+
registrationFileFilters[params.mcp ? 'mcpEndpoint_not' : 'mcpEndpoint'] = null;
|
|
278
|
+
}
|
|
279
|
+
if (params.a2a !== undefined) {
|
|
280
|
+
registrationFileFilters[params.a2a ? 'a2aEndpoint_not' : 'a2aEndpoint'] = null;
|
|
281
|
+
}
|
|
282
|
+
const whereWithFilters = {};
|
|
283
|
+
if (Object.keys(registrationFileFilters).length > 0) {
|
|
284
|
+
// Python SDK uses "registrationFile_" (with underscore) for nested filters
|
|
285
|
+
whereWithFilters.registrationFile_ = registrationFileFilters;
|
|
286
|
+
}
|
|
287
|
+
// Fetch records with filters and pagination applied at subgraph level
|
|
288
|
+
const allAgents = await this.getAgents({ where: whereWithFilters, first, skip });
|
|
289
|
+
// Only filter client-side for fields that can't be filtered at subgraph level
|
|
290
|
+
// Fields already filtered at subgraph level: active, x402support, mcp, a2a, ens, walletAddress
|
|
291
|
+
return allAgents.filter((agent) => {
|
|
292
|
+
// Name filtering (substring search - not supported at subgraph level)
|
|
293
|
+
if (params.name && !agent.name.toLowerCase().includes(params.name.toLowerCase())) {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
// Array contains filtering (supportedTrust, a2aSkills, mcpTools) - these require array contains logic
|
|
297
|
+
if (params.supportedTrust && params.supportedTrust.length > 0) {
|
|
298
|
+
const hasAllTrusts = params.supportedTrust.every(trust => agent.supportedTrusts.includes(trust));
|
|
299
|
+
if (!hasAllTrusts)
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
if (params.a2aSkills && params.a2aSkills.length > 0) {
|
|
303
|
+
const hasAllSkills = params.a2aSkills.every(skill => agent.a2aSkills.includes(skill));
|
|
304
|
+
if (!hasAllSkills)
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
if (params.mcpTools && params.mcpTools.length > 0) {
|
|
308
|
+
const hasAllTools = params.mcpTools.every(tool => agent.mcpTools.includes(tool));
|
|
309
|
+
if (!hasAllTools)
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
return true;
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
return this.getAgents({ where, first, skip });
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Search feedback with filters
|
|
319
|
+
*/
|
|
320
|
+
async searchFeedback(params, first = 100, skip = 0, orderBy = 'createdAt', orderDirection = 'desc') {
|
|
321
|
+
// Build WHERE clause from params
|
|
322
|
+
const whereConditions = [];
|
|
323
|
+
if (params.agents && params.agents.length > 0) {
|
|
324
|
+
const agentIds = params.agents.map((aid) => `"${aid}"`).join(', ');
|
|
325
|
+
whereConditions.push(`agent_in: [${agentIds}]`);
|
|
326
|
+
}
|
|
327
|
+
if (params.reviewers && params.reviewers.length > 0) {
|
|
328
|
+
const reviewers = params.reviewers.map((addr) => `"${addr}"`).join(', ');
|
|
329
|
+
whereConditions.push(`clientAddress_in: [${reviewers}]`);
|
|
330
|
+
}
|
|
331
|
+
if (!params.includeRevoked) {
|
|
332
|
+
whereConditions.push('isRevoked: false');
|
|
333
|
+
}
|
|
334
|
+
// Build all non-tag conditions first
|
|
335
|
+
const nonTagConditions = [...whereConditions];
|
|
336
|
+
// Handle tag filtering separately - it needs to be at the top level
|
|
337
|
+
let tagFilterCondition = null;
|
|
338
|
+
if (params.tags && params.tags.length > 0) {
|
|
339
|
+
// Tag search: any of the tags must match in tag1 OR tag2
|
|
340
|
+
// Build complete condition with all filters for each tag alternative
|
|
341
|
+
const tagWhereItems = [];
|
|
342
|
+
for (const tag of params.tags) {
|
|
343
|
+
// For tag1 match
|
|
344
|
+
const allConditionsTag1 = [...nonTagConditions, `tag1: "${tag}"`];
|
|
345
|
+
tagWhereItems.push(`{ ${allConditionsTag1.join(', ')} }`);
|
|
346
|
+
// For tag2 match
|
|
347
|
+
const allConditionsTag2 = [...nonTagConditions, `tag2: "${tag}"`];
|
|
348
|
+
tagWhereItems.push(`{ ${allConditionsTag2.join(', ')} }`);
|
|
349
|
+
}
|
|
350
|
+
// Join all tag alternatives
|
|
351
|
+
tagFilterCondition = tagWhereItems.join(', ');
|
|
352
|
+
}
|
|
353
|
+
if (params.minScore !== undefined) {
|
|
354
|
+
whereConditions.push(`score_gte: ${params.minScore}`);
|
|
355
|
+
}
|
|
356
|
+
if (params.maxScore !== undefined) {
|
|
357
|
+
whereConditions.push(`score_lte: ${params.maxScore}`);
|
|
358
|
+
}
|
|
359
|
+
// Feedback file filters
|
|
360
|
+
const feedbackFileFilters = [];
|
|
361
|
+
if (params.capabilities && params.capabilities.length > 0) {
|
|
362
|
+
const capabilities = params.capabilities.map((cap) => `"${cap}"`).join(', ');
|
|
363
|
+
feedbackFileFilters.push(`capability_in: [${capabilities}]`);
|
|
364
|
+
}
|
|
365
|
+
if (params.skills && params.skills.length > 0) {
|
|
366
|
+
const skills = params.skills.map((skill) => `"${skill}"`).join(', ');
|
|
367
|
+
feedbackFileFilters.push(`skill_in: [${skills}]`);
|
|
368
|
+
}
|
|
369
|
+
if (params.tasks && params.tasks.length > 0) {
|
|
370
|
+
const tasks = params.tasks.map((task) => `"${task}"`).join(', ');
|
|
371
|
+
feedbackFileFilters.push(`task_in: [${tasks}]`);
|
|
372
|
+
}
|
|
373
|
+
if (params.names && params.names.length > 0) {
|
|
374
|
+
const names = params.names.map((name) => `"${name}"`).join(', ');
|
|
375
|
+
feedbackFileFilters.push(`name_in: [${names}]`);
|
|
376
|
+
}
|
|
377
|
+
if (feedbackFileFilters.length > 0) {
|
|
378
|
+
whereConditions.push(`feedbackFile_: { ${feedbackFileFilters.join(', ')} }`);
|
|
379
|
+
}
|
|
380
|
+
// Use tag_filter_condition if tags were provided, otherwise use standard where clause
|
|
381
|
+
let whereClause = '';
|
|
382
|
+
if (tagFilterCondition) {
|
|
383
|
+
// tagFilterCondition already contains properly formatted items
|
|
384
|
+
whereClause = `where: { or: [${tagFilterCondition}] }`;
|
|
385
|
+
}
|
|
386
|
+
else if (whereConditions.length > 0) {
|
|
387
|
+
whereClause = `where: { ${whereConditions.join(', ')} }`;
|
|
388
|
+
}
|
|
389
|
+
const query = `
|
|
390
|
+
{
|
|
391
|
+
feedbacks(
|
|
392
|
+
${whereClause}
|
|
393
|
+
first: ${first}
|
|
394
|
+
skip: ${skip}
|
|
395
|
+
orderBy: ${orderBy}
|
|
396
|
+
orderDirection: ${orderDirection}
|
|
397
|
+
) {
|
|
398
|
+
id
|
|
399
|
+
agent { id agentId chainId }
|
|
400
|
+
clientAddress
|
|
401
|
+
score
|
|
402
|
+
tag1
|
|
403
|
+
tag2
|
|
404
|
+
feedbackUri
|
|
405
|
+
feedbackURIType
|
|
406
|
+
feedbackHash
|
|
407
|
+
isRevoked
|
|
408
|
+
createdAt
|
|
409
|
+
revokedAt
|
|
410
|
+
feedbackFile {
|
|
411
|
+
id
|
|
412
|
+
feedbackId
|
|
413
|
+
text
|
|
414
|
+
capability
|
|
415
|
+
name
|
|
416
|
+
skill
|
|
417
|
+
task
|
|
418
|
+
context
|
|
419
|
+
proofOfPaymentFromAddress
|
|
420
|
+
proofOfPaymentToAddress
|
|
421
|
+
proofOfPaymentChainId
|
|
422
|
+
proofOfPaymentTxHash
|
|
423
|
+
tag1
|
|
424
|
+
tag2
|
|
425
|
+
createdAt
|
|
426
|
+
}
|
|
427
|
+
responses {
|
|
428
|
+
id
|
|
429
|
+
responder
|
|
430
|
+
responseUri
|
|
431
|
+
responseHash
|
|
432
|
+
createdAt
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
`;
|
|
437
|
+
const result = await this.query(query);
|
|
438
|
+
return result.feedbacks || [];
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Search agents filtered by reputation criteria
|
|
442
|
+
*/
|
|
443
|
+
async searchAgentsByReputation(agents, tags, reviewers, capabilities, skills, tasks, names, minAverageScore, includeRevoked = false, first = 100, skip = 0, orderBy = 'createdAt', orderDirection = 'desc') {
|
|
444
|
+
// Build feedback filters
|
|
445
|
+
const feedbackFilters = [];
|
|
446
|
+
if (!includeRevoked) {
|
|
447
|
+
feedbackFilters.push('isRevoked: false');
|
|
448
|
+
}
|
|
449
|
+
if (tags && tags.length > 0) {
|
|
450
|
+
const tagFilterItems = [];
|
|
451
|
+
for (const tag of tags) {
|
|
452
|
+
tagFilterItems.push(`{or: [{tag1: "${tag}"}, {tag2: "${tag}"}]}`);
|
|
453
|
+
}
|
|
454
|
+
feedbackFilters.push(`or: [${tagFilterItems.join(', ')}]`);
|
|
455
|
+
}
|
|
456
|
+
if (reviewers && reviewers.length > 0) {
|
|
457
|
+
const reviewersList = reviewers.map((addr) => `"${addr}"`).join(', ');
|
|
458
|
+
feedbackFilters.push(`clientAddress_in: [${reviewersList}]`);
|
|
459
|
+
}
|
|
460
|
+
// Feedback file filters
|
|
461
|
+
const feedbackFileFilters = [];
|
|
462
|
+
if (capabilities && capabilities.length > 0) {
|
|
463
|
+
const capabilitiesList = capabilities.map((cap) => `"${cap}"`).join(', ');
|
|
464
|
+
feedbackFileFilters.push(`capability_in: [${capabilitiesList}]`);
|
|
465
|
+
}
|
|
466
|
+
if (skills && skills.length > 0) {
|
|
467
|
+
const skillsList = skills.map((skill) => `"${skill}"`).join(', ');
|
|
468
|
+
feedbackFileFilters.push(`skill_in: [${skillsList}]`);
|
|
469
|
+
}
|
|
470
|
+
if (tasks && tasks.length > 0) {
|
|
471
|
+
const tasksList = tasks.map((task) => `"${task}"`).join(', ');
|
|
472
|
+
feedbackFileFilters.push(`task_in: [${tasksList}]`);
|
|
473
|
+
}
|
|
474
|
+
if (names && names.length > 0) {
|
|
475
|
+
const namesList = names.map((name) => `"${name}"`).join(', ');
|
|
476
|
+
feedbackFileFilters.push(`name_in: [${namesList}]`);
|
|
477
|
+
}
|
|
478
|
+
if (feedbackFileFilters.length > 0) {
|
|
479
|
+
feedbackFilters.push(`feedbackFile_: { ${feedbackFileFilters.join(', ')} }`);
|
|
480
|
+
}
|
|
481
|
+
// If we have feedback filters, first query feedback to get agent IDs
|
|
482
|
+
let agentWhere = '';
|
|
483
|
+
if (tags || capabilities || skills || tasks || names || reviewers) {
|
|
484
|
+
const feedbackWhere = feedbackFilters.length > 0
|
|
485
|
+
? `{ ${feedbackFilters.join(', ')} }`
|
|
486
|
+
: '{}';
|
|
487
|
+
const feedbackQuery = `
|
|
488
|
+
{
|
|
489
|
+
feedbacks(
|
|
490
|
+
where: ${feedbackWhere}
|
|
491
|
+
first: 1000
|
|
492
|
+
skip: 0
|
|
493
|
+
) {
|
|
494
|
+
agent {
|
|
495
|
+
id
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
`;
|
|
500
|
+
try {
|
|
501
|
+
const feedbackResult = await this.query(feedbackQuery);
|
|
502
|
+
const feedbacksData = feedbackResult.feedbacks || [];
|
|
503
|
+
// Extract unique agent IDs
|
|
504
|
+
const agentIdsSet = new Set();
|
|
505
|
+
for (const fb of feedbacksData) {
|
|
506
|
+
const agentId = fb.agent?.id;
|
|
507
|
+
if (agentId) {
|
|
508
|
+
agentIdsSet.add(agentId);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
if (agentIdsSet.size === 0) {
|
|
512
|
+
// No agents have matching feedback
|
|
513
|
+
return [];
|
|
514
|
+
}
|
|
515
|
+
// Apply agent filter if specified
|
|
516
|
+
let agentIdsList = Array.from(agentIdsSet);
|
|
517
|
+
if (agents && agents.length > 0) {
|
|
518
|
+
agentIdsList = agentIdsList.filter((aid) => agents.includes(aid));
|
|
519
|
+
if (agentIdsList.length === 0) {
|
|
520
|
+
return [];
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const agentIdsStr = agentIdsList.map((aid) => `"${aid}"`).join(', ');
|
|
524
|
+
agentWhere = `where: { id_in: [${agentIdsStr}] }`;
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
// If feedback query fails, return empty
|
|
528
|
+
return [];
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
// No feedback filters - query agents directly
|
|
533
|
+
const agentFilters = [];
|
|
534
|
+
if (agents && agents.length > 0) {
|
|
535
|
+
const agentIds = agents.map((aid) => `"${aid}"`).join(', ');
|
|
536
|
+
agentFilters.push(`id_in: [${agentIds}]`);
|
|
537
|
+
}
|
|
538
|
+
if (agentFilters.length > 0) {
|
|
539
|
+
agentWhere = `where: { ${agentFilters.join(', ')} }`;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
// Build feedback where for agent query (to calculate scores)
|
|
543
|
+
const feedbackWhereForAgents = feedbackFilters.length > 0
|
|
544
|
+
? `{ ${feedbackFilters.join(', ')} }`
|
|
545
|
+
: '{}';
|
|
546
|
+
const query = `
|
|
547
|
+
{
|
|
548
|
+
agents(
|
|
549
|
+
${agentWhere}
|
|
550
|
+
first: ${first}
|
|
551
|
+
skip: ${skip}
|
|
552
|
+
orderBy: ${orderBy}
|
|
553
|
+
orderDirection: ${orderDirection}
|
|
554
|
+
) {
|
|
555
|
+
id
|
|
556
|
+
chainId
|
|
557
|
+
agentId
|
|
558
|
+
agentURI
|
|
559
|
+
agentURIType
|
|
560
|
+
owner
|
|
561
|
+
operators
|
|
562
|
+
createdAt
|
|
563
|
+
updatedAt
|
|
564
|
+
totalFeedback
|
|
565
|
+
lastActivity
|
|
566
|
+
registrationFile {
|
|
567
|
+
id
|
|
568
|
+
name
|
|
569
|
+
description
|
|
570
|
+
image
|
|
571
|
+
active
|
|
572
|
+
x402support
|
|
573
|
+
supportedTrusts
|
|
574
|
+
mcpEndpoint
|
|
575
|
+
mcpVersion
|
|
576
|
+
a2aEndpoint
|
|
577
|
+
a2aVersion
|
|
578
|
+
ens
|
|
579
|
+
did
|
|
580
|
+
agentWallet
|
|
581
|
+
agentWalletChainId
|
|
582
|
+
mcpTools
|
|
583
|
+
mcpPrompts
|
|
584
|
+
mcpResources
|
|
585
|
+
a2aSkills
|
|
586
|
+
createdAt
|
|
587
|
+
}
|
|
588
|
+
feedback(where: ${feedbackWhereForAgents}) {
|
|
589
|
+
score
|
|
590
|
+
isRevoked
|
|
591
|
+
feedbackFile {
|
|
592
|
+
capability
|
|
593
|
+
skill
|
|
594
|
+
task
|
|
595
|
+
name
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
`;
|
|
601
|
+
try {
|
|
602
|
+
const result = await this.query(query);
|
|
603
|
+
const agentsResult = result.agents || [];
|
|
604
|
+
// Calculate average scores
|
|
605
|
+
const agentsWithScores = agentsResult.map((agent) => {
|
|
606
|
+
const feedbacks = agent.feedback || [];
|
|
607
|
+
let averageScore = null;
|
|
608
|
+
if (feedbacks.length > 0) {
|
|
609
|
+
const scores = feedbacks
|
|
610
|
+
.filter((fb) => fb.score > 0)
|
|
611
|
+
.map((fb) => fb.score);
|
|
612
|
+
if (scores.length > 0) {
|
|
613
|
+
averageScore = scores.reduce((sum, score) => sum + score, 0) / scores.length;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
// Remove feedback array from result (not part of QueryAgent)
|
|
617
|
+
const { feedback, ...agentData } = agent;
|
|
618
|
+
return {
|
|
619
|
+
...agentData,
|
|
620
|
+
averageScore,
|
|
621
|
+
};
|
|
622
|
+
});
|
|
623
|
+
// Filter by minAverageScore
|
|
624
|
+
let filteredAgents = agentsWithScores;
|
|
625
|
+
if (minAverageScore !== undefined) {
|
|
626
|
+
filteredAgents = agentsWithScores.filter((agent) => agent.averageScore !== null && agent.averageScore >= minAverageScore);
|
|
627
|
+
}
|
|
628
|
+
return filteredAgents;
|
|
629
|
+
}
|
|
630
|
+
catch (error) {
|
|
631
|
+
throw new Error(`Subgraph reputation search failed: ${error}`);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
//# sourceMappingURL=subgraph-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph-client.js","sourceRoot":"","sources":["../../src/core/subgraph-client.ts"],"names":[],"mappings":"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"}
|