@claude-flow/cli 3.0.0-alpha.170 → 3.0.0-alpha.171

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 CHANGED
@@ -16,6 +16,11 @@
16
16
  [![MIT License](https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge&logo=opensourceinitiative)](https://opensource.org/licenses/MIT)
17
17
  [![RuVector](https://img.shields.io/npm/v/ruvector?style=for-the-badge&logo=rust&color=orange&label=RuVector)](https://www.npmjs.com/package/ruvector)
18
18
  [![Agentic-Flow](https://img.shields.io/npm/v/agentic-flow?style=for-the-badge&logo=typescript&color=3178c6&label=Agentic-Flow)](https://www.npmjs.com/package/agentic-flow)
19
+ [![Reddit](https://img.shields.io/reddit/subreddit-subscribers/aipromptprogramming?style=for-the-badge&logo=reddit&color=FF4500&label=r/aipromptprogramming)](https://www.reddit.com/r/aipromptprogramming/)
20
+ [![Follow @ruv](https://img.shields.io/badge/Follow%20%40ruv-000000?style=for-the-badge&logo=x&logoColor=white)](https://x.com/ruv)
21
+ [![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-0A66C2?style=for-the-badge&logo=linkedin)](https://www.linkedin.com/in/reuvencohen/)
22
+ [![YouTube](https://img.shields.io/badge/YouTube-Subscribe-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://www.youtube.com/@ReuvenCohen)
23
+ [![Crates.io](https://img.shields.io/badge/crates.io-ruvnet-E6732E?style=for-the-badge&logo=rust&logoColor=white)](https://crates.io/users/ruvnet)
19
24
 
20
25
  **Production-ready multi-agent AI orchestration for Claude Code**
21
26
 
@@ -148,8 +153,8 @@ npx claude-flow@v3alpha hooks intelligence --status
148
153
 
149
154
  ### Get Started Fast
150
155
 
151
- ```
152
- npx claude-flow@v3alpha init
156
+ ```
157
+ npx claude-flow@latest init
153
158
  ```
154
159
 
155
160
  ---
@@ -453,20 +458,20 @@ Add claude-flow as an MCP server for seamless integration:
453
458
 
454
459
  ```bash
455
460
  # Add claude-flow MCP server to Claude Code
456
- claude mcp add claude-flow -- npx -y claude-flow@v3alpha
461
+ claude mcp add claude-flow -- npx -y claude-flow@latest mcp start
457
462
 
458
463
  # Verify installation
459
464
  claude mcp list
460
465
  ```
461
466
 
462
- Once added, Claude Code can use all 175+ claude-flow tools directly:
467
+ Once added, Claude Code can use all 175+ claude-flow MCP tools directly:
463
468
  - `swarm_init` - Initialize agent swarms
464
469
  - `agent_spawn` - Spawn specialized agents
465
470
  - `memory_search` - Search patterns with HNSW (150x faster)
466
471
  - `hooks_route` - Intelligent task routing
467
472
  - And 170+ more tools...
468
473
 
469
-
474
+ <details>
470
475
  <summary>🆚 <strong>Why Claude-Flow v3?</strong></summary>
471
476
 
472
477
  Claude-Flow v3 introduces **self-learning neural capabilities** that no other agent orchestration framework offers. While competitors require manual agent configuration and static routing, Claude-Flow learns from every task execution, prevents catastrophic forgetting of successful patterns, and intelligently routes work to specialized experts.
@@ -525,6 +530,8 @@ Claude-Flow v3 introduces **self-learning neural capabilities** that no other ag
525
530
 
526
531
  <sub>*Comparison updated January 23, 2026*</sub>
527
532
 
533
+ </details>
534
+
528
535
  <details>
529
536
  <summary>🚀 <strong>Key Differentiators</strong> — Self-learning, memory optimization, fault tolerance</summary>
530
537
 
@@ -1,31 +1,109 @@
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
  /**
6
- * Resolve IPNS name to CID
7
- * In production: Use ipfs-http-client or similar
12
+ * Available IPFS gateways in priority order
8
13
  */
9
- export declare function resolveIPNS(ipnsName: string, gateway?: string): Promise<string | null>;
14
+ export declare const IPFS_GATEWAYS: string[];
10
15
  /**
11
- * Fetch content from IPFS by CID
12
- * In production: Use ipfs-http-client or gateway fetch
16
+ * IPNS resolvers
13
17
  */
14
- export declare function fetchFromIPFS<T>(cid: string, gateway?: string): Promise<T | null>;
18
+ export declare const IPNS_RESOLVERS: string[];
15
19
  /**
16
- * Check if CID is pinned
20
+ * Gateway configuration
21
+ */
22
+ export interface GatewayConfig {
23
+ url: string;
24
+ timeout?: number;
25
+ headers?: Record<string, string>;
26
+ priority?: number;
27
+ }
28
+ /**
29
+ * Fetch result with metadata
30
+ */
31
+ export interface FetchResult<T> {
32
+ data: T;
33
+ gateway: string;
34
+ cid: string;
35
+ cached: boolean;
36
+ latencyMs: number;
37
+ }
38
+ /**
39
+ * Resolve IPNS name to CID with fallback across multiple gateways
40
+ *
41
+ * @param ipnsName - IPNS key or DNSLink domain
42
+ * @param preferredGateway - Optional preferred gateway to try first
43
+ * @returns CID string or null if resolution fails
44
+ */
45
+ export declare function resolveIPNS(ipnsName: string, preferredGateway?: string): Promise<string | null>;
46
+ /**
47
+ * Fetch content from IPFS by CID with fallback across multiple gateways
48
+ *
49
+ * @param cid - Content Identifier
50
+ * @param preferredGateway - Optional preferred gateway to try first
51
+ * @returns Parsed JSON content or null if fetch fails
52
+ */
53
+ export declare function fetchFromIPFS<T>(cid: string, preferredGateway?: string): Promise<T | null>;
54
+ /**
55
+ * Fetch with full result metadata
56
+ */
57
+ export declare function fetchFromIPFSWithMetadata<T>(cid: string, preferredGateway?: string): Promise<FetchResult<T> | null>;
58
+ /**
59
+ * Check if CID is pinned/available on a gateway
17
60
  */
18
61
  export declare function isPinned(cid: string, gateway?: string): Promise<boolean>;
62
+ /**
63
+ * Check availability across multiple gateways
64
+ */
65
+ export declare function checkAvailability(cid: string): Promise<{
66
+ available: boolean;
67
+ gateways: Array<{
68
+ url: string;
69
+ available: boolean;
70
+ latencyMs: number;
71
+ }>;
72
+ }>;
19
73
  /**
20
74
  * Get IPFS gateway URL for a CID
21
75
  */
22
76
  export declare function getGatewayUrl(cid: string, gateway?: string): string;
23
77
  /**
24
- * Validate CID format
78
+ * Get multiple gateway URLs for redundancy
79
+ */
80
+ export declare function getGatewayUrls(cid: string): string[];
81
+ /**
82
+ * Validate CID format (CIDv0 and CIDv1)
25
83
  */
26
84
  export declare function isValidCID(cid: string): boolean;
85
+ /**
86
+ * Validate IPNS name format
87
+ */
88
+ export declare function isValidIPNS(ipnsName: string): boolean;
27
89
  /**
28
90
  * Generate content hash for verification
29
91
  */
30
- export declare function hashContent(content: Buffer): string;
92
+ export declare function hashContent(content: Buffer | string): string;
93
+ /**
94
+ * Verify Ed25519 signature (async import to avoid bundling issues)
95
+ */
96
+ export declare function verifyEd25519Signature(message: string, signature: string, publicKey: string): Promise<boolean>;
97
+ /**
98
+ * Parse CID to extract metadata
99
+ */
100
+ export declare function parseCID(cid: string): {
101
+ version: 0 | 1;
102
+ codec: string;
103
+ hash: string;
104
+ } | null;
105
+ /**
106
+ * Format bytes to human readable
107
+ */
108
+ export declare function formatBytes(bytes: number): string;
31
109
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAA0B,GAClC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBxB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAA0B,GAClC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAkBnB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAA0B,GAAG,MAAM,CAEtF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAI/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;GAEG;AACH,eAAO,MAAM,aAAa,UAMzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,UAI1B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2DxB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA0CnB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,GAAG,EAAE,MAAM,EACX,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAqChC;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE,CAAC,CA4BD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAA0B,GAAG,MAAM,CAEtF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAI/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IACrC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAmBP;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD"}
@@ -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
- * Resolve IPNS name to CID
8
- * In production: Use ipfs-http-client or similar
13
+ * Available IPFS gateways in priority order
9
14
  */
10
- export async function resolveIPNS(ipnsName, gateway = 'https://ipfs.io') {
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
- // In production: Use IPNS resolution
13
- // For demo: Return null to trigger fallback to demo registry
14
- try {
15
- // Simulate IPNS resolution delay
16
- await new Promise(resolve => setTimeout(resolve, 100));
17
- // For demo purposes, return null to use local demo data
18
- // In production, this would do actual IPNS resolution
19
- return null;
20
- }
21
- catch (error) {
22
- console.warn(`[IPFS] IPNS resolution failed:`, error);
23
- return null;
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
- * In production: Use ipfs-http-client or gateway fetch
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, gateway = 'https://ipfs.io') {
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
- try {
33
- // Simulate fetch delay
34
- await new Promise(resolve => setTimeout(resolve, 100));
35
- // For demo purposes, return null to use local demo data
36
- // In production, this would fetch from IPFS gateway
37
- // const url = `${gateway}/ipfs/${cid}`;
38
- // const response = await fetch(url);
39
- // return await response.json();
40
- return null;
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
- catch (error) {
43
- console.warn(`[IPFS] Fetch failed:`, error);
44
- return null;
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
- // In production: Check with pinning service
52
- return false;
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
- * Validate CID format
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) and varies in length
66
- return /^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[a-z2-7]{58,})$/.test(cid);
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
- return crypto.createHash('sha256').update(content).digest('hex');
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;;;GAGG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,UAAkB,iBAAiB;IAEnC,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IAElD,qCAAqC;IACrC,6DAA6D;IAC7D,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,wDAAwD;QACxD,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,UAAkB,iBAAiB;IAEnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,uBAAuB;QACvB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,wDAAwD;QACxD,oDAAoD;QACpD,wCAAwC;QACxC,qCAAqC;QACrC,gCAAgC;QAEhC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,UAAkB,iBAAiB;IAEnC,4CAA4C;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,UAAkB,iBAAiB;IAC5E,OAAO,GAAG,OAAO,SAAS,GAAG,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,8CAA8C;IAC9C,sDAAsD;IACtD,OAAO,+CAA+C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"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"}