@claude-flow/cli 3.0.0-alpha.170 → 3.0.0-alpha.172
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/README.md +12 -5
- package/dist/src/plugins/store/discovery.d.ts +5 -0
- package/dist/src/plugins/store/discovery.d.ts.map +1 -1
- package/dist/src/plugins/store/discovery.js +29 -13
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/transfer/ipfs/client.d.ts +87 -9
- package/dist/src/transfer/ipfs/client.d.ts.map +1 -1
- package/dist/src/transfer/ipfs/client.js +263 -38
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
|
@@ -1,55 +1,217 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* IPFS Client Module
|
|
3
3
|
* Low-level IPFS operations for discovery and fetching
|
|
4
|
+
*
|
|
5
|
+
* Supports multiple gateways with automatic fallback:
|
|
6
|
+
* - Pinata (recommended for pinned content)
|
|
7
|
+
* - Cloudflare IPFS
|
|
8
|
+
* - Protocol Labs ipfs.io
|
|
9
|
+
* - dweb.link (LibP2P)
|
|
4
10
|
*/
|
|
5
11
|
import * as crypto from 'crypto';
|
|
6
12
|
/**
|
|
7
|
-
*
|
|
8
|
-
* In production: Use ipfs-http-client or similar
|
|
13
|
+
* Available IPFS gateways in priority order
|
|
9
14
|
*/
|
|
10
|
-
export
|
|
15
|
+
export const IPFS_GATEWAYS = [
|
|
16
|
+
'https://gateway.pinata.cloud',
|
|
17
|
+
'https://cloudflare-ipfs.com',
|
|
18
|
+
'https://ipfs.io',
|
|
19
|
+
'https://dweb.link',
|
|
20
|
+
'https://w3s.link', // web3.storage gateway
|
|
21
|
+
];
|
|
22
|
+
/**
|
|
23
|
+
* IPNS resolvers
|
|
24
|
+
*/
|
|
25
|
+
export const IPNS_RESOLVERS = [
|
|
26
|
+
'https://gateway.pinata.cloud',
|
|
27
|
+
'https://dweb.link',
|
|
28
|
+
'https://ipfs.io',
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Resolve IPNS name to CID with fallback across multiple gateways
|
|
32
|
+
*
|
|
33
|
+
* @param ipnsName - IPNS key or DNSLink domain
|
|
34
|
+
* @param preferredGateway - Optional preferred gateway to try first
|
|
35
|
+
* @returns CID string or null if resolution fails
|
|
36
|
+
*/
|
|
37
|
+
export async function resolveIPNS(ipnsName, preferredGateway) {
|
|
38
|
+
const resolvers = preferredGateway
|
|
39
|
+
? [preferredGateway, ...IPNS_RESOLVERS.filter(r => r !== preferredGateway)]
|
|
40
|
+
: IPNS_RESOLVERS;
|
|
11
41
|
console.log(`[IPFS] Resolving IPNS: ${ipnsName}`);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
42
|
+
for (const gateway of resolvers) {
|
|
43
|
+
try {
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
let cid = null;
|
|
46
|
+
// Method 1: DNSLink resolution for domain names
|
|
47
|
+
if (ipnsName.includes('.')) {
|
|
48
|
+
const response = await fetch(`${gateway}/api/v0/name/resolve?arg=/ipns/${ipnsName}`, {
|
|
49
|
+
signal: AbortSignal.timeout(10000),
|
|
50
|
+
headers: { 'Accept': 'application/json' },
|
|
51
|
+
});
|
|
52
|
+
if (response.ok) {
|
|
53
|
+
const data = await response.json();
|
|
54
|
+
cid = data.Path?.replace('/ipfs/', '') || null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Method 2: Direct IPNS key resolution via gateway redirect
|
|
58
|
+
if (!cid) {
|
|
59
|
+
const response = await fetch(`${gateway}/ipns/${ipnsName}`, {
|
|
60
|
+
method: 'HEAD',
|
|
61
|
+
signal: AbortSignal.timeout(10000),
|
|
62
|
+
redirect: 'follow',
|
|
63
|
+
});
|
|
64
|
+
if (response.ok) {
|
|
65
|
+
// Extract CID from the final URL after redirects
|
|
66
|
+
const finalUrl = response.url;
|
|
67
|
+
const cidMatch = finalUrl.match(/\/ipfs\/([a-zA-Z0-9]+)/);
|
|
68
|
+
if (cidMatch) {
|
|
69
|
+
cid = cidMatch[1];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (cid) {
|
|
74
|
+
const latency = Date.now() - startTime;
|
|
75
|
+
console.log(`[IPFS] Resolved ${ipnsName} -> ${cid} via ${gateway} (${latency}ms)`);
|
|
76
|
+
return cid;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
81
|
+
console.warn(`[IPFS] Gateway ${gateway} failed: ${errorMsg}`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
24
84
|
}
|
|
85
|
+
console.warn(`[IPFS] IPNS resolution failed for ${ipnsName} on all gateways`);
|
|
86
|
+
return null;
|
|
25
87
|
}
|
|
26
88
|
/**
|
|
27
|
-
* Fetch content from IPFS by CID
|
|
28
|
-
*
|
|
89
|
+
* Fetch content from IPFS by CID with fallback across multiple gateways
|
|
90
|
+
*
|
|
91
|
+
* @param cid - Content Identifier
|
|
92
|
+
* @param preferredGateway - Optional preferred gateway to try first
|
|
93
|
+
* @returns Parsed JSON content or null if fetch fails
|
|
29
94
|
*/
|
|
30
|
-
export async function fetchFromIPFS(cid,
|
|
95
|
+
export async function fetchFromIPFS(cid, preferredGateway) {
|
|
96
|
+
const gateways = preferredGateway
|
|
97
|
+
? [preferredGateway, ...IPFS_GATEWAYS.filter(g => g !== preferredGateway)]
|
|
98
|
+
: IPFS_GATEWAYS;
|
|
31
99
|
console.log(`[IPFS] Fetching CID: ${cid}`);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
100
|
+
for (const gateway of gateways) {
|
|
101
|
+
try {
|
|
102
|
+
const startTime = Date.now();
|
|
103
|
+
const url = `${gateway}/ipfs/${cid}`;
|
|
104
|
+
const response = await fetch(url, {
|
|
105
|
+
signal: AbortSignal.timeout(30000),
|
|
106
|
+
headers: {
|
|
107
|
+
'Accept': 'application/json',
|
|
108
|
+
'Cache-Control': 'max-age=3600',
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
if (response.ok) {
|
|
112
|
+
const data = await response.json();
|
|
113
|
+
const latency = Date.now() - startTime;
|
|
114
|
+
console.log(`[IPFS] Fetched ${cid} from ${gateway} (${latency}ms)`);
|
|
115
|
+
return data;
|
|
116
|
+
}
|
|
117
|
+
// Handle specific error codes
|
|
118
|
+
if (response.status === 504) {
|
|
119
|
+
console.warn(`[IPFS] Gateway timeout on ${gateway}, trying next...`);
|
|
120
|
+
}
|
|
121
|
+
else if (response.status === 429) {
|
|
122
|
+
console.warn(`[IPFS] Rate limited on ${gateway}, trying next...`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
127
|
+
console.warn(`[IPFS] Gateway ${gateway} failed: ${errorMsg}`);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
41
130
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
131
|
+
console.warn(`[IPFS] Fetch failed for ${cid} on all gateways`);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Fetch with full result metadata
|
|
136
|
+
*/
|
|
137
|
+
export async function fetchFromIPFSWithMetadata(cid, preferredGateway) {
|
|
138
|
+
const gateways = preferredGateway
|
|
139
|
+
? [preferredGateway, ...IPFS_GATEWAYS.filter(g => g !== preferredGateway)]
|
|
140
|
+
: IPFS_GATEWAYS;
|
|
141
|
+
for (const gateway of gateways) {
|
|
142
|
+
try {
|
|
143
|
+
const startTime = Date.now();
|
|
144
|
+
const url = `${gateway}/ipfs/${cid}`;
|
|
145
|
+
const response = await fetch(url, {
|
|
146
|
+
signal: AbortSignal.timeout(30000),
|
|
147
|
+
headers: {
|
|
148
|
+
'Accept': 'application/json',
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
if (response.ok) {
|
|
152
|
+
const data = await response.json();
|
|
153
|
+
const latencyMs = Date.now() - startTime;
|
|
154
|
+
const cached = response.headers.get('X-Cache')?.includes('HIT') ||
|
|
155
|
+
response.headers.get('CF-Cache-Status') === 'HIT';
|
|
156
|
+
return {
|
|
157
|
+
data,
|
|
158
|
+
gateway,
|
|
159
|
+
cid,
|
|
160
|
+
cached,
|
|
161
|
+
latencyMs,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
45
168
|
}
|
|
169
|
+
return null;
|
|
46
170
|
}
|
|
47
171
|
/**
|
|
48
|
-
* Check if CID is pinned
|
|
172
|
+
* Check if CID is pinned/available on a gateway
|
|
49
173
|
*/
|
|
50
174
|
export async function isPinned(cid, gateway = 'https://ipfs.io') {
|
|
51
|
-
|
|
52
|
-
|
|
175
|
+
try {
|
|
176
|
+
const response = await fetch(`${gateway}/ipfs/${cid}`, {
|
|
177
|
+
method: 'HEAD',
|
|
178
|
+
signal: AbortSignal.timeout(5000),
|
|
179
|
+
});
|
|
180
|
+
return response.ok;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check availability across multiple gateways
|
|
188
|
+
*/
|
|
189
|
+
export async function checkAvailability(cid) {
|
|
190
|
+
const results = await Promise.all(IPFS_GATEWAYS.map(async (gateway) => {
|
|
191
|
+
const startTime = Date.now();
|
|
192
|
+
try {
|
|
193
|
+
const response = await fetch(`${gateway}/ipfs/${cid}`, {
|
|
194
|
+
method: 'HEAD',
|
|
195
|
+
signal: AbortSignal.timeout(5000),
|
|
196
|
+
});
|
|
197
|
+
return {
|
|
198
|
+
url: gateway,
|
|
199
|
+
available: response.ok,
|
|
200
|
+
latencyMs: Date.now() - startTime,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return {
|
|
205
|
+
url: gateway,
|
|
206
|
+
available: false,
|
|
207
|
+
latencyMs: Date.now() - startTime,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}));
|
|
211
|
+
return {
|
|
212
|
+
available: results.some(r => r.available),
|
|
213
|
+
gateways: results,
|
|
214
|
+
};
|
|
53
215
|
}
|
|
54
216
|
/**
|
|
55
217
|
* Get IPFS gateway URL for a CID
|
|
@@ -58,17 +220,80 @@ export function getGatewayUrl(cid, gateway = 'https://ipfs.io') {
|
|
|
58
220
|
return `${gateway}/ipfs/${cid}`;
|
|
59
221
|
}
|
|
60
222
|
/**
|
|
61
|
-
*
|
|
223
|
+
* Get multiple gateway URLs for redundancy
|
|
224
|
+
*/
|
|
225
|
+
export function getGatewayUrls(cid) {
|
|
226
|
+
return IPFS_GATEWAYS.map(gateway => `${gateway}/ipfs/${cid}`);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Validate CID format (CIDv0 and CIDv1)
|
|
62
230
|
*/
|
|
63
231
|
export function isValidCID(cid) {
|
|
64
|
-
// CIDv0 starts with 'Qm' and is 46 characters
|
|
65
|
-
// CIDv1 starts with 'b' (base32)
|
|
66
|
-
return /^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[a-z2-7]{58,})
|
|
232
|
+
// CIDv0 starts with 'Qm' and is 46 characters (base58btc)
|
|
233
|
+
// CIDv1 starts with 'b' (base32) or 'z' (base58btc) or 'f' (base16)
|
|
234
|
+
return /^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[a-z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|f[0-9a-f]{50,})$/i.test(cid);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Validate IPNS name format
|
|
238
|
+
*/
|
|
239
|
+
export function isValidIPNS(ipnsName) {
|
|
240
|
+
// IPNS key format (k51...) or DNSLink domain
|
|
241
|
+
return /^(k51[a-z0-9]{59,}|[a-z0-9.-]+\.[a-z]{2,})$/i.test(ipnsName);
|
|
67
242
|
}
|
|
68
243
|
/**
|
|
69
244
|
* Generate content hash for verification
|
|
70
245
|
*/
|
|
71
246
|
export function hashContent(content) {
|
|
72
|
-
|
|
247
|
+
const buffer = typeof content === 'string' ? Buffer.from(content) : content;
|
|
248
|
+
return crypto.createHash('sha256').update(buffer).digest('hex');
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Verify Ed25519 signature (async import to avoid bundling issues)
|
|
252
|
+
*/
|
|
253
|
+
export async function verifyEd25519Signature(message, signature, publicKey) {
|
|
254
|
+
try {
|
|
255
|
+
// Dynamic import to avoid bundling @noble/ed25519 if not used
|
|
256
|
+
const ed = await import('@noble/ed25519');
|
|
257
|
+
// Handle prefixed public key (e.g., "ed25519:abc123...")
|
|
258
|
+
const pubKeyHex = publicKey.replace(/^ed25519:/, '');
|
|
259
|
+
const isValid = await ed.verifyAsync(Buffer.from(signature, 'hex'), new TextEncoder().encode(message), Buffer.from(pubKeyHex, 'hex'));
|
|
260
|
+
return isValid;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
console.warn('[IPFS] Signature verification failed:', error);
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Parse CID to extract metadata
|
|
269
|
+
*/
|
|
270
|
+
export function parseCID(cid) {
|
|
271
|
+
if (!isValidCID(cid)) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
if (cid.startsWith('Qm')) {
|
|
275
|
+
return {
|
|
276
|
+
version: 0,
|
|
277
|
+
codec: 'dag-pb',
|
|
278
|
+
hash: cid,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
// CIDv1 - simplified parsing
|
|
282
|
+
return {
|
|
283
|
+
version: 1,
|
|
284
|
+
codec: 'dag-cbor', // Most common for JSON
|
|
285
|
+
hash: cid,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Format bytes to human readable
|
|
290
|
+
*/
|
|
291
|
+
export function formatBytes(bytes) {
|
|
292
|
+
if (bytes === 0)
|
|
293
|
+
return '0 B';
|
|
294
|
+
const k = 1024;
|
|
295
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
296
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
297
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
73
298
|
}
|
|
74
299
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"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"}
|