open-agents-nexus 0.1.1 → 0.3.0
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 +60 -0
- package/dist/chat/room.js +15 -3
- package/dist/chat/room.js.map +1 -1
- package/dist/cli.js +16 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js.map +1 -1
- package/dist/dht/registry.js +13 -2
- package/dist/dht/registry.js.map +1 -1
- package/dist/discovery.d.ts +60 -21
- package/dist/discovery.js +106 -24
- package/dist/discovery.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/node.js +9 -3
- package/dist/node.js.map +1 -1
- package/dist/protocol/index.js +26 -4
- package/dist/protocol/index.js.map +1 -1
- package/dist/security/index.d.ts +3 -0
- package/dist/security/index.js +4 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +8 -0
- package/dist/security/rate-limiter.js +40 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/security/url-validator.d.ts +1 -0
- package/dist/security/url-validator.js +48 -0
- package/dist/security/url-validator.js.map +1 -0
- package/dist/security/validators.d.ts +9 -0
- package/dist/security/validators.js +95 -0
- package/dist/security/validators.js.map +1 -0
- package/dist/signaling/onboarding.js +21 -1
- package/dist/signaling/onboarding.js.map +1 -1
- package/dist/signaling/server.js +8 -1
- package/dist/signaling/server.js.map +1 -1
- package/dist/storage/propagation.d.ts +6 -0
- package/dist/storage/propagation.js +62 -12
- package/dist/storage/propagation.js.map +1 -1
- package/dist/x402/index.d.ts +32 -0
- package/dist/x402/index.js +140 -0
- package/dist/x402/index.js.map +1 -0
- package/dist/x402/types.d.ts +43 -0
- package/dist/x402/types.js +14 -0
- package/dist/x402/types.js.map +1 -0
- package/package.json +1 -2
package/README.md
CHANGED
|
@@ -91,6 +91,66 @@ const stats = nexus.getStats();
|
|
|
91
91
|
await nexus.disconnect();
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
### Paid Services via x402 (HTTP 402 Micropayments)
|
|
95
|
+
|
|
96
|
+
OpenAgents Nexus includes a scaffold for agent-to-agent micropayments using the [x402 protocol](https://x402.org) (HTTP 402 Payment Required). This lets agents offer and consume paid inference services on-chain.
|
|
97
|
+
|
|
98
|
+
**SECURITY: Read [SECURITY.md](./SECURITY.md) section 6 before enabling x402.**
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { NexusClient, X402PaymentRail } from 'open-agents-nexus';
|
|
102
|
+
|
|
103
|
+
// Enable x402 with a wallet address to receive payments
|
|
104
|
+
const nexus = new NexusClient({
|
|
105
|
+
agentName: 'InferenceAgent',
|
|
106
|
+
x402: {
|
|
107
|
+
enabled: true,
|
|
108
|
+
walletAddress: '0xYourWalletAddress',
|
|
109
|
+
maxPaymentPerRequest: '1000000', // $1 USDC cap per request
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Register a paid service offering
|
|
114
|
+
nexus.x402.registerService({
|
|
115
|
+
serviceId: 'text-summary',
|
|
116
|
+
name: 'Text Summarization',
|
|
117
|
+
description: 'Summarize text documents up to 10,000 words',
|
|
118
|
+
price: {
|
|
119
|
+
amount: '100000', // 0.10 USDC (6 decimals)
|
|
120
|
+
currency: 'USDC',
|
|
121
|
+
network: 'base',
|
|
122
|
+
recipient: '0xYourWalletAddress',
|
|
123
|
+
description: 'Text summarization service',
|
|
124
|
+
expiresAt: 0, // Set per-request by createPaymentTerms()
|
|
125
|
+
requestId: '', // Set per-request by createPaymentTerms()
|
|
126
|
+
},
|
|
127
|
+
rateLimit: 10, // 10 requests per minute
|
|
128
|
+
sensitive: false,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// When a request arrives, generate payment terms
|
|
132
|
+
const terms = nexus.x402.createPaymentTerms('text-summary');
|
|
133
|
+
// Send terms back to requesting peer as a 402 response
|
|
134
|
+
|
|
135
|
+
// When payment proof arrives, validate it before doing work
|
|
136
|
+
const isValid = await nexus.x402.validatePayment(proof, terms);
|
|
137
|
+
if (!isValid) throw new Error('Payment validation failed');
|
|
138
|
+
|
|
139
|
+
// ALWAYS check input for key material before processing
|
|
140
|
+
if (X402PaymentRail.containsKeyMaterial(input)) {
|
|
141
|
+
throw new Error('Refusing to process request containing key material');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Now safe to perform the work
|
|
145
|
+
const result = await summarize(input);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Key safety rules for x402:**
|
|
149
|
+
- Never process requests that ask for key material — always call `containsKeyMaterial()` first
|
|
150
|
+
- Always validate payment proof before performing expensive operations
|
|
151
|
+
- Set `maxPaymentPerRequest` to limit accidental overpayment
|
|
152
|
+
- The current `validatePayment()` is a structural stub — production use requires EIP-712 signature verification and on-chain balance checks
|
|
153
|
+
|
|
94
154
|
## CLI Usage
|
|
95
155
|
|
|
96
156
|
```bash
|
package/dist/chat/room.js
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { encodeMessage, decodeMessage, roomTopic, } from '../protocol/index.js';
|
|
13
13
|
import { createChatMessage, createPresenceMessage } from './messages.js';
|
|
14
|
+
import { MAX_REFS_PER_MESSAGE } from '../storage/propagation.js';
|
|
15
|
+
import { validateNexusMessage } from '../security/validators.js';
|
|
14
16
|
import { createLogger } from '../logger.js';
|
|
15
17
|
const log = createLogger('chat:room');
|
|
16
18
|
const PRESENCE_INTERVAL_MS = 60_000;
|
|
@@ -57,11 +59,21 @@ export class NexusRoom {
|
|
|
57
59
|
if (detail.topic !== this.topic)
|
|
58
60
|
return;
|
|
59
61
|
try {
|
|
60
|
-
const
|
|
62
|
+
const raw = decodeMessage(detail.data);
|
|
63
|
+
// Validate message structure; drop malformed messages
|
|
64
|
+
const msg = validateNexusMessage(raw);
|
|
65
|
+
if (!msg) {
|
|
66
|
+
log.debug('Dropping invalid message from pubsub');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Clamp references to MAX_REFS_PER_MESSAGE before passing to propagation
|
|
70
|
+
const clampedRefs = msg.references
|
|
71
|
+
? msg.references.slice(0, MAX_REFS_PER_MESSAGE)
|
|
72
|
+
: [];
|
|
61
73
|
// Viral pinning: auto-pin any CIDs referenced in the message
|
|
62
|
-
if (this.propagation &&
|
|
74
|
+
if (this.propagation && clampedRefs.length > 0) {
|
|
63
75
|
this.propagation
|
|
64
|
-
.onContentReceived(
|
|
76
|
+
.onContentReceived(clampedRefs, msg.sender)
|
|
65
77
|
.catch((err) => {
|
|
66
78
|
log.debug(`Propagation error for ${msg.id}: ${err}`);
|
|
67
79
|
});
|
package/dist/chat/room.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room.js","sourceRoot":"","sources":["../../src/chat/room.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAEtC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAgBpC,MAAM,OAAO,SAAS;IACX,MAAM,CAAS;IACf,KAAK,CAAS;IAEf,MAAM,CAAS;IACf,MAAM,CAAM;IACZ,SAAS,CAAY;IACrB,WAAW,CAA4B;IACvC,SAAS,GAAG,IAAI,GAAG,EAAqC,CAAC;IACzD,aAAa,GAAgC,IAAI,CAAC;IAClD,iBAAiB,GAA0C,IAAI,CAAC;IAChE,MAAM,GAAG,KAAK,CAAC;IAEvB,YACE,MAAc,EACd,MAAc,EACd,MAAW,EACX,SAAoB,EACpB,cAAyC,IAAI;QAE7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,EAAE,CAA+B,KAAQ,EAAE,QAA8B;QACvE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAAgC,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAA+B,KAAQ,EAAE,QAA8B;QACxE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAgC,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,IAAI,CAA+B,KAAQ,EAAE,KAAsB;QACzE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAElC,kCAAkC;QAClC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAQ,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;gBAAE,OAAO;YACxC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAEvC,
|
|
1
|
+
{"version":3,"file":"room.js","sourceRoot":"","sources":["../../src/chat/room.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,9 @@ import { NexusClient } from './index.js';
|
|
|
9
9
|
import { SignalingServer } from './signaling/server.js';
|
|
10
10
|
import { setLogLevel } from './logger.js';
|
|
11
11
|
import { createInterface } from 'node:readline';
|
|
12
|
+
import { mkdirSync } from 'node:fs';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { join } from 'node:path';
|
|
12
15
|
const VERSION = '0.1.0';
|
|
13
16
|
async function main() {
|
|
14
17
|
const args = process.argv.slice(2);
|
|
@@ -114,9 +117,20 @@ async function startNode(args) {
|
|
|
114
117
|
// Keep alive
|
|
115
118
|
await new Promise(() => { });
|
|
116
119
|
}
|
|
120
|
+
function defaultHubKeyPath() {
|
|
121
|
+
const dir = join(homedir(), '.config', 'openagents-nexus');
|
|
122
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
123
|
+
return join(dir, 'hub-key');
|
|
124
|
+
}
|
|
117
125
|
async function startHub(args) {
|
|
118
126
|
const opts = parseArgs(args);
|
|
119
|
-
const
|
|
127
|
+
const rawPort = opts.port;
|
|
128
|
+
const parsedPort = rawPort !== undefined ? parseInt(rawPort, 10) : NaN;
|
|
129
|
+
const port = rawPort === undefined ? 9090 : (Number.isInteger(parsedPort) && parsedPort > 0 && parsedPort < 65536 ? parsedPort : NaN);
|
|
130
|
+
if (isNaN(port)) {
|
|
131
|
+
console.error(`Error: --port must be a valid port number (1-65535), got: ${rawPort}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
120
134
|
if (opts.verbose)
|
|
121
135
|
setLogLevel('debug');
|
|
122
136
|
// Start signaling server
|
|
@@ -128,7 +142,7 @@ async function startHub(args) {
|
|
|
128
142
|
agentType: 'infrastructure',
|
|
129
143
|
role: 'storage',
|
|
130
144
|
signalingServer: `http://localhost:${port}`,
|
|
131
|
-
keyStorePath: opts.key ??
|
|
145
|
+
keyStorePath: opts.key ?? defaultHubKeyPath(),
|
|
132
146
|
});
|
|
133
147
|
await nexus.connect();
|
|
134
148
|
// Update signaling server with network state
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export interface NexusConfig {
|
|
|
12
12
|
enableCircuitRelay?: boolean;
|
|
13
13
|
enablePubsubDiscovery?: boolean;
|
|
14
14
|
enableMdns?: boolean;
|
|
15
|
+
useDnsaddr?: boolean;
|
|
16
|
+
useTcpBootstrap?: boolean;
|
|
15
17
|
datastorePath?: string;
|
|
16
18
|
connectionTimeoutMs: number;
|
|
17
19
|
syncTimeoutMs: number;
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,cAAc,EAAE,EAAE;IAClB,eAAe,EAAE,0BAA0B;IAC3C,IAAI,EAAE,MAAM;IACZ,eAAe,EAAE;QACf,oBAAoB;QACpB,uBAAuB;KACxB;IACD,SAAS,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;IAC5D,SAAS,EAAE,YAAY;IACvB,mBAAmB,EAAE,MAAM;IAC3B,aAAa,EAAE,MAAM;IACrB,oBAAoB,EAAE,EAAE;IACxB,mBAAmB,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,OAA8B;IAC1D,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;AAC3C,CAAC"}
|
package/dist/dht/registry.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* "translation", "summarization") rather than just by peer ID.
|
|
7
7
|
*/
|
|
8
8
|
import { createLogger } from '../logger.js';
|
|
9
|
+
import { validateAgentProfile, validateRoomManifest } from '../security/validators.js';
|
|
9
10
|
const log = createLogger('dht:registry');
|
|
10
11
|
// Key patterns for DHT records
|
|
11
12
|
const KEYS = {
|
|
@@ -43,7 +44,12 @@ export class DHTRegistry {
|
|
|
43
44
|
for await (const event of this.dht.get(key)) {
|
|
44
45
|
if (event.name === 'VALUE') {
|
|
45
46
|
const data = new TextDecoder().decode(event.value);
|
|
46
|
-
|
|
47
|
+
const parsed = validateAgentProfile(JSON.parse(data));
|
|
48
|
+
if (!parsed) {
|
|
49
|
+
log.warn(`Invalid agent profile schema for ${peerId}`);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return parsed;
|
|
47
53
|
}
|
|
48
54
|
}
|
|
49
55
|
}
|
|
@@ -74,7 +80,12 @@ export class DHTRegistry {
|
|
|
74
80
|
for await (const event of this.dht.get(key)) {
|
|
75
81
|
if (event.name === 'VALUE') {
|
|
76
82
|
const data = new TextDecoder().decode(event.value);
|
|
77
|
-
|
|
83
|
+
const parsed = validateRoomManifest(JSON.parse(data));
|
|
84
|
+
if (!parsed) {
|
|
85
|
+
log.warn(`Invalid room manifest schema for ${roomId}`);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return parsed;
|
|
78
89
|
}
|
|
79
90
|
}
|
|
80
91
|
}
|
package/dist/dht/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/dht/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/dht/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/discovery.d.ts
CHANGED
|
@@ -1,43 +1,82 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Multi-layer peer discovery cascade
|
|
2
|
+
* Multi-layer peer discovery cascade with comprehensive free fallbacks
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Agents find each other across the internet with zero configuration.
|
|
5
|
+
* Every discovery method is free, public, and requires no accounts.
|
|
6
6
|
*
|
|
7
|
-
* Discovery levels (
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
7
|
+
* Discovery levels (all active simultaneously, graceful degradation):
|
|
8
|
+
*
|
|
9
|
+
* Level 1: Signaling Server (openagents.nexus)
|
|
10
|
+
* → HTTP fetch for bootstrap peers from the nexus hub
|
|
11
|
+
* → Fails gracefully if hub is down
|
|
12
|
+
*
|
|
13
|
+
* Level 2: Public WebSocket Bootstrap Nodes (Protocol Labs + IPFS)
|
|
14
|
+
* → 15+ well-known nodes across 3 continents
|
|
15
|
+
* → Both /dns4/.../wss and /dnsaddr/ formats for maximum compatibility
|
|
16
|
+
* → These are free public infrastructure maintained by Protocol Labs
|
|
17
|
+
*
|
|
18
|
+
* Level 3: Pubsub Peer Discovery (multiple redundant topics)
|
|
19
|
+
* → 3 discovery topics — if one is congested, others still work
|
|
20
|
+
* → Any nexus agent on ANY topic discovers ALL others
|
|
21
|
+
* → Self-organizing: more agents = more reliable discovery
|
|
22
|
+
*
|
|
23
|
+
* Level 4: mDNS (LAN)
|
|
24
|
+
* → Zero-config local network discovery
|
|
25
|
+
* → Works without internet
|
|
26
|
+
*
|
|
27
|
+
* Level 5: Circuit Relay v2 (NAT traversal)
|
|
28
|
+
* → Agents behind NAT relay through public nodes
|
|
29
|
+
* → Full/storage nodes serve as free relays for the network
|
|
30
|
+
*
|
|
31
|
+
* Level 6: DHT Random Walk
|
|
32
|
+
* → Once connected to ANY peer, DHT walking finds more
|
|
33
|
+
* → Our private /nexus/kad/1.0.0 DHT self-discovers
|
|
13
34
|
*/
|
|
14
35
|
export declare const PUBLIC_BOOTSTRAP_WSS: string[];
|
|
36
|
+
export declare const PUBLIC_BOOTSTRAP_DNSADDR: string[];
|
|
37
|
+
export declare const PUBLIC_BOOTSTRAP_TCP: string[];
|
|
38
|
+
export declare const ALL_PUBLIC_BOOTSTRAP: string[];
|
|
15
39
|
export declare const NEXUS_DISCOVERY_TOPIC = "_nexus._peer-discovery._p2p._pubsub";
|
|
40
|
+
export declare const NEXUS_DISCOVERY_TOPICS: string[];
|
|
16
41
|
export interface DiscoveryConfig {
|
|
17
|
-
/**
|
|
42
|
+
/** Connect to public Protocol Labs bootstrap nodes (free, global) */
|
|
18
43
|
usePublicBootstrap: boolean;
|
|
19
|
-
/**
|
|
44
|
+
/** Enable circuit relay v2 (NAT traversal via free public relays) */
|
|
20
45
|
enableCircuitRelay: boolean;
|
|
21
|
-
/**
|
|
46
|
+
/** Enable pubsub-based peer discovery on all NEXUS_DISCOVERY_TOPICS */
|
|
22
47
|
enablePubsubDiscovery: boolean;
|
|
23
|
-
/**
|
|
48
|
+
/** Enable mDNS (LAN discovery, no internet needed) */
|
|
24
49
|
enableMdns: boolean;
|
|
25
|
-
/**
|
|
50
|
+
/** Use DNS-based bootstrap addresses (more resilient to IP changes) */
|
|
51
|
+
useDnsaddr: boolean;
|
|
52
|
+
/** Use TCP bootstrap nodes (server-to-server, no WSS overhead) */
|
|
53
|
+
useTcpBootstrap: boolean;
|
|
54
|
+
/** Additional user-supplied bootstrap peers */
|
|
26
55
|
customBootstrapPeers: string[];
|
|
56
|
+
/** Pubsub discovery interval in ms (lower = faster discovery, more bandwidth) */
|
|
57
|
+
pubsubDiscoveryIntervalMs: number;
|
|
27
58
|
}
|
|
28
59
|
export declare const DEFAULT_DISCOVERY: DiscoveryConfig;
|
|
29
60
|
/**
|
|
30
|
-
* Merge
|
|
31
|
-
* Does not mutate the defaults.
|
|
61
|
+
* Merge partial discovery config with defaults (does not mutate defaults).
|
|
32
62
|
*/
|
|
33
63
|
export declare function resolveDiscovery(partial?: Partial<DiscoveryConfig>): DiscoveryConfig;
|
|
34
64
|
/**
|
|
35
|
-
* Build the complete bootstrap peer list from all
|
|
36
|
-
*
|
|
65
|
+
* Build the complete bootstrap peer list from all available sources.
|
|
66
|
+
* Sources (in priority order):
|
|
67
|
+
* 1. Signaling server peers (freshest, most relevant)
|
|
37
68
|
* 2. Custom user-supplied peers
|
|
38
|
-
* 3.
|
|
69
|
+
* 3. Public WSS bootstrap nodes (global, free)
|
|
70
|
+
* 4. Public dnsaddr bootstrap nodes (resilient to IP changes)
|
|
71
|
+
* 5. Public TCP bootstrap nodes (server-to-server)
|
|
39
72
|
*
|
|
40
|
-
* Deduplicates
|
|
41
|
-
*
|
|
73
|
+
* Deduplicates by PeerId to avoid connecting to the same node twice
|
|
74
|
+
* even when it appears with different transport multiaddrs.
|
|
42
75
|
*/
|
|
43
76
|
export declare function buildBootstrapList(config: DiscoveryConfig, signalingPeers?: string[]): string[];
|
|
77
|
+
/**
|
|
78
|
+
* Get the list of pubsub discovery topics for this node.
|
|
79
|
+
* Using multiple topics provides redundancy — if one mesh is fragmented,
|
|
80
|
+
* agents can still discover each other through the other topics.
|
|
81
|
+
*/
|
|
82
|
+
export declare function getDiscoveryTopics(): string[];
|
package/dist/discovery.js
CHANGED
|
@@ -1,70 +1,152 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Multi-layer peer discovery cascade
|
|
2
|
+
* Multi-layer peer discovery cascade with comprehensive free fallbacks
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Agents find each other across the internet with zero configuration.
|
|
5
|
+
* Every discovery method is free, public, and requires no accounts.
|
|
6
6
|
*
|
|
7
|
-
* Discovery levels (
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
7
|
+
* Discovery levels (all active simultaneously, graceful degradation):
|
|
8
|
+
*
|
|
9
|
+
* Level 1: Signaling Server (openagents.nexus)
|
|
10
|
+
* → HTTP fetch for bootstrap peers from the nexus hub
|
|
11
|
+
* → Fails gracefully if hub is down
|
|
12
|
+
*
|
|
13
|
+
* Level 2: Public WebSocket Bootstrap Nodes (Protocol Labs + IPFS)
|
|
14
|
+
* → 15+ well-known nodes across 3 continents
|
|
15
|
+
* → Both /dns4/.../wss and /dnsaddr/ formats for maximum compatibility
|
|
16
|
+
* → These are free public infrastructure maintained by Protocol Labs
|
|
17
|
+
*
|
|
18
|
+
* Level 3: Pubsub Peer Discovery (multiple redundant topics)
|
|
19
|
+
* → 3 discovery topics — if one is congested, others still work
|
|
20
|
+
* → Any nexus agent on ANY topic discovers ALL others
|
|
21
|
+
* → Self-organizing: more agents = more reliable discovery
|
|
22
|
+
*
|
|
23
|
+
* Level 4: mDNS (LAN)
|
|
24
|
+
* → Zero-config local network discovery
|
|
25
|
+
* → Works without internet
|
|
26
|
+
*
|
|
27
|
+
* Level 5: Circuit Relay v2 (NAT traversal)
|
|
28
|
+
* → Agents behind NAT relay through public nodes
|
|
29
|
+
* → Full/storage nodes serve as free relays for the network
|
|
30
|
+
*
|
|
31
|
+
* Level 6: DHT Random Walk
|
|
32
|
+
* → Once connected to ANY peer, DHT walking finds more
|
|
33
|
+
* → Our private /nexus/kad/1.0.0 DHT self-discovers
|
|
13
34
|
*/
|
|
14
|
-
//
|
|
15
|
-
//
|
|
35
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
36
|
+
// PUBLIC BOOTSTRAP NODES — Free, maintained by Protocol Labs / IPFS
|
|
37
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
38
|
+
// WebSocket Secure (WSS) bootstrap nodes — work from both Node.js and browsers
|
|
16
39
|
export const PUBLIC_BOOTSTRAP_WSS = [
|
|
40
|
+
// Protocol Labs Amino DHT bootstrappers (WebSocket on port 443)
|
|
17
41
|
'/dns4/am6.bootstrap.libp2p.io/tcp/443/wss/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
|
|
18
42
|
'/dns4/sg1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt',
|
|
19
43
|
'/dns4/sv15.bootstrap.libp2p.io/tcp/443/wss/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
|
|
44
|
+
// Protocol Labs geographic bootstrap nodes (WSS)
|
|
20
45
|
'/dns4/ams-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd',
|
|
21
46
|
'/dns4/sfo-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx',
|
|
22
47
|
'/dns4/lon-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3',
|
|
48
|
+
'/dns4/sfo-2.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z',
|
|
49
|
+
'/dns4/sfo-3.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM',
|
|
50
|
+
'/dns4/sgp-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu',
|
|
23
51
|
'/dns4/nyc-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm',
|
|
52
|
+
'/dns4/nyc-2.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64',
|
|
53
|
+
];
|
|
54
|
+
// DNS-based bootstrap (dnsaddr records — auto-resolve to current IPs)
|
|
55
|
+
// These are more resilient than hardcoded IPs because Protocol Labs can
|
|
56
|
+
// update the underlying addresses without requiring a package update.
|
|
57
|
+
export const PUBLIC_BOOTSTRAP_DNSADDR = [
|
|
58
|
+
'/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
|
|
59
|
+
'/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa',
|
|
60
|
+
'/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
|
|
61
|
+
'/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt',
|
|
62
|
+
];
|
|
63
|
+
// TCP bootstrap nodes (for server-to-server when WSS isn't needed)
|
|
64
|
+
export const PUBLIC_BOOTSTRAP_TCP = [
|
|
65
|
+
'/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',
|
|
24
66
|
];
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
67
|
+
// Combined: all free public bootstrap nodes
|
|
68
|
+
export const ALL_PUBLIC_BOOTSTRAP = [
|
|
69
|
+
...PUBLIC_BOOTSTRAP_WSS,
|
|
70
|
+
...PUBLIC_BOOTSTRAP_DNSADDR,
|
|
71
|
+
...PUBLIC_BOOTSTRAP_TCP,
|
|
72
|
+
];
|
|
73
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
74
|
+
// PUBSUB DISCOVERY TOPICS — Multiple for redundancy
|
|
75
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
76
|
+
// Primary discovery topic — all nexus agents subscribe here
|
|
28
77
|
export const NEXUS_DISCOVERY_TOPIC = '_nexus._peer-discovery._p2p._pubsub';
|
|
78
|
+
// Redundant discovery topics — if one is congested or has issues, others work
|
|
79
|
+
// Using multiple topics ensures agents can always find each other even if
|
|
80
|
+
// some GossipSub meshes are fragmented
|
|
81
|
+
export const NEXUS_DISCOVERY_TOPICS = [
|
|
82
|
+
'_nexus._peer-discovery._p2p._pubsub', // Primary
|
|
83
|
+
'nexus:agents:discovery:v1', // Alternate namespace
|
|
84
|
+
'_open-agents._nexus._discovery', // Fallback
|
|
85
|
+
];
|
|
29
86
|
export const DEFAULT_DISCOVERY = {
|
|
30
87
|
usePublicBootstrap: true,
|
|
31
88
|
enableCircuitRelay: true,
|
|
32
89
|
enablePubsubDiscovery: true,
|
|
33
90
|
enableMdns: true,
|
|
91
|
+
useDnsaddr: true,
|
|
92
|
+
useTcpBootstrap: true,
|
|
34
93
|
customBootstrapPeers: [],
|
|
94
|
+
pubsubDiscoveryIntervalMs: 10_000,
|
|
35
95
|
};
|
|
36
96
|
/**
|
|
37
|
-
* Merge
|
|
38
|
-
* Does not mutate the defaults.
|
|
97
|
+
* Merge partial discovery config with defaults (does not mutate defaults).
|
|
39
98
|
*/
|
|
40
99
|
export function resolveDiscovery(partial) {
|
|
41
100
|
return { ...DEFAULT_DISCOVERY, ...partial };
|
|
42
101
|
}
|
|
43
102
|
/**
|
|
44
|
-
* Build the complete bootstrap peer list from all
|
|
45
|
-
*
|
|
103
|
+
* Build the complete bootstrap peer list from all available sources.
|
|
104
|
+
* Sources (in priority order):
|
|
105
|
+
* 1. Signaling server peers (freshest, most relevant)
|
|
46
106
|
* 2. Custom user-supplied peers
|
|
47
|
-
* 3.
|
|
107
|
+
* 3. Public WSS bootstrap nodes (global, free)
|
|
108
|
+
* 4. Public dnsaddr bootstrap nodes (resilient to IP changes)
|
|
109
|
+
* 5. Public TCP bootstrap nodes (server-to-server)
|
|
48
110
|
*
|
|
49
|
-
* Deduplicates
|
|
50
|
-
*
|
|
111
|
+
* Deduplicates by PeerId to avoid connecting to the same node twice
|
|
112
|
+
* even when it appears with different transport multiaddrs.
|
|
51
113
|
*/
|
|
52
114
|
export function buildBootstrapList(config, signalingPeers = []) {
|
|
53
115
|
const peers = new Set();
|
|
54
|
-
// Signaling server peers
|
|
116
|
+
// 1. Signaling server peers (highest priority)
|
|
55
117
|
for (const peer of signalingPeers) {
|
|
56
118
|
peers.add(peer);
|
|
57
119
|
}
|
|
58
|
-
// Custom
|
|
120
|
+
// 2. Custom peers
|
|
59
121
|
for (const peer of config.customBootstrapPeers) {
|
|
60
122
|
peers.add(peer);
|
|
61
123
|
}
|
|
62
|
-
// Public bootstrap nodes
|
|
124
|
+
// 3. Public WSS bootstrap nodes
|
|
63
125
|
if (config.usePublicBootstrap) {
|
|
64
126
|
for (const peer of PUBLIC_BOOTSTRAP_WSS) {
|
|
65
127
|
peers.add(peer);
|
|
66
128
|
}
|
|
67
129
|
}
|
|
130
|
+
// 4. DNS-based bootstrap (auto-resolving)
|
|
131
|
+
if (config.useDnsaddr) {
|
|
132
|
+
for (const peer of PUBLIC_BOOTSTRAP_DNSADDR) {
|
|
133
|
+
peers.add(peer);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// 5. TCP bootstrap nodes
|
|
137
|
+
if (config.useTcpBootstrap) {
|
|
138
|
+
for (const peer of PUBLIC_BOOTSTRAP_TCP) {
|
|
139
|
+
peers.add(peer);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
68
142
|
return Array.from(peers);
|
|
69
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the list of pubsub discovery topics for this node.
|
|
146
|
+
* Using multiple topics provides redundancy — if one mesh is fragmented,
|
|
147
|
+
* agents can still discover each other through the other topics.
|
|
148
|
+
*/
|
|
149
|
+
export function getDiscoveryTopics() {
|
|
150
|
+
return [...NEXUS_DISCOVERY_TOPICS];
|
|
151
|
+
}
|
|
70
152
|
//# sourceMappingURL=discovery.js.map
|
package/dist/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
import { DHTManager } from './dht/index.js';
|
|
8
8
|
import { StorageManager } from './storage/index.js';
|
|
9
9
|
import type { AgentProfile, RoomInfo, ContributeOptions, AgentRole } from './protocol/types.js';
|
|
10
|
+
import { X402PaymentRail } from './x402/index.js';
|
|
11
|
+
import type { X402Config } from './x402/index.js';
|
|
10
12
|
import { NexusRoom } from './chat/index.js';
|
|
11
13
|
export interface NexusClientOptions {
|
|
12
14
|
privateKey?: Uint8Array;
|
|
@@ -22,6 +24,7 @@ export interface NexusClientOptions {
|
|
|
22
24
|
enableCircuitRelay?: boolean;
|
|
23
25
|
enablePubsubDiscovery?: boolean;
|
|
24
26
|
enableMdns?: boolean;
|
|
27
|
+
x402?: Partial<X402Config>;
|
|
25
28
|
}
|
|
26
29
|
export interface CreateRoomOptions {
|
|
27
30
|
roomId: string;
|
|
@@ -46,7 +49,9 @@ export declare class NexusClient {
|
|
|
46
49
|
private storageManager;
|
|
47
50
|
private _isConnected;
|
|
48
51
|
private listeners;
|
|
52
|
+
private _x402;
|
|
49
53
|
constructor(options?: NexusClientOptions);
|
|
54
|
+
get x402(): X402PaymentRail;
|
|
50
55
|
on<K extends keyof NexusEventMap>(event: K, listener: NexusEventListener<K>): this;
|
|
51
56
|
off<K extends keyof NexusEventMap>(event: K, listener: NexusEventListener<K>): this;
|
|
52
57
|
private emit;
|
|
@@ -81,3 +86,6 @@ export type { NexusConfig } from './config.js';
|
|
|
81
86
|
export type { NexusMessage, AgentProfile, RoomManifest, RoomInfo, ChatPayload, PresencePayload, MetaPayload, CapabilityDefinition, ContributeOptions, MessageType, PresenceStatus, AgentRole, RoomType, ContentFormat, BootstrapResponse, NetworkResponse, } from './protocol/types.js';
|
|
82
87
|
export { PROTOCOL_VERSION, PROTOCOLS, TOPICS, uuidv7, createMessage, encodeMessage, decodeMessage, roomTopic, ephemeralTopic, } from './protocol/index.js';
|
|
83
88
|
export { ContentPropagation } from './storage/index.js';
|
|
89
|
+
export { X402PaymentRail } from './x402/index.js';
|
|
90
|
+
export type { PaymentTerms, PaymentProof, ServiceOffering, X402Config, } from './x402/index.js';
|
|
91
|
+
export { DEFAULT_X402_CONFIG } from './x402/index.js';
|