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,543 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback management system for Agent0 SDK
|
|
3
|
+
*/
|
|
4
|
+
import { ethers } from 'ethers';
|
|
5
|
+
import { parseAgentId, formatFeedbackId, parseFeedbackId } from '../utils/id-format';
|
|
6
|
+
import { DEFAULTS } from '../utils/constants';
|
|
7
|
+
/**
|
|
8
|
+
* Manages feedback operations for the Agent0 SDK
|
|
9
|
+
*/
|
|
10
|
+
export class FeedbackManager {
|
|
11
|
+
constructor(web3Client, ipfsClient, reputationRegistry, identityRegistry, subgraphClient) {
|
|
12
|
+
this.web3Client = web3Client;
|
|
13
|
+
this.ipfsClient = ipfsClient;
|
|
14
|
+
this.reputationRegistry = reputationRegistry;
|
|
15
|
+
this.identityRegistry = identityRegistry;
|
|
16
|
+
this.subgraphClient = subgraphClient;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Set reputation registry contract (for lazy initialization)
|
|
20
|
+
*/
|
|
21
|
+
setReputationRegistry(registry) {
|
|
22
|
+
this.reputationRegistry = registry;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set identity registry contract (for lazy initialization)
|
|
26
|
+
*/
|
|
27
|
+
setIdentityRegistry(registry) {
|
|
28
|
+
this.identityRegistry = registry;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Sign feedback authorization for a client
|
|
32
|
+
*/
|
|
33
|
+
async signFeedbackAuth(agentId, clientAddress, indexLimit, expiryHours = DEFAULTS.FEEDBACK_EXPIRY_HOURS) {
|
|
34
|
+
// Parse agent ID to get token ID
|
|
35
|
+
const { tokenId } = parseAgentId(agentId);
|
|
36
|
+
// Get current feedback index if not provided
|
|
37
|
+
let indexLimitValue = indexLimit;
|
|
38
|
+
if (indexLimitValue === undefined && this.reputationRegistry) {
|
|
39
|
+
try {
|
|
40
|
+
const lastIndex = await this.web3Client.callContract(this.reputationRegistry, 'getLastIndex', BigInt(tokenId), clientAddress);
|
|
41
|
+
indexLimitValue = Number(lastIndex) + 1;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// If we can't get the index, default to 1 (for first feedback)
|
|
45
|
+
indexLimitValue = 1;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (indexLimitValue === undefined) {
|
|
49
|
+
indexLimitValue = 1;
|
|
50
|
+
}
|
|
51
|
+
// Calculate expiry timestamp
|
|
52
|
+
const expiry = BigInt(Math.floor(Date.now() / 1000) + expiryHours * 3600);
|
|
53
|
+
// Get chain ID (await if needed)
|
|
54
|
+
let chainId;
|
|
55
|
+
if (this.web3Client.chainId === 0n) {
|
|
56
|
+
await this.web3Client.initialize();
|
|
57
|
+
chainId = this.web3Client.chainId;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
chainId = this.web3Client.chainId;
|
|
61
|
+
}
|
|
62
|
+
const identityRegistryAddress = this.identityRegistry
|
|
63
|
+
? await this.identityRegistry.getAddress()
|
|
64
|
+
: '0x0';
|
|
65
|
+
const signerAddress = this.web3Client.address || '0x0';
|
|
66
|
+
if (!signerAddress || signerAddress === '0x0') {
|
|
67
|
+
throw new Error('No signer available for feedback authorization');
|
|
68
|
+
}
|
|
69
|
+
// Encode feedback auth data
|
|
70
|
+
const authData = this.web3Client.encodeFeedbackAuth(BigInt(tokenId), clientAddress, BigInt(indexLimitValue), expiry, chainId, identityRegistryAddress, signerAddress);
|
|
71
|
+
// Hash the encoded data (matching contract's keccak256(abi.encode(...)))
|
|
72
|
+
// The contract expects: keccak256(abi.encode(...)) then signed with Ethereum message prefix
|
|
73
|
+
const messageHash = ethers.keccak256(ethers.getBytes(authData));
|
|
74
|
+
// Sign the hash (ethers.js will add the Ethereum signed message prefix automatically)
|
|
75
|
+
const signature = await this.web3Client.signMessage(ethers.getBytes(messageHash));
|
|
76
|
+
// Combine auth data and signature
|
|
77
|
+
// Both are hex strings, combine them
|
|
78
|
+
const authDataNoPrefix = authData.startsWith('0x') ? authData.slice(2) : authData;
|
|
79
|
+
const sigNoPrefix = signature.startsWith('0x') ? signature.slice(2) : signature;
|
|
80
|
+
return '0x' + authDataNoPrefix + sigNoPrefix;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Prepare feedback file (local file/object) according to spec
|
|
84
|
+
*/
|
|
85
|
+
prepareFeedback(agentId, score, // 0-100
|
|
86
|
+
tags, text, capability, name, skill, task, context, proofOfPayment, extra) {
|
|
87
|
+
const tagsArray = tags || [];
|
|
88
|
+
// Parse agent ID to get token ID
|
|
89
|
+
const { tokenId } = parseAgentId(agentId);
|
|
90
|
+
// Get current timestamp in ISO format
|
|
91
|
+
const createdAt = new Date().toISOString();
|
|
92
|
+
// Determine chain ID and registry address
|
|
93
|
+
const chainId = this.web3Client.chainId;
|
|
94
|
+
const identityRegistryAddress = this.identityRegistry
|
|
95
|
+
? this.identityRegistry.target
|
|
96
|
+
: '0x0';
|
|
97
|
+
const clientAddress = this.web3Client.address || '0x0';
|
|
98
|
+
// Build feedback data according to spec
|
|
99
|
+
const feedbackData = {
|
|
100
|
+
// MUST FIELDS
|
|
101
|
+
agentRegistry: `eip155:${chainId}:${identityRegistryAddress}`,
|
|
102
|
+
agentId: tokenId,
|
|
103
|
+
clientAddress: `eip155:${chainId}:${clientAddress}`,
|
|
104
|
+
createdAt,
|
|
105
|
+
feedbackAuth: '', // Will be filled when giving feedback
|
|
106
|
+
score: score !== undefined ? Math.round(score) : 0, // Score as integer (0-100)
|
|
107
|
+
// MAY FIELDS
|
|
108
|
+
tag1: tagsArray[0] || undefined,
|
|
109
|
+
tag2: tagsArray.length > 1 ? tagsArray[1] : undefined,
|
|
110
|
+
skill,
|
|
111
|
+
context,
|
|
112
|
+
task,
|
|
113
|
+
capability,
|
|
114
|
+
name,
|
|
115
|
+
proofOfPayment: proofOfPayment,
|
|
116
|
+
};
|
|
117
|
+
// Remove undefined values to keep the structure clean
|
|
118
|
+
const cleaned = {};
|
|
119
|
+
for (const [key, value] of Object.entries(feedbackData)) {
|
|
120
|
+
if (value !== undefined && value !== null) {
|
|
121
|
+
cleaned[key] = value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (extra) {
|
|
125
|
+
Object.assign(cleaned, extra);
|
|
126
|
+
}
|
|
127
|
+
return cleaned;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Give feedback (maps 8004 endpoint)
|
|
131
|
+
*/
|
|
132
|
+
async giveFeedback(agentId, feedbackFile, idem, feedbackAuth) {
|
|
133
|
+
// Parse agent ID
|
|
134
|
+
const { tokenId } = parseAgentId(agentId);
|
|
135
|
+
// Get client address (the one giving feedback)
|
|
136
|
+
const clientAddress = this.web3Client.address;
|
|
137
|
+
if (!clientAddress) {
|
|
138
|
+
throw new Error('No signer available. Cannot give feedback without a wallet.');
|
|
139
|
+
}
|
|
140
|
+
// Get current feedback index for this client-agent pair
|
|
141
|
+
let feedbackIndex;
|
|
142
|
+
try {
|
|
143
|
+
if (!this.reputationRegistry) {
|
|
144
|
+
throw new Error('Reputation registry not available');
|
|
145
|
+
}
|
|
146
|
+
const lastIndex = await this.web3Client.callContract(this.reputationRegistry, 'getLastIndex', BigInt(tokenId), clientAddress);
|
|
147
|
+
feedbackIndex = Number(lastIndex) + 1;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
151
|
+
throw new Error(`Failed to get feedback index: ${errorMessage}`);
|
|
152
|
+
}
|
|
153
|
+
// Prepare feedback auth (use provided auth or create new one)
|
|
154
|
+
let authBytes;
|
|
155
|
+
if (feedbackAuth) {
|
|
156
|
+
authBytes = feedbackAuth;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const authHex = await this.signFeedbackAuth(agentId, clientAddress, feedbackIndex, 24);
|
|
160
|
+
authBytes = authHex;
|
|
161
|
+
}
|
|
162
|
+
// Update feedback file with auth
|
|
163
|
+
feedbackFile.feedbackAuth = authBytes.startsWith('0x') ? authBytes : '0x' + authBytes;
|
|
164
|
+
// Prepare on-chain data (only basic fields, no capability/endpoint)
|
|
165
|
+
const score = feedbackFile.score !== undefined ? Number(feedbackFile.score) : 0;
|
|
166
|
+
const tag1Str = typeof feedbackFile.tag1 === 'string' ? feedbackFile.tag1 : '';
|
|
167
|
+
const tag2Str = typeof feedbackFile.tag2 === 'string' ? feedbackFile.tag2 : '';
|
|
168
|
+
const tag1 = this._stringToBytes32(tag1Str);
|
|
169
|
+
const tag2 = this._stringToBytes32(tag2Str);
|
|
170
|
+
// Handle off-chain file storage
|
|
171
|
+
let feedbackUri = '';
|
|
172
|
+
let feedbackHash = '0x' + '00'.repeat(32); // Default empty hash
|
|
173
|
+
if (this.ipfsClient) {
|
|
174
|
+
// Store feedback file on IPFS
|
|
175
|
+
try {
|
|
176
|
+
const cid = await this.ipfsClient.addJson(feedbackFile);
|
|
177
|
+
feedbackUri = `ipfs://${cid}`;
|
|
178
|
+
// Calculate hash of sorted JSON
|
|
179
|
+
const sortedJson = JSON.stringify(feedbackFile, Object.keys(feedbackFile).sort());
|
|
180
|
+
feedbackHash = this.web3Client.keccak256(sortedJson);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
// Failed to store on IPFS - continue without IPFS storage
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (feedbackFile.context || feedbackFile.capability || feedbackFile.name) {
|
|
187
|
+
// If we have rich data but no IPFS, we need to store it somewhere
|
|
188
|
+
throw new Error('Rich feedback data requires IPFS client for storage');
|
|
189
|
+
}
|
|
190
|
+
// Submit to blockchain
|
|
191
|
+
if (!this.reputationRegistry) {
|
|
192
|
+
throw new Error('Reputation registry not available');
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
const txHash = await this.web3Client.transactContract(this.reputationRegistry, 'giveFeedback', {}, BigInt(tokenId), score, tag1, tag2, feedbackUri, feedbackHash, ethers.getBytes(authBytes.startsWith('0x') ? authBytes : '0x' + authBytes));
|
|
196
|
+
// Wait for transaction confirmation
|
|
197
|
+
await this.web3Client.waitForTransaction(txHash);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
201
|
+
throw new Error(`Failed to submit feedback to blockchain: ${errorMessage}`);
|
|
202
|
+
}
|
|
203
|
+
// Create feedback object
|
|
204
|
+
const parsedId = parseFeedbackId(formatFeedbackId(agentId, clientAddress, feedbackIndex));
|
|
205
|
+
// Extract typed values from feedbackFile (Record<string, unknown>)
|
|
206
|
+
const tag1Value = typeof feedbackFile.tag1 === 'string' ? feedbackFile.tag1 : undefined;
|
|
207
|
+
const tag2Value = typeof feedbackFile.tag2 === 'string' ? feedbackFile.tag2 : undefined;
|
|
208
|
+
const textValue = typeof feedbackFile.text === 'string' ? feedbackFile.text : undefined;
|
|
209
|
+
const contextValue = feedbackFile.context && typeof feedbackFile.context === 'object' && !Array.isArray(feedbackFile.context)
|
|
210
|
+
? feedbackFile.context
|
|
211
|
+
: undefined;
|
|
212
|
+
const proofOfPaymentValue = feedbackFile.proofOfPayment && typeof feedbackFile.proofOfPayment === 'object' && !Array.isArray(feedbackFile.proofOfPayment)
|
|
213
|
+
? feedbackFile.proofOfPayment
|
|
214
|
+
: undefined;
|
|
215
|
+
return {
|
|
216
|
+
id: [parsedId.agentId, parsedId.clientAddress, parsedId.feedbackIndex],
|
|
217
|
+
agentId,
|
|
218
|
+
reviewer: clientAddress,
|
|
219
|
+
score: score > 0 ? score : undefined,
|
|
220
|
+
tags: [tag1Value, tag2Value].filter(Boolean),
|
|
221
|
+
text: textValue,
|
|
222
|
+
context: contextValue,
|
|
223
|
+
proofOfPayment: proofOfPaymentValue,
|
|
224
|
+
fileURI: feedbackUri || undefined,
|
|
225
|
+
createdAt: Math.floor(Date.now() / 1000),
|
|
226
|
+
answers: [],
|
|
227
|
+
isRevoked: false,
|
|
228
|
+
// Off-chain only fields
|
|
229
|
+
capability: typeof feedbackFile.capability === 'string' ? feedbackFile.capability : undefined,
|
|
230
|
+
name: typeof feedbackFile.name === 'string' ? feedbackFile.name : undefined,
|
|
231
|
+
skill: typeof feedbackFile.skill === 'string' ? feedbackFile.skill : undefined,
|
|
232
|
+
task: typeof feedbackFile.task === 'string' ? feedbackFile.task : undefined,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get single feedback with responses
|
|
237
|
+
* Currently only supports blockchain query - subgraph support coming soon
|
|
238
|
+
*/
|
|
239
|
+
async getFeedback(agentId, clientAddress, feedbackIndex) {
|
|
240
|
+
return await this._getFeedbackFromBlockchain(agentId, clientAddress, feedbackIndex);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get feedback from blockchain
|
|
244
|
+
*/
|
|
245
|
+
async _getFeedbackFromBlockchain(agentId, clientAddress, feedbackIndex) {
|
|
246
|
+
if (!this.reputationRegistry) {
|
|
247
|
+
throw new Error('Reputation registry not available');
|
|
248
|
+
}
|
|
249
|
+
const { tokenId } = parseAgentId(agentId);
|
|
250
|
+
try {
|
|
251
|
+
const [score, tag1Bytes, tag2Bytes, isRevoked] = await this.web3Client.callContract(this.reputationRegistry, 'readFeedback', BigInt(tokenId), clientAddress, BigInt(feedbackIndex));
|
|
252
|
+
const tags = this._bytes32ToTags(tag1Bytes, tag2Bytes);
|
|
253
|
+
return {
|
|
254
|
+
id: [agentId, clientAddress.toLowerCase(), feedbackIndex],
|
|
255
|
+
agentId,
|
|
256
|
+
reviewer: clientAddress,
|
|
257
|
+
score: Number(score),
|
|
258
|
+
tags,
|
|
259
|
+
createdAt: Math.floor(Date.now() / 1000), // Approximate, could be improved
|
|
260
|
+
answers: [],
|
|
261
|
+
isRevoked: Boolean(isRevoked),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
266
|
+
throw new Error(`Failed to read feedback from blockchain: ${errorMessage}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Search feedback with filters
|
|
271
|
+
* Uses subgraph if available, otherwise returns empty array
|
|
272
|
+
*/
|
|
273
|
+
async searchFeedback(params) {
|
|
274
|
+
if (!this.subgraphClient) {
|
|
275
|
+
// Fallback not implemented (would require blockchain queries)
|
|
276
|
+
// For now, return empty if subgraph unavailable
|
|
277
|
+
return [];
|
|
278
|
+
}
|
|
279
|
+
// Query subgraph
|
|
280
|
+
const feedbacksData = await this.subgraphClient.searchFeedback({
|
|
281
|
+
agents: params.agents,
|
|
282
|
+
reviewers: params.reviewers,
|
|
283
|
+
tags: params.tags,
|
|
284
|
+
capabilities: params.capabilities,
|
|
285
|
+
skills: params.skills,
|
|
286
|
+
tasks: params.tasks,
|
|
287
|
+
names: params.names,
|
|
288
|
+
minScore: params.minScore,
|
|
289
|
+
maxScore: params.maxScore,
|
|
290
|
+
includeRevoked: params.includeRevoked || false,
|
|
291
|
+
}, 100, // first
|
|
292
|
+
0, // skip
|
|
293
|
+
'createdAt', 'desc');
|
|
294
|
+
// Map to Feedback objects
|
|
295
|
+
const feedbacks = [];
|
|
296
|
+
for (const fbData of feedbacksData) {
|
|
297
|
+
// Parse agentId from feedback ID
|
|
298
|
+
const feedbackId = fbData.id;
|
|
299
|
+
const parts = feedbackId.split(':');
|
|
300
|
+
let agentIdStr;
|
|
301
|
+
let clientAddr;
|
|
302
|
+
let feedbackIdx;
|
|
303
|
+
if (parts.length >= 2) {
|
|
304
|
+
agentIdStr = `${parts[0]}:${parts[1]}`;
|
|
305
|
+
clientAddr = parts.length > 2 ? parts[2] : '';
|
|
306
|
+
feedbackIdx = parts.length > 3 ? parseInt(parts[3], 10) : 1;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
agentIdStr = feedbackId;
|
|
310
|
+
clientAddr = '';
|
|
311
|
+
feedbackIdx = 1;
|
|
312
|
+
}
|
|
313
|
+
const feedback = this._mapSubgraphFeedbackToModel(fbData, agentIdStr, clientAddr, feedbackIdx);
|
|
314
|
+
feedbacks.push(feedback);
|
|
315
|
+
}
|
|
316
|
+
return feedbacks;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Map subgraph feedback data to Feedback model
|
|
320
|
+
*/
|
|
321
|
+
_mapSubgraphFeedbackToModel(feedbackData, agentId, clientAddress, feedbackIndex) {
|
|
322
|
+
const feedbackFile = feedbackData.feedbackFile || {};
|
|
323
|
+
// Map responses
|
|
324
|
+
const responsesData = feedbackData.responses || [];
|
|
325
|
+
const answers = responsesData.map((resp) => ({
|
|
326
|
+
responder: resp.responder,
|
|
327
|
+
responseUri: resp.responseUri,
|
|
328
|
+
responseHash: resp.responseHash,
|
|
329
|
+
createdAt: resp.createdAt ? parseInt(resp.createdAt, 10) : undefined,
|
|
330
|
+
}));
|
|
331
|
+
// Map tags - check if they're hex bytes32 or plain strings
|
|
332
|
+
const tags = [];
|
|
333
|
+
const tag1 = feedbackData.tag1 || feedbackFile.tag1;
|
|
334
|
+
const tag2 = feedbackData.tag2 || feedbackFile.tag2;
|
|
335
|
+
// Convert hex bytes32 to readable tags
|
|
336
|
+
if (tag1 || tag2) {
|
|
337
|
+
tags.push(...this._hexBytes32ToTags(tag1 || '', tag2 || ''));
|
|
338
|
+
}
|
|
339
|
+
// Build proof of payment object if available
|
|
340
|
+
let proofOfPayment;
|
|
341
|
+
if (feedbackFile.proofOfPaymentFromAddress) {
|
|
342
|
+
proofOfPayment = {
|
|
343
|
+
fromAddress: feedbackFile.proofOfPaymentFromAddress,
|
|
344
|
+
toAddress: feedbackFile.proofOfPaymentToAddress,
|
|
345
|
+
chainId: feedbackFile.proofOfPaymentChainId,
|
|
346
|
+
txHash: feedbackFile.proofOfPaymentTxHash,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Build context object if available
|
|
350
|
+
let context;
|
|
351
|
+
if (feedbackFile.context) {
|
|
352
|
+
try {
|
|
353
|
+
context = typeof feedbackFile.context === 'string'
|
|
354
|
+
? JSON.parse(feedbackFile.context)
|
|
355
|
+
: feedbackFile.context;
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
context = { raw: feedbackFile.context };
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const id = [agentId, clientAddress, feedbackIndex];
|
|
362
|
+
return {
|
|
363
|
+
id,
|
|
364
|
+
agentId,
|
|
365
|
+
reviewer: clientAddress,
|
|
366
|
+
score: feedbackData.score !== undefined && feedbackData.score !== null ? Number(feedbackData.score) : undefined,
|
|
367
|
+
tags,
|
|
368
|
+
text: feedbackFile.text || undefined,
|
|
369
|
+
context,
|
|
370
|
+
proofOfPayment,
|
|
371
|
+
fileURI: feedbackData.feedbackUri || undefined,
|
|
372
|
+
createdAt: feedbackData.createdAt ? parseInt(feedbackData.createdAt, 10) : Math.floor(Date.now() / 1000),
|
|
373
|
+
answers,
|
|
374
|
+
isRevoked: feedbackData.isRevoked || false,
|
|
375
|
+
capability: feedbackFile.capability || undefined,
|
|
376
|
+
name: feedbackFile.name || undefined,
|
|
377
|
+
skill: feedbackFile.skill || undefined,
|
|
378
|
+
task: feedbackFile.task || undefined,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Convert hex bytes32 tags back to strings, or return plain strings as-is
|
|
383
|
+
* The subgraph now stores tags as human-readable strings (not hex),
|
|
384
|
+
* so this method handles both formats for backwards compatibility
|
|
385
|
+
*/
|
|
386
|
+
_hexBytes32ToTags(tag1, tag2) {
|
|
387
|
+
const tags = [];
|
|
388
|
+
if (tag1 && tag1 !== '0x' + '00'.repeat(32)) {
|
|
389
|
+
// If it's already a plain string (from subgraph), use it directly
|
|
390
|
+
if (!tag1.startsWith('0x')) {
|
|
391
|
+
if (tag1) {
|
|
392
|
+
tags.push(tag1);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
// Try to convert from hex bytes32 (on-chain format)
|
|
397
|
+
try {
|
|
398
|
+
const hexBytes = ethers.getBytes(tag1);
|
|
399
|
+
const tag1Str = new TextDecoder('utf-8', { fatal: false }).decode(hexBytes.filter((b) => b !== 0));
|
|
400
|
+
if (tag1Str) {
|
|
401
|
+
tags.push(tag1Str);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
// Ignore invalid hex strings
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (tag2 && tag2 !== '0x' + '00'.repeat(32)) {
|
|
410
|
+
// If it's already a plain string (from subgraph), use it directly
|
|
411
|
+
if (!tag2.startsWith('0x')) {
|
|
412
|
+
if (tag2) {
|
|
413
|
+
tags.push(tag2);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
// Try to convert from hex bytes32 (on-chain format)
|
|
418
|
+
try {
|
|
419
|
+
const hexBytes = ethers.getBytes(tag2);
|
|
420
|
+
const tag2Str = new TextDecoder('utf-8', { fatal: false }).decode(hexBytes.filter((b) => b !== 0));
|
|
421
|
+
if (tag2Str) {
|
|
422
|
+
tags.push(tag2Str);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
// Ignore invalid hex strings
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
return tags;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Append response to feedback
|
|
434
|
+
*/
|
|
435
|
+
async appendResponse(agentId, clientAddress, feedbackIndex, responseUri, responseHash) {
|
|
436
|
+
if (!this.reputationRegistry) {
|
|
437
|
+
throw new Error('Reputation registry not available');
|
|
438
|
+
}
|
|
439
|
+
const { tokenId } = parseAgentId(agentId);
|
|
440
|
+
try {
|
|
441
|
+
const txHash = await this.web3Client.transactContract(this.reputationRegistry, 'appendResponse', {}, BigInt(tokenId), clientAddress, BigInt(feedbackIndex), responseUri, responseHash);
|
|
442
|
+
return txHash;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
446
|
+
throw new Error(`Failed to append response: ${errorMessage}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Revoke feedback
|
|
451
|
+
*/
|
|
452
|
+
async revokeFeedback(agentId, feedbackIndex) {
|
|
453
|
+
if (!this.reputationRegistry) {
|
|
454
|
+
throw new Error('Reputation registry not available');
|
|
455
|
+
}
|
|
456
|
+
const { tokenId } = parseAgentId(agentId);
|
|
457
|
+
// Get client address (the one revoking - must be the reviewer)
|
|
458
|
+
const clientAddress = this.web3Client.address;
|
|
459
|
+
if (!clientAddress) {
|
|
460
|
+
throw new Error('No signer available');
|
|
461
|
+
}
|
|
462
|
+
try {
|
|
463
|
+
const txHash = await this.web3Client.transactContract(this.reputationRegistry, 'revokeFeedback', {}, BigInt(tokenId), BigInt(feedbackIndex));
|
|
464
|
+
return txHash;
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
468
|
+
throw new Error(`Failed to revoke feedback: ${errorMessage}`);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Convert string to bytes32 for blockchain storage
|
|
473
|
+
*/
|
|
474
|
+
_stringToBytes32(text) {
|
|
475
|
+
if (!text) {
|
|
476
|
+
return '0x' + '00'.repeat(32);
|
|
477
|
+
}
|
|
478
|
+
// Encode as UTF-8 and pad/truncate to 32 bytes
|
|
479
|
+
const encoder = new TextEncoder();
|
|
480
|
+
const encoded = encoder.encode(text);
|
|
481
|
+
const padded = new Uint8Array(32);
|
|
482
|
+
const length = Math.min(encoded.length, 32);
|
|
483
|
+
padded.set(encoded.slice(0, length), 0);
|
|
484
|
+
return ethers.hexlify(padded);
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Convert bytes32 tags back to strings
|
|
488
|
+
*/
|
|
489
|
+
_bytes32ToTags(tag1Bytes, tag2Bytes) {
|
|
490
|
+
const tags = [];
|
|
491
|
+
if (tag1Bytes && tag1Bytes !== '0x' + '00'.repeat(32)) {
|
|
492
|
+
try {
|
|
493
|
+
const tag1 = ethers.toUtf8String(tag1Bytes).replace(/\0/g, '').trim();
|
|
494
|
+
if (tag1) {
|
|
495
|
+
tags.push(tag1);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
catch {
|
|
499
|
+
// If UTF-8 decode fails, skip this tag
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (tag2Bytes && tag2Bytes !== '0x' + '00'.repeat(32)) {
|
|
503
|
+
try {
|
|
504
|
+
const tag2 = ethers.toUtf8String(tag2Bytes).replace(/\0/g, '').trim();
|
|
505
|
+
if (tag2) {
|
|
506
|
+
tags.push(tag2);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
// If UTF-8 decode fails, skip this tag
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
return tags;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Get reputation summary
|
|
517
|
+
*/
|
|
518
|
+
async getReputationSummary(agentId, tag1, tag2) {
|
|
519
|
+
if (!this.reputationRegistry) {
|
|
520
|
+
throw new Error('Reputation registry not available');
|
|
521
|
+
}
|
|
522
|
+
const { tokenId } = parseAgentId(agentId);
|
|
523
|
+
try {
|
|
524
|
+
const tag1Bytes = tag1 ? this._stringToBytes32(tag1) : '0x' + '00'.repeat(32);
|
|
525
|
+
const tag2Bytes = tag2 ? this._stringToBytes32(tag2) : '0x' + '00'.repeat(32);
|
|
526
|
+
// Get all clients who gave feedback
|
|
527
|
+
const clients = await this.web3Client.callContract(this.reputationRegistry, 'getClients', BigInt(tokenId));
|
|
528
|
+
if (!Array.isArray(clients) || clients.length === 0) {
|
|
529
|
+
return { count: 0, averageScore: 0 };
|
|
530
|
+
}
|
|
531
|
+
const [count, averageScore] = await this.web3Client.callContract(this.reputationRegistry, 'getSummary', BigInt(tokenId), clients, tag1Bytes, tag2Bytes);
|
|
532
|
+
return {
|
|
533
|
+
count: Number(count),
|
|
534
|
+
averageScore: Number(averageScore),
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
catch (error) {
|
|
538
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
539
|
+
throw new Error(`Failed to get reputation summary: ${errorMessage}`);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
//# sourceMappingURL=feedback-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-manager.js","sourceRoot":"","sources":["../../src/core/feedback-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent indexer for discovery and search functionality
|
|
3
|
+
* Simplified version focused on subgraph queries (no local ML indexing)
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentSummary, SearchParams } from '../models/interfaces';
|
|
6
|
+
import type { AgentId } from '../models/types';
|
|
7
|
+
import type { Web3Client } from './web3-client';
|
|
8
|
+
import type { SubgraphClient } from './subgraph-client';
|
|
9
|
+
/**
|
|
10
|
+
* Simplified indexer that primarily uses subgraph for queries
|
|
11
|
+
* No local indexing or ML capabilities - all queries go through subgraph
|
|
12
|
+
*/
|
|
13
|
+
export declare class AgentIndexer {
|
|
14
|
+
private web3Client;
|
|
15
|
+
private subgraphClient?;
|
|
16
|
+
constructor(web3Client: Web3Client, subgraphClient?: SubgraphClient | undefined);
|
|
17
|
+
/**
|
|
18
|
+
* Get agent summary from index/subgraph
|
|
19
|
+
*/
|
|
20
|
+
getAgent(agentId: AgentId): Promise<AgentSummary>;
|
|
21
|
+
/**
|
|
22
|
+
* Search agents with filters
|
|
23
|
+
*/
|
|
24
|
+
searchAgents(params?: SearchParams, pageSize?: number, cursor?: string): Promise<{
|
|
25
|
+
items: AgentSummary[];
|
|
26
|
+
nextCursor?: string;
|
|
27
|
+
}>;
|
|
28
|
+
private _filterAgents;
|
|
29
|
+
/**
|
|
30
|
+
* Search agents by reputation
|
|
31
|
+
*/
|
|
32
|
+
searchAgentsByReputation(agents?: string[], tags?: string[], reviewers?: string[], capabilities?: string[], skills?: string[], tasks?: string[], names?: string[], minAverageScore?: number, includeRevoked?: boolean, first?: number, skip?: number, sort?: string[]): Promise<{
|
|
33
|
+
items: AgentSummary[];
|
|
34
|
+
nextCursor?: string;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/core/indexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD;;;GAGG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc,CAAC;gBADf,UAAU,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,cAAc,YAAA;IAGzC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAcvD;;OAEG;IACG,YAAY,CAChB,MAAM,GAAE,YAAiB,EACzB,QAAQ,GAAE,MAAW,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B1D,OAAO,CAAC,aAAa;IA4GrB;;OAEG;IACG,wBAAwB,CAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,KAAK,CAAC,EAAE,MAAM,EAAE,EAChB,KAAK,CAAC,EAAE,MAAM,EAAE,EAChB,eAAe,CAAC,EAAE,MAAM,EACxB,cAAc,GAAE,OAAe,EAC/B,KAAK,GAAE,MAAW,EAClB,IAAI,GAAE,MAAU,EAChB,IAAI,GAAE,MAAM,EAAuB,GAClC,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAuE3D"}
|