@highway1/core 0.1.63 → 0.1.76
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.d.ts +420 -231
- package/dist/index.js +1010 -623
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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","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 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 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.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 // Only auto-block agents with established history and high failure rate.\n // Requires >= 10 interactions to avoid penalizing new agents.\n const totalInteractions = score.totalInteractions ?? 0;\n const hasHistory = totalInteractions >= 10;\n const successRate = totalInteractions > 0 ? trustScore / Math.min(totalInteractions / 100, 1) : 1;\n if (hasHistory && successRate < 0.3) {\n logger.warn('Auto-blocking high-failure-rate agent', { did, trustScore, successRate: successRate.toFixed(2), totalInteractions });\n await this.blockAgent(did, `Auto-blocked: failure rate ${((1 - successRate) * 100).toFixed(0)}% over ${totalInteractions} interactions`);\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 totalInteractions: number; // Raw interaction count (0 = new agent)\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 totalInteractions: stats.totalInteractions,\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: 0,\n lastUpdated: Date.now(),\n totalInteractions: 0,\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/identity/aliases.ts","../src/identity/document.ts","../src/identity/index.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/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/trust-computer.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","/**\n * Agent Aliases - CVP-0014 Part 1\n *\n * Local petname-to-DID mapping for easier agent addressing.\n * Aliases are stored in ~/.clawiverse/config.json under the \"aliases\" key.\n *\n * Note: This module provides the core logic. The actual config storage\n * is handled by the CLI layer (packages/cli/src/config.ts).\n */\n\nexport interface AliasMap {\n [alias: string]: string; // alias -> DID\n}\n\n/**\n * Validate alias name according to CVP-0014 rules:\n * - Lowercase alphanumeric + hyphens: [a-z0-9][a-z0-9-]*\n * - Max 32 characters\n * - Cannot start with \"did:\" (reserved for DID prefix detection)\n */\nexport function validateAliasName(alias: string): { valid: boolean; error?: string } {\n if (!alias || alias.length === 0) {\n return { valid: false, error: 'Alias cannot be empty' };\n }\n\n if (alias.length > 32) {\n return { valid: false, error: 'Alias must be 32 characters or less' };\n }\n\n if (alias.startsWith('did:')) {\n return { valid: false, error: 'Alias cannot start with \"did:\" (reserved for DID prefix)' };\n }\n\n if (!/^[a-z0-9][a-z0-9-]*$/.test(alias)) {\n return { valid: false, error: 'Alias must be lowercase alphanumeric with hyphens, starting with alphanumeric' };\n }\n\n return { valid: true };\n}\n\n/**\n * Resolve a DID from various input formats:\n * 1. If input starts with \"did:\" → return as-is\n * 2. If input matches a local alias → return the mapped DID (caller must provide aliases)\n * 3. Otherwise → return undefined (caller can attempt discovery)\n */\nexport function resolveDid(input: string, aliases: AliasMap): string | undefined {\n if (!input) {\n return undefined;\n }\n\n // Already a DID\n if (input.startsWith('did:')) {\n return input;\n }\n\n // Try alias lookup\n const did = aliases[input];\n if (did) {\n return did;\n }\n\n // Not found - caller should attempt discovery\n return undefined;\n}\n\n/**\n * Reverse lookup: find alias for a DID\n * Returns the first matching alias, or undefined if no alias exists\n */\nexport function reverseAlias(did: string, aliases: AliasMap): string | undefined {\n for (const [alias, aliasDid] of Object.entries(aliases)) {\n if (aliasDid === did) {\n return alias;\n }\n }\n\n return undefined;\n}\n\n/**\n * Format DID for display with optional alias\n * Returns: \"alias\" if alias exists, otherwise full DID\n */\nexport function formatDidWithAlias(did: string, aliases: AliasMap): string {\n const alias = reverseAlias(did, aliases);\n return alias || did;\n}\n\n/**\n * Format DID for detailed display with alias\n * Returns: \"alias (did:...)\" if alias exists, otherwise full DID\n */\nexport function formatDidWithAliasDetailed(\n did: string,\n aliases: AliasMap,\n truncate: boolean = false\n): string {\n const alias = reverseAlias(did, aliases);\n\n if (alias) {\n if (truncate && did.length > 40) {\n const truncated = did.substring(0, 20) + '...' + did.substring(did.length - 10);\n return `${alias} (${truncated})`;\n }\n return `${alias} (${did})`;\n }\n\n if (truncate && did.length > 40) {\n return did.substring(0, 20) + '...' + did.substring(did.length - 10);\n }\n\n return did;\n}\n\n","import { deriveDID } from './did.js';\n\nexport interface DIDDocument {\n '@context': string[];\n id: string;\n verificationMethod: VerificationMethod[];\n authentication: string[];\n assertionMethod: string[];\n keyAgreement?: string[];\n service?: ServiceEndpoint[];\n}\n\nexport interface VerificationMethod {\n id: string;\n type: string;\n controller: string;\n publicKeyMultibase: string;\n}\n\nexport interface ServiceEndpoint {\n id: string;\n type: string;\n serviceEndpoint: string;\n}\n\n/**\n * Create a DID Document for a did:clawiverse identity\n */\nexport function createDIDDocument(\n publicKey: Uint8Array,\n services?: ServiceEndpoint[]\n): DIDDocument {\n const did = deriveDID(publicKey);\n const keyId = `${did}#key-1`;\n // Use base58btc encoding for multibase format\n const publicKeyMultibase = `z${Buffer.from(publicKey).toString('hex')}`;\n\n return {\n '@context': [\n 'https://www.w3.org/ns/did/v1',\n 'https://w3id.org/security/suites/ed25519-2020/v1',\n ],\n id: did,\n verificationMethod: [\n {\n id: keyId,\n type: 'Ed25519VerificationKey2020',\n controller: did,\n publicKeyMultibase,\n },\n ],\n authentication: [keyId],\n assertionMethod: [keyId],\n service: services,\n };\n}\n\n/**\n * Validate a DID Document structure\n */\nexport function validateDIDDocument(doc: unknown): doc is DIDDocument {\n if (typeof doc !== 'object' || doc === null) {\n return false;\n }\n\n const d = doc as Partial<DIDDocument>;\n\n return (\n Array.isArray(d['@context']) &&\n typeof d.id === 'string' &&\n d.id.startsWith('did:clawiverse:') &&\n Array.isArray(d.verificationMethod) &&\n d.verificationMethod.length > 0 &&\n Array.isArray(d.authentication) &&\n Array.isArray(d.assertionMethod)\n );\n}\n","export * from './keys.js';\nexport * from './did.js';\nexport * from './document.js';\nexport * from './signer.js';\n\nimport { generateKeyPair, exportKeyPair } from './keys.js';\nimport { deriveDID } from './did.js';\n\nexport interface AnonymousIdentity {\n did: string;\n publicKey: string;\n privateKey: string;\n agentCard: {\n name: string;\n description: string;\n capabilities: string[];\n };\n}\n\n/**\n * Generate an anonymous identity for frictionless onboarding\n * Creates identity with pattern \"Agent-{last8chars_of_DID}\" and generic description\n */\nexport async function generateAnonymousIdentity(): Promise<AnonymousIdentity> {\n const keyPair = await generateKeyPair();\n const exported = exportKeyPair(keyPair);\n const did = deriveDID(keyPair.publicKey);\n\n // Extract last 8 characters from DID (after the 'z' multibase prefix)\n const didSuffix = did.split(':').pop()!.slice(-8);\n\n return {\n did,\n publicKey: exported.publicKey,\n privateKey: exported.privateKey,\n agentCard: {\n name: `Agent-${didSuffix}`,\n description: `Anonymous agent ${didSuffix}`,\n capabilities: []\n }\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 TrustResultMessage,\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 queryTrust(target: string, domain?: string, since?: number, cursor?: string): Promise<TrustResultMessage>;\n publishCard(card?: AgentCard): Promise<void>;\n unpublishCard(): Promise<void>;\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 } = config;\n const reconnectConfig = { ...DEFAULT_RECONNECT, ...config.reconnect };\n let currentCard = config.card;\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: currentCard, timestamp });\n const signature = await sign(helloData, keyPair.privateKey);\n\n const hello: HelloMessage = {\n type: 'HELLO',\n protocolVersion: 1,\n did,\n card: currentCard,\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 { reconnectAfter?: number };\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 {\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 {\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 async queryTrust(target: string, domain?: string, since?: number, cursor?: string): Promise<TrustResultMessage> {\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('Trust query timeout'));\n }, 10000);\n\n const handler = (data: Buffer) => {\n try {\n const msg: RelayMessage = decodeCBOR(data);\n if (msg.type === 'TRUST_RESULT' && msg.target === target) {\n clearTimeout(timeout);\n ws.off('message', handler);\n resolve(msg);\n }\n } catch {\n // Ignore parse errors\n }\n };\n\n ws.on('message', handler);\n ws.send(encodeCBOR({ type: 'TRUST_QUERY', target, domain, since, cursor } as RelayMessage));\n });\n },\n\n async publishCard(card?: AgentCard): Promise<void> {\n if (card) {\n currentCard = card;\n }\n await sendToRelay({ type: 'PUBLISH_CARD', card } as RelayMessage);\n logger.debug('Sent PUBLISH_CARD');\n },\n\n async unpublishCard(): Promise<void> {\n await sendToRelay({ type: 'UNPUBLISH_CARD' } as RelayMessage);\n logger.debug('Sent UNPUBLISH_CARD');\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 | 'ENDORSE'\n | 'ENDORSE_ACK'\n | 'TRUST_QUERY'\n | 'TRUST_RESULT'\n | 'PUBLISH_CARD'\n | 'UNPUBLISH_CARD';\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\n// CVP-0017: Trust query messages\nexport interface TrustQueryMessage {\n type: 'TRUST_QUERY';\n target: string;\n domain?: string;\n since?: number;\n cursor?: string;\n}\n\nexport interface TrustResultEndorsement {\n version: 2;\n from: string;\n to: string;\n score: number;\n domain?: string;\n reason: string;\n timestamp: number;\n expires?: number;\n signature: string;\n}\n\nexport interface TrustResultMessage {\n type: 'TRUST_RESULT';\n target: string;\n endorsements: TrustResultEndorsement[];\n endorsementCount: number;\n averageScore: number;\n nextCursor?: string;\n}\n\n// CVP-0018: Publish/unpublish card messages\nexport interface PublishCardMessage {\n type: 'PUBLISH_CARD';\n card?: AgentCard;\n}\n\nexport interface UnpublishCardMessage {\n type: 'UNPUBLISH_CARD';\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 | TrustQueryMessage\n | TrustResultMessage\n | PublishCardMessage\n | UnpublishCardMessage;\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 AgentCard | LegacyAgentCard)) {\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 relay/discovery storage compatibility\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 compact CBOR.\n *\n * The helper keeps its historical name because older APIs referenced\n * \"DHT encoding\", but the current architecture uses relay-backed discovery.\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 * Keeps a legacy discovery-operations shape, but is fully backed by relay queries.\n */\n\nimport type { AgentCard } from './agent-card-types.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 SemanticQuery {\n text?: string;\n capability?: string;\n filters?: {\n language?: string;\n minTrustScore?: number;\n maxCost?: number;\n tags?: string[];\n };\n limit?: number;\n}\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","import { MessagingError } from '../utils/errors.js';\n\nexport type LegacyMessageEnvelopeType = 'request' | 'response' | 'notification';\nexport type MessageEnvelopeType = 'message' | 'reply';\nexport type AnyMessageEnvelopeType = MessageEnvelopeType | LegacyMessageEnvelopeType;\n\nexport interface MessageEnvelope {\n id: string;\n from: string;\n to: string;\n type: MessageEnvelopeType;\n protocol: string;\n payload: unknown;\n timestamp: number;\n signature: string;\n replyTo?: string;\n threadId?: string;\n}\n\nexport function normalizeEnvelopeType(type: string): MessageEnvelopeType | undefined {\n if (type === 'message' || type === 'notification' || type === 'request') {\n return 'message';\n }\n\n if (type === 'reply' || type === 'response') {\n return 'reply';\n }\n\n return undefined;\n}\n\nexport function normalizeEnvelope(msg: unknown): MessageEnvelope | undefined {\n if (typeof msg !== 'object' || msg === null) {\n return undefined;\n }\n\n const envelope = msg as Partial<MessageEnvelope> & { type?: string };\n const normalizedType = envelope.type ? normalizeEnvelopeType(envelope.type) : undefined;\n\n if (\n typeof envelope.id !== 'string' ||\n typeof envelope.from !== 'string' ||\n !envelope.from.startsWith('did:clawiverse:') ||\n typeof envelope.to !== 'string' ||\n !envelope.to.startsWith('did:clawiverse:') ||\n !normalizedType ||\n typeof envelope.protocol !== 'string' ||\n envelope.payload === undefined ||\n typeof envelope.timestamp !== 'number' ||\n typeof envelope.signature !== 'string'\n ) {\n return undefined;\n }\n\n if (normalizedType === 'reply' && typeof envelope.replyTo !== 'string') {\n return undefined;\n }\n\n if (normalizedType === 'message' && envelope.replyTo !== undefined) {\n return undefined;\n }\n\n return {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n type: normalizedType,\n protocol: envelope.protocol,\n payload: envelope.payload,\n timestamp: envelope.timestamp,\n signature: envelope.signature,\n replyTo: normalizedType === 'reply' ? envelope.replyTo : undefined,\n threadId: typeof envelope.threadId === 'string' ? envelope.threadId : undefined,\n };\n}\n\nexport function createEnvelope(\n from: string,\n to: string,\n type: AnyMessageEnvelopeType,\n protocol: string,\n payload: unknown,\n replyTo?: string,\n threadId?: string,\n): Omit<MessageEnvelope, 'signature'> {\n const normalizedType = normalizeEnvelopeType(type);\n\n if (!normalizedType) {\n throw new MessagingError(`Invalid message type: ${type}`);\n }\n\n if (normalizedType === 'reply' && !replyTo) {\n throw new MessagingError('Reply envelopes must include replyTo');\n }\n\n return {\n id: generateMessageId(),\n from,\n to,\n type: normalizedType,\n protocol,\n payload,\n timestamp: Date.now(),\n ...(normalizedType === 'reply' ? { replyTo } : {}),\n ...(threadId ? { threadId } : {}),\n };\n}\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\nexport async function verifyEnvelope(\n envelope: MessageEnvelope,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>,\n): Promise<boolean> {\n try {\n const normalized = normalizeEnvelope(envelope);\n if (!normalized) {\n return false;\n }\n\n const { signature, ...envelopeWithoutSig } = normalized;\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\nexport function validateEnvelope(msg: unknown): msg is MessageEnvelope {\n const normalized = normalizeEnvelope(msg);\n return normalized !== undefined;\n}\n\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n\nexport function generateThreadId(): string {\n return `thread_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n","import { encode, decode } from 'cbor-x';\nimport type { MessageEnvelope } from './envelope.js';\nimport { normalizeEnvelope } from './envelope.js';\nimport { MessagingError } from '../utils/errors.js';\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\nexport function decodeMessage(data: Uint8Array): MessageEnvelope {\n try {\n const decoded = decode(data);\n const normalized = normalizeEnvelope(decoded);\n\n if (!normalized) {\n throw new MessagingError('Decoded message envelope is invalid');\n }\n\n return normalized;\n } catch (error) {\n if (error instanceof MessagingError) {\n throw error;\n }\n throw new MessagingError('Failed to decode message', error);\n }\n}\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\nexport function decodeMessageJSON(json: string): MessageEnvelope {\n try {\n const decoded = JSON.parse(json);\n const normalized = normalizeEnvelope(decoded);\n\n if (!normalized) {\n throw new MessagingError('Decoded JSON envelope is invalid');\n }\n\n return normalized;\n } catch (error) {\n if (error instanceof MessagingError) {\n throw error;\n }\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<void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\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 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 type: envelope.type,\n });\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 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 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 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 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 if (response) {\n const encoded = encodeMessage(response);\n await relayClient.sendEnvelope(response.to, encoded);\n logger.info('Sent reply 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 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';\nimport { normalizeEnvelope } from './envelope.js';\n\nconst logger = createLogger('message-storage');\n\nexport class MessageStorage {\n private db: Level<string, unknown>;\n private ready = false;\n\n constructor(dbPath: string) {\n this.db = new Level<string, unknown>(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 normalized = this.requireStoredMessage(msg);\n const ts = String(normalized.receivedAt ?? normalized.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${normalized.direction}:${ts}:${normalized.envelope.id}`;\n await this.db.put(key, normalized);\n\n // Secondary index by sender\n const idxKey = `idx:from:${normalized.envelope.from}:${ts}:${normalized.envelope.id}`;\n await this.db.put(idxKey, '1');\n\n // CVP-0014: Thread index\n if (normalized.envelope.threadId) {\n const threadIdxKey = `idx:thread:${normalized.envelope.threadId}:${ts}:${normalized.envelope.id}`;\n await this.db.put(threadIdxKey, '1');\n\n // Update or create session metadata\n await this.updateSessionMeta(normalized);\n }\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) continue;\n const normalized = this.normalizeStoredMessage(value);\n if (normalized) return normalized;\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 const normalized = this.normalizeStoredMessage(value);\n if (!normalized || !this.matchesFilter(normalized, filter)) continue;\n total++;\n if (skipped < offset) { skipped++; continue; }\n if (results.length < limit) results.push(normalized);\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.replyTo) {\n const replyIds = Array.isArray(filter.replyTo) ? filter.replyTo : [filter.replyTo];\n if (!msg.envelope.replyTo || !replyIds.includes(msg.envelope.replyTo)) return false;\n }\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 // CVP-0014: Thread filter\n if (filter.threadId && msg.envelope.threadId !== filter.threadId) 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 const normalized = this.normalizeStoredMessage(value);\n if (normalized && this.matchesFilter(normalized, filter)) count++;\n }\n return count;\n }\n\n private normalizeStoredMessage(msg: StoredMessage): StoredMessage | null {\n const envelope = normalizeEnvelope(msg.envelope);\n if (!envelope) {\n logger.warn('Skipping invalid stored message envelope', { id: msg.envelope?.id });\n return null;\n }\n\n return {\n ...msg,\n envelope,\n };\n }\n\n private requireStoredMessage(msg: StoredMessage): StoredMessage {\n const normalized = this.normalizeStoredMessage(msg);\n if (!normalized) {\n throw new Error(`Invalid stored message envelope: ${msg.envelope?.id ?? 'unknown'}`);\n }\n\n return normalized;\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}`) as BlocklistEntry;\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}`) as AllowlistEntry;\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}`) as SeenEntry;\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}`) as RateLimitState;\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 // ─── Session Management (CVP-0014) ────────────────────────────────────────\n\n private async updateSessionMeta(msg: StoredMessage): Promise<void> {\n if (!msg.envelope.threadId) return;\n\n const sessionKey = `session:${msg.envelope.threadId}`;\n let session: { peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number };\n\n try {\n session = await this.db.get(sessionKey) as typeof session;\n } catch {\n // Create new session\n const peerDid = msg.direction === 'inbound' ? msg.envelope.from : msg.envelope.to;\n const text = typeof msg.envelope.payload === 'object' && msg.envelope.payload !== null\n ? (msg.envelope.payload as Record<string, unknown>).text ?? (msg.envelope.payload as Record<string, unknown>).message ?? ''\n : String(msg.envelope.payload ?? '');\n const title = text ? String(text).slice(0, 50) : undefined;\n\n session = {\n threadId: msg.envelope.threadId,\n peerDid,\n startedAt: msg.receivedAt ?? msg.sentAt ?? Date.now(),\n lastMessageAt: msg.receivedAt ?? msg.sentAt ?? Date.now(),\n messageCount: 1,\n title,\n };\n await this.db.put(sessionKey, session);\n return;\n }\n\n // Update existing session\n session.lastMessageAt = msg.receivedAt ?? msg.sentAt ?? Date.now();\n session.messageCount = (session.messageCount ?? 0) + 1;\n await this.db.put(sessionKey, session);\n }\n\n async getSession(threadId: string): Promise<{ peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number } | null> {\n try {\n return await this.db.get(`session:${threadId}`) as { peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number };\n } catch {\n return null;\n }\n }\n\n async listSessions(peerDid?: string, limit = 50, includeArchived = false): Promise<Array<{ peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }>> {\n const results: Array<{ peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }> = [];\n for await (const [, value] of this.db.iterator<string, { peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }>({\n gte: 'session:',\n lte: 'session:\\xff',\n reverse: true, // newest first\n valueEncoding: 'json',\n })) {\n if (peerDid && value.peerDid !== peerDid) continue;\n if (!includeArchived && value.archived) continue; // Skip archived sessions by default\n results.push(value);\n if (results.length >= limit) break;\n }\n return results;\n }\n\n async archiveSession(threadId: string): Promise<void> {\n const session = await this.getSession(threadId);\n if (!session) {\n throw new Error(`Session not found: ${threadId}`);\n }\n\n session.archived = true;\n session.archivedAt = Date.now();\n await this.db.put(`session:${threadId}`, session);\n }\n\n async unarchiveSession(threadId: string): Promise<void> {\n const session = await this.getSession(threadId);\n if (!session) {\n throw new Error(`Session not found: ${threadId}`);\n }\n\n session.archived = false;\n delete session.archivedAt;\n await this.db.put(`session:${threadId}`, session);\n }\n\n async listArchivedSessions(peerDid?: string, limit = 50): Promise<Array<{ peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }>> {\n const results: Array<{ peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }> = [];\n for await (const [, value] of this.db.iterator<string, { peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }>({\n gte: 'session:',\n lte: 'session:\\xff',\n reverse: true, // newest first\n valueEncoding: 'json',\n })) {\n if (!value.archived) continue; // Only archived sessions\n if (peerDid && value.peerDid !== peerDid) continue;\n results.push(value);\n if (results.length >= limit) break;\n }\n return results;\n }\n\n async searchSessions(query: string, limit = 50): Promise<Array<{ peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }>> {\n const results: Array<{ peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }> = [];\n const lowerQuery = query.toLowerCase();\n\n for await (const [, value] of this.db.iterator<string, { peerDid: string; threadId: string; messageCount: number; lastMessageAt: number; startedAt?: number; title?: string; archived?: boolean; archivedAt?: number }>({\n gte: 'session:',\n lte: 'session:\\xff',\n reverse: true, // newest first\n valueEncoding: 'json',\n })) {\n // Search in title\n if (value.title && value.title.toLowerCase().includes(lowerQuery)) {\n results.push(value);\n if (results.length >= limit) break;\n continue;\n }\n\n // Search in peer DID\n if (value.peerDid && value.peerDid.toLowerCase().includes(lowerQuery)) {\n results.push(value);\n if (results.length >= limit) break;\n continue;\n }\n\n // Search in thread messages\n const messages = await this.queryMessagesByThread(value.threadId, { limit: 100 });\n for (const msg of messages.messages) {\n const payload = msg.envelope.payload as Record<string, unknown>;\n const text = payload?.text || payload?.message || '';\n if (text && String(text).toLowerCase().includes(lowerQuery)) {\n results.push(value);\n if (results.length >= limit) break;\n break; // Found match in this thread, move to next\n }\n }\n\n if (results.length >= limit) break;\n }\n\n return results;\n }\n\n async queryMessagesByThread(\n threadId: string,\n pagination: PaginationOptions = {}\n ): Promise<MessagePage> {\n const { limit = 50, offset = 0 } = pagination;\n const prefix = `idx:thread:${threadId}:`;\n const results: StoredMessage[] = [];\n let total = 0;\n let skipped = 0;\n\n // Get message IDs from thread index\n const messageIds: string[] = [];\n for await (const [key] of this.db.iterator<string, string>({\n gte: prefix,\n lte: prefix + '\\xff',\n reverse: false, // chronological order\n })) {\n const parts = key.split(':');\n const msgId = parts[parts.length - 1];\n messageIds.push(msgId);\n }\n\n // Fetch full messages\n for (const msgId of messageIds) {\n const msg = await this.getMessage(msgId);\n if (!msg) continue;\n total++;\n if (skipped < offset) { skipped++; continue; }\n if (results.length < limit) results.push(msg);\n }\n\n return {\n messages: results,\n total,\n hasMore: total > offset + results.length,\n };\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, trustStatus?: import('./types.js').StoredMessage['trustStatus']): Promise<StoredMessage> {\n const msg: StoredMessage = {\n envelope,\n direction: 'inbound',\n status: 'pending',\n receivedAt: Date.now(),\n trustScore,\n trustStatus,\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 if (filter.replyTo) {\n const replyIds = Array.isArray(filter.replyTo) ? filter.replyTo : [filter.replyTo];\n if (!msg.envelope.replyTo || !replyIds.includes(msg.envelope.replyTo)) return false;\n }\n if (filter.threadId && msg.envelope.threadId !== filter.threadId) 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 { TrustStatus } from '../trust/trust-score.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 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 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.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, trustStatus: 'allowed' };\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 // 2.5. Sybil / rate-limit check (in-memory, resets on daemon restart)\n if (this.trust.isRateLimited(did)) {\n logger.debug('Message rejected: sybil rate limited', { id: envelope.id, from: did });\n return { allowed: false, reason: 'rate_limited' };\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 + auto-block logic\n let trustScore = 0;\n let trustStatus: TrustStatus = 'unknown';\n try {\n const score = await this.trust.getTrustScore(did);\n trustScore = score.interactionScore;\n trustStatus = score.status;\n\n const totalInteractions = score.totalInteractions ?? 0;\n const recentFailureRate = 1 - (score.recentSuccessRate ?? 1);\n\n // Suspicious: ≥10 interactions, recent failure rate > 50%\n // Don't auto-block yet, but force strictest rate limit tier\n if (totalInteractions >= 10 && recentFailureRate > 0.5) {\n logger.warn('Suspicious agent detected', { did, recentFailureRate: recentFailureRate.toFixed(2), totalInteractions });\n trustScore = 0; // Force strictest rate limit tier\n }\n\n // Auto-block: ≥20 interactions, recent failure rate > 70%\n if (totalInteractions >= 20 && recentFailureRate > 0.7) {\n logger.warn('Auto-blocking high-failure-rate agent', { did, recentFailureRate: recentFailureRate.toFixed(2), totalInteractions });\n await this.blockAgent(did, `Auto-blocked: ${(recentFailureRate * 100).toFixed(0)}% failure rate over last 20 interactions`);\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, trustStatus, 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 status for an agent\n */\nexport type TrustStatus = 'unknown' | 'known' | 'suspicious' | 'blocked' | 'allowed';\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 endorsementScore: number; // Average endorsement score (0-1)\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 totalInteractions: number; // Raw interaction count (0 = new agent)\n recentSuccessRate: number; // Success rate of last 20 interactions\n status: TrustStatus; // Current trust status\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 recentSuccessRate: number; // Success rate of last 20 interactions (sliding window)\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 * @param endorsementScore - Average endorsement score (0-1), not count\n */\n calculateScore(stats: InteractionStats, endorsementScore: number, uptime: number): TrustScore {\n // Maturity weight: 50 interactions reaches full weight\n const maturityWeight = Math.min(stats.totalInteractions / 50, 1);\n const interactionScore = stats.successRate * maturityWeight;\n\n // Derive status from interaction history\n const status = this.deriveStatus(stats);\n\n return {\n interactionScore,\n endorsements: 0, // kept for backwards compat\n endorsementScore,\n completionRate: stats.successRate,\n responseTime: stats.avgResponseTime,\n uptime,\n lastUpdated: Date.now(),\n totalInteractions: stats.totalInteractions,\n recentSuccessRate: stats.recentSuccessRate,\n status,\n };\n }\n\n private deriveStatus(stats: InteractionStats): TrustStatus {\n if (stats.totalInteractions === 0) return 'unknown';\n const recentFailureRate = 1 - stats.recentSuccessRate;\n if (stats.totalInteractions >= 10 && recentFailureRate > 0.5) return 'suspicious';\n return 'known';\n }\n\n /**\n * Calculate overall trust level (0-1)\n * @param score - TrustScore\n * @param endorsementScore - Average endorsement score (0-1)\n */\n calculateOverallTrust(score: TrustScore): number {\n const weights = {\n interaction: 0.6,\n endorsement: 0.4,\n };\n\n return (\n score.interactionScore * weights.interaction +\n score.endorsementScore * weights.endorsement\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.totalInteractions === 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 if (agentAge < ONE_DAY && overall < 0.3) return true;\n if (overall < 0.1) return true;\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 endorsementScore: 0,\n completionRate: 0,\n responseTime: 0,\n uptime: 0,\n lastUpdated: Date.now(),\n totalInteractions: 0,\n recentSuccessRate: 1,\n status: 'unknown',\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 recentSuccessRate: 1, // No history → assume good (don't penalize new agents)\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 // Sliding window: last 20 interactions (history is newest-first)\n const recent = history.slice(0, 20);\n const recentSuccessCount = recent.filter(i => i.success).length;\n const recentSuccessRate = recentSuccessCount / recent.length;\n\n return {\n totalInteractions: history.length,\n successRate: successCount / history.length,\n recentSuccessRate,\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 v1 (legacy)\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 * Endorsement Record v2 (CVP-0017)\n */\nexport interface EndorsementV2 {\n version: 2;\n from: string; // Endorser DID\n to: string; // Endorsed agent DID\n score: number; // 0.0 - 1.0 (0.0 = explicit distrust/revocation)\n domain?: string; // Capability domain (e.g., \"translation\", \"gpu-compute\")\n // If omitted, endorsement applies to all domains\n reason: string;\n timestamp: number; // Unix ms\n expires?: number; // Unix ms — endorsement invalid after this time\n // If omitted, default TTL based on domain\n signature: string; // Ed25519 signature over all fields except signature\n}\n\n/**\n * Domain velocity categories for time decay\n */\nexport const FAST_DOMAINS = ['translation', 'transcription', 'data-entry', 'moderation'];\nexport const SLOW_DOMAINS = ['research', 'architecture', 'security-audit', 'legal-review'];\n\n/**\n * Default expiration by domain (in days)\n */\nexport function getDefaultExpiration(domain?: string): number {\n if (!domain) return 180; // Default: 180 days\n if (FAST_DOMAINS.includes(domain)) return 90;\n if (SLOW_DOMAINS.includes(domain)) return 365;\n return 180; // Medium velocity\n}\n\n/**\n * Validate domain string\n */\nexport function validateDomain(domain: string): boolean {\n // Pattern: ^[a-z0-9]+(-[a-z0-9]+)*$\n const pattern = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n return pattern.test(domain) && domain.length <= 64;\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 (v2)\n */\n async endorseV2(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction,\n domain?: string,\n expires?: number\n ): Promise<EndorsementV2> {\n if (score < 0 || score > 1) {\n throw new Error('Score must be between 0 and 1');\n }\n\n if (domain && !validateDomain(domain)) {\n throw new Error('Invalid domain format. Must match ^[a-z0-9]+(-[a-z0-9]+)*$ and be <= 64 chars');\n }\n\n const timestamp = Date.now();\n const defaultExpires = timestamp + getDefaultExpiration(domain) * 24 * 60 * 60 * 1000;\n\n const endorsement: Omit<EndorsementV2, 'signature'> = {\n version: 2,\n from: fromDid,\n to: toDid,\n score,\n domain,\n reason,\n timestamp,\n expires: expires || defaultExpires,\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: EndorsementV2 = {\n ...endorsement,\n signature,\n };\n\n logger.info('Created endorsement v2', { from: fromDid, to: toDid, score, domain });\n return signedEndorsement;\n }\n\n /**\n * Create an endorsement (v1 - legacy)\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 (v2)\n */\n async verifyV2(endorsement: EndorsementV2, 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 v2', { error });\n return false;\n }\n }\n\n /**\n * Verify endorsement signature (v1)\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 * Upgrade v1 endorsement to v2\n */\n upgradeEndorsement(e: Endorsement): EndorsementV2 {\n return {\n version: 2,\n from: e.from,\n to: e.to,\n score: e.score,\n domain: undefined, // v1 endorsements are domain-agnostic\n reason: e.reason,\n timestamp: e.timestamp,\n expires: e.timestamp + 90 * 24 * 60 * 60 * 1000, // 90-day default\n signature: e.signature, // v1 signature remains valid\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 * Publish endorsement to relay (CVP-0017)\n */\n async publishToRelay(\n relay: { publishEndorsement: (e: EndorsementV2) => Promise<{ id: string; stored: boolean; error?: string }> },\n endorsement: EndorsementV2\n ): Promise<{ id: string; stored: boolean; error?: string }> {\n logger.info('Publishing endorsement to relay', { from: endorsement.from, to: endorsement.to });\n return await relay.publishEndorsement(endorsement);\n }\n\n /**\n * Query endorsements from relay (CVP-0017)\n */\n async queryFromRelay(\n relay: { queryTrust: (target: string, domain?: string, since?: number) => Promise<{ endorsements: EndorsementV2[]; endorsementCount?: number; averageScore?: number }> },\n target: string,\n domain?: string,\n since?: number\n ): Promise<{ endorsements: EndorsementV2[]; total: number; averageScore: number }> {\n logger.info('Querying endorsements from relay', { target, domain });\n const result = await relay.queryTrust(target, domain, since);\n return {\n endorsements: result.endorsements,\n total: result.endorsementCount ?? result.endorsements.length,\n averageScore: result.averageScore ?? (result.endorsements.length > 0 ? result.endorsements.reduce((sum, e) => sum + e.score, 0) / result.endorsements.length : 0),\n };\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 * - Discovery hardening (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 * CVP-0017: Trust Computation Engine\n *\n * Implements EigenTrust-lite algorithm with:\n * - Recursive endorser weighting (endorsements from trusted agents count more)\n * - Domain-aware time decay (fast/slow/default domains)\n * - Collusion detection (Tarjan's SCC algorithm)\n * - Configurable recursion depth (default 3, max 6)\n * - Seed peer bootstrapping\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport type { EndorsementV2 } from './endorsement.js';\nimport { FAST_DOMAINS, SLOW_DOMAINS } from './endorsement.js';\n\nconst logger = createLogger('trust-computer');\n\n/**\n * Trust computation configuration\n */\nexport interface TrustConfig {\n seedPeers?: string[]; // DIDs that have inherent trust (weight 1.0)\n maxRecursionDepth?: number; // Default 3, max 6\n decayHalfLife?: { // Domain-specific decay half-life (in days)\n default?: number;\n [domain: string]: number | undefined;\n };\n localInteractionWeight?: number; // Weight for local interactions (default 0.6)\n networkEndorsementWeight?: number; // Weight for network endorsements (default 0.4)\n}\n\n/**\n * Trust computation result\n */\nexport interface TrustResult {\n score: number; // Overall trust score (0-1)\n localScore: number; // Score from direct interactions\n networkScore: number; // Score from network endorsements\n endorsementCount: number; // Total endorsements considered\n collusionDetected: boolean; // True if target is in collusion cluster\n computedAt: number; // Timestamp\n}\n\n/**\n * Endorsement graph node\n */\ninterface GraphNode {\n did: string;\n endorsements: EndorsementV2[];\n index?: number; // Tarjan's algorithm index\n lowlink?: number; // Tarjan's algorithm lowlink\n onStack?: boolean; // Tarjan's algorithm stack flag\n}\n\n/**\n * Strongly connected component\n */\ninterface SCC {\n nodes: string[]; // DIDs in this component\n internalEdges: number; // Endorsements within component\n externalEdges: number; // Endorsements from outside\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<TrustConfig> = {\n seedPeers: [],\n maxRecursionDepth: 3,\n decayHalfLife: {\n default: 90,\n translation: 30,\n transcription: 30,\n 'data-entry': 30,\n moderation: 30,\n research: 180,\n architecture: 180,\n 'security-audit': 180,\n 'legal-review': 180,\n },\n localInteractionWeight: 0.6,\n networkEndorsementWeight: 0.4,\n};\n\n/**\n * Trust Computer\n */\nexport class TrustComputer {\n private config: Required<TrustConfig>;\n private cache = new Map<string, { result: TrustResult; expiresAt: number }>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n // Cached SCC results: endorser DID → penalty factor (1.0 = no penalty, 0.1 = collusion)\n private sccPenaltyCache = new Map<string, number>();\n private sccCacheExpiresAt = 0;\n private readonly SCC_CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n // Endorsements by target DID, used for recursive weight lookup\n private endorsementsByTarget = new Map<string, EndorsementV2[]>();\n\n constructor(config: TrustConfig = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n decayHalfLife: {\n ...DEFAULT_CONFIG.decayHalfLife,\n ...config.decayHalfLife,\n },\n };\n\n // Validate max recursion depth\n if (this.config.maxRecursionDepth > 6) {\n logger.warn('Max recursion depth capped at 6', { requested: this.config.maxRecursionDepth });\n this.config.maxRecursionDepth = 6;\n }\n }\n\n /**\n * Compute trust score for a target DID.\n * allEndorsements: flat list of all endorsements known to the caller (used for recursive weight lookup).\n */\n compute(\n target: string,\n endorsements: EndorsementV2[],\n localInteractionScore: number = 0,\n localInteractionCount: number = 0,\n domain?: string,\n allEndorsements?: EndorsementV2[]\n ): TrustResult {\n // Check cache\n const cached = this.cache.get(this.getCacheKey(target, domain));\n if (cached && cached.expiresAt > Date.now()) {\n logger.debug('Trust score cache hit', { target, domain });\n return cached.result;\n }\n\n // Build endorsement lookup map for recursive weight computation\n if (allEndorsements && allEndorsements.length > 0) {\n this.endorsementsByTarget.clear();\n for (const e of allEndorsements) {\n if (!this.endorsementsByTarget.has(e.to)) {\n this.endorsementsByTarget.set(e.to, []);\n }\n this.endorsementsByTarget.get(e.to)!.push(e);\n }\n }\n\n // Rebuild SCC penalty cache if stale (uses all endorsements for full graph)\n const allEnds = allEndorsements ?? endorsements;\n if (Date.now() > this.sccCacheExpiresAt) {\n this.rebuildSccPenaltyCache(allEnds);\n }\n\n // Filter endorsements by domain\n const filteredEndorsements = this.filterByDomain(endorsements, domain);\n\n // Compute network trust score\n const networkScore = this.computeNetworkTrust(target, filteredEndorsements, domain);\n\n // Blend local and network scores\n // α = min(directInteractions / 20, 0.8)\n const alpha = Math.min(localInteractionCount / 20, 0.8);\n const score = alpha * localInteractionScore + (1 - alpha) * networkScore;\n\n // Detect collusion\n const collusionDetected = this.detectCollusion(target, allEnds);\n\n const result: TrustResult = {\n score,\n localScore: localInteractionScore,\n networkScore,\n endorsementCount: filteredEndorsements.length,\n collusionDetected,\n computedAt: Date.now(),\n };\n\n // Cache result\n this.cache.set(this.getCacheKey(target, domain), {\n result,\n expiresAt: Date.now() + this.CACHE_TTL,\n });\n\n logger.debug('Computed trust score', { target, domain, score, networkScore, collusionDetected });\n return result;\n }\n\n /**\n * Compute network trust score using EigenTrust-lite\n */\n private computeNetworkTrust(\n target: string,\n endorsements: EndorsementV2[],\n domain?: string,\n depth: number = 0,\n visited: Set<string> = new Set()\n ): number {\n if (endorsements.length === 0) {\n return 0;\n }\n\n // Prevent infinite recursion\n if (depth >= this.config.maxRecursionDepth) {\n return 0.1; // Neutral prior\n }\n\n // Prevent cycles\n if (visited.has(target)) {\n return 0.1;\n }\n visited.add(target);\n\n const now = Date.now();\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (const endorsement of endorsements) {\n // Skip expired endorsements\n if (endorsement.expires && endorsement.expires < now) {\n continue;\n }\n\n // Compute endorser weight (recursive)\n const endorserWeight = this.getEndorserWeight(\n endorsement.from,\n domain,\n depth + 1,\n visited\n );\n\n // Compute time decay\n const timeDecay = this.computeTimeDecay(endorsement, domain);\n\n // Compute collusion penalty\n const collusionPenalty = this.getCollusionPenalty(endorsement.from);\n\n const baseWeight = endorserWeight * collusionPenalty;\n // timeDecay multiplies the score contribution, not the normalizing weight\n // This ensures decay reduces networkScore even with a single endorser\n weightedSum += endorsement.score * timeDecay * baseWeight;\n totalWeight += baseWeight;\n }\n\n return totalWeight > 0 ? weightedSum / totalWeight : 0;\n }\n\n /**\n * Get endorser weight (recursive EigenTrust-lite).\n * Uses endorsementsByTarget populated by compute() for local graph traversal.\n */\n private getEndorserWeight(\n endorser: string,\n domain: string | undefined,\n depth: number,\n visited: Set<string>\n ): number {\n // Seed peers have weight 1.0\n if (this.config.seedPeers.includes(endorser)) {\n return 1.0;\n }\n\n // Max depth reached — use neutral prior\n if (depth >= this.config.maxRecursionDepth) {\n return 0.1;\n }\n\n // Prevent cycles\n if (visited.has(endorser)) {\n return 0.1;\n }\n\n // Look up endorsements for this endorser in the local graph\n const endorserEndorsements = this.endorsementsByTarget.get(endorser);\n if (!endorserEndorsements || endorserEndorsements.length === 0) {\n return 0.1; // No data — neutral prior\n }\n\n // Recursively compute the endorser's own trust score\n const endorserScore = this.computeNetworkTrust(\n endorser,\n this.filterByDomain(endorserEndorsements, domain),\n domain,\n depth,\n new Set(visited) // copy so sibling branches don't share state\n );\n\n // Map [0,1] score to weight range [0.1, 1.0]\n return 0.1 + endorserScore * 0.9;\n }\n\n /**\n * Compute time decay for an endorsement\n */\n private computeTimeDecay(endorsement: EndorsementV2, domain?: string): number {\n const age = Date.now() - endorsement.timestamp;\n const ageDays = age / (24 * 60 * 60 * 1000);\n\n // Get domain-specific half-life\n const halfLife = this.getDecayHalfLife(endorsement.domain || domain);\n\n // Exponential decay: exp(-age / halfLife)\n return Math.exp(-ageDays / halfLife);\n }\n\n /**\n * Get decay half-life for a domain\n */\n private getDecayHalfLife(domain?: string): number {\n if (!domain) {\n return this.config.decayHalfLife.default || 90;\n }\n\n // Check if domain is in fast/slow categories\n if (FAST_DOMAINS.includes(domain)) {\n return this.config.decayHalfLife[domain] || 30;\n }\n if (SLOW_DOMAINS.includes(domain)) {\n return this.config.decayHalfLife[domain] || 180;\n }\n\n // Check custom configuration\n return this.config.decayHalfLife[domain] || this.config.decayHalfLife.default || 90;\n }\n\n /**\n * Detect collusion using Tarjan's SCC algorithm\n */\n private detectCollusion(target: string, endorsements: EndorsementV2[]): boolean {\n // Build endorsement graph\n const graph = this.buildGraph(endorsements);\n\n // Find strongly connected components\n const sccs = this.findSCCs(graph);\n\n // Check if target is in a collusion cluster\n for (const scc of sccs) {\n if (scc.nodes.includes(target) && scc.nodes.length > 3) {\n // Compute external connectivity ratio\n const ratio = scc.externalEdges / (scc.internalEdges || 1);\n if (ratio < 0.2) {\n logger.warn('Collusion detected', {\n target,\n sccSize: scc.nodes.length,\n ratio,\n });\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Build endorsement graph\n */\n private buildGraph(endorsements: EndorsementV2[]): Map<string, GraphNode> {\n const graph = new Map<string, GraphNode>();\n\n for (const endorsement of endorsements) {\n // Add nodes\n if (!graph.has(endorsement.from)) {\n graph.set(endorsement.from, { did: endorsement.from, endorsements: [] });\n }\n if (!graph.has(endorsement.to)) {\n graph.set(endorsement.to, { did: endorsement.to, endorsements: [] });\n }\n\n // Add edge\n graph.get(endorsement.from)!.endorsements.push(endorsement);\n }\n\n return graph;\n }\n\n /**\n * Find strongly connected components using Tarjan's algorithm\n */\n private findSCCs(graph: Map<string, GraphNode>): SCC[] {\n const sccs: SCC[] = [];\n const stack: string[] = [];\n let index = 0;\n\n const strongConnect = (node: GraphNode) => {\n node.index = index;\n node.lowlink = index;\n index++;\n stack.push(node.did);\n node.onStack = true;\n\n // Visit successors\n for (const endorsement of node.endorsements) {\n const successor = graph.get(endorsement.to);\n if (!successor) continue;\n\n if (successor.index === undefined) {\n strongConnect(successor);\n node.lowlink = Math.min(node.lowlink!, successor.lowlink!);\n } else if (successor.onStack) {\n node.lowlink = Math.min(node.lowlink!, successor.index);\n }\n }\n\n // Root of SCC\n if (node.lowlink === node.index) {\n const sccNodes: string[] = [];\n let w: string;\n do {\n w = stack.pop()!;\n graph.get(w)!.onStack = false;\n sccNodes.push(w);\n } while (w !== node.did);\n\n if (sccNodes.length > 1) {\n // Compute internal/external edges\n let internalEdges = 0;\n let externalEdges = 0;\n\n for (const did of sccNodes) {\n const n = graph.get(did)!;\n for (const endorsement of n.endorsements) {\n if (sccNodes.includes(endorsement.to)) {\n internalEdges++;\n } else {\n externalEdges++;\n }\n }\n }\n\n sccs.push({ nodes: sccNodes, internalEdges, externalEdges });\n }\n }\n };\n\n // Run Tarjan's algorithm on all nodes\n for (const node of graph.values()) {\n if (node.index === undefined) {\n strongConnect(node);\n }\n }\n\n return sccs;\n }\n\n /**\n * Rebuild the SCC penalty cache from a full endorsement graph.\n * Called lazily when the cache is stale.\n */\n private rebuildSccPenaltyCache(endorsements: EndorsementV2[]): void {\n this.sccPenaltyCache.clear();\n const graph = this.buildGraph(endorsements);\n const sccs = this.findSCCs(graph);\n\n for (const scc of sccs) {\n if (scc.nodes.length > 3) {\n const ratio = scc.externalEdges / (scc.internalEdges || 1);\n if (ratio < 0.2) {\n // Collusion cluster — penalise all members\n for (const did of scc.nodes) {\n this.sccPenaltyCache.set(did, 0.1);\n }\n }\n }\n }\n\n this.sccCacheExpiresAt = Date.now() + this.SCC_CACHE_TTL;\n }\n\n /**\n * Get collusion penalty for an endorser.\n * Returns 0.1 if the endorser is in a detected collusion cluster, 1.0 otherwise.\n */\n private getCollusionPenalty(endorser: string): number {\n return this.sccPenaltyCache.get(endorser) ?? 1.0;\n }\n\n /**\n * Filter endorsements by domain\n */\n private filterByDomain(endorsements: EndorsementV2[], domain?: string): EndorsementV2[] {\n if (!domain) {\n return endorsements;\n }\n\n return endorsements.filter(\n e => e.domain === domain || e.domain === undefined || e.domain === '*'\n );\n }\n\n /**\n * Get cache key\n */\n private getCacheKey(target: string, domain?: string): string {\n return `${target}:${domain || '*'}`;\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear();\n logger.debug('Trust score cache cleared');\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<TrustConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n decayHalfLife: {\n ...this.config.decayHalfLife,\n ...config.decayHalfLife,\n },\n };\n\n // Clear cache when config changes\n this.clearCache();\n logger.info('Trust config updated', { config });\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';\nexport * from './trust-computer.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 type { ChallengeSolution } 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 // Uptime tracking: DID → { firstSeen, totalOnlineMs, lastOnlineAt }\n private uptimeTracker = new Map<string, { firstSeen: number; totalOnlineMs: number; lastOnlineAt: number }>();\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 * Record agent coming online (for uptime tracking)\n */\n recordOnline(agentDid: string): void {\n const now = Date.now();\n const existing = this.uptimeTracker.get(agentDid);\n if (existing) {\n existing.lastOnlineAt = now;\n } else {\n this.uptimeTracker.set(agentDid, { firstSeen: now, totalOnlineMs: 0, lastOnlineAt: now });\n }\n }\n\n /**\n * Record agent going offline (for uptime tracking)\n */\n recordOffline(agentDid: string): void {\n const now = Date.now();\n const entry = this.uptimeTracker.get(agentDid);\n if (entry && entry.lastOnlineAt > 0) {\n entry.totalOnlineMs += now - entry.lastOnlineAt;\n entry.lastOnlineAt = 0;\n }\n }\n\n /**\n * Get uptime ratio for an agent (0.0 - 1.0)\n * Based on time since first seen vs total online time.\n */\n getUptime(agentDid: string): number {\n const entry = this.uptimeTracker.get(agentDid);\n if (!entry) return 1.0; // No data — assume good (benefit of the doubt)\n\n const now = Date.now();\n const totalMs = now - entry.firstSeen;\n if (totalMs < 60_000) return 1.0; // Too early to judge\n\n // Add current online session if still online\n const onlineMs = entry.totalOnlineMs + (entry.lastOnlineAt > 0 ? now - entry.lastOnlineAt : 0);\n return Math.min(1.0, onlineMs / totalMs);\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 = this.getUptime(agentDid);\n\n // Use average endorsement score (0-1) instead of raw count\n const endorsementScore = endorsementList.length > 0\n ? endorsementList.reduce((sum, e) => sum + e.score, 0) / endorsementList.length\n : 0;\n\n const score = this.metrics.calculateScore(stats, endorsementScore, 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: ChallengeSolution): 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"]}
|