@antseed/node 0.2.58 → 0.2.59

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 (73) hide show
  1. package/package.json +2 -2
  2. package/dist/discovery/default-metadata-resolver.d.ts +0 -16
  3. package/dist/discovery/default-metadata-resolver.d.ts.map +0 -1
  4. package/dist/discovery/default-metadata-resolver.js +0 -16
  5. package/dist/discovery/default-metadata-resolver.js.map +0 -1
  6. package/dist/discovery/profile-manager.d.ts +0 -50
  7. package/dist/discovery/profile-manager.d.ts.map +0 -1
  8. package/dist/discovery/profile-manager.js +0 -105
  9. package/dist/discovery/profile-manager.js.map +0 -1
  10. package/dist/discovery/profile-search.d.ts +0 -27
  11. package/dist/discovery/profile-search.d.ts.map +0 -1
  12. package/dist/discovery/profile-search.js +0 -75
  13. package/dist/discovery/profile-search.js.map +0 -1
  14. package/dist/discovery/reputation-verifier.d.ts +0 -5
  15. package/dist/discovery/reputation-verifier.d.ts.map +0 -1
  16. package/dist/discovery/reputation-verifier.js +0 -5
  17. package/dist/discovery/reputation-verifier.js.map +0 -1
  18. package/dist/discovery/stats-verifier.d.ts +0 -27
  19. package/dist/discovery/stats-verifier.d.ts.map +0 -1
  20. package/dist/discovery/stats-verifier.js +0 -38
  21. package/dist/discovery/stats-verifier.js.map +0 -1
  22. package/dist/p2p/handshake.d.ts +0 -47
  23. package/dist/p2p/handshake.d.ts.map +0 -1
  24. package/dist/p2p/handshake.js +0 -107
  25. package/dist/p2p/handshake.js.map +0 -1
  26. package/dist/p2p/reconnect.d.ts +0 -48
  27. package/dist/p2p/reconnect.d.ts.map +0 -1
  28. package/dist/p2p/reconnect.js +0 -89
  29. package/dist/p2p/reconnect.js.map +0 -1
  30. package/dist/payments/disputes.d.ts +0 -18
  31. package/dist/payments/disputes.d.ts.map +0 -1
  32. package/dist/payments/disputes.js +0 -47
  33. package/dist/payments/disputes.js.map +0 -1
  34. package/dist/payments/evm/escrow-client.d.ts +0 -82
  35. package/dist/payments/evm/escrow-client.d.ts.map +0 -1
  36. package/dist/payments/evm/escrow-client.js +0 -277
  37. package/dist/payments/evm/escrow-client.js.map +0 -1
  38. package/dist/payments/evm/keypair.d.ts +0 -10
  39. package/dist/payments/evm/keypair.d.ts.map +0 -1
  40. package/dist/payments/evm/keypair.js +0 -13
  41. package/dist/payments/evm/keypair.js.map +0 -1
  42. package/dist/payments/evm/sessions-client.d.ts +0 -30
  43. package/dist/payments/evm/sessions-client.d.ts.map +0 -1
  44. package/dist/payments/evm/sessions-client.js +0 -61
  45. package/dist/payments/evm/sessions-client.js.map +0 -1
  46. package/dist/payments/evm/wallet.d.ts +0 -5
  47. package/dist/payments/evm/wallet.d.ts.map +0 -1
  48. package/dist/payments/evm/wallet.js +0 -31
  49. package/dist/payments/evm/wallet.js.map +0 -1
  50. package/dist/payments/session-store.d.ts +0 -68
  51. package/dist/payments/session-store.d.ts.map +0 -1
  52. package/dist/payments/session-store.js +0 -272
  53. package/dist/payments/session-store.js.map +0 -1
  54. package/dist/payments/settlement.d.ts +0 -6
  55. package/dist/payments/settlement.d.ts.map +0 -1
  56. package/dist/payments/settlement.js +0 -25
  57. package/dist/payments/settlement.js.map +0 -1
  58. package/dist/proxy/model-api-adapter.d.ts +0 -30
  59. package/dist/proxy/model-api-adapter.d.ts.map +0 -1
  60. package/dist/proxy/model-api-adapter.js +0 -891
  61. package/dist/proxy/model-api-adapter.js.map +0 -1
  62. package/dist/types/model-api.d.ts +0 -4
  63. package/dist/types/model-api.d.ts.map +0 -1
  64. package/dist/types/model-api.js +0 -11
  65. package/dist/types/model-api.js.map +0 -1
  66. package/dist/types/peer-profile.d.ts +0 -24
  67. package/dist/types/peer-profile.d.ts.map +0 -1
  68. package/dist/types/peer-profile.js +0 -2
  69. package/dist/types/peer-profile.js.map +0 -1
  70. package/dist/types/staking.d.ts +0 -16
  71. package/dist/types/staking.d.ts.map +0 -1
  72. package/dist/types/staking.js +0 -6
  73. package/dist/types/staking.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antseed/node",
