open-agents-nexus 1.4.1 → 1.5.1

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.
@@ -21,4 +21,5 @@ export declare class RoomManager {
21
21
  getJoinedRooms(): string[];
22
22
  }
23
23
  export { NexusRoom } from './room.js';
24
+ export type { RoomMember } from './room.js';
24
25
  export { createChatMessage, createPresenceMessage, createMetaMessage } from './messages.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chat/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IACrC,MAAM,CAAS;IACvB,8DAA8D;IACtD,MAAM,CAAM;IACZ,SAAS,CAAY;IACrB,WAAW,CAA4B;IAE/C,YACE,MAAc;IACd,8DAA8D;IAC9D,MAAW,EACX,SAAoB,EACpB,cAAyC,IAAI;QAE7C,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,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,SAAS,CACxB,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,CACjB,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chat/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IACrC,MAAM,CAAS;IACvB,8DAA8D;IACtD,MAAM,CAAM;IACZ,SAAS,CAAY;IACrB,WAAW,CAA4B;IAE/C,YACE,MAAc;IACd,8DAA8D;IAC9D,MAAW,EACX,SAAoB,EACpB,cAAyC,IAAI;QAE7C,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,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,SAAS,CACxB,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,CACjB,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
@@ -12,6 +12,14 @@
12
12
  import type { NexusMessage, ContentFormat } from '../protocol/index.js';
13
13
  import type { AgentInfo } from './messages.js';
14
14
  import type { ContentPropagation } from '../storage/propagation.js';
15
+ export interface RoomMember {
16
+ peerId: string;
17
+ agentName: string;
18
+ agentType: string;
19
+ status: 'online' | 'idle' | 'busy' | 'offline';
20
+ capabilities: string[];
21
+ lastSeen: number;
22
+ }
15
23
  export interface SendOptions {
16
24
  format?: ContentFormat;
17
25
  replyTo?: string | null;
@@ -24,6 +32,8 @@ type RoomEventMap = {
24
32
  loaded: number;
25
33
  total: number;
26
34
  };
35
+ 'member:join': RoomMember;
36
+ 'member:leave': RoomMember;
27
37
  };
28
38
  type RoomEventListener<K extends keyof RoomEventMap> = (value: RoomEventMap[K]) => void;
