@highway1/core 0.1.51 → 0.1.53

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/identity/keys.ts","../src/identity/did.ts","../src/identity/signer.ts","../src/utils/logger.ts","../src/transport/relay-client.ts","../src/transport/relay-types.ts","../src/discovery/agent-card-types.ts","../src/discovery/agent-card.ts","../src/discovery/agent-card-schema.ts","../src/discovery/agent-card-encoder.ts","../src/discovery/relay-index.ts","../src/discovery/search-index.ts","../src/discovery/capability-matcher.ts","../src/discovery/semantic-search.ts","../src/messaging/envelope.ts","../src/messaging/codec.ts","../src/messaging/router.ts","../src/messaging/storage.ts","../src/messaging/queue.ts","../src/messaging/rate-limiter.ts","../src/messaging/defense.ts","../src/trust/trust-score.ts","../src/trust/interaction-history.ts","../src/trust/endorsement.ts","../src/trust/sybil-defense.ts","../src/trust/index.ts"],"names":["LogLevel","did","cborEncode","cborDecode","logger","Level"],"mappings":"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","file":"index.js","sourcesContent":["export class ClawiverseError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: unknown\n ) {\n super(message);\n this.name = 'ClawiverseError';\n }\n}\n\nexport class IdentityError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'IDENTITY_ERROR', details);\n this.name = 'IdentityError';\n }\n}\n\nexport class TransportError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'TRANSPORT_ERROR', details);\n this.name = 'TransportError';\n }\n}\n\nexport class DiscoveryError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'DISCOVERY_ERROR', details);\n this.name = 'DiscoveryError';\n }\n}\n\nexport class MessagingError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'MESSAGING_ERROR', details);\n this.name = 'MessagingError';\n }\n}\n","import * as ed25519 from '@noble/ed25519';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n}\n\n/**\n * Generate a new Ed25519 key pair\n */\nexport async function generateKeyPair(): Promise<KeyPair> {\n try {\n const privateKey = ed25519.utils.randomPrivateKey();\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n\n return {\n publicKey,\n privateKey,\n };\n } catch (error) {\n throw new IdentityError('Failed to generate key pair', error);\n }\n}\n\n/**\n * Sign a message with a private key\n */\nexport async function sign(\n message: Uint8Array,\n privateKey: Uint8Array\n): Promise<Uint8Array> {\n try {\n return await ed25519.signAsync(message, privateKey);\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signature\n */\nexport async function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array\n): Promise<boolean> {\n try {\n return await ed25519.verifyAsync(signature, message, publicKey);\n } catch (error) {\n throw new IdentityError('Failed to verify signature', error);\n }\n}\n\n/**\n * Export key pair to JSON format\n */\nexport function exportKeyPair(keyPair: KeyPair): {\n publicKey: string;\n privateKey: string;\n} {\n return {\n publicKey: Buffer.from(keyPair.publicKey).toString('hex'),\n privateKey: Buffer.from(keyPair.privateKey).toString('hex'),\n };\n}\n\n/**\n * Import key pair from JSON format\n */\nexport function importKeyPair(exported: {\n publicKey: string;\n privateKey: string;\n}): KeyPair {\n return {\n publicKey: new Uint8Array(Buffer.from(exported.publicKey, 'hex')),\n privateKey: new Uint8Array(Buffer.from(exported.privateKey, 'hex')),\n };\n}\n","import { base58btc } from 'multiformats/bases/base58';\nimport { IdentityError } from '../utils/errors.js';\n\n/**\n * Derive a did:clawiverse DID from a public key\n * Format: did:clawiverse:<base58btc-encoded-pubkey>\n */\nexport function deriveDID(publicKey: Uint8Array): string {\n try {\n const encoded = base58btc.encode(publicKey);\n return `did:clawiverse:${encoded}`;\n } catch (error) {\n throw new IdentityError('Failed to derive DID', error);\n }\n}\n\n/**\n * Extract public key from a did:clawiverse DID\n */\nexport function extractPublicKey(did: string): Uint8Array {\n if (!did.startsWith('did:clawiverse:')) {\n throw new IdentityError('Invalid DID format: must start with did:clawiverse:');\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n return base58btc.decode(encoded);\n } catch (error) {\n throw new IdentityError('Failed to extract public key from DID', error);\n }\n}\n\n/**\n * Validate a did:clawiverse DID format\n */\nexport function validateDID(did: string): boolean {\n if (!did.startsWith('did:clawiverse:')) {\n return false;\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n base58btc.decode(encoded);\n return true;\n } catch {\n return false;\n }\n}\n","import { sign, verify } from './keys.js';\nimport { deriveDID } from './did.js';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface SignedMessage {\n payload: Uint8Array;\n signature: Uint8Array;\n signer: string; // DID\n}\n\n/**\n * Sign a message and return a signed message object\n */\nexport async function signMessage(\n payload: Uint8Array,\n privateKey: Uint8Array,\n publicKey: Uint8Array\n): Promise<SignedMessage> {\n try {\n const signature = await sign(payload, privateKey);\n const signer = deriveDID(publicKey);\n\n return {\n payload,\n signature,\n signer,\n };\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signed message\n */\nexport async function verifyMessage(\n signedMessage: SignedMessage,\n expectedPublicKey: Uint8Array\n): Promise<boolean> {\n try {\n const expectedDID = deriveDID(expectedPublicKey);\n\n if (signedMessage.signer !== expectedDID) {\n return false;\n }\n\n return await verify(\n signedMessage.signature,\n signedMessage.payload,\n expectedPublicKey\n );\n } catch (error) {\n throw new IdentityError('Failed to verify message', error);\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport class Logger {\n private level: LogLevel;\n private prefix: string;\n\n constructor(prefix: string, level: LogLevel = LogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG:`, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.info(`[${this.prefix}] INFO:`, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN:`, message, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR:`, message, ...args);\n }\n }\n}\n\nexport const createLogger = (prefix: string, level?: LogLevel): Logger => {\n return new Logger(prefix, level);\n};\n","/**\n * CVP-0011: WebSocket relay client with reconnection logic\n */\n\nimport { WebSocket } from 'ws';\nimport { createLogger } from '../utils/logger.js';\nimport { TransportError } from '../utils/errors.js';\nimport { sign } from '../identity/keys.js';\nimport type { KeyPair } from '../identity/keys.js';\nimport type { AgentCard } from '../discovery/agent-card-types.js';\nimport type {\n RelayMessage,\n HelloMessage,\n WelcomeMessage,\n DeliverMessage,\n DiscoveredAgent,\n DeliveryReportMessage,\n} from './relay-types.js';\n\nconst logger = createLogger('relay-client');\n\nexport interface RelayClientConfig {\n relayUrls: string[];\n did: string;\n keyPair: KeyPair;\n card: AgentCard;\n reconnect?: {\n baseMs?: number;\n jitterMs?: number;\n maxDelayMs?: number;\n stableAfterMs?: number;\n };\n}\n\nexport type MessageDeliveryHandler = (msg: DeliverMessage) => Promise<void>;\nexport type DeliveryReportHandler = (msg: DeliveryReportMessage) => void;\n\nexport interface RelayClient {\n start(): Promise<void>;\n stop(): Promise<void>;\n sendEnvelope(toDid: string, envelopeBytes: Uint8Array): Promise<void>;\n discover(query: string, minTrust?: number, limit?: number): Promise<DiscoveredAgent[]>;\n fetchCard(did: string): Promise<AgentCard | null>;\n onDeliver(handler: MessageDeliveryHandler): void;\n onDeliveryReport(handler: DeliveryReportHandler): void;\n isConnected(): boolean;\n getConnectedRelays(): string[];\n getPeerCount(): number;\n}\n\ninterface RelayConnection {\n url: string;\n ws: WebSocket | null;\n connected: boolean;\n reconnectAttempt: number;\n reconnectTimer: NodeJS.Timeout | null;\n stableTimer: NodeJS.Timeout | null;\n peerCount: number;\n}\n\nconst DEFAULT_RECONNECT = {\n baseMs: 1000,\n jitterMs: 2000,\n maxDelayMs: 30000,\n stableAfterMs: 60000,\n};\n\nexport function createRelayClient(config: RelayClientConfig): RelayClient {\n const { relayUrls, did, keyPair, card } = config;\n const reconnectConfig = { ...DEFAULT_RECONNECT, ...config.reconnect };\n\n const connections: RelayConnection[] = relayUrls.map((url) => ({\n url,\n ws: null,\n connected: false,\n reconnectAttempt: 0,\n reconnectTimer: null,\n stableTimer: null,\n peerCount: 0,\n }));\n\n let deliveryHandler: MessageDeliveryHandler | null = null;\n let deliveryReportHandler: DeliveryReportHandler | null = null;\n let stopped = false;\n\n async function connectToRelay(conn: RelayConnection): Promise<void> {\n if (stopped) return;\n\n try {\n logger.info('Connecting to relay', { url: conn.url });\n\n const ws = new WebSocket(conn.url);\n conn.ws = ws;\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Connection timeout'));\n }, 10000);\n\n ws.on('open', async () => {\n clearTimeout(timeout);\n logger.info('WebSocket connected', { url: conn.url });\n\n try {\n // Send HELLO message\n const timestamp = Date.now();\n const helloData = JSON.stringify({ did, card, timestamp });\n const signature = await sign(new TextEncoder().encode(helloData), keyPair.privateKey);\n\n const hello: HelloMessage = {\n type: 'HELLO',\n protocolVersion: 1,\n did,\n card,\n timestamp,\n signature,\n };\n\n ws.send(JSON.stringify(hello));\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n\n ws.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n\n // Set up message handler\n ws.on('message', async (data: Buffer) => {\n try {\n const msg: RelayMessage = JSON.parse(data.toString());\n await handleRelayMessage(conn, msg);\n } catch (err) {\n logger.warn('Failed to parse relay message', { error: (err as Error).message });\n }\n });\n\n ws.on('close', () => {\n logger.info('WebSocket closed', { url: conn.url });\n conn.connected = false;\n conn.ws = null;\n\n if (conn.stableTimer) {\n clearTimeout(conn.stableTimer);\n conn.stableTimer = null;\n }\n\n if (!stopped) {\n scheduleReconnect(conn);\n }\n });\n\n ws.on('error', (err) => {\n logger.warn('WebSocket error', { url: conn.url, error: err.message });\n });\n } catch (err) {\n logger.warn('Failed to connect to relay', { url: conn.url, error: (err as Error).message });\n conn.ws = null;\n conn.connected = false;\n\n if (!stopped) {\n scheduleReconnect(conn);\n }\n }\n }\n\n function scheduleReconnect(conn: RelayConnection): void {\n if (conn.reconnectTimer) return;\n\n const delay = Math.min(\n reconnectConfig.baseMs * Math.pow(2, conn.reconnectAttempt) + Math.random() * reconnectConfig.jitterMs,\n reconnectConfig.maxDelayMs\n );\n\n conn.reconnectAttempt++;\n logger.debug('Scheduling reconnect', { url: conn.url, attempt: conn.reconnectAttempt, delayMs: delay });\n\n conn.reconnectTimer = setTimeout(() => {\n conn.reconnectTimer = null;\n connectToRelay(conn);\n }, delay);\n }\n\n async function handleRelayMessage(conn: RelayConnection, msg: RelayMessage): Promise<void> {\n switch (msg.type) {\n case 'WELCOME': {\n const welcome = msg as WelcomeMessage;\n logger.info('Received WELCOME', { relayId: welcome.relayId, peers: welcome.peers });\n conn.connected = true;\n conn.peerCount = welcome.peers;\n conn.reconnectAttempt = 0;\n\n // Start stable timer\n if (conn.stableTimer) clearTimeout(conn.stableTimer);\n conn.stableTimer = setTimeout(() => {\n conn.reconnectAttempt = 0;\n logger.debug('Connection stable', { url: conn.url });\n }, reconnectConfig.stableAfterMs);\n break;\n }\n\n case 'DELIVER': {\n const deliver = msg as DeliverMessage;\n logger.info('Received DELIVER', { messageId: deliver.messageId, from: deliver.from });\n if (deliveryHandler) {\n await deliveryHandler(deliver);\n }\n break;\n }\n\n case 'DELIVERY_REPORT': {\n const report = msg as DeliveryReportMessage;\n logger.info('Received DELIVERY_REPORT', { messageId: report.messageId, status: report.status });\n if (deliveryReportHandler) {\n deliveryReportHandler(report);\n }\n break;\n }\n\n case 'PONG': {\n conn.peerCount = msg.peers;\n logger.debug('Received PONG', { peers: msg.peers });\n break;\n }\n\n default:\n logger.debug('Received relay message', { type: msg.type });\n }\n }\n\n function getConnectedConnection(): RelayConnection | null {\n return connections.find((c) => c.connected && c.ws) || null;\n }\n\n async function sendToRelay(msg: RelayMessage): Promise<void> {\n const conn = getConnectedConnection();\n if (!conn || !conn.ws) {\n throw new TransportError('No connected relay');\n }\n\n conn.ws.send(JSON.stringify(msg));\n }\n\n return {\n async start(): Promise<void> {\n stopped = false;\n logger.info('Starting relay client', { relays: relayUrls.length });\n\n // Stagger initial connections\n for (let i = 0; i < connections.length; i++) {\n const conn = connections[i];\n setTimeout(() => {\n connectToRelay(conn);\n }, Math.random() * 2000);\n }\n\n // Wait for at least one connection\n const maxWait = 15000;\n const start = Date.now();\n while (Date.now() - start < maxWait) {\n if (getConnectedConnection()) {\n logger.info('Relay client started');\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n throw new TransportError('Failed to connect to any relay');\n },\n\n async stop(): Promise<void> {\n stopped = true;\n logger.info('Stopping relay client');\n\n for (const conn of connections) {\n if (conn.reconnectTimer) {\n clearTimeout(conn.reconnectTimer);\n conn.reconnectTimer = null;\n }\n if (conn.stableTimer) {\n clearTimeout(conn.stableTimer);\n conn.stableTimer = null;\n }\n if (conn.ws) {\n conn.ws.close();\n conn.ws = null;\n }\n conn.connected = false;\n }\n\n logger.info('Relay client stopped');\n },\n\n async sendEnvelope(toDid: string, envelopeBytes: Uint8Array): Promise<void> {\n const msg: RelayMessage = {\n type: 'SEND',\n to: toDid,\n envelope: envelopeBytes,\n };\n\n await sendToRelay(msg);\n logger.debug('Sent envelope', { to: toDid, size: envelopeBytes.length });\n },\n\n async discover(query: string, minTrust?: number, limit?: number): Promise<DiscoveredAgent[]> {\n const conn = getConnectedConnection();\n const ws = conn?.ws;\n if (!conn || !ws) {\n throw new TransportError('No connected relay');\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new TransportError('Discover timeout'));\n }, 10000);\n\n const handler = (data: Buffer) => {\n try {\n const msg: RelayMessage = JSON.parse(data.toString());\n if (msg.type === 'DISCOVERED') {\n clearTimeout(timeout);\n ws.off('message', handler);\n resolve(msg.agents);\n }\n } catch (err) {\n // Ignore parse errors\n }\n };\n\n ws.on('message', handler);\n ws.send(JSON.stringify({ type: 'DISCOVER', query, minTrust, limit } as RelayMessage));\n });\n },\n\n async fetchCard(did: string): Promise<AgentCard | null> {\n const conn = getConnectedConnection();\n const ws = conn?.ws;\n if (!conn || !ws) {\n throw new TransportError('No connected relay');\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new TransportError('Fetch card timeout'));\n }, 5000);\n\n const handler = (data: Buffer) => {\n try {\n const msg: RelayMessage = JSON.parse(data.toString());\n if (msg.type === 'CARD' && msg.did === did) {\n clearTimeout(timeout);\n ws.off('message', handler);\n resolve(msg.card);\n }\n } catch (err) {\n // Ignore parse errors\n }\n };\n\n ws.on('message', handler);\n ws.send(JSON.stringify({ type: 'FETCH_CARD', did } as RelayMessage));\n });\n },\n\n onDeliver(handler: MessageDeliveryHandler): void {\n deliveryHandler = handler;\n },\n\n onDeliveryReport(handler: DeliveryReportHandler): void {\n deliveryReportHandler = handler;\n },\n\n isConnected(): boolean {\n return getConnectedConnection() !== null;\n },\n\n getConnectedRelays(): string[] {\n return connections.filter((c) => c.connected).map((c) => c.url);\n },\n\n getPeerCount(): number {\n const conn = getConnectedConnection();\n return conn ? conn.peerCount : 0;\n },\n };\n}\n","/**\n * CVP-0011: Relay wire protocol types (shared between relay server and relay client)\n */\n\nimport type { AgentCard } from '../discovery/agent-card-types.js';\n\nexport const RELAY_PROTOCOL_VERSION = 1;\n\nexport type RelayMessageType =\n | 'HELLO'\n | 'WELCOME'\n | 'SEND'\n | 'DELIVER'\n | 'DISCOVER'\n | 'DISCOVERED'\n | 'PING'\n | 'PONG'\n | 'ACK'\n | 'DELIVERY_REPORT'\n | 'FETCH_CARD'\n | 'CARD'\n | 'GOODBYE'\n | 'INDEX_SYNC'\n | 'ROUTE'\n | 'SYNC_HELLO'\n | 'SYNC_REQUEST'\n | 'SYNC_RESPONSE'\n | 'SYNC_PUSH'\n | 'SYNC_RECONCILE';\n\nexport interface HelloMessage {\n type: 'HELLO';\n protocolVersion: number;\n did: string;\n card: AgentCard;\n timestamp: number;\n signature: Uint8Array;\n extensions?: string[];\n}\n\nexport interface WelcomeMessage {\n type: 'WELCOME';\n protocolVersion: number;\n relayId: string;\n peers: number;\n federatedRelays: string[];\n yourAddr: string;\n}\n\nexport interface SendMessage {\n type: 'SEND';\n to: string;\n envelope: Uint8Array;\n}\n\nexport interface DeliverMessage {\n type: 'DELIVER';\n messageId: string;\n from: string;\n envelope: Uint8Array;\n}\n\nexport interface DiscoverMessage {\n type: 'DISCOVER';\n query: string;\n minTrust?: number;\n limit?: number;\n}\n\nexport interface DiscoveredAgent {\n did: string;\n card: AgentCard;\n online: boolean;\n homeRelay?: string;\n}\n\nexport interface DiscoveredMessage {\n type: 'DISCOVERED';\n agents: DiscoveredAgent[];\n}\n\nexport interface AckMessage {\n type: 'ACK';\n messageId: string;\n}\n\nexport interface DeliveryReportMessage {\n type: 'DELIVERY_REPORT';\n messageId: string;\n status: 'delivered' | 'expired' | 'queue_full' | 'unknown_recipient';\n timestamp: number;\n}\n\nexport interface PingMessage {\n type: 'PING';\n}\n\nexport interface PongMessage {\n type: 'PONG';\n peers: number;\n}\n\nexport interface FetchCardMessage {\n type: 'FETCH_CARD';\n did: string;\n}\n\nexport interface CardMessage {\n type: 'CARD';\n did: string;\n card: AgentCard | null;\n}\n\nexport interface GoodbyeMessage {\n type: 'GOODBYE';\n}\n\nexport interface PresenceProof {\n did: string;\n homeRelay: string;\n expiry: number;\n signature: Uint8Array;\n}\n\nexport interface SyncEvent {\n seq: number;\n type: 'JOIN' | 'LEAVE' | 'UPDATE';\n did: string;\n homeRelay: string;\n cardHash?: string;\n capabilityKeys?: string[];\n online: boolean;\n ts: number;\n presenceProof?: PresenceProof;\n}\n\nexport interface IndexSyncMessage {\n type: 'INDEX_SYNC';\n events: SyncEvent[];\n}\n\nexport interface RouteMessage {\n type: 'ROUTE';\n to: string;\n envelope: Uint8Array;\n ttl: number;\n}\n\nexport interface SyncHelloMessage {\n type: 'SYNC_HELLO';\n relayId: string;\n seq: number;\n}\n\nexport interface SyncRequestMessage {\n type: 'SYNC_REQUEST';\n fromSeq: number;\n}\n\nexport interface SyncResponseMessage {\n type: 'SYNC_RESPONSE';\n events: SyncEvent[];\n}\n\nexport interface SyncPushMessage {\n type: 'SYNC_PUSH';\n event: SyncEvent;\n}\n\nexport interface SyncReconcileMessage {\n type: 'SYNC_RECONCILE';\n dids: string[];\n}\n\nexport type RelayMessage =\n | HelloMessage\n | WelcomeMessage\n | SendMessage\n | DeliverMessage\n | DiscoverMessage\n | DiscoveredMessage\n | AckMessage\n | DeliveryReportMessage\n | PingMessage\n | PongMessage\n | FetchCardMessage\n | CardMessage\n | GoodbyeMessage\n | IndexSyncMessage\n | RouteMessage\n | SyncHelloMessage\n | SyncRequestMessage\n | SyncResponseMessage\n | SyncPushMessage\n | SyncReconcileMessage;\n","/**\n * Enhanced Agent Card Types for Phase 2\n *\n * Adds structured capabilities, JSON-LD support, and trust metrics\n */\n\nimport type { TrustScore } from '../trust/trust-score.js';\n\n/**\n * Capability Parameter Definition\n */\nexport interface CapabilityParameter {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required: boolean;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\n/**\n * Structured Capability Definition\n */\nexport interface Capability {\n '@type'?: string; // JSON-LD type (e.g., \"TranslationService\")\n id: string; // Unique capability ID\n name: string; // Human-readable name\n description: string;\n parameters?: CapabilityParameter[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Enhanced Agent Card with JSON-LD support\n */\nexport interface AgentCard {\n '@context'?: string[]; // JSON-LD context\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: Capability[]; // Changed from string[] to Capability[]\n endpoints: string[];\n peerId?: string;\n trust?: TrustScore; // Trust metrics\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Legacy Agent Card (Phase 1 compatibility)\n */\nexport interface LegacyAgentCard {\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: string[]; // Flat string array\n endpoints: string[];\n peerId?: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Check if card is legacy format\n */\nexport function isLegacyCard(card: AgentCard | LegacyAgentCard): card is LegacyAgentCard {\n return Array.isArray(card.capabilities) &&\n card.capabilities.length > 0 &&\n typeof card.capabilities[0] === 'string';\n}\n\n/**\n * Convert legacy card to new format\n */\nexport function upgradeLegacyCard(legacy: LegacyAgentCard): AgentCard {\n return {\n ...legacy,\n capabilities: legacy.capabilities.map(cap => ({\n id: cap,\n name: cap,\n description: `Capability: ${cap}`,\n })),\n };\n}\n\n/**\n * Convert new card to legacy format (for backward compatibility)\n */\nexport function downgradeToLegacyCard(card: AgentCard): LegacyAgentCard {\n const { '@context': _, trust: __, ...rest } = card;\n return {\n ...rest,\n capabilities: card.capabilities.map(cap => cap.id),\n };\n}\n","import Ajv, { JSONSchemaType } from 'ajv';\nimport { DiscoveryError } from '../utils/errors.js';\n\n// Re-export Phase 2 types\nexport type { AgentCard, Capability, CapabilityParameter, LegacyAgentCard } from './agent-card-types.js';\nexport { isLegacyCard, upgradeLegacyCard, downgradeToLegacyCard } from './agent-card-types.js';\n\n// Import for internal use\nimport type { AgentCard, Capability, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard } from './agent-card-types.js';\n\n// Legacy schema for backward compatibility\nconst legacyAgentCardSchema: JSONSchemaType<Omit<LegacyAgentCard, 'signature'>> = {\n type: 'object',\n properties: {\n did: { type: 'string', pattern: '^did:clawiverse:[1-9A-HJ-NP-Za-km-z]+$' },\n name: { type: 'string', minLength: 1, maxLength: 100 },\n description: { type: 'string', maxLength: 500 },\n version: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$' },\n capabilities: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 50,\n },\n endpoints: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 10,\n },\n peerId: { type: 'string', nullable: true },\n metadata: {\n type: 'object',\n nullable: true,\n required: [],\n },\n timestamp: { type: 'number' },\n },\n required: ['did', 'name', 'description', 'version', 'capabilities', 'endpoints', 'timestamp'],\n additionalProperties: false,\n};\n\nconst ajv = new Ajv();\nconst validateLegacySchema = ajv.compile(legacyAgentCardSchema);\n\n/**\n * Create a new Agent Card (Phase 2 format with structured capabilities)\n */\nexport function createAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: Capability[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<AgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create a legacy Agent Card (Phase 1 format with string capabilities)\n * For backward compatibility\n */\nexport function createLegacyAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: string[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<LegacyAgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate an Agent Card structure (supports both Phase 1 and Phase 2 formats)\n */\nexport function validateAgentCard(card: unknown): card is AgentCard | LegacyAgentCard {\n if (typeof card !== 'object' || card === null) {\n return false;\n }\n\n const c = card as Partial<AgentCard | LegacyAgentCard>;\n\n // Check signature exists\n if (typeof c.signature !== 'string') {\n return false;\n }\n\n // Check if it's legacy format\n if (isLegacyCard(c as any)) {\n return validateLegacySchema(c);\n }\n\n // Phase 2 format - basic validation\n // (Full JSON-LD validation would be more complex)\n return (\n typeof c.did === 'string' &&\n typeof c.name === 'string' &&\n typeof c.description === 'string' &&\n typeof c.version === 'string' &&\n Array.isArray(c.capabilities) &&\n Array.isArray(c.endpoints) &&\n typeof c.timestamp === 'number'\n );\n}\n\n/**\n * Sign an Agent Card\n */\nexport async function signAgentCard(\n card: Omit<AgentCard, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<AgentCard> {\n try {\n const cardJson = JSON.stringify(card);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signature = await signFn(cardBytes);\n\n return {\n ...card,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new DiscoveryError('Failed to sign Agent Card', error);\n }\n}\n\n/**\n * Verify an Agent Card signature\n */\nexport async function verifyAgentCard(\n card: AgentCard,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...cardWithoutSig } = card;\n const cardJson = JSON.stringify(cardWithoutSig);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, cardBytes);\n } catch (error) {\n throw new DiscoveryError('Failed to verify Agent Card', error);\n }\n}\n\n/**\n * Check if an Agent Card matches a capability query\n * Supports both Phase 1 (string[]) and Phase 2 (Capability[]) formats\n */\nexport function matchesCapability(\n card: AgentCard | LegacyAgentCard,\n capability: string\n): boolean {\n if (isLegacyCard(card)) {\n return card.capabilities.some((cap) =>\n cap.toLowerCase().includes(capability.toLowerCase())\n );\n }\n\n return card.capabilities.some((cap) =>\n cap.id.toLowerCase().includes(capability.toLowerCase()) ||\n cap.name.toLowerCase().includes(capability.toLowerCase()) ||\n cap.description.toLowerCase().includes(capability.toLowerCase())\n );\n}\n","/**\n * JSON-LD Schema Definitions for Agent Cards\n *\n * Defines the Clawiverse vocabulary and integrates with Schema.org\n * for semantic interoperability.\n */\n\nexport const CLAWIVERSE_CONTEXT = 'https://clawiverse.org/context/v1';\nexport const SCHEMA_ORG_CONTEXT = 'https://schema.org';\n\n/**\n * Clawiverse JSON-LD Context\n * Defines the vocabulary for Agent Cards and Capabilities\n */\nexport const clawiverseContext = {\n '@context': {\n '@vocab': CLAWIVERSE_CONTEXT,\n 'schema': SCHEMA_ORG_CONTEXT,\n 'AgentCard': 'schema:SoftwareApplication',\n 'Capability': 'schema:Action',\n 'did': '@id',\n 'name': 'schema:name',\n 'description': 'schema:description',\n 'version': 'schema:softwareVersion',\n 'capabilities': {\n '@id': 'schema:potentialAction',\n '@type': '@id',\n '@container': '@list'\n },\n 'endpoints': {\n '@id': 'schema:url',\n '@container': '@list'\n },\n 'peerId': 'clawiverse:peerId',\n 'trust': 'clawiverse:trustScore',\n 'metadata': 'schema:additionalProperty',\n 'timestamp': 'schema:dateModified',\n 'signature': 'clawiverse:signature',\n 'parameters': {\n '@id': 'schema:object',\n '@container': '@list'\n }\n }\n};\n\n/**\n * Capability Type Definitions\n * Common capability types with semantic meaning\n */\nexport const CapabilityTypes = {\n TRANSLATION: 'TranslationService',\n CODE_REVIEW: 'CodeReviewService',\n DATA_ANALYSIS: 'DataAnalysisService',\n TEXT_GENERATION: 'TextGenerationService',\n IMAGE_GENERATION: 'ImageGenerationService',\n SEARCH: 'SearchService',\n COMPUTATION: 'ComputationService',\n STORAGE: 'StorageService',\n MESSAGING: 'MessagingService',\n AUTHENTICATION: 'AuthenticationService',\n} as const;\n\n/**\n * Parameter Type Definitions\n */\nexport const ParameterTypes = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n OBJECT: 'object',\n ARRAY: 'array',\n} as const;\n\n/**\n * Get JSON-LD context for Agent Card\n */\nexport function getAgentCardContext(): string[] {\n return [SCHEMA_ORG_CONTEXT, CLAWIVERSE_CONTEXT];\n}\n\n/**\n * Validate JSON-LD context\n */\nexport function isValidContext(context: unknown): boolean {\n if (!Array.isArray(context)) return false;\n return context.every(c => typeof c === 'string');\n}\n","/**\n * Agent Card Encoder - Dual Encoding Support\n *\n * Provides bidirectional conversion between:\n * - CBOR (compact binary) for DHT storage\n * - JSON-LD (semantic) for Web publishing\n */\n\nimport { encode as cborEncode, decode as cborDecode } from 'cbor-x';\nimport type { AgentCard, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard, upgradeLegacyCard } from './agent-card-types.js';\nimport { getAgentCardContext } from './agent-card-schema.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\n/**\n * Encode Agent Card as CBOR for DHT storage\n */\nexport function encodeForDHT(card: AgentCard): Uint8Array {\n try {\n // Remove JSON-LD context for compact storage\n const { '@context': _, ...cardWithoutContext } = card;\n return cborEncode(cardWithoutContext);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as CBOR', error);\n }\n}\n\n/**\n * Encode Agent Card as JSON-LD for Web publishing\n */\nexport function encodeForWeb(card: AgentCard): string {\n try {\n // Ensure JSON-LD context is present\n const cardWithContext: AgentCard = {\n '@context': card['@context'] || getAgentCardContext(),\n ...card,\n };\n return JSON.stringify(cardWithContext, null, 2);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as JSON-LD', error);\n }\n}\n\n/**\n * Decode Agent Card from CBOR\n */\nexport function decodeFromCBOR(data: Uint8Array): AgentCard {\n try {\n const decoded = cborDecode(data) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from CBOR', error);\n }\n}\n\n/**\n * Decode Agent Card from JSON-LD\n */\nexport function decodeFromJSON(json: string): AgentCard {\n try {\n const decoded = JSON.parse(json) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from JSON', error);\n }\n}\n\n/**\n * Auto-detect format and decode\n */\nexport function decodeAgentCard(data: Uint8Array | string): AgentCard {\n if (typeof data === 'string') {\n return decodeFromJSON(data);\n }\n\n // Try CBOR first, fallback to JSON if it looks like text\n try {\n return decodeFromCBOR(data);\n } catch {\n // Check if it's actually JSON text\n const text = new TextDecoder().decode(data);\n if (text.trim().startsWith('{')) {\n return decodeFromJSON(text);\n }\n throw new DiscoveryError('Unable to decode Agent Card: unknown format');\n }\n}\n\n/**\n * Calculate encoded size for comparison\n */\nexport function getEncodedSize(card: AgentCard): { cbor: number; json: number } {\n return {\n cbor: encodeForDHT(card).length,\n json: encodeForWeb(card).length,\n };\n}\n","/**\n * CVP-0011: Relay-backed discovery operations\n * Implements the same DHTOperations interface shape but backed by relay queries\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\nimport type { RelayClient } from '../transport/relay-client.js';\nimport { createLogger } from '../utils/logger.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\nconst logger = createLogger('relay-index');\n\nexport interface RelayIndexOperations {\n publishAgentCard: (card: AgentCard) => Promise<void>;\n queryAgentCard: (did: string) => Promise<AgentCard | null>;\n queryByCapability: (capability: string) => Promise<AgentCard[]>;\n searchSemantic: (query: SemanticQuery) => Promise<AgentCard[]>;\n resolveDID: (did: string) => Promise<{ relayUrl: string } | null>;\n queryRelayPeers: () => Promise<string[]>;\n}\n\n/**\n * Create relay-backed discovery operations\n */\nexport function createRelayIndexOperations(client: RelayClient): RelayIndexOperations {\n return {\n publishAgentCard: async (card: AgentCard) => {\n // No-op: Agent Card is published via HELLO message when connecting to relay\n logger.debug('Agent Card published via HELLO', { did: card.did });\n },\n\n queryAgentCard: async (did: string) => {\n try {\n const card = await client.fetchCard(did);\n if (card) {\n logger.debug('Found Agent Card via relay', { did });\n } else {\n logger.debug('Agent Card not found via relay', { did });\n }\n return card;\n } catch (error) {\n logger.warn('Failed to query Agent Card', { did, error });\n return null;\n }\n },\n\n queryByCapability: async (capability: string) => {\n try {\n const results = await client.discover(capability);\n const cards = results.map((r) => r.card);\n logger.debug('Query by capability', { capability, count: cards.length });\n return cards;\n } catch (error) {\n throw new DiscoveryError('Failed to query by capability', error);\n }\n },\n\n searchSemantic: async (query: SemanticQuery) => {\n try {\n const queryText = query.text || query.capability || '';\n const minTrust = query.filters?.minTrustScore;\n const limit = query.limit || 10;\n\n const results = await client.discover(queryText, minTrust, limit);\n const cards = results.map((r) => r.card);\n\n logger.debug('Semantic search', { query: queryText, count: cards.length });\n return cards;\n } catch (error) {\n throw new DiscoveryError('Failed to perform semantic search', error);\n }\n },\n\n resolveDID: async (did: string) => {\n try {\n // In relay architecture, we don't need peer resolution\n // The relay handles routing, so we just return the relay URL\n const relays = client.getConnectedRelays();\n if (relays.length === 0) {\n logger.debug('DID resolution failed: no connected relays', { did });\n return null;\n }\n\n logger.debug('Resolved DID to relay', { did, relay: relays[0] });\n return { relayUrl: relays[0] };\n } catch (error) {\n logger.warn('Failed to resolve DID', { did, error });\n return null;\n }\n },\n\n queryRelayPeers: async () => {\n // Return connected relay URLs\n return client.getConnectedRelays();\n },\n };\n}\n","/**\n * Search Index for Agent Discovery\n *\n * Maintains a local index of discovered agents for fast semantic search\n */\n\nimport lunr from 'lunr';\nimport Fuse from 'fuse.js';\nimport type { AgentCard } from './agent-card-types.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('search-index');\n\n/**\n * Semantic Query Interface\n */\nexport interface SemanticQuery {\n text?: string; // Natural language: \"translate Japanese\"\n capability?: string; // Structured: \"translate\"\n filters?: {\n language?: string;\n minTrustScore?: number;\n maxCost?: number;\n tags?: string[];\n };\n limit?: number;\n}\n\n/**\n * Search Result with Score\n */\nexport interface SearchResult {\n card: AgentCard;\n score: number;\n}\n\n/**\n * Search Index Implementation\n */\nexport class SearchIndex {\n private cards = new Map<string, AgentCard>();\n private lunrIndex?: lunr.Index;\n private fuse?: Fuse<AgentCard>;\n private needsRebuild = false;\n\n /**\n * Add or update an Agent Card in the index\n */\n indexAgentCard(card: AgentCard): void {\n this.cards.set(card.did, card);\n this.needsRebuild = true;\n logger.debug('Indexed Agent Card', { did: card.did, capabilities: card.capabilities.length });\n }\n\n /**\n * Remove an Agent Card from the index\n */\n removeAgentCard(did: string): void {\n this.cards.delete(did);\n this.needsRebuild = true;\n logger.debug('Removed Agent Card from index', { did });\n }\n\n /**\n * Search for agents matching a query\n */\n search(query: SemanticQuery): SearchResult[] {\n if (this.needsRebuild) {\n this.rebuild();\n }\n\n let results: SearchResult[] = [];\n\n // Text search using Lunr\n if (query.text && this.lunrIndex) {\n results = this.searchByText(query.text);\n }\n // Capability search using Fuse\n else if (query.capability && this.fuse) {\n results = this.searchByCapability(query.capability);\n }\n // No query - return all\n else {\n results = Array.from(this.cards.values()).map(card => ({\n card,\n score: 1.0,\n }));\n }\n\n // Apply filters\n if (query.filters) {\n results = this.applyFilters(results, query.filters);\n }\n\n // Sort by score (descending)\n results.sort((a, b) => b.score - a.score);\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n logger.debug('Search completed', { query, results: results.length });\n return results;\n }\n\n /**\n * Get all indexed cards\n */\n getAllCards(): AgentCard[] {\n return Array.from(this.cards.values());\n }\n\n /**\n * Clear the index\n */\n clear(): void {\n this.cards.clear();\n this.lunrIndex = undefined;\n this.fuse = undefined;\n this.needsRebuild = false;\n logger.info('Search index cleared');\n }\n\n /**\n * Get index size\n */\n size(): number {\n return this.cards.size;\n }\n\n /**\n * Rebuild search indexes\n */\n private rebuild(): void {\n logger.info('Rebuilding search indexes', { cards: this.cards.size });\n\n const cards = Array.from(this.cards.values());\n\n // Build Lunr index for full-text search\n this.lunrIndex = lunr(function (this: lunr.Builder) {\n this.ref('did');\n this.field('name', { boost: 10 });\n this.field('description', { boost: 5 });\n this.field('capabilities');\n\n for (const card of cards) {\n this.add({\n did: card.did,\n name: card.name,\n description: card.description,\n capabilities: card.capabilities\n .map((cap: any) => `${cap.name} ${cap.description}`)\n .join(' '),\n });\n }\n });\n\n // Build Fuse index for fuzzy matching\n this.fuse = new Fuse(Array.from(this.cards.values()), {\n keys: [\n { name: 'name', weight: 0.3 },\n { name: 'description', weight: 0.2 },\n { name: 'capabilities.name', weight: 0.3 },\n { name: 'capabilities.description', weight: 0.2 },\n ],\n threshold: 0.4,\n includeScore: true,\n });\n\n this.needsRebuild = false;\n logger.info('Search indexes rebuilt');\n }\n\n /**\n * Search by text using Lunr\n */\n private searchByText(text: string): SearchResult[] {\n if (!this.lunrIndex) return [];\n\n const lunrResults = this.lunrIndex.search(text);\n return lunrResults.map(result => ({\n card: this.cards.get(result.ref)!,\n score: result.score,\n }));\n }\n\n /**\n * Search by capability using Fuse\n */\n private searchByCapability(capability: string): SearchResult[] {\n if (!this.fuse) return [];\n\n const fuseResults = this.fuse.search(capability);\n return fuseResults.map(result => ({\n card: result.item,\n score: 1 - (result.score || 0), // Fuse score is distance, convert to similarity\n }));\n }\n\n /**\n * Apply filters to search results\n */\n private applyFilters(\n results: SearchResult[],\n filters: NonNullable<SemanticQuery['filters']>\n ): SearchResult[] {\n return results.filter(result => {\n const { card } = result;\n\n // Trust score filter\n if (filters.minTrustScore !== undefined && card.trust) {\n const overallTrust =\n card.trust.interactionScore * 0.4 +\n Math.min(card.trust.endorsements / 10, 1) * 0.2 +\n card.trust.completionRate * 0.2 +\n card.trust.uptime * 0.2;\n\n if (overallTrust < filters.minTrustScore) {\n return false;\n }\n }\n\n // Language filter (check capability metadata)\n if (filters.language) {\n const hasLanguage = card.capabilities.some(\n cap => {\n const metadata = cap.metadata as Record<string, any> | undefined;\n if (!metadata) return false;\n return metadata.language === filters.language ||\n (Array.isArray(metadata.languages) && metadata.languages.includes(filters.language));\n }\n );\n if (!hasLanguage) return false;\n }\n\n // Tags filter\n if (filters.tags && filters.tags.length > 0) {\n const cardTags = Array.isArray(card.metadata?.tags) ? (card.metadata.tags as string[]) : [];\n const hasAllTags = filters.tags.every(tag => cardTags.includes(tag));\n if (!hasAllTags) return false;\n }\n\n return true;\n });\n }\n}\n","/**\n * Capability Matcher\n *\n * Matches semantic queries against agent capabilities\n */\n\nimport type { Capability } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\n\n/**\n * Capability Matcher\n */\nexport class CapabilityMatcher {\n /**\n * Match a query against a capability\n * Returns a score between 0 and 1\n */\n match(query: SemanticQuery, capability: Capability): number {\n let score = 0;\n let weights = 0;\n\n // Exact capability ID match\n if (query.capability && capability.id === query.capability) {\n return 1.0;\n }\n\n // Fuzzy capability name match\n if (query.capability) {\n const nameScore = this.fuzzyMatch(query.capability, capability.name);\n score += nameScore * 0.4;\n weights += 0.4;\n }\n\n // Text keyword match\n if (query.text) {\n const keywords = this.extractKeywords(query.text);\n const keywordScore = this.matchKeywords(keywords, capability);\n score += keywordScore * 0.4;\n weights += 0.4;\n }\n\n // Type hierarchy match\n if (query.capability && capability['@type']) {\n const typeScore = this.matchesType(query.capability, capability['@type']) ? 0.6 : 0;\n score += typeScore * 0.2;\n weights += 0.2;\n }\n\n return weights > 0 ? score / weights : 0;\n }\n\n /**\n * Extract keywords from natural language text\n */\n extractKeywords(text: string): string[] {\n // Remove common stop words\n const stopWords = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been',\n 'to', 'from', 'in', 'on', 'at', 'by', 'for', 'with', 'about',\n 'can', 'could', 'should', 'would', 'will', 'do', 'does', 'did',\n 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her',\n ]);\n\n return text\n .toLowerCase()\n .split(/\\W+/)\n .filter(word => word.length > 2 && !stopWords.has(word));\n }\n\n /**\n * Match keywords against capability\n */\n matchKeywords(keywords: string[], capability: Capability): number {\n if (keywords.length === 0) return 0;\n\n const capText = `${capability.name} ${capability.description}`.toLowerCase();\n const matches = keywords.filter(keyword => capText.includes(keyword));\n\n return matches.length / keywords.length;\n }\n\n /**\n * Check if query matches capability type hierarchy\n */\n matchesType(query: string, type: string): boolean {\n const queryLower = query.toLowerCase();\n const typeLower = type.toLowerCase();\n\n // Direct match\n if (typeLower.includes(queryLower)) return true;\n\n // Common type mappings\n const typeMap: Record<string, string[]> = {\n translate: ['translation', 'translationservice'],\n review: ['codereview', 'reviewservice'],\n analyze: ['analysis', 'dataanalysis'],\n generate: ['generation', 'textgeneration', 'imagegeneration'],\n search: ['searchservice', 'query'],\n compute: ['computation', 'computationservice'],\n store: ['storage', 'storageservice'],\n message: ['messaging', 'messagingservice'],\n auth: ['authentication', 'authenticationservice'],\n };\n\n for (const [key, values] of Object.entries(typeMap)) {\n if (queryLower.includes(key) && values.some(v => typeLower.includes(v))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Fuzzy string matching using Levenshtein distance\n */\n private fuzzyMatch(query: string, target: string): number {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Exact match\n if (queryLower === targetLower) return 1.0;\n\n // Substring match\n if (targetLower.includes(queryLower)) return 0.8;\n if (queryLower.includes(targetLower)) return 0.7;\n\n // Levenshtein distance\n const distance = this.levenshteinDistance(queryLower, targetLower);\n const maxLen = Math.max(queryLower.length, targetLower.length);\n const similarity = 1 - distance / maxLen;\n\n // Only return positive scores for reasonable similarity\n return similarity > 0.5 ? similarity * 0.6 : 0;\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n }\n}\n","/**\n * Semantic Search Engine\n *\n * Provides intelligent agent discovery through semantic search\n * with local-first strategy and network fallback\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport { SearchIndex } from './search-index.js';\nimport type { SemanticQuery, SearchResult } from './search-index.js';\nimport { CapabilityMatcher } from './capability-matcher.js';\nimport type { DHTOperations } from './dht.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('semantic-search');\n\n/**\n * Semantic Search Engine\n */\nexport class SemanticSearchEngine {\n private index: SearchIndex;\n private matcher: CapabilityMatcher;\n\n constructor(private dht?: DHTOperations) {\n this.index = new SearchIndex();\n this.matcher = new CapabilityMatcher();\n }\n\n /**\n * Main search interface\n * Local-first with network fallback\n */\n async search(query: SemanticQuery): Promise<AgentCard[]> {\n logger.info('Searching for agents', { query });\n\n // 1. Search local index\n const localResults = this.index.search(query);\n logger.debug('Local search results', { count: localResults.length });\n\n // 2. If insufficient results, query network\n const limit = query.limit || 10;\n if (localResults.length < limit && this.dht) {\n logger.debug('Insufficient local results, querying network');\n const networkResults = await this.searchNetwork(query);\n return this.mergeResults(localResults, networkResults, limit);\n }\n\n return localResults.map(r => r.card);\n }\n\n /**\n * Index an Agent Card for local search\n */\n indexAgentCard(card: AgentCard): void {\n this.index.indexAgentCard(card);\n }\n\n /**\n * Remove an Agent Card from local index\n */\n removeAgentCard(did: string): void {\n this.index.removeAgentCard(did);\n }\n\n /**\n * Get all indexed cards\n */\n getAllIndexedCards(): AgentCard[] {\n return this.index.getAllCards();\n }\n\n /**\n * Clear local index\n */\n clearIndex(): void {\n this.index.clear();\n }\n\n /**\n * Get index size\n */\n getIndexSize(): number {\n return this.index.size();\n }\n\n /**\n * Search network via DHT\n */\n private async searchNetwork(query: SemanticQuery): Promise<SearchResult[]> {\n if (!this.dht) {\n return [];\n }\n\n try {\n // For now, use capability-based DHT query\n // In future, implement distributed semantic search overlay\n const capability = query.capability || this.extractPrimaryCapability(query.text);\n\n if (!capability) {\n logger.debug('No capability extracted from query, skipping network search');\n return [];\n }\n\n const cards = await this.dht.queryByCapability(capability);\n logger.debug('Network search results', { count: cards.length });\n\n // Score network results\n return cards.map(card => {\n const score = this.scoreCard(card, query);\n return { card, score };\n });\n } catch (error) {\n logger.error('Network search failed', { error });\n return [];\n }\n }\n\n /**\n * Merge local and network results, removing duplicates\n */\n private mergeResults(\n local: SearchResult[],\n network: SearchResult[],\n limit: number\n ): AgentCard[] {\n const seen = new Set<string>();\n const merged: SearchResult[] = [];\n\n // Add local results first (they're already scored and sorted)\n for (const result of local) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n }\n }\n\n // Add network results\n for (const result of network) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n\n // Also index for future searches\n this.index.indexAgentCard(result.card);\n }\n }\n\n // Sort by score and apply limit\n merged.sort((a, b) => b.score - a.score);\n return merged.slice(0, limit).map(r => r.card);\n }\n\n /**\n * Score a card against a query\n */\n private scoreCard(card: AgentCard, query: SemanticQuery): number {\n let totalScore = 0;\n let count = 0;\n\n for (const capability of card.capabilities) {\n const score = this.matcher.match(query, capability);\n if (score > 0) {\n totalScore += score;\n count++;\n }\n }\n\n // Average score across matching capabilities\n const avgScore = count > 0 ? totalScore / count : 0;\n\n // Boost by trust score if available\n if (card.trust) {\n const trustBoost = card.trust.interactionScore * 0.2;\n return Math.min(avgScore + trustBoost, 1.0);\n }\n\n return avgScore;\n }\n\n /**\n * Extract primary capability from natural language text\n */\n private extractPrimaryCapability(text?: string): string | undefined {\n if (!text) return undefined;\n\n const keywords = this.matcher.extractKeywords(text);\n\n // Common capability keywords\n const capabilityKeywords = [\n 'translate', 'translation',\n 'review', 'code',\n 'analyze', 'analysis',\n 'generate', 'generation',\n 'search', 'query',\n 'compute', 'calculation',\n 'store', 'storage',\n 'message', 'messaging',\n 'auth', 'authentication',\n ];\n\n // Find first matching keyword\n for (const keyword of keywords) {\n if (capabilityKeywords.includes(keyword)) {\n return keyword;\n }\n }\n\n // Return first keyword as fallback\n return keywords[0];\n }\n}\n\n/**\n * Create a semantic search engine\n */\nexport function createSemanticSearch(dht?: DHTOperations): SemanticSearchEngine {\n return new SemanticSearchEngine(dht);\n}\n","import { MessagingError } from '../utils/errors.js';\n\nexport interface MessageEnvelope {\n id: string;\n from: string; // DID\n to: string; // DID\n type: 'request' | 'response' | 'notification';\n protocol: string;\n payload: unknown;\n timestamp: number;\n signature: string;\n replyTo?: string; // For responses, the ID of the request\n}\n\n/**\n * Create a message envelope\n */\nexport function createEnvelope(\n from: string,\n to: string,\n type: 'request' | 'response' | 'notification',\n protocol: string,\n payload: unknown,\n replyTo?: string\n): Omit<MessageEnvelope, 'signature'> {\n return {\n id: generateMessageId(),\n from,\n to,\n type,\n protocol,\n payload,\n timestamp: Date.now(),\n replyTo,\n };\n}\n\n/**\n * Sign a message envelope\n */\nexport async function signEnvelope(\n envelope: Omit<MessageEnvelope, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<MessageEnvelope> {\n try {\n const envelopeJson = JSON.stringify(envelope);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signature = await signFn(envelopeBytes);\n\n return {\n ...envelope,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new MessagingError('Failed to sign envelope', error);\n }\n}\n\n/**\n * Verify a message envelope signature\n */\nexport async function verifyEnvelope(\n envelope: MessageEnvelope,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const envelopeJson = JSON.stringify(envelopeWithoutSig);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, envelopeBytes);\n } catch (error) {\n throw new MessagingError('Failed to verify envelope', error);\n }\n}\n\n/**\n * Validate message envelope structure\n */\nexport function validateEnvelope(msg: unknown): msg is MessageEnvelope {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const m = msg as Partial<MessageEnvelope>;\n\n return (\n typeof m.id === 'string' &&\n typeof m.from === 'string' &&\n m.from.startsWith('did:clawiverse:') &&\n typeof m.to === 'string' &&\n m.to.startsWith('did:clawiverse:') &&\n (m.type === 'request' || m.type === 'response' || m.type === 'notification') &&\n typeof m.protocol === 'string' &&\n m.payload !== undefined &&\n typeof m.timestamp === 'number' &&\n typeof m.signature === 'string'\n );\n}\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n","import { encode, decode } from 'cbor-x';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessagingError } from '../utils/errors.js';\n\n/**\n * Encode a message envelope to CBOR\n */\nexport function encodeMessage(envelope: MessageEnvelope): Uint8Array {\n try {\n return encode(envelope);\n } catch (error) {\n throw new MessagingError('Failed to encode message', error);\n }\n}\n\n/**\n * Decode a CBOR message to envelope\n */\nexport function decodeMessage(data: Uint8Array): MessageEnvelope {\n try {\n return decode(data) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message', error);\n }\n}\n\n/**\n * Encode message to JSON (for debugging/logging)\n */\nexport function encodeMessageJSON(envelope: MessageEnvelope): string {\n try {\n return JSON.stringify(envelope, null, 2);\n } catch (error) {\n throw new MessagingError('Failed to encode message to JSON', error);\n }\n}\n\n/**\n * Decode JSON message to envelope\n */\nexport function decodeMessageJSON(json: string): MessageEnvelope {\n try {\n return JSON.parse(json) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message from JSON', error);\n }\n}\n","import type { MessageEnvelope } from './envelope.js';\nimport type { RelayClient } from '../transport/relay-client.js';\nimport { encodeMessage, decodeMessage } from './codec.js';\nimport { validateEnvelope, verifyEnvelope } from './envelope.js';\nimport { createLogger } from '../utils/logger.js';\nimport { MessagingError } from '../utils/errors.js';\nimport { extractPublicKey } from '../identity/did.js';\nimport { verify } from '../identity/keys.js';\n\nconst logger = createLogger('router');\n\nexport type MessageHandler = (\n envelope: MessageEnvelope\n) => Promise<MessageEnvelope | void>;\n\nexport interface MessageRouter {\n registerHandler: (protocol: string, handler: MessageHandler) => void;\n unregisterHandler: (protocol: string) => void;\n registerCatchAllHandler: (handler: MessageHandler) => void;\n sendMessage: (envelope: MessageEnvelope) => Promise<MessageEnvelope | void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\n/**\n * Create a message router using relay client (CVP-0011)\n */\nexport function createMessageRouter(\n relayClient: RelayClient,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): MessageRouter {\n const handlers = new Map<string, MessageHandler>();\n let catchAllHandler: MessageHandler | undefined;\n\n // Map to track pending requests waiting for responses\n const pendingRequests = new Map<string, {\n resolve: (envelope: MessageEnvelope | undefined) => void;\n timeout: NodeJS.Timeout;\n }>();\n\n return {\n registerHandler: (protocol: string, handler: MessageHandler) => {\n handlers.set(protocol, handler);\n logger.info('Registered message handler', { protocol });\n },\n\n unregisterHandler: (protocol: string) => {\n handlers.delete(protocol);\n logger.info('Unregistered message handler', { protocol });\n },\n\n registerCatchAllHandler: (handler: MessageHandler) => {\n catchAllHandler = handler;\n logger.info('Registered catch-all message handler');\n },\n\n sendMessage: async (envelope: MessageEnvelope) => {\n try {\n if (!validateEnvelope(envelope)) {\n throw new MessagingError('Invalid message envelope');\n }\n\n const encoded = encodeMessage(envelope);\n await relayClient.sendEnvelope(envelope.to, encoded);\n\n logger.info('Message sent via relay', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n });\n\n // If this is a request, wait for response\n if (envelope.type === 'request') {\n logger.debug('Waiting for response to request', { id: envelope.id });\n\n const RESPONSE_TIMEOUT = 30000; // 30 seconds (CVP-0010 §4.2)\n\n return new Promise<MessageEnvelope | undefined>((resolve) => {\n const timeout = setTimeout(() => {\n pendingRequests.delete(envelope.id);\n logger.warn('Response timeout', { id: envelope.id, timeout: RESPONSE_TIMEOUT });\n resolve(undefined);\n }, RESPONSE_TIMEOUT);\n\n pendingRequests.set(envelope.id, { resolve, timeout });\n });\n }\n\n return undefined;\n } catch (error) {\n if (error instanceof MessagingError) throw error;\n throw new MessagingError('Failed to send message', error);\n }\n },\n\n start: async () => {\n // Register handler for incoming DELIVER messages\n relayClient.onDeliver(async (deliverMsg) => {\n try {\n const envelope = decodeMessage(deliverMsg.envelope);\n\n if (!validateEnvelope(envelope)) {\n logger.warn('Received invalid message envelope');\n return;\n }\n\n // Verify signature against sender DID embedded public key\n const isValidSignature = await verifyEnvelope(envelope, async (signature, data) => {\n const senderPublicKey = extractPublicKey(envelope.from);\n return verify(signature, data, senderPublicKey);\n });\n if (!isValidSignature) {\n logger.warn('Received message with invalid signature', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n\n // Optional caller-supplied verification hook (e.g. policy checks)\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const dataBytes = new TextEncoder().encode(JSON.stringify(envelopeWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const hookValid = await verifyFn(signatureBytes, dataBytes);\n if (!hookValid) {\n logger.warn('Message rejected by custom verifier', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n } catch (error) {\n logger.warn('Custom verification hook failed', {\n id: envelope.id,\n from: envelope.from,\n error: (error as Error).message,\n });\n return;\n }\n\n logger.info('Received message', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n type: envelope.type,\n });\n\n // Check if this is a response to a pending request\n if (envelope.type === 'response' && envelope.replyTo) {\n const pending = pendingRequests.get(envelope.replyTo);\n if (pending) {\n clearTimeout(pending.timeout);\n pendingRequests.delete(envelope.replyTo);\n pending.resolve(envelope);\n logger.info('Matched response to pending request', {\n requestId: envelope.replyTo,\n responseId: envelope.id,\n });\n return;\n }\n }\n\n // Dispatch to handler\n const handler = handlers.get(envelope.protocol);\n let response: MessageEnvelope | void = undefined;\n\n if (handler) {\n response = await handler(envelope);\n } else if (catchAllHandler) {\n logger.debug('Using catch-all handler for protocol', { protocol: envelope.protocol });\n response = await catchAllHandler(envelope);\n } else {\n logger.warn('No handler for protocol', { protocol: envelope.protocol });\n }\n\n // Send response back if handler returned one\n if (response) {\n const encoded = encodeMessage(response);\n await relayClient.sendEnvelope(response.to, encoded);\n logger.info('Sent response back to sender', {\n responseId: response.id,\n replyTo: response.replyTo,\n });\n }\n } catch (error) {\n logger.error('Error handling incoming message', error);\n }\n });\n\n logger.info('Message router started');\n },\n\n stop: async () => {\n // Clear all pending requests\n for (const [, pending] of pendingRequests.entries()) {\n clearTimeout(pending.timeout);\n pending.resolve(undefined);\n }\n pendingRequests.clear();\n\n handlers.clear();\n catchAllHandler = undefined;\n logger.info('Message router stopped');\n },\n };\n}\n","/**\n * Message Storage - LevelDB operations for message queue\n *\n * Key schema:\n * msg:inbound:{timestamp}:{id} → StoredMessage\n * msg:outbound:{timestamp}:{id} → StoredMessage\n * block:{did} → BlocklistEntry\n * allow:{did} → AllowlistEntry\n * seen:{messageId} → SeenEntry\n * rate:{did} → RateLimitState\n * idx:from:{did}:{timestamp}:{id} → '1'\n */\n\nimport { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\nimport type {\n StoredMessage,\n BlocklistEntry,\n AllowlistEntry,\n SeenEntry,\n RateLimitState,\n MessageFilter,\n PaginationOptions,\n MessagePage,\n} from './types.js';\n\nconst logger = createLogger('message-storage');\n\nexport class MessageStorage {\n private db: Level<string, any>;\n private ready = false;\n\n constructor(dbPath: string) {\n this.db = new Level<string, any>(dbPath, { valueEncoding: 'json' });\n }\n\n async open(): Promise<void> {\n await this.db.open();\n this.ready = true;\n logger.info('Message storage opened');\n }\n\n async close(): Promise<void> {\n if (this.ready) {\n await this.db.close();\n this.ready = false;\n logger.info('Message storage closed');\n }\n }\n\n // ─── Message Operations ───────────────────────────────────────────────────\n\n async putMessage(msg: StoredMessage): Promise<void> {\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${msg.envelope.id}`;\n await this.db.put(key, msg);\n\n // Secondary index by sender\n const idxKey = `idx:from:${msg.envelope.from}:${ts}:${msg.envelope.id}`;\n await this.db.put(idxKey, '1');\n }\n\n async getMessage(id: string): Promise<StoredMessage | null> {\n // Scan both directions since we don't know the timestamp\n for (const direction of ['inbound', 'outbound'] as const) {\n const prefix = `msg:${direction}:`;\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n valueEncoding: 'json',\n })) {\n if (value.envelope.id === id) return value;\n }\n }\n return null;\n }\n\n async updateMessage(id: string, updates: Partial<StoredMessage>): Promise<void> {\n const msg = await this.getMessage(id);\n if (!msg) return;\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${id}`;\n await this.db.put(key, { ...msg, ...updates });\n }\n\n async deleteMessage(id: string): Promise<void> {\n const msg = await this.getMessage(id);\n if (!msg) return;\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${id}`;\n const idxKey = `idx:from:${msg.envelope.from}:${ts}:${id}`;\n await this.db.batch([\n { type: 'del', key },\n { type: 'del', key: idxKey },\n ]);\n }\n\n async queryMessages(\n direction: 'inbound' | 'outbound',\n filter: MessageFilter = {},\n pagination: PaginationOptions = {}\n ): Promise<MessagePage> {\n const { limit = 50, offset = 0 } = pagination;\n const prefix = `msg:${direction}:`;\n const results: StoredMessage[] = [];\n let total = 0;\n let skipped = 0;\n\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n reverse: true, // newest first\n valueEncoding: 'json',\n })) {\n if (!this.matchesFilter(value, filter)) continue;\n total++;\n if (skipped < offset) { skipped++; continue; }\n if (results.length < limit) results.push(value);\n }\n\n return {\n messages: results,\n total,\n hasMore: total > offset + results.length,\n };\n }\n\n private matchesFilter(msg: StoredMessage, filter: MessageFilter): boolean {\n if (filter.fromDid) {\n const froms = Array.isArray(filter.fromDid) ? filter.fromDid : [filter.fromDid];\n if (!froms.includes(msg.envelope.from)) return false;\n }\n if (filter.toDid) {\n const tos = Array.isArray(filter.toDid) ? filter.toDid : [filter.toDid];\n if (!tos.includes(msg.envelope.to)) return false;\n }\n if (filter.protocol) {\n const protos = Array.isArray(filter.protocol) ? filter.protocol : [filter.protocol];\n if (!protos.includes(msg.envelope.protocol)) return false;\n }\n if (filter.type && msg.envelope.type !== filter.type) return false;\n if (filter.unreadOnly && msg.readAt != null) return false;\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n if (!statuses.includes(msg.status)) return false;\n }\n if (filter.maxAge) {\n const age = Date.now() - (msg.receivedAt ?? msg.sentAt ?? 0);\n if (age > filter.maxAge) return false;\n }\n if (filter.minTrustScore != null && (msg.trustScore ?? 0) < filter.minTrustScore) return false;\n return true;\n }\n\n async countMessages(direction: 'inbound' | 'outbound', filter: MessageFilter = {}): Promise<number> {\n const prefix = `msg:${direction}:`;\n let count = 0;\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n valueEncoding: 'json',\n })) {\n if (this.matchesFilter(value, filter)) count++;\n }\n return count;\n }\n\n // ─── Blocklist ────────────────────────────────────────────────────────────\n\n async putBlock(entry: BlocklistEntry): Promise<void> {\n await this.db.put(`block:${entry.did}`, entry);\n }\n\n async getBlock(did: string): Promise<BlocklistEntry | null> {\n try {\n return await this.db.get(`block:${did}`);\n } catch {\n return null;\n }\n }\n\n async deleteBlock(did: string): Promise<void> {\n try { await this.db.del(`block:${did}`); } catch { /* not found */ }\n }\n\n async listBlocked(): Promise<BlocklistEntry[]> {\n const results: BlocklistEntry[] = [];\n for await (const [, value] of this.db.iterator<string, BlocklistEntry>({\n gte: 'block:',\n lte: 'block:\\xff',\n valueEncoding: 'json',\n })) {\n results.push(value);\n }\n return results;\n }\n\n // ─── Allowlist ────────────────────────────────────────────────────────────\n\n async putAllow(entry: AllowlistEntry): Promise<void> {\n await this.db.put(`allow:${entry.did}`, entry);\n }\n\n async getAllow(did: string): Promise<AllowlistEntry | null> {\n try {\n return await this.db.get(`allow:${did}`);\n } catch {\n return null;\n }\n }\n\n async deleteAllow(did: string): Promise<void> {\n try { await this.db.del(`allow:${did}`); } catch { /* not found */ }\n }\n\n async listAllowed(): Promise<AllowlistEntry[]> {\n const results: AllowlistEntry[] = [];\n for await (const [, value] of this.db.iterator<string, AllowlistEntry>({\n gte: 'allow:',\n lte: 'allow:\\xff',\n valueEncoding: 'json',\n })) {\n results.push(value);\n }\n return results;\n }\n\n // ─── Seen Cache ───────────────────────────────────────────────────────────\n\n async putSeen(entry: SeenEntry): Promise<void> {\n await this.db.put(`seen:${entry.messageId}`, entry);\n }\n\n async getSeen(messageId: string): Promise<SeenEntry | null> {\n try {\n return await this.db.get(`seen:${messageId}`);\n } catch {\n return null;\n }\n }\n\n async cleanupSeen(maxAgeMs: number): Promise<void> {\n const cutoff = Date.now() - maxAgeMs;\n const toDelete: string[] = [];\n for await (const [key, value] of this.db.iterator<string, SeenEntry>({\n gte: 'seen:',\n lte: 'seen:\\xff',\n valueEncoding: 'json',\n })) {\n if (value.seenAt < cutoff) toDelete.push(key);\n }\n await this.db.batch(toDelete.map((key) => ({ type: 'del' as const, key })));\n }\n\n // ─── Rate Limit State ─────────────────────────────────────────────────────\n\n async putRateLimit(state: RateLimitState): Promise<void> {\n await this.db.put(`rate:${state.did}`, state);\n }\n\n async getRateLimit(did: string): Promise<RateLimitState | null> {\n try {\n return await this.db.get(`rate:${did}`);\n } catch {\n return null;\n }\n }\n\n async cleanupRateLimits(maxAgeMs: number): Promise<void> {\n const cutoff = Date.now() - maxAgeMs;\n const toDelete: string[] = [];\n for await (const [key, value] of this.db.iterator<string, RateLimitState>({\n gte: 'rate:',\n lte: 'rate:\\xff',\n valueEncoding: 'json',\n })) {\n if (value.lastRefill < cutoff) toDelete.push(key);\n }\n await this.db.batch(toDelete.map((key) => ({ type: 'del' as const, key })));\n }\n}\n","/**\n * Message Queue\n *\n * Persistent inbox/outbox backed by LevelDB.\n * Supports real-time subscriptions and pagination.\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessageStorage } from './storage.js';\nimport type {\n StoredMessage,\n MessageFilter,\n PaginationOptions,\n MessagePage,\n MessageCallback,\n SubscriptionFilter,\n QueueStats,\n} from './types.js';\n\nconst logger = createLogger('message-queue');\n\nexport interface MessageQueueConfig {\n dbPath: string;\n}\n\ninterface Subscription {\n id: string;\n filter: SubscriptionFilter;\n callback: MessageCallback;\n}\n\nexport class MessageQueue {\n private storage: MessageStorage;\n private subscriptions = new Map<string, Subscription>();\n private subCounter = 0;\n\n constructor(config: MessageQueueConfig) {\n this.storage = new MessageStorage(config.dbPath);\n }\n\n get store(): MessageStorage {\n return this.storage;\n }\n\n async start(): Promise<void> {\n await this.storage.open();\n logger.info('Message queue started');\n }\n\n async stop(): Promise<void> {\n await this.storage.close();\n this.subscriptions.clear();\n logger.info('Message queue stopped');\n }\n\n // ─── Inbox ────────────────────────────────────────────────────────────────\n\n async getInbox(filter: MessageFilter = {}, pagination: PaginationOptions = {}): Promise<MessagePage> {\n return this.storage.queryMessages('inbound', filter, pagination);\n }\n\n async getMessage(id: string): Promise<StoredMessage | null> {\n return this.storage.getMessage(id);\n }\n\n async markAsRead(id: string): Promise<void> {\n await this.storage.updateMessage(id, { readAt: Date.now() });\n }\n\n async deleteMessage(id: string): Promise<void> {\n await this.storage.deleteMessage(id);\n }\n\n // ─── Outbox ───────────────────────────────────────────────────────────────\n\n async getOutbox(pagination: PaginationOptions = {}): Promise<MessagePage> {\n return this.storage.queryMessages('outbound', {}, pagination);\n }\n\n async retryMessage(id: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'pending', error: undefined });\n }\n\n // ─── Enqueue ──────────────────────────────────────────────────────────────\n\n async enqueueInbound(envelope: MessageEnvelope, trustScore?: number): Promise<StoredMessage> {\n const msg: StoredMessage = {\n envelope,\n direction: 'inbound',\n status: 'pending',\n receivedAt: Date.now(),\n trustScore,\n };\n await this.storage.putMessage(msg);\n logger.debug('Enqueued inbound message', { id: envelope.id, from: envelope.from });\n this.notifySubscribers(msg);\n return msg;\n }\n\n async enqueueOutbound(envelope: MessageEnvelope): Promise<StoredMessage> {\n const msg: StoredMessage = {\n envelope,\n direction: 'outbound',\n status: 'pending',\n sentAt: Date.now(),\n };\n await this.storage.putMessage(msg);\n logger.debug('Enqueued outbound message', { id: envelope.id, to: envelope.to });\n return msg;\n }\n\n async markOutboundDelivered(id: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'delivered' });\n }\n\n async markOutboundFailed(id: string, error: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'failed', error });\n }\n\n // ─── Subscriptions ────────────────────────────────────────────────────────\n\n subscribe(filter: SubscriptionFilter, callback: MessageCallback): string {\n const id = `sub_${++this.subCounter}`;\n this.subscriptions.set(id, { id, filter, callback });\n logger.debug('Subscription added', { id });\n return id;\n }\n\n unsubscribe(subscriptionId: string): void {\n this.subscriptions.delete(subscriptionId);\n logger.debug('Subscription removed', { id: subscriptionId });\n }\n\n private notifySubscribers(msg: StoredMessage): void {\n for (const sub of this.subscriptions.values()) {\n if (this.matchesSubscriptionFilter(msg, sub.filter)) {\n Promise.resolve(sub.callback(msg)).catch((err) => {\n logger.warn('Subscription callback error', { id: sub.id, error: (err as Error).message });\n });\n }\n }\n }\n\n private matchesSubscriptionFilter(msg: StoredMessage, filter: SubscriptionFilter): boolean {\n if (filter.fromDid) {\n const froms = Array.isArray(filter.fromDid) ? filter.fromDid : [filter.fromDid];\n if (!froms.includes(msg.envelope.from)) return false;\n }\n if (filter.protocol) {\n const protos = Array.isArray(filter.protocol) ? filter.protocol : [filter.protocol];\n if (!protos.includes(msg.envelope.protocol)) return false;\n }\n if (filter.type && msg.envelope.type !== filter.type) return false;\n return true;\n }\n\n // ─── Stats ────────────────────────────────────────────────────────────────\n\n async getStats(): Promise<QueueStats> {\n const [inboxTotal, inboxUnread, outboxPending, outboxFailed, blocked, allowed] =\n await Promise.all([\n this.storage.countMessages('inbound'),\n this.storage.countMessages('inbound', { unreadOnly: true }),\n this.storage.countMessages('outbound', { status: 'pending' }),\n this.storage.countMessages('outbound', { status: 'failed' }),\n this.storage.listBlocked().then((l) => l.length),\n this.storage.listAllowed().then((l) => l.length),\n ]);\n\n return {\n inboxTotal,\n inboxUnread,\n outboxPending,\n outboxFailed,\n blockedAgents: blocked,\n allowedAgents: allowed,\n rateLimitedAgents: 0,\n };\n }\n}\n","/**\n * Token Bucket Rate Limiter\n *\n * Classic token bucket algorithm for per-sender rate limiting.\n * Tokens refill at a constant rate up to capacity.\n */\n\nexport interface TokenBucketConfig {\n capacity: number; // Max tokens (burst size)\n refillRate: number; // Tokens per millisecond\n}\n\nexport class TokenBucket {\n private tokens: number;\n private lastRefill: number;\n private readonly capacity: number;\n private readonly refillRate: number; // tokens per ms\n\n constructor(config: TokenBucketConfig, initialTokens?: number, lastRefill?: number) {\n this.capacity = config.capacity;\n this.refillRate = config.refillRate;\n this.tokens = initialTokens ?? config.capacity;\n this.lastRefill = lastRefill ?? Date.now();\n }\n\n /** Attempt to consume one token. Returns true if allowed. */\n consume(): boolean {\n this.refill();\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n return false;\n }\n\n getRemaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /** Milliseconds until at least one token is available */\n getResetTime(): number {\n this.refill();\n if (this.tokens >= 1) return 0;\n const needed = 1 - this.tokens;\n return Math.ceil(needed / this.refillRate);\n }\n\n /** Serialize state for persistence */\n toState(): { tokens: number; lastRefill: number } {\n return { tokens: this.tokens, lastRefill: this.lastRefill };\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n this.tokens = Math.min(this.capacity, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n\n/**\n * Rate limiter tiers based on trust score\n */\nexport interface RateLimitTiers {\n /** Trust < 0.3: new/unknown agents */\n newAgent: TokenBucketConfig;\n /** Trust 0.3–0.6: established agents */\n established: TokenBucketConfig;\n /** Trust > 0.6: trusted agents */\n trusted: TokenBucketConfig;\n}\n\nexport const DEFAULT_RATE_LIMIT_TIERS: RateLimitTiers = {\n newAgent: { capacity: 10, refillRate: 10 / (60 * 1000) }, // 10/min, burst 10\n established: { capacity: 100, refillRate: 60 / (60 * 1000) }, // 60/min, burst 100\n trusted: { capacity: 1000, refillRate: 600 / (60 * 1000) }, // 600/min, burst 1000\n};\n\nexport function getTierConfig(trustScore: number, tiers: RateLimitTiers): TokenBucketConfig {\n if (trustScore >= 0.6) return tiers.trusted;\n if (trustScore >= 0.3) return tiers.established;\n return tiers.newAgent;\n}\n","/**\n * Defense Middleware\n *\n * Checks incoming messages against:\n * 1. Allowlist bypass\n * 2. Blocklist rejection\n * 3. Deduplication (seen cache)\n * 4. Trust score filtering\n * 5. Rate limiting (token bucket, tiered by trust)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport type { MessageEnvelope } from './envelope.js';\nimport type { TrustSystem } from '../trust/index.js';\nimport type { MessageStorage } from './storage.js';\nimport type { DefenseResult, RateLimitResult } from './types.js';\nimport {\n TokenBucket,\n DEFAULT_RATE_LIMIT_TIERS,\n getTierConfig,\n type RateLimitTiers,\n} from './rate-limiter.js';\n\nconst logger = createLogger('defense');\n\nexport interface DefenseConfig {\n trustSystem: TrustSystem;\n storage: MessageStorage;\n /** Minimum trust score to accept messages (0 = accept all) */\n minTrustScore?: number;\n /** Auto-block agents below this score */\n autoBlockThreshold?: number;\n rateLimitTiers?: RateLimitTiers;\n /** TTL for seen-cache entries in ms (default: 1 hour) */\n seenTtlMs?: number;\n}\n\nexport class DefenseMiddleware {\n private readonly trust: TrustSystem;\n private readonly storage: MessageStorage;\n private readonly minTrustScore: number;\n private readonly autoBlockThreshold: number;\n private readonly tiers: RateLimitTiers;\n private readonly seenTtlMs: number;\n\n // In-memory LRU-style seen cache (backed by LevelDB for persistence)\n private readonly seenCache = new Map<string, number>(); // id → seenAt\n private readonly MAX_SEEN_CACHE = 10_000;\n\n // In-memory token buckets (backed by LevelDB for persistence)\n private readonly buckets = new Map<string, TokenBucket>();\n\n constructor(config: DefenseConfig) {\n this.trust = config.trustSystem;\n this.storage = config.storage;\n this.minTrustScore = config.minTrustScore ?? 0;\n this.autoBlockThreshold = config.autoBlockThreshold ?? 0.1;\n this.tiers = config.rateLimitTiers ?? DEFAULT_RATE_LIMIT_TIERS;\n this.seenTtlMs = config.seenTtlMs ?? 60 * 60 * 1000; // 1 hour\n }\n\n /**\n * Run all defense checks on an incoming message.\n * Returns { allowed: true } if the message should be processed,\n * or { allowed: false, reason } if it should be dropped.\n */\n async checkMessage(envelope: MessageEnvelope): Promise<DefenseResult> {\n const did = envelope.from;\n\n // 1. Allowlist bypass — skip all other checks\n if (await this.isAllowed(did)) {\n this.markAsSeen(envelope.id);\n return { allowed: true };\n }\n\n // 2. Blocklist check\n if (await this.isBlocked(did)) {\n logger.debug('Message rejected: blocked', { id: envelope.id, from: did });\n return { allowed: false, reason: 'blocked' };\n }\n\n // 3. Deduplication\n if (this.hasSeen(envelope.id)) {\n logger.debug('Message rejected: duplicate', { id: envelope.id });\n return { allowed: false, reason: 'duplicate' };\n }\n\n // 4. Trust score check\n let trustScore = 0;\n try {\n const score = await this.trust.getTrustScore(did);\n trustScore = score.interactionScore;\n\n // Auto-block very low trust agents\n if (trustScore < this.autoBlockThreshold && trustScore > 0) {\n logger.warn('Auto-blocking low-trust agent', { did, trustScore });\n await this.blockAgent(did, `Auto-blocked: trust score ${trustScore.toFixed(2)} below threshold`);\n return { allowed: false, reason: 'blocked' };\n }\n\n if (trustScore < this.minTrustScore) {\n logger.debug('Message rejected: trust too low', { id: envelope.id, trustScore });\n return { allowed: false, reason: 'trust_too_low', trustScore };\n }\n } catch (err) {\n logger.warn('Trust score lookup failed, using 0', { did, error: (err as Error).message });\n }\n\n // 5. Rate limiting (tiered by trust)\n const rateLimitResult = await this.checkRateLimit(did, trustScore);\n if (!rateLimitResult.allowed) {\n logger.debug('Message rejected: rate limited', {\n id: envelope.id,\n from: did,\n resetTime: rateLimitResult.resetTime,\n });\n return {\n allowed: false,\n reason: 'rate_limited',\n remainingTokens: rateLimitResult.remaining,\n resetTime: rateLimitResult.resetTime,\n };\n }\n\n // All checks passed\n this.markAsSeen(envelope.id);\n return { allowed: true, trustScore, remainingTokens: rateLimitResult.remaining };\n }\n\n // ─── Blocklist ────────────────────────────────────────────────────────────\n\n async blockAgent(did: string, reason: string, blockedBy = 'local'): Promise<void> {\n await this.storage.putBlock({ did, reason, blockedAt: Date.now(), blockedBy });\n logger.info('Agent blocked', { did, reason });\n }\n\n async unblockAgent(did: string): Promise<void> {\n await this.storage.deleteBlock(did);\n logger.info('Agent unblocked', { did });\n }\n\n async isBlocked(did: string): Promise<boolean> {\n return (await this.storage.getBlock(did)) !== null;\n }\n\n // ─── Allowlist ────────────────────────────────────────────────────────────\n\n async allowAgent(did: string, note?: string): Promise<void> {\n await this.storage.putAllow({ did, addedAt: Date.now(), note });\n logger.info('Agent allowlisted', { did });\n }\n\n async removeFromAllowlist(did: string): Promise<void> {\n await this.storage.deleteAllow(did);\n logger.info('Agent removed from allowlist', { did });\n }\n\n async isAllowed(did: string): Promise<boolean> {\n return (await this.storage.getAllow(did)) !== null;\n }\n\n // ─── Rate Limiting ────────────────────────────────────────────────────────\n\n async checkRateLimit(did: string, trustScore: number): Promise<RateLimitResult> {\n const tierConfig = getTierConfig(trustScore, this.tiers);\n\n // Load or create bucket\n let bucket = this.buckets.get(did);\n if (!bucket) {\n // Try to restore from LevelDB\n const persisted = await this.storage.getRateLimit(did);\n if (persisted) {\n bucket = new TokenBucket(tierConfig, persisted.tokens, persisted.lastRefill);\n } else {\n bucket = new TokenBucket(tierConfig);\n }\n this.buckets.set(did, bucket);\n }\n\n const allowed = bucket.consume();\n const state = bucket.toState();\n\n // Persist updated state\n await this.storage.putRateLimit({\n did,\n tokens: state.tokens,\n lastRefill: state.lastRefill,\n totalRequests: 0,\n firstSeen: Date.now(),\n });\n\n return {\n allowed,\n remaining: bucket.getRemaining(),\n resetTime: bucket.getResetTime(),\n limit: tierConfig.capacity,\n };\n }\n\n // ─── Seen Cache (deduplication) ───────────────────────────────────────────\n\n hasSeen(messageId: string): boolean {\n return this.seenCache.has(messageId);\n }\n\n markAsSeen(messageId: string): void {\n // Evict oldest entries if at capacity\n if (this.seenCache.size >= this.MAX_SEEN_CACHE) {\n const firstKey = this.seenCache.keys().next().value;\n if (firstKey) this.seenCache.delete(firstKey);\n }\n this.seenCache.set(messageId, Date.now());\n\n // Persist to LevelDB (fire-and-forget)\n this.storage.putSeen({ messageId, seenAt: Date.now(), fromDid: '' }).catch(() => {});\n }\n\n /** Periodic cleanup of expired seen entries */\n async cleanupSeen(): Promise<void> {\n const cutoff = Date.now() - this.seenTtlMs;\n for (const [id, seenAt] of this.seenCache) {\n if (seenAt < cutoff) this.seenCache.delete(id);\n }\n await this.storage.cleanupSeen(this.seenTtlMs);\n }\n\n /** Periodic cleanup of stale rate limit buckets (24h inactive) */\n async cleanupRateLimits(): Promise<void> {\n const staleMs = 24 * 60 * 60 * 1000;\n const cutoff = Date.now() - staleMs;\n for (const [did, bucket] of this.buckets) {\n if (bucket.toState().lastRefill < cutoff) this.buckets.delete(did);\n }\n await this.storage.cleanupRateLimits(staleMs);\n }\n}\n","/**\n * Trust Score System\n *\n * Tracks agent reputation based on interactions, endorsements,\n * and network behavior.\n */\n\n/**\n * Trust Score Metrics\n */\nexport interface TrustScore {\n interactionScore: number; // 0-1, based on successful interactions\n endorsements: number; // Count of endorsements\n completionRate: number; // % of completed tasks (0-1)\n responseTime: number; // Average response time (ms)\n uptime: number; // % of time online last 30 days (0-1)\n lastUpdated: number; // Timestamp\n}\n\n/**\n * Interaction Record\n */\nexport interface Interaction {\n agentDid: string;\n timestamp: number;\n type: 'message' | 'task' | 'query';\n success: boolean;\n responseTime: number;\n rating?: number; // 1-5 stars (optional user rating)\n feedback?: string;\n}\n\n/**\n * Interaction Statistics\n */\nexport interface InteractionStats {\n totalInteractions: number;\n successRate: number;\n avgResponseTime: number;\n lastInteraction: number;\n}\n\n/**\n * Trust Metrics Calculator\n */\nexport class TrustMetrics {\n /**\n * Calculate trust score from interaction history\n */\n calculateScore(stats: InteractionStats, endorsements: number, uptime: number): TrustScore {\n // Interaction score: weighted by success rate and volume\n const volumeWeight = Math.min(stats.totalInteractions / 100, 1); // Cap at 100 interactions\n const interactionScore = stats.successRate * volumeWeight;\n\n // Completion rate is same as success rate for now\n const completionRate = stats.successRate;\n\n return {\n interactionScore,\n endorsements,\n completionRate,\n responseTime: stats.avgResponseTime,\n uptime,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Calculate overall trust level (0-1)\n */\n calculateOverallTrust(score: TrustScore): number {\n // Weighted average of different factors\n const weights = {\n interaction: 0.4,\n endorsement: 0.2,\n completion: 0.2,\n uptime: 0.2,\n };\n\n const endorsementScore = Math.min(score.endorsements / 10, 1); // Cap at 10 endorsements\n\n return (\n score.interactionScore * weights.interaction +\n endorsementScore * weights.endorsement +\n score.completionRate * weights.completion +\n score.uptime * weights.uptime\n );\n }\n\n /**\n * Get trust level category\n */\n getTrustLevel(score: TrustScore): 'new' | 'low' | 'medium' | 'high' | 'trusted' {\n const overall = this.calculateOverallTrust(score);\n\n if (score.interactionScore === 0) return 'new';\n if (overall < 0.3) return 'low';\n if (overall < 0.6) return 'medium';\n if (overall < 0.8) return 'high';\n return 'trusted';\n }\n\n /**\n * Check if agent should be rate limited\n */\n shouldRateLimit(score: TrustScore, agentAge: number): boolean {\n const overall = this.calculateOverallTrust(score);\n const ONE_DAY = 24 * 60 * 60 * 1000;\n\n // New agents (< 24 hours) with low trust\n if (agentAge < ONE_DAY && overall < 0.3) {\n return true;\n }\n\n // Very low trust regardless of age\n if (overall < 0.1) {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Default trust score for new agents\n */\nexport function createDefaultTrustScore(): TrustScore {\n return {\n interactionScore: 0,\n endorsements: 0,\n completionRate: 0,\n responseTime: 0,\n uptime: 1.0, // Assume online initially\n lastUpdated: Date.now(),\n };\n}\n","/**\n * Interaction History Tracker\n *\n * Records and queries agent interaction history for trust scoring\n */\n\nimport { Level } from 'level';\nimport type { Interaction, InteractionStats } from './trust-score.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('interaction-history');\n\n/**\n * Interaction History Manager\n */\nexport class InteractionHistory {\n private db: Level<string, Interaction>;\n\n constructor(dbPath: string) {\n this.db = new Level(dbPath, { valueEncoding: 'json' });\n }\n\n /**\n * Open database connection\n */\n async open(): Promise<void> {\n await this.db.open();\n logger.info('Interaction history database opened', { path: this.db.location });\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await this.db.close();\n logger.info('Interaction history database closed');\n }\n\n /**\n * Record an interaction\n */\n async record(interaction: Interaction): Promise<void> {\n const key = `interaction:${interaction.agentDid}:${interaction.timestamp}`;\n await this.db.put(key, interaction);\n logger.debug('Recorded interaction', { agentDid: interaction.agentDid, type: interaction.type });\n }\n\n /**\n * Get interaction history for an agent\n */\n async getHistory(agentDid: string, limit = 100): Promise<Interaction[]> {\n const interactions: Interaction[] = [];\n const prefix = `interaction:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n limit,\n reverse: true, // Most recent first\n })) {\n interactions.push(value);\n }\n } catch (error) {\n logger.error('Failed to get interaction history', { agentDid, error });\n }\n\n return interactions;\n }\n\n /**\n * Get interaction statistics for an agent\n */\n async getStats(agentDid: string): Promise<InteractionStats> {\n const history = await this.getHistory(agentDid, 1000); // Last 1000 interactions\n\n if (history.length === 0) {\n return {\n totalInteractions: 0,\n successRate: 0,\n avgResponseTime: 0,\n lastInteraction: 0,\n };\n }\n\n const successCount = history.filter(i => i.success).length;\n const totalResponseTime = history.reduce((sum, i) => sum + i.responseTime, 0);\n\n return {\n totalInteractions: history.length,\n successRate: successCount / history.length,\n avgResponseTime: totalResponseTime / history.length,\n lastInteraction: history[0].timestamp,\n };\n }\n\n /**\n * Get all agents with interaction history\n */\n async getAllAgents(): Promise<string[]> {\n const agents = new Set<string>();\n\n try {\n for await (const [key] of this.db.iterator()) {\n const match = key.match(/^interaction:([^:]+):/);\n if (match) {\n agents.add(match[1]);\n }\n }\n } catch (error) {\n logger.error('Failed to get all agents', { error });\n }\n\n return Array.from(agents);\n }\n\n /**\n * Delete all interactions for an agent\n */\n async deleteAgent(agentDid: string): Promise<void> {\n const prefix = `interaction:${agentDid}:`;\n const keysToDelete: string[] = [];\n\n for await (const [key] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n keysToDelete.push(key);\n }\n\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Deleted interaction history', { agentDid, count: keysToDelete.length });\n }\n\n /**\n * Clean up old interactions (older than 90 days)\n */\n async cleanup(maxAge = 90 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - maxAge;\n const keysToDelete: string[] = [];\n\n for await (const [key, value] of this.db.iterator()) {\n if (value.timestamp < cutoff) {\n keysToDelete.push(key);\n }\n }\n\n if (keysToDelete.length > 0) {\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Cleaned up old interactions', { count: keysToDelete.length });\n }\n\n return keysToDelete.length;\n }\n}\n","/**\n * Endorsement System\n *\n * Allows agents to endorse each other, building a web of trust\n */\n\nimport type { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('endorsement');\n\n/**\n * Endorsement Record\n */\nexport interface Endorsement {\n from: string; // Endorser DID\n to: string; // Endorsed agent DID\n score: number; // 0-1\n reason: string;\n timestamp: number;\n signature: string; // Signed by endorser\n}\n\n/**\n * Sign function type\n */\nexport type SignFunction = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Verify function type\n */\nexport type VerifyFunction = (signature: Uint8Array, data: Uint8Array, publicKey: Uint8Array) => Promise<boolean>;\n\n/**\n * Endorsement Manager\n */\nexport class EndorsementManager {\n constructor(\n private db: Level<string, Endorsement>,\n private getPublicKey: (did: string) => Promise<Uint8Array>\n ) {}\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n if (score < 0 || score > 1) {\n throw new Error('Score must be between 0 and 1');\n }\n\n const endorsement: Omit<Endorsement, 'signature'> = {\n from: fromDid,\n to: toDid,\n score,\n reason,\n timestamp: Date.now(),\n };\n\n // Sign the endorsement\n const data = new TextEncoder().encode(JSON.stringify(endorsement));\n const signatureBytes = await signFn(data);\n const signature = Buffer.from(signatureBytes).toString('hex');\n\n const signedEndorsement: Endorsement = {\n ...endorsement,\n signature,\n };\n\n logger.info('Created endorsement', { from: fromDid, to: toDid, score });\n return signedEndorsement;\n }\n\n /**\n * Verify endorsement signature\n */\n async verify(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n try {\n const { signature, ...endorsementWithoutSig } = endorsement;\n const data = new TextEncoder().encode(JSON.stringify(endorsementWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const publicKey = await this.getPublicKey(endorsement.from);\n\n return await verifyFn(signatureBytes, data, publicKey);\n } catch (error) {\n logger.error('Failed to verify endorsement', { error });\n return false;\n }\n }\n\n /**\n * Publish endorsement to local database\n */\n async publish(endorsement: Endorsement): Promise<void> {\n const key = `endorsement:${endorsement.to}:${endorsement.from}`;\n await this.db.put(key, endorsement);\n logger.info('Published endorsement', { from: endorsement.from, to: endorsement.to });\n }\n\n /**\n * Get all endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n const prefix = `endorsement:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n endorsements.push(value);\n }\n } catch (error) {\n logger.error('Failed to get endorsements', { agentDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Get endorsements given by an agent\n */\n async getEndorsementsBy(fromDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n\n try {\n for await (const [_, value] of this.db.iterator()) {\n if (value.from === fromDid) {\n endorsements.push(value);\n }\n }\n } catch (error) {\n logger.error('Failed to get endorsements by agent', { fromDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Calculate average endorsement score\n */\n async getAverageScore(agentDid: string): Promise<number> {\n const endorsements = await this.getEndorsements(agentDid);\n\n if (endorsements.length === 0) {\n return 0;\n }\n\n const totalScore = endorsements.reduce((sum, e) => sum + e.score, 0);\n return totalScore / endorsements.length;\n }\n\n /**\n * Delete an endorsement\n */\n async deleteEndorsement(fromDid: string, toDid: string): Promise<void> {\n const key = `endorsement:${toDid}:${fromDid}`;\n await this.db.del(key);\n logger.info('Deleted endorsement', { from: fromDid, to: toDid });\n }\n}\n","/**\n * Sybil Defense Mechanisms\n *\n * Protects the network from Sybil attacks through:\n * - Entry cost (Hashcash challenges)\n * - Progressive trust (rate limiting for new agents)\n * - DHT region protection (prefer established peers)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nconst logger = createLogger('sybil-defense');\n\n/**\n * Hashcash Challenge\n */\nexport interface Challenge {\n did: string;\n difficulty: number; // Number of leading zero bits required\n nonce: string;\n timestamp: number;\n}\n\n/**\n * Challenge Solution\n */\nexport interface ChallengeSolution {\n challenge: Challenge;\n solution: string; // Nonce that produces required hash\n}\n\n/**\n * Rate Limit Record\n */\ninterface RateLimitRecord {\n did: string;\n requests: number[]; // Timestamps of requests\n firstSeen: number;\n}\n\n/**\n * Peer Trust Level\n */\nexport type PeerTrustLevel = 'new' | 'established' | 'trusted';\n\n/**\n * Sybil Defense Manager\n */\nexport class SybilDefense {\n private rateLimits = new Map<string, RateLimitRecord>();\n private peerFirstSeen = new Map<string, number>();\n private readonly NEW_AGENT_WINDOW = 24 * 60 * 60 * 1000; // 24 hours\n private readonly RATE_LIMIT_WINDOW = 60 * 60 * 1000; // 1 hour\n private readonly MAX_REQUESTS_NEW = 10; // Max requests per hour for new agents\n private readonly ESTABLISHED_THRESHOLD = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n /**\n * Generate a Hashcash challenge for a new DID\n */\n generateChallenge(did: string, difficulty = 20): Challenge {\n const nonce = this.generateNonce();\n return {\n did,\n difficulty,\n nonce,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Verify a Hashcash challenge solution\n */\n verifyChallenge(solution: ChallengeSolution): boolean {\n const { challenge, solution: solutionNonce } = solution;\n\n // Check challenge is not too old (valid for 1 hour)\n if (Date.now() - challenge.timestamp > 60 * 60 * 1000) {\n logger.warn('Challenge expired', { did: challenge.did });\n return false;\n }\n\n // Compute hash\n const data = `${challenge.did}:${challenge.nonce}:${solutionNonce}`;\n const hash = sha256(new TextEncoder().encode(data));\n\n // Check leading zeros\n const leadingZeros = this.countLeadingZeroBits(hash);\n const valid = leadingZeros >= challenge.difficulty;\n\n if (valid) {\n logger.info('Challenge verified', { did: challenge.did, leadingZeros });\n } else {\n logger.warn('Challenge failed', { did: challenge.did, leadingZeros, required: challenge.difficulty });\n }\n\n return valid;\n }\n\n /**\n * Check if an agent should be rate limited\n */\n isRateLimited(did: string): boolean {\n const record = this.rateLimits.get(did);\n if (!record) {\n return false;\n }\n\n const now = Date.now();\n const agentAge = now - record.firstSeen;\n\n // Only rate limit new agents\n if (agentAge > this.NEW_AGENT_WINDOW) {\n return false;\n }\n\n // Count recent requests\n const recentRequests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n return recentRequests.length >= this.MAX_REQUESTS_NEW;\n }\n\n /**\n * Record a request from an agent\n */\n recordRequest(did: string): void {\n const now = Date.now();\n let record = this.rateLimits.get(did);\n\n if (!record) {\n record = {\n did,\n requests: [],\n firstSeen: now,\n };\n this.rateLimits.set(did, record);\n }\n\n // Add request timestamp\n record.requests.push(now);\n\n // Clean up old requests\n record.requests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n logger.debug('Recorded request', { did, count: record.requests.length });\n }\n\n /**\n * Get peer trust level based on age\n */\n getPeerTrustLevel(peerId: string): PeerTrustLevel {\n const firstSeen = this.peerFirstSeen.get(peerId);\n if (!firstSeen) {\n return 'new';\n }\n\n const age = Date.now() - firstSeen;\n\n if (age < this.NEW_AGENT_WINDOW) {\n return 'new';\n } else if (age < this.ESTABLISHED_THRESHOLD) {\n return 'established';\n } else {\n return 'trusted';\n }\n }\n\n /**\n * Record first seen time for a peer\n */\n recordPeerSeen(peerId: string): void {\n if (!this.peerFirstSeen.has(peerId)) {\n this.peerFirstSeen.set(peerId, Date.now());\n logger.debug('Recorded new peer', { peerId });\n }\n }\n\n /**\n * Clean up old records\n */\n cleanup(): void {\n const now = Date.now();\n const cutoff = now - this.NEW_AGENT_WINDOW;\n\n // Clean up rate limits for old agents\n for (const [did, record] of this.rateLimits.entries()) {\n if (record.firstSeen < cutoff) {\n this.rateLimits.delete(did);\n }\n }\n\n logger.info('Cleaned up Sybil defense records', {\n rateLimits: this.rateLimits.size,\n peers: this.peerFirstSeen.size,\n });\n }\n\n /**\n * Generate a random nonce\n */\n private generateNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n\n /**\n * Count leading zero bits in a hash\n */\n private countLeadingZeroBits(hash: Uint8Array): number {\n let count = 0;\n for (const byte of hash) {\n if (byte === 0) {\n count += 8;\n } else {\n // Count leading zeros in this byte\n let b = byte;\n while ((b & 0x80) === 0) {\n count++;\n b <<= 1;\n }\n break;\n }\n }\n return count;\n }\n}\n","/**\n * Trust System - Main Export\n *\n * Combines all trust components into a unified interface\n */\n\nexport * from './trust-score.js';\nexport * from './interaction-history.js';\nexport * from './endorsement.js';\nexport * from './sybil-defense.js';\n\nimport { Level } from 'level';\nimport { TrustMetrics } from './trust-score.js';\nimport type { TrustScore, Interaction } from './trust-score.js';\nimport { InteractionHistory } from './interaction-history.js';\nimport { EndorsementManager } from './endorsement.js';\nimport type { Endorsement, SignFunction, VerifyFunction } from './endorsement.js';\nimport { SybilDefense } from './sybil-defense.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('trust-system');\n\n/**\n * Trust System Configuration\n */\nexport interface TrustSystemConfig {\n dbPath: string;\n getPublicKey: (did: string) => Promise<Uint8Array>;\n}\n\n/**\n * Unified Trust System\n */\nexport class TrustSystem {\n private metrics: TrustMetrics;\n private history: InteractionHistory;\n private endorsements: EndorsementManager;\n private sybilDefense: SybilDefense;\n private trustCache = new Map<string, { score: TrustScore; timestamp: number }>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: TrustSystemConfig) {\n this.metrics = new TrustMetrics();\n this.history = new InteractionHistory(`${config.dbPath}/interactions`);\n\n const endorsementDb = new Level<string, Endorsement>(`${config.dbPath}/endorsements`, {\n valueEncoding: 'json',\n });\n this.endorsements = new EndorsementManager(endorsementDb, config.getPublicKey);\n this.sybilDefense = new SybilDefense();\n }\n\n /**\n * Initialize the trust system\n */\n async start(): Promise<void> {\n await this.history.open();\n logger.info('Trust system started');\n }\n\n /**\n * Shutdown the trust system\n */\n async stop(): Promise<void> {\n await this.history.close();\n logger.info('Trust system stopped');\n }\n\n /**\n * Record an interaction\n */\n async recordInteraction(interaction: Interaction): Promise<void> {\n await this.history.record(interaction);\n this.sybilDefense.recordRequest(interaction.agentDid);\n\n // Invalidate cache\n this.trustCache.delete(interaction.agentDid);\n }\n\n /**\n * Get trust score for an agent\n */\n async getTrustScore(agentDid: string): Promise<TrustScore> {\n // Check cache\n const cached = this.trustCache.get(agentDid);\n if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {\n return cached.score;\n }\n\n // Calculate fresh score\n const stats = await this.history.getStats(agentDid);\n const endorsementList = await this.endorsements.getEndorsements(agentDid);\n const uptime = 1.0; // TODO: Implement uptime tracking\n\n const score = this.metrics.calculateScore(stats, endorsementList.length, uptime);\n\n // Cache result\n this.trustCache.set(agentDid, { score, timestamp: Date.now() });\n\n return score;\n }\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n const endorsement = await this.endorsements.endorse(fromDid, toDid, score, reason, signFn);\n await this.endorsements.publish(endorsement);\n\n // Invalidate cache\n this.trustCache.delete(toDid);\n\n return endorsement;\n }\n\n /**\n * Get endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n return this.endorsements.getEndorsements(agentDid);\n }\n\n /**\n * Verify an endorsement\n */\n async verifyEndorsement(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n return this.endorsements.verify(endorsement, verifyFn);\n }\n\n /**\n * Check if agent should be rate limited\n */\n isRateLimited(agentDid: string): boolean {\n return this.sybilDefense.isRateLimited(agentDid);\n }\n\n /**\n * Generate Sybil defense challenge\n */\n generateChallenge(did: string, difficulty?: number) {\n return this.sybilDefense.generateChallenge(did, difficulty);\n }\n\n /**\n * Verify Sybil defense challenge\n */\n verifyChallenge(solution: any): boolean {\n return this.sybilDefense.verifyChallenge(solution);\n }\n\n /**\n * Get peer trust level\n */\n getPeerTrustLevel(peerId: string) {\n return this.sybilDefense.getPeerTrustLevel(peerId);\n }\n\n /**\n * Record peer seen\n */\n recordPeerSeen(peerId: string): void {\n this.sybilDefense.recordPeerSeen(peerId);\n }\n\n /**\n * Get interaction history\n */\n async getHistory(agentDid: string, limit?: number): Promise<Interaction[]> {\n return this.history.getHistory(agentDid, limit);\n }\n\n /**\n * Clean up old data\n */\n async cleanup(): Promise<void> {\n await this.history.cleanup();\n this.sybilDefense.cleanup();\n this.trustCache.clear();\n logger.info('Trust system cleanup completed');\n }\n}\n\n/**\n * Create a trust system instance\n */\nexport function createTrustSystem(config: TrustSystemConfig): TrustSystem {\n return new TrustSystem(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/identity/keys.ts","../src/identity/did.ts","../src/identity/signer.ts","../src/utils/logger.ts","../src/transport/relay-client.ts","../src/transport/relay-types.ts","../src/discovery/agent-card-types.ts","../src/discovery/agent-card.ts","../src/discovery/agent-card-schema.ts","../src/discovery/agent-card-encoder.ts","../src/discovery/relay-index.ts","../src/discovery/search-index.ts","../src/discovery/capability-matcher.ts","../src/discovery/semantic-search.ts","../src/messaging/envelope.ts","../src/messaging/codec.ts","../src/messaging/router.ts","../src/messaging/storage.ts","../src/messaging/queue.ts","../src/messaging/rate-limiter.ts","../src/messaging/defense.ts","../src/trust/trust-score.ts","../src/trust/interaction-history.ts","../src/trust/endorsement.ts","../src/trust/sybil-defense.ts","../src/trust/index.ts"],"names":["LogLevel","encodeCBOR","decodeCBOR","did","cborEncode","cborDecode","logger","Level"],"mappings":"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","file":"index.js","sourcesContent":["export class ClawiverseError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: unknown\n ) {\n super(message);\n this.name = 'ClawiverseError';\n }\n}\n\nexport class IdentityError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'IDENTITY_ERROR', details);\n this.name = 'IdentityError';\n }\n}\n\nexport class TransportError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'TRANSPORT_ERROR', details);\n this.name = 'TransportError';\n }\n}\n\nexport class DiscoveryError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'DISCOVERY_ERROR', details);\n this.name = 'DiscoveryError';\n }\n}\n\nexport class MessagingError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'MESSAGING_ERROR', details);\n this.name = 'MessagingError';\n }\n}\n","import * as ed25519 from '@noble/ed25519';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n}\n\n/**\n * Generate a new Ed25519 key pair\n */\nexport async function generateKeyPair(): Promise<KeyPair> {\n try {\n const privateKey = ed25519.utils.randomPrivateKey();\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n\n return {\n publicKey,\n privateKey,\n };\n } catch (error) {\n throw new IdentityError('Failed to generate key pair', error);\n }\n}\n\n/**\n * Sign a message with a private key\n */\nexport async function sign(\n message: Uint8Array,\n privateKey: Uint8Array\n): Promise<Uint8Array> {\n try {\n return await ed25519.signAsync(message, privateKey);\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signature\n */\nexport async function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array\n): Promise<boolean> {\n try {\n return await ed25519.verifyAsync(signature, message, publicKey);\n } catch (error) {\n throw new IdentityError('Failed to verify signature', error);\n }\n}\n\n/**\n * Export key pair to JSON format\n */\nexport function exportKeyPair(keyPair: KeyPair): {\n publicKey: string;\n privateKey: string;\n} {\n return {\n publicKey: Buffer.from(keyPair.publicKey).toString('hex'),\n privateKey: Buffer.from(keyPair.privateKey).toString('hex'),\n };\n}\n\n/**\n * Import key pair from JSON format\n */\nexport function importKeyPair(exported: {\n publicKey: string;\n privateKey: string;\n}): KeyPair {\n return {\n publicKey: new Uint8Array(Buffer.from(exported.publicKey, 'hex')),\n privateKey: new Uint8Array(Buffer.from(exported.privateKey, 'hex')),\n };\n}\n","import { base58btc } from 'multiformats/bases/base58';\nimport { IdentityError } from '../utils/errors.js';\n\n/**\n * Derive a did:clawiverse DID from a public key\n * Format: did:clawiverse:<base58btc-encoded-pubkey>\n */\nexport function deriveDID(publicKey: Uint8Array): string {\n try {\n const encoded = base58btc.encode(publicKey);\n return `did:clawiverse:${encoded}`;\n } catch (error) {\n throw new IdentityError('Failed to derive DID', error);\n }\n}\n\n/**\n * Extract public key from a did:clawiverse DID\n */\nexport function extractPublicKey(did: string): Uint8Array {\n if (!did.startsWith('did:clawiverse:')) {\n throw new IdentityError('Invalid DID format: must start with did:clawiverse:');\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n return base58btc.decode(encoded);\n } catch (error) {\n throw new IdentityError('Failed to extract public key from DID', error);\n }\n}\n\n/**\n * Validate a did:clawiverse DID format\n */\nexport function validateDID(did: string): boolean {\n if (!did.startsWith('did:clawiverse:')) {\n return false;\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n base58btc.decode(encoded);\n return true;\n } catch {\n return false;\n }\n}\n","import { sign, verify } from './keys.js';\nimport { deriveDID } from './did.js';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface SignedMessage {\n payload: Uint8Array;\n signature: Uint8Array;\n signer: string; // DID\n}\n\n/**\n * Sign a message and return a signed message object\n */\nexport async function signMessage(\n payload: Uint8Array,\n privateKey: Uint8Array,\n publicKey: Uint8Array\n): Promise<SignedMessage> {\n try {\n const signature = await sign(payload, privateKey);\n const signer = deriveDID(publicKey);\n\n return {\n payload,\n signature,\n signer,\n };\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signed message\n */\nexport async function verifyMessage(\n signedMessage: SignedMessage,\n expectedPublicKey: Uint8Array\n): Promise<boolean> {\n try {\n const expectedDID = deriveDID(expectedPublicKey);\n\n if (signedMessage.signer !== expectedDID) {\n return false;\n }\n\n return await verify(\n signedMessage.signature,\n signedMessage.payload,\n expectedPublicKey\n );\n } catch (error) {\n throw new IdentityError('Failed to verify message', error);\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport class Logger {\n private level: LogLevel;\n private prefix: string;\n\n constructor(prefix: string, level: LogLevel = LogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG:`, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.info(`[${this.prefix}] INFO:`, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN:`, message, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR:`, message, ...args);\n }\n }\n}\n\nexport const createLogger = (prefix: string, level?: LogLevel): Logger => {\n return new Logger(prefix, level);\n};\n","/**\n * CVP-0011: WebSocket relay client with reconnection logic\n */\n\nimport { WebSocket } from 'ws';\nimport { encode as encodeCBOR, decode as decodeCBOR } from 'cbor-x';\nimport { createLogger } from '../utils/logger.js';\nimport { TransportError } from '../utils/errors.js';\nimport { sign } from '../identity/keys.js';\nimport type { KeyPair } from '../identity/keys.js';\nimport type { AgentCard } from '../discovery/agent-card-types.js';\nimport type {\n RelayMessage,\n HelloMessage,\n WelcomeMessage,\n DeliverMessage,\n DiscoveredAgent,\n DeliveryReportMessage,\n} from './relay-types.js';\n\nconst logger = createLogger('relay-client');\n\nexport interface RelayClientConfig {\n relayUrls: string[];\n did: string;\n keyPair: KeyPair;\n card: AgentCard;\n reconnect?: {\n baseMs?: number;\n jitterMs?: number;\n maxDelayMs?: number;\n stableAfterMs?: number;\n };\n}\n\nexport type MessageDeliveryHandler = (msg: DeliverMessage) => Promise<void>;\nexport type DeliveryReportHandler = (msg: DeliveryReportMessage) => void;\n\nexport interface RelayClient {\n start(): Promise<void>;\n stop(): Promise<void>;\n sendEnvelope(toDid: string, envelopeBytes: Uint8Array): Promise<void>;\n discover(query: string, minTrust?: number, limit?: number): Promise<DiscoveredAgent[]>;\n fetchCard(did: string): Promise<AgentCard | null>;\n onDeliver(handler: MessageDeliveryHandler): void;\n onDeliveryReport(handler: DeliveryReportHandler): void;\n isConnected(): boolean;\n getConnectedRelays(): string[];\n getPeerCount(): number;\n}\n\ninterface RelayConnection {\n url: string;\n ws: WebSocket | null;\n connected: boolean;\n reconnectAttempt: number;\n reconnectTimer: NodeJS.Timeout | null;\n stableTimer: NodeJS.Timeout | null;\n pingTimer: NodeJS.Timeout | null; // CVP-0011 §2.5: PING every 30s\n peerCount: number;\n}\n\nconst DEFAULT_RECONNECT = {\n baseMs: 1000,\n jitterMs: 2000,\n maxDelayMs: 30000,\n stableAfterMs: 60000,\n};\n\nexport function createRelayClient(config: RelayClientConfig): RelayClient {\n const { relayUrls, did, keyPair, card } = config;\n const reconnectConfig = { ...DEFAULT_RECONNECT, ...config.reconnect };\n\n const connections: RelayConnection[] = relayUrls.map((url) => ({\n url,\n ws: null,\n connected: false,\n reconnectAttempt: 0,\n reconnectTimer: null,\n stableTimer: null,\n pingTimer: null,\n peerCount: 0,\n }));\n\n let deliveryHandler: MessageDeliveryHandler | null = null;\n let deliveryReportHandler: DeliveryReportHandler | null = null;\n let stopped = false;\n\n async function connectToRelay(conn: RelayConnection): Promise<void> {\n if (stopped) return;\n\n try {\n logger.info('Connecting to relay', { url: conn.url });\n\n const ws = new WebSocket(conn.url);\n conn.ws = ws;\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Connection timeout'));\n }, 10000);\n\n ws.on('open', async () => {\n clearTimeout(timeout);\n logger.info('WebSocket connected', { url: conn.url });\n\n try {\n // Send HELLO message (CBOR-encoded)\n const timestamp = Date.now();\n const helloData = encodeCBOR({ did, card, timestamp });\n const signature = await sign(helloData, keyPair.privateKey);\n\n const hello: HelloMessage = {\n type: 'HELLO',\n protocolVersion: 1,\n did,\n card,\n timestamp,\n signature,\n };\n\n ws.send(encodeCBOR(hello));\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n\n ws.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n\n // Set up message handler (CBOR decoding)\n ws.on('message', async (data: Buffer) => {\n try {\n const msg: RelayMessage = decodeCBOR(data);\n await handleRelayMessage(conn, msg);\n } catch (err) {\n logger.warn('Failed to parse relay message', { error: (err as Error).message });\n }\n });\n\n ws.on('close', () => {\n logger.info('WebSocket closed', { url: conn.url });\n conn.connected = false;\n conn.ws = null;\n\n // Clear timers\n if (conn.stableTimer) {\n clearTimeout(conn.stableTimer);\n conn.stableTimer = null;\n }\n if (conn.pingTimer) {\n clearInterval(conn.pingTimer);\n conn.pingTimer = null;\n }\n\n if (!stopped) {\n scheduleReconnect(conn);\n }\n });\n\n ws.on('error', (err) => {\n logger.warn('WebSocket error', { url: conn.url, error: err.message });\n });\n } catch (err) {\n logger.warn('Failed to connect to relay', { url: conn.url, error: (err as Error).message });\n conn.ws = null;\n conn.connected = false;\n\n if (!stopped) {\n scheduleReconnect(conn);\n }\n }\n }\n\n function scheduleReconnect(conn: RelayConnection): void {\n if (conn.reconnectTimer) return;\n\n const delay = Math.min(\n reconnectConfig.baseMs * Math.pow(2, conn.reconnectAttempt) + Math.random() * reconnectConfig.jitterMs,\n reconnectConfig.maxDelayMs\n );\n\n conn.reconnectAttempt++;\n logger.debug('Scheduling reconnect', { url: conn.url, attempt: conn.reconnectAttempt, delayMs: delay });\n\n conn.reconnectTimer = setTimeout(() => {\n conn.reconnectTimer = null;\n connectToRelay(conn);\n }, delay);\n }\n\n async function handleRelayMessage(conn: RelayConnection, msg: RelayMessage): Promise<void> {\n switch (msg.type) {\n case 'WELCOME': {\n const welcome = msg as WelcomeMessage;\n logger.info('Received WELCOME', { relayId: welcome.relayId, peers: welcome.peers });\n conn.connected = true;\n conn.peerCount = welcome.peers;\n conn.reconnectAttempt = 0;\n\n // Start stable timer\n if (conn.stableTimer) clearTimeout(conn.stableTimer);\n conn.stableTimer = setTimeout(() => {\n conn.reconnectAttempt = 0;\n logger.debug('Connection stable', { url: conn.url });\n }, reconnectConfig.stableAfterMs);\n\n // CVP-0011 §2.5: Start PING heartbeat (every 30s)\n if (conn.pingTimer) clearInterval(conn.pingTimer);\n conn.pingTimer = setInterval(() => {\n if (conn.ws && conn.connected) {\n conn.ws.send(encodeCBOR({ type: 'PING' }));\n logger.debug('Sent PING', { url: conn.url });\n }\n }, 30000); // 30 seconds\n\n break;\n }\n\n case 'DELIVER': {\n const deliver = msg as DeliverMessage;\n logger.info('Received DELIVER', { messageId: deliver.messageId, from: deliver.from });\n if (deliveryHandler) {\n await deliveryHandler(deliver);\n }\n // CVP-0011 §2.7: Send ACK after processing message\n if (conn.ws && conn.connected) {\n conn.ws.send(encodeCBOR({ type: 'ACK', messageId: deliver.messageId }));\n logger.debug('Sent ACK', { messageId: deliver.messageId });\n }\n break;\n }\n\n case 'DELIVERY_REPORT': {\n const report = msg as DeliveryReportMessage;\n logger.info('Received DELIVERY_REPORT', { messageId: report.messageId, status: report.status });\n if (deliveryReportHandler) {\n deliveryReportHandler(report);\n }\n break;\n }\n\n case 'PONG': {\n conn.peerCount = msg.peers;\n logger.debug('Received PONG', { peers: msg.peers });\n break;\n }\n\n case 'GOODBYE': {\n // CVP-0011 §2.6: Handle graceful shutdown with reconnectAfter\n const goodbye = msg as any;\n const reconnectAfter = goodbye.reconnectAfter || 5000;\n logger.info('Received GOODBYE', { url: conn.url, reconnectAfter });\n\n // Close connection and schedule reconnection\n if (conn.ws) {\n conn.ws.close();\n }\n\n // Override reconnect delay with server's suggestion\n setTimeout(() => {\n if (!stopped) {\n connectToRelay(conn);\n }\n }, reconnectAfter);\n break;\n }\n\n default:\n logger.debug('Received relay message', { type: msg.type });\n }\n }\n\n function getConnectedConnection(): RelayConnection | null {\n return connections.find((c) => c.connected && c.ws) || null;\n }\n\n async function sendToRelay(msg: RelayMessage): Promise<void> {\n const conn = getConnectedConnection();\n if (!conn || !conn.ws) {\n throw new TransportError('No connected relay');\n }\n\n conn.ws.send(encodeCBOR(msg));\n }\n\n return {\n async start(): Promise<void> {\n stopped = false;\n logger.info('Starting relay client', { relays: relayUrls.length });\n\n // Stagger initial connections\n for (let i = 0; i < connections.length; i++) {\n const conn = connections[i];\n setTimeout(() => {\n connectToRelay(conn);\n }, Math.random() * 2000);\n }\n\n // Wait for at least one connection\n const maxWait = 15000;\n const start = Date.now();\n while (Date.now() - start < maxWait) {\n if (getConnectedConnection()) {\n logger.info('Relay client started');\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n throw new TransportError('Failed to connect to any relay');\n },\n\n async stop(): Promise<void> {\n stopped = true;\n logger.info('Stopping relay client');\n\n for (const conn of connections) {\n if (conn.reconnectTimer) {\n clearTimeout(conn.reconnectTimer);\n conn.reconnectTimer = null;\n }\n if (conn.stableTimer) {\n clearTimeout(conn.stableTimer);\n conn.stableTimer = null;\n }\n if (conn.pingTimer) {\n clearInterval(conn.pingTimer);\n conn.pingTimer = null;\n }\n if (conn.ws) {\n conn.ws.close();\n conn.ws = null;\n }\n conn.connected = false;\n }\n\n logger.info('Relay client stopped');\n },\n\n async sendEnvelope(toDid: string, envelopeBytes: Uint8Array): Promise<void> {\n const msg: RelayMessage = {\n type: 'SEND',\n to: toDid,\n envelope: envelopeBytes,\n };\n\n await sendToRelay(msg);\n logger.debug('Sent envelope', { to: toDid, size: envelopeBytes.length });\n },\n\n async discover(query: string, minTrust?: number, limit?: number): Promise<DiscoveredAgent[]> {\n const conn = getConnectedConnection();\n const ws = conn?.ws;\n if (!conn || !ws) {\n throw new TransportError('No connected relay');\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new TransportError('Discover timeout'));\n }, 10000);\n\n const handler = (data: Buffer) => {\n try {\n const msg: RelayMessage = decodeCBOR(data);\n if (msg.type === 'DISCOVERED') {\n clearTimeout(timeout);\n ws.off('message', handler);\n resolve(msg.agents);\n }\n } catch (err) {\n // Ignore parse errors\n }\n };\n\n ws.on('message', handler);\n ws.send(encodeCBOR({ type: 'DISCOVER', query, minTrust, limit } as RelayMessage));\n });\n },\n\n async fetchCard(did: string): Promise<AgentCard | null> {\n const conn = getConnectedConnection();\n const ws = conn?.ws;\n if (!conn || !ws) {\n throw new TransportError('No connected relay');\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new TransportError('Fetch card timeout'));\n }, 5000);\n\n const handler = (data: Buffer) => {\n try {\n const msg: RelayMessage = decodeCBOR(data);\n if (msg.type === 'CARD' && msg.did === did) {\n clearTimeout(timeout);\n ws.off('message', handler);\n resolve(msg.card);\n }\n } catch (err) {\n // Ignore parse errors\n }\n };\n\n ws.on('message', handler);\n ws.send(encodeCBOR({ type: 'FETCH_CARD', did } as RelayMessage));\n });\n },\n\n onDeliver(handler: MessageDeliveryHandler): void {\n deliveryHandler = handler;\n },\n\n onDeliveryReport(handler: DeliveryReportHandler): void {\n deliveryReportHandler = handler;\n },\n\n isConnected(): boolean {\n return getConnectedConnection() !== null;\n },\n\n getConnectedRelays(): string[] {\n return connections.filter((c) => c.connected).map((c) => c.url);\n },\n\n getPeerCount(): number {\n const conn = getConnectedConnection();\n return conn ? conn.peerCount : 0;\n },\n };\n}\n","/**\n * CVP-0011: Relay wire protocol types (shared between relay server and relay client)\n */\n\nimport type { AgentCard } from '../discovery/agent-card-types.js';\n\nexport const RELAY_PROTOCOL_VERSION = 1;\n\nexport type RelayMessageType =\n | 'HELLO'\n | 'WELCOME'\n | 'SEND'\n | 'DELIVER'\n | 'DISCOVER'\n | 'DISCOVERED'\n | 'PING'\n | 'PONG'\n | 'ACK'\n | 'DELIVERY_REPORT'\n | 'FETCH_CARD'\n | 'CARD'\n | 'GOODBYE'\n | 'INDEX_SYNC'\n | 'ROUTE'\n | 'SYNC_HELLO'\n | 'SYNC_REQUEST'\n | 'SYNC_RESPONSE'\n | 'SYNC_PUSH'\n | 'SYNC_RECONCILE';\n\nexport interface HelloMessage {\n type: 'HELLO';\n protocolVersion: number;\n did: string;\n card: AgentCard;\n timestamp: number;\n signature: Uint8Array;\n extensions?: string[];\n}\n\nexport interface WelcomeMessage {\n type: 'WELCOME';\n protocolVersion: number;\n relayId: string;\n peers: number;\n federatedRelays: string[];\n yourAddr: string;\n}\n\nexport interface SendMessage {\n type: 'SEND';\n to: string;\n envelope: Uint8Array;\n}\n\nexport interface DeliverMessage {\n type: 'DELIVER';\n messageId: string;\n from: string;\n envelope: Uint8Array;\n}\n\nexport interface DiscoverMessage {\n type: 'DISCOVER';\n query: string;\n minTrust?: number;\n limit?: number;\n}\n\nexport interface DiscoveredAgent {\n did: string;\n card: AgentCard;\n online: boolean;\n homeRelay?: string;\n}\n\nexport interface DiscoveredMessage {\n type: 'DISCOVERED';\n agents: DiscoveredAgent[];\n}\n\nexport interface AckMessage {\n type: 'ACK';\n messageId: string;\n}\n\nexport interface DeliveryReportMessage {\n type: 'DELIVERY_REPORT';\n messageId: string;\n status: 'delivered' | 'expired' | 'queue_full' | 'unknown_recipient';\n timestamp: number;\n}\n\nexport interface PingMessage {\n type: 'PING';\n}\n\nexport interface PongMessage {\n type: 'PONG';\n peers: number;\n}\n\nexport interface FetchCardMessage {\n type: 'FETCH_CARD';\n did: string;\n}\n\nexport interface CardMessage {\n type: 'CARD';\n did: string;\n card: AgentCard | null;\n}\n\nexport interface GoodbyeMessage {\n type: 'GOODBYE';\n reconnectAfter?: number; // CVP-0011 §2.6: Milliseconds to wait before reconnecting\n}\n\nexport interface PresenceProof {\n did: string;\n homeRelay: string;\n expiry: number;\n signature: Uint8Array;\n}\n\nexport interface SyncEvent {\n seq: number;\n type: 'JOIN' | 'LEAVE' | 'UPDATE';\n did: string;\n homeRelay: string;\n cardHash?: string;\n capabilityKeys?: string[];\n online: boolean;\n ts: number;\n presenceProof?: PresenceProof;\n}\n\nexport interface IndexSyncMessage {\n type: 'INDEX_SYNC';\n events: SyncEvent[];\n}\n\nexport interface RouteMessage {\n type: 'ROUTE';\n to: string;\n envelope: Uint8Array;\n ttl: number;\n}\n\nexport interface SyncHelloMessage {\n type: 'SYNC_HELLO';\n relayId: string;\n seq: number;\n}\n\nexport interface SyncRequestMessage {\n type: 'SYNC_REQUEST';\n fromSeq: number;\n}\n\nexport interface SyncResponseMessage {\n type: 'SYNC_RESPONSE';\n events: SyncEvent[];\n}\n\nexport interface SyncPushMessage {\n type: 'SYNC_PUSH';\n event: SyncEvent;\n}\n\nexport interface SyncReconcileMessage {\n type: 'SYNC_RECONCILE';\n dids: string[];\n}\n\nexport type RelayMessage =\n | HelloMessage\n | WelcomeMessage\n | SendMessage\n | DeliverMessage\n | DiscoverMessage\n | DiscoveredMessage\n | AckMessage\n | DeliveryReportMessage\n | PingMessage\n | PongMessage\n | FetchCardMessage\n | CardMessage\n | GoodbyeMessage\n | IndexSyncMessage\n | RouteMessage\n | SyncHelloMessage\n | SyncRequestMessage\n | SyncResponseMessage\n | SyncPushMessage\n | SyncReconcileMessage;\n","/**\n * Enhanced Agent Card Types for Phase 2\n *\n * Adds structured capabilities, JSON-LD support, and trust metrics\n */\n\nimport type { TrustScore } from '../trust/trust-score.js';\n\n/**\n * Capability Parameter Definition\n */\nexport interface CapabilityParameter {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required: boolean;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\n/**\n * Structured Capability Definition\n */\nexport interface Capability {\n '@type'?: string; // JSON-LD type (e.g., \"TranslationService\")\n id: string; // Unique capability ID\n name: string; // Human-readable name\n description: string;\n parameters?: CapabilityParameter[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Enhanced Agent Card with JSON-LD support\n */\nexport interface AgentCard {\n '@context'?: string[]; // JSON-LD context\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: Capability[]; // Changed from string[] to Capability[]\n endpoints: string[];\n peerId?: string;\n trust?: TrustScore; // Trust metrics\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Legacy Agent Card (Phase 1 compatibility)\n */\nexport interface LegacyAgentCard {\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: string[]; // Flat string array\n endpoints: string[];\n peerId?: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Check if card is legacy format\n */\nexport function isLegacyCard(card: AgentCard | LegacyAgentCard): card is LegacyAgentCard {\n return Array.isArray(card.capabilities) &&\n card.capabilities.length > 0 &&\n typeof card.capabilities[0] === 'string';\n}\n\n/**\n * Convert legacy card to new format\n */\nexport function upgradeLegacyCard(legacy: LegacyAgentCard): AgentCard {\n return {\n ...legacy,\n capabilities: legacy.capabilities.map(cap => ({\n id: cap,\n name: cap,\n description: `Capability: ${cap}`,\n })),\n };\n}\n\n/**\n * Convert new card to legacy format (for backward compatibility)\n */\nexport function downgradeToLegacyCard(card: AgentCard): LegacyAgentCard {\n const { '@context': _, trust: __, ...rest } = card;\n return {\n ...rest,\n capabilities: card.capabilities.map(cap => cap.id),\n };\n}\n","import Ajv, { JSONSchemaType } from 'ajv';\nimport { DiscoveryError } from '../utils/errors.js';\n\n// Re-export Phase 2 types\nexport type { AgentCard, Capability, CapabilityParameter, LegacyAgentCard } from './agent-card-types.js';\nexport { isLegacyCard, upgradeLegacyCard, downgradeToLegacyCard } from './agent-card-types.js';\n\n// Import for internal use\nimport type { AgentCard, Capability, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard } from './agent-card-types.js';\n\n// Legacy schema for backward compatibility\nconst legacyAgentCardSchema: JSONSchemaType<Omit<LegacyAgentCard, 'signature'>> = {\n type: 'object',\n properties: {\n did: { type: 'string', pattern: '^did:clawiverse:[1-9A-HJ-NP-Za-km-z]+$' },\n name: { type: 'string', minLength: 1, maxLength: 100 },\n description: { type: 'string', maxLength: 500 },\n version: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$' },\n capabilities: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 50,\n },\n endpoints: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 10,\n },\n peerId: { type: 'string', nullable: true },\n metadata: {\n type: 'object',\n nullable: true,\n required: [],\n },\n timestamp: { type: 'number' },\n },\n required: ['did', 'name', 'description', 'version', 'capabilities', 'endpoints', 'timestamp'],\n additionalProperties: false,\n};\n\nconst ajv = new Ajv();\nconst validateLegacySchema = ajv.compile(legacyAgentCardSchema);\n\n/**\n * Create a new Agent Card (Phase 2 format with structured capabilities)\n */\nexport function createAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: Capability[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<AgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create a legacy Agent Card (Phase 1 format with string capabilities)\n * For backward compatibility\n */\nexport function createLegacyAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: string[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<LegacyAgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate an Agent Card structure (supports both Phase 1 and Phase 2 formats)\n */\nexport function validateAgentCard(card: unknown): card is AgentCard | LegacyAgentCard {\n if (typeof card !== 'object' || card === null) {\n return false;\n }\n\n const c = card as Partial<AgentCard | LegacyAgentCard>;\n\n // Check signature exists\n if (typeof c.signature !== 'string') {\n return false;\n }\n\n // Check if it's legacy format\n if (isLegacyCard(c as any)) {\n return validateLegacySchema(c);\n }\n\n // Phase 2 format - basic validation\n // (Full JSON-LD validation would be more complex)\n return (\n typeof c.did === 'string' &&\n typeof c.name === 'string' &&\n typeof c.description === 'string' &&\n typeof c.version === 'string' &&\n Array.isArray(c.capabilities) &&\n Array.isArray(c.endpoints) &&\n typeof c.timestamp === 'number'\n );\n}\n\n/**\n * Sign an Agent Card\n */\nexport async function signAgentCard(\n card: Omit<AgentCard, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<AgentCard> {\n try {\n const cardJson = JSON.stringify(card);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signature = await signFn(cardBytes);\n\n return {\n ...card,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new DiscoveryError('Failed to sign Agent Card', error);\n }\n}\n\n/**\n * Verify an Agent Card signature\n */\nexport async function verifyAgentCard(\n card: AgentCard,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...cardWithoutSig } = card;\n const cardJson = JSON.stringify(cardWithoutSig);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, cardBytes);\n } catch (error) {\n throw new DiscoveryError('Failed to verify Agent Card', error);\n }\n}\n\n/**\n * Check if an Agent Card matches a capability query\n * Supports both Phase 1 (string[]) and Phase 2 (Capability[]) formats\n */\nexport function matchesCapability(\n card: AgentCard | LegacyAgentCard,\n capability: string\n): boolean {\n if (isLegacyCard(card)) {\n return card.capabilities.some((cap) =>\n cap.toLowerCase().includes(capability.toLowerCase())\n );\n }\n\n return card.capabilities.some((cap) =>\n cap.id.toLowerCase().includes(capability.toLowerCase()) ||\n cap.name.toLowerCase().includes(capability.toLowerCase()) ||\n cap.description.toLowerCase().includes(capability.toLowerCase())\n );\n}\n","/**\n * JSON-LD Schema Definitions for Agent Cards\n *\n * Defines the Clawiverse vocabulary and integrates with Schema.org\n * for semantic interoperability.\n */\n\nexport const CLAWIVERSE_CONTEXT = 'https://clawiverse.org/context/v1';\nexport const SCHEMA_ORG_CONTEXT = 'https://schema.org';\n\n/**\n * Clawiverse JSON-LD Context\n * Defines the vocabulary for Agent Cards and Capabilities\n */\nexport const clawiverseContext = {\n '@context': {\n '@vocab': CLAWIVERSE_CONTEXT,\n 'schema': SCHEMA_ORG_CONTEXT,\n 'AgentCard': 'schema:SoftwareApplication',\n 'Capability': 'schema:Action',\n 'did': '@id',\n 'name': 'schema:name',\n 'description': 'schema:description',\n 'version': 'schema:softwareVersion',\n 'capabilities': {\n '@id': 'schema:potentialAction',\n '@type': '@id',\n '@container': '@list'\n },\n 'endpoints': {\n '@id': 'schema:url',\n '@container': '@list'\n },\n 'peerId': 'clawiverse:peerId',\n 'trust': 'clawiverse:trustScore',\n 'metadata': 'schema:additionalProperty',\n 'timestamp': 'schema:dateModified',\n 'signature': 'clawiverse:signature',\n 'parameters': {\n '@id': 'schema:object',\n '@container': '@list'\n }\n }\n};\n\n/**\n * Capability Type Definitions\n * Common capability types with semantic meaning\n */\nexport const CapabilityTypes = {\n TRANSLATION: 'TranslationService',\n CODE_REVIEW: 'CodeReviewService',\n DATA_ANALYSIS: 'DataAnalysisService',\n TEXT_GENERATION: 'TextGenerationService',\n IMAGE_GENERATION: 'ImageGenerationService',\n SEARCH: 'SearchService',\n COMPUTATION: 'ComputationService',\n STORAGE: 'StorageService',\n MESSAGING: 'MessagingService',\n AUTHENTICATION: 'AuthenticationService',\n} as const;\n\n/**\n * Parameter Type Definitions\n */\nexport const ParameterTypes = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n OBJECT: 'object',\n ARRAY: 'array',\n} as const;\n\n/**\n * Get JSON-LD context for Agent Card\n */\nexport function getAgentCardContext(): string[] {\n return [SCHEMA_ORG_CONTEXT, CLAWIVERSE_CONTEXT];\n}\n\n/**\n * Validate JSON-LD context\n */\nexport function isValidContext(context: unknown): boolean {\n if (!Array.isArray(context)) return false;\n return context.every(c => typeof c === 'string');\n}\n","/**\n * Agent Card Encoder - Dual Encoding Support\n *\n * Provides bidirectional conversion between:\n * - CBOR (compact binary) for DHT storage\n * - JSON-LD (semantic) for Web publishing\n */\n\nimport { encode as cborEncode, decode as cborDecode } from 'cbor-x';\nimport type { AgentCard, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard, upgradeLegacyCard } from './agent-card-types.js';\nimport { getAgentCardContext } from './agent-card-schema.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\n/**\n * Encode Agent Card as CBOR for DHT storage\n */\nexport function encodeForDHT(card: AgentCard): Uint8Array {\n try {\n // Remove JSON-LD context for compact storage\n const { '@context': _, ...cardWithoutContext } = card;\n return cborEncode(cardWithoutContext);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as CBOR', error);\n }\n}\n\n/**\n * Encode Agent Card as JSON-LD for Web publishing\n */\nexport function encodeForWeb(card: AgentCard): string {\n try {\n // Ensure JSON-LD context is present\n const cardWithContext: AgentCard = {\n '@context': card['@context'] || getAgentCardContext(),\n ...card,\n };\n return JSON.stringify(cardWithContext, null, 2);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as JSON-LD', error);\n }\n}\n\n/**\n * Decode Agent Card from CBOR\n */\nexport function decodeFromCBOR(data: Uint8Array): AgentCard {\n try {\n const decoded = cborDecode(data) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from CBOR', error);\n }\n}\n\n/**\n * Decode Agent Card from JSON-LD\n */\nexport function decodeFromJSON(json: string): AgentCard {\n try {\n const decoded = JSON.parse(json) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from JSON', error);\n }\n}\n\n/**\n * Auto-detect format and decode\n */\nexport function decodeAgentCard(data: Uint8Array | string): AgentCard {\n if (typeof data === 'string') {\n return decodeFromJSON(data);\n }\n\n // Try CBOR first, fallback to JSON if it looks like text\n try {\n return decodeFromCBOR(data);\n } catch {\n // Check if it's actually JSON text\n const text = new TextDecoder().decode(data);\n if (text.trim().startsWith('{')) {\n return decodeFromJSON(text);\n }\n throw new DiscoveryError('Unable to decode Agent Card: unknown format');\n }\n}\n\n/**\n * Calculate encoded size for comparison\n */\nexport function getEncodedSize(card: AgentCard): { cbor: number; json: number } {\n return {\n cbor: encodeForDHT(card).length,\n json: encodeForWeb(card).length,\n };\n}\n","/**\n * CVP-0011: Relay-backed discovery operations\n * Implements the same DHTOperations interface shape but backed by relay queries\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\nimport type { RelayClient } from '../transport/relay-client.js';\nimport { createLogger } from '../utils/logger.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\nconst logger = createLogger('relay-index');\n\nexport interface RelayIndexOperations {\n publishAgentCard: (card: AgentCard) => Promise<void>;\n queryAgentCard: (did: string) => Promise<AgentCard | null>;\n queryByCapability: (capability: string) => Promise<AgentCard[]>;\n searchSemantic: (query: SemanticQuery) => Promise<AgentCard[]>;\n resolveDID: (did: string) => Promise<{ relayUrl: string } | null>;\n queryRelayPeers: () => Promise<string[]>;\n}\n\n/**\n * Create relay-backed discovery operations\n */\nexport function createRelayIndexOperations(client: RelayClient): RelayIndexOperations {\n return {\n publishAgentCard: async (card: AgentCard) => {\n // No-op: Agent Card is published via HELLO message when connecting to relay\n logger.debug('Agent Card published via HELLO', { did: card.did });\n },\n\n queryAgentCard: async (did: string) => {\n try {\n const card = await client.fetchCard(did);\n if (card) {\n logger.debug('Found Agent Card via relay', { did });\n } else {\n logger.debug('Agent Card not found via relay', { did });\n }\n return card;\n } catch (error) {\n logger.warn('Failed to query Agent Card', { did, error });\n return null;\n }\n },\n\n queryByCapability: async (capability: string) => {\n try {\n const results = await client.discover(capability);\n const cards = results.map((r) => r.card);\n logger.debug('Query by capability', { capability, count: cards.length });\n return cards;\n } catch (error) {\n throw new DiscoveryError('Failed to query by capability', error);\n }\n },\n\n searchSemantic: async (query: SemanticQuery) => {\n try {\n const queryText = query.text || query.capability || '';\n const minTrust = query.filters?.minTrustScore;\n const limit = query.limit || 10;\n\n const results = await client.discover(queryText, minTrust, limit);\n const cards = results.map((r) => r.card);\n\n logger.debug('Semantic search', { query: queryText, count: cards.length });\n return cards;\n } catch (error) {\n throw new DiscoveryError('Failed to perform semantic search', error);\n }\n },\n\n resolveDID: async (did: string) => {\n try {\n // In relay architecture, we don't need peer resolution\n // The relay handles routing, so we just return the relay URL\n const relays = client.getConnectedRelays();\n if (relays.length === 0) {\n logger.debug('DID resolution failed: no connected relays', { did });\n return null;\n }\n\n logger.debug('Resolved DID to relay', { did, relay: relays[0] });\n return { relayUrl: relays[0] };\n } catch (error) {\n logger.warn('Failed to resolve DID', { did, error });\n return null;\n }\n },\n\n queryRelayPeers: async () => {\n // Return connected relay URLs\n return client.getConnectedRelays();\n },\n };\n}\n","/**\n * Search Index for Agent Discovery\n *\n * Maintains a local index of discovered agents for fast semantic search\n */\n\nimport lunr from 'lunr';\nimport Fuse from 'fuse.js';\nimport type { AgentCard } from './agent-card-types.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('search-index');\n\n/**\n * Semantic Query Interface\n */\nexport interface SemanticQuery {\n text?: string; // Natural language: \"translate Japanese\"\n capability?: string; // Structured: \"translate\"\n filters?: {\n language?: string;\n minTrustScore?: number;\n maxCost?: number;\n tags?: string[];\n };\n limit?: number;\n}\n\n/**\n * Search Result with Score\n */\nexport interface SearchResult {\n card: AgentCard;\n score: number;\n}\n\n/**\n * Search Index Implementation\n */\nexport class SearchIndex {\n private cards = new Map<string, AgentCard>();\n private lunrIndex?: lunr.Index;\n private fuse?: Fuse<AgentCard>;\n private needsRebuild = false;\n\n /**\n * Add or update an Agent Card in the index\n */\n indexAgentCard(card: AgentCard): void {\n this.cards.set(card.did, card);\n this.needsRebuild = true;\n logger.debug('Indexed Agent Card', { did: card.did, capabilities: card.capabilities.length });\n }\n\n /**\n * Remove an Agent Card from the index\n */\n removeAgentCard(did: string): void {\n this.cards.delete(did);\n this.needsRebuild = true;\n logger.debug('Removed Agent Card from index', { did });\n }\n\n /**\n * Search for agents matching a query\n */\n search(query: SemanticQuery): SearchResult[] {\n if (this.needsRebuild) {\n this.rebuild();\n }\n\n let results: SearchResult[] = [];\n\n // Text search using Lunr\n if (query.text && this.lunrIndex) {\n results = this.searchByText(query.text);\n }\n // Capability search using Fuse\n else if (query.capability && this.fuse) {\n results = this.searchByCapability(query.capability);\n }\n // No query - return all\n else {\n results = Array.from(this.cards.values()).map(card => ({\n card,\n score: 1.0,\n }));\n }\n\n // Apply filters\n if (query.filters) {\n results = this.applyFilters(results, query.filters);\n }\n\n // Sort by score (descending)\n results.sort((a, b) => b.score - a.score);\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n logger.debug('Search completed', { query, results: results.length });\n return results;\n }\n\n /**\n * Get all indexed cards\n */\n getAllCards(): AgentCard[] {\n return Array.from(this.cards.values());\n }\n\n /**\n * Clear the index\n */\n clear(): void {\n this.cards.clear();\n this.lunrIndex = undefined;\n this.fuse = undefined;\n this.needsRebuild = false;\n logger.info('Search index cleared');\n }\n\n /**\n * Get index size\n */\n size(): number {\n return this.cards.size;\n }\n\n /**\n * Rebuild search indexes\n */\n private rebuild(): void {\n logger.info('Rebuilding search indexes', { cards: this.cards.size });\n\n const cards = Array.from(this.cards.values());\n\n // Build Lunr index for full-text search\n this.lunrIndex = lunr(function (this: lunr.Builder) {\n this.ref('did');\n this.field('name', { boost: 10 });\n this.field('description', { boost: 5 });\n this.field('capabilities');\n\n for (const card of cards) {\n this.add({\n did: card.did,\n name: card.name,\n description: card.description,\n capabilities: card.capabilities\n .map((cap: any) => `${cap.name} ${cap.description}`)\n .join(' '),\n });\n }\n });\n\n // Build Fuse index for fuzzy matching\n this.fuse = new Fuse(Array.from(this.cards.values()), {\n keys: [\n { name: 'name', weight: 0.3 },\n { name: 'description', weight: 0.2 },\n { name: 'capabilities.name', weight: 0.3 },\n { name: 'capabilities.description', weight: 0.2 },\n ],\n threshold: 0.4,\n includeScore: true,\n });\n\n this.needsRebuild = false;\n logger.info('Search indexes rebuilt');\n }\n\n /**\n * Search by text using Lunr\n */\n private searchByText(text: string): SearchResult[] {\n if (!this.lunrIndex) return [];\n\n const lunrResults = this.lunrIndex.search(text);\n return lunrResults.map(result => ({\n card: this.cards.get(result.ref)!,\n score: result.score,\n }));\n }\n\n /**\n * Search by capability using Fuse\n */\n private searchByCapability(capability: string): SearchResult[] {\n if (!this.fuse) return [];\n\n const fuseResults = this.fuse.search(capability);\n return fuseResults.map(result => ({\n card: result.item,\n score: 1 - (result.score || 0), // Fuse score is distance, convert to similarity\n }));\n }\n\n /**\n * Apply filters to search results\n */\n private applyFilters(\n results: SearchResult[],\n filters: NonNullable<SemanticQuery['filters']>\n ): SearchResult[] {\n return results.filter(result => {\n const { card } = result;\n\n // Trust score filter\n if (filters.minTrustScore !== undefined && card.trust) {\n const overallTrust =\n card.trust.interactionScore * 0.4 +\n Math.min(card.trust.endorsements / 10, 1) * 0.2 +\n card.trust.completionRate * 0.2 +\n card.trust.uptime * 0.2;\n\n if (overallTrust < filters.minTrustScore) {\n return false;\n }\n }\n\n // Language filter (check capability metadata)\n if (filters.language) {\n const hasLanguage = card.capabilities.some(\n cap => {\n const metadata = cap.metadata as Record<string, any> | undefined;\n if (!metadata) return false;\n return metadata.language === filters.language ||\n (Array.isArray(metadata.languages) && metadata.languages.includes(filters.language));\n }\n );\n if (!hasLanguage) return false;\n }\n\n // Tags filter\n if (filters.tags && filters.tags.length > 0) {\n const cardTags = Array.isArray(card.metadata?.tags) ? (card.metadata.tags as string[]) : [];\n const hasAllTags = filters.tags.every(tag => cardTags.includes(tag));\n if (!hasAllTags) return false;\n }\n\n return true;\n });\n }\n}\n","/**\n * Capability Matcher\n *\n * Matches semantic queries against agent capabilities\n */\n\nimport type { Capability } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\n\n/**\n * Capability Matcher\n */\nexport class CapabilityMatcher {\n /**\n * Match a query against a capability\n * Returns a score between 0 and 1\n */\n match(query: SemanticQuery, capability: Capability): number {\n let score = 0;\n let weights = 0;\n\n // Exact capability ID match\n if (query.capability && capability.id === query.capability) {\n return 1.0;\n }\n\n // Fuzzy capability name match\n if (query.capability) {\n const nameScore = this.fuzzyMatch(query.capability, capability.name);\n score += nameScore * 0.4;\n weights += 0.4;\n }\n\n // Text keyword match\n if (query.text) {\n const keywords = this.extractKeywords(query.text);\n const keywordScore = this.matchKeywords(keywords, capability);\n score += keywordScore * 0.4;\n weights += 0.4;\n }\n\n // Type hierarchy match\n if (query.capability && capability['@type']) {\n const typeScore = this.matchesType(query.capability, capability['@type']) ? 0.6 : 0;\n score += typeScore * 0.2;\n weights += 0.2;\n }\n\n return weights > 0 ? score / weights : 0;\n }\n\n /**\n * Extract keywords from natural language text\n */\n extractKeywords(text: string): string[] {\n // Remove common stop words\n const stopWords = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been',\n 'to', 'from', 'in', 'on', 'at', 'by', 'for', 'with', 'about',\n 'can', 'could', 'should', 'would', 'will', 'do', 'does', 'did',\n 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her',\n ]);\n\n return text\n .toLowerCase()\n .split(/\\W+/)\n .filter(word => word.length > 2 && !stopWords.has(word));\n }\n\n /**\n * Match keywords against capability\n */\n matchKeywords(keywords: string[], capability: Capability): number {\n if (keywords.length === 0) return 0;\n\n const capText = `${capability.name} ${capability.description}`.toLowerCase();\n const matches = keywords.filter(keyword => capText.includes(keyword));\n\n return matches.length / keywords.length;\n }\n\n /**\n * Check if query matches capability type hierarchy\n */\n matchesType(query: string, type: string): boolean {\n const queryLower = query.toLowerCase();\n const typeLower = type.toLowerCase();\n\n // Direct match\n if (typeLower.includes(queryLower)) return true;\n\n // Common type mappings\n const typeMap: Record<string, string[]> = {\n translate: ['translation', 'translationservice'],\n review: ['codereview', 'reviewservice'],\n analyze: ['analysis', 'dataanalysis'],\n generate: ['generation', 'textgeneration', 'imagegeneration'],\n search: ['searchservice', 'query'],\n compute: ['computation', 'computationservice'],\n store: ['storage', 'storageservice'],\n message: ['messaging', 'messagingservice'],\n auth: ['authentication', 'authenticationservice'],\n };\n\n for (const [key, values] of Object.entries(typeMap)) {\n if (queryLower.includes(key) && values.some(v => typeLower.includes(v))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Fuzzy string matching using Levenshtein distance\n */\n private fuzzyMatch(query: string, target: string): number {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Exact match\n if (queryLower === targetLower) return 1.0;\n\n // Substring match\n if (targetLower.includes(queryLower)) return 0.8;\n if (queryLower.includes(targetLower)) return 0.7;\n\n // Levenshtein distance\n const distance = this.levenshteinDistance(queryLower, targetLower);\n const maxLen = Math.max(queryLower.length, targetLower.length);\n const similarity = 1 - distance / maxLen;\n\n // Only return positive scores for reasonable similarity\n return similarity > 0.5 ? similarity * 0.6 : 0;\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n }\n}\n","/**\n * Semantic Search Engine\n *\n * Provides intelligent agent discovery through semantic search\n * with local-first strategy and network fallback\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport { SearchIndex } from './search-index.js';\nimport type { SemanticQuery, SearchResult } from './search-index.js';\nimport { CapabilityMatcher } from './capability-matcher.js';\nimport type { DHTOperations } from './dht.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('semantic-search');\n\n/**\n * Semantic Search Engine\n */\nexport class SemanticSearchEngine {\n private index: SearchIndex;\n private matcher: CapabilityMatcher;\n\n constructor(private dht?: DHTOperations) {\n this.index = new SearchIndex();\n this.matcher = new CapabilityMatcher();\n }\n\n /**\n * Main search interface\n * Local-first with network fallback\n */\n async search(query: SemanticQuery): Promise<AgentCard[]> {\n logger.info('Searching for agents', { query });\n\n // 1. Search local index\n const localResults = this.index.search(query);\n logger.debug('Local search results', { count: localResults.length });\n\n // 2. If insufficient results, query network\n const limit = query.limit || 10;\n if (localResults.length < limit && this.dht) {\n logger.debug('Insufficient local results, querying network');\n const networkResults = await this.searchNetwork(query);\n return this.mergeResults(localResults, networkResults, limit);\n }\n\n return localResults.map(r => r.card);\n }\n\n /**\n * Index an Agent Card for local search\n */\n indexAgentCard(card: AgentCard): void {\n this.index.indexAgentCard(card);\n }\n\n /**\n * Remove an Agent Card from local index\n */\n removeAgentCard(did: string): void {\n this.index.removeAgentCard(did);\n }\n\n /**\n * Get all indexed cards\n */\n getAllIndexedCards(): AgentCard[] {\n return this.index.getAllCards();\n }\n\n /**\n * Clear local index\n */\n clearIndex(): void {\n this.index.clear();\n }\n\n /**\n * Get index size\n */\n getIndexSize(): number {\n return this.index.size();\n }\n\n /**\n * Search network via DHT\n */\n private async searchNetwork(query: SemanticQuery): Promise<SearchResult[]> {\n if (!this.dht) {\n return [];\n }\n\n try {\n // For now, use capability-based DHT query\n // In future, implement distributed semantic search overlay\n const capability = query.capability || this.extractPrimaryCapability(query.text);\n\n if (!capability) {\n logger.debug('No capability extracted from query, skipping network search');\n return [];\n }\n\n const cards = await this.dht.queryByCapability(capability);\n logger.debug('Network search results', { count: cards.length });\n\n // Score network results\n return cards.map(card => {\n const score = this.scoreCard(card, query);\n return { card, score };\n });\n } catch (error) {\n logger.error('Network search failed', { error });\n return [];\n }\n }\n\n /**\n * Merge local and network results, removing duplicates\n */\n private mergeResults(\n local: SearchResult[],\n network: SearchResult[],\n limit: number\n ): AgentCard[] {\n const seen = new Set<string>();\n const merged: SearchResult[] = [];\n\n // Add local results first (they're already scored and sorted)\n for (const result of local) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n }\n }\n\n // Add network results\n for (const result of network) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n\n // Also index for future searches\n this.index.indexAgentCard(result.card);\n }\n }\n\n // Sort by score and apply limit\n merged.sort((a, b) => b.score - a.score);\n return merged.slice(0, limit).map(r => r.card);\n }\n\n /**\n * Score a card against a query\n */\n private scoreCard(card: AgentCard, query: SemanticQuery): number {\n let totalScore = 0;\n let count = 0;\n\n for (const capability of card.capabilities) {\n const score = this.matcher.match(query, capability);\n if (score > 0) {\n totalScore += score;\n count++;\n }\n }\n\n // Average score across matching capabilities\n const avgScore = count > 0 ? totalScore / count : 0;\n\n // Boost by trust score if available\n if (card.trust) {\n const trustBoost = card.trust.interactionScore * 0.2;\n return Math.min(avgScore + trustBoost, 1.0);\n }\n\n return avgScore;\n }\n\n /**\n * Extract primary capability from natural language text\n */\n private extractPrimaryCapability(text?: string): string | undefined {\n if (!text) return undefined;\n\n const keywords = this.matcher.extractKeywords(text);\n\n // Common capability keywords\n const capabilityKeywords = [\n 'translate', 'translation',\n 'review', 'code',\n 'analyze', 'analysis',\n 'generate', 'generation',\n 'search', 'query',\n 'compute', 'calculation',\n 'store', 'storage',\n 'message', 'messaging',\n 'auth', 'authentication',\n ];\n\n // Find first matching keyword\n for (const keyword of keywords) {\n if (capabilityKeywords.includes(keyword)) {\n return keyword;\n }\n }\n\n // Return first keyword as fallback\n return keywords[0];\n }\n}\n\n/**\n * Create a semantic search engine\n */\nexport function createSemanticSearch(dht?: DHTOperations): SemanticSearchEngine {\n return new SemanticSearchEngine(dht);\n}\n","import { MessagingError } from '../utils/errors.js';\n\nexport interface MessageEnvelope {\n id: string;\n from: string; // DID\n to: string; // DID\n type: 'request' | 'response' | 'notification';\n protocol: string;\n payload: unknown;\n timestamp: number;\n signature: string;\n replyTo?: string; // For responses, the ID of the request\n}\n\n/**\n * Create a message envelope\n */\nexport function createEnvelope(\n from: string,\n to: string,\n type: 'request' | 'response' | 'notification',\n protocol: string,\n payload: unknown,\n replyTo?: string\n): Omit<MessageEnvelope, 'signature'> {\n return {\n id: generateMessageId(),\n from,\n to,\n type,\n protocol,\n payload,\n timestamp: Date.now(),\n replyTo,\n };\n}\n\n/**\n * Sign a message envelope\n */\nexport async function signEnvelope(\n envelope: Omit<MessageEnvelope, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<MessageEnvelope> {\n try {\n const envelopeJson = JSON.stringify(envelope);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signature = await signFn(envelopeBytes);\n\n return {\n ...envelope,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new MessagingError('Failed to sign envelope', error);\n }\n}\n\n/**\n * Verify a message envelope signature\n */\nexport async function verifyEnvelope(\n envelope: MessageEnvelope,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const envelopeJson = JSON.stringify(envelopeWithoutSig);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, envelopeBytes);\n } catch (error) {\n throw new MessagingError('Failed to verify envelope', error);\n }\n}\n\n/**\n * Validate message envelope structure\n */\nexport function validateEnvelope(msg: unknown): msg is MessageEnvelope {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const m = msg as Partial<MessageEnvelope>;\n\n return (\n typeof m.id === 'string' &&\n typeof m.from === 'string' &&\n m.from.startsWith('did:clawiverse:') &&\n typeof m.to === 'string' &&\n m.to.startsWith('did:clawiverse:') &&\n (m.type === 'request' || m.type === 'response' || m.type === 'notification') &&\n typeof m.protocol === 'string' &&\n m.payload !== undefined &&\n typeof m.timestamp === 'number' &&\n typeof m.signature === 'string'\n );\n}\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n","import { encode, decode } from 'cbor-x';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessagingError } from '../utils/errors.js';\n\n/**\n * Encode a message envelope to CBOR\n */\nexport function encodeMessage(envelope: MessageEnvelope): Uint8Array {\n try {\n return encode(envelope);\n } catch (error) {\n throw new MessagingError('Failed to encode message', error);\n }\n}\n\n/**\n * Decode a CBOR message to envelope\n */\nexport function decodeMessage(data: Uint8Array): MessageEnvelope {\n try {\n return decode(data) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message', error);\n }\n}\n\n/**\n * Encode message to JSON (for debugging/logging)\n */\nexport function encodeMessageJSON(envelope: MessageEnvelope): string {\n try {\n return JSON.stringify(envelope, null, 2);\n } catch (error) {\n throw new MessagingError('Failed to encode message to JSON', error);\n }\n}\n\n/**\n * Decode JSON message to envelope\n */\nexport function decodeMessageJSON(json: string): MessageEnvelope {\n try {\n return JSON.parse(json) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message from JSON', error);\n }\n}\n","import type { MessageEnvelope } from './envelope.js';\nimport type { RelayClient } from '../transport/relay-client.js';\nimport { encodeMessage, decodeMessage } from './codec.js';\nimport { validateEnvelope, verifyEnvelope } from './envelope.js';\nimport { createLogger } from '../utils/logger.js';\nimport { MessagingError } from '../utils/errors.js';\nimport { extractPublicKey } from '../identity/did.js';\nimport { verify } from '../identity/keys.js';\n\nconst logger = createLogger('router');\n\nexport type MessageHandler = (\n envelope: MessageEnvelope\n) => Promise<MessageEnvelope | void>;\n\nexport interface MessageRouter {\n registerHandler: (protocol: string, handler: MessageHandler) => void;\n unregisterHandler: (protocol: string) => void;\n registerCatchAllHandler: (handler: MessageHandler) => void;\n sendMessage: (envelope: MessageEnvelope) => Promise<MessageEnvelope | void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\n/**\n * Create a message router using relay client (CVP-0011)\n */\nexport function createMessageRouter(\n relayClient: RelayClient,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): MessageRouter {\n const handlers = new Map<string, MessageHandler>();\n let catchAllHandler: MessageHandler | undefined;\n\n // Map to track pending requests waiting for responses\n const pendingRequests = new Map<string, {\n resolve: (envelope: MessageEnvelope | undefined) => void;\n timeout: NodeJS.Timeout;\n }>();\n\n return {\n registerHandler: (protocol: string, handler: MessageHandler) => {\n handlers.set(protocol, handler);\n logger.info('Registered message handler', { protocol });\n },\n\n unregisterHandler: (protocol: string) => {\n handlers.delete(protocol);\n logger.info('Unregistered message handler', { protocol });\n },\n\n registerCatchAllHandler: (handler: MessageHandler) => {\n catchAllHandler = handler;\n logger.info('Registered catch-all message handler');\n },\n\n sendMessage: async (envelope: MessageEnvelope) => {\n try {\n if (!validateEnvelope(envelope)) {\n throw new MessagingError('Invalid message envelope');\n }\n\n const encoded = encodeMessage(envelope);\n await relayClient.sendEnvelope(envelope.to, encoded);\n\n logger.info('Message sent via relay', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n });\n\n // If this is a request, wait for response\n if (envelope.type === 'request') {\n logger.debug('Waiting for response to request', { id: envelope.id });\n\n const RESPONSE_TIMEOUT = 30000; // 30 seconds (CVP-0010 §4.2)\n\n return new Promise<MessageEnvelope | undefined>((resolve) => {\n const timeout = setTimeout(() => {\n pendingRequests.delete(envelope.id);\n logger.warn('Response timeout', { id: envelope.id, timeout: RESPONSE_TIMEOUT });\n resolve(undefined);\n }, RESPONSE_TIMEOUT);\n\n pendingRequests.set(envelope.id, { resolve, timeout });\n });\n }\n\n return undefined;\n } catch (error) {\n if (error instanceof MessagingError) throw error;\n throw new MessagingError('Failed to send message', error);\n }\n },\n\n start: async () => {\n // Register handler for incoming DELIVER messages\n relayClient.onDeliver(async (deliverMsg) => {\n try {\n const envelope = decodeMessage(deliverMsg.envelope);\n\n if (!validateEnvelope(envelope)) {\n logger.warn('Received invalid message envelope');\n return;\n }\n\n // Verify signature against sender DID embedded public key\n const isValidSignature = await verifyEnvelope(envelope, async (signature, data) => {\n const senderPublicKey = extractPublicKey(envelope.from);\n return verify(signature, data, senderPublicKey);\n });\n if (!isValidSignature) {\n logger.warn('Received message with invalid signature', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n\n // Optional caller-supplied verification hook (e.g. policy checks)\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const dataBytes = new TextEncoder().encode(JSON.stringify(envelopeWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const hookValid = await verifyFn(signatureBytes, dataBytes);\n if (!hookValid) {\n logger.warn('Message rejected by custom verifier', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n } catch (error) {\n logger.warn('Custom verification hook failed', {\n id: envelope.id,\n from: envelope.from,\n error: (error as Error).message,\n });\n return;\n }\n\n logger.info('Received message', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n type: envelope.type,\n });\n\n // Check if this is a response to a pending request\n if (envelope.type === 'response' && envelope.replyTo) {\n const pending = pendingRequests.get(envelope.replyTo);\n if (pending) {\n clearTimeout(pending.timeout);\n pendingRequests.delete(envelope.replyTo);\n pending.resolve(envelope);\n logger.info('Matched response to pending request', {\n requestId: envelope.replyTo,\n responseId: envelope.id,\n });\n return;\n }\n }\n\n // Dispatch to handler\n const handler = handlers.get(envelope.protocol);\n let response: MessageEnvelope | void = undefined;\n\n if (handler) {\n response = await handler(envelope);\n } else if (catchAllHandler) {\n logger.debug('Using catch-all handler for protocol', { protocol: envelope.protocol });\n response = await catchAllHandler(envelope);\n } else {\n logger.warn('No handler for protocol', { protocol: envelope.protocol });\n }\n\n // Send response back if handler returned one\n if (response) {\n const encoded = encodeMessage(response);\n await relayClient.sendEnvelope(response.to, encoded);\n logger.info('Sent response back to sender', {\n responseId: response.id,\n replyTo: response.replyTo,\n });\n }\n } catch (error) {\n logger.error('Error handling incoming message', error);\n }\n });\n\n logger.info('Message router started');\n },\n\n stop: async () => {\n // Clear all pending requests\n for (const [, pending] of pendingRequests.entries()) {\n clearTimeout(pending.timeout);\n pending.resolve(undefined);\n }\n pendingRequests.clear();\n\n handlers.clear();\n catchAllHandler = undefined;\n logger.info('Message router stopped');\n },\n };\n}\n","/**\n * Message Storage - LevelDB operations for message queue\n *\n * Key schema:\n * msg:inbound:{timestamp}:{id} → StoredMessage\n * msg:outbound:{timestamp}:{id} → StoredMessage\n * block:{did} → BlocklistEntry\n * allow:{did} → AllowlistEntry\n * seen:{messageId} → SeenEntry\n * rate:{did} → RateLimitState\n * idx:from:{did}:{timestamp}:{id} → '1'\n */\n\nimport { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\nimport type {\n StoredMessage,\n BlocklistEntry,\n AllowlistEntry,\n SeenEntry,\n RateLimitState,\n MessageFilter,\n PaginationOptions,\n MessagePage,\n} from './types.js';\n\nconst logger = createLogger('message-storage');\n\nexport class MessageStorage {\n private db: Level<string, any>;\n private ready = false;\n\n constructor(dbPath: string) {\n this.db = new Level<string, any>(dbPath, { valueEncoding: 'json' });\n }\n\n async open(): Promise<void> {\n await this.db.open();\n this.ready = true;\n logger.info('Message storage opened');\n }\n\n async close(): Promise<void> {\n if (this.ready) {\n await this.db.close();\n this.ready = false;\n logger.info('Message storage closed');\n }\n }\n\n // ─── Message Operations ───────────────────────────────────────────────────\n\n async putMessage(msg: StoredMessage): Promise<void> {\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${msg.envelope.id}`;\n await this.db.put(key, msg);\n\n // Secondary index by sender\n const idxKey = `idx:from:${msg.envelope.from}:${ts}:${msg.envelope.id}`;\n await this.db.put(idxKey, '1');\n }\n\n async getMessage(id: string): Promise<StoredMessage | null> {\n // Scan both directions since we don't know the timestamp\n for (const direction of ['inbound', 'outbound'] as const) {\n const prefix = `msg:${direction}:`;\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n valueEncoding: 'json',\n })) {\n if (value.envelope.id === id) return value;\n }\n }\n return null;\n }\n\n async updateMessage(id: string, updates: Partial<StoredMessage>): Promise<void> {\n const msg = await this.getMessage(id);\n if (!msg) return;\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${id}`;\n await this.db.put(key, { ...msg, ...updates });\n }\n\n async deleteMessage(id: string): Promise<void> {\n const msg = await this.getMessage(id);\n if (!msg) return;\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${id}`;\n const idxKey = `idx:from:${msg.envelope.from}:${ts}:${id}`;\n await this.db.batch([\n { type: 'del', key },\n { type: 'del', key: idxKey },\n ]);\n }\n\n async queryMessages(\n direction: 'inbound' | 'outbound',\n filter: MessageFilter = {},\n pagination: PaginationOptions = {}\n ): Promise<MessagePage> {\n const { limit = 50, offset = 0 } = pagination;\n const prefix = `msg:${direction}:`;\n const results: StoredMessage[] = [];\n let total = 0;\n let skipped = 0;\n\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n reverse: true, // newest first\n valueEncoding: 'json',\n })) {\n if (!this.matchesFilter(value, filter)) continue;\n total++;\n if (skipped < offset) { skipped++; continue; }\n if (results.length < limit) results.push(value);\n }\n\n return {\n messages: results,\n total,\n hasMore: total > offset + results.length,\n };\n }\n\n private matchesFilter(msg: StoredMessage, filter: MessageFilter): boolean {\n if (filter.fromDid) {\n const froms = Array.isArray(filter.fromDid) ? filter.fromDid : [filter.fromDid];\n if (!froms.includes(msg.envelope.from)) return false;\n }\n if (filter.toDid) {\n const tos = Array.isArray(filter.toDid) ? filter.toDid : [filter.toDid];\n if (!tos.includes(msg.envelope.to)) return false;\n }\n if (filter.protocol) {\n const protos = Array.isArray(filter.protocol) ? filter.protocol : [filter.protocol];\n if (!protos.includes(msg.envelope.protocol)) return false;\n }\n if (filter.type && msg.envelope.type !== filter.type) return false;\n if (filter.unreadOnly && msg.readAt != null) return false;\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n if (!statuses.includes(msg.status)) return false;\n }\n if (filter.maxAge) {\n const age = Date.now() - (msg.receivedAt ?? msg.sentAt ?? 0);\n if (age > filter.maxAge) return false;\n }\n if (filter.minTrustScore != null && (msg.trustScore ?? 0) < filter.minTrustScore) return false;\n return true;\n }\n\n async countMessages(direction: 'inbound' | 'outbound', filter: MessageFilter = {}): Promise<number> {\n const prefix = `msg:${direction}:`;\n let count = 0;\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n valueEncoding: 'json',\n })) {\n if (this.matchesFilter(value, filter)) count++;\n }\n return count;\n }\n\n // ─── Blocklist ────────────────────────────────────────────────────────────\n\n async putBlock(entry: BlocklistEntry): Promise<void> {\n await this.db.put(`block:${entry.did}`, entry);\n }\n\n async getBlock(did: string): Promise<BlocklistEntry | null> {\n try {\n return await this.db.get(`block:${did}`);\n } catch {\n return null;\n }\n }\n\n async deleteBlock(did: string): Promise<void> {\n try { await this.db.del(`block:${did}`); } catch { /* not found */ }\n }\n\n async listBlocked(): Promise<BlocklistEntry[]> {\n const results: BlocklistEntry[] = [];\n for await (const [, value] of this.db.iterator<string, BlocklistEntry>({\n gte: 'block:',\n lte: 'block:\\xff',\n valueEncoding: 'json',\n })) {\n results.push(value);\n }\n return results;\n }\n\n // ─── Allowlist ────────────────────────────────────────────────────────────\n\n async putAllow(entry: AllowlistEntry): Promise<void> {\n await this.db.put(`allow:${entry.did}`, entry);\n }\n\n async getAllow(did: string): Promise<AllowlistEntry | null> {\n try {\n return await this.db.get(`allow:${did}`);\n } catch {\n return null;\n }\n }\n\n async deleteAllow(did: string): Promise<void> {\n try { await this.db.del(`allow:${did}`); } catch { /* not found */ }\n }\n\n async listAllowed(): Promise<AllowlistEntry[]> {\n const results: AllowlistEntry[] = [];\n for await (const [, value] of this.db.iterator<string, AllowlistEntry>({\n gte: 'allow:',\n lte: 'allow:\\xff',\n valueEncoding: 'json',\n })) {\n results.push(value);\n }\n return results;\n }\n\n // ─── Seen Cache ───────────────────────────────────────────────────────────\n\n async putSeen(entry: SeenEntry): Promise<void> {\n await this.db.put(`seen:${entry.messageId}`, entry);\n }\n\n async getSeen(messageId: string): Promise<SeenEntry | null> {\n try {\n return await this.db.get(`seen:${messageId}`);\n } catch {\n return null;\n }\n }\n\n async cleanupSeen(maxAgeMs: number): Promise<void> {\n const cutoff = Date.now() - maxAgeMs;\n const toDelete: string[] = [];\n for await (const [key, value] of this.db.iterator<string, SeenEntry>({\n gte: 'seen:',\n lte: 'seen:\\xff',\n valueEncoding: 'json',\n })) {\n if (value.seenAt < cutoff) toDelete.push(key);\n }\n await this.db.batch(toDelete.map((key) => ({ type: 'del' as const, key })));\n }\n\n // ─── Rate Limit State ─────────────────────────────────────────────────────\n\n async putRateLimit(state: RateLimitState): Promise<void> {\n await this.db.put(`rate:${state.did}`, state);\n }\n\n async getRateLimit(did: string): Promise<RateLimitState | null> {\n try {\n return await this.db.get(`rate:${did}`);\n } catch {\n return null;\n }\n }\n\n async cleanupRateLimits(maxAgeMs: number): Promise<void> {\n const cutoff = Date.now() - maxAgeMs;\n const toDelete: string[] = [];\n for await (const [key, value] of this.db.iterator<string, RateLimitState>({\n gte: 'rate:',\n lte: 'rate:\\xff',\n valueEncoding: 'json',\n })) {\n if (value.lastRefill < cutoff) toDelete.push(key);\n }\n await this.db.batch(toDelete.map((key) => ({ type: 'del' as const, key })));\n }\n}\n","/**\n * Message Queue\n *\n * Persistent inbox/outbox backed by LevelDB.\n * Supports real-time subscriptions and pagination.\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessageStorage } from './storage.js';\nimport type {\n StoredMessage,\n MessageFilter,\n PaginationOptions,\n MessagePage,\n MessageCallback,\n SubscriptionFilter,\n QueueStats,\n} from './types.js';\n\nconst logger = createLogger('message-queue');\n\nexport interface MessageQueueConfig {\n dbPath: string;\n}\n\ninterface Subscription {\n id: string;\n filter: SubscriptionFilter;\n callback: MessageCallback;\n}\n\nexport class MessageQueue {\n private storage: MessageStorage;\n private subscriptions = new Map<string, Subscription>();\n private subCounter = 0;\n\n constructor(config: MessageQueueConfig) {\n this.storage = new MessageStorage(config.dbPath);\n }\n\n get store(): MessageStorage {\n return this.storage;\n }\n\n async start(): Promise<void> {\n await this.storage.open();\n logger.info('Message queue started');\n }\n\n async stop(): Promise<void> {\n await this.storage.close();\n this.subscriptions.clear();\n logger.info('Message queue stopped');\n }\n\n // ─── Inbox ────────────────────────────────────────────────────────────────\n\n async getInbox(filter: MessageFilter = {}, pagination: PaginationOptions = {}): Promise<MessagePage> {\n return this.storage.queryMessages('inbound', filter, pagination);\n }\n\n async getMessage(id: string): Promise<StoredMessage | null> {\n return this.storage.getMessage(id);\n }\n\n async markAsRead(id: string): Promise<void> {\n await this.storage.updateMessage(id, { readAt: Date.now() });\n }\n\n async deleteMessage(id: string): Promise<void> {\n await this.storage.deleteMessage(id);\n }\n\n // ─── Outbox ───────────────────────────────────────────────────────────────\n\n async getOutbox(pagination: PaginationOptions = {}): Promise<MessagePage> {\n return this.storage.queryMessages('outbound', {}, pagination);\n }\n\n async retryMessage(id: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'pending', error: undefined });\n }\n\n // ─── Enqueue ──────────────────────────────────────────────────────────────\n\n async enqueueInbound(envelope: MessageEnvelope, trustScore?: number): Promise<StoredMessage> {\n const msg: StoredMessage = {\n envelope,\n direction: 'inbound',\n status: 'pending',\n receivedAt: Date.now(),\n trustScore,\n };\n await this.storage.putMessage(msg);\n logger.debug('Enqueued inbound message', { id: envelope.id, from: envelope.from });\n this.notifySubscribers(msg);\n return msg;\n }\n\n async enqueueOutbound(envelope: MessageEnvelope): Promise<StoredMessage> {\n const msg: StoredMessage = {\n envelope,\n direction: 'outbound',\n status: 'pending',\n sentAt: Date.now(),\n };\n await this.storage.putMessage(msg);\n logger.debug('Enqueued outbound message', { id: envelope.id, to: envelope.to });\n return msg;\n }\n\n async markOutboundDelivered(id: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'delivered' });\n }\n\n async markOutboundFailed(id: string, error: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'failed', error });\n }\n\n // ─── Subscriptions ────────────────────────────────────────────────────────\n\n subscribe(filter: SubscriptionFilter, callback: MessageCallback): string {\n const id = `sub_${++this.subCounter}`;\n this.subscriptions.set(id, { id, filter, callback });\n logger.debug('Subscription added', { id });\n return id;\n }\n\n unsubscribe(subscriptionId: string): void {\n this.subscriptions.delete(subscriptionId);\n logger.debug('Subscription removed', { id: subscriptionId });\n }\n\n private notifySubscribers(msg: StoredMessage): void {\n for (const sub of this.subscriptions.values()) {\n if (this.matchesSubscriptionFilter(msg, sub.filter)) {\n Promise.resolve(sub.callback(msg)).catch((err) => {\n logger.warn('Subscription callback error', { id: sub.id, error: (err as Error).message });\n });\n }\n }\n }\n\n private matchesSubscriptionFilter(msg: StoredMessage, filter: SubscriptionFilter): boolean {\n if (filter.fromDid) {\n const froms = Array.isArray(filter.fromDid) ? filter.fromDid : [filter.fromDid];\n if (!froms.includes(msg.envelope.from)) return false;\n }\n if (filter.protocol) {\n const protos = Array.isArray(filter.protocol) ? filter.protocol : [filter.protocol];\n if (!protos.includes(msg.envelope.protocol)) return false;\n }\n if (filter.type && msg.envelope.type !== filter.type) return false;\n return true;\n }\n\n // ─── Stats ────────────────────────────────────────────────────────────────\n\n async getStats(): Promise<QueueStats> {\n const [inboxTotal, inboxUnread, outboxPending, outboxFailed, blocked, allowed] =\n await Promise.all([\n this.storage.countMessages('inbound'),\n this.storage.countMessages('inbound', { unreadOnly: true }),\n this.storage.countMessages('outbound', { status: 'pending' }),\n this.storage.countMessages('outbound', { status: 'failed' }),\n this.storage.listBlocked().then((l) => l.length),\n this.storage.listAllowed().then((l) => l.length),\n ]);\n\n return {\n inboxTotal,\n inboxUnread,\n outboxPending,\n outboxFailed,\n blockedAgents: blocked,\n allowedAgents: allowed,\n rateLimitedAgents: 0,\n };\n }\n}\n","/**\n * Token Bucket Rate Limiter\n *\n * Classic token bucket algorithm for per-sender rate limiting.\n * Tokens refill at a constant rate up to capacity.\n */\n\nexport interface TokenBucketConfig {\n capacity: number; // Max tokens (burst size)\n refillRate: number; // Tokens per millisecond\n}\n\nexport class TokenBucket {\n private tokens: number;\n private lastRefill: number;\n private readonly capacity: number;\n private readonly refillRate: number; // tokens per ms\n\n constructor(config: TokenBucketConfig, initialTokens?: number, lastRefill?: number) {\n this.capacity = config.capacity;\n this.refillRate = config.refillRate;\n this.tokens = initialTokens ?? config.capacity;\n this.lastRefill = lastRefill ?? Date.now();\n }\n\n /** Attempt to consume one token. Returns true if allowed. */\n consume(): boolean {\n this.refill();\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n return false;\n }\n\n getRemaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /** Milliseconds until at least one token is available */\n getResetTime(): number {\n this.refill();\n if (this.tokens >= 1) return 0;\n const needed = 1 - this.tokens;\n return Math.ceil(needed / this.refillRate);\n }\n\n /** Serialize state for persistence */\n toState(): { tokens: number; lastRefill: number } {\n return { tokens: this.tokens, lastRefill: this.lastRefill };\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n this.tokens = Math.min(this.capacity, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n\n/**\n * Rate limiter tiers based on trust score\n */\nexport interface RateLimitTiers {\n /** Trust < 0.3: new/unknown agents */\n newAgent: TokenBucketConfig;\n /** Trust 0.3–0.6: established agents */\n established: TokenBucketConfig;\n /** Trust > 0.6: trusted agents */\n trusted: TokenBucketConfig;\n}\n\nexport const DEFAULT_RATE_LIMIT_TIERS: RateLimitTiers = {\n newAgent: { capacity: 10, refillRate: 10 / (60 * 1000) }, // 10/min, burst 10\n established: { capacity: 100, refillRate: 60 / (60 * 1000) }, // 60/min, burst 100\n trusted: { capacity: 1000, refillRate: 600 / (60 * 1000) }, // 600/min, burst 1000\n};\n\nexport function getTierConfig(trustScore: number, tiers: RateLimitTiers): TokenBucketConfig {\n if (trustScore >= 0.6) return tiers.trusted;\n if (trustScore >= 0.3) return tiers.established;\n return tiers.newAgent;\n}\n","/**\n * Defense Middleware\n *\n * Checks incoming messages against:\n * 1. Allowlist bypass\n * 2. Blocklist rejection\n * 3. Deduplication (seen cache)\n * 4. Trust score filtering\n * 5. Rate limiting (token bucket, tiered by trust)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport type { MessageEnvelope } from './envelope.js';\nimport type { TrustSystem } from '../trust/index.js';\nimport type { MessageStorage } from './storage.js';\nimport type { DefenseResult, RateLimitResult } from './types.js';\nimport {\n TokenBucket,\n DEFAULT_RATE_LIMIT_TIERS,\n getTierConfig,\n type RateLimitTiers,\n} from './rate-limiter.js';\n\nconst logger = createLogger('defense');\n\nexport interface DefenseConfig {\n trustSystem: TrustSystem;\n storage: MessageStorage;\n /** Minimum trust score to accept messages (0 = accept all) */\n minTrustScore?: number;\n /** Auto-block agents below this score */\n autoBlockThreshold?: number;\n rateLimitTiers?: RateLimitTiers;\n /** TTL for seen-cache entries in ms (default: 1 hour) */\n seenTtlMs?: number;\n}\n\nexport class DefenseMiddleware {\n private readonly trust: TrustSystem;\n private readonly storage: MessageStorage;\n private readonly minTrustScore: number;\n private readonly autoBlockThreshold: number;\n private readonly tiers: RateLimitTiers;\n private readonly seenTtlMs: number;\n\n // In-memory LRU-style seen cache (backed by LevelDB for persistence)\n private readonly seenCache = new Map<string, number>(); // id → seenAt\n private readonly MAX_SEEN_CACHE = 10_000;\n\n // In-memory token buckets (backed by LevelDB for persistence)\n private readonly buckets = new Map<string, TokenBucket>();\n\n constructor(config: DefenseConfig) {\n this.trust = config.trustSystem;\n this.storage = config.storage;\n this.minTrustScore = config.minTrustScore ?? 0;\n this.autoBlockThreshold = config.autoBlockThreshold ?? 0.1;\n this.tiers = config.rateLimitTiers ?? DEFAULT_RATE_LIMIT_TIERS;\n this.seenTtlMs = config.seenTtlMs ?? 60 * 60 * 1000; // 1 hour\n }\n\n /**\n * Run all defense checks on an incoming message.\n * Returns { allowed: true } if the message should be processed,\n * or { allowed: false, reason } if it should be dropped.\n */\n async checkMessage(envelope: MessageEnvelope): Promise<DefenseResult> {\n const did = envelope.from;\n\n // 1. Allowlist bypass — skip all other checks\n if (await this.isAllowed(did)) {\n this.markAsSeen(envelope.id);\n return { allowed: true };\n }\n\n // 2. Blocklist check\n if (await this.isBlocked(did)) {\n logger.debug('Message rejected: blocked', { id: envelope.id, from: did });\n return { allowed: false, reason: 'blocked' };\n }\n\n // 3. Deduplication\n if (this.hasSeen(envelope.id)) {\n logger.debug('Message rejected: duplicate', { id: envelope.id });\n return { allowed: false, reason: 'duplicate' };\n }\n\n // 4. Trust score check\n let trustScore = 0;\n try {\n const score = await this.trust.getTrustScore(did);\n trustScore = score.interactionScore;\n\n // Auto-block very low trust agents\n if (trustScore < this.autoBlockThreshold && trustScore > 0) {\n logger.warn('Auto-blocking low-trust agent', { did, trustScore });\n await this.blockAgent(did, `Auto-blocked: trust score ${trustScore.toFixed(2)} below threshold`);\n return { allowed: false, reason: 'blocked' };\n }\n\n if (trustScore < this.minTrustScore) {\n logger.debug('Message rejected: trust too low', { id: envelope.id, trustScore });\n return { allowed: false, reason: 'trust_too_low', trustScore };\n }\n } catch (err) {\n logger.warn('Trust score lookup failed, using 0', { did, error: (err as Error).message });\n }\n\n // 5. Rate limiting (tiered by trust)\n const rateLimitResult = await this.checkRateLimit(did, trustScore);\n if (!rateLimitResult.allowed) {\n logger.debug('Message rejected: rate limited', {\n id: envelope.id,\n from: did,\n resetTime: rateLimitResult.resetTime,\n });\n return {\n allowed: false,\n reason: 'rate_limited',\n remainingTokens: rateLimitResult.remaining,\n resetTime: rateLimitResult.resetTime,\n };\n }\n\n // All checks passed\n this.markAsSeen(envelope.id);\n return { allowed: true, trustScore, remainingTokens: rateLimitResult.remaining };\n }\n\n // ─── Blocklist ────────────────────────────────────────────────────────────\n\n async blockAgent(did: string, reason: string, blockedBy = 'local'): Promise<void> {\n await this.storage.putBlock({ did, reason, blockedAt: Date.now(), blockedBy });\n logger.info('Agent blocked', { did, reason });\n }\n\n async unblockAgent(did: string): Promise<void> {\n await this.storage.deleteBlock(did);\n logger.info('Agent unblocked', { did });\n }\n\n async isBlocked(did: string): Promise<boolean> {\n return (await this.storage.getBlock(did)) !== null;\n }\n\n // ─── Allowlist ────────────────────────────────────────────────────────────\n\n async allowAgent(did: string, note?: string): Promise<void> {\n await this.storage.putAllow({ did, addedAt: Date.now(), note });\n logger.info('Agent allowlisted', { did });\n }\n\n async removeFromAllowlist(did: string): Promise<void> {\n await this.storage.deleteAllow(did);\n logger.info('Agent removed from allowlist', { did });\n }\n\n async isAllowed(did: string): Promise<boolean> {\n return (await this.storage.getAllow(did)) !== null;\n }\n\n // ─── Rate Limiting ────────────────────────────────────────────────────────\n\n async checkRateLimit(did: string, trustScore: number): Promise<RateLimitResult> {\n const tierConfig = getTierConfig(trustScore, this.tiers);\n\n // Load or create bucket\n let bucket = this.buckets.get(did);\n if (!bucket) {\n // Try to restore from LevelDB\n const persisted = await this.storage.getRateLimit(did);\n if (persisted) {\n bucket = new TokenBucket(tierConfig, persisted.tokens, persisted.lastRefill);\n } else {\n bucket = new TokenBucket(tierConfig);\n }\n this.buckets.set(did, bucket);\n }\n\n const allowed = bucket.consume();\n const state = bucket.toState();\n\n // Persist updated state\n await this.storage.putRateLimit({\n did,\n tokens: state.tokens,\n lastRefill: state.lastRefill,\n totalRequests: 0,\n firstSeen: Date.now(),\n });\n\n return {\n allowed,\n remaining: bucket.getRemaining(),\n resetTime: bucket.getResetTime(),\n limit: tierConfig.capacity,\n };\n }\n\n // ─── Seen Cache (deduplication) ───────────────────────────────────────────\n\n hasSeen(messageId: string): boolean {\n return this.seenCache.has(messageId);\n }\n\n markAsSeen(messageId: string): void {\n // Evict oldest entries if at capacity\n if (this.seenCache.size >= this.MAX_SEEN_CACHE) {\n const firstKey = this.seenCache.keys().next().value;\n if (firstKey) this.seenCache.delete(firstKey);\n }\n this.seenCache.set(messageId, Date.now());\n\n // Persist to LevelDB (fire-and-forget)\n this.storage.putSeen({ messageId, seenAt: Date.now(), fromDid: '' }).catch(() => {});\n }\n\n /** Periodic cleanup of expired seen entries */\n async cleanupSeen(): Promise<void> {\n const cutoff = Date.now() - this.seenTtlMs;\n for (const [id, seenAt] of this.seenCache) {\n if (seenAt < cutoff) this.seenCache.delete(id);\n }\n await this.storage.cleanupSeen(this.seenTtlMs);\n }\n\n /** Periodic cleanup of stale rate limit buckets (24h inactive) */\n async cleanupRateLimits(): Promise<void> {\n const staleMs = 24 * 60 * 60 * 1000;\n const cutoff = Date.now() - staleMs;\n for (const [did, bucket] of this.buckets) {\n if (bucket.toState().lastRefill < cutoff) this.buckets.delete(did);\n }\n await this.storage.cleanupRateLimits(staleMs);\n }\n}\n","/**\n * Trust Score System\n *\n * Tracks agent reputation based on interactions, endorsements,\n * and network behavior.\n */\n\n/**\n * Trust Score Metrics\n */\nexport interface TrustScore {\n interactionScore: number; // 0-1, based on successful interactions\n endorsements: number; // Count of endorsements\n completionRate: number; // % of completed tasks (0-1)\n responseTime: number; // Average response time (ms)\n uptime: number; // % of time online last 30 days (0-1)\n lastUpdated: number; // Timestamp\n}\n\n/**\n * Interaction Record\n */\nexport interface Interaction {\n agentDid: string;\n timestamp: number;\n type: 'message' | 'task' | 'query';\n success: boolean;\n responseTime: number;\n rating?: number; // 1-5 stars (optional user rating)\n feedback?: string;\n}\n\n/**\n * Interaction Statistics\n */\nexport interface InteractionStats {\n totalInteractions: number;\n successRate: number;\n avgResponseTime: number;\n lastInteraction: number;\n}\n\n/**\n * Trust Metrics Calculator\n */\nexport class TrustMetrics {\n /**\n * Calculate trust score from interaction history\n */\n calculateScore(stats: InteractionStats, endorsements: number, uptime: number): TrustScore {\n // Interaction score: weighted by success rate and volume\n const volumeWeight = Math.min(stats.totalInteractions / 100, 1); // Cap at 100 interactions\n const interactionScore = stats.successRate * volumeWeight;\n\n // Completion rate is same as success rate for now\n const completionRate = stats.successRate;\n\n return {\n interactionScore,\n endorsements,\n completionRate,\n responseTime: stats.avgResponseTime,\n uptime,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Calculate overall trust level (0-1)\n */\n calculateOverallTrust(score: TrustScore): number {\n // Weighted average of different factors\n const weights = {\n interaction: 0.4,\n endorsement: 0.2,\n completion: 0.2,\n uptime: 0.2,\n };\n\n const endorsementScore = Math.min(score.endorsements / 10, 1); // Cap at 10 endorsements\n\n return (\n score.interactionScore * weights.interaction +\n endorsementScore * weights.endorsement +\n score.completionRate * weights.completion +\n score.uptime * weights.uptime\n );\n }\n\n /**\n * Get trust level category\n */\n getTrustLevel(score: TrustScore): 'new' | 'low' | 'medium' | 'high' | 'trusted' {\n const overall = this.calculateOverallTrust(score);\n\n if (score.interactionScore === 0) return 'new';\n if (overall < 0.3) return 'low';\n if (overall < 0.6) return 'medium';\n if (overall < 0.8) return 'high';\n return 'trusted';\n }\n\n /**\n * Check if agent should be rate limited\n */\n shouldRateLimit(score: TrustScore, agentAge: number): boolean {\n const overall = this.calculateOverallTrust(score);\n const ONE_DAY = 24 * 60 * 60 * 1000;\n\n // New agents (< 24 hours) with low trust\n if (agentAge < ONE_DAY && overall < 0.3) {\n return true;\n }\n\n // Very low trust regardless of age\n if (overall < 0.1) {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Default trust score for new agents\n */\nexport function createDefaultTrustScore(): TrustScore {\n return {\n interactionScore: 0,\n endorsements: 0,\n completionRate: 0,\n responseTime: 0,\n uptime: 1.0, // Assume online initially\n lastUpdated: Date.now(),\n };\n}\n","/**\n * Interaction History Tracker\n *\n * Records and queries agent interaction history for trust scoring\n */\n\nimport { Level } from 'level';\nimport type { Interaction, InteractionStats } from './trust-score.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('interaction-history');\n\n/**\n * Interaction History Manager\n */\nexport class InteractionHistory {\n private db: Level<string, Interaction>;\n\n constructor(dbPath: string) {\n this.db = new Level(dbPath, { valueEncoding: 'json' });\n }\n\n /**\n * Open database connection\n */\n async open(): Promise<void> {\n await this.db.open();\n logger.info('Interaction history database opened', { path: this.db.location });\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await this.db.close();\n logger.info('Interaction history database closed');\n }\n\n /**\n * Record an interaction\n */\n async record(interaction: Interaction): Promise<void> {\n const key = `interaction:${interaction.agentDid}:${interaction.timestamp}`;\n await this.db.put(key, interaction);\n logger.debug('Recorded interaction', { agentDid: interaction.agentDid, type: interaction.type });\n }\n\n /**\n * Get interaction history for an agent\n */\n async getHistory(agentDid: string, limit = 100): Promise<Interaction[]> {\n const interactions: Interaction[] = [];\n const prefix = `interaction:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n limit,\n reverse: true, // Most recent first\n })) {\n interactions.push(value);\n }\n } catch (error) {\n logger.error('Failed to get interaction history', { agentDid, error });\n }\n\n return interactions;\n }\n\n /**\n * Get interaction statistics for an agent\n */\n async getStats(agentDid: string): Promise<InteractionStats> {\n const history = await this.getHistory(agentDid, 1000); // Last 1000 interactions\n\n if (history.length === 0) {\n return {\n totalInteractions: 0,\n successRate: 0,\n avgResponseTime: 0,\n lastInteraction: 0,\n };\n }\n\n const successCount = history.filter(i => i.success).length;\n const totalResponseTime = history.reduce((sum, i) => sum + i.responseTime, 0);\n\n return {\n totalInteractions: history.length,\n successRate: successCount / history.length,\n avgResponseTime: totalResponseTime / history.length,\n lastInteraction: history[0].timestamp,\n };\n }\n\n /**\n * Get all agents with interaction history\n */\n async getAllAgents(): Promise<string[]> {\n const agents = new Set<string>();\n\n try {\n for await (const [key] of this.db.iterator()) {\n const match = key.match(/^interaction:([^:]+):/);\n if (match) {\n agents.add(match[1]);\n }\n }\n } catch (error) {\n logger.error('Failed to get all agents', { error });\n }\n\n return Array.from(agents);\n }\n\n /**\n * Delete all interactions for an agent\n */\n async deleteAgent(agentDid: string): Promise<void> {\n const prefix = `interaction:${agentDid}:`;\n const keysToDelete: string[] = [];\n\n for await (const [key] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n keysToDelete.push(key);\n }\n\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Deleted interaction history', { agentDid, count: keysToDelete.length });\n }\n\n /**\n * Clean up old interactions (older than 90 days)\n */\n async cleanup(maxAge = 90 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - maxAge;\n const keysToDelete: string[] = [];\n\n for await (const [key, value] of this.db.iterator()) {\n if (value.timestamp < cutoff) {\n keysToDelete.push(key);\n }\n }\n\n if (keysToDelete.length > 0) {\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Cleaned up old interactions', { count: keysToDelete.length });\n }\n\n return keysToDelete.length;\n }\n}\n","/**\n * Endorsement System\n *\n * Allows agents to endorse each other, building a web of trust\n */\n\nimport type { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('endorsement');\n\n/**\n * Endorsement Record\n */\nexport interface Endorsement {\n from: string; // Endorser DID\n to: string; // Endorsed agent DID\n score: number; // 0-1\n reason: string;\n timestamp: number;\n signature: string; // Signed by endorser\n}\n\n/**\n * Sign function type\n */\nexport type SignFunction = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Verify function type\n */\nexport type VerifyFunction = (signature: Uint8Array, data: Uint8Array, publicKey: Uint8Array) => Promise<boolean>;\n\n/**\n * Endorsement Manager\n */\nexport class EndorsementManager {\n constructor(\n private db: Level<string, Endorsement>,\n private getPublicKey: (did: string) => Promise<Uint8Array>\n ) {}\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n if (score < 0 || score > 1) {\n throw new Error('Score must be between 0 and 1');\n }\n\n const endorsement: Omit<Endorsement, 'signature'> = {\n from: fromDid,\n to: toDid,\n score,\n reason,\n timestamp: Date.now(),\n };\n\n // Sign the endorsement\n const data = new TextEncoder().encode(JSON.stringify(endorsement));\n const signatureBytes = await signFn(data);\n const signature = Buffer.from(signatureBytes).toString('hex');\n\n const signedEndorsement: Endorsement = {\n ...endorsement,\n signature,\n };\n\n logger.info('Created endorsement', { from: fromDid, to: toDid, score });\n return signedEndorsement;\n }\n\n /**\n * Verify endorsement signature\n */\n async verify(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n try {\n const { signature, ...endorsementWithoutSig } = endorsement;\n const data = new TextEncoder().encode(JSON.stringify(endorsementWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const publicKey = await this.getPublicKey(endorsement.from);\n\n return await verifyFn(signatureBytes, data, publicKey);\n } catch (error) {\n logger.error('Failed to verify endorsement', { error });\n return false;\n }\n }\n\n /**\n * Publish endorsement to local database\n */\n async publish(endorsement: Endorsement): Promise<void> {\n const key = `endorsement:${endorsement.to}:${endorsement.from}`;\n await this.db.put(key, endorsement);\n logger.info('Published endorsement', { from: endorsement.from, to: endorsement.to });\n }\n\n /**\n * Get all endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n const prefix = `endorsement:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n endorsements.push(value);\n }\n } catch (error) {\n logger.error('Failed to get endorsements', { agentDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Get endorsements given by an agent\n */\n async getEndorsementsBy(fromDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n\n try {\n for await (const [_, value] of this.db.iterator()) {\n if (value.from === fromDid) {\n endorsements.push(value);\n }\n }\n } catch (error) {\n logger.error('Failed to get endorsements by agent', { fromDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Calculate average endorsement score\n */\n async getAverageScore(agentDid: string): Promise<number> {\n const endorsements = await this.getEndorsements(agentDid);\n\n if (endorsements.length === 0) {\n return 0;\n }\n\n const totalScore = endorsements.reduce((sum, e) => sum + e.score, 0);\n return totalScore / endorsements.length;\n }\n\n /**\n * Delete an endorsement\n */\n async deleteEndorsement(fromDid: string, toDid: string): Promise<void> {\n const key = `endorsement:${toDid}:${fromDid}`;\n await this.db.del(key);\n logger.info('Deleted endorsement', { from: fromDid, to: toDid });\n }\n}\n","/**\n * Sybil Defense Mechanisms\n *\n * Protects the network from Sybil attacks through:\n * - Entry cost (Hashcash challenges)\n * - Progressive trust (rate limiting for new agents)\n * - DHT region protection (prefer established peers)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nconst logger = createLogger('sybil-defense');\n\n/**\n * Hashcash Challenge\n */\nexport interface Challenge {\n did: string;\n difficulty: number; // Number of leading zero bits required\n nonce: string;\n timestamp: number;\n}\n\n/**\n * Challenge Solution\n */\nexport interface ChallengeSolution {\n challenge: Challenge;\n solution: string; // Nonce that produces required hash\n}\n\n/**\n * Rate Limit Record\n */\ninterface RateLimitRecord {\n did: string;\n requests: number[]; // Timestamps of requests\n firstSeen: number;\n}\n\n/**\n * Peer Trust Level\n */\nexport type PeerTrustLevel = 'new' | 'established' | 'trusted';\n\n/**\n * Sybil Defense Manager\n */\nexport class SybilDefense {\n private rateLimits = new Map<string, RateLimitRecord>();\n private peerFirstSeen = new Map<string, number>();\n private readonly NEW_AGENT_WINDOW = 24 * 60 * 60 * 1000; // 24 hours\n private readonly RATE_LIMIT_WINDOW = 60 * 60 * 1000; // 1 hour\n private readonly MAX_REQUESTS_NEW = 10; // Max requests per hour for new agents\n private readonly ESTABLISHED_THRESHOLD = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n /**\n * Generate a Hashcash challenge for a new DID\n */\n generateChallenge(did: string, difficulty = 20): Challenge {\n const nonce = this.generateNonce();\n return {\n did,\n difficulty,\n nonce,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Verify a Hashcash challenge solution\n */\n verifyChallenge(solution: ChallengeSolution): boolean {\n const { challenge, solution: solutionNonce } = solution;\n\n // Check challenge is not too old (valid for 1 hour)\n if (Date.now() - challenge.timestamp > 60 * 60 * 1000) {\n logger.warn('Challenge expired', { did: challenge.did });\n return false;\n }\n\n // Compute hash\n const data = `${challenge.did}:${challenge.nonce}:${solutionNonce}`;\n const hash = sha256(new TextEncoder().encode(data));\n\n // Check leading zeros\n const leadingZeros = this.countLeadingZeroBits(hash);\n const valid = leadingZeros >= challenge.difficulty;\n\n if (valid) {\n logger.info('Challenge verified', { did: challenge.did, leadingZeros });\n } else {\n logger.warn('Challenge failed', { did: challenge.did, leadingZeros, required: challenge.difficulty });\n }\n\n return valid;\n }\n\n /**\n * Check if an agent should be rate limited\n */\n isRateLimited(did: string): boolean {\n const record = this.rateLimits.get(did);\n if (!record) {\n return false;\n }\n\n const now = Date.now();\n const agentAge = now - record.firstSeen;\n\n // Only rate limit new agents\n if (agentAge > this.NEW_AGENT_WINDOW) {\n return false;\n }\n\n // Count recent requests\n const recentRequests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n return recentRequests.length >= this.MAX_REQUESTS_NEW;\n }\n\n /**\n * Record a request from an agent\n */\n recordRequest(did: string): void {\n const now = Date.now();\n let record = this.rateLimits.get(did);\n\n if (!record) {\n record = {\n did,\n requests: [],\n firstSeen: now,\n };\n this.rateLimits.set(did, record);\n }\n\n // Add request timestamp\n record.requests.push(now);\n\n // Clean up old requests\n record.requests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n logger.debug('Recorded request', { did, count: record.requests.length });\n }\n\n /**\n * Get peer trust level based on age\n */\n getPeerTrustLevel(peerId: string): PeerTrustLevel {\n const firstSeen = this.peerFirstSeen.get(peerId);\n if (!firstSeen) {\n return 'new';\n }\n\n const age = Date.now() - firstSeen;\n\n if (age < this.NEW_AGENT_WINDOW) {\n return 'new';\n } else if (age < this.ESTABLISHED_THRESHOLD) {\n return 'established';\n } else {\n return 'trusted';\n }\n }\n\n /**\n * Record first seen time for a peer\n */\n recordPeerSeen(peerId: string): void {\n if (!this.peerFirstSeen.has(peerId)) {\n this.peerFirstSeen.set(peerId, Date.now());\n logger.debug('Recorded new peer', { peerId });\n }\n }\n\n /**\n * Clean up old records\n */\n cleanup(): void {\n const now = Date.now();\n const cutoff = now - this.NEW_AGENT_WINDOW;\n\n // Clean up rate limits for old agents\n for (const [did, record] of this.rateLimits.entries()) {\n if (record.firstSeen < cutoff) {\n this.rateLimits.delete(did);\n }\n }\n\n logger.info('Cleaned up Sybil defense records', {\n rateLimits: this.rateLimits.size,\n peers: this.peerFirstSeen.size,\n });\n }\n\n /**\n * Generate a random nonce\n */\n private generateNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n\n /**\n * Count leading zero bits in a hash\n */\n private countLeadingZeroBits(hash: Uint8Array): number {\n let count = 0;\n for (const byte of hash) {\n if (byte === 0) {\n count += 8;\n } else {\n // Count leading zeros in this byte\n let b = byte;\n while ((b & 0x80) === 0) {\n count++;\n b <<= 1;\n }\n break;\n }\n }\n return count;\n }\n}\n","/**\n * Trust System - Main Export\n *\n * Combines all trust components into a unified interface\n */\n\nexport * from './trust-score.js';\nexport * from './interaction-history.js';\nexport * from './endorsement.js';\nexport * from './sybil-defense.js';\n\nimport { Level } from 'level';\nimport { TrustMetrics } from './trust-score.js';\nimport type { TrustScore, Interaction } from './trust-score.js';\nimport { InteractionHistory } from './interaction-history.js';\nimport { EndorsementManager } from './endorsement.js';\nimport type { Endorsement, SignFunction, VerifyFunction } from './endorsement.js';\nimport { SybilDefense } from './sybil-defense.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('trust-system');\n\n/**\n * Trust System Configuration\n */\nexport interface TrustSystemConfig {\n dbPath: string;\n getPublicKey: (did: string) => Promise<Uint8Array>;\n}\n\n/**\n * Unified Trust System\n */\nexport class TrustSystem {\n private metrics: TrustMetrics;\n private history: InteractionHistory;\n private endorsements: EndorsementManager;\n private sybilDefense: SybilDefense;\n private trustCache = new Map<string, { score: TrustScore; timestamp: number }>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: TrustSystemConfig) {\n this.metrics = new TrustMetrics();\n this.history = new InteractionHistory(`${config.dbPath}/interactions`);\n\n const endorsementDb = new Level<string, Endorsement>(`${config.dbPath}/endorsements`, {\n valueEncoding: 'json',\n });\n this.endorsements = new EndorsementManager(endorsementDb, config.getPublicKey);\n this.sybilDefense = new SybilDefense();\n }\n\n /**\n * Initialize the trust system\n */\n async start(): Promise<void> {\n await this.history.open();\n logger.info('Trust system started');\n }\n\n /**\n * Shutdown the trust system\n */\n async stop(): Promise<void> {\n await this.history.close();\n logger.info('Trust system stopped');\n }\n\n /**\n * Record an interaction\n */\n async recordInteraction(interaction: Interaction): Promise<void> {\n await this.history.record(interaction);\n this.sybilDefense.recordRequest(interaction.agentDid);\n\n // Invalidate cache\n this.trustCache.delete(interaction.agentDid);\n }\n\n /**\n * Get trust score for an agent\n */\n async getTrustScore(agentDid: string): Promise<TrustScore> {\n // Check cache\n const cached = this.trustCache.get(agentDid);\n if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {\n return cached.score;\n }\n\n // Calculate fresh score\n const stats = await this.history.getStats(agentDid);\n const endorsementList = await this.endorsements.getEndorsements(agentDid);\n const uptime = 1.0; // TODO: Implement uptime tracking\n\n const score = this.metrics.calculateScore(stats, endorsementList.length, uptime);\n\n // Cache result\n this.trustCache.set(agentDid, { score, timestamp: Date.now() });\n\n return score;\n }\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n const endorsement = await this.endorsements.endorse(fromDid, toDid, score, reason, signFn);\n await this.endorsements.publish(endorsement);\n\n // Invalidate cache\n this.trustCache.delete(toDid);\n\n return endorsement;\n }\n\n /**\n * Get endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n return this.endorsements.getEndorsements(agentDid);\n }\n\n /**\n * Verify an endorsement\n */\n async verifyEndorsement(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n return this.endorsements.verify(endorsement, verifyFn);\n }\n\n /**\n * Check if agent should be rate limited\n */\n isRateLimited(agentDid: string): boolean {\n return this.sybilDefense.isRateLimited(agentDid);\n }\n\n /**\n * Generate Sybil defense challenge\n */\n generateChallenge(did: string, difficulty?: number) {\n return this.sybilDefense.generateChallenge(did, difficulty);\n }\n\n /**\n * Verify Sybil defense challenge\n */\n verifyChallenge(solution: any): boolean {\n return this.sybilDefense.verifyChallenge(solution);\n }\n\n /**\n * Get peer trust level\n */\n getPeerTrustLevel(peerId: string) {\n return this.sybilDefense.getPeerTrustLevel(peerId);\n }\n\n /**\n * Record peer seen\n */\n recordPeerSeen(peerId: string): void {\n this.sybilDefense.recordPeerSeen(peerId);\n }\n\n /**\n * Get interaction history\n */\n async getHistory(agentDid: string, limit?: number): Promise<Interaction[]> {\n return this.history.getHistory(agentDid, limit);\n }\n\n /**\n * Clean up old data\n */\n async cleanup(): Promise<void> {\n await this.history.cleanup();\n this.sybilDefense.cleanup();\n this.trustCache.clear();\n logger.info('Trust system cleanup completed');\n }\n}\n\n/**\n * Create a trust system instance\n */\nexport function createTrustSystem(config: TrustSystemConfig): TrustSystem {\n return new TrustSystem(config);\n}\n"]}