3
- "version": "0.2.58",
3
+ "version": "0.2.59",
4
4
  "description": "Antseed Network protocol SDK — P2P inference marketplace",
5
5
  "type": "module",
6
6
  "files": [
@@ -45,7 +45,7 @@
45
45
  "ethers": "~6.16.0",
46
46
  "node-datachannel": "^0.7.0",
47
47
  "tokenx": "^1.3.0",
48
- "@antseed/api-adapter": "0.1.25"
48
+ "@antseed/api-adapter": "0.1.26"
49
49
  },
50
50
  "optionalDependencies": {
51
51
  "keytar": "^7.9.0"
@@ -1,16 +0,0 @@
1
- import type { PeerEndpoint, MetadataResolver } from "./metadata-resolver.js";
2
- import type { PeerMetadata } from "./peer-metadata.js";
3
- /**
4
- * Default fail-closed metadata resolver.
5
- *
6
- * Always returns `null`, meaning no peer metadata can be resolved.
7
- * This is intentional: without a real transport-specific resolver wired in,
8
- * no peers will pass the metadata resolution step and lookups will
9
- * return an empty list. Callers must supply a concrete `MetadataResolver`
10
- * implementation (e.g. one that fetches metadata over HTTP or a P2P channel)
11
- * to discover real peers.
12
- */
13
- export declare class DefaultMetadataResolver implements MetadataResolver {
14
- resolve(_peer: PeerEndpoint): Promise<PeerMetadata | null>;
15
- }
16
- //# sourceMappingURL=default-metadata-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"default-metadata-resolver.d.ts","sourceRoot":"","sources":["../../src/discovery/default-metadata-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;GASG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IACxD,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAGjE"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Default fail-closed metadata resolver.
3
- *
4
- * Always returns `null`, meaning no peer metadata can be resolved.
5
- * This is intentional: without a real transport-specific resolver wired in,
6
- * no peers will pass the metadata resolution step and lookups will
7
- * return an empty list. Callers must supply a concrete `MetadataResolver`
8
- * implementation (e.g. one that fetches metadata over HTTP or a P2P channel)
9
- * to discover real peers.
10
- */
11
- export class DefaultMetadataResolver {
12
- async resolve(_peer) {
13
- return null;
14
- }
15
- }
16
- //# sourceMappingURL=default-metadata-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"default-metadata-resolver.js","sourceRoot":"","sources":["../../src/discovery/default-metadata-resolver.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,MAAM,OAAO,uBAAuB;IAClC,KAAK,CAAC,OAAO,CAAC,KAAmB;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -1,50 +0,0 @@
1
- import type { PeerProfile, ProfileCapability } from '../types/peer-profile.js';
2
- import type { Identity } from '../p2p/identity.js';
3
- export interface ProfileManagerConfig {
4
- configDir: string;
5
- identity?: Identity;
6
- }
7
- export declare class ProfileManager {
8
- private readonly configDir;
9
- private readonly identity;
10
- private profile;
11
- constructor(config: ProfileManagerConfig);
12
- /**
13
- * Create a new peer profile.
14
- */
15
- createProfile(data: {
16
- displayName: string;
17
- description: string;
18
- tags?: string[];
19
- capabilities?: ProfileCapability[];
20
- region?: string;
21
- languages?: string[];
22
- website?: string;
23
- avatar?: string;
24
- }): PeerProfile;
25
- /**
26
- * Update an existing profile.
27
- */
28
- updateProfile(updates: Partial<Omit<PeerProfile, 'peerId' | 'createdAt'>>): PeerProfile;
29
- /**
30
- * Get the current profile.
31
- */
32
- getProfile(): PeerProfile | null;
33
- /**
34
- * Get SHA-256 hash of the profile for metadata announcements.
35
- */
36
- getProfileHash(): string;
37
- /**
38
- * Sign the profile hash with the identity's private key.
39
- */
40
- getProfileSignature(): Promise<string>;
41
- /**
42
- * Save profile to disk.
43
- */
44
- save(): Promise<void>;
45
- /**
46
- * Load profile from disk.
47
- */
48
- load(): Promise<void>;
49
- }
50
- //# sourceMappingURL=profile-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-manager.d.ts","sourceRoot":"","sources":["../../src/discovery/profile-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,OAAO,CAA4B;gBAE/B,MAAM,EAAE,oBAAoB;IAKxC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,WAAW;IAuBf;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW;IAgBvF;;OAEG;IACH,UAAU,IAAI,WAAW,GAAG,IAAI;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAU5C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}
@@ -1,105 +0,0 @@
1
- import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
- import { createHash } from 'node:crypto';
4
- import { signData } from '../p2p/identity.js';
5
- import { bytesToHex } from '../utils/hex.js';
6
- export class ProfileManager {
7
- configDir;
8
- identity;
9
- profile = null;
10
- constructor(config) {
11
- this.configDir = config.configDir;
12
- this.identity = config.identity;
13
- }
14
- /**
15
- * Create a new peer profile.
16
- */
17
- createProfile(data) {
18
- if (!this.identity) {
19
- throw new Error('Identity required to create profile');
20
- }
21
- const now = Date.now();
22
- this.profile = {
23
- peerId: this.identity.peerId,
24
- displayName: data.displayName,
25
- description: data.description,
26
- tags: data.tags ?? [],
27
- capabilities: data.capabilities ?? ['inference'],
28
- region: data.region ?? 'unknown',
29
- languages: data.languages ?? ['en'],
30
- website: data.website,
31
- avatar: data.avatar,
32
- createdAt: now,
33
- updatedAt: now,
34
- };
35
- return this.profile;
36
- }
37
- /**
38
- * Update an existing profile.
39
- */
40
- updateProfile(updates) {
41
- if (!this.profile) {
42
- throw new Error('No profile exists — call createProfile first');
43
- }
44
- this.profile = {
45
- ...this.profile,
46
- ...updates,
47
- peerId: this.profile.peerId, // immutable
48
- createdAt: this.profile.createdAt, // immutable
49
- updatedAt: Date.now(),
50
- };
51
- return this.profile;
52
- }
53
- /**
54
- * Get the current profile.
55
- */
56
- getProfile() {
57
- return this.profile;
58
- }
59
- /**
60
- * Get SHA-256 hash of the profile for metadata announcements.
61
- */
62
- getProfileHash() {
63
- if (!this.profile)
64
- return '';
65
- const json = JSON.stringify(this.profile);
66
- return createHash('sha256').update(json).digest('hex');
67
- }
68
- /**
69
- * Sign the profile hash with the identity's private key.
70
- */
71
- async getProfileSignature() {
72
- if (!this.identity || !this.profile) {
73
- throw new Error('Identity and profile required for signing');
74
- }
75
- const hash = this.getProfileHash();
76
- const hashBytes = new TextEncoder().encode(hash);
77
- const signature = await signData(this.identity.privateKey, hashBytes);
78
- return bytesToHex(signature);
79
- }
80
- /**
81
- * Save profile to disk.
82
- */
83
- async save() {
84
- if (!this.profile)
85
- return;
86
- await mkdir(this.configDir, { recursive: true });
87
- const filePath = join(this.configDir, 'profile.json');
88
- await writeFile(filePath, JSON.stringify(this.profile, null, 2), 'utf-8');
89
- }
90
- /**
91
- * Load profile from disk.
92
- */
93
- async load() {
94
- const filePath = join(this.configDir, 'profile.json');
95
- try {
96
- const raw = await readFile(filePath, 'utf-8');
97
- this.profile = JSON.parse(raw);
98
- }
99
- catch {
100
- // File doesn't exist — no profile yet
101
- this.profile = null;
102
- }
103
- }
104
- }
105
- //# sourceMappingURL=profile-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-manager.js","sourceRoot":"","sources":["../../src/discovery/profile-manager.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- import type { PeerProfile, ProfileCapability } from '../types/peer-profile.js';
2
- export interface ProfileSearchQuery {
3
- capability?: ProfileCapability;
4
- tags?: string[];
5
- region?: string;
6
- text?: string;
7
- }
8
- export interface ProfileSearchResult {
9
- profile: PeerProfile;
10
- relevanceScore: number;
11
- }
12
- /**
13
- * In-memory search index for cached peer profiles.
14
- */
15
- export declare class ProfileSearchIndex {
16
- private profiles;
17
- addProfile(profile: PeerProfile): void;
18
- removeProfile(peerId: string): void;
19
- getProfile(peerId: string): PeerProfile | null;
20
- getAllProfiles(): PeerProfile[];
21
- /**
22
- * Search profiles with relevance scoring.
23
- */
24
- search(query: ProfileSearchQuery): ProfileSearchResult[];
25
- get size(): number;
26
- }
27
- //# sourceMappingURL=profile-search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-search.d.ts","sourceRoot":"","sources":["../../src/discovery/profile-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,WAAW,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAuC;IAEvD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAItC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAInC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAI9C,cAAc,IAAI,WAAW,EAAE;IAI/B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,EAAE;IAyDxD,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -1,75 +0,0 @@
1
- /**
2
- * In-memory search index for cached peer profiles.
3
- */
4
- export class ProfileSearchIndex {
5
- profiles = new Map();
6
- addProfile(profile) {
7
- this.profiles.set(profile.peerId, profile);
8
- }
9
- removeProfile(peerId) {
10
- this.profiles.delete(peerId);
11
- }
12
- getProfile(peerId) {
13
- return this.profiles.get(peerId) ?? null;
14
- }
15
- getAllProfiles() {
16
- return Array.from(this.profiles.values());
17
- }
18
- /**
19
- * Search profiles with relevance scoring.
20
- */
21
- search(query) {
22
- const results = [];
23
- for (const profile of this.profiles.values()) {
24
- let score = 0;
25
- // Filter by capability (hard filter)
26
- if (query.capability) {
27
- if (!profile.capabilities.includes(query.capability))
28
- continue;
29
- score += 10;
30
- }
31
- // Filter by region (boost score)
32
- if (query.region) {
33
- if (profile.region.toLowerCase() === query.region.toLowerCase()) {
34
- score += 5;
35
- }
36
- }
37
- // Tag matching (boost score)
38
- if (query.tags && query.tags.length > 0) {
39
- const profileTags = new Set(profile.tags.map(t => t.toLowerCase()));
40
- let tagMatches = 0;
41
- for (const tag of query.tags) {
42
- if (profileTags.has(tag.toLowerCase())) {
43
- tagMatches++;
44
- }
45
- }
46
- if (tagMatches > 0) {
47
- score += tagMatches * 3;
48
- }
49
- }
50
- // Text search in name and description
51
- if (query.text) {
52
- const text = query.text.toLowerCase();
53
- if (profile.displayName.toLowerCase().includes(text)) {
54
- score += 8;
55
- }
56
- if (profile.description.toLowerCase().includes(text)) {
57
- score += 4;
58
- }
59
- if (profile.tags.some(t => t.toLowerCase().includes(text))) {
60
- score += 2;
61
- }
62
- }
63
- if (score > 0) {
64
- results.push({ profile, relevanceScore: score });
65
- }
66
- }
67
- // Sort by relevance (descending)
68
- results.sort((a, b) => b.relevanceScore - a.relevanceScore);
69
- return results;
70
- }
71
- get size() {
72
- return this.profiles.size;
73
- }
74
- }
75
- //# sourceMappingURL=profile-search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-search.js","sourceRoot":"","sources":["../../src/discovery/profile-search.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * @deprecated Use stats-verifier.ts instead. This module is kept for backward compatibility.
3
- */
4
- export { verifyStats as verifyReputation, type StatsVerification as ReputationVerification } from './stats-verifier.js';
5
- //# sourceMappingURL=reputation-verifier.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reputation-verifier.d.ts","sourceRoot":"","sources":["../../src/discovery/reputation-verifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,KAAK,iBAAiB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * @deprecated Use stats-verifier.ts instead. This module is kept for backward compatibility.
3
- */
4
- export { verifyStats as verifyReputation } from './stats-verifier.js';
5
- //# sourceMappingURL=reputation-verifier.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reputation-verifier.js","sourceRoot":"","sources":["../../src/discovery/reputation-verifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAoD,MAAM,qBAAqB,CAAC"}
@@ -1,27 +0,0 @@
1
- import type { PeerMetadata } from "./peer-metadata.js";
2
- import type { StatsClient } from "../payments/evm/stats-client.js";
3
- import type { StakingClient } from "../payments/evm/staking-client.js";
4
- export interface StatsVerification {
5
- /** Whether the claimed stats match on-chain data. */
6
- valid: boolean;
7
- /** The actual on-chain reputation score (channel count). */
8
- actualReputation: number;
9
- /** The actual on-chain channel count. */
10
- actualChannelCount: number;
11
- /** The actual on-chain ghost/dispute count. */
12
- actualDisputeCount: number;
13
- /** The claimed on-chain reputation score from metadata. */
14
- claimedReputation?: number;
15
- /** The claimed on-chain channel count from metadata. */
16
- claimedChannelCount?: number;
17
- /** The claimed on-chain dispute count from metadata. */
18
- claimedDisputeCount?: number;
19
- }
20
- /**
21
- * Verify a peer's claimed on-chain stats against the AntseedStats contract.
22
- * Uses the staking client to look up the agentId from the peer's EVM address
23
- * (derived from peerId), then fetches stats from the StatsClient and compares
24
- * claimed vs actual.
25
- */
26
- export declare function verifyStats(statsClient: StatsClient, stakingClient: StakingClient, metadata: PeerMetadata): Promise<StatsVerification>;
27
- //# sourceMappingURL=stats-verifier.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats-verifier.d.ts","sourceRoot":"","sources":["../../src/discovery/stats-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGvE,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAiC5B"}
@@ -1,38 +0,0 @@
1
- import { peerIdToAddress } from "../types/peer.js";
2
- /**
3
- * Verify a peer's claimed on-chain stats against the AntseedStats contract.
4
- * Uses the staking client to look up the agentId from the peer's EVM address
5
- * (derived from peerId), then fetches stats from the StatsClient and compares
6
- * claimed vs actual.
7
- */
8
- export async function verifyStats(statsClient, stakingClient, metadata) {
9
- const evmAddress = peerIdToAddress(metadata.peerId);
10
- const agentId = await stakingClient.getAgentId(evmAddress);
11
- const stats = await statsClient.getStats(agentId);
12
- // Map AgentStats fields to the verification format:
13
- // - channelCount is the total completed channels
14
- // - ghostCount maps to dispute count (channels where provider went silent)
15
- // - Use channelCount as the reputation metric (higher = more trusted)
16
- const actualReputation = stats.channelCount;
17
- const actualChannelCount = stats.channelCount;
18
- const actualDisputeCount = stats.ghostCount;
19
- // Always compare against on-chain data.
20
- // If peer omits stats fields, treat as unverified — prevents bypass
21
- // by simply not claiming any values.
22
- const valid = metadata.onChainReputation !== undefined &&
23
- metadata.onChainChannelCount !== undefined &&
24
- metadata.onChainDisputeCount !== undefined &&
25
- metadata.onChainReputation === actualReputation &&
26
- metadata.onChainChannelCount === actualChannelCount &&
27
- metadata.onChainDisputeCount === actualDisputeCount;
28
- return {
29
- valid,
30
- actualReputation,
31
- actualChannelCount,
32
- actualDisputeCount,
33
- claimedReputation: metadata.onChainReputation,
34
- claimedChannelCount: metadata.onChainChannelCount,
35
- claimedDisputeCount: metadata.onChainDisputeCount,
36
- };
37
- }
38
- //# sourceMappingURL=stats-verifier.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats-verifier.js","sourceRoot":"","sources":["../../src/discovery/stats-verifier.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAmBnD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAwB,EACxB,aAA4B,EAC5B,QAAsB;IAEtB,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAElD,oDAAoD;IACpD,iDAAiD;IACjD,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAAC;IAC5C,MAAM,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAAC;IAC9C,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC;IAE5C,wCAAwC;IACxC,oEAAoE;IACpE,qCAAqC;IACrC,MAAM,KAAK,GACT,QAAQ,CAAC,iBAAiB,KAAK,SAAS;QACxC,QAAQ,CAAC,mBAAmB,KAAK,SAAS;QAC1C,QAAQ,CAAC,mBAAmB,KAAK,SAAS;QAC1C,QAAQ,CAAC,iBAAiB,KAAK,gBAAgB;QAC/C,QAAQ,CAAC,mBAAmB,KAAK,kBAAkB;QACnD,QAAQ,CAAC,mBAAmB,KAAK,kBAAkB,CAAC;IAEtD,OAAO;QACL,KAAK;QACL,gBAAgB;QAChB,kBAAkB;QAClB,kBAAkB;QAClB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;QACjD,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;KAClD,CAAC;AACJ,CAAC"}
@@ -1,47 +0,0 @@
1
- import { type PeerId } from "../types/peer.js";
2
- import { MessageType } from "../types/protocol.js";
3
- import type { PeerConnection } from "./connection-manager.js";
4
- export interface HandshakeResult {
5
- remotePeerId: PeerId;
6
- verified: boolean;
7
- }
8
- /**
9
- * Build the HandshakeInit payload:
10
- * [32 bytes pubkey] [32 bytes nonce] [64 bytes signature(nonce)]
11
- */
12
- export declare function buildHandshakeInit(publicKey: Uint8Array, privateKey: Uint8Array): Promise<{
13
- payload: Uint8Array;
14
- nonce: Uint8Array;
15
- }>;
16
- /**
17
- * Verify a received HandshakeInit payload.
18
- * Returns the remote peer's public key and nonce if valid.
19
- */
20
- export declare function verifyHandshakeInit(payload: Uint8Array): Promise<{
21
- remotePubKey: Uint8Array;
22
- nonce: Uint8Array;
23
- valid: boolean;
24
- }>;
25
- /**
26
- * Build a HandshakeAck payload:
27
- * [32 bytes pubkey] [32 bytes echo-nonce] [64 bytes signature(echo-nonce)]
28
- */
29
- export declare function buildHandshakeAck(publicKey: Uint8Array, privateKey: Uint8Array, remoteNonce: Uint8Array): Promise<Uint8Array>;
30
- /**
31
- * Verify a received HandshakeAck payload against the nonce we originally sent.
32
- */
33
- export declare function verifyHandshakeAck(payload: Uint8Array, originalNonce: Uint8Array): Promise<{
34
- remotePubKey: Uint8Array;
35
- valid: boolean;
36
- }>;
37
- /**
38
- * Perform the full handshake as the initiator.
39
- * Sends HandshakeInit, waits for HandshakeAck, verifies.
40
- */
41
- export declare function performHandshake(conn: PeerConnection, localPublicKey: Uint8Array, localPrivateKey: Uint8Array, sendFn: (type: MessageType, payload: Uint8Array) => void, waitForMessage: (type: MessageType, timeoutMs: number) => Promise<Uint8Array>): Promise<HandshakeResult>;
42
- /**
43
- * Respond to a handshake as the responder.
44
- * Waits for HandshakeInit, verifies, sends HandshakeAck.
45
- */
46
- export declare function respondToHandshake(conn: PeerConnection, localPublicKey: Uint8Array, localPrivateKey: Uint8Array, sendFn: (type: MessageType, payload: Uint8Array) => void, waitForMessage: (type: MessageType, timeoutMs: number) => Promise<Uint8Array>): Promise<HandshakeResult>;
47
- //# sourceMappingURL=handshake.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../src/p2p/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAY,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQ9D,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AASD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,UAAU,EACrB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,CAUrD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,YAAY,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAY1E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,UAAU,EACrB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,UAAU,GACtB,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,UAAU,EACnB,aAAa,EAAE,UAAU,GACxB,OAAO,CAAC;IAAE,YAAY,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAiBvD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,EACpB,cAAc,EAAE,UAAU,EAC1B,eAAe,EAAE,UAAU,EAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,KAAK,IAAI,EACxD,cAAc,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,GAC5E,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,cAAc,EACpB,cAAc,EAAE,UAAU,EAC1B,eAAe,EAAE,UAAU,EAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,KAAK,IAAI,EACxD,cAAc,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,GAC5E,OAAO,CAAC,eAAe,CAAC,CAgB1B"}
@@ -1,107 +0,0 @@
1
- import { toPeerId } from "../types/peer.js";
2
- import { MessageType } from "../types/protocol.js";
3
- import { ConnectionState } from "../types/connection.js";
4
- import { signData, verifySignature, bytesToHex } from "./identity.js";
5
- /** Nonce size in bytes. */
6
- const NONCE_SIZE = 32;
7
- /** Handshake timeout in milliseconds. */
8
- const HANDSHAKE_TIMEOUT_MS = 10_000;
9
- /** Generate a random nonce for the handshake challenge. */
10
- function generateNonce() {
11
- const nonce = new Uint8Array(NONCE_SIZE);
12
- crypto.getRandomValues(nonce);
13
- return nonce;
14
- }
15
- /**
16
- * Build the HandshakeInit payload:
17
- * [32 bytes pubkey] [32 bytes nonce] [64 bytes signature(nonce)]
18
- */
19
- export async function buildHandshakeInit(publicKey, privateKey) {
20
- const nonce = generateNonce();
21
- const signature = await signData(privateKey, nonce);
22
- const payload = new Uint8Array(32 + 32 + 64);
23
- payload.set(publicKey, 0);
24
- payload.set(nonce, 32);
25
- payload.set(signature, 64);
26
- return { payload, nonce };
27
- }
28
- /**
29
- * Verify a received HandshakeInit payload.
30
- * Returns the remote peer's public key and nonce if valid.
31
- */
32
- export async function verifyHandshakeInit(payload) {
33
- if (payload.length !== 128) {
34
- return { remotePubKey: new Uint8Array(32), nonce: new Uint8Array(32), valid: false };
35
- }
36
- const remotePubKey = payload.slice(0, 32);
37
- const nonce = payload.slice(32, 64);
38
- const signature = payload.slice(64, 128);
39
- const valid = await verifySignature(remotePubKey, signature, nonce);
40
- return { remotePubKey, nonce, valid };
41
- }
42
- /**
43
- * Build a HandshakeAck payload:
44
- * [32 bytes pubkey] [32 bytes echo-nonce] [64 bytes signature(echo-nonce)]
45
- */
46
- export async function buildHandshakeAck(publicKey, privateKey, remoteNonce) {
47
- const signature = await signData(privateKey, remoteNonce);
48
- const payload = new Uint8Array(32 + 32 + 64);
49
- payload.set(publicKey, 0);
50
- payload.set(remoteNonce, 32);
51
- payload.set(signature, 64);
52
- return payload;
53
- }
54
- /**
55
- * Verify a received HandshakeAck payload against the nonce we originally sent.
56
- */
57
- export async function verifyHandshakeAck(payload, originalNonce) {
58
- if (payload.length !== 128) {
59
- return { remotePubKey: new Uint8Array(32), valid: false };
60
- }
61
- const remotePubKey = payload.slice(0, 32);
62
- const echoNonce = payload.slice(32, 64);
63
- const signature = payload.slice(64, 128);
64
- // Verify that the echoed nonce matches what we sent
65
- const nonceMatches = originalNonce.every((b, i) => b === echoNonce[i]);
66
- if (!nonceMatches) {
67
- return { remotePubKey, valid: false };
68
- }
69
- const valid = await verifySignature(remotePubKey, signature, echoNonce);
70
- return { remotePubKey, valid };
71
- }
72
- /**
73
- * Perform the full handshake as the initiator.
74
- * Sends HandshakeInit, waits for HandshakeAck, verifies.
75
- */
76
- export async function performHandshake(conn, localPublicKey, localPrivateKey, sendFn, waitForMessage) {
77
- const { payload, nonce } = await buildHandshakeInit(localPublicKey, localPrivateKey);
78
- sendFn(MessageType.HandshakeInit, payload);
79
- const ackPayload = await waitForMessage(MessageType.HandshakeAck, HANDSHAKE_TIMEOUT_MS);
80
- const { remotePubKey, valid } = await verifyHandshakeAck(ackPayload, nonce);
81
- const remotePeerId = toPeerId(bytesToHex(remotePubKey));
82
- if (valid) {
83
- conn.setState(ConnectionState.Authenticated);
84
- }
85
- else {
86
- conn.setState(ConnectionState.Failed);
87
- }
88
- return { remotePeerId, verified: valid };
89
- }
90
- /**
91
- * Respond to a handshake as the responder.
92
- * Waits for HandshakeInit, verifies, sends HandshakeAck.
93
- */
94
- export async function respondToHandshake(conn, localPublicKey, localPrivateKey, sendFn, waitForMessage) {
95
- const initPayload = await waitForMessage(MessageType.HandshakeInit, HANDSHAKE_TIMEOUT_MS);
96
- const { remotePubKey, nonce, valid } = await verifyHandshakeInit(initPayload);
97
- if (!valid) {
98
- conn.setState(ConnectionState.Failed);
99
- return { remotePeerId: toPeerId(bytesToHex(remotePubKey)), verified: false };
100
- }
101
- const ackPayload = await buildHandshakeAck(localPublicKey, localPrivateKey, nonce);
102
- sendFn(MessageType.HandshakeAck, ackPayload);
103
- const remotePeerId = toPeerId(bytesToHex(remotePubKey));
104
- conn.setState(ConnectionState.Authenticated);
105
- return { remotePeerId, verified: true };
106
- }
107
- //# sourceMappingURL=handshake.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../src/p2p/handshake.ts"],"names":[],"mappings":"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"}