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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/core/agent.d.ts +76 -0
  4. package/dist/core/agent.d.ts.map +1 -0
  5. package/dist/core/agent.js +477 -0
  6. package/dist/core/agent.js.map +1 -0
  7. package/dist/core/contracts.d.ts +688 -0
  8. package/dist/core/contracts.d.ts.map +1 -0
  9. package/dist/core/contracts.js +348 -0
  10. package/dist/core/contracts.js.map +1 -0
  11. package/dist/core/endpoint-crawler.d.ts +44 -0
  12. package/dist/core/endpoint-crawler.d.ts.map +1 -0
  13. package/dist/core/endpoint-crawler.js +280 -0
  14. package/dist/core/endpoint-crawler.js.map +1 -0
  15. package/dist/core/feedback-manager.d.ts +98 -0
  16. package/dist/core/feedback-manager.d.ts.map +1 -0
  17. package/dist/core/feedback-manager.js +543 -0
  18. package/dist/core/feedback-manager.js.map +1 -0
  19. package/dist/core/indexer.d.ts +37 -0
  20. package/dist/core/indexer.d.ts.map +1 -0
  21. package/dist/core/indexer.js +189 -0
  22. package/dist/core/indexer.js.map +1 -0
  23. package/dist/core/ipfs-client.d.ts +88 -0
  24. package/dist/core/ipfs-client.d.ts.map +1 -0
  25. package/dist/core/ipfs-client.js +334 -0
  26. package/dist/core/ipfs-client.js.map +1 -0
  27. package/dist/core/sdk.d.ts +177 -0
  28. package/dist/core/sdk.d.ts.map +1 -0
  29. package/dist/core/sdk.js +544 -0
  30. package/dist/core/sdk.js.map +1 -0
  31. package/dist/core/subgraph-client.d.ts +68 -0
  32. package/dist/core/subgraph-client.d.ts.map +1 -0
  33. package/dist/core/subgraph-client.js +635 -0
  34. package/dist/core/subgraph-client.js.map +1 -0
  35. package/dist/core/web3-client.d.ts +94 -0
  36. package/dist/core/web3-client.d.ts.map +1 -0
  37. package/dist/core/web3-client.js +197 -0
  38. package/dist/core/web3-client.js.map +1 -0
  39. package/dist/index.d.ts +20 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +20 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/models/enums.d.ts +22 -0
  44. package/dist/models/enums.d.ts.map +1 -0
  45. package/dist/models/enums.js +24 -0
  46. package/dist/models/enums.js.map +1 -0
  47. package/dist/models/generated/subgraph-types.d.ts +208 -0
  48. package/dist/models/generated/subgraph-types.d.ts.map +1 -0
  49. package/dist/models/generated/subgraph-types.js +2 -0
  50. package/dist/models/generated/subgraph-types.js.map +1 -0
  51. package/dist/models/index.d.ts +8 -0
  52. package/dist/models/index.d.ts.map +1 -0
  53. package/dist/models/index.js +8 -0
  54. package/dist/models/index.js.map +1 -0
  55. package/dist/models/interfaces.d.ts +125 -0
  56. package/dist/models/interfaces.d.ts.map +1 -0
  57. package/dist/models/interfaces.js +5 -0
  58. package/dist/models/interfaces.js.map +1 -0
  59. package/dist/models/types.d.ts +11 -0
  60. package/dist/models/types.d.ts.map +1 -0
  61. package/dist/models/types.js +5 -0
  62. package/dist/models/types.js.map +1 -0
  63. package/dist/utils/constants.d.ts +24 -0
  64. package/dist/utils/constants.d.ts.map +1 -0
  65. package/dist/utils/constants.js +28 -0
  66. package/dist/utils/constants.js.map +1 -0
  67. package/dist/utils/id-format.d.ts +30 -0
  68. package/dist/utils/id-format.d.ts.map +1 -0
  69. package/dist/utils/id-format.js +67 -0
  70. package/dist/utils/id-format.js.map +1 -0
  71. package/dist/utils/index.d.ts +7 -0
  72. package/dist/utils/index.d.ts.map +1 -0
  73. package/dist/utils/index.js +7 -0
  74. package/dist/utils/index.js.map +1 -0
  75. package/dist/utils/validation.d.ts +25 -0
  76. package/dist/utils/validation.d.ts.map +1 -0
  77. package/dist/utils/validation.js +61 -0
  78. package/dist/utils/validation.js.map +1 -0
  79. package/package.json +71 -0
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Agent indexer for discovery and search functionality
3
+ * Simplified version focused on subgraph queries (no local ML indexing)
4
+ */
5
+ import { normalizeAddress } from '../utils/validation';
6
+ /**
7
+ * Simplified indexer that primarily uses subgraph for queries
8
+ * No local indexing or ML capabilities - all queries go through subgraph
9
+ */
10
+ export class AgentIndexer {
11
+ constructor(web3Client, subgraphClient) {
12
+ this.web3Client = web3Client;
13
+ this.subgraphClient = subgraphClient;
14
+ }
15
+ /**
16
+ * Get agent summary from index/subgraph
17
+ */
18
+ async getAgent(agentId) {
19
+ // Use subgraph if available (preferred)
20
+ if (this.subgraphClient) {
21
+ const agent = await this.subgraphClient.getAgentById(agentId);
22
+ if (agent) {
23
+ return agent;
24
+ }
25
+ }
26
+ // Fallback: would need to query blockchain directly
27
+ // For now, throw error if not in subgraph
28
+ throw new Error(`Agent ${agentId} not found. Subgraph required for querying.`);
29
+ }
30
+ /**
31
+ * Search agents with filters
32
+ */
33
+ async searchAgents(params = {}, pageSize = 50, cursor) {
34
+ if (!this.subgraphClient) {
35
+ throw new Error('Subgraph client required for agent search');
36
+ }
37
+ // Ensure params is always an object
38
+ const searchParams = params || {};
39
+ // Parse cursor for pagination
40
+ const skip = cursor ? parseInt(cursor, 10) : 0;
41
+ // Use subgraph search which pushes filters and pagination to subgraph level (much more efficient)
42
+ // Fetch one extra record to check if there's a next page
43
+ let agents = await this.subgraphClient.searchAgents(searchParams, pageSize + 1, skip);
44
+ // Apply any remaining client-side filtering (for complex filters like array contains)
45
+ agents = this._filterAgents(agents, searchParams);
46
+ // Check if there are more results (we fetched pageSize + 1)
47
+ const hasMore = agents.length > pageSize;
48
+ const paginatedAgents = hasMore ? agents.slice(0, pageSize) : agents;
49
+ // Return next cursor if we have more results
50
+ const nextCursor = hasMore ? String(skip + pageSize) : undefined;
51
+ return {
52
+ items: paginatedAgents,
53
+ nextCursor,
54
+ };
55
+ }
56
+ _filterAgents(agents, params) {
57
+ const { name, mcp, a2a, ens, did, walletAddress, supportedTrust, a2aSkills, mcpTools, mcpPrompts, mcpResources, active, x402support, chains, } = params;
58
+ return agents.filter(agent => {
59
+ // Filter by name (flattened from registrationFile)
60
+ if (name && !agent.name?.toLowerCase().includes(name.toLowerCase())) {
61
+ return false;
62
+ }
63
+ // Filter by MCP endpoint (flattened to agent.mcp boolean)
64
+ if (mcp !== undefined && agent.mcp !== mcp) {
65
+ return false;
66
+ }
67
+ // Filter by A2A endpoint (flattened to agent.a2a boolean)
68
+ if (a2a !== undefined && agent.a2a !== a2a) {
69
+ return false;
70
+ }
71
+ // Filter by ENS (flattened from registrationFile)
72
+ if (ens && agent.ens && normalizeAddress(agent.ens) !== normalizeAddress(ens)) {
73
+ return false;
74
+ }
75
+ // Filter by DID (flattened from registrationFile)
76
+ if (did && agent.did !== did) {
77
+ return false;
78
+ }
79
+ // Filter by wallet address (flattened from registrationFile)
80
+ if (walletAddress && agent.walletAddress && normalizeAddress(agent.walletAddress) !== normalizeAddress(walletAddress)) {
81
+ return false;
82
+ }
83
+ // Filter by supported trusts (flattened from registrationFile)
84
+ if (supportedTrust && supportedTrust.length > 0) {
85
+ const agentTrusts = agent.supportedTrusts || [];
86
+ if (!supportedTrust.some((trust) => agentTrusts.includes(trust))) {
87
+ return false;
88
+ }
89
+ }
90
+ // Filter by A2A skills (flattened from registrationFile)
91
+ if (a2aSkills && a2aSkills.length > 0) {
92
+ const agentSkills = agent.a2aSkills || [];
93
+ if (!a2aSkills.some(skill => agentSkills.includes(skill))) {
94
+ return false;
95
+ }
96
+ }
97
+ // Filter by MCP tools (flattened from registrationFile)
98
+ if (mcpTools && mcpTools.length > 0) {
99
+ const agentTools = agent.mcpTools || [];
100
+ if (!mcpTools.some(tool => agentTools.includes(tool))) {
101
+ return false;
102
+ }
103
+ }
104
+ // Filter by MCP prompts (flattened from registrationFile)
105
+ if (mcpPrompts && mcpPrompts.length > 0) {
106
+ const agentPrompts = agent.mcpPrompts || [];
107
+ if (!mcpPrompts.some(prompt => agentPrompts.includes(prompt))) {
108
+ return false;
109
+ }
110
+ }
111
+ // Filter by MCP resources (flattened from registrationFile)
112
+ if (mcpResources && mcpResources.length > 0) {
113
+ const agentResources = agent.mcpResources || [];
114
+ if (!mcpResources.some(resource => agentResources.includes(resource))) {
115
+ return false;
116
+ }
117
+ }
118
+ // Filter by active status (flattened from registrationFile)
119
+ if (active !== undefined && agent.active !== active) {
120
+ return false;
121
+ }
122
+ // Filter by x402support (flattened from registrationFile)
123
+ if (x402support !== undefined && agent.x402support !== x402support) {
124
+ return false;
125
+ }
126
+ // Filter by chain
127
+ if (chains && chains.length > 0 && !chains.includes(agent.chainId)) {
128
+ return false;
129
+ }
130
+ return true;
131
+ });
132
+ }
133
+ /**
134
+ * Search agents by reputation
135
+ */
136
+ async searchAgentsByReputation(agents, tags, reviewers, capabilities, skills, tasks, names, minAverageScore, includeRevoked = false, first = 50, skip = 0, sort = ['createdAt:desc']) {
137
+ if (!this.subgraphClient) {
138
+ throw new Error('Subgraph client required for reputation search');
139
+ }
140
+ // Parse sort parameter
141
+ let orderBy = 'createdAt';
142
+ let orderDirection = 'desc';
143
+ if (sort && sort.length > 0) {
144
+ const sortField = sort[0].split(':');
145
+ orderBy = sortField[0] || orderBy;
146
+ orderDirection = sortField[1] || orderDirection;
147
+ }
148
+ try {
149
+ const agentsData = await this.subgraphClient.searchAgentsByReputation(agents, tags, reviewers, capabilities, skills, tasks, names, minAverageScore, includeRevoked, first, skip, orderBy, orderDirection);
150
+ // Transform to AgentSummary with averageScore in extras
151
+ const items = agentsData.map((agent) => {
152
+ const regFile = agent.registrationFile;
153
+ return {
154
+ chainId: parseInt(agent.chainId?.toString() || '0', 10),
155
+ agentId: agent.id || '',
156
+ name: regFile?.name || '',
157
+ image: regFile?.image || undefined,
158
+ description: regFile?.description || '',
159
+ owners: agent.owner ? [normalizeAddress(agent.owner)] : [],
160
+ operators: (agent.operators || []).map((op) => normalizeAddress(op)),
161
+ mcp: !!regFile?.mcpEndpoint,
162
+ a2a: !!regFile?.a2aEndpoint,
163
+ ens: regFile?.ens || undefined,
164
+ did: regFile?.did || undefined,
165
+ walletAddress: regFile?.agentWallet ? normalizeAddress(regFile.agentWallet) : undefined,
166
+ supportedTrusts: regFile?.supportedTrusts || [],
167
+ a2aSkills: regFile?.a2aSkills || [],
168
+ mcpTools: regFile?.mcpTools || [],
169
+ mcpPrompts: regFile?.mcpPrompts || [],
170
+ mcpResources: regFile?.mcpResources || [],
171
+ active: regFile?.active ?? false,
172
+ x402support: regFile?.x402support ?? false,
173
+ extras: {
174
+ averageScore: agent.averageScore !== null ? agent.averageScore : undefined,
175
+ },
176
+ };
177
+ });
178
+ const nextCursor = items.length === first ? String(skip + items.length) : undefined;
179
+ return {
180
+ items,
181
+ nextCursor,
182
+ };
183
+ }
184
+ catch (error) {
185
+ throw new Error(`Failed to search agents by reputation: ${error}`);
186
+ }
187
+ }
188
+ }
189
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/core/indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * IPFS client for decentralized storage with support for multiple providers:
3
+ * - Local IPFS nodes (via ipfs-http-client)
4
+ * - Pinata IPFS pinning service
5
+ * - Filecoin Pin service
6
+ */
7
+ import type { RegistrationFile } from '../models/interfaces';
8
+ export interface IPFSClientConfig {
9
+ url?: string;
10
+ filecoinPinEnabled?: boolean;
11
+ filecoinPrivateKey?: string;
12
+ pinataEnabled?: boolean;
13
+ pinataJwt?: string;
14
+ }
15
+ /**
16
+ * Client for IPFS operations supporting multiple providers
17
+ */
18
+ export declare class IPFSClient {
19
+ private provider;
20
+ private config;
21
+ private client?;
22
+ constructor(config: IPFSClientConfig);
23
+ /**
24
+ * Initialize IPFS HTTP client (lazy, only when needed)
25
+ */
26
+ private _ensureClient;
27
+ private _verifyPinataJwt;
28
+ /**
29
+ * Pin data to Pinata using v3 API
30
+ */
31
+ private _pinToPinata;
32
+ /**
33
+ * Pin data to Filecoin Pin
34
+ * Note: This requires the Filecoin Pin API or CLI to be available
35
+ * For now, we'll throw an error directing users to use the CLI
36
+ */
37
+ private _pinToFilecoin;
38
+ /**
39
+ * Pin data to local IPFS node
40
+ */
41
+ private _pinToLocalIpfs;
42
+ /**
43
+ * Add data to IPFS and return CID
44
+ */
45
+ add(data: string): Promise<string>;
46
+ /**
47
+ * Add file to IPFS and return CID
48
+ * Note: This method works in Node.js environments. For browser, use add() with file content directly.
49
+ */
50
+ addFile(filepath: string): Promise<string>;
51
+ /**
52
+ * Get data from IPFS by CID
53
+ */
54
+ get(cid: string): Promise<string>;
55
+ /**
56
+ * Get JSON data from IPFS by CID
57
+ */
58
+ getJson<T = Record<string, unknown>>(cid: string): Promise<T>;
59
+ /**
60
+ * Pin a CID to local node
61
+ */
62
+ pin(cid: string): Promise<{
63
+ pinned: string[];
64
+ }>;
65
+ /**
66
+ * Unpin a CID from local node
67
+ */
68
+ unpin(cid: string): Promise<{
69
+ unpinned: string[];
70
+ }>;
71
+ /**
72
+ * Add JSON data to IPFS and return CID
73
+ */
74
+ addJson(data: Record<string, unknown>): Promise<string>;
75
+ /**
76
+ * Add registration file to IPFS and return CID
77
+ */
78
+ addRegistrationFile(registrationFile: RegistrationFile, chainId?: number, identityRegistryAddress?: string): Promise<string>;
79
+ /**
80
+ * Get registration file from IPFS by CID
81
+ */
82
+ getRegistrationFile(cid: string): Promise<RegistrationFile>;
83
+ /**
84
+ * Close IPFS client connection
85
+ */
86
+ close(): Promise<void>;
87
+ }
88
+ //# sourceMappingURL=ipfs-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs-client.d.ts","sourceRoot":"","sources":["../../src/core/ipfs-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAC,CAAiB;gBAEpB,MAAM,EAAE,gBAAgB;IAmBpC;;OAEG;YACW,aAAa;IAO3B,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;YACW,YAAY;IAiD1B;;;;OAIG;YACW,cAAc;IAS5B;;OAEG;YACW,eAAe;IAU7B;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcxC;;;OAGG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BhD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0DvC;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAKnE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAcrD;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAczD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7D;;OAEG;IACG,mBAAmB,CACvB,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,CAAC,EAAE,MAAM,EAChB,uBAAuB,CAAC,EAAE,MAAM,GAC/B,OAAO,CAAC,MAAM,CAAC;IAyDlB;;OAEG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKjE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
@@ -0,0 +1,334 @@
1
+ /**
2
+ * IPFS client for decentralized storage with support for multiple providers:
3
+ * - Local IPFS nodes (via ipfs-http-client)
4
+ * - Pinata IPFS pinning service
5
+ * - Filecoin Pin service
6
+ */
7
+ import { IPFS_GATEWAYS, TIMEOUTS } from '../utils/constants';
8
+ /**
9
+ * Client for IPFS operations supporting multiple providers
10
+ */
11
+ export class IPFSClient {
12
+ constructor(config) {
13
+ this.config = config;
14
+ // Determine provider
15
+ if (config.pinataEnabled) {
16
+ this.provider = 'pinata';
17
+ this._verifyPinataJwt();
18
+ }
19
+ else if (config.filecoinPinEnabled) {
20
+ this.provider = 'filecoinPin';
21
+ // Note: Filecoin Pin in TypeScript requires external CLI or API
22
+ // We'll use HTTP API if available, otherwise throw error
23
+ }
24
+ else if (config.url) {
25
+ this.provider = 'node';
26
+ // Lazy initialization - client will be created on first use
27
+ }
28
+ else {
29
+ throw new Error('No IPFS provider configured. Specify url, pinataEnabled, or filecoinPinEnabled.');
30
+ }
31
+ }
32
+ /**
33
+ * Initialize IPFS HTTP client (lazy, only when needed)
34
+ */
35
+ async _ensureClient() {
36
+ if (this.provider === 'node' && !this.client && this.config.url) {
37
+ const { create } = await import('ipfs-http-client');
38
+ this.client = create({ url: this.config.url });
39
+ }
40
+ }
41
+ _verifyPinataJwt() {
42
+ if (!this.config.pinataJwt) {
43
+ throw new Error('pinataJwt is required when pinataEnabled=true');
44
+ }
45
+ }
46
+ /**
47
+ * Pin data to Pinata using v3 API
48
+ */
49
+ async _pinToPinata(data) {
50
+ const url = 'https://uploads.pinata.cloud/v3/files';
51
+ const headers = {
52
+ Authorization: `Bearer ${this.config.pinataJwt}`,
53
+ };
54
+ // Create a Blob from the data
55
+ const blob = new Blob([data], { type: 'application/json' });
56
+ const formData = new FormData();
57
+ formData.append('file', blob, 'registration.json');
58
+ formData.append('network', 'public');
59
+ try {
60
+ // Add timeout to fetch
61
+ const controller = new AbortController();
62
+ const timeoutId = setTimeout(() => controller.abort(), TIMEOUTS.PINATA_UPLOAD);
63
+ const response = await fetch(url, {
64
+ method: 'POST',
65
+ headers,
66
+ body: formData,
67
+ signal: controller.signal,
68
+ });
69
+ clearTimeout(timeoutId);
70
+ if (!response.ok) {
71
+ const errorText = await response.text();
72
+ throw new Error(`Failed to pin to Pinata: HTTP ${response.status} - ${errorText}`);
73
+ }
74
+ const result = await response.json();
75
+ // v3 API returns CID in data.cid
76
+ const cid = result?.data?.cid || result?.cid || result?.IpfsHash;
77
+ if (!cid) {
78
+ throw new Error(`No CID returned from Pinata. Response: ${JSON.stringify(result)}`);
79
+ }
80
+ return cid;
81
+ }
82
+ catch (error) {
83
+ if (error instanceof Error && error.name === 'AbortError') {
84
+ throw new Error(`Pinata upload timed out after ${TIMEOUTS.PINATA_UPLOAD / 1000} seconds`);
85
+ }
86
+ const errorMessage = error instanceof Error ? error.message : String(error);
87
+ throw new Error(`Failed to pin to Pinata: ${errorMessage}`);
88
+ }
89
+ }
90
+ /**
91
+ * Pin data to Filecoin Pin
92
+ * Note: This requires the Filecoin Pin API or CLI to be available
93
+ * For now, we'll throw an error directing users to use the CLI
94
+ */
95
+ async _pinToFilecoin(data) {
96
+ // Filecoin Pin typically requires CLI or API access
97
+ // This is a placeholder - in production, you'd call the Filecoin Pin API
98
+ throw new Error('Filecoin Pin via TypeScript SDK not yet fully implemented. ' +
99
+ 'Please use the filecoin-pin CLI or implement the Filecoin Pin API integration.');
100
+ }
101
+ /**
102
+ * Pin data to local IPFS node
103
+ */
104
+ async _pinToLocalIpfs(data) {
105
+ await this._ensureClient();
106
+ if (!this.client) {
107
+ throw new Error('No IPFS client available');
108
+ }
109
+ const result = await this.client.add(data);
110
+ return result.cid.toString();
111
+ }
112
+ /**
113
+ * Add data to IPFS and return CID
114
+ */
115
+ async add(data) {
116
+ try {
117
+ if (this.provider === 'pinata') {
118
+ return await this._pinToPinata(data);
119
+ }
120
+ else if (this.provider === 'filecoinPin') {
121
+ return await this._pinToFilecoin(data);
122
+ }
123
+ else {
124
+ return await this._pinToLocalIpfs(data);
125
+ }
126
+ }
127
+ catch (error) {
128
+ throw error;
129
+ }
130
+ }
131
+ /**
132
+ * Add file to IPFS and return CID
133
+ * Note: This method works in Node.js environments. For browser, use add() with file content directly.
134
+ */
135
+ async addFile(filepath) {
136
+ // Check if we're in Node.js environment
137
+ if (typeof process === 'undefined' || !process.versions?.node) {
138
+ throw new Error('addFile() is only available in Node.js environments. ' +
139
+ 'For browser environments, use add() with file content directly.');
140
+ }
141
+ const fs = await import('fs');
142
+ const data = fs.readFileSync(filepath, 'utf-8');
143
+ if (this.provider === 'pinata') {
144
+ return this._pinToPinata(data);
145
+ }
146
+ else if (this.provider === 'filecoinPin') {
147
+ return this._pinToFilecoin(filepath);
148
+ }
149
+ else {
150
+ await this._ensureClient();
151
+ if (!this.client) {
152
+ throw new Error('No IPFS client available');
153
+ }
154
+ // For local IPFS, add file directly
155
+ const fileContent = fs.readFileSync(filepath);
156
+ const result = await this.client.add(fileContent);
157
+ return result.cid.toString();
158
+ }
159
+ }
160
+ /**
161
+ * Get data from IPFS by CID
162
+ */
163
+ async get(cid) {
164
+ // Extract CID from IPFS URL if needed
165
+ if (cid.startsWith('ipfs://')) {
166
+ cid = cid.slice(7); // Remove "ipfs://" prefix
167
+ }
168
+ // For Pinata and Filecoin Pin, use IPFS gateways
169
+ if (this.provider === 'pinata' || this.provider === 'filecoinPin') {
170
+ const gateways = IPFS_GATEWAYS.map(gateway => `${gateway}${cid}`);
171
+ // Try all gateways in parallel - use the first successful response
172
+ const promises = gateways.map(async (gateway) => {
173
+ try {
174
+ const response = await fetch(gateway, {
175
+ signal: AbortSignal.timeout(TIMEOUTS.IPFS_GATEWAY),
176
+ });
177
+ if (response.ok) {
178
+ return await response.text();
179
+ }
180
+ throw new Error(`HTTP ${response.status}`);
181
+ }
182
+ catch (error) {
183
+ throw error;
184
+ }
185
+ });
186
+ // Use Promise.allSettled to get the first successful result
187
+ const results = await Promise.allSettled(promises);
188
+ for (const result of results) {
189
+ if (result.status === 'fulfilled') {
190
+ return result.value;
191
+ }
192
+ }
193
+ throw new Error('Failed to retrieve data from all IPFS gateways');
194
+ }
195
+ else {
196
+ await this._ensureClient();
197
+ if (!this.client) {
198
+ throw new Error('No IPFS client available');
199
+ }
200
+ const chunks = [];
201
+ for await (const chunk of this.client.cat(cid)) {
202
+ chunks.push(chunk);
203
+ }
204
+ // Concatenate chunks and convert to string
205
+ const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
206
+ const result = new Uint8Array(totalLength);
207
+ let offset = 0;
208
+ for (const chunk of chunks) {
209
+ result.set(chunk, offset);
210
+ offset += chunk.length;
211
+ }
212
+ return new TextDecoder().decode(result);
213
+ }
214
+ }
215
+ /**
216
+ * Get JSON data from IPFS by CID
217
+ */
218
+ async getJson(cid) {
219
+ const data = await this.get(cid);
220
+ return JSON.parse(data);
221
+ }
222
+ /**
223
+ * Pin a CID to local node
224
+ */
225
+ async pin(cid) {
226
+ if (this.provider === 'filecoinPin') {
227
+ // Filecoin Pin automatically pins data, so this is a no-op
228
+ return { pinned: [cid] };
229
+ }
230
+ else {
231
+ await this._ensureClient();
232
+ if (!this.client) {
233
+ throw new Error('No IPFS client available');
234
+ }
235
+ await this.client.pin.add(cid);
236
+ return { pinned: [cid] };
237
+ }
238
+ }
239
+ /**
240
+ * Unpin a CID from local node
241
+ */
242
+ async unpin(cid) {
243
+ if (this.provider === 'filecoinPin') {
244
+ // Filecoin Pin doesn't support unpinning in the same way
245
+ return { unpinned: [cid] };
246
+ }
247
+ else {
248
+ await this._ensureClient();
249
+ if (!this.client) {
250
+ throw new Error('No IPFS client available');
251
+ }
252
+ await this.client.pin.rm(cid);
253
+ return { unpinned: [cid] };
254
+ }
255
+ }
256
+ /**
257
+ * Add JSON data to IPFS and return CID
258
+ */
259
+ async addJson(data) {
260
+ const jsonStr = JSON.stringify(data, null, 2);
261
+ return this.add(jsonStr);
262
+ }
263
+ /**
264
+ * Add registration file to IPFS and return CID
265
+ */
266
+ async addRegistrationFile(registrationFile, chainId, identityRegistryAddress) {
267
+ // Convert from internal format { type, value, meta } to ERC-8004 format { name, endpoint, version }
268
+ const endpoints = [];
269
+ for (const ep of registrationFile.endpoints) {
270
+ const endpointDict = {
271
+ name: ep.type, // EndpointType enum value (e.g., "MCP", "A2A")
272
+ endpoint: ep.value,
273
+ };
274
+ // Spread meta fields (version, mcpTools, mcpPrompts, etc.) into the endpoint dict
275
+ if (ep.meta) {
276
+ Object.assign(endpointDict, ep.meta);
277
+ }
278
+ endpoints.push(endpointDict);
279
+ }
280
+ // Add walletAddress as an endpoint if present
281
+ if (registrationFile.walletAddress) {
282
+ const walletChainId = registrationFile.walletChainId || chainId || 1;
283
+ endpoints.push({
284
+ name: 'agentWallet',
285
+ endpoint: `eip155:${walletChainId}:${registrationFile.walletAddress}`,
286
+ });
287
+ }
288
+ // Build registrations array
289
+ const registrations = [];
290
+ if (registrationFile.agentId) {
291
+ const [, , tokenId] = registrationFile.agentId.split(':');
292
+ const agentRegistry = chainId && identityRegistryAddress
293
+ ? `eip155:${chainId}:${identityRegistryAddress}`
294
+ : `eip155:1:{identityRegistry}`;
295
+ registrations.push({
296
+ agentId: parseInt(tokenId, 10),
297
+ agentRegistry,
298
+ });
299
+ }
300
+ // Build ERC-8004 compliant registration file
301
+ const data = {
302
+ type: 'https://eips.ethereum.org/EIPS/eip-8004#registration-v1',
303
+ name: registrationFile.name,
304
+ description: registrationFile.description,
305
+ ...(registrationFile.image && { image: registrationFile.image }),
306
+ endpoints,
307
+ ...(registrations.length > 0 && { registrations }),
308
+ ...(registrationFile.trustModels.length > 0 && {
309
+ supportedTrusts: registrationFile.trustModels,
310
+ }),
311
+ active: registrationFile.active,
312
+ x402support: registrationFile.x402support,
313
+ };
314
+ return this.addJson(data);
315
+ }
316
+ /**
317
+ * Get registration file from IPFS by CID
318
+ */
319
+ async getRegistrationFile(cid) {
320
+ const data = await this.getJson(cid);
321
+ return data;
322
+ }
323
+ /**
324
+ * Close IPFS client connection
325
+ */
326
+ async close() {
327
+ if (this.client) {
328
+ // IPFS HTTP client doesn't have a close method in the same way
329
+ // But we can clear the reference
330
+ this.client = undefined;
331
+ }
332
+ }
333
+ }
334
+ //# sourceMappingURL=ipfs-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs-client.js","sourceRoot":"","sources":["../../src/core/ipfs-client.ts"],"names":[],"mappings":"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"}