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,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main SDK class for Agent0
|
|
3
|
+
*/
|
|
4
|
+
import { ethers } from 'ethers';
|
|
5
|
+
import type { AgentSummary, Feedback, SearchParams } from '../models/interfaces';
|
|
6
|
+
import type { AgentId, ChainId, Address, URI } from '../models/types';
|
|
7
|
+
import { Web3Client } from './web3-client';
|
|
8
|
+
import { IPFSClient } from './ipfs-client';
|
|
9
|
+
import { SubgraphClient } from './subgraph-client';
|
|
10
|
+
import { Agent } from './agent';
|
|
11
|
+
export interface SDKConfig {
|
|
12
|
+
chainId: ChainId;
|
|
13
|
+
rpcUrl: string;
|
|
14
|
+
signer?: string;
|
|
15
|
+
registryOverrides?: Record<ChainId, Record<string, Address>>;
|
|
16
|
+
ipfs?: 'node' | 'filecoinPin' | 'pinata';
|
|
17
|
+
ipfsNodeUrl?: string;
|
|
18
|
+
filecoinPrivateKey?: string;
|
|
19
|
+
pinataJwt?: string;
|
|
20
|
+
subgraphUrl?: string;
|
|
21
|
+
subgraphOverrides?: Record<ChainId, string>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Main SDK class for Agent0
|
|
25
|
+
*/
|
|
26
|
+
export declare class SDK {
|
|
27
|
+
private readonly _web3Client;
|
|
28
|
+
private _ipfsClient?;
|
|
29
|
+
private _subgraphClient?;
|
|
30
|
+
private readonly _feedbackManager;
|
|
31
|
+
private readonly _indexer;
|
|
32
|
+
private _identityRegistry?;
|
|
33
|
+
private _reputationRegistry?;
|
|
34
|
+
private _validationRegistry?;
|
|
35
|
+
private readonly _registries;
|
|
36
|
+
private readonly _chainId;
|
|
37
|
+
private readonly _subgraphUrls;
|
|
38
|
+
constructor(config: SDKConfig);
|
|
39
|
+
/**
|
|
40
|
+
* Initialize IPFS client based on configuration
|
|
41
|
+
*/
|
|
42
|
+
private _initializeIpfsClient;
|
|
43
|
+
/**
|
|
44
|
+
* Get current chain ID
|
|
45
|
+
*/
|
|
46
|
+
chainId(): Promise<ChainId>;
|
|
47
|
+
/**
|
|
48
|
+
* Get resolved registry addresses for current chain
|
|
49
|
+
*/
|
|
50
|
+
registries(): Record<string, Address>;
|
|
51
|
+
/**
|
|
52
|
+
* Get identity registry contract
|
|
53
|
+
*/
|
|
54
|
+
getIdentityRegistry(): ethers.Contract;
|
|
55
|
+
/**
|
|
56
|
+
* Get reputation registry contract
|
|
57
|
+
*/
|
|
58
|
+
getReputationRegistry(): ethers.Contract;
|
|
59
|
+
/**
|
|
60
|
+
* Get validation registry contract
|
|
61
|
+
*/
|
|
62
|
+
getValidationRegistry(): ethers.Contract;
|
|
63
|
+
/**
|
|
64
|
+
* Check if SDK is in read-only mode (no signer)
|
|
65
|
+
*/
|
|
66
|
+
get isReadOnly(): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Create a new agent (off-chain object in memory)
|
|
69
|
+
*/
|
|
70
|
+
createAgent(name: string, description: string, image?: URI): Agent;
|
|
71
|
+
/**
|
|
72
|
+
* Load an existing agent (hydrates from registration file if registered)
|
|
73
|
+
*/
|
|
74
|
+
loadAgent(agentId: AgentId): Promise<Agent>;
|
|
75
|
+
/**
|
|
76
|
+
* Get agent summary from subgraph (read-only)
|
|
77
|
+
*/
|
|
78
|
+
getAgent(agentId: AgentId): Promise<AgentSummary | null>;
|
|
79
|
+
/**
|
|
80
|
+
* Search agents with filters
|
|
81
|
+
*/
|
|
82
|
+
searchAgents(params?: SearchParams, sort?: string[], pageSize?: number, cursor?: string): Promise<{
|
|
83
|
+
items: AgentSummary[];
|
|
84
|
+
nextCursor?: string;
|
|
85
|
+
}>;
|
|
86
|
+
/**
|
|
87
|
+
* Search agents by reputation
|
|
88
|
+
*/
|
|
89
|
+
searchAgentsByReputation(agents?: AgentId[], tags?: string[], reviewers?: Address[], capabilities?: string[], skills?: string[], tasks?: string[], names?: string[], minAverageScore?: number, includeRevoked?: boolean, pageSize?: number, cursor?: string, sort?: string[]): Promise<{
|
|
90
|
+
items: AgentSummary[];
|
|
91
|
+
nextCursor?: string;
|
|
92
|
+
}>;
|
|
93
|
+
/**
|
|
94
|
+
* Transfer agent ownership
|
|
95
|
+
*/
|
|
96
|
+
transferAgent(agentId: AgentId, newOwner: Address): Promise<{
|
|
97
|
+
txHash: string;
|
|
98
|
+
from: Address;
|
|
99
|
+
to: Address;
|
|
100
|
+
agentId: AgentId;
|
|
101
|
+
}>;
|
|
102
|
+
/**
|
|
103
|
+
* Check if address is agent owner
|
|
104
|
+
*/
|
|
105
|
+
isAgentOwner(agentId: AgentId, address: Address): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Get agent owner
|
|
108
|
+
*/
|
|
109
|
+
getAgentOwner(agentId: AgentId): Promise<Address>;
|
|
110
|
+
/**
|
|
111
|
+
* Sign feedback authorization for a client
|
|
112
|
+
*/
|
|
113
|
+
signFeedbackAuth(agentId: AgentId, clientAddress: Address, indexLimit?: number, expiryHours?: number): Promise<string>;
|
|
114
|
+
/**
|
|
115
|
+
* Prepare feedback file
|
|
116
|
+
*/
|
|
117
|
+
prepareFeedback(agentId: AgentId, score?: number, tags?: string[], text?: string, capability?: string, name?: string, skill?: string, task?: string, context?: Record<string, unknown>, proofOfPayment?: Record<string, unknown>, extra?: Record<string, unknown>): Record<string, unknown>;
|
|
118
|
+
/**
|
|
119
|
+
* Give feedback
|
|
120
|
+
*/
|
|
121
|
+
giveFeedback(agentId: AgentId, feedbackFile: Record<string, unknown>, feedbackAuth?: string): Promise<Feedback>;
|
|
122
|
+
/**
|
|
123
|
+
* Read feedback
|
|
124
|
+
*/
|
|
125
|
+
getFeedback(agentId: AgentId, clientAddress: Address, feedbackIndex: number): Promise<Feedback>;
|
|
126
|
+
/**
|
|
127
|
+
* Search feedback
|
|
128
|
+
*/
|
|
129
|
+
searchFeedback(agentId: AgentId, tags?: string[], capabilities?: string[], skills?: string[], minScore?: number, maxScore?: number): Promise<Feedback[]>;
|
|
130
|
+
/**
|
|
131
|
+
* Append response to feedback
|
|
132
|
+
*/
|
|
133
|
+
appendResponse(agentId: AgentId, clientAddress: Address, feedbackIndex: number, response: {
|
|
134
|
+
uri: URI;
|
|
135
|
+
hash: string;
|
|
136
|
+
}): Promise<string>;
|
|
137
|
+
/**
|
|
138
|
+
* Revoke feedback
|
|
139
|
+
*/
|
|
140
|
+
revokeFeedback(agentId: AgentId, feedbackIndex: number): Promise<string>;
|
|
141
|
+
/**
|
|
142
|
+
* Get reputation summary
|
|
143
|
+
*/
|
|
144
|
+
getReputationSummary(agentId: AgentId, tag1?: string, tag2?: string): Promise<{
|
|
145
|
+
count: number;
|
|
146
|
+
averageScore: number;
|
|
147
|
+
}>;
|
|
148
|
+
/**
|
|
149
|
+
* Create an empty registration file structure
|
|
150
|
+
*/
|
|
151
|
+
private _createEmptyRegistrationFile;
|
|
152
|
+
/**
|
|
153
|
+
* Private helper methods
|
|
154
|
+
*/
|
|
155
|
+
private _loadRegistrationFile;
|
|
156
|
+
/**
|
|
157
|
+
* Transform raw registration file (from IPFS/HTTP) to RegistrationFile format
|
|
158
|
+
* Accepts raw JSON data which may have legacy format or new format
|
|
159
|
+
*/
|
|
160
|
+
private _transformRegistrationFile;
|
|
161
|
+
/**
|
|
162
|
+
* Transform endpoints from old format { name, endpoint, version } to new format { type, value, meta }
|
|
163
|
+
*/
|
|
164
|
+
private _transformEndpoints;
|
|
165
|
+
/**
|
|
166
|
+
* Transform a single endpoint from legacy format
|
|
167
|
+
*/
|
|
168
|
+
private _transformEndpointLegacy;
|
|
169
|
+
/**
|
|
170
|
+
* Extract wallet address and chain ID from raw data
|
|
171
|
+
*/
|
|
172
|
+
private _extractWalletInfo;
|
|
173
|
+
get web3Client(): Web3Client;
|
|
174
|
+
get ipfsClient(): IPFSClient | undefined;
|
|
175
|
+
get subgraphClient(): SubgraphClient | undefined;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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"}
|