@rookdaemon/agora 0.4.4 → 0.4.6

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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/peer/server.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from 'node:util';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { loadPeerConfig, savePeerConfig, initPeerConfig } from './transport/peer-config';\nimport { sendToPeer, decodeInboundEnvelope, type PeerConfig } from './transport/http';\nimport { sendViaRelay } from './transport/relay';\nimport type { MessageType } from './message/envelope';\nimport type { AnnouncePayload } from './registry/messages';\nimport { PeerServer } from './peer/server';\nimport { RelayServer } from './relay/server';\nimport { RelayClient } from './relay/client';\nimport { PeerDiscoveryService } from './discovery/peer-discovery';\nimport { getDefaultBootstrapRelay } from './discovery/bootstrap';\nimport { resolveBroadcastName } from './utils';\nimport { ReputationStore } from './reputation/store';\nimport { createVerification } from './reputation/verification';\nimport { createCommit, createReveal, verifyReveal } from './reputation/commit-reveal';\nimport { computeTrustScore } from './reputation/scoring';\n\ninterface CliOptions {\n config?: string;\n pretty?: boolean;\n}\n\n/**\n * Get the config file path from CLI options, environment, or default.\n */\nfunction getConfigPath(options: CliOptions): string {\n if (options.config) {\n return resolve(options.config);\n }\n if (process.env.AGORA_CONFIG) {\n return resolve(process.env.AGORA_CONFIG);\n }\n return resolve(homedir(), '.config', 'agora', 'config.json');\n}\n\n/**\n * Ensure the config directory exists.\n */\nfunction ensureConfigDir(configPath: string): void {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Output data as JSON or pretty format.\n */\nfunction output(data: unknown, pretty: boolean): void {\n if (pretty) {\n // Pretty output for humans\n if (typeof data === 'object' && data !== null) {\n for (const [key, value] of Object.entries(data)) {\n if (Array.isArray(value)) {\n console.log(`${key}:`);\n for (const item of value) {\n if (typeof item === 'object' && item !== null) {\n const entries = Object.entries(item);\n console.log(` - ${entries.map(([k, v]) => `${k}: ${v}`).join(', ')}`);\n } else {\n console.log(` - ${item}`);\n }\n }\n } else if (typeof value === 'object' && value !== null) {\n console.log(`${key}:`);\n for (const [k, v] of Object.entries(value)) {\n console.log(` ${k}: ${v}`);\n }\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n } else {\n console.log(data);\n }\n } else {\n // JSON output for programmatic use\n console.log(JSON.stringify(data, null, 2));\n }\n}\n\n/**\n * Handle the `agora init` command.\n */\nfunction handleInit(options: CliOptions): void {\n const configPath = getConfigPath(options);\n ensureConfigDir(configPath);\n\n if (existsSync(configPath)) {\n const config = loadPeerConfig(configPath);\n output({ \n status: 'already_initialized',\n publicKey: config.identity.publicKey,\n configPath \n }, options.pretty || false);\n process.exit(0);\n }\n\n const config = initPeerConfig(configPath);\n output({ \n status: 'initialized',\n publicKey: config.identity.publicKey,\n configPath \n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora whoami` command.\n */\nfunction handleWhoami(options: CliOptions): void {\n const configPath = getConfigPath(options);\n \n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n output({ \n publicKey: config.identity.publicKey,\n configPath \n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers add` command.\n */\nfunction handlePeersAdd(args: string[], options: CliOptions & { url?: string; token?: string; pubkey?: string }): void {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora peers add <name> --pubkey <pubkey> [--url <url> --token <token>]');\n process.exit(1);\n }\n\n const name = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const url = options.url;\n const token = options.token;\n const pubkey = options.pubkey;\n\n if (!pubkey) {\n console.error('Error: Missing required --pubkey option.');\n process.exit(1);\n }\n\n // Validate that if one of url/token is provided, both must be\n if ((url && !token) || (!url && token)) {\n console.error('Error: Both --url and --token must be provided together.');\n process.exit(1);\n }\n\n // Check if we have HTTP transport or relay\n const config = loadPeerConfig(configPath);\n const hasHttpConfig = url && token;\n const hasRelay = config.relay;\n\n if (!hasHttpConfig && !hasRelay) {\n console.error('Error: Either (--url and --token) must be provided, or relay must be configured in config file.');\n process.exit(1);\n }\n\n // Add the peer\n config.peers[name] = {\n publicKey: pubkey,\n name, // Set name to match the key for consistency\n };\n\n if (url && token) {\n config.peers[name].url = url;\n config.peers[name].token = token;\n }\n\n savePeerConfig(configPath, config);\n \n const outputData: Record<string, unknown> = { \n status: 'added',\n name,\n publicKey: pubkey\n };\n \n if (url) {\n outputData.url = url;\n }\n \n output(outputData, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers list` command.\n */\nfunction handlePeersList(options: CliOptions): void {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peers = Object.entries(config.peers).map(([key, peer]) => ({\n name: peer.name || key,\n url: peer.url,\n publicKey: peer.publicKey,\n }));\n\n output({ peers }, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers remove` command.\n */\nfunction handlePeersRemove(args: string[], options: CliOptions): void {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora peers remove <name>');\n process.exit(1);\n }\n\n const name = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n if (!config.peers[name]) {\n console.error(`Error: Peer '${name}' not found.`);\n process.exit(1);\n }\n\n delete config.peers[name];\n savePeerConfig(configPath, config);\n output({ \n status: 'removed',\n name \n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers discover` command.\n */\nasync function handlePeersDiscover(\n options: CliOptions & { \n relay?: string; \n 'relay-pubkey'?: string;\n limit?: string;\n 'active-within'?: string;\n save?: boolean;\n }\n): Promise<void> {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Determine relay configuration\n let relayUrl: string;\n let relayPublicKey: string | undefined;\n\n if (options.relay) {\n // Use custom relay from command line\n relayUrl = options.relay;\n relayPublicKey = options['relay-pubkey'];\n } else if (config.relay) {\n // Use relay from config\n relayUrl = typeof config.relay === 'string' ? config.relay : config.relay.url;\n // TODO: Add relayPublicKey to config schema in future\n relayPublicKey = undefined;\n } else {\n // Use default bootstrap relay\n const bootstrap = getDefaultBootstrapRelay();\n relayUrl = bootstrap.relayUrl;\n relayPublicKey = bootstrap.relayPublicKey;\n }\n\n // Parse filters\n const filters: { activeWithin?: number; limit?: number } = {};\n if (options['active-within']) {\n const ms = parseInt(options['active-within'], 10);\n if (isNaN(ms) || ms <= 0) {\n console.error('Error: --active-within must be a positive number (milliseconds)');\n process.exit(1);\n }\n filters.activeWithin = ms;\n }\n if (options.limit) {\n const limit = parseInt(options.limit, 10);\n if (isNaN(limit) || limit <= 0) {\n console.error('Error: --limit must be a positive number');\n process.exit(1);\n }\n filters.limit = limit;\n }\n\n // Resolve broadcast name\n const broadcastName = resolveBroadcastName(config, undefined);\n\n // Connect to relay\n const relayClient = new RelayClient({\n relayUrl,\n publicKey: config.identity.publicKey,\n privateKey: config.identity.privateKey,\n name: broadcastName,\n });\n\n try {\n // Connect\n await relayClient.connect();\n\n // Create discovery service\n const discoveryService = new PeerDiscoveryService({\n publicKey: config.identity.publicKey,\n privateKey: config.identity.privateKey,\n relayClient,\n relayPublicKey,\n });\n\n // Discover peers\n const peerList = await discoveryService.discoverViaRelay(Object.keys(filters).length > 0 ? filters : undefined);\n\n if (!peerList) {\n output({\n status: 'no_response',\n message: 'No response from relay',\n }, options.pretty || false);\n process.exit(1);\n }\n\n // Save to config if requested\n if (options.save) {\n let savedCount = 0;\n for (const peer of peerList.peers) {\n // Only save if not already in config\n const existing = Object.values(config.peers).find(p => p.publicKey === peer.publicKey);\n if (!existing) {\n const peerName = peer.metadata?.name || `peer-${peer.publicKey.substring(0, 8)}`;\n config.peers[peerName] = {\n publicKey: peer.publicKey,\n name: peerName,\n };\n savedCount++;\n }\n }\n if (savedCount > 0) {\n savePeerConfig(configPath, config);\n }\n\n output({\n status: 'discovered',\n totalPeers: peerList.totalPeers,\n peersReturned: peerList.peers.length,\n peersSaved: savedCount,\n relayPublicKey: peerList.relayPublicKey,\n peers: peerList.peers.map(p => ({\n publicKey: p.publicKey,\n name: p.metadata?.name,\n version: p.metadata?.version,\n lastSeen: p.lastSeen,\n })),\n }, options.pretty || false);\n } else {\n output({\n status: 'discovered',\n totalPeers: peerList.totalPeers,\n peersReturned: peerList.peers.length,\n relayPublicKey: peerList.relayPublicKey,\n peers: peerList.peers.map(p => ({\n publicKey: p.publicKey,\n name: p.metadata?.name,\n version: p.metadata?.version,\n lastSeen: p.lastSeen,\n })),\n }, options.pretty || false);\n }\n } catch (e) {\n console.error('Error discovering peers:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n } finally {\n relayClient.disconnect();\n }\n}\n\n/**\n * Handle the `agora send` command.\n */\nasync function handleSend(args: string[], options: CliOptions & { type?: string; payload?: string; direct?: boolean; 'relay-only'?: boolean }): Promise<void> {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora send <name> <message> OR agora send <name> --type <type> --payload <json>');\n process.exit(1);\n }\n\n const name = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n if (!config.peers[name]) {\n console.error(`Error: Peer '${name}' not found.`);\n process.exit(1);\n }\n\n const peer = config.peers[name];\n\n let messageType: MessageType;\n let messagePayload: unknown;\n\n if (options.type && options.payload) {\n // Typed message - validate it's a valid MessageType\n const validTypes: MessageType[] = ['announce', 'discover', 'request', 'response', 'publish', 'subscribe', 'verify', 'ack', 'error'];\n if (!validTypes.includes(options.type as MessageType)) {\n console.error(`Error: Invalid message type '${options.type}'. Valid types: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n messageType = options.type as MessageType;\n try {\n messagePayload = JSON.parse(options.payload);\n } catch {\n console.error('Error: Invalid JSON payload.');\n process.exit(1);\n }\n } else {\n // Text message - use 'publish' type with text payload\n if (args.length < 2) {\n console.error('Error: Missing message text. Usage: agora send <name> <message>');\n process.exit(1);\n }\n messageType = 'publish';\n messagePayload = { text: args.slice(1).join(' ') };\n }\n\n const isDirect = options.direct === true;\n const isRelayOnly = options['relay-only'] === true;\n\n // Validate flag combination\n if (isDirect && isRelayOnly) {\n console.error('Error: --direct and --relay-only are mutually exclusive.');\n process.exit(1);\n }\n\n // --direct requires the peer to have a URL\n if (isDirect && !peer.url) {\n console.error(`Error: --direct requested but peer '${name}' has no URL configured.`);\n process.exit(1);\n }\n\n // Whether to attempt HTTP transport for this send\n const shouldTryHttp = peer.url && !isRelayOnly;\n const hasRelay = config.relay;\n\n // Send the message\n try {\n if (shouldTryHttp) {\n // Use HTTP transport\n const transportConfig = {\n identity: config.identity,\n peers: new Map<string, PeerConfig>([[peer.publicKey, {\n url: peer.url!,\n token: peer.token,\n publicKey: peer.publicKey,\n }]]),\n };\n\n const result = await sendToPeer(\n transportConfig,\n peer.publicKey,\n messageType,\n messagePayload\n );\n\n if (result.ok) {\n output({ \n status: 'sent',\n peer: name,\n type: messageType,\n transport: 'http',\n httpStatus: result.status\n }, options.pretty || false);\n return;\n }\n\n // HTTP failed\n if (isDirect) {\n // --direct: do not fall back to relay\n output({ \n status: 'failed',\n peer: name,\n type: messageType,\n transport: 'http',\n httpStatus: result.status,\n error: result.error\n }, options.pretty || false);\n process.exit(1);\n }\n\n // Fall through to relay if available\n if (!hasRelay || !config.relay) {\n output({ \n status: 'failed',\n peer: name,\n type: messageType,\n transport: 'http',\n httpStatus: result.status,\n error: result.error\n }, options.pretty || false);\n process.exit(1);\n }\n }\n\n // Use relay transport (relay-only mode, or HTTP failed with relay available, or no URL)\n if (hasRelay && config.relay) {\n // Extract URL from relay (string or object)\n const relayUrl = typeof config.relay === 'string' ? config.relay : config.relay.url;\n const relayConfig = {\n identity: config.identity,\n relayUrl,\n };\n\n const result = await sendViaRelay(\n relayConfig,\n peer.publicKey,\n messageType,\n messagePayload\n );\n\n if (result.ok) {\n output({ \n status: 'sent',\n peer: name,\n type: messageType,\n transport: 'relay'\n }, options.pretty || false);\n } else {\n output({ \n status: 'failed',\n peer: name,\n type: messageType,\n transport: 'relay',\n error: result.error\n }, options.pretty || false);\n process.exit(1);\n }\n } else if (!shouldTryHttp) {\n // Neither HTTP nor relay available\n console.error(`Error: Peer '${name}' unreachable. No HTTP endpoint and no relay configured.`);\n process.exit(1);\n }\n } catch (e) {\n console.error('Error sending message:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\n/**\n * Handle the `agora decode` command.\n */\nfunction handleDecode(args: string[], options: CliOptions): void {\n if (args.length < 1) {\n console.error('Error: Missing message. Usage: agora decode <message>');\n process.exit(1);\n }\n\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peers = new Map<string, PeerConfig>();\n for (const [, val] of Object.entries(config.peers)) {\n // Only add peers with HTTP config to the map for decoding\n if (val.url && val.token) {\n peers.set(val.publicKey, {\n url: val.url,\n token: val.token,\n publicKey: val.publicKey,\n });\n }\n }\n\n const message = args.join(' ');\n const result = decodeInboundEnvelope(message, peers);\n\n if (result.ok) {\n output({\n status: 'verified',\n sender: result.envelope.sender,\n type: result.envelope.type,\n payload: result.envelope.payload,\n id: result.envelope.id,\n timestamp: result.envelope.timestamp,\n inReplyTo: result.envelope.inReplyTo || null,\n }, options.pretty || false);\n } else {\n output({\n status: 'failed',\n reason: result.reason,\n }, options.pretty || false);\n process.exit(1);\n }\n}\n\n/**\n * Handle the `agora status` command.\n */\nfunction handleStatus(options: CliOptions): void {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peerCount = Object.keys(config.peers).length;\n\n output({\n identity: config.identity.publicKey,\n configPath,\n relay: config.relay || 'not configured',\n peerCount,\n peers: Object.keys(config.peers),\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora announce` command.\n * Broadcasts an announce message to all configured peers.\n */\nasync function handleAnnounce(options: CliOptions & { name?: string; version?: string }): Promise<void> {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peerCount = Object.keys(config.peers).length;\n\n if (peerCount === 0) {\n console.error('Error: No peers configured. Use `agora peers add` to add peers first.');\n process.exit(1);\n }\n\n // Create announce payload\n const announcePayload: AnnouncePayload = {\n capabilities: [],\n metadata: {\n name: options.name || 'agora-node',\n version: options.version || '0.1.0',\n },\n };\n\n // Send announce to all peers\n const results: Array<{ peer: string; status: string; transport?: string; httpStatus?: number; error?: string }> = [];\n\n for (const [name, peer] of Object.entries(config.peers)) {\n const hasHttpTransport = peer.url && peer.token;\n const hasRelay = config.relay;\n\n try {\n if (hasHttpTransport) {\n // Use HTTP transport\n const peers = new Map<string, PeerConfig>();\n peers.set(peer.publicKey, {\n url: peer.url!,\n token: peer.token!,\n publicKey: peer.publicKey,\n });\n\n const transportConfig = {\n identity: config.identity,\n peers,\n };\n\n const result = await sendToPeer(\n transportConfig,\n peer.publicKey,\n 'announce',\n announcePayload\n );\n\n if (result.ok) {\n results.push({\n peer: name,\n status: 'sent',\n transport: 'http',\n httpStatus: result.status,\n });\n } else {\n results.push({\n peer: name,\n status: 'failed',\n transport: 'http',\n httpStatus: result.status,\n error: result.error,\n });\n }\n } else if (hasRelay && config.relay) {\n // Use relay transport\n // Extract URL from relay (string or object)\n const relayUrl = typeof config.relay === 'string' ? config.relay : config.relay.url;\n const relayConfig = {\n identity: config.identity,\n relayUrl,\n };\n\n const result = await sendViaRelay(\n relayConfig,\n peer.publicKey,\n 'announce',\n announcePayload\n );\n\n if (result.ok) {\n results.push({\n peer: name,\n status: 'sent',\n transport: 'relay',\n });\n } else {\n results.push({\n peer: name,\n status: 'failed',\n transport: 'relay',\n error: result.error,\n });\n }\n } else {\n results.push({\n peer: name,\n status: 'unreachable',\n error: 'No HTTP endpoint and no relay configured',\n });\n }\n } catch (e) {\n results.push({\n peer: name,\n status: 'error',\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n\n output({ results }, options.pretty || false);\n}\n\n/**\n * Handle the `agora diagnose` command.\n * Run diagnostic checks on a peer (ping, workspace, tools).\n */\nasync function handleDiagnose(args: string[], options: CliOptions & { checks?: string }): Promise<void> {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora diagnose <name> [--checks <comma-separated-list>]');\n process.exit(1);\n }\n\n const name = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n if (!config.peers[name]) {\n console.error(`Error: Peer '${name}' not found.`);\n process.exit(1);\n }\n\n const peer = config.peers[name];\n\n if (!peer.url) {\n console.error(`Error: Peer '${name}' has no URL configured. Cannot diagnose.`);\n process.exit(1);\n }\n\n // Parse checks parameter\n const checksParam = options.checks || 'ping';\n const requestedChecks = checksParam.split(',').map(c => c.trim());\n \n // Validate check types\n const validChecks = ['ping', 'workspace', 'tools'];\n for (const check of requestedChecks) {\n if (!validChecks.includes(check)) {\n console.error(`Error: Invalid check type '${check}'. Valid checks: ${validChecks.join(', ')}`);\n process.exit(1);\n }\n }\n\n // Result structure\n interface CheckResult {\n ok: boolean;\n latency_ms?: number;\n error?: string;\n implemented?: boolean;\n [key: string]: unknown;\n }\n \n const result: {\n peer: string;\n status: string;\n checks: Record<string, CheckResult>;\n timestamp: string;\n } = {\n peer: name,\n status: 'unknown',\n checks: {},\n timestamp: new Date().toISOString(),\n };\n\n // Run ping check\n if (requestedChecks.includes('ping')) {\n const startTime = Date.now();\n try {\n // Add timeout to prevent hanging on unreachable peers\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10000);\n \n const response = await fetch(peer.url, {\n method: 'GET',\n headers: peer.token ? { 'Authorization': `Bearer ${peer.token}` } : {},\n signal: controller.signal,\n });\n \n clearTimeout(timeout);\n const latency = Date.now() - startTime;\n \n if (response.ok || response.status === 404 || response.status === 405) {\n // 404 or 405 means the endpoint exists but GET isn't supported - that's OK for a ping\n result.checks.ping = { ok: true, latency_ms: latency };\n } else {\n result.checks.ping = { ok: false, latency_ms: latency, error: `HTTP ${response.status}` };\n }\n } catch (err) {\n const latency = Date.now() - startTime;\n result.checks.ping = { \n ok: false, \n latency_ms: latency,\n error: err instanceof Error ? err.message : String(err) \n };\n }\n }\n\n // Run workspace check\n if (requestedChecks.includes('workspace')) {\n // This is a placeholder - actual implementation would depend on peer's diagnostic protocol\n result.checks.workspace = { \n ok: false,\n implemented: false,\n error: 'Workspace check requires peer diagnostic protocol support' \n };\n }\n\n // Run tools check\n if (requestedChecks.includes('tools')) {\n // This is a placeholder - actual implementation would depend on peer's diagnostic protocol\n result.checks.tools = { \n ok: false,\n implemented: false,\n error: 'Tools check requires peer diagnostic protocol support' \n };\n }\n\n // Determine overall status - only consider implemented checks\n const implementedChecks = Object.values(result.checks).filter(\n check => check.implemented !== false\n );\n \n if (implementedChecks.length === 0) {\n result.status = 'unknown';\n } else {\n const allOk = implementedChecks.every(check => check.ok);\n const anyOk = implementedChecks.some(check => check.ok);\n result.status = allOk ? 'healthy' : anyOk ? 'degraded' : 'unhealthy';\n }\n\n output(result, options.pretty || false);\n}\n\n/**\n * Handle the `agora serve` command.\n * Starts a persistent WebSocket server for incoming peer connections.\n */\nasync function handleServe(options: CliOptions & { port?: string; name?: string }): Promise<void> {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const port = parseInt(options.port || '9473', 10);\n \n // Validate port\n if (isNaN(port) || port < 1 || port > 65535) {\n console.error(`Error: Invalid port number '${options.port}'. Port must be between 1 and 65535.`);\n process.exit(1);\n }\n \n // Resolve server name using priority: CLI --name, config.relay.name, config.identity.name, default\n const serverName = resolveBroadcastName(config, options.name) || 'agora-server';\n\n // Create announce payload\n const announcePayload: AnnouncePayload = {\n capabilities: [],\n metadata: {\n name: serverName,\n version: '0.1.0',\n },\n };\n\n // Create and configure PeerServer\n const server = new PeerServer(config.identity, announcePayload);\n\n // Setup event listeners\n server.on('peer-connected', (publicKey, peer) => {\n const peerName = peer.metadata?.name || publicKey.substring(0, 16);\n console.log(`[${new Date().toISOString()}] Peer connected: ${peerName} (${publicKey})`);\n });\n\n server.on('peer-disconnected', (publicKey) => {\n console.log(`[${new Date().toISOString()}] Peer disconnected: ${publicKey}`);\n });\n\n server.on('message-received', (envelope, fromPublicKey) => {\n console.log(`[${new Date().toISOString()}] Message from ${fromPublicKey}:`);\n console.log(JSON.stringify({\n id: envelope.id,\n type: envelope.type,\n sender: envelope.sender,\n timestamp: envelope.timestamp,\n payload: envelope.payload,\n }, null, 2));\n });\n\n server.on('error', (error) => {\n console.error(`[${new Date().toISOString()}] Error:`, error.message);\n });\n\n // Start the server\n try {\n await server.start(port);\n console.log(`[${new Date().toISOString()}] Agora server started`);\n console.log(` Name: ${serverName}`);\n console.log(` Public Key: ${config.identity.publicKey}`);\n console.log(` WebSocket Port: ${port}`);\n console.log(` Listening for peer connections...`);\n console.log('');\n console.log('Press Ctrl+C to stop the server');\n\n // Keep the process alive\n process.on('SIGINT', async () => {\n console.log(`\\n[${new Date().toISOString()}] Shutting down server...`);\n await server.stop();\n console.log('Server stopped');\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n console.log(`\\n[${new Date().toISOString()}] Shutting down server...`);\n await server.stop();\n console.log('Server stopped');\n process.exit(0);\n });\n } catch (error) {\n console.error('Failed to start server:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Handle the `agora relay` command.\n * Starts a WebSocket relay server for routing messages between agents.\n */\nasync function handleRelay(options: CliOptions & { port?: string }): Promise<void> {\n const port = parseInt(options.port || '9474', 10);\n \n // Validate port\n if (isNaN(port) || port < 1 || port > 65535) {\n console.error(`Error: Invalid port number '${options.port}'. Port must be between 1 and 65535.`);\n process.exit(1);\n }\n\n // Create and configure RelayServer\n const server = new RelayServer();\n\n // Setup event listeners\n server.on('agent-registered', (publicKey) => {\n console.log(`[${new Date().toISOString()}] Agent registered: ${publicKey}`);\n });\n\n server.on('agent-disconnected', (publicKey) => {\n console.log(`[${new Date().toISOString()}] Agent disconnected: ${publicKey}`);\n });\n\n server.on('message-relayed', (from, to, envelope) => {\n console.log(`[${new Date().toISOString()}] Message relayed: ${from.substring(0, 16)}... → ${to.substring(0, 16)}... (type: ${envelope.type})`);\n });\n\n server.on('error', (error) => {\n console.error(`[${new Date().toISOString()}] Error:`, error.message);\n });\n\n // Start the server\n try {\n await server.start(port);\n console.log(`[${new Date().toISOString()}] Agora relay server started`);\n console.log(` WebSocket Port: ${port}`);\n console.log(` Connected agents: 0`);\n console.log(` Listening for agent connections...`);\n console.log('');\n console.log('Press Ctrl+C to stop the relay');\n\n // Shared shutdown handler\n const shutdown = async (): Promise<void> => {\n console.log(`\\n[${new Date().toISOString()}] Shutting down relay...`);\n await server.stop();\n console.log('Relay stopped');\n process.exit(0);\n };\n\n // Keep the process alive\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n } catch (error) {\n console.error('Failed to start relay:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Get the reputation store file path.\n */\nfunction getReputationStorePath(): string {\n return resolve(homedir(), '.local', 'share', 'agora', 'reputation.jsonl');\n}\n\n/**\n * Handle the `agora reputation verify` command.\n * Creates a verification record for another agent's output.\n */\nasync function handleReputationVerify(\n args: string[],\n options: CliOptions & {\n target?: string;\n domain?: string;\n verdict?: string;\n confidence?: string;\n evidence?: string;\n }\n): Promise<void> {\n if (!options.target || !options.domain || !options.verdict) {\n console.error('Error: Missing required options');\n console.error('Usage: agora reputation verify --target <id> --domain <domain> --verdict <correct|incorrect|disputed> --confidence <0-1> [--evidence <url>]');\n process.exit(1);\n }\n\n // Validate verdict\n if (!['correct', 'incorrect', 'disputed'].includes(options.verdict)) {\n console.error('Error: verdict must be one of: correct, incorrect, disputed');\n process.exit(1);\n }\n\n // Parse confidence\n const confidence = options.confidence ? parseFloat(options.confidence) : 1.0;\n if (isNaN(confidence) || confidence < 0 || confidence > 1) {\n console.error('Error: confidence must be a number between 0 and 1');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Create verification\n const verification = createVerification(\n config.identity.publicKey,\n config.identity.privateKey,\n options.target,\n options.domain,\n options.verdict as 'correct' | 'incorrect' | 'disputed',\n confidence,\n Date.now(),\n options.evidence\n );\n\n // Save to reputation store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n await store.addVerification(verification);\n\n output({\n status: 'verification_created',\n id: verification.id,\n verifier: verification.verifier,\n target: verification.target,\n domain: verification.domain,\n verdict: verification.verdict,\n confidence: verification.confidence,\n timestamp: verification.timestamp,\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora reputation commit` command.\n * Creates a commitment to a prediction before outcome is known.\n */\nasync function handleReputationCommit(\n args: string[],\n options: CliOptions & {\n domain?: string;\n prediction?: string;\n expiry?: string;\n }\n): Promise<void> {\n if (!options.domain || !options.prediction) {\n console.error('Error: Missing required options');\n console.error('Usage: agora reputation commit --domain <domain> --prediction <text> [--expiry <milliseconds>]');\n console.error('Example: agora reputation commit --domain weather_forecast --prediction \"It will rain tomorrow\" --expiry 86400000');\n process.exit(1);\n }\n\n // Parse expiry (default 24 hours)\n const expiryMs = options.expiry ? parseInt(options.expiry, 10) : 86400000;\n if (isNaN(expiryMs) || expiryMs <= 0) {\n console.error('Error: expiry must be a positive number (milliseconds)');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Create commit\n const commit = createCommit(\n config.identity.publicKey,\n config.identity.privateKey,\n options.domain,\n options.prediction,\n Date.now(),\n expiryMs\n );\n\n // Save to reputation store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n await store.addCommit(commit);\n\n output({\n status: 'commitment_created',\n id: commit.id,\n agent: commit.agent,\n domain: commit.domain,\n commitment: commit.commitment,\n timestamp: commit.timestamp,\n expiry: commit.expiry,\n note: 'Store this ID to reveal the prediction after expiry',\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora reputation reveal` command.\n * Reveals a prediction and outcome after commitment expiry.\n */\nasync function handleReputationReveal(\n args: string[],\n options: CliOptions & {\n 'commit-id'?: string;\n prediction?: string;\n outcome?: string;\n evidence?: string;\n }\n): Promise<void> {\n if (!options['commit-id'] || !options.prediction || !options.outcome) {\n console.error('Error: Missing required options');\n console.error('Usage: agora reputation reveal --commit-id <id> --prediction <text> --outcome <text> [--evidence <url>]');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Load commit from store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n const commit = await store.getCommit(options['commit-id']);\n\n if (!commit) {\n console.error(`Error: Commitment ${options['commit-id']} not found in local store`);\n process.exit(1);\n }\n\n // Create reveal\n const reveal = createReveal(\n config.identity.publicKey,\n config.identity.privateKey,\n options['commit-id'],\n options.prediction,\n options.outcome,\n Date.now(),\n options.evidence\n );\n \n // Verify the reveal against the commit\n const verification = verifyReveal(commit, reveal);\n if (!verification.valid) {\n console.error(`Error: Reveal verification failed: ${verification.reason}`);\n process.exit(1);\n }\n\n // Save to reputation store\n await store.addReveal(reveal);\n\n output({\n status: 'prediction_revealed',\n id: reveal.id,\n agent: reveal.agent,\n commitmentId: reveal.commitmentId,\n prediction: reveal.prediction,\n outcome: reveal.outcome,\n timestamp: reveal.timestamp,\n verified: true,\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora reputation query` command.\n * Queries reputation score for an agent in a domain.\n */\nasync function handleReputationQuery(\n args: string[],\n options: CliOptions & {\n agent?: string;\n domain?: string;\n }\n): Promise<void> {\n if (!options.domain) {\n console.error('Error: Missing required option: --domain');\n console.error('Usage: agora reputation query --domain <domain> [--agent <pubkey>]');\n console.error('If --agent is omitted, shows reputation for current agent');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const agent = options.agent || config.identity.publicKey;\n\n // Load reputation store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n const verifications = await store.getVerificationsByDomain(options.domain);\n\n // Filter verifications for this agent\n const agentVerifications = verifications.filter(v => v.target === agent);\n\n // Compute trust score\n const score = computeTrustScore(agent, options.domain, agentVerifications, Date.now());\n\n output({\n agent: score.agent,\n domain: score.domain,\n score: score.score,\n verificationCount: score.verificationCount,\n lastVerified: score.lastVerified,\n lastVerifiedDate: score.lastVerified > 0 ? new Date(score.lastVerified).toISOString() : 'never',\n topVerifiers: score.topVerifiers,\n }, options.pretty || false);\n}\n\n/**\n * Parse CLI arguments and route to appropriate handler.\n */\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0) {\n console.error('Usage: agora <command> [options]');\n console.error('Commands: init, whoami, status, peers, announce, send, decode, serve, diagnose, relay, reputation');\n console.error(' peers subcommands: add, list, remove, discover');\n console.error(' reputation subcommands: verify, commit, reveal, query');\n process.exit(1);\n }\n\n // Parse global options\n const parsed = parseArgs({\n args,\n options: {\n config: { type: 'string' },\n pretty: { type: 'boolean' },\n url: { type: 'string' },\n token: { type: 'string' },\n pubkey: { type: 'string' },\n type: { type: 'string' },\n payload: { type: 'string' },\n name: { type: 'string' },\n version: { type: 'string' },\n port: { type: 'string' },\n checks: { type: 'string' },\n relay: { type: 'string' },\n 'relay-pubkey': { type: 'string' },\n limit: { type: 'string' },\n 'active-within': { type: 'string' },\n save: { type: 'boolean' },\n // Reputation options\n target: { type: 'string' },\n domain: { type: 'string' },\n verdict: { type: 'string' },\n confidence: { type: 'string' },\n evidence: { type: 'string' },\n prediction: { type: 'string' },\n expiry: { type: 'string' },\n 'commit-id': { type: 'string' },\n outcome: { type: 'string' },\n agent: { type: 'string' },\n direct: { type: 'boolean' },\n 'relay-only': { type: 'boolean' },\n },\n strict: false,\n allowPositionals: true,\n });\n\n const command = parsed.positionals[0];\n const subcommand = parsed.positionals[1];\n const remainingArgs = parsed.positionals.slice(2);\n\n const options: CliOptions & { \n type?: string; \n payload?: string; \n url?: string; \n token?: string; \n pubkey?: string; \n name?: string; \n version?: string; \n port?: string; \n checks?: string;\n relay?: string;\n 'relay-pubkey'?: string;\n limit?: string;\n 'active-within'?: string;\n save?: boolean;\n // Reputation options\n target?: string;\n domain?: string;\n verdict?: string;\n confidence?: string;\n evidence?: string;\n prediction?: string;\n outcome?: string;\n expiry?: string;\n 'commit-id'?: string;\n agent?: string;\n direct?: boolean;\n 'relay-only'?: boolean;\n } = {\n config: typeof parsed.values.config === 'string' ? parsed.values.config : undefined,\n pretty: typeof parsed.values.pretty === 'boolean' ? parsed.values.pretty : undefined,\n type: typeof parsed.values.type === 'string' ? parsed.values.type : undefined,\n payload: typeof parsed.values.payload === 'string' ? parsed.values.payload : undefined,\n url: typeof parsed.values.url === 'string' ? parsed.values.url : undefined,\n token: typeof parsed.values.token === 'string' ? parsed.values.token : undefined,\n pubkey: typeof parsed.values.pubkey === 'string' ? parsed.values.pubkey : undefined,\n name: typeof parsed.values.name === 'string' ? parsed.values.name : undefined,\n version: typeof parsed.values.version === 'string' ? parsed.values.version : undefined,\n port: typeof parsed.values.port === 'string' ? parsed.values.port : undefined,\n checks: typeof parsed.values.checks === 'string' ? parsed.values.checks : undefined,\n relay: typeof parsed.values.relay === 'string' ? parsed.values.relay : undefined,\n 'relay-pubkey': typeof parsed.values['relay-pubkey'] === 'string' ? parsed.values['relay-pubkey'] : undefined,\n limit: typeof parsed.values.limit === 'string' ? parsed.values.limit : undefined,\n 'active-within': typeof parsed.values['active-within'] === 'string' ? parsed.values['active-within'] : undefined,\n save: typeof parsed.values.save === 'boolean' ? parsed.values.save : undefined,\n // Reputation options\n target: typeof parsed.values.target === 'string' ? parsed.values.target : undefined,\n domain: typeof parsed.values.domain === 'string' ? parsed.values.domain : undefined,\n verdict: typeof parsed.values.verdict === 'string' ? parsed.values.verdict : undefined,\n confidence: typeof parsed.values.confidence === 'string' ? parsed.values.confidence : undefined,\n evidence: typeof parsed.values.evidence === 'string' ? parsed.values.evidence : undefined,\n prediction: typeof parsed.values.prediction === 'string' ? parsed.values.prediction : undefined,\n expiry: typeof parsed.values.expiry === 'string' ? parsed.values.expiry : undefined,\n 'commit-id': typeof parsed.values['commit-id'] === 'string' ? parsed.values['commit-id'] : undefined,\n outcome: typeof parsed.values.outcome === 'string' ? parsed.values.outcome : undefined,\n agent: typeof parsed.values.agent === 'string' ? parsed.values.agent : undefined,\n direct: typeof parsed.values.direct === 'boolean' ? parsed.values.direct : undefined,\n 'relay-only': typeof parsed.values['relay-only'] === 'boolean' ? parsed.values['relay-only'] : undefined,\n };\n\n try {\n switch (command) {\n case 'init':\n handleInit(options);\n break;\n case 'whoami':\n handleWhoami(options);\n break;\n case 'status':\n handleStatus(options);\n break;\n case 'announce':\n await handleAnnounce(options);\n break;\n case 'diagnose':\n await handleDiagnose([subcommand, ...remainingArgs].filter(Boolean), options);\n break;\n case 'peers':\n switch (subcommand) {\n case 'add':\n handlePeersAdd(remainingArgs, options);\n break;\n case 'list':\n case undefined:\n // Allow 'agora peers' to work like 'agora peers list'\n handlePeersList(options);\n break;\n case 'remove':\n handlePeersRemove(remainingArgs, options);\n break;\n case 'discover':\n await handlePeersDiscover(options);\n break;\n default:\n console.error('Error: Unknown peers subcommand. Use: add, list, remove, discover');\n process.exit(1);\n }\n break;\n case 'send':\n await handleSend([subcommand, ...remainingArgs], options);\n break;\n case 'decode':\n handleDecode([subcommand, ...remainingArgs].filter(Boolean), options);\n break;\n case 'serve':\n await handleServe(options);\n break;\n case 'relay':\n await handleRelay(options);\n break;\n case 'reputation':\n switch (subcommand) {\n case 'verify':\n await handleReputationVerify(remainingArgs, options);\n break;\n case 'commit':\n await handleReputationCommit(remainingArgs, options);\n break;\n case 'reveal':\n await handleReputationReveal(remainingArgs, options);\n break;\n case 'query':\n await handleReputationQuery(remainingArgs, options);\n break;\n default:\n console.error('Error: Unknown reputation subcommand. Use: verify, commit, reveal, query');\n process.exit(1);\n }\n break;\n default:\n console.error(`Error: Unknown command '${command}'. Use: init, whoami, status, peers, announce, send, decode, serve, diagnose, relay, reputation`);\n process.exit(1);\n }\n } catch (e) {\n console.error('Error:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nmain().catch((e) => {\n console.error('Fatal error:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n});\n","import { EventEmitter } from 'node:events';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport type { KeyPair } from '../identity/keypair';\nimport type { Envelope } from '../message/envelope';\nimport { createEnvelope, verifyEnvelope } from '../message/envelope';\nimport type { AnnouncePayload } from '../registry/messages';\n\n/**\n * Represents a connected peer\n */\nexport interface ConnectedPeer {\n /** Peer's public key */\n publicKey: string;\n /** WebSocket connection */\n socket: WebSocket;\n /** Whether the peer has been announced */\n announced: boolean;\n /** Peer metadata from announce message */\n metadata?: {\n name?: string;\n version?: string;\n };\n}\n\n/**\n * Events emitted by PeerServer\n */\nexport interface PeerServerEvents {\n 'peer-connected': (publicKey: string, peer: ConnectedPeer) => void;\n 'peer-disconnected': (publicKey: string) => void;\n 'message-received': (envelope: Envelope, fromPublicKey: string) => void;\n 'error': (error: Error) => void;\n}\n\n/**\n * WebSocket server for accepting peer connections\n */\nexport class PeerServer extends EventEmitter {\n private wss: WebSocketServer | null = null;\n private peers = new Map<string, ConnectedPeer>();\n private identity: KeyPair;\n private announcePayload: AnnouncePayload;\n\n constructor(identity: KeyPair, announcePayload: AnnouncePayload) {\n super();\n this.identity = identity;\n this.announcePayload = announcePayload;\n }\n\n /**\n * Start the WebSocket server\n */\n start(port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.wss = new WebSocketServer({ port });\n\n this.wss.on('error', (error) => {\n this.emit('error', error);\n reject(error);\n });\n\n this.wss.on('listening', () => {\n resolve();\n });\n\n this.wss.on('connection', (socket: WebSocket) => {\n this.handleConnection(socket);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Stop the WebSocket server\n */\n async stop(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.wss) {\n resolve();\n return;\n }\n\n // Close all peer connections\n for (const peer of this.peers.values()) {\n peer.socket.close();\n }\n this.peers.clear();\n\n this.wss.close((err) => {\n if (err) {\n reject(err);\n } else {\n this.wss = null;\n resolve();\n }\n });\n });\n }\n\n /**\n * Get all connected peers\n */\n getPeers(): Map<string, ConnectedPeer> {\n return new Map(this.peers);\n }\n\n /**\n * Send a message to a specific peer\n */\n send(publicKey: string, envelope: Envelope): boolean {\n const peer = this.peers.get(publicKey);\n if (!peer || peer.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n try {\n peer.socket.send(JSON.stringify(envelope));\n return true;\n } catch (error) {\n this.emit('error', error as Error);\n return false;\n }\n }\n\n /**\n * Broadcast a message to all connected peers\n */\n broadcast(envelope: Envelope): void {\n for (const [publicKey, peer] of this.peers) {\n if (peer.socket.readyState === WebSocket.OPEN) {\n this.send(publicKey, envelope);\n }\n }\n }\n\n /**\n * Handle incoming connection\n */\n private handleConnection(socket: WebSocket): void {\n let peerPublicKey: string | null = null;\n\n // Send announce message immediately\n const announceEnvelope = createEnvelope(\n 'announce',\n this.identity.publicKey,\n this.identity.privateKey,\n this.announcePayload\n );\n socket.send(JSON.stringify(announceEnvelope));\n\n socket.on('message', (data: Buffer) => {\n try {\n const envelope = JSON.parse(data.toString()) as Envelope;\n\n // Verify envelope signature\n const verification = verifyEnvelope(envelope);\n if (!verification.valid) {\n // Drop invalid messages\n return;\n }\n\n // First message should be an announce\n if (!peerPublicKey) {\n if (envelope.type === 'announce') {\n peerPublicKey = envelope.sender;\n const payload = envelope.payload as AnnouncePayload;\n \n const peer: ConnectedPeer = {\n publicKey: peerPublicKey,\n socket,\n announced: true,\n metadata: payload.metadata,\n };\n\n this.peers.set(peerPublicKey, peer);\n this.emit('peer-connected', peerPublicKey, peer);\n }\n return;\n }\n\n // Verify the message is from the announced peer\n if (envelope.sender !== peerPublicKey) {\n // Drop messages from wrong sender\n return;\n }\n\n // Emit message-received event\n this.emit('message-received', envelope, peerPublicKey);\n } catch {\n // Invalid JSON or other parsing errors - drop the message\n }\n });\n\n socket.on('close', () => {\n if (peerPublicKey) {\n this.peers.delete(peerPublicKey);\n this.emit('peer-disconnected', peerPublicKey);\n }\n });\n\n socket.on('error', (error) => {\n this.emit('error', error);\n });\n }\n}\n"],"mappings":"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","names":["resolve","config"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/peer/server.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from 'node:util';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { loadPeerConfig, savePeerConfig, initPeerConfig } from './transport/peer-config';\nimport { sendToPeer, decodeInboundEnvelope, type PeerConfig } from './transport/http';\nimport { sendViaRelay } from './transport/relay';\nimport type { MessageType } from './message/envelope';\nimport type { AnnouncePayload } from './registry/messages';\nimport { PeerServer } from './peer/server';\nimport { RelayServer } from './relay/server';\nimport { RelayClient } from './relay/client';\nimport { PeerDiscoveryService } from './discovery/peer-discovery';\nimport { getDefaultBootstrapRelay } from './discovery/bootstrap';\nimport { resolveBroadcastName } from './utils';\nimport { ReputationStore } from './reputation/store';\nimport { createVerification } from './reputation/verification';\nimport { createCommit, createReveal, verifyReveal } from './reputation/commit-reveal';\nimport { computeTrustScore } from './reputation/scoring';\n\ninterface CliOptions {\n config?: string;\n pretty?: boolean;\n}\n\ntype ConfigPeer = ReturnType<typeof loadPeerConfig>['peers'][string];\n\nfunction resolvePeerEntry(peers: Record<string, ConfigPeer>, identifier: string): { key: string; peer: ConfigPeer } | undefined {\n const direct = peers[identifier];\n if (direct) {\n return { key: identifier, peer: direct };\n }\n\n for (const [key, peer] of Object.entries(peers)) {\n if (peer.publicKey === identifier || peer.name === identifier) {\n return { key, peer };\n }\n }\n\n return undefined;\n}\n\n/**\n * Get the config file path from CLI options, environment, or default.\n */\nfunction getConfigPath(options: CliOptions): string {\n if (options.config) {\n return resolve(options.config);\n }\n if (process.env.AGORA_CONFIG) {\n return resolve(process.env.AGORA_CONFIG);\n }\n return resolve(homedir(), '.config', 'agora', 'config.json');\n}\n\n/**\n * Ensure the config directory exists.\n */\nfunction ensureConfigDir(configPath: string): void {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Output data as JSON or pretty format.\n */\nfunction output(data: unknown, pretty: boolean): void {\n if (pretty) {\n // Pretty output for humans\n if (typeof data === 'object' && data !== null) {\n for (const [key, value] of Object.entries(data)) {\n if (Array.isArray(value)) {\n console.log(`${key}:`);\n for (const item of value) {\n if (typeof item === 'object' && item !== null) {\n const entries = Object.entries(item);\n console.log(` - ${entries.map(([k, v]) => `${k}: ${v}`).join(', ')}`);\n } else {\n console.log(` - ${item}`);\n }\n }\n } else if (typeof value === 'object' && value !== null) {\n console.log(`${key}:`);\n for (const [k, v] of Object.entries(value)) {\n console.log(` ${k}: ${v}`);\n }\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n } else {\n console.log(data);\n }\n } else {\n // JSON output for programmatic use\n console.log(JSON.stringify(data, null, 2));\n }\n}\n\n/**\n * Handle the `agora init` command.\n */\nfunction handleInit(options: CliOptions): void {\n const configPath = getConfigPath(options);\n ensureConfigDir(configPath);\n\n if (existsSync(configPath)) {\n const config = loadPeerConfig(configPath);\n output({ \n status: 'already_initialized',\n publicKey: config.identity.publicKey,\n configPath \n }, options.pretty || false);\n process.exit(0);\n }\n\n const config = initPeerConfig(configPath);\n output({ \n status: 'initialized',\n publicKey: config.identity.publicKey,\n configPath \n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora whoami` command.\n */\nfunction handleWhoami(options: CliOptions): void {\n const configPath = getConfigPath(options);\n \n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n output({ \n publicKey: config.identity.publicKey,\n configPath \n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers add` command.\n */\nfunction handlePeersAdd(args: string[], options: CliOptions & { url?: string; token?: string; pubkey?: string }): void {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora peers add <name> --pubkey <pubkey> [--url <url> --token <token>]');\n process.exit(1);\n }\n\n const name = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const url = options.url;\n const token = options.token;\n const pubkey = options.pubkey;\n\n if (!pubkey) {\n console.error('Error: Missing required --pubkey option.');\n process.exit(1);\n }\n\n // Validate that if one of url/token is provided, both must be\n if ((url && !token) || (!url && token)) {\n console.error('Error: Both --url and --token must be provided together.');\n process.exit(1);\n }\n\n // Check if we have HTTP transport or relay\n const config = loadPeerConfig(configPath);\n const hasHttpConfig = url && token;\n const hasRelay = config.relay;\n\n if (!hasHttpConfig && !hasRelay) {\n console.error('Error: Either (--url and --token) must be provided, or relay must be configured in config file.');\n process.exit(1);\n }\n\n // Add/update the peer (canonical key is full public key)\n const existingByPubKey = Object.entries(config.peers).find(([, peer]) => peer.publicKey === pubkey);\n if (existingByPubKey && existingByPubKey[0] !== pubkey) {\n delete config.peers[existingByPubKey[0]];\n }\n\n config.peers[pubkey] = {\n publicKey: pubkey,\n name,\n };\n\n if (url && token) {\n config.peers[pubkey].url = url;\n config.peers[pubkey].token = token;\n }\n\n savePeerConfig(configPath, config);\n \n const outputData: Record<string, unknown> = { \n status: 'added',\n name,\n publicKey: pubkey\n };\n \n if (url) {\n outputData.url = url;\n }\n \n output(outputData, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers list` command.\n */\nfunction handlePeersList(options: CliOptions): void {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peers = Object.entries(config.peers).map(([key, peer]) => ({\n name: peer.name || key,\n url: peer.url,\n publicKey: peer.publicKey,\n }));\n\n output({ peers }, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers remove` command.\n */\nfunction handlePeersRemove(args: string[], options: CliOptions): void {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora peers remove <name>');\n process.exit(1);\n }\n\n const peerRef = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n const resolved = resolvePeerEntry(config.peers, peerRef);\n if (!resolved) {\n console.error(`Error: Peer '${peerRef}' not found.`);\n process.exit(1);\n }\n\n delete config.peers[resolved.key];\n savePeerConfig(configPath, config);\n output({ \n status: 'removed',\n name: peerRef \n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora peers discover` command.\n */\nasync function handlePeersDiscover(\n options: CliOptions & { \n relay?: string; \n 'relay-pubkey'?: string;\n limit?: string;\n 'active-within'?: string;\n save?: boolean;\n }\n): Promise<void> {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Determine relay configuration\n let relayUrl: string;\n let relayPublicKey: string | undefined;\n\n if (options.relay) {\n // Use custom relay from command line\n relayUrl = options.relay;\n relayPublicKey = options['relay-pubkey'];\n } else if (config.relay) {\n // Use relay from config\n relayUrl = typeof config.relay === 'string' ? config.relay : config.relay.url;\n // TODO: Add relayPublicKey to config schema in future\n relayPublicKey = undefined;\n } else {\n // Use default bootstrap relay\n const bootstrap = getDefaultBootstrapRelay();\n relayUrl = bootstrap.relayUrl;\n relayPublicKey = bootstrap.relayPublicKey;\n }\n\n // Parse filters\n const filters: { activeWithin?: number; limit?: number } = {};\n if (options['active-within']) {\n const ms = parseInt(options['active-within'], 10);\n if (isNaN(ms) || ms <= 0) {\n console.error('Error: --active-within must be a positive number (milliseconds)');\n process.exit(1);\n }\n filters.activeWithin = ms;\n }\n if (options.limit) {\n const limit = parseInt(options.limit, 10);\n if (isNaN(limit) || limit <= 0) {\n console.error('Error: --limit must be a positive number');\n process.exit(1);\n }\n filters.limit = limit;\n }\n\n // Resolve broadcast name\n const broadcastName = resolveBroadcastName(config, undefined);\n\n // Connect to relay\n const relayClient = new RelayClient({\n relayUrl,\n publicKey: config.identity.publicKey,\n privateKey: config.identity.privateKey,\n name: broadcastName,\n });\n\n try {\n // Connect\n await relayClient.connect();\n\n // Create discovery service\n const discoveryService = new PeerDiscoveryService({\n publicKey: config.identity.publicKey,\n privateKey: config.identity.privateKey,\n relayClient,\n relayPublicKey,\n });\n\n // Discover peers\n const peerList = await discoveryService.discoverViaRelay(Object.keys(filters).length > 0 ? filters : undefined);\n\n if (!peerList) {\n output({\n status: 'no_response',\n message: 'No response from relay',\n }, options.pretty || false);\n process.exit(1);\n }\n\n // Save to config if requested\n if (options.save) {\n let savedCount = 0;\n for (const peer of peerList.peers) {\n // Only save if not already in config\n const existing = Object.values(config.peers).find(p => p.publicKey === peer.publicKey);\n if (!existing) {\n config.peers[peer.publicKey] = {\n publicKey: peer.publicKey,\n name: peer.metadata?.name,\n };\n savedCount++;\n }\n }\n if (savedCount > 0) {\n savePeerConfig(configPath, config);\n }\n\n output({\n status: 'discovered',\n totalPeers: peerList.totalPeers,\n peersReturned: peerList.peers.length,\n peersSaved: savedCount,\n relayPublicKey: peerList.relayPublicKey,\n peers: peerList.peers.map(p => ({\n publicKey: p.publicKey,\n name: p.metadata?.name,\n version: p.metadata?.version,\n lastSeen: p.lastSeen,\n })),\n }, options.pretty || false);\n } else {\n output({\n status: 'discovered',\n totalPeers: peerList.totalPeers,\n peersReturned: peerList.peers.length,\n relayPublicKey: peerList.relayPublicKey,\n peers: peerList.peers.map(p => ({\n publicKey: p.publicKey,\n name: p.metadata?.name,\n version: p.metadata?.version,\n lastSeen: p.lastSeen,\n })),\n }, options.pretty || false);\n }\n } catch (e) {\n console.error('Error discovering peers:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n } finally {\n relayClient.disconnect();\n }\n}\n\n/**\n * Handle the `agora send` command.\n */\nasync function handleSend(args: string[], options: CliOptions & { type?: string; payload?: string; direct?: boolean; 'relay-only'?: boolean }): Promise<void> {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora send <name> <message> OR agora send <name> --type <type> --payload <json>');\n process.exit(1);\n }\n\n const peerRef = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n const resolved = resolvePeerEntry(config.peers, peerRef);\n if (!resolved) {\n console.error(`Error: Peer '${peerRef}' not found.`);\n process.exit(1);\n }\n\n const peer = resolved.peer;\n\n let messageType: MessageType;\n let messagePayload: unknown;\n\n if (options.type && options.payload) {\n // Typed message - validate it's a valid MessageType\n const validTypes: MessageType[] = ['announce', 'discover', 'request', 'response', 'publish', 'subscribe', 'verify', 'ack', 'error'];\n if (!validTypes.includes(options.type as MessageType)) {\n console.error(`Error: Invalid message type '${options.type}'. Valid types: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n messageType = options.type as MessageType;\n try {\n messagePayload = JSON.parse(options.payload);\n } catch {\n console.error('Error: Invalid JSON payload.');\n process.exit(1);\n }\n } else {\n // Text message - use 'publish' type with text payload\n if (args.length < 2) {\n console.error('Error: Missing message text. Usage: agora send <name> <message>');\n process.exit(1);\n }\n messageType = 'publish';\n messagePayload = { text: args.slice(1).join(' ') };\n }\n\n const isDirect = options.direct === true;\n const isRelayOnly = options['relay-only'] === true;\n\n // Validate flag combination\n if (isDirect && isRelayOnly) {\n console.error('Error: --direct and --relay-only are mutually exclusive.');\n process.exit(1);\n }\n\n // --direct requires the peer to have a URL\n if (isDirect && !peer.url) {\n console.error(`Error: --direct requested but peer '${peerRef}' has no URL configured.`);\n process.exit(1);\n }\n\n // Whether to attempt HTTP transport for this send\n const shouldTryHttp = peer.url && !isRelayOnly;\n const hasRelay = config.relay;\n\n // Send the message\n try {\n if (shouldTryHttp) {\n // Use HTTP transport\n const transportConfig = {\n identity: config.identity,\n peers: new Map<string, PeerConfig>([[peer.publicKey, {\n url: peer.url!,\n token: peer.token,\n publicKey: peer.publicKey,\n }]]),\n };\n\n const result = await sendToPeer(\n transportConfig,\n peer.publicKey,\n messageType,\n messagePayload\n );\n\n if (result.ok) {\n output({ \n status: 'sent',\n peer: peerRef,\n type: messageType,\n transport: 'http',\n httpStatus: result.status\n }, options.pretty || false);\n return;\n }\n\n // HTTP failed\n if (isDirect) {\n // --direct: do not fall back to relay\n output({ \n status: 'failed',\n peer: peerRef,\n type: messageType,\n transport: 'http',\n httpStatus: result.status,\n error: result.error\n }, options.pretty || false);\n process.exit(1);\n }\n\n // Fall through to relay if available\n if (!hasRelay || !config.relay) {\n output({ \n status: 'failed',\n peer: peerRef,\n type: messageType,\n transport: 'http',\n httpStatus: result.status,\n error: result.error\n }, options.pretty || false);\n process.exit(1);\n }\n }\n\n // Use relay transport (relay-only mode, or HTTP failed with relay available, or no URL)\n if (hasRelay && config.relay) {\n // Extract URL from relay (string or object)\n const relayUrl = typeof config.relay === 'string' ? config.relay : config.relay.url;\n const relayConfig = {\n identity: config.identity,\n relayUrl,\n };\n\n const result = await sendViaRelay(\n relayConfig,\n peer.publicKey,\n messageType,\n messagePayload\n );\n\n if (result.ok) {\n output({ \n status: 'sent',\n peer: peerRef,\n type: messageType,\n transport: 'relay'\n }, options.pretty || false);\n } else {\n output({ \n status: 'failed',\n peer: peerRef,\n type: messageType,\n transport: 'relay',\n error: result.error\n }, options.pretty || false);\n process.exit(1);\n }\n } else if (!shouldTryHttp) {\n // Neither HTTP nor relay available\n console.error(`Error: Peer '${peerRef}' unreachable. No HTTP endpoint and no relay configured.`);\n process.exit(1);\n }\n } catch (e) {\n console.error('Error sending message:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\n/**\n * Handle the `agora decode` command.\n */\nfunction handleDecode(args: string[], options: CliOptions): void {\n if (args.length < 1) {\n console.error('Error: Missing message. Usage: agora decode <message>');\n process.exit(1);\n }\n\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peers = new Map<string, PeerConfig>();\n for (const [, val] of Object.entries(config.peers)) {\n // Only add peers with HTTP config to the map for decoding\n if (val.url && val.token) {\n peers.set(val.publicKey, {\n url: val.url,\n token: val.token,\n publicKey: val.publicKey,\n });\n }\n }\n\n const message = args.join(' ');\n const result = decodeInboundEnvelope(message, peers);\n\n if (result.ok) {\n output({\n status: 'verified',\n sender: result.envelope.sender,\n type: result.envelope.type,\n payload: result.envelope.payload,\n id: result.envelope.id,\n timestamp: result.envelope.timestamp,\n inReplyTo: result.envelope.inReplyTo || null,\n }, options.pretty || false);\n } else {\n output({\n status: 'failed',\n reason: result.reason,\n }, options.pretty || false);\n process.exit(1);\n }\n}\n\n/**\n * Handle the `agora status` command.\n */\nfunction handleStatus(options: CliOptions): void {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peerCount = Object.keys(config.peers).length;\n\n output({\n identity: config.identity.publicKey,\n configPath,\n relay: config.relay || 'not configured',\n peerCount,\n peers: Object.keys(config.peers),\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora announce` command.\n * Broadcasts an announce message to all configured peers.\n */\nasync function handleAnnounce(options: CliOptions & { name?: string; version?: string }): Promise<void> {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const peerCount = Object.keys(config.peers).length;\n\n if (peerCount === 0) {\n console.error('Error: No peers configured. Use `agora peers add` to add peers first.');\n process.exit(1);\n }\n\n // Create announce payload\n const announcePayload: AnnouncePayload = {\n capabilities: [],\n metadata: {\n name: options.name || 'agora-node',\n version: options.version || '0.1.0',\n },\n };\n\n // Send announce to all peers\n const results: Array<{ peer: string; status: string; transport?: string; httpStatus?: number; error?: string }> = [];\n\n for (const [, peer] of Object.entries(config.peers)) {\n const peerLabel = peer.name || peer.publicKey;\n const hasHttpTransport = peer.url && peer.token;\n const hasRelay = config.relay;\n\n try {\n if (hasHttpTransport) {\n // Use HTTP transport\n const peers = new Map<string, PeerConfig>();\n peers.set(peer.publicKey, {\n url: peer.url!,\n token: peer.token!,\n publicKey: peer.publicKey,\n });\n\n const transportConfig = {\n identity: config.identity,\n peers,\n };\n\n const result = await sendToPeer(\n transportConfig,\n peer.publicKey,\n 'announce',\n announcePayload\n );\n\n if (result.ok) {\n results.push({\n peer: peerLabel,\n status: 'sent',\n transport: 'http',\n httpStatus: result.status,\n });\n } else {\n results.push({\n peer: peerLabel,\n status: 'failed',\n transport: 'http',\n httpStatus: result.status,\n error: result.error,\n });\n }\n } else if (hasRelay && config.relay) {\n // Use relay transport\n // Extract URL from relay (string or object)\n const relayUrl = typeof config.relay === 'string' ? config.relay : config.relay.url;\n const relayConfig = {\n identity: config.identity,\n relayUrl,\n };\n\n const result = await sendViaRelay(\n relayConfig,\n peer.publicKey,\n 'announce',\n announcePayload\n );\n\n if (result.ok) {\n results.push({\n peer: peerLabel,\n status: 'sent',\n transport: 'relay',\n });\n } else {\n results.push({\n peer: peerLabel,\n status: 'failed',\n transport: 'relay',\n error: result.error,\n });\n }\n } else {\n results.push({\n peer: peerLabel,\n status: 'unreachable',\n error: 'No HTTP endpoint and no relay configured',\n });\n }\n } catch (e) {\n results.push({\n peer: peerLabel,\n status: 'error',\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n\n output({ results }, options.pretty || false);\n}\n\n/**\n * Handle the `agora diagnose` command.\n * Run diagnostic checks on a peer (ping, workspace, tools).\n */\nasync function handleDiagnose(args: string[], options: CliOptions & { checks?: string }): Promise<void> {\n if (args.length < 1) {\n console.error('Error: Missing peer name. Usage: agora diagnose <name> [--checks <comma-separated-list>]');\n process.exit(1);\n }\n\n const peerRef = args[0];\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n const resolved = resolvePeerEntry(config.peers, peerRef);\n if (!resolved) {\n console.error(`Error: Peer '${peerRef}' not found.`);\n process.exit(1);\n }\n\n const peer = resolved.peer;\n\n if (!peer.url) {\n console.error(`Error: Peer '${peerRef}' has no URL configured. Cannot diagnose.`);\n process.exit(1);\n }\n\n // Parse checks parameter\n const checksParam = options.checks || 'ping';\n const requestedChecks = checksParam.split(',').map(c => c.trim());\n \n // Validate check types\n const validChecks = ['ping', 'workspace', 'tools'];\n for (const check of requestedChecks) {\n if (!validChecks.includes(check)) {\n console.error(`Error: Invalid check type '${check}'. Valid checks: ${validChecks.join(', ')}`);\n process.exit(1);\n }\n }\n\n // Result structure\n interface CheckResult {\n ok: boolean;\n latency_ms?: number;\n error?: string;\n implemented?: boolean;\n [key: string]: unknown;\n }\n \n const result: {\n peer: string;\n status: string;\n checks: Record<string, CheckResult>;\n timestamp: string;\n } = {\n peer: peerRef,\n status: 'unknown',\n checks: {},\n timestamp: new Date().toISOString(),\n };\n\n // Run ping check\n if (requestedChecks.includes('ping')) {\n const startTime = Date.now();\n try {\n // Add timeout to prevent hanging on unreachable peers\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10000);\n \n const response = await fetch(peer.url, {\n method: 'GET',\n headers: peer.token ? { 'Authorization': `Bearer ${peer.token}` } : {},\n signal: controller.signal,\n });\n \n clearTimeout(timeout);\n const latency = Date.now() - startTime;\n \n if (response.ok || response.status === 404 || response.status === 405) {\n // 404 or 405 means the endpoint exists but GET isn't supported - that's OK for a ping\n result.checks.ping = { ok: true, latency_ms: latency };\n } else {\n result.checks.ping = { ok: false, latency_ms: latency, error: `HTTP ${response.status}` };\n }\n } catch (err) {\n const latency = Date.now() - startTime;\n result.checks.ping = { \n ok: false, \n latency_ms: latency,\n error: err instanceof Error ? err.message : String(err) \n };\n }\n }\n\n // Run workspace check\n if (requestedChecks.includes('workspace')) {\n // This is a placeholder - actual implementation would depend on peer's diagnostic protocol\n result.checks.workspace = { \n ok: false,\n implemented: false,\n error: 'Workspace check requires peer diagnostic protocol support' \n };\n }\n\n // Run tools check\n if (requestedChecks.includes('tools')) {\n // This is a placeholder - actual implementation would depend on peer's diagnostic protocol\n result.checks.tools = { \n ok: false,\n implemented: false,\n error: 'Tools check requires peer diagnostic protocol support' \n };\n }\n\n // Determine overall status - only consider implemented checks\n const implementedChecks = Object.values(result.checks).filter(\n check => check.implemented !== false\n );\n \n if (implementedChecks.length === 0) {\n result.status = 'unknown';\n } else {\n const allOk = implementedChecks.every(check => check.ok);\n const anyOk = implementedChecks.some(check => check.ok);\n result.status = allOk ? 'healthy' : anyOk ? 'degraded' : 'unhealthy';\n }\n\n output(result, options.pretty || false);\n}\n\n/**\n * Handle the `agora serve` command.\n * Starts a persistent WebSocket server for incoming peer connections.\n */\nasync function handleServe(options: CliOptions & { port?: string; name?: string }): Promise<void> {\n const configPath = getConfigPath(options);\n\n if (!existsSync(configPath)) {\n console.error('Error: Config file not found. Run `agora init` first.');\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const port = parseInt(options.port || '9473', 10);\n \n // Validate port\n if (isNaN(port) || port < 1 || port > 65535) {\n console.error(`Error: Invalid port number '${options.port}'. Port must be between 1 and 65535.`);\n process.exit(1);\n }\n \n // Resolve server name using priority: CLI --name, config.relay.name, config.identity.name, default\n const serverName = resolveBroadcastName(config, options.name) || 'agora-server';\n\n // Create announce payload\n const announcePayload: AnnouncePayload = {\n capabilities: [],\n metadata: {\n name: serverName,\n version: '0.1.0',\n },\n };\n\n // Create and configure PeerServer\n const server = new PeerServer(config.identity, announcePayload);\n\n // Setup event listeners\n server.on('peer-connected', (publicKey, peer) => {\n const peerName = peer.metadata?.name || publicKey.substring(0, 16);\n console.log(`[${new Date().toISOString()}] Peer connected: ${peerName} (${publicKey})`);\n });\n\n server.on('peer-disconnected', (publicKey) => {\n console.log(`[${new Date().toISOString()}] Peer disconnected: ${publicKey}`);\n });\n\n server.on('message-received', (envelope, fromPublicKey) => {\n console.log(`[${new Date().toISOString()}] Message from ${fromPublicKey}:`);\n console.log(JSON.stringify({\n id: envelope.id,\n type: envelope.type,\n sender: envelope.sender,\n timestamp: envelope.timestamp,\n payload: envelope.payload,\n }, null, 2));\n });\n\n server.on('error', (error) => {\n console.error(`[${new Date().toISOString()}] Error:`, error.message);\n });\n\n // Start the server\n try {\n await server.start(port);\n console.log(`[${new Date().toISOString()}] Agora server started`);\n console.log(` Name: ${serverName}`);\n console.log(` Public Key: ${config.identity.publicKey}`);\n console.log(` WebSocket Port: ${port}`);\n console.log(` Listening for peer connections...`);\n console.log('');\n console.log('Press Ctrl+C to stop the server');\n\n // Keep the process alive\n process.on('SIGINT', async () => {\n console.log(`\\n[${new Date().toISOString()}] Shutting down server...`);\n await server.stop();\n console.log('Server stopped');\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n console.log(`\\n[${new Date().toISOString()}] Shutting down server...`);\n await server.stop();\n console.log('Server stopped');\n process.exit(0);\n });\n } catch (error) {\n console.error('Failed to start server:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Handle the `agora relay` command.\n * Starts a WebSocket relay server for routing messages between agents.\n */\nasync function handleRelay(options: CliOptions & { port?: string }): Promise<void> {\n const port = parseInt(options.port || '9474', 10);\n \n // Validate port\n if (isNaN(port) || port < 1 || port > 65535) {\n console.error(`Error: Invalid port number '${options.port}'. Port must be between 1 and 65535.`);\n process.exit(1);\n }\n\n // Create and configure RelayServer\n const server = new RelayServer();\n\n // Setup event listeners\n server.on('agent-registered', (publicKey) => {\n console.log(`[${new Date().toISOString()}] Agent registered: ${publicKey}`);\n });\n\n server.on('agent-disconnected', (publicKey) => {\n console.log(`[${new Date().toISOString()}] Agent disconnected: ${publicKey}`);\n });\n\n server.on('message-relayed', (from, to, envelope) => {\n console.log(`[${new Date().toISOString()}] Message relayed: ${from.substring(0, 16)}... → ${to.substring(0, 16)}... (type: ${envelope.type})`);\n });\n\n server.on('error', (error) => {\n console.error(`[${new Date().toISOString()}] Error:`, error.message);\n });\n\n // Start the server\n try {\n await server.start(port);\n console.log(`[${new Date().toISOString()}] Agora relay server started`);\n console.log(` WebSocket Port: ${port}`);\n console.log(` Connected agents: 0`);\n console.log(` Listening for agent connections...`);\n console.log('');\n console.log('Press Ctrl+C to stop the relay');\n\n // Shared shutdown handler\n const shutdown = async (): Promise<void> => {\n console.log(`\\n[${new Date().toISOString()}] Shutting down relay...`);\n await server.stop();\n console.log('Relay stopped');\n process.exit(0);\n };\n\n // Keep the process alive\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n } catch (error) {\n console.error('Failed to start relay:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Get the reputation store file path.\n */\nfunction getReputationStorePath(): string {\n return resolve(homedir(), '.local', 'share', 'agora', 'reputation.jsonl');\n}\n\n/**\n * Handle the `agora reputation verify` command.\n * Creates a verification record for another agent's output.\n */\nasync function handleReputationVerify(\n args: string[],\n options: CliOptions & {\n target?: string;\n domain?: string;\n verdict?: string;\n confidence?: string;\n evidence?: string;\n }\n): Promise<void> {\n if (!options.target || !options.domain || !options.verdict) {\n console.error('Error: Missing required options');\n console.error('Usage: agora reputation verify --target <id> --domain <domain> --verdict <correct|incorrect|disputed> --confidence <0-1> [--evidence <url>]');\n process.exit(1);\n }\n\n // Validate verdict\n if (!['correct', 'incorrect', 'disputed'].includes(options.verdict)) {\n console.error('Error: verdict must be one of: correct, incorrect, disputed');\n process.exit(1);\n }\n\n // Parse confidence\n const confidence = options.confidence ? parseFloat(options.confidence) : 1.0;\n if (isNaN(confidence) || confidence < 0 || confidence > 1) {\n console.error('Error: confidence must be a number between 0 and 1');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Create verification\n const verification = createVerification(\n config.identity.publicKey,\n config.identity.privateKey,\n options.target,\n options.domain,\n options.verdict as 'correct' | 'incorrect' | 'disputed',\n confidence,\n Date.now(),\n options.evidence\n );\n\n // Save to reputation store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n await store.addVerification(verification);\n\n output({\n status: 'verification_created',\n id: verification.id,\n verifier: verification.verifier,\n target: verification.target,\n domain: verification.domain,\n verdict: verification.verdict,\n confidence: verification.confidence,\n timestamp: verification.timestamp,\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora reputation commit` command.\n * Creates a commitment to a prediction before outcome is known.\n */\nasync function handleReputationCommit(\n args: string[],\n options: CliOptions & {\n domain?: string;\n prediction?: string;\n expiry?: string;\n }\n): Promise<void> {\n if (!options.domain || !options.prediction) {\n console.error('Error: Missing required options');\n console.error('Usage: agora reputation commit --domain <domain> --prediction <text> [--expiry <milliseconds>]');\n console.error('Example: agora reputation commit --domain weather_forecast --prediction \"It will rain tomorrow\" --expiry 86400000');\n process.exit(1);\n }\n\n // Parse expiry (default 24 hours)\n const expiryMs = options.expiry ? parseInt(options.expiry, 10) : 86400000;\n if (isNaN(expiryMs) || expiryMs <= 0) {\n console.error('Error: expiry must be a positive number (milliseconds)');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Create commit\n const commit = createCommit(\n config.identity.publicKey,\n config.identity.privateKey,\n options.domain,\n options.prediction,\n Date.now(),\n expiryMs\n );\n\n // Save to reputation store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n await store.addCommit(commit);\n\n output({\n status: 'commitment_created',\n id: commit.id,\n agent: commit.agent,\n domain: commit.domain,\n commitment: commit.commitment,\n timestamp: commit.timestamp,\n expiry: commit.expiry,\n note: 'Store this ID to reveal the prediction after expiry',\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora reputation reveal` command.\n * Reveals a prediction and outcome after commitment expiry.\n */\nasync function handleReputationReveal(\n args: string[],\n options: CliOptions & {\n 'commit-id'?: string;\n prediction?: string;\n outcome?: string;\n evidence?: string;\n }\n): Promise<void> {\n if (!options['commit-id'] || !options.prediction || !options.outcome) {\n console.error('Error: Missing required options');\n console.error('Usage: agora reputation reveal --commit-id <id> --prediction <text> --outcome <text> [--evidence <url>]');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n\n // Load commit from store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n const commit = await store.getCommit(options['commit-id']);\n\n if (!commit) {\n console.error(`Error: Commitment ${options['commit-id']} not found in local store`);\n process.exit(1);\n }\n\n // Create reveal\n const reveal = createReveal(\n config.identity.publicKey,\n config.identity.privateKey,\n options['commit-id'],\n options.prediction,\n options.outcome,\n Date.now(),\n options.evidence\n );\n \n // Verify the reveal against the commit\n const verification = verifyReveal(commit, reveal);\n if (!verification.valid) {\n console.error(`Error: Reveal verification failed: ${verification.reason}`);\n process.exit(1);\n }\n\n // Save to reputation store\n await store.addReveal(reveal);\n\n output({\n status: 'prediction_revealed',\n id: reveal.id,\n agent: reveal.agent,\n commitmentId: reveal.commitmentId,\n prediction: reveal.prediction,\n outcome: reveal.outcome,\n timestamp: reveal.timestamp,\n verified: true,\n }, options.pretty || false);\n}\n\n/**\n * Handle the `agora reputation query` command.\n * Queries reputation score for an agent in a domain.\n */\nasync function handleReputationQuery(\n args: string[],\n options: CliOptions & {\n agent?: string;\n domain?: string;\n }\n): Promise<void> {\n if (!options.domain) {\n console.error('Error: Missing required option: --domain');\n console.error('Usage: agora reputation query --domain <domain> [--agent <pubkey>]');\n console.error('If --agent is omitted, shows reputation for current agent');\n process.exit(1);\n }\n\n // Load config\n const configPath = getConfigPath(options);\n if (!existsSync(configPath)) {\n console.error(`Error: Config file not found at ${configPath}. Run 'agora init' first.`);\n process.exit(1);\n }\n\n const config = loadPeerConfig(configPath);\n const agent = options.agent || config.identity.publicKey;\n\n // Load reputation store\n const storePath = getReputationStorePath();\n const store = new ReputationStore(storePath);\n const verifications = await store.getVerificationsByDomain(options.domain);\n\n // Filter verifications for this agent\n const agentVerifications = verifications.filter(v => v.target === agent);\n\n // Compute trust score\n const score = computeTrustScore(agent, options.domain, agentVerifications, Date.now());\n\n output({\n agent: score.agent,\n domain: score.domain,\n score: score.score,\n verificationCount: score.verificationCount,\n lastVerified: score.lastVerified,\n lastVerifiedDate: score.lastVerified > 0 ? new Date(score.lastVerified).toISOString() : 'never',\n topVerifiers: score.topVerifiers,\n }, options.pretty || false);\n}\n\n/**\n * Parse CLI arguments and route to appropriate handler.\n */\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0) {\n console.error('Usage: agora <command> [options]');\n console.error('Commands: init, whoami, status, peers, announce, send, decode, serve, diagnose, relay, reputation');\n console.error(' peers subcommands: add, list, remove, discover');\n console.error(' reputation subcommands: verify, commit, reveal, query');\n process.exit(1);\n }\n\n // Parse global options\n const parsed = parseArgs({\n args,\n options: {\n config: { type: 'string' },\n pretty: { type: 'boolean' },\n url: { type: 'string' },\n token: { type: 'string' },\n pubkey: { type: 'string' },\n type: { type: 'string' },\n payload: { type: 'string' },\n name: { type: 'string' },\n version: { type: 'string' },\n port: { type: 'string' },\n checks: { type: 'string' },\n relay: { type: 'string' },\n 'relay-pubkey': { type: 'string' },\n limit: { type: 'string' },\n 'active-within': { type: 'string' },\n save: { type: 'boolean' },\n // Reputation options\n target: { type: 'string' },\n domain: { type: 'string' },\n verdict: { type: 'string' },\n confidence: { type: 'string' },\n evidence: { type: 'string' },\n prediction: { type: 'string' },\n expiry: { type: 'string' },\n 'commit-id': { type: 'string' },\n outcome: { type: 'string' },\n agent: { type: 'string' },\n direct: { type: 'boolean' },\n 'relay-only': { type: 'boolean' },\n },\n strict: false,\n allowPositionals: true,\n });\n\n const command = parsed.positionals[0];\n const subcommand = parsed.positionals[1];\n const remainingArgs = parsed.positionals.slice(2);\n\n const options: CliOptions & { \n type?: string; \n payload?: string; \n url?: string; \n token?: string; \n pubkey?: string; \n name?: string; \n version?: string; \n port?: string; \n checks?: string;\n relay?: string;\n 'relay-pubkey'?: string;\n limit?: string;\n 'active-within'?: string;\n save?: boolean;\n // Reputation options\n target?: string;\n domain?: string;\n verdict?: string;\n confidence?: string;\n evidence?: string;\n prediction?: string;\n outcome?: string;\n expiry?: string;\n 'commit-id'?: string;\n agent?: string;\n direct?: boolean;\n 'relay-only'?: boolean;\n } = {\n config: typeof parsed.values.config === 'string' ? parsed.values.config : undefined,\n pretty: typeof parsed.values.pretty === 'boolean' ? parsed.values.pretty : undefined,\n type: typeof parsed.values.type === 'string' ? parsed.values.type : undefined,\n payload: typeof parsed.values.payload === 'string' ? parsed.values.payload : undefined,\n url: typeof parsed.values.url === 'string' ? parsed.values.url : undefined,\n token: typeof parsed.values.token === 'string' ? parsed.values.token : undefined,\n pubkey: typeof parsed.values.pubkey === 'string' ? parsed.values.pubkey : undefined,\n name: typeof parsed.values.name === 'string' ? parsed.values.name : undefined,\n version: typeof parsed.values.version === 'string' ? parsed.values.version : undefined,\n port: typeof parsed.values.port === 'string' ? parsed.values.port : undefined,\n checks: typeof parsed.values.checks === 'string' ? parsed.values.checks : undefined,\n relay: typeof parsed.values.relay === 'string' ? parsed.values.relay : undefined,\n 'relay-pubkey': typeof parsed.values['relay-pubkey'] === 'string' ? parsed.values['relay-pubkey'] : undefined,\n limit: typeof parsed.values.limit === 'string' ? parsed.values.limit : undefined,\n 'active-within': typeof parsed.values['active-within'] === 'string' ? parsed.values['active-within'] : undefined,\n save: typeof parsed.values.save === 'boolean' ? parsed.values.save : undefined,\n // Reputation options\n target: typeof parsed.values.target === 'string' ? parsed.values.target : undefined,\n domain: typeof parsed.values.domain === 'string' ? parsed.values.domain : undefined,\n verdict: typeof parsed.values.verdict === 'string' ? parsed.values.verdict : undefined,\n confidence: typeof parsed.values.confidence === 'string' ? parsed.values.confidence : undefined,\n evidence: typeof parsed.values.evidence === 'string' ? parsed.values.evidence : undefined,\n prediction: typeof parsed.values.prediction === 'string' ? parsed.values.prediction : undefined,\n expiry: typeof parsed.values.expiry === 'string' ? parsed.values.expiry : undefined,\n 'commit-id': typeof parsed.values['commit-id'] === 'string' ? parsed.values['commit-id'] : undefined,\n outcome: typeof parsed.values.outcome === 'string' ? parsed.values.outcome : undefined,\n agent: typeof parsed.values.agent === 'string' ? parsed.values.agent : undefined,\n direct: typeof parsed.values.direct === 'boolean' ? parsed.values.direct : undefined,\n 'relay-only': typeof parsed.values['relay-only'] === 'boolean' ? parsed.values['relay-only'] : undefined,\n };\n\n try {\n switch (command) {\n case 'init':\n handleInit(options);\n break;\n case 'whoami':\n handleWhoami(options);\n break;\n case 'status':\n handleStatus(options);\n break;\n case 'announce':\n await handleAnnounce(options);\n break;\n case 'diagnose':\n await handleDiagnose([subcommand, ...remainingArgs].filter(Boolean), options);\n break;\n case 'peers':\n switch (subcommand) {\n case 'add':\n handlePeersAdd(remainingArgs, options);\n break;\n case 'list':\n case undefined:\n // Allow 'agora peers' to work like 'agora peers list'\n handlePeersList(options);\n break;\n case 'remove':\n handlePeersRemove(remainingArgs, options);\n break;\n case 'discover':\n await handlePeersDiscover(options);\n break;\n default:\n console.error('Error: Unknown peers subcommand. Use: add, list, remove, discover');\n process.exit(1);\n }\n break;\n case 'send':\n await handleSend([subcommand, ...remainingArgs], options);\n break;\n case 'decode':\n handleDecode([subcommand, ...remainingArgs].filter(Boolean), options);\n break;\n case 'serve':\n await handleServe(options);\n break;\n case 'relay':\n await handleRelay(options);\n break;\n case 'reputation':\n switch (subcommand) {\n case 'verify':\n await handleReputationVerify(remainingArgs, options);\n break;\n case 'commit':\n await handleReputationCommit(remainingArgs, options);\n break;\n case 'reveal':\n await handleReputationReveal(remainingArgs, options);\n break;\n case 'query':\n await handleReputationQuery(remainingArgs, options);\n break;\n default:\n console.error('Error: Unknown reputation subcommand. Use: verify, commit, reveal, query');\n process.exit(1);\n }\n break;\n default:\n console.error(`Error: Unknown command '${command}'. Use: init, whoami, status, peers, announce, send, decode, serve, diagnose, relay, reputation`);\n process.exit(1);\n }\n } catch (e) {\n console.error('Error:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nmain().catch((e) => {\n console.error('Fatal error:', e instanceof Error ? e.message : String(e));\n process.exit(1);\n});\n","import { EventEmitter } from 'node:events';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport type { KeyPair } from '../identity/keypair';\nimport type { Envelope } from '../message/envelope';\nimport { createEnvelope, verifyEnvelope } from '../message/envelope';\nimport type { AnnouncePayload } from '../registry/messages';\n\n/**\n * Represents a connected peer\n */\nexport interface ConnectedPeer {\n /** Peer's public key */\n publicKey: string;\n /** WebSocket connection */\n socket: WebSocket;\n /** Whether the peer has been announced */\n announced: boolean;\n /** Peer metadata from announce message */\n metadata?: {\n name?: string;\n version?: string;\n };\n}\n\n/**\n * Events emitted by PeerServer\n */\nexport interface PeerServerEvents {\n 'peer-connected': (publicKey: string, peer: ConnectedPeer) => void;\n 'peer-disconnected': (publicKey: string) => void;\n 'message-received': (envelope: Envelope, fromPublicKey: string) => void;\n 'error': (error: Error) => void;\n}\n\n/**\n * WebSocket server for accepting peer connections\n */\nexport class PeerServer extends EventEmitter {\n private wss: WebSocketServer | null = null;\n private peers = new Map<string, ConnectedPeer>();\n private identity: KeyPair;\n private announcePayload: AnnouncePayload;\n\n constructor(identity: KeyPair, announcePayload: AnnouncePayload) {\n super();\n this.identity = identity;\n this.announcePayload = announcePayload;\n }\n\n /**\n * Start the WebSocket server\n */\n start(port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.wss = new WebSocketServer({ port });\n\n this.wss.on('error', (error) => {\n this.emit('error', error);\n reject(error);\n });\n\n this.wss.on('listening', () => {\n resolve();\n });\n\n this.wss.on('connection', (socket: WebSocket) => {\n this.handleConnection(socket);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Stop the WebSocket server\n */\n async stop(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.wss) {\n resolve();\n return;\n }\n\n // Close all peer connections\n for (const peer of this.peers.values()) {\n peer.socket.close();\n }\n this.peers.clear();\n\n this.wss.close((err) => {\n if (err) {\n reject(err);\n } else {\n this.wss = null;\n resolve();\n }\n });\n });\n }\n\n /**\n * Get all connected peers\n */\n getPeers(): Map<string, ConnectedPeer> {\n return new Map(this.peers);\n }\n\n /**\n * Send a message to a specific peer\n */\n send(publicKey: string, envelope: Envelope): boolean {\n const peer = this.peers.get(publicKey);\n if (!peer || peer.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n try {\n peer.socket.send(JSON.stringify(envelope));\n return true;\n } catch (error) {\n this.emit('error', error as Error);\n return false;\n }\n }\n\n /**\n * Broadcast a message to all connected peers\n */\n broadcast(envelope: Envelope): void {\n for (const [publicKey, peer] of this.peers) {\n if (peer.socket.readyState === WebSocket.OPEN) {\n this.send(publicKey, envelope);\n }\n }\n }\n\n /**\n * Handle incoming connection\n */\n private handleConnection(socket: WebSocket): void {\n let peerPublicKey: string | null = null;\n\n // Send announce message immediately\n const announceEnvelope = createEnvelope(\n 'announce',\n this.identity.publicKey,\n this.identity.privateKey,\n this.announcePayload\n );\n socket.send(JSON.stringify(announceEnvelope));\n\n socket.on('message', (data: Buffer) => {\n try {\n const envelope = JSON.parse(data.toString()) as Envelope;\n\n // Verify envelope signature\n const verification = verifyEnvelope(envelope);\n if (!verification.valid) {\n // Drop invalid messages\n return;\n }\n\n // First message should be an announce\n if (!peerPublicKey) {\n if (envelope.type === 'announce') {\n peerPublicKey = envelope.sender;\n const payload = envelope.payload as AnnouncePayload;\n \n const peer: ConnectedPeer = {\n publicKey: peerPublicKey,\n socket,\n announced: true,\n metadata: payload.metadata,\n };\n\n this.peers.set(peerPublicKey, peer);\n this.emit('peer-connected', peerPublicKey, peer);\n }\n return;\n }\n\n // Verify the message is from the announced peer\n if (envelope.sender !== peerPublicKey) {\n // Drop messages from wrong sender\n return;\n }\n\n // Emit message-received event\n this.emit('message-received', envelope, peerPublicKey);\n } catch {\n // Invalid JSON or other parsing errors - drop the message\n }\n });\n\n socket.on('close', () => {\n if (peerPublicKey) {\n this.peers.delete(peerPublicKey);\n this.emit('peer-disconnected', peerPublicKey);\n }\n });\n\n socket.on('error', (error) => {\n this.emit('error', error);\n });\n }\n}\n"],"mappings":"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","names":["resolve","config"]}
package/dist/index.d.ts CHANGED
@@ -500,6 +500,8 @@ interface PeerConfig {
500
500
  token?: string;
501
501
  /** Peer's public key (hex) for verifying responses */
502
502
  publicKey: string;
503
+ /** Optional convenience alias only (not identity) */
504
+ name?: string;
503
505
  }
504
506
  interface TransportConfig {
505
507
  /** This agent's keypair */
@@ -960,6 +962,15 @@ declare const IGNORED_FILE_NAME = "IGNORED_PEERS.md";
960
962
  declare function getIgnoredPeersPath(storageDir?: string): string;
961
963
  declare function loadIgnoredPeers(filePath?: string): string[];
962
964
  declare function saveIgnoredPeers(peers: string[], filePath?: string): void;
965
+ declare class IgnoredPeersManager {
966
+ private readonly peers;
967
+ private readonly filePath;
968
+ constructor(filePath?: string);
969
+ ignorePeer(publicKey: string): boolean;
970
+ unignorePeer(publicKey: string): boolean;
971
+ listIgnoredPeers(): string[];
972
+ private persist;
973
+ }
963
974
 
964
975
  /**
965
976
  * jwt-auth.ts — JWT token creation and validation middleware.
@@ -1227,6 +1238,7 @@ declare class AgoraService {
1227
1238
  * @param relayClientFactory - Optional factory for relay client (for testing)
1228
1239
  */
1229
1240
  constructor(config: AgoraServiceConfig, onRelayMessage: RelayMessageHandlerWithName, logger?: Logger, relayClientFactory?: RelayClientFactory);
1241
+ private resolvePeer;
1230
1242
  /**
1231
1243
  * Send a signed message to a named peer.
1232
1244
  * Tries HTTP webhook first; falls back to relay if HTTP is unavailable.
@@ -1747,4 +1759,4 @@ declare function syncReputationFromPeer(agentPublicKey: string, domain: string,
1747
1759
  skipped: number;
1748
1760
  }>;
1749
1761
 
1750
- export { type AgoraConfig, type AgoraIdentity, type AgoraPeerConfig, AgoraService, type AgoraServiceConfig, type AnnouncePayload, type AuthenticatedRequest, type BootstrapConfig, type BufferedMessage, type Capability, type CapabilityAnnouncePayload, type CapabilityQueryPayload, type CapabilityResponsePayload, type CommitRecord, type CreateEnvelopeFn, DEFAULT_BOOTSTRAP_RELAYS, type DecodeInboundResult, type DiscoverPayload, type DiscoverResponsePayload, DiscoveryService, type Envelope, IGNORED_FILE_NAME, type JwtPayload, type KeyPair, type Logger, MessageBuffer, MessageStore, type MessageType, type PaperDiscoveryPayload, type Peer, type PeerConfig, type PeerConfigFile, type PeerDiscoveryConfig, type PeerDiscoveryEvents, PeerDiscoveryService, type PeerListRequestPayload, type PeerListResponsePayload, type PeerReferralPayload, PeerStore, RelayClient, type RelayClientConfig, type RelayClientEvents, type RelayClientFactory, type RelayClientLike, type RelayClientMessage, type RelayConfig, type RelayEnvelopeDedupOptions, type RelayInterface, type RelayMessageHandler, type RelayMessageHandlerWithName, type RelayPeer, type RelayRateLimitOptions, RelayServer, type RelayServerEvents, type RelayServerMessage, type RelayServerOptions, type ReplyToEnvelopeOptions, type ReputationQuery, type ReputationResponse, ReputationStore, type RestSession, type RevealRecord, type RevocationRecord, type RunRelayOptions, type SendMessageOptions, type SendMessageResult, type StoredMessage, type TransportConfig, type TrustScore, type TrustScoreOptions, type ValidationResult, type VerificationRecord, type VerifyEnvelopeFn, canonicalize, computeAllTrustScores, computeId, computeTrustScore, computeTrustScores, createCapability, createCommit, createEnvelope, createRestRouter, createReveal, createToken, createVerification, decay, decodeInboundEnvelope, exportKeyPair, formatDisplayName, generateKeyPair, getDefaultBootstrapRelay, getDefaultConfigPath, getIgnoredPeersPath, handleReputationQuery, hashPrediction, importKeyPair, initPeerConfig, loadAgoraConfig, loadAgoraConfigAsync, loadIgnoredPeers, loadPeerConfig, parseBootstrapRelay, requireAuth, resolveBroadcastName, revokeToken, runRelay, saveIgnoredPeers, savePeerConfig, sendToPeer, shortKey, signMessage, syncReputationFromPeer, validateCapability, validateCommitRecord, validatePeerListRequest, validatePeerListResponse, validatePeerReferral, validateRevealRecord, validateVerificationRecord, verifyEnvelope, verifyReveal, verifySignature, verifyVerificationSignature };
1762
+ export { type AgoraConfig, type AgoraIdentity, type AgoraPeerConfig, AgoraService, type AgoraServiceConfig, type AnnouncePayload, type AuthenticatedRequest, type BootstrapConfig, type BufferedMessage, type Capability, type CapabilityAnnouncePayload, type CapabilityQueryPayload, type CapabilityResponsePayload, type CommitRecord, type CreateEnvelopeFn, DEFAULT_BOOTSTRAP_RELAYS, type DecodeInboundResult, type DiscoverPayload, type DiscoverResponsePayload, DiscoveryService, type Envelope, IGNORED_FILE_NAME, IgnoredPeersManager, type JwtPayload, type KeyPair, type Logger, MessageBuffer, MessageStore, type MessageType, type PaperDiscoveryPayload, type Peer, type PeerConfig, type PeerConfigFile, type PeerDiscoveryConfig, type PeerDiscoveryEvents, PeerDiscoveryService, type PeerListRequestPayload, type PeerListResponsePayload, type PeerReferralPayload, PeerStore, RelayClient, type RelayClientConfig, type RelayClientEvents, type RelayClientFactory, type RelayClientLike, type RelayClientMessage, type RelayConfig, type RelayEnvelopeDedupOptions, type RelayInterface, type RelayMessageHandler, type RelayMessageHandlerWithName, type RelayPeer, type RelayRateLimitOptions, RelayServer, type RelayServerEvents, type RelayServerMessage, type RelayServerOptions, type ReplyToEnvelopeOptions, type ReputationQuery, type ReputationResponse, ReputationStore, type RestSession, type RevealRecord, type RevocationRecord, type RunRelayOptions, type SendMessageOptions, type SendMessageResult, type StoredMessage, type TransportConfig, type TrustScore, type TrustScoreOptions, type ValidationResult, type VerificationRecord, type VerifyEnvelopeFn, canonicalize, computeAllTrustScores, computeId, computeTrustScore, computeTrustScores, createCapability, createCommit, createEnvelope, createRestRouter, createReveal, createToken, createVerification, decay, decodeInboundEnvelope, exportKeyPair, formatDisplayName, generateKeyPair, getDefaultBootstrapRelay, getDefaultConfigPath, getIgnoredPeersPath, handleReputationQuery, hashPrediction, importKeyPair, initPeerConfig, loadAgoraConfig, loadAgoraConfigAsync, loadIgnoredPeers, loadPeerConfig, parseBootstrapRelay, requireAuth, resolveBroadcastName, revokeToken, runRelay, saveIgnoredPeers, savePeerConfig, sendToPeer, shortKey, signMessage, syncReputationFromPeer, validateCapability, validateCommitRecord, validatePeerListRequest, validatePeerListResponse, validatePeerReferral, validateRevealRecord, validateVerificationRecord, verifyEnvelope, verifyReveal, verifySignature, verifyVerificationSignature };
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  validateVerificationRecord,
28
28
  verifyReveal,
29
29
  verifyVerificationSignature
30
- } from "./chunk-NXPATMD4.js";
30
+ } from "./chunk-KKPV2I67.js";
31
31
  import {
32
32
  MessageBuffer,
33
33
  createRestRouter,
@@ -437,10 +437,10 @@ function parseConfig(config) {
437
437
  };
438
438
  const peers = {};
439
439
  if (config.peers && typeof config.peers === "object") {
440
- for (const [name, entry] of Object.entries(config.peers)) {
440
+ for (const entry of Object.values(config.peers)) {
441
441
  const peer = entry;
442
442
  if (peer && typeof peer.publicKey === "string") {
443
- peers[name] = {
443
+ peers[peer.publicKey] = {
444
444
  publicKey: peer.publicKey,
445
445
  url: typeof peer.url === "string" ? peer.url : void 0,
446
446
  token: typeof peer.token === "string" ? peer.token : void 0,
@@ -537,6 +537,40 @@ function saveIgnoredPeers(peers, filePath) {
537
537
  ].join("\n");
538
538
  writeFileSync(path, content, "utf-8");
539
539
  }
540
+ var IgnoredPeersManager = class {
541
+ peers;
542
+ filePath;
543
+ constructor(filePath) {
544
+ this.filePath = filePath ?? getIgnoredPeersPath();
545
+ this.peers = new Set(loadIgnoredPeers(this.filePath));
546
+ }
547
+ ignorePeer(publicKey) {
548
+ const normalized = publicKey.trim();
549
+ if (!normalized) {
550
+ return false;
551
+ }
552
+ const added = !this.peers.has(normalized);
553
+ this.peers.add(normalized);
554
+ if (added) {
555
+ this.persist();
556
+ }
557
+ return added;
558
+ }
559
+ unignorePeer(publicKey) {
560
+ const normalized = publicKey.trim();
561
+ const removed = this.peers.delete(normalized);
562
+ if (removed) {
563
+ this.persist();
564
+ }
565
+ return removed;
566
+ }
567
+ listIgnoredPeers() {
568
+ return Array.from(this.peers.values()).sort();
569
+ }
570
+ persist() {
571
+ saveIgnoredPeers(this.listIgnoredPeers(), this.filePath);
572
+ }
573
+ };
540
574
 
541
575
  // src/service.ts
542
576
  var AgoraService = class {
@@ -557,12 +591,24 @@ var AgoraService = class {
557
591
  this.logger = logger ?? null;
558
592
  this.relayClientFactory = relayClientFactory ?? null;
559
593
  }
594
+ resolvePeer(identifier) {
595
+ const direct = this.config.peers.get(identifier);
596
+ if (direct) {
597
+ return direct;
598
+ }
599
+ for (const peer of this.config.peers.values()) {
600
+ if (peer.publicKey === identifier || peer.name === identifier) {
601
+ return peer;
602
+ }
603
+ }
604
+ return void 0;
605
+ }
560
606
  /**
561
607
  * Send a signed message to a named peer.
562
608
  * Tries HTTP webhook first; falls back to relay if HTTP is unavailable.
563
609
  */
564
610
  async sendMessage(options) {
565
- const peer = this.config.peers.get(options.peerName);
611
+ const peer = this.resolvePeer(options.peerName);
566
612
  if (!peer) {
567
613
  return {
568
614
  ok: false,
@@ -678,7 +724,7 @@ var AgoraService = class {
678
724
  return Array.from(this.config.peers.keys());
679
725
  }
680
726
  getPeerConfig(name) {
681
- return this.config.peers.get(name);
727
+ return this.resolvePeer(name);
682
728
  }
683
729
  /**
684
730
  * Connect to the relay server.
@@ -735,11 +781,12 @@ var AgoraService = class {
735
781
  const configPath = path ?? getDefaultConfigPath();
736
782
  const loaded = await loadAgoraConfigAsync(configPath);
737
783
  const peers = /* @__PURE__ */ new Map();
738
- for (const [name, p] of Object.entries(loaded.peers)) {
739
- peers.set(name, {
784
+ for (const p of Object.values(loaded.peers)) {
785
+ peers.set(p.publicKey, {
740
786
  publicKey: p.publicKey,
741
787
  url: p.url,
742
- token: p.token
788
+ token: p.token,
789
+ name: p.name
743
790
  });
744
791
  }
745
792
  return {
@@ -821,6 +868,7 @@ export {
821
868
  DEFAULT_BOOTSTRAP_RELAYS,
822
869
  DiscoveryService,
823
870
  IGNORED_FILE_NAME,
871
+ IgnoredPeersManager,
824
872
  MessageBuffer,
825
873
  MessageStore,
826
874
  PeerDiscoveryService,