29
39
  export declare class NexusRoom {
@@ -36,7 +46,9 @@ export declare class NexusRoom {
36
46
  private listeners;
37
47
  private pubsubHandler;
38
48
  private heartbeatInterval;
49
+ private staleEvictionTimer;
39
50
  private joined;
51
+ private memberMap;
40
52
  constructor(roomId: string, peerId: string, pubsub: any, agentInfo: AgentInfo, propagation?: ContentPropagation | null);
41
53
  on<K extends keyof RoomEventMap>(event: K, listener: RoomEventListener<K>): this;
42
54
  off<K extends keyof RoomEventMap>(event: K, listener: RoomEventListener<K>): this;
@@ -45,5 +57,10 @@ export declare class NexusRoom {
45
57
  send(content: string, options?: SendOptions): Promise<string>;
46
58
  leave(): Promise<void>;
47
59
  private publishPresence;
60
+ private trackMemberPresence;
61
+ private evictStaleMembers;
62
+ get members(): RoomMember[];
63
+ getMember(peerId: string): RoomMember | undefined;
64
+ findMemberByName(name: string): RoomMember | undefined;
48
65
  }
49
66
  export {};
package/dist/chat/room.js CHANGED
@@ -16,6 +16,7 @@ import { validateNexusMessage } from '../security/validators.js';
16
16
  import { createLogger } from '../logger.js';
17
17
  const log = createLogger('chat:room');
18
18
  const PRESENCE_INTERVAL_MS = 60_000;
19
+ const STALE_TIMEOUT_MS = PRESENCE_INTERVAL_MS * 2; // 120s — 2x heartbeat
19
20
  export class NexusRoom {
20
21
  roomId;
21
22
  topic;
@@ -26,7 +27,9 @@ export class NexusRoom {
26
27
  listeners = new Map();
27
28
  pubsubHandler = null;
28
29
  heartbeatInterval = null;
30
+ staleEvictionTimer = null;
29
31
  joined = false;
32
+ memberMap = new Map();
30
33
  constructor(roomId, peerId, pubsub, agentInfo, propagation = null) {
31
34
  this.roomId = roomId;
32
35
  this.topic = roomTopic(roomId);
@@ -83,6 +86,7 @@ export class NexusRoom {
83
86
  }
84
87
  else if (msg.type === 'presence') {
85
88
  this.emit('presence', msg);
89
+ this.trackMemberPresence(msg);
86
90
  }
87
91
  }
88
92
  catch {
@@ -96,6 +100,10 @@ export class NexusRoom {
96
100
  this.heartbeatInterval = setInterval(async () => {
97
101
  await this.publishPresence('online');
98
102
  }, PRESENCE_INTERVAL_MS);
103
+ // Start stale member eviction (check every 30s)
104
+ this.staleEvictionTimer = setInterval(() => {
105
+ this.evictStaleMembers();
106
+ }, 30_000);
99
107
  this.joined = true;
100
108
  log.info(`Joined room: ${this.roomId}`);
101
109
  }
@@ -116,6 +124,11 @@ export class NexusRoom {
116
124
  clearInterval(this.heartbeatInterval);
117
125
  this.heartbeatInterval = null;
118
126
  }
127
+ // Stop stale eviction
128
+ if (this.staleEvictionTimer !== null) {
129
+ clearInterval(this.staleEvictionTimer);
130
+ this.staleEvictionTimer = null;
131
+ }
119
132
  // Publish offline presence
120
133
  await this.publishPresence('offline');
121
134
  // Remove pubsub handler
@@ -131,5 +144,56 @@ export class NexusRoom {
131
144
  const msg = createPresenceMessage(this.roomId, this.peerId, status, this.agentInfo);
132
145
  await this.pubsub.publish(this.topic, encodeMessage(msg));
133
146
  }
147
+ // --- Member tracking ---
148
+ trackMemberPresence(msg) {
149
+ const payload = msg.payload;
150
+ if (!payload || !payload.status)
151
+ return;
152
+ const peerId = msg.sender;
153
+ const existing = this.memberMap.get(peerId);
154
+ if (payload.status === 'offline') {
155
+ if (existing) {
156
+ this.memberMap.delete(peerId);
157
+ this.emit('member:leave', existing);
158
+ }
159
+ return;
160
+ }
161
+ const member = {
162
+ peerId,
163
+ agentName: payload.agentName ?? '',
164
+ agentType: payload.agentType ?? '',
165
+ status: payload.status,
166
+ capabilities: payload.capabilities ?? [],
167
+ lastSeen: msg.timestamp,
168
+ };
169
+ const isNew = !existing;
170
+ this.memberMap.set(peerId, member);
171
+ if (isNew) {
172
+ this.emit('member:join', member);
173
+ }
174
+ }
175
+ evictStaleMembers() {
176
+ const cutoff = Date.now() - STALE_TIMEOUT_MS;
177
+ for (const [peerId, member] of this.memberMap) {
178
+ if (member.lastSeen < cutoff) {
179
+ this.memberMap.delete(peerId);
180
+ this.emit('member:leave', member);
181
+ log.debug(`Evicted stale member ${peerId.slice(0, 12)}... from ${this.roomId}`);
182
+ }
183
+ }
184
+ }
185
+ get members() {
186
+ return Array.from(this.memberMap.values());
187
+ }
188
+ getMember(peerId) {
189
+ return this.memberMap.get(peerId);
190
+ }
191
+ findMemberByName(name) {
192
+ for (const member of this.memberMap.values()) {
193
+ if (member.agentName === name)
194
+ return member;
195
+ }
196
+ return undefined;
197
+ }
134
198
  }
135
199
  //# sourceMappingURL=room.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"room.js","sourceRoot":"","sources":["../../src/chat/room.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room.js","sourceRoot":"","sources":["../../src/chat/room.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,9 +10,12 @@ import { type BootstrapSource } from './bootstrap/index.js';
10
10
  import type { AgentProfile, RoomInfo, ContributeOptions, AgentRole } from './protocol/types.js';
11
11
  import { X402PaymentRail } from './x402/index.js';
12
12
  import type { X402Config } from './x402/index.js';
13
- import { type InvokeEvent } from './protocols/index.js';
13
+ import { type InvokeEvent, type InvokeHandler } from './protocols/index.js';
14
14
  import { NatsDiscovery } from './nats/index.js';
15
15
  import { NknFallback } from './nkn/index.js';
16
+ import { DefaultTrustPolicy } from './trust/index.js';
17
+ import type { TrustConfig } from './trust/index.js';
18
+ import { MeteringEngine } from './metering/index.js';
16
19
  import { NexusRoom } from './chat/index.js';
17
20
  export interface NexusClientOptions {
18
21
  privateKey?: Uint8Array;
@@ -36,6 +39,7 @@ export interface NexusClientOptions {
36
39
  natsServers?: string[];
37
40
  enableNkn?: boolean;
38
41
  nknIdentifier?: string;
42
+ trustPolicy?: TrustConfig;
39
43
  }
40
44
  export interface CreateRoomOptions {
41
45
  roomId: string;
@@ -44,11 +48,36 @@ export interface CreateRoomOptions {
44
48
  type?: 'persistent' | 'ephemeral';
45
49
  access?: 'public';
46
50
  }
51
+ export interface CapabilityOptions {
52
+ /** When set, the provider gates the capability behind x402 payment.
53
+ * Amount is in smallest unit (e.g. "100000" = 0.10 USDC with 6 decimals).
54
+ * Set amount to "0" for free-tier (protocol dance without on-chain tx). */
55
+ pricing?: {
56
+ amount: string;
57
+ currency: 'USDC' | 'ETH' | 'BASE_ETH';
58
+ description?: string;
59
+ };
60
+ }
47
61
  type NexusEventMap = {
48
62
  'peer:discovered': string;
49
63
  'peer:connected': string;
50
64
  'peer:disconnected': string;
51
65
  'error': Error;
66
+ 'message': {
67
+ roomId: string;
68
+ message: import('./protocol/types.js').NexusMessage;
69
+ };
70
+ 'dm': {
71
+ from: string;
72
+ content: string;
73
+ format: string;
74
+ messageId: string;
75
+ };
76
+ 'invoke': {
77
+ from: string;
78
+ capability: string;
79
+ requestId: string;
80
+ };
52
81
  };
53
82
  type NexusEventListener<K extends keyof NexusEventMap> = (value: NexusEventMap[K]) => void;
54
83
  export declare class NexusClient {
@@ -64,8 +93,15 @@ export declare class NexusClient {
64
93
  private natsDiscovery;
65
94
  private natsAnnounceTimer;
66
95
  private nknFallback;
96
+ private capabilityHandlers;
97
+ private capabilityPricing;
98
+ private _trustPolicy;
99
+ private _metering;
100
+ private invokeHandlerRegistered;
67
101
  constructor(options?: NexusClientOptions);
68
102
  get x402(): X402PaymentRail;
103
+ get metering(): MeteringEngine;
104
+ get trustPolicy(): DefaultTrustPolicy;
69
105
  on<K extends keyof NexusEventMap>(event: K, listener: NexusEventListener<K>): this;
70
106
  off<K extends keyof NexusEventMap>(event: K, listener: NexusEventListener<K>): this;
71
107
  private emit;
@@ -113,6 +149,34 @@ export declare class NexusClient {
113
149
  * The stream is opened, the message is sent, and the stream is closed.
114
150
  */
115
151
  sendDM(peerId: string, content: string, format?: string): Promise<void>;
152
+ /**
153
+ * Register a named capability handler. When a remote peer invokes this
154
+ * capability via the /nexus/invoke/1.1.0 protocol, the handler is called.
155
+ *
156
+ * When `options.pricing` is set, the provider gates the capability behind
157
+ * x402 payment: sends invoke.payment_required, waits for proof, validates,
158
+ * then dispatches to the handler.
159
+ *
160
+ * On first registration, the libp2p protocol handler is set up.
161
+ */
162
+ registerCapability(name: string, handler: InvokeHandler, options?: CapabilityOptions): void;
163
+ /**
164
+ * Remove a previously registered capability handler.
165
+ */
166
+ unregisterCapability(name: string): void;
167
+ /**
168
+ * List all registered capability names.
169
+ */
170
+ getRegisteredCapabilities(): string[];
171
+ private handleIncomingInvoke;
172
+ /**
173
+ * Block a peer from invoking capabilities and sending DMs.
174
+ */
175
+ blockPeer(peerId: string): void;
176
+ /**
177
+ * Remove a peer from the block list.
178
+ */
179
+ unblockPeer(peerId: string): void;
116
180
  store(data: Uint8Array | string | object): Promise<string>;
117
181
  retrieve(cidString: string): Promise<unknown>;
118
182
  contribute(options: ContributeOptions): void;
@@ -146,7 +210,7 @@ export { DEFAULT_X402_CONFIG } from './x402/index.js';
146
210
  export { PaymentVerifier, PaymentSubmitter, generateWallet, loadWallet, saveWallet, loadOrCreateWallet, signPaymentAuthorization, verifyPaymentSignature, generateNonce, USDC_BASE_ADDRESS, USDC_EIP712_DOMAIN, BASE_CHAIN_ID, TRANSFER_WITH_AUTH_TYPES, } from './x402/index.js';
147
211
  export type { VerificationResult, SubmitResult, AgentWallet, TransferAuthMessage, } from './x402/index.js';
148
212
  export { STREAM_PROTOCOLS, INVOKE_PROTOCOL, HANDSHAKE_PROTOCOL, DM_PROTOCOL, CHAT_SYNC_PROTOCOL, encodeStreamMessage, decodeStreamMessage, } from './protocols/index.js';
149
- export type { InvokeOpen, InvokeChunk, InvokeAccept, InvokeEvent, InvokeDone, InvokeError, InvokeCancel, InvokeMessage, InvokeHandler, HandshakeInit, HandshakeAck, DmMessage, SyncRequest, SyncResponse, } from './protocols/index.js';
213
+ export type { InvokeOpen, InvokeChunk, InvokeAccept, InvokeEvent, InvokeDone, InvokeError, InvokeCancel, InvokePaymentRequired, InvokePaymentProof, InvokeMessage, InvokeHandler, InvokeStreamHandle, HandshakeInit, HandshakeAck, DmMessage, SyncRequest, SyncResponse, } from './protocols/index.js';
150
214
  export { validateManifestStructure, isManifestExpired, extractPeersFromManifest, savePeerCache, loadPeerCache, resolveBootstrap, defaultBootstrapSources, } from './bootstrap/index.js';
151
215
  export type { BootstrapSeed, BootstrapManifest, PeerCache, BootstrapSource, BootstrapResult, } from './bootstrap/index.js';
152
216
  export { DefaultTrustPolicy } from './trust/index.js';
@@ -159,3 +223,7 @@ export { NatsDiscovery, DEFAULT_NATS_CONFIG, NATS_DISCOVERY_SERVERS, NATS_DISCOV
159
223
  export type { NatsDiscoveryConfig, NatsAgentAnnouncement } from './nats/index.js';
160
224
  export { NknFallback, DEFAULT_NKN_CONFIG } from './nkn/index.js';
161
225
  export type { NknConfig, NknAddressInfo } from './nkn/index.js';
226
+ export type { RoomMember } from './chat/index.js';
227
+ export { MeteringEngine } from './metering/index.js';
228
+ export { createFileAuditHook } from './metering/file-logger.js';
229
+ export type { UsageRecord, PeerUsageSummary, UsageFilter, MeteringHook } from './metering/index.js';