open-agents-nexus 0.1.0 → 0.2.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/dht/registry.js +13 -2
- package/dist/dht/registry.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/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 +3 -4
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":"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,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,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,sDAAsD;gBACtD,MAAM,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;oBAClD,OAAO;gBACT,CAAC;gBAED,yEAAyE;gBACzE,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU;oBAChC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC;oBAC/C,CAAC,CAAC,EAAE,CAAC;gBAEP,6DAA6D;gBAC7D,IAAI,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/C,IAAI,CAAC,WAAW;yBACb,iBAAiB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC;yBAC1C,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;wBACtB,GAAG,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;oBACvD,CAAC,CAAC,CAAC;gBACP,CAAC;gBAED,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC5B,CAAC;qBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;YACvC,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE5D,oBAAoB;QACpB,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAErC,kBAAkB;QAClB,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAEzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,UAAuB,EAAE;QACnD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;YAC/D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,iBAAiB;QACjB,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACpC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACtC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,2BAA2B;QAC3B,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAEtC,wBAAwB;QACxB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAA8C;QAC1E,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF"}
|
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/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/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';
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,8 @@ import { fetchBootstrapPeers } from './signaling/onboarding.js';
|
|
|
15
15
|
import { resolveDiscovery, buildBootstrapList } from './discovery.js';
|
|
16
16
|
import { createLogger } from './logger.js';
|
|
17
17
|
import { encodeMessage, roomTopic, TOPICS } from './protocol/index.js';
|
|
18
|
+
import { sanitizeName } from './security/validators.js';
|
|
19
|
+
import { X402PaymentRail } from './x402/index.js';
|
|
18
20
|
const log = createLogger('nexus');
|
|
19
21
|
// ---------------------------------------------------------------------------
|
|
20
22
|
// NexusClient
|
|
@@ -28,9 +30,20 @@ export class NexusClient {
|
|
|
28
30
|
storageManager;
|
|
29
31
|
_isConnected = false;
|
|
30
32
|
listeners = new Map();
|
|
33
|
+
_x402 = null;
|
|
31
34
|
constructor(options) {
|
|
32
35
|
this.config = resolveConfig(options);
|
|
33
36
|
this.storageManager = new StorageManager();
|
|
37
|
+
if (options?.x402) {
|
|
38
|
+
this._x402 = new X402PaymentRail(options.x402);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Lazy-initialized x402 payment rail
|
|
42
|
+
get x402() {
|
|
43
|
+
if (!this._x402) {
|
|
44
|
+
this._x402 = new X402PaymentRail();
|
|
45
|
+
}
|
|
46
|
+
return this._x402;
|
|
34
47
|
}
|
|
35
48
|
// --- Event emitter ---
|
|
36
49
|
on(event, listener) {
|
|
@@ -128,9 +141,9 @@ export class NexusClient {
|
|
|
128
141
|
const profile = {
|
|
129
142
|
schema: 'nexus:agent-profile:v1',
|
|
130
143
|
peerId: this.identity.peerId,
|
|
131
|
-
name: this.config.agentName,
|
|
144
|
+
name: sanitizeName(this.config.agentName),
|
|
132
145
|
description: '',
|
|
133
|
-
type: this.config.agentType,
|
|
146
|
+
type: sanitizeName(this.config.agentType, 64),
|
|
134
147
|
capabilities: [],
|
|
135
148
|
role: this.config.role,
|
|
136
149
|
transports: this.node.getMultiaddrs().map((a) => a.toString()),
|
|
@@ -296,4 +309,6 @@ export { createLogger, setLogLevel } from './logger.js';
|
|
|
296
309
|
export { resolveConfig, DEFAULT_CONFIG } from './config.js';
|
|
297
310
|
export { PROTOCOL_VERSION, PROTOCOLS, TOPICS, uuidv7, createMessage, encodeMessage, decodeMessage, roomTopic, ephemeralTopic, } from './protocol/index.js';
|
|
298
311
|
export { ContentPropagation } from './storage/index.js';
|
|
312
|
+
export { X402PaymentRail } from './x402/index.js';
|
|
313
|
+
export { DEFAULT_X402_CONFIG } from './x402/index.js';
|
|
299
314
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol/index.js
CHANGED
|
@@ -43,17 +43,39 @@ export function encodeMessage(msg) {
|
|
|
43
43
|
export function decodeMessage(data) {
|
|
44
44
|
return JSON.parse(new TextDecoder().decode(data));
|
|
45
45
|
}
|
|
46
|
+
// Simple non-cryptographic hash of a Uint8Array — djb2 variant over all bytes.
|
|
47
|
+
// Returns a 32-byte hex string encoded as UTF-8 bytes.
|
|
48
|
+
function hashBytes(data) {
|
|
49
|
+
let h1 = 0x811c9dc5 >>> 0;
|
|
50
|
+
let h2 = 0xdeadbeef >>> 0;
|
|
51
|
+
for (let i = 0; i < data.length; i++) {
|
|
52
|
+
h1 = Math.imul(h1 ^ data[i], 0x01000193) >>> 0;
|
|
53
|
+
h2 = Math.imul(h2 ^ data[i], 0x811c9dc5) >>> 0;
|
|
54
|
+
}
|
|
55
|
+
// Mix in index to make h1 and h2 diverge
|
|
56
|
+
h1 ^= h2;
|
|
57
|
+
h2 ^= h1;
|
|
58
|
+
const hex = (h1 >>> 0).toString(16).padStart(8, '0')
|
|
59
|
+
+ (h2 >>> 0).toString(16).padStart(8, '0')
|
|
60
|
+
+ data.length.toString(16).padStart(8, '0')
|
|
61
|
+
+ (h1 ^ data.length >>> 0).toString(16).padStart(8, '0');
|
|
62
|
+
return new TextEncoder().encode(hex);
|
|
63
|
+
}
|
|
46
64
|
// Message ID function for GossipSub deduplication
|
|
47
65
|
export function msgIdFn(msg) {
|
|
48
|
-
|
|
49
|
-
|
|
66
|
+
// For null data return a random 32-byte ID to avoid collisions between null-data messages
|
|
67
|
+
if (!msg.data) {
|
|
68
|
+
const rand = new Uint8Array(16);
|
|
69
|
+
crypto.getRandomValues(rand);
|
|
70
|
+
return rand;
|
|
71
|
+
}
|
|
50
72
|
try {
|
|
51
73
|
const envelope = JSON.parse(new TextDecoder().decode(msg.data));
|
|
52
74
|
return new TextEncoder().encode(envelope.id);
|
|
53
75
|
}
|
|
54
76
|
catch {
|
|
55
|
-
// fallback:
|
|
56
|
-
return msg.data
|
|
77
|
+
// fallback: hash the full data so different payloads get different IDs
|
|
78
|
+
return hashBytes(msg.data);
|
|
57
79
|
}
|
|
58
80
|
}
|
|
59
81
|
// Topic helpers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,MAAM,GAGP,MAAM,YAAY,CAAC;AAEpB,cAAc,YAAY,CAAC;AAE3B,6CAA6C;AAC7C,yGAAyG;AACzG,MAAM,UAAU,MAAM;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAEjC,kCAAkC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;IAEtB,mBAAmB;IACnB,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,YAAY;IACZ,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,aAAa;IACb,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEpC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,aAAa,CAC3B,IAAiB,EACjB,KAAa,EACb,MAAc,EACd,OAAgC,EAChC,aAAuB,EAAE;IAEzB,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,IAAI;QACJ,EAAE,EAAE,MAAM,EAAE;QACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM;QACN,KAAK;QACL,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,aAAa,CAAC,GAAiB;IAC7C,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,OAAO,CAAC,GAAgC;IACtD,IAAI,CAAC,GAAG,CAAC,IAAI;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { RateLimiter } from './rate-limiter.js';
|
|
2
|
+
export { validateSignalingUrl } from './url-validator.js';
|
|
3
|
+
export { validateAgentProfile, validateRoomManifest, validateNexusMessage, isValidCid, sanitizeName, MAX_NAME_LENGTH, MAX_DESCRIPTION_LENGTH, } from './validators.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RateLimiter } from './rate-limiter.js';
|
|
2
|
+
export { validateSignalingUrl } from './url-validator.js';
|
|
3
|
+
export { validateAgentProfile, validateRoomManifest, validateNexusMessage, isValidCid, sanitizeName, MAX_NAME_LENGTH, MAX_DESCRIPTION_LENGTH, } from './validators.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,GACvB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createLogger } from '../logger.js';
|
|
2
|
+
const log = createLogger('security:rate-limit');
|
|
3
|
+
export class RateLimiter {
|
|
4
|
+
buckets = new Map();
|
|
5
|
+
maxTokens;
|
|
6
|
+
refillRate; // tokens per second
|
|
7
|
+
constructor(maxTokens, refillRatePerSecond) {
|
|
8
|
+
this.maxTokens = maxTokens;
|
|
9
|
+
this.refillRate = refillRatePerSecond;
|
|
10
|
+
}
|
|
11
|
+
// Returns true if the action is allowed, false if rate-limited
|
|
12
|
+
allow(key) {
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
let bucket = this.buckets.get(key);
|
|
15
|
+
if (!bucket) {
|
|
16
|
+
bucket = { tokens: this.maxTokens, lastRefill: now };
|
|
17
|
+
this.buckets.set(key, bucket);
|
|
18
|
+
}
|
|
19
|
+
// Refill tokens based on elapsed time
|
|
20
|
+
const elapsed = (now - bucket.lastRefill) / 1000;
|
|
21
|
+
bucket.tokens = Math.min(this.maxTokens, bucket.tokens + elapsed * this.refillRate);
|
|
22
|
+
bucket.lastRefill = now;
|
|
23
|
+
if (bucket.tokens >= 1) {
|
|
24
|
+
bucket.tokens -= 1;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
log.warn(`Rate limited: ${key}`);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
// Clean up stale buckets (call periodically)
|
|
31
|
+
cleanup(maxAgeMs = 300_000) {
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
for (const [key, bucket] of this.buckets) {
|
|
34
|
+
if (now - bucket.lastRefill > maxAgeMs) {
|
|
35
|
+
this.buckets.delete(key);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/security/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAEhD,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAAkD,CAAC;IACpE,SAAS,CAAS;IAClB,UAAU,CAAS,CAAC,oBAAoB;IAEhD,YAAY,SAAiB,EAAE,mBAA2B;QACxD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC;IACxC,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,GAAW;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,sCAAsC;QACtC,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACjD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACpF,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;QAExB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6CAA6C;IAC7C,OAAO,CAAC,WAAmB,OAAO;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,QAAQ,EAAE,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function validateSignalingUrl(url: string): string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function validateSignalingUrl(url) {
|
|
2
|
+
let parsed;
|
|
3
|
+
try {
|
|
4
|
+
parsed = new URL(url);
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
throw new Error(`Invalid signaling server URL: ${url}`);
|
|
8
|
+
}
|
|
9
|
+
// Only allow http and https
|
|
10
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
11
|
+
throw new Error(`Signaling server must use http or https, got: ${parsed.protocol}`);
|
|
12
|
+
}
|
|
13
|
+
// Block private/internal IPs (basic check on hostname)
|
|
14
|
+
const hostname = parsed.hostname;
|
|
15
|
+
if (isPrivateHost(hostname)) {
|
|
16
|
+
throw new Error(`Signaling server must not point to private/internal addresses: ${hostname}`);
|
|
17
|
+
}
|
|
18
|
+
// Return sanitized base URL (no path, no query, no fragment)
|
|
19
|
+
return `${parsed.protocol}//${parsed.host}`;
|
|
20
|
+
}
|
|
21
|
+
function isPrivateHost(hostname) {
|
|
22
|
+
// Allow localhost explicitly for development
|
|
23
|
+
if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1') {
|
|
24
|
+
return false; // Allow localhost for dev/testing
|
|
25
|
+
}
|
|
26
|
+
// Unwrap IPv6 bracket notation [::1] -> ::1
|
|
27
|
+
const unwrapped = hostname.startsWith('[') && hostname.endsWith(']')
|
|
28
|
+
? hostname.slice(1, -1)
|
|
29
|
+
: hostname;
|
|
30
|
+
// Allow ::1 (IPv6 loopback) unwrapped
|
|
31
|
+
if (unwrapped === '::1') {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
// Block internal ranges
|
|
35
|
+
const parts = hostname.split('.').map(Number);
|
|
36
|
+
if (parts.length === 4 && parts.every(n => !isNaN(n))) {
|
|
37
|
+
if (parts[0] === 10)
|
|
38
|
+
return true;
|
|
39
|
+
if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
|
|
40
|
+
return true;
|
|
41
|
+
if (parts[0] === 192 && parts[1] === 168)
|
|
42
|
+
return true;
|
|
43
|
+
if (parts[0] === 169 && parts[1] === 254)
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=url-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-validator.js","sourceRoot":"","sources":["../../src/security/url-validator.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,uDAAuD;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,kEAAkE,QAAQ,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,6DAA6D;IAC7D,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC,CAAC,kCAAkC;IAClD,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,QAAQ,CAAC;IAEb,sCAAsC;IACtC,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QACtE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACtD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentProfile, RoomManifest, NexusMessage } from '../protocol/types.js';
|
|
2
|
+
declare const MAX_NAME_LENGTH = 64;
|
|
3
|
+
declare const MAX_DESCRIPTION_LENGTH = 512;
|
|
4
|
+
export declare function validateAgentProfile(data: unknown): AgentProfile | null;
|
|
5
|
+
export declare function validateRoomManifest(data: unknown): RoomManifest | null;
|
|
6
|
+
export declare function validateNexusMessage(data: unknown): NexusMessage | null;
|
|
7
|
+
export declare function isValidCid(cid: string): boolean;
|
|
8
|
+
export declare function sanitizeName(name: string, maxLength?: number): string;
|
|
9
|
+
export { MAX_NAME_LENGTH, MAX_DESCRIPTION_LENGTH };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const MAX_NAME_LENGTH = 64;
|
|
2
|
+
const MAX_DESCRIPTION_LENGTH = 512;
|
|
3
|
+
const MAX_CAPABILITY_COUNT = 32;
|
|
4
|
+
const MAX_TRANSPORT_COUNT = 16;
|
|
5
|
+
export function validateAgentProfile(data) {
|
|
6
|
+
if (!data || typeof data !== 'object')
|
|
7
|
+
return null;
|
|
8
|
+
const obj = data;
|
|
9
|
+
if (obj.schema !== 'nexus:agent-profile:v1')
|
|
10
|
+
return null;
|
|
11
|
+
if (typeof obj.peerId !== 'string' || obj.peerId.length === 0 || obj.peerId.length > 128)
|
|
12
|
+
return null;
|
|
13
|
+
if (typeof obj.name !== 'string' || obj.name.length > MAX_NAME_LENGTH)
|
|
14
|
+
return null;
|
|
15
|
+
if (typeof obj.role !== 'string')
|
|
16
|
+
return null;
|
|
17
|
+
if (!['light', 'full', 'storage'].includes(obj.role))
|
|
18
|
+
return null;
|
|
19
|
+
if (!Array.isArray(obj.capabilities) || obj.capabilities.length > MAX_CAPABILITY_COUNT)
|
|
20
|
+
return null;
|
|
21
|
+
if (!Array.isArray(obj.transports) || obj.transports.length > MAX_TRANSPORT_COUNT)
|
|
22
|
+
return null;
|
|
23
|
+
if (typeof obj.createdAt !== 'number')
|
|
24
|
+
return null;
|
|
25
|
+
if (typeof obj.updatedAt !== 'number')
|
|
26
|
+
return null;
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
export function validateRoomManifest(data) {
|
|
30
|
+
if (!data || typeof data !== 'object')
|
|
31
|
+
return null;
|
|
32
|
+
const obj = data;
|
|
33
|
+
if (obj.schema !== 'nexus:room-manifest:v1')
|
|
34
|
+
return null;
|
|
35
|
+
if (typeof obj.roomId !== 'string' || obj.roomId.length === 0 || obj.roomId.length > 64)
|
|
36
|
+
return null;
|
|
37
|
+
if (typeof obj.name !== 'string' || obj.name.length > MAX_NAME_LENGTH)
|
|
38
|
+
return null;
|
|
39
|
+
if (typeof obj.topic !== 'string')
|
|
40
|
+
return null;
|
|
41
|
+
if (!['persistent', 'ephemeral'].includes(obj.type))
|
|
42
|
+
return null;
|
|
43
|
+
if (typeof obj.createdAt !== 'number')
|
|
44
|
+
return null;
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
export function validateNexusMessage(data) {
|
|
48
|
+
if (!data || typeof data !== 'object')
|
|
49
|
+
return null;
|
|
50
|
+
const obj = data;
|
|
51
|
+
if (obj.version !== 1)
|
|
52
|
+
return null;
|
|
53
|
+
if (typeof obj.type !== 'string')
|
|
54
|
+
return null;
|
|
55
|
+
if (!['chat', 'presence', 'meta', 'capability', 'sync'].includes(obj.type))
|
|
56
|
+
return null;
|
|
57
|
+
if (typeof obj.id !== 'string' || obj.id.length === 0 || obj.id.length > 64)
|
|
58
|
+
return null;
|
|
59
|
+
if (typeof obj.timestamp !== 'number')
|
|
60
|
+
return null;
|
|
61
|
+
if (typeof obj.sender !== 'string' || obj.sender.length === 0 || obj.sender.length > 128)
|
|
62
|
+
return null;
|
|
63
|
+
if (typeof obj.topic !== 'string')
|
|
64
|
+
return null;
|
|
65
|
+
if (!obj.payload || typeof obj.payload !== 'object')
|
|
66
|
+
return null;
|
|
67
|
+
// Validate references array
|
|
68
|
+
if (obj.references !== undefined) {
|
|
69
|
+
if (!Array.isArray(obj.references))
|
|
70
|
+
return null;
|
|
71
|
+
if (obj.references.length > 8)
|
|
72
|
+
return null; // MAX_REFS_PER_MESSAGE
|
|
73
|
+
for (const ref of obj.references) {
|
|
74
|
+
if (typeof ref !== 'string' || ref.length === 0 || ref.length > 128)
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
// Validate a CID string format (basic check, not cryptographic verification)
|
|
81
|
+
export function isValidCid(cid) {
|
|
82
|
+
if (typeof cid !== 'string')
|
|
83
|
+
return false;
|
|
84
|
+
if (cid.length === 0 || cid.length > 128)
|
|
85
|
+
return false;
|
|
86
|
+
// CIDv0 starts with Qm, CIDv1 starts with baf or z
|
|
87
|
+
return cid.startsWith('Qm') || cid.startsWith('baf') || cid.startsWith('b') || cid.startsWith('z');
|
|
88
|
+
}
|
|
89
|
+
// Sanitize a name string for safe use
|
|
90
|
+
export function sanitizeName(name, maxLength = MAX_NAME_LENGTH) {
|
|
91
|
+
return name.replace(/[^\w\s\-_.]/g, '').slice(0, maxLength).trim() || 'unnamed';
|
|
92
|
+
}
|
|
93
|
+
// Re-export used constants for consumers
|
|
94
|
+
export { MAX_NAME_LENGTH, MAX_DESCRIPTION_LENGTH };
|
|
95
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/security/validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,10 +7,30 @@
|
|
|
7
7
|
* - Peer discovery and initial connections
|
|
8
8
|
*/
|
|
9
9
|
import { createLogger } from '../logger.js';
|
|
10
|
+
import { validateSignalingUrl } from '../security/url-validator.js';
|
|
10
11
|
const log = createLogger('onboarding');
|
|
11
12
|
// Client-side onboarding: fetch bootstrap info from signaling server
|
|
12
13
|
export async function fetchBootstrapPeers(signalingServer) {
|
|
13
|
-
|
|
14
|
+
// Validate and sanitize the server URL before making any network request.
|
|
15
|
+
// This prevents SSRF by rejecting non-http/https protocols and private IPs,
|
|
16
|
+
// and strips any user-supplied path (only /api/v1/bootstrap is ever fetched).
|
|
17
|
+
let baseUrl;
|
|
18
|
+
try {
|
|
19
|
+
baseUrl = validateSignalingUrl(signalingServer);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
log.warn(`Invalid signaling server URL: ${err}`);
|
|
23
|
+
return {
|
|
24
|
+
peers: [],
|
|
25
|
+
network: {
|
|
26
|
+
peerCount: 0,
|
|
27
|
+
roomCount: 0,
|
|
28
|
+
protocolVersion: 1,
|
|
29
|
+
minClientVersion: '0.1.0',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const url = `${baseUrl}/api/v1/bootstrap`;
|
|
14
34
|
log.info(`Fetching bootstrap peers from ${url}`);
|
|
15
35
|
try {
|
|
16
36
|
const response = await fetch(url, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/signaling/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/signaling/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAEvC,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,eAAuB;IAC/D,0EAA0E;IAC1E,4EAA4E;IAC5E,8EAA8E;IAC9E,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;QACjD,OAAO;YACL,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACP,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;gBACZ,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,OAAO;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,OAAO,mBAAmB,CAAC;IAC1C,GAAG,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAuB,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;QACpD,8EAA8E;QAC9E,OAAO;YACL,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACP,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;gBACZ,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,OAAO;aAC1B;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/signaling/server.js
CHANGED
|
@@ -57,6 +57,10 @@ export class SignalingServer {
|
|
|
57
57
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
58
58
|
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
|
|
59
59
|
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
60
|
+
// Security headers — applied to every response
|
|
61
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
62
|
+
res.setHeader('X-Frame-Options', 'DENY');
|
|
63
|
+
res.setHeader('Referrer-Policy', 'no-referrer');
|
|
60
64
|
if (req.method === 'OPTIONS') {
|
|
61
65
|
res.writeHead(204);
|
|
62
66
|
res.end();
|
|
@@ -129,7 +133,10 @@ export class SignalingServer {
|
|
|
129
133
|
].join('\n'));
|
|
130
134
|
}
|
|
131
135
|
sendJSON(res, data) {
|
|
132
|
-
res.writeHead(200, {
|
|
136
|
+
res.writeHead(200, {
|
|
137
|
+
'Content-Type': 'application/json',
|
|
138
|
+
'Cache-Control': 'no-store',
|
|
139
|
+
});
|
|
133
140
|
res.end(JSON.stringify(data));
|
|
134
141
|
}
|
|
135
142
|
send404(res) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/signaling/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAOtC,MAAM,OAAO,eAAe;IAClB,MAAM,GAAkB,IAAI,CAAC;IAC7B,IAAI,CAAS;IACb,IAAI,CAAS;IAErB,8CAA8C;IACtC,cAAc,GAAa,EAAE,CAAC;IAC9B,UAAU,GAAe,EAAE,CAAC;IAC5B,SAAS,GAAG,CAAC,CAAC;IACd,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE/B,YAAY,OAA+B;QACzC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAEvE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBAC5C,GAAG,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpE,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBACrB,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;oBACrC,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,WAAW,CAAC,KAIX;QACC,IAAI,KAAK,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QACrE,IAAI,KAAK,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACzD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACtE,CAAC;IAEO,aAAa,CAAC,GAAoB,EAAE,GAAmB;QAC7D,eAAe;QACf,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAC9D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QAEjF,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;YACrB,KAAK,mBAAmB;gBACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,iBAAiB;gBACpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM;YACR,KAAK,eAAe;gBAClB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,GAAG;gBACN,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM;YACR;gBACE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClB,MAAM;QACV,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,GAAmB;QACzC,MAAM,QAAQ,GAAsB;YAClC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,eAAe;YACxD,OAAO,EAAE;gBACP,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBACjC,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,OAAO;aAC1B;SACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAEO,aAAa,CAAC,GAAmB;QACvC,MAAM,QAAQ,GAAoB;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YACjC,WAAW,EAAE,CAAC;YACd,gBAAgB,EAAE,CAAC;YACnB,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACxD,KAAK,EAAE,IAAI,CAAC,UAAU;SACvB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAEO,WAAW,CAAC,GAAmB;QACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACjD,CAAC;IAEO,aAAa,CAAC,GAAmB;QACvC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;QACrD,GAAG,CAAC,GAAG,CAAC;YACN,kBAAkB;YAClB,kBAAkB;YAClB,EAAE;YACF,6CAA6C;YAC7C,4DAA4D;YAC5D,EAAE;YACF,gBAAgB;YAChB,gDAAgD;YAChD,+CAA+C;YAC/C,4CAA4C;YAC5C,EAAE;YACF,cAAc;YACd,wCAAwC;YACxC,EAAE;YACF,6CAA6C;SAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,GAAmB,EAAE,IAAa;QACjD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/signaling/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* This creates organic growth in content redundancy: popular content gets pinned
|
|
7
7
|
* by more agents proportional to how widely it is shared.
|
|
8
8
|
*/
|
|
9
|
+
export declare const MAX_REFS_PER_MESSAGE = 8;
|
|
10
|
+
export declare const MAX_PINNED_CIDS = 10000;
|
|
11
|
+
export declare const MAX_TRACKED_CIDS = 50000;
|
|
9
12
|
export interface PropagationStats {
|
|
10
13
|
totalPinned: number;
|
|
11
14
|
pinnedFromOthers: number;
|
|
@@ -17,6 +20,7 @@ export declare class ContentPropagation {
|
|
|
17
20
|
private cidSources;
|
|
18
21
|
private autopinEnabled;
|
|
19
22
|
private pinCallback;
|
|
23
|
+
private senderPinCounts;
|
|
20
24
|
constructor();
|
|
21
25
|
setPinCallback(cb: (cid: string) => Promise<void>): void;
|
|
22
26
|
setAutopin(enabled: boolean): void;
|
|
@@ -29,4 +33,6 @@ export declare class ContentPropagation {
|
|
|
29
33
|
trackedCids: number;
|
|
30
34
|
};
|
|
31
35
|
getLocalPins(): string[];
|
|
36
|
+
private _trackSource;
|
|
37
|
+
private _checkSenderRateLimit;
|
|
32
38
|
}
|
|
@@ -7,12 +7,21 @@
|
|
|
7
7
|
* by more agents proportional to how widely it is shared.
|
|
8
8
|
*/
|
|
9
9
|
import { createLogger } from '../logger.js';
|
|
10
|
+
import { isValidCid } from '../security/validators.js';
|
|
10
11
|
const log = createLogger('storage:propagation');
|
|
12
|
+
// Security bounds — prevent unbounded memory growth and viral amplification attacks
|
|
13
|
+
export const MAX_REFS_PER_MESSAGE = 8;
|
|
14
|
+
export const MAX_PINNED_CIDS = 10_000;
|
|
15
|
+
export const MAX_TRACKED_CIDS = 50_000;
|
|
16
|
+
/** Max pin-trigger events per sender per minute */
|
|
17
|
+
const MAX_PIN_TRIGGERS_PER_MINUTE = 10;
|
|
11
18
|
export class ContentPropagation {
|
|
12
19
|
localPins = new Set();
|
|
13
20
|
cidSources = new Map(); // CID -> set of peerIds that have it
|
|
14
21
|
autopinEnabled = true;
|
|
15
22
|
pinCallback = null;
|
|
23
|
+
// Per-sender rate limiting: tracks pin-trigger counts in the current minute window
|
|
24
|
+
senderPinCounts = new Map();
|
|
16
25
|
constructor() { }
|
|
17
26
|
// Set the callback that actually pins content (connected to StorageManager)
|
|
18
27
|
setPinCallback(cb) {
|
|
@@ -26,26 +35,43 @@ export class ContentPropagation {
|
|
|
26
35
|
// Called when we receive a message that references CIDs.
|
|
27
36
|
// This is the viral mechanism: seeing content = pinning content.
|
|
28
37
|
async onContentReceived(cids, sourcePeerId) {
|
|
38
|
+
// Clamp the number of references to guard against amplification
|
|
39
|
+
const clampedCids = cids.slice(0, MAX_REFS_PER_MESSAGE);
|
|
40
|
+
// Validate each CID format; skip invalid ones
|
|
41
|
+
const validCids = clampedCids.filter(cid => {
|
|
42
|
+
if (!isValidCid(cid)) {
|
|
43
|
+
log.warn(`Skipping invalid CID from ${sourcePeerId.slice(0, 12)}...: ${cid}`);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
});
|
|
29
48
|
if (!this.autopinEnabled || !this.pinCallback) {
|
|
30
49
|
// Even when disabled, track sources so we know what is popular
|
|
31
|
-
if (
|
|
32
|
-
for (const cid of
|
|
33
|
-
|
|
34
|
-
this.cidSources.set(cid, new Set());
|
|
35
|
-
}
|
|
36
|
-
this.cidSources.get(cid).add(sourcePeerId);
|
|
50
|
+
if (validCids.length > 0) {
|
|
51
|
+
for (const cid of validCids) {
|
|
52
|
+
this._trackSource(cid, sourcePeerId);
|
|
37
53
|
}
|
|
38
54
|
}
|
|
39
55
|
return;
|
|
40
56
|
}
|
|
41
|
-
|
|
57
|
+
// Per-sender rate limit: max MAX_PIN_TRIGGERS_PER_MINUTE triggers per minute
|
|
58
|
+
if (!this._checkSenderRateLimit(sourcePeerId)) {
|
|
59
|
+
log.warn(`Rate limiting pin triggers from ${sourcePeerId.slice(0, 12)}...`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const cid of validCids) {
|
|
42
63
|
// Track who has this content
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
this.cidSources.get(cid).add(sourcePeerId);
|
|
47
|
-
// Auto-pin if we haven't already
|
|
64
|
+
this._trackSource(cid, sourcePeerId);
|
|
65
|
+
// Auto-pin if we haven't already and within bounds
|
|
48
66
|
if (!this.localPins.has(cid)) {
|
|
67
|
+
if (this.localPins.size >= MAX_PINNED_CIDS) {
|
|
68
|
+
// LRU eviction: remove the first (oldest) entry
|
|
69
|
+
const oldest = this.localPins.values().next().value;
|
|
70
|
+
if (oldest !== undefined) {
|
|
71
|
+
this.localPins.delete(oldest);
|
|
72
|
+
log.debug(`LRU evicted pin: ${oldest}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
49
75
|
try {
|
|
50
76
|
await this.pinCallback(cid);
|
|
51
77
|
this.localPins.add(cid);
|
|
@@ -85,5 +111,29 @@ export class ContentPropagation {
|
|
|
85
111
|
getLocalPins() {
|
|
86
112
|
return Array.from(this.localPins);
|
|
87
113
|
}
|
|
114
|
+
// ---- Private helpers ----
|
|
115
|
+
_trackSource(cid, sourcePeerId) {
|
|
116
|
+
if (this.cidSources.size >= MAX_TRACKED_CIDS && !this.cidSources.has(cid)) {
|
|
117
|
+
// Cap the tracked CIDs map to avoid unbounded memory growth
|
|
118
|
+
log.warn(`MAX_TRACKED_CIDS (${MAX_TRACKED_CIDS}) reached; dropping source tracking for ${cid}`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (!this.cidSources.has(cid)) {
|
|
122
|
+
this.cidSources.set(cid, new Set());
|
|
123
|
+
}
|
|
124
|
+
this.cidSources.get(cid).add(sourcePeerId);
|
|
125
|
+
}
|
|
126
|
+
_checkSenderRateLimit(peerId) {
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
const windowMs = 60_000; // 1 minute
|
|
129
|
+
let entry = this.senderPinCounts.get(peerId);
|
|
130
|
+
if (!entry || now - entry.windowStart >= windowMs) {
|
|
131
|
+
// Start a new window
|
|
132
|
+
entry = { count: 0, windowStart: now };
|
|
133
|
+
this.senderPinCounts.set(peerId, entry);
|
|
134
|
+
}
|
|
135
|
+
entry.count++;
|
|
136
|
+
return entry.count <= MAX_PIN_TRIGGERS_PER_MINUTE;
|
|
137
|
+
}
|
|
88
138
|
}
|
|
89
139
|
//# sourceMappingURL=propagation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propagation.js","sourceRoot":"","sources":["../../src/storage/propagation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"propagation.js","sourceRoot":"","sources":["../../src/storage/propagation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Payment Rail for Agent-to-Agent Micropayments
|
|
3
|
+
*
|
|
4
|
+
* Enables agents to offer and consume paid services (like inference)
|
|
5
|
+
* using the x402 protocol (HTTP 402 Payment Required).
|
|
6
|
+
*
|
|
7
|
+
* SECURITY WARNINGS:
|
|
8
|
+
* ==================
|
|
9
|
+
* - NEVER share wallet private keys over the network
|
|
10
|
+
* - NEVER accept wallet keys from remote peers
|
|
11
|
+
* - NEVER process inference requests that ask for key material
|
|
12
|
+
* - ALWAYS validate payment proofs before performing work
|
|
13
|
+
* - ALWAYS set a max payment cap to prevent drainage
|
|
14
|
+
* - Non-sensitive tasks ONLY — never process PII through paid services
|
|
15
|
+
*/
|
|
16
|
+
import type { PaymentTerms, PaymentProof, ServiceOffering, X402Config } from './types.js';
|
|
17
|
+
export declare class X402PaymentRail {
|
|
18
|
+
private config;
|
|
19
|
+
private offerings;
|
|
20
|
+
private bannerShown;
|
|
21
|
+
constructor(config?: Partial<X402Config>);
|
|
22
|
+
private showBanner;
|
|
23
|
+
get isEnabled(): boolean;
|
|
24
|
+
registerService(offering: ServiceOffering): void;
|
|
25
|
+
createPaymentTerms(serviceId: string): PaymentTerms | null;
|
|
26
|
+
validatePayment(proof: PaymentProof, terms: PaymentTerms): Promise<boolean>;
|
|
27
|
+
isWithinCap(amount: string, currency: string): boolean;
|
|
28
|
+
getServices(): ServiceOffering[];
|
|
29
|
+
static containsKeyMaterial(input: string): boolean;
|
|
30
|
+
}
|
|
31
|
+
export type { PaymentTerms, PaymentProof, ServiceOffering, X402Config } from './types.js';
|
|
32
|
+
export { DEFAULT_X402_CONFIG } from './types.js';
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Payment Rail for Agent-to-Agent Micropayments
|
|
3
|
+
*
|
|
4
|
+
* Enables agents to offer and consume paid services (like inference)
|
|
5
|
+
* using the x402 protocol (HTTP 402 Payment Required).
|
|
6
|
+
*
|
|
7
|
+
* SECURITY WARNINGS:
|
|
8
|
+
* ==================
|
|
9
|
+
* - NEVER share wallet private keys over the network
|
|
10
|
+
* - NEVER accept wallet keys from remote peers
|
|
11
|
+
* - NEVER process inference requests that ask for key material
|
|
12
|
+
* - ALWAYS validate payment proofs before performing work
|
|
13
|
+
* - ALWAYS set a max payment cap to prevent drainage
|
|
14
|
+
* - Non-sensitive tasks ONLY — never process PII through paid services
|
|
15
|
+
*/
|
|
16
|
+
import { createLogger } from '../logger.js';
|
|
17
|
+
import { DEFAULT_X402_CONFIG } from './types.js';
|
|
18
|
+
const log = createLogger('x402');
|
|
19
|
+
// SAFETY WARNING — displayed on first use
|
|
20
|
+
const SAFETY_BANNER = `
|
|
21
|
+
+--------------------------------------------------------------+
|
|
22
|
+
| x402 PAYMENT RAIL -- SAFETY NOTICE |
|
|
23
|
+
| |
|
|
24
|
+
| NEVER share wallet private keys over the network |
|
|
25
|
+
| NEVER accept wallet keys from remote peers |
|
|
26
|
+
| NEVER send API keys, model creds, or secrets |
|
|
27
|
+
| NEVER process requests for key material via paid services |
|
|
28
|
+
| ALWAYS validate payment before performing work |
|
|
29
|
+
| Non-sensitive tasks ONLY |
|
|
30
|
+
+--------------------------------------------------------------+
|
|
31
|
+
`;
|
|
32
|
+
export class X402PaymentRail {
|
|
33
|
+
config;
|
|
34
|
+
offerings = new Map();
|
|
35
|
+
bannerShown = false;
|
|
36
|
+
constructor(config) {
|
|
37
|
+
this.config = { ...DEFAULT_X402_CONFIG, ...config };
|
|
38
|
+
}
|
|
39
|
+
// Show safety banner on first use
|
|
40
|
+
showBanner() {
|
|
41
|
+
if (!this.bannerShown) {
|
|
42
|
+
log.warn(SAFETY_BANNER);
|
|
43
|
+
this.bannerShown = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Check if x402 is enabled
|
|
47
|
+
get isEnabled() {
|
|
48
|
+
return this.config.enabled;
|
|
49
|
+
}
|
|
50
|
+
// Register a service offering (as a provider)
|
|
51
|
+
registerService(offering) {
|
|
52
|
+
this.showBanner();
|
|
53
|
+
if (offering.sensitive) {
|
|
54
|
+
log.warn(`Service "${offering.name}" is marked as sensitive — ensure no key material is processed`);
|
|
55
|
+
}
|
|
56
|
+
this.offerings.set(offering.serviceId, offering);
|
|
57
|
+
log.info(`Registered service: ${offering.name} (${offering.price.amount} ${offering.price.currency})`);
|
|
58
|
+
}
|
|
59
|
+
// Generate 402 payment terms for a service request
|
|
60
|
+
createPaymentTerms(serviceId) {
|
|
61
|
+
const offering = this.offerings.get(serviceId);
|
|
62
|
+
if (!offering)
|
|
63
|
+
return null;
|
|
64
|
+
if (!this.config.walletAddress) {
|
|
65
|
+
log.error('Cannot create payment terms: no wallet address configured');
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
...offering.price,
|
|
70
|
+
recipient: this.config.walletAddress,
|
|
71
|
+
expiresAt: Date.now() + 300_000, // 5 minute expiry
|
|
72
|
+
requestId: crypto.randomUUID(),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Validate a payment proof (STUB — real implementation needs on-chain verification)
|
|
76
|
+
async validatePayment(proof, terms) {
|
|
77
|
+
this.showBanner();
|
|
78
|
+
// Basic structural validation
|
|
79
|
+
if (!proof.signature || typeof proof.signature !== 'string') {
|
|
80
|
+
log.warn('Invalid payment proof: missing signature');
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (proof.payment.requestId !== terms.requestId) {
|
|
84
|
+
log.warn('Payment proof requestId mismatch');
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
if (proof.payment.amount !== terms.amount) {
|
|
88
|
+
log.warn('Payment proof amount mismatch');
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (Date.now() > terms.expiresAt) {
|
|
92
|
+
log.warn('Payment terms expired');
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
// TODO: Real implementation needs:
|
|
96
|
+
// 1. EIP-712 signature verification
|
|
97
|
+
// 2. On-chain balance check
|
|
98
|
+
// 3. Nonce validation to prevent replay
|
|
99
|
+
// 4. Integration with Coinbase CDP facilitator or direct chain verification
|
|
100
|
+
log.info(`Payment validation stub: would verify ${proof.payment.amount} ${terms.currency} from ${proof.payment.payer}`);
|
|
101
|
+
return true; // STUB — always passes structural validation for now
|
|
102
|
+
}
|
|
103
|
+
// Check if a payment amount is within our safety cap
|
|
104
|
+
isWithinCap(amount, currency) {
|
|
105
|
+
if (!this.config.maxPaymentPerRequest)
|
|
106
|
+
return true;
|
|
107
|
+
try {
|
|
108
|
+
const requested = BigInt(amount);
|
|
109
|
+
const cap = BigInt(this.config.maxPaymentPerRequest);
|
|
110
|
+
if (requested > cap) {
|
|
111
|
+
log.warn(`Payment ${amount} ${currency} exceeds cap ${this.config.maxPaymentPerRequest}`);
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// List registered services
|
|
121
|
+
getServices() {
|
|
122
|
+
return Array.from(this.offerings.values());
|
|
123
|
+
}
|
|
124
|
+
// SAFETY: Check if a request payload contains potential key material
|
|
125
|
+
static containsKeyMaterial(input) {
|
|
126
|
+
const patterns = [
|
|
127
|
+
/-----BEGIN.*PRIVATE KEY-----/i,
|
|
128
|
+
/-----BEGIN.*KEY-----/i,
|
|
129
|
+
/sk[-_][a-zA-Z0-9_\-]{20,}/, // Common API key prefixes
|
|
130
|
+
/0x[a-fA-F0-9]{64}/, // Ethereum private key
|
|
131
|
+
/[a-zA-Z0-9]{32,}secret/i, // Generic secret patterns
|
|
132
|
+
/api[_-]?key\s*[:=]\s*\S+/i, // API key assignments
|
|
133
|
+
/bearer\s+[a-zA-Z0-9._\-]{20,}/i, // Bearer tokens
|
|
134
|
+
/password\s*[:=]\s*\S+/i, // Password assignments
|
|
135
|
+
];
|
|
136
|
+
return patterns.some(p => p.test(input));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export { DEFAULT_X402_CONFIG } from './types.js';
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/x402/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Payment Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Based on the x402 open standard (https://x402.org)
|
|
5
|
+
* HTTP 402 Payment Required for agent-to-agent micropayments
|
|
6
|
+
*/
|
|
7
|
+
export interface PaymentTerms {
|
|
8
|
+
amount: string;
|
|
9
|
+
currency: 'USDC' | 'ETH' | 'BASE_ETH';
|
|
10
|
+
network: 'base' | 'ethereum' | 'polygon' | 'solana';
|
|
11
|
+
recipient: string;
|
|
12
|
+
description: string;
|
|
13
|
+
expiresAt: number;
|
|
14
|
+
requestId: string;
|
|
15
|
+
}
|
|
16
|
+
export interface PaymentProof {
|
|
17
|
+
signature: string;
|
|
18
|
+
payment: {
|
|
19
|
+
requestId: string;
|
|
20
|
+
amount: string;
|
|
21
|
+
currency: string;
|
|
22
|
+
network: string;
|
|
23
|
+
recipient: string;
|
|
24
|
+
payer: string;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface ServiceOffering {
|
|
29
|
+
serviceId: string;
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
price: PaymentTerms;
|
|
33
|
+
rateLimit: number;
|
|
34
|
+
sensitive: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface X402Config {
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
walletAddress?: string;
|
|
39
|
+
maxPaymentPerRequest?: string;
|
|
40
|
+
allowedCurrencies: string[];
|
|
41
|
+
allowedNetworks: string[];
|
|
42
|
+
}
|
|
43
|
+
export declare const DEFAULT_X402_CONFIG: X402Config;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Payment Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Based on the x402 open standard (https://x402.org)
|
|
5
|
+
* HTTP 402 Payment Required for agent-to-agent micropayments
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_X402_CONFIG = {
|
|
8
|
+
enabled: false,
|
|
9
|
+
walletAddress: undefined,
|
|
10
|
+
maxPaymentPerRequest: '1000000', // $1 USDC (6 decimals)
|
|
11
|
+
allowedCurrencies: ['USDC'],
|
|
12
|
+
allowedNetworks: ['base'],
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/x402/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkEH,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,SAAS;IACxB,oBAAoB,EAAE,SAAS,EAAE,uBAAuB;IACxD,iBAAiB,EAAE,CAAC,MAAM,CAAC;IAC3B,eAAe,EAAE,CAAC,MAAM,CAAC;CAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "open-agents-nexus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Zero-config decentralized agent-to-agent communication. Agents npm install, connect, and talk — no servers, no accounts, no surveillance. Built on libp2p + IPFS with encrypted P2P mesh networking, viral content pinning, and automatic peer discovery.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
|
-
"nexus": "
|
|
10
|
-
"open-agents-nexus": "
|
|
9
|
+
"nexus": "dist/cli.js",
|
|
10
|
+
"open-agents-nexus": "dist/cli.js"
|
|
11
11
|
},
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
@@ -108,7 +108,6 @@
|
|
|
108
108
|
"@libp2p/mdns": "^12.0.14",
|
|
109
109
|
"@libp2p/pubsub-peer-discovery": "^12.0.0",
|
|
110
110
|
"@libp2p/tcp": "^11.0.13",
|
|
111
|
-
"@libp2p/webrtc": "^6.0.14",
|
|
112
111
|
"@libp2p/websockets": "^10.1.6",
|
|
113
112
|
"helia": "^6.0.21",
|
|
114
113
|
"libp2p": "^3.1.6"
|