@skillkit/mesh 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/config/hosts-config.ts","../src/config/index.ts","../src/crypto/identity.ts","../src/peer/registry.ts","../src/peer/health.ts","../src/peer/index.ts","../src/crypto/encryption.ts","../src/crypto/signatures.ts","../src/crypto/storage.ts","../src/crypto/keystore.ts","../src/crypto/index.ts","../src/index.ts","../src/discovery/local.ts","../src/discovery/secure-local.ts","../src/security/config.ts","../src/discovery/tailscale.ts","../src/transport/http.ts","../src/transport/websocket.ts","../src/transport/secure-websocket.ts","../src/security/auth.ts","../src/security/tls.ts","../src/transport/secure-http.ts"],"sourcesContent":["export type HostStatus = 'online' | 'offline' | 'unknown';\n\nexport interface Host {\n id: string;\n name: string;\n address: string;\n port: number;\n tailscaleIP?: string;\n status: HostStatus;\n lastSeen: string;\n version?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Peer {\n hostId: string;\n agentId: string;\n agentName: string;\n aliases: string[];\n capabilities: string[];\n status: HostStatus;\n lastSeen: string;\n}\n\nexport interface PeerMesh {\n localHost: Host;\n peers: Map<string, Peer>;\n hosts: Map<string, Host>;\n}\n\nexport interface HostConfig {\n id: string;\n name: string;\n port: number;\n tailscaleIP?: string;\n autoStart?: boolean;\n discoveryEnabled?: boolean;\n discoveryPort?: number;\n}\n\nexport interface HostsFile {\n version: string;\n localHost: HostConfig;\n knownHosts: Host[];\n lastUpdated: string;\n}\n\nexport interface DiscoveryMessage {\n type: 'announce' | 'query' | 'response';\n hostId: string;\n hostName: string;\n address: string;\n port: number;\n tailscaleIP?: string;\n version: string;\n timestamp: string;\n}\n\nexport interface SignedDiscoveryMessage extends DiscoveryMessage {\n signature: string;\n publicKey: string;\n fingerprint: string;\n}\n\nexport interface HealthCheckResult {\n hostId: string;\n address: string;\n port: number;\n status: HostStatus;\n latencyMs: number;\n error?: string;\n checkedAt: string;\n}\n\nexport interface PeerRegistration {\n hostId: string;\n agentId: string;\n agentName: string;\n aliases: string[];\n capabilities: string[];\n}\n\nexport interface TransportMessage {\n id: string;\n type: string;\n from: string;\n to: string;\n payload: unknown;\n timestamp: string;\n}\n\nexport interface SecureTransportMessage extends TransportMessage {\n signature: string;\n senderFingerprint: string;\n senderPublicKey: string;\n nonce: string;\n encrypted?: boolean;\n}\n\nexport interface EncryptedTransportMessage {\n id: string;\n senderFingerprint: string;\n nonce: string;\n ciphertext: string;\n timestamp: string;\n}\n\nexport interface TransportOptions {\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n}\n\nexport interface SecureTransportOptions extends TransportOptions {\n requireEncryption?: boolean;\n requireAuth?: boolean;\n authToken?: string;\n}\n\nexport const DEFAULT_PORT = 9876;\nexport const DEFAULT_DISCOVERY_PORT = 9877;\nexport const HEALTH_CHECK_TIMEOUT = 5000;\nexport const DISCOVERY_INTERVAL = 30000;\nexport const MESH_VERSION = '1.7.11';\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir, hostname as osHostname } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { Host, HostConfig, HostsFile } from '../types.js';\nimport { DEFAULT_PORT, MESH_VERSION } from '../types.js';\n\nconst HOSTS_FILE_PATH = join(homedir(), '.skillkit', 'hosts.json');\n\nlet fileLock: Promise<void> | null = null;\n\nasync function withFileLock<T>(fn: () => Promise<T>): Promise<T> {\n while (fileLock) {\n await fileLock;\n }\n\n let resolve: () => void;\n fileLock = new Promise<void>(r => { resolve = r; });\n\n try {\n return await fn();\n } finally {\n fileLock = null;\n resolve!();\n }\n}\n\nexport async function getHostsFilePath(): Promise<string> {\n return HOSTS_FILE_PATH;\n}\n\nexport async function loadHostsFile(): Promise<HostsFile> {\n if (!existsSync(HOSTS_FILE_PATH)) {\n return createDefaultHostsFile();\n }\n\n try {\n const content = await readFile(HOSTS_FILE_PATH, 'utf-8');\n return JSON.parse(content) as HostsFile;\n } catch {\n return createDefaultHostsFile();\n }\n}\n\nexport async function saveHostsFile(hostsFile: HostsFile): Promise<void> {\n await mkdir(dirname(HOSTS_FILE_PATH), { recursive: true });\n hostsFile.lastUpdated = new Date().toISOString();\n await writeFile(HOSTS_FILE_PATH, JSON.stringify(hostsFile, null, 2), 'utf-8');\n}\n\nexport function createDefaultHostsFile(): HostsFile {\n return {\n version: MESH_VERSION,\n localHost: {\n id: randomUUID(),\n name: getDefaultHostName(),\n port: DEFAULT_PORT,\n autoStart: false,\n discoveryEnabled: true,\n },\n knownHosts: [],\n lastUpdated: new Date().toISOString(),\n };\n}\n\nfunction getDefaultHostName(): string {\n const hostname = osHostname();\n return hostname || `skillkit-host-${randomUUID().slice(0, 8)}`;\n}\n\nexport async function getLocalHostConfig(): Promise<HostConfig> {\n const hostsFile = await loadHostsFile();\n return hostsFile.localHost;\n}\n\nexport async function updateLocalHostConfig(updates: Partial<HostConfig>): Promise<HostConfig> {\n return withFileLock(async () => {\n const hostsFile = await loadHostsFile();\n hostsFile.localHost = { ...hostsFile.localHost, ...updates };\n await saveHostsFile(hostsFile);\n return hostsFile.localHost;\n });\n}\n\nexport async function addKnownHost(host: Host): Promise<void> {\n return withFileLock(async () => {\n const hostsFile = await loadHostsFile();\n\n const existingIndex = hostsFile.knownHosts.findIndex(h => h.id === host.id);\n if (existingIndex >= 0) {\n hostsFile.knownHosts[existingIndex] = host;\n } else {\n hostsFile.knownHosts.push(host);\n }\n\n await saveHostsFile(hostsFile);\n });\n}\n\nexport async function removeKnownHost(hostId: string): Promise<boolean> {\n return withFileLock(async () => {\n const hostsFile = await loadHostsFile();\n\n const initialLength = hostsFile.knownHosts.length;\n hostsFile.knownHosts = hostsFile.knownHosts.filter(h => h.id !== hostId);\n\n if (hostsFile.knownHosts.length < initialLength) {\n await saveHostsFile(hostsFile);\n return true;\n }\n\n return false;\n });\n}\n\nexport async function getKnownHosts(): Promise<Host[]> {\n const hostsFile = await loadHostsFile();\n return hostsFile.knownHosts;\n}\n\nexport async function getKnownHost(hostId: string): Promise<Host | undefined> {\n const hosts = await getKnownHosts();\n return hosts.find(h => h.id === hostId);\n}\n\nexport async function updateKnownHost(hostId: string, updates: Partial<Host>): Promise<Host | null> {\n const hostsFile = await loadHostsFile();\n\n const index = hostsFile.knownHosts.findIndex(h => h.id === hostId);\n if (index < 0) return null;\n\n hostsFile.knownHosts[index] = { ...hostsFile.knownHosts[index], ...updates };\n await saveHostsFile(hostsFile);\n\n return hostsFile.knownHosts[index];\n}\n\nexport async function initializeHostsFile(): Promise<HostsFile> {\n if (!existsSync(HOSTS_FILE_PATH)) {\n const hostsFile = createDefaultHostsFile();\n await saveHostsFile(hostsFile);\n return hostsFile;\n }\n return loadHostsFile();\n}\n","export {\n loadHostsFile,\n saveHostsFile,\n createDefaultHostsFile,\n getLocalHostConfig,\n updateLocalHostConfig,\n addKnownHost,\n removeKnownHost,\n getKnownHosts,\n getKnownHost,\n updateKnownHost,\n initializeHostsFile,\n getHostsFilePath,\n} from './hosts-config.js';\n","import * as ed25519 from '@noble/ed25519';\nimport { x25519 } from '@noble/curves/ed25519';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\nimport { randomBytes } from '@noble/ciphers/webcrypto';\n\nexport interface PeerKeypair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n fingerprint: string;\n}\n\nexport interface SerializedIdentity {\n publicKey: string;\n privateKey: string;\n fingerprint: string;\n}\n\nexport class PeerIdentity {\n private keypair: PeerKeypair;\n\n private constructor(keypair: PeerKeypair) {\n this.keypair = keypair;\n }\n\n static async generate(): Promise<PeerIdentity> {\n const privateKey = randomBytes(32);\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n const fingerprint = PeerIdentity.computeFingerprint(publicKey);\n\n return new PeerIdentity({\n publicKey,\n privateKey,\n fingerprint,\n });\n }\n\n static async fromPrivateKey(privateKey: Uint8Array): Promise<PeerIdentity> {\n if (privateKey.length !== 32) {\n throw new Error('Private key must be 32 bytes');\n }\n\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n const fingerprint = PeerIdentity.computeFingerprint(publicKey);\n\n return new PeerIdentity({\n publicKey,\n privateKey,\n fingerprint,\n });\n }\n\n static fromSerialized(data: SerializedIdentity): PeerIdentity {\n const publicKey = hexToBytes(data.publicKey);\n const privateKey = hexToBytes(data.privateKey);\n const fingerprint = data.fingerprint;\n\n const computed = PeerIdentity.computeFingerprint(publicKey);\n if (computed !== fingerprint) {\n throw new Error('Fingerprint mismatch - corrupted identity');\n }\n\n return new PeerIdentity({\n publicKey,\n privateKey,\n fingerprint,\n });\n }\n\n static computeFingerprint(publicKey: Uint8Array): string {\n const hash = sha256(publicKey);\n return bytesToHex(hash.slice(0, 8));\n }\n\n static async verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array\n ): Promise<boolean> {\n try {\n return await ed25519.verifyAsync(signature, message, publicKey);\n } catch {\n return false;\n }\n }\n\n static async verifyHex(\n signatureHex: string,\n messageHex: string,\n publicKeyHex: string\n ): Promise<boolean> {\n try {\n const signature = hexToBytes(signatureHex);\n const message = hexToBytes(messageHex);\n const publicKey = hexToBytes(publicKeyHex);\n return await PeerIdentity.verify(signature, message, publicKey);\n } catch {\n return false;\n }\n }\n\n async sign(message: Uint8Array): Promise<Uint8Array> {\n return await ed25519.signAsync(message, this.keypair.privateKey);\n }\n\n async signString(message: string): Promise<string> {\n const messageBytes = new TextEncoder().encode(message);\n const signature = await this.sign(messageBytes);\n return bytesToHex(signature);\n }\n\n async signObject(obj: object): Promise<string> {\n const message = JSON.stringify(obj);\n return await this.signString(message);\n }\n\n deriveSharedSecret(peerPublicKey: Uint8Array): Uint8Array {\n const x25519PrivateKey = this.keypair.privateKey;\n return x25519.scalarMult(x25519PrivateKey, peerPublicKey);\n }\n\n deriveSharedSecretHex(peerPublicKeyHex: string): Uint8Array {\n const peerPublicKey = hexToBytes(peerPublicKeyHex);\n return this.deriveSharedSecret(peerPublicKey);\n }\n\n serialize(): SerializedIdentity {\n return {\n publicKey: bytesToHex(this.keypair.publicKey),\n privateKey: bytesToHex(this.keypair.privateKey),\n fingerprint: this.keypair.fingerprint,\n };\n }\n\n get publicKey(): Uint8Array {\n return this.keypair.publicKey;\n }\n\n get publicKeyHex(): string {\n return bytesToHex(this.keypair.publicKey);\n }\n\n get privateKey(): Uint8Array {\n return this.keypair.privateKey;\n }\n\n get privateKeyHex(): string {\n return bytesToHex(this.keypair.privateKey);\n }\n\n get fingerprint(): string {\n return this.keypair.fingerprint;\n }\n\n toJSON(): { publicKey: string; fingerprint: string } {\n return {\n publicKey: this.publicKeyHex,\n fingerprint: this.fingerprint,\n };\n }\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Peer, PeerRegistration, Host } from '../types.js';\nimport { getKnownHosts, getLocalHostConfig } from '../config/hosts-config.js';\n\nconst PEERS_DIR = join(homedir(), '.skillkit', 'mesh', 'peers');\n\nexport interface PeerRegistry {\n peers: Map<string, Peer>;\n localPeers: Map<string, Peer>;\n}\n\nexport class PeerRegistryManager {\n private registry: PeerRegistry = {\n peers: new Map(),\n localPeers: new Map(),\n };\n\n async initialize(): Promise<void> {\n await mkdir(PEERS_DIR, { recursive: true });\n await this.loadLocalPeers();\n }\n\n async registerLocalPeer(registration: PeerRegistration): Promise<Peer> {\n const localConfig = await getLocalHostConfig();\n\n const peer: Peer = {\n hostId: localConfig.id,\n agentId: registration.agentId,\n agentName: registration.agentName,\n aliases: registration.aliases,\n capabilities: registration.capabilities,\n status: 'online',\n lastSeen: new Date().toISOString(),\n };\n\n this.registry.localPeers.set(peer.agentId, peer);\n await this.saveLocalPeers();\n\n return peer;\n }\n\n async unregisterLocalPeer(agentId: string): Promise<boolean> {\n const deleted = this.registry.localPeers.delete(agentId);\n if (deleted) {\n await this.saveLocalPeers();\n }\n return deleted;\n }\n\n registerRemotePeer(peer: Peer): void {\n const key = `${peer.hostId}:${peer.agentId}`;\n this.registry.peers.set(key, peer);\n }\n\n unregisterRemotePeer(hostId: string, agentId: string): boolean {\n const key = `${hostId}:${agentId}`;\n return this.registry.peers.delete(key);\n }\n\n getPeer(hostId: string, agentId: string): Peer | undefined {\n const key = `${hostId}:${agentId}`;\n return this.registry.peers.get(key);\n }\n\n getLocalPeer(agentId: string): Peer | undefined {\n return this.registry.localPeers.get(agentId);\n }\n\n getAllPeers(): Peer[] {\n return [\n ...Array.from(this.registry.localPeers.values()),\n ...Array.from(this.registry.peers.values()),\n ];\n }\n\n getLocalPeers(): Peer[] {\n return Array.from(this.registry.localPeers.values());\n }\n\n getRemotePeers(): Peer[] {\n return Array.from(this.registry.peers.values());\n }\n\n getPeersByHost(hostId: string): Peer[] {\n return this.getAllPeers().filter(p => p.hostId === hostId);\n }\n\n findPeerByName(name: string): Peer | undefined {\n const lowerName = name.toLowerCase();\n\n for (const peer of this.getAllPeers()) {\n if (peer.agentName.toLowerCase() === lowerName) {\n return peer;\n }\n if (peer.aliases.some(a => a.toLowerCase() === lowerName)) {\n return peer;\n }\n }\n\n return undefined;\n }\n\n findPeersByCapability(capability: string): Peer[] {\n return this.getAllPeers().filter(p => p.capabilities.includes(capability));\n }\n\n async resolvePeerAddress(nameOrId: string): Promise<{ host: Host; peer: Peer } | null> {\n const parts = nameOrId.split('@');\n const peerName = parts[0];\n const hostName = parts[1];\n\n if (hostName) {\n const hosts = await getKnownHosts();\n const host = hosts.find(\n h => h.name.toLowerCase() === hostName.toLowerCase() || h.id === hostName\n );\n\n if (!host) return null;\n\n const peer = this.getPeersByHost(host.id).find(\n p =>\n p.agentName.toLowerCase() === peerName.toLowerCase() ||\n p.agentId === peerName ||\n p.aliases.some(a => a.toLowerCase() === peerName.toLowerCase())\n );\n\n if (!peer) return null;\n\n return { host, peer };\n }\n\n const peer = this.findPeerByName(peerName);\n if (!peer) return null;\n\n const hosts = await getKnownHosts();\n const host = hosts.find(h => h.id === peer.hostId);\n\n if (!host) {\n const localConfig = await getLocalHostConfig();\n if (peer.hostId === localConfig.id) {\n return {\n host: {\n id: localConfig.id,\n name: localConfig.name,\n address: '127.0.0.1',\n port: localConfig.port,\n status: 'online',\n lastSeen: new Date().toISOString(),\n },\n peer,\n };\n }\n return null;\n }\n\n return { host, peer };\n }\n\n updatePeerStatus(hostId: string, agentId: string, status: Peer['status']): void {\n const key = `${hostId}:${agentId}`;\n const peer = this.registry.peers.get(key);\n if (peer) {\n peer.status = status;\n peer.lastSeen = new Date().toISOString();\n }\n }\n\n markHostOffline(hostId: string): void {\n for (const [, peer] of this.registry.peers) {\n if (peer.hostId === hostId) {\n peer.status = 'offline';\n }\n }\n }\n\n markHostOnline(hostId: string): void {\n for (const [, peer] of this.registry.peers) {\n if (peer.hostId === hostId) {\n peer.status = 'online';\n peer.lastSeen = new Date().toISOString();\n }\n }\n }\n\n clearRemotePeers(): void {\n this.registry.peers.clear();\n }\n\n private async loadLocalPeers(): Promise<void> {\n const filePath = join(PEERS_DIR, 'local-peers.json');\n\n if (!existsSync(filePath)) return;\n\n try {\n const content = await readFile(filePath, 'utf-8');\n const peers = JSON.parse(content) as Peer[];\n\n for (const peer of peers) {\n this.registry.localPeers.set(peer.agentId, peer);\n }\n } catch {\n }\n }\n\n private async saveLocalPeers(): Promise<void> {\n const filePath = join(PEERS_DIR, 'local-peers.json');\n const peers = Array.from(this.registry.localPeers.values());\n\n await mkdir(PEERS_DIR, { recursive: true });\n await writeFile(filePath, JSON.stringify(peers, null, 2), 'utf-8');\n }\n}\n\nlet globalRegistry: PeerRegistryManager | null = null;\n\nexport async function getPeerRegistry(): Promise<PeerRegistryManager> {\n if (!globalRegistry) {\n globalRegistry = new PeerRegistryManager();\n await globalRegistry.initialize();\n }\n return globalRegistry;\n}\n","import got from 'got';\nimport type { Host, HealthCheckResult, HostStatus } from '../types.js';\nimport { HEALTH_CHECK_TIMEOUT } from '../types.js';\nimport { getKnownHosts, updateKnownHost } from '../config/hosts-config.js';\n\nexport interface HealthCheckOptions {\n timeout?: number;\n updateStatus?: boolean;\n}\n\nexport async function checkHostHealth(\n host: Host,\n options: HealthCheckOptions = {}\n): Promise<HealthCheckResult> {\n const timeout = options.timeout ?? HEALTH_CHECK_TIMEOUT;\n const startTime = Date.now();\n\n const result: HealthCheckResult = {\n hostId: host.id,\n address: host.address,\n port: host.port,\n status: 'unknown',\n latencyMs: 0,\n checkedAt: new Date().toISOString(),\n };\n\n try {\n const url = `http://${host.address}:${host.port}/health`;\n\n const response = await got.get(url, {\n timeout: { request: timeout },\n retry: { limit: 0 },\n throwHttpErrors: false,\n });\n\n result.latencyMs = Date.now() - startTime;\n\n if (response.statusCode === 200) {\n result.status = 'online';\n } else {\n result.status = 'offline';\n result.error = `HTTP ${response.statusCode}`;\n }\n } catch (err: any) {\n result.latencyMs = Date.now() - startTime;\n result.status = 'offline';\n result.error = err.code || err.message || 'Connection failed';\n }\n\n if (options.updateStatus !== false) {\n await updateKnownHost(host.id, {\n status: result.status,\n lastSeen: result.status === 'online' ? result.checkedAt : host.lastSeen,\n });\n }\n\n return result;\n}\n\nexport async function checkAllHostsHealth(\n options: HealthCheckOptions = {}\n): Promise<HealthCheckResult[]> {\n const hosts = await getKnownHosts();\n\n const results = await Promise.all(hosts.map(host => checkHostHealth(host, options)));\n\n return results;\n}\n\nexport async function getOnlineHosts(): Promise<Host[]> {\n const hosts = await getKnownHosts();\n return hosts.filter(h => h.status === 'online');\n}\n\nexport async function getOfflineHosts(): Promise<Host[]> {\n const hosts = await getKnownHosts();\n return hosts.filter(h => h.status === 'offline');\n}\n\nexport async function waitForHost(\n host: Host,\n maxWaitMs = 30000,\n intervalMs = 1000\n): Promise<boolean> {\n const deadline = Date.now() + maxWaitMs;\n\n while (Date.now() < deadline) {\n const result = await checkHostHealth(host, { updateStatus: false });\n\n if (result.status === 'online') {\n await updateKnownHost(host.id, {\n status: 'online',\n lastSeen: new Date().toISOString(),\n });\n return true;\n }\n\n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n\n return false;\n}\n\nexport class HealthMonitor {\n private interval: NodeJS.Timeout | null = null;\n private running = false;\n private checking = false;\n private onStatusChange?: (host: Host, oldStatus: HostStatus, newStatus: HostStatus) => void;\n\n constructor(options: { onStatusChange?: (host: Host, oldStatus: HostStatus, newStatus: HostStatus) => void } = {}) {\n this.onStatusChange = options.onStatusChange;\n }\n\n async start(intervalMs = 30000): Promise<void> {\n if (this.running) return;\n\n this.running = true;\n\n await this.checkAll();\n\n this.interval = setInterval(() => {\n if (!this.checking) {\n this.checking = true;\n this.checkAll().finally(() => {\n this.checking = false;\n });\n }\n }, intervalMs);\n }\n\n stop(): void {\n if (!this.running) return;\n\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n\n this.running = false;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n private async checkAll(): Promise<void> {\n const hosts = await getKnownHosts();\n\n for (const host of hosts) {\n const oldStatus = host.status;\n const result = await checkHostHealth(host);\n\n if (this.onStatusChange && oldStatus !== result.status) {\n this.onStatusChange(host, oldStatus, result.status);\n }\n }\n }\n}\n","export {\n PeerRegistryManager,\n getPeerRegistry,\n type PeerRegistry,\n} from './registry.js';\n\nexport {\n checkHostHealth,\n checkAllHostsHealth,\n getOnlineHosts,\n getOfflineHosts,\n waitForHost,\n HealthMonitor,\n type HealthCheckOptions,\n} from './health.js';\n","import { xchacha20poly1305 } from '@noble/ciphers/chacha';\nimport { randomBytes } from '@noble/ciphers/webcrypto';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\nimport { hkdf } from '@noble/hashes/hkdf';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { x25519 } from '@noble/curves/ed25519';\n\nexport interface EncryptedMessage {\n nonce: string;\n ciphertext: string;\n}\n\nexport interface PublicKeyEncryptedMessage {\n ephemeralPublicKey: string;\n nonce: string;\n ciphertext: string;\n}\n\nexport class MessageEncryption {\n private key: Uint8Array;\n\n constructor(sharedSecret: Uint8Array) {\n this.key = hkdf(sha256, sharedSecret, undefined, 'skillkit-mesh-v1', 32);\n }\n\n encrypt(plaintext: string | Uint8Array): EncryptedMessage {\n const nonce = randomBytes(24);\n const data =\n typeof plaintext === 'string'\n ? new TextEncoder().encode(plaintext)\n : plaintext;\n\n const cipher = xchacha20poly1305(this.key, nonce);\n const ciphertext = cipher.encrypt(data);\n\n return {\n nonce: bytesToHex(nonce),\n ciphertext: bytesToHex(ciphertext),\n };\n }\n\n decrypt(encrypted: EncryptedMessage): Uint8Array {\n const nonce = hexToBytes(encrypted.nonce);\n const ciphertext = hexToBytes(encrypted.ciphertext);\n\n const cipher = xchacha20poly1305(this.key, nonce);\n return cipher.decrypt(ciphertext);\n }\n\n decryptToString(encrypted: EncryptedMessage): string {\n const plaintext = this.decrypt(encrypted);\n return new TextDecoder().decode(plaintext);\n }\n\n decryptToObject<T = unknown>(encrypted: EncryptedMessage): T {\n const plaintext = this.decryptToString(encrypted);\n return JSON.parse(plaintext) as T;\n }\n\n encryptObject(obj: unknown): EncryptedMessage {\n return this.encrypt(JSON.stringify(obj));\n }\n\n static fromSharedSecret(sharedSecret: Uint8Array): MessageEncryption {\n return new MessageEncryption(sharedSecret);\n }\n}\n\nexport class PublicKeyEncryption {\n static encrypt(\n message: Uint8Array,\n recipientPublicKey: Uint8Array\n ): PublicKeyEncryptedMessage {\n const ephemeralPrivateKey = randomBytes(32);\n const ephemeralPublicKey = x25519.scalarMultBase(ephemeralPrivateKey);\n const sharedSecret = x25519.scalarMult(ephemeralPrivateKey, recipientPublicKey);\n const key = hkdf(sha256, sharedSecret, undefined, 'skillkit-mesh-pk-v1', 32);\n const nonce = randomBytes(24);\n const cipher = xchacha20poly1305(key, nonce);\n const ciphertext = cipher.encrypt(message);\n\n return {\n ephemeralPublicKey: bytesToHex(ephemeralPublicKey),\n nonce: bytesToHex(nonce),\n ciphertext: bytesToHex(ciphertext),\n };\n }\n\n static encryptString(\n message: string,\n recipientPublicKey: Uint8Array\n ): PublicKeyEncryptedMessage {\n const messageBytes = new TextEncoder().encode(message);\n return PublicKeyEncryption.encrypt(messageBytes, recipientPublicKey);\n }\n\n static encryptStringHex(\n message: string,\n recipientPublicKeyHex: string\n ): PublicKeyEncryptedMessage {\n const recipientPublicKey = hexToBytes(recipientPublicKeyHex);\n return PublicKeyEncryption.encryptString(message, recipientPublicKey);\n }\n\n static decrypt(\n encrypted: PublicKeyEncryptedMessage,\n recipientPrivateKey: Uint8Array\n ): Uint8Array {\n const ephemeralPublicKey = hexToBytes(encrypted.ephemeralPublicKey);\n const nonce = hexToBytes(encrypted.nonce);\n const ciphertext = hexToBytes(encrypted.ciphertext);\n const sharedSecret = x25519.scalarMult(recipientPrivateKey, ephemeralPublicKey);\n const key = hkdf(sha256, sharedSecret, undefined, 'skillkit-mesh-pk-v1', 32);\n const cipher = xchacha20poly1305(key, nonce);\n\n return cipher.decrypt(ciphertext);\n }\n\n static decryptToString(\n encrypted: PublicKeyEncryptedMessage,\n recipientPrivateKey: Uint8Array\n ): string {\n const plaintext = PublicKeyEncryption.decrypt(encrypted, recipientPrivateKey);\n return new TextDecoder().decode(plaintext);\n }\n\n static decryptToObject<T = unknown>(\n encrypted: PublicKeyEncryptedMessage,\n recipientPrivateKey: Uint8Array\n ): T {\n const plaintext = PublicKeyEncryption.decryptToString(\n encrypted,\n recipientPrivateKey\n );\n return JSON.parse(plaintext) as T;\n }\n}\n\nexport function generateNonce(): string {\n return bytesToHex(randomBytes(24));\n}\n\nexport function generateMessageId(): string {\n return bytesToHex(randomBytes(16));\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { PeerIdentity } from './identity.js';\n\nexport interface SignedData<T> {\n data: T;\n signature: string;\n senderFingerprint: string;\n senderPublicKey: string;\n timestamp: string;\n nonce: string;\n}\n\nexport interface SignatureVerificationResult {\n valid: boolean;\n fingerprint?: string;\n error?: string;\n}\n\nfunction generateNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n}\n\nfunction canonicalize(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return 'null';\n }\n\n if (typeof obj !== 'object') {\n return JSON.stringify(obj);\n }\n\n if (Array.isArray(obj)) {\n return '[' + obj.map(canonicalize).join(',') + ']';\n }\n\n const keys = Object.keys(obj as Record<string, unknown>).sort();\n const pairs = keys.map((key) => {\n const value = (obj as Record<string, unknown>)[key];\n return JSON.stringify(key) + ':' + canonicalize(value);\n });\n\n return '{' + pairs.join(',') + '}';\n}\n\nfunction hashData(data: unknown): Uint8Array {\n const canonical = canonicalize(data);\n return sha256(new TextEncoder().encode(canonical));\n}\n\nexport async function signData<T>(\n data: T,\n identity: PeerIdentity\n): Promise<SignedData<T>> {\n const timestamp = new Date().toISOString();\n const nonce = generateNonce();\n\n const toSign = {\n data,\n timestamp,\n nonce,\n senderFingerprint: identity.fingerprint,\n };\n\n const hash = hashData(toSign);\n const signature = await identity.sign(hash);\n\n return {\n data,\n signature: bytesToHex(signature),\n senderFingerprint: identity.fingerprint,\n senderPublicKey: identity.publicKeyHex,\n timestamp,\n nonce,\n };\n}\n\nexport async function verifySignedData<T>(\n signed: SignedData<T>,\n trustedPublicKey?: Uint8Array\n): Promise<SignatureVerificationResult> {\n try {\n const publicKey = trustedPublicKey || hexToBytes(signed.senderPublicKey);\n\n const computedFingerprint = PeerIdentity.computeFingerprint(publicKey);\n if (computedFingerprint !== signed.senderFingerprint) {\n return {\n valid: false,\n error: 'Fingerprint mismatch',\n };\n }\n\n const toSign = {\n data: signed.data,\n timestamp: signed.timestamp,\n nonce: signed.nonce,\n senderFingerprint: signed.senderFingerprint,\n };\n\n const hash = hashData(toSign);\n const signature = hexToBytes(signed.signature);\n const valid = await PeerIdentity.verify(signature, hash, publicKey);\n\n if (!valid) {\n return {\n valid: false,\n error: 'Invalid signature',\n };\n }\n\n return {\n valid: true,\n fingerprint: signed.senderFingerprint,\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\nexport function isSignedDataExpired(\n signed: SignedData<unknown>,\n maxAgeMs: number = 5 * 60 * 1000\n): boolean {\n const timestamp = new Date(signed.timestamp).getTime();\n const now = Date.now();\n return now - timestamp > maxAgeMs;\n}\n\nexport function extractSignerFingerprint(\n signed: SignedData<unknown>\n): string | null {\n try {\n const publicKey = hexToBytes(signed.senderPublicKey);\n const computed = PeerIdentity.computeFingerprint(publicKey);\n if (computed === signed.senderFingerprint) {\n return signed.senderFingerprint;\n }\n return null;\n } catch {\n return null;\n }\n}\n","import {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n scrypt,\n createHash,\n type ScryptOptions,\n} from 'node:crypto';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { existsSync } from 'node:fs';\n\nexport interface EncryptedFile {\n version: '2.0';\n encrypted: true;\n algorithm: 'aes-256-gcm';\n kdf: 'scrypt';\n salt: string;\n iv: string;\n ciphertext: string;\n authTag: string;\n}\n\nexport interface EncryptionParams {\n salt: Uint8Array;\n iv: Uint8Array;\n authTag: Buffer;\n}\n\nconst SCRYPT_N = 2 ** 14;\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 12;\nconst SALT_LENGTH = 32;\n\nexport function deriveKey(\n passphrase: string,\n salt: Uint8Array\n): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const options: ScryptOptions = {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n };\n scrypt(passphrase, salt, KEY_LENGTH, options, (err, derivedKey) => {\n if (err) reject(err);\n else resolve(derivedKey);\n });\n });\n}\n\nexport function generateSalt(): Uint8Array {\n return randomBytes(SALT_LENGTH);\n}\n\nexport function generateIV(): Uint8Array {\n return randomBytes(IV_LENGTH);\n}\n\nexport function encrypt(\n data: Uint8Array,\n key: Buffer,\n iv: Uint8Array\n): { ciphertext: Buffer; authTag: Buffer } {\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const authTag = cipher.getAuthTag();\n return { ciphertext, authTag };\n}\n\nexport function decrypt(\n ciphertext: Buffer,\n key: Buffer,\n iv: Uint8Array,\n authTag: Buffer\n): Buffer {\n const decipher = createDecipheriv('aes-256-gcm', key, iv);\n decipher.setAuthTag(authTag);\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n}\n\nexport async function encryptData(\n data: Uint8Array | string,\n passphrase: string\n): Promise<EncryptedFile> {\n const dataBytes =\n typeof data === 'string' ? Buffer.from(data, 'utf-8') : data;\n const salt = generateSalt();\n const iv = generateIV();\n const key = await deriveKey(passphrase, salt);\n const { ciphertext, authTag } = encrypt(dataBytes, key, iv);\n\n return {\n version: '2.0',\n encrypted: true,\n algorithm: 'aes-256-gcm',\n kdf: 'scrypt',\n salt: Buffer.from(salt).toString('hex'),\n iv: Buffer.from(iv).toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n authTag: authTag.toString('hex'),\n };\n}\n\nexport async function decryptData(\n encrypted: EncryptedFile,\n passphrase: string\n): Promise<Buffer> {\n if (encrypted.version !== '2.0' || !encrypted.encrypted) {\n throw new Error('Invalid encrypted file format');\n }\n\n const salt = Buffer.from(encrypted.salt, 'hex');\n const iv = Buffer.from(encrypted.iv, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n const authTag = Buffer.from(encrypted.authTag, 'hex');\n const key = await deriveKey(passphrase, salt);\n\n return decrypt(ciphertext, key, iv, authTag);\n}\n\nexport async function encryptObject(\n obj: unknown,\n passphrase: string\n): Promise<EncryptedFile> {\n const json = JSON.stringify(obj);\n return encryptData(json, passphrase);\n}\n\nexport async function decryptObject<T = unknown>(\n encrypted: EncryptedFile,\n passphrase: string\n): Promise<T> {\n const decrypted = await decryptData(encrypted, passphrase);\n return JSON.parse(decrypted.toString('utf-8')) as T;\n}\n\nexport async function encryptFile(\n data: unknown,\n passphrase: string,\n outputPath: string\n): Promise<void> {\n const dir = dirname(outputPath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n const encrypted = await encryptObject(data, passphrase);\n await writeFile(outputPath, JSON.stringify(encrypted, null, 2));\n}\n\nexport async function decryptFile<T = unknown>(\n inputPath: string,\n passphrase: string\n): Promise<T> {\n const content = await readFile(inputPath, 'utf-8');\n const encrypted = JSON.parse(content) as EncryptedFile;\n return decryptObject<T>(encrypted, passphrase);\n}\n\nexport function isEncryptedFile(data: unknown): data is EncryptedFile {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n return (\n obj.version === '2.0' &&\n obj.encrypted === true &&\n obj.algorithm === 'aes-256-gcm' &&\n obj.kdf === 'scrypt' &&\n typeof obj.salt === 'string' &&\n typeof obj.iv === 'string' &&\n typeof obj.ciphertext === 'string' &&\n typeof obj.authTag === 'string'\n );\n}\n\nexport function hashPassphrase(passphrase: string): string {\n return createHash('sha256').update(passphrase).digest('hex').slice(0, 16);\n}\n\nexport function generateMachineKey(): string {\n const hostname = process.env.HOSTNAME || 'unknown';\n const user = process.env.USER || process.env.USERNAME || 'unknown';\n const combined = `skillkit-mesh-${hostname}-${user}`;\n return createHash('sha256').update(combined).digest('hex');\n}\n","import { readFile, writeFile, mkdir, access, unlink } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { existsSync } from 'node:fs';\nimport { PeerIdentity, type SerializedIdentity } from './identity.js';\nimport {\n encryptObject,\n decryptObject,\n isEncryptedFile,\n generateMachineKey,\n} from './storage.js';\n\nexport interface KeystoreConfig {\n path?: string;\n encryptionKey?: string;\n useMachineKey?: boolean;\n}\n\nexport interface TrustedPeer {\n fingerprint: string;\n publicKey: string;\n name?: string;\n addedAt: string;\n}\n\nexport interface KeystoreData {\n version: '1.0';\n trustedPeers: TrustedPeer[];\n revokedFingerprints: string[];\n}\n\nconst DEFAULT_KEYSTORE_PATH = join(homedir(), '.skillkit', 'mesh', 'identity');\n\nexport class SecureKeystore {\n private path: string;\n private passphrase: string;\n private identity: PeerIdentity | null = null;\n private keystoreData: KeystoreData | null = null;\n\n constructor(config: KeystoreConfig = {}) {\n this.path = config.path || DEFAULT_KEYSTORE_PATH;\n\n if (config.encryptionKey) {\n this.passphrase = config.encryptionKey;\n } else if (config.useMachineKey !== false) {\n this.passphrase = generateMachineKey();\n } else {\n throw new Error('Encryption key or machine key required');\n }\n }\n\n private get keypairPath(): string {\n return join(this.path, 'keypair.enc');\n }\n\n private get keystoreDataPath(): string {\n return join(this.path, 'keystore.json');\n }\n\n async ensureDirectory(): Promise<void> {\n if (!existsSync(this.path)) {\n await mkdir(this.path, { recursive: true, mode: 0o700 });\n }\n }\n\n async loadOrCreateIdentity(): Promise<PeerIdentity> {\n if (this.identity) {\n return this.identity;\n }\n\n await this.ensureDirectory();\n\n try {\n await access(this.keypairPath);\n const content = await readFile(this.keypairPath, 'utf-8');\n const encrypted = JSON.parse(content);\n\n if (isEncryptedFile(encrypted)) {\n const serialized = await decryptObject<SerializedIdentity>(\n encrypted,\n this.passphrase\n );\n this.identity = PeerIdentity.fromSerialized(serialized);\n } else {\n this.identity = PeerIdentity.fromSerialized(encrypted as SerializedIdentity);\n }\n } catch {\n this.identity = await PeerIdentity.generate();\n await this.saveIdentity();\n }\n\n return this.identity;\n }\n\n async saveIdentity(): Promise<void> {\n if (!this.identity) {\n throw new Error('No identity to save');\n }\n\n await this.ensureDirectory();\n const serialized = this.identity.serialize();\n const encrypted = await encryptObject(serialized, this.passphrase);\n await writeFile(this.keypairPath, JSON.stringify(encrypted, null, 2), {\n mode: 0o600,\n });\n }\n\n async getIdentity(): Promise<PeerIdentity | null> {\n return this.identity;\n }\n\n async hasIdentity(): Promise<boolean> {\n try {\n await access(this.keypairPath);\n return true;\n } catch {\n return false;\n }\n }\n\n async deleteIdentity(): Promise<void> {\n try {\n await unlink(this.keypairPath);\n this.identity = null;\n } catch {\n }\n }\n\n private async loadKeystoreData(): Promise<KeystoreData> {\n if (this.keystoreData) {\n return this.keystoreData;\n }\n\n try {\n await access(this.keystoreDataPath);\n const content = await readFile(this.keystoreDataPath, 'utf-8');\n this.keystoreData = JSON.parse(content) as KeystoreData;\n } catch {\n this.keystoreData = {\n version: '1.0',\n trustedPeers: [],\n revokedFingerprints: [],\n };\n }\n\n return this.keystoreData;\n }\n\n private async saveKeystoreData(): Promise<void> {\n if (!this.keystoreData) return;\n await this.ensureDirectory();\n await writeFile(\n this.keystoreDataPath,\n JSON.stringify(this.keystoreData, null, 2),\n { mode: 0o600 }\n );\n }\n\n async addTrustedPeer(\n fingerprint: string,\n publicKey: string,\n name?: string\n ): Promise<void> {\n const data = await this.loadKeystoreData();\n\n const existing = data.trustedPeers.findIndex(\n (p) => p.fingerprint === fingerprint\n );\n if (existing >= 0) {\n data.trustedPeers[existing] = {\n fingerprint,\n publicKey,\n name,\n addedAt: new Date().toISOString(),\n };\n } else {\n data.trustedPeers.push({\n fingerprint,\n publicKey,\n name,\n addedAt: new Date().toISOString(),\n });\n }\n\n const revokedIndex = data.revokedFingerprints.indexOf(fingerprint);\n if (revokedIndex >= 0) {\n data.revokedFingerprints.splice(revokedIndex, 1);\n }\n\n await this.saveKeystoreData();\n }\n\n async removeTrustedPeer(fingerprint: string): Promise<void> {\n const data = await this.loadKeystoreData();\n data.trustedPeers = data.trustedPeers.filter(\n (p) => p.fingerprint !== fingerprint\n );\n await this.saveKeystoreData();\n }\n\n async revokePeer(fingerprint: string): Promise<void> {\n const data = await this.loadKeystoreData();\n\n data.trustedPeers = data.trustedPeers.filter(\n (p) => p.fingerprint !== fingerprint\n );\n\n if (!data.revokedFingerprints.includes(fingerprint)) {\n data.revokedFingerprints.push(fingerprint);\n }\n\n await this.saveKeystoreData();\n }\n\n async isRevoked(fingerprint: string): Promise<boolean> {\n const data = await this.loadKeystoreData();\n return data.revokedFingerprints.includes(fingerprint);\n }\n\n async isTrusted(fingerprint: string): Promise<boolean> {\n const data = await this.loadKeystoreData();\n return data.trustedPeers.some((p) => p.fingerprint === fingerprint);\n }\n\n async getTrustedPeer(fingerprint: string): Promise<TrustedPeer | null> {\n const data = await this.loadKeystoreData();\n return data.trustedPeers.find((p) => p.fingerprint === fingerprint) || null;\n }\n\n async getTrustedPeers(): Promise<TrustedPeer[]> {\n const data = await this.loadKeystoreData();\n return [...data.trustedPeers];\n }\n\n async getRevokedFingerprints(): Promise<string[]> {\n const data = await this.loadKeystoreData();\n return [...data.revokedFingerprints];\n }\n\n async clearRevokedPeers(): Promise<void> {\n const data = await this.loadKeystoreData();\n data.revokedFingerprints = [];\n await this.saveKeystoreData();\n }\n\n async exportPublicInfo(): Promise<{ fingerprint: string; publicKey: string }> {\n const identity = await this.loadOrCreateIdentity();\n return {\n fingerprint: identity.fingerprint,\n publicKey: identity.publicKeyHex,\n };\n }\n}\n\nlet globalKeystore: SecureKeystore | null = null;\n\nexport function getKeystore(config?: KeystoreConfig): SecureKeystore {\n if (!globalKeystore) {\n globalKeystore = new SecureKeystore(config);\n }\n return globalKeystore;\n}\n\nexport function resetKeystore(): void {\n globalKeystore = null;\n}\n","export {\n PeerIdentity,\n type PeerKeypair,\n type SerializedIdentity,\n} from './identity.js';\n\nexport {\n MessageEncryption,\n PublicKeyEncryption,\n generateNonce,\n generateMessageId,\n type EncryptedMessage,\n type PublicKeyEncryptedMessage,\n} from './encryption.js';\n\nexport {\n signData,\n verifySignedData,\n isSignedDataExpired,\n extractSignerFingerprint,\n type SignedData,\n type SignatureVerificationResult,\n} from './signatures.js';\n\nexport {\n SecureKeystore,\n getKeystore,\n resetKeystore,\n type KeystoreConfig,\n type TrustedPeer,\n type KeystoreData,\n} from './keystore.js';\n\nexport {\n encryptData,\n decryptData,\n encryptObject,\n decryptObject,\n encryptFile,\n decryptFile,\n isEncryptedFile,\n deriveKey,\n generateSalt,\n generateIV,\n generateMachineKey,\n hashPassphrase,\n type EncryptedFile,\n} from './storage.js';\n","export * from './types.js';\n\nexport {\n loadHostsFile,\n saveHostsFile,\n createDefaultHostsFile,\n getLocalHostConfig,\n updateLocalHostConfig,\n addKnownHost,\n removeKnownHost,\n getKnownHosts,\n getKnownHost,\n updateKnownHost,\n initializeHostsFile,\n getHostsFilePath,\n} from './config/index.js';\n\nexport {\n LocalDiscovery,\n getLocalIPAddress,\n getAllLocalIPAddresses,\n discoverOnce,\n type LocalDiscoveryOptions,\n SecureLocalDiscovery,\n discoverOnceSecure,\n type SecureLocalDiscoveryOptions,\n getTailscaleStatus,\n isTailscaleAvailable,\n getTailscaleIP,\n discoverTailscaleHosts,\n resolveTailscaleName,\n type TailscaleStatus,\n type TailscalePeer,\n} from './discovery/index.js';\n\nexport {\n PeerRegistryManager,\n getPeerRegistry,\n type PeerRegistry,\n checkHostHealth,\n checkAllHostsHealth,\n getOnlineHosts,\n getOfflineHosts,\n waitForHost,\n HealthMonitor,\n type HealthCheckOptions,\n} from './peer/index.js';\n\nexport {\n HttpTransport,\n sendToHost,\n broadcastToHosts,\n type HttpTransportOptions,\n WebSocketTransport,\n WebSocketServer,\n type WebSocketTransportOptions,\n type MessageHandler,\n SecureWebSocketTransport,\n SecureWebSocketServer,\n type SecureWebSocketOptions,\n type SecureMessageHandler,\n SecureHttpTransport,\n sendToHostSecure,\n broadcastToHostsSecure,\n verifySecureMessage,\n type SecureHttpTransportOptions,\n} from './transport/index.js';\n\nexport {\n PeerIdentity,\n type PeerKeypair,\n type SerializedIdentity,\n MessageEncryption,\n PublicKeyEncryption,\n generateNonce,\n generateMessageId,\n type EncryptedMessage,\n type PublicKeyEncryptedMessage,\n signData,\n verifySignedData,\n isSignedDataExpired,\n extractSignerFingerprint,\n type SignedData,\n type SignatureVerificationResult,\n SecureKeystore,\n getKeystore,\n resetKeystore,\n type KeystoreConfig,\n type TrustedPeer,\n type KeystoreData,\n encryptData,\n decryptData,\n encryptObject,\n decryptObject,\n encryptFile,\n decryptFile,\n isEncryptedFile,\n deriveKey,\n generateSalt,\n generateIV,\n generateMachineKey,\n hashPassphrase,\n type EncryptedFile,\n} from './crypto/index.js';\n\nexport {\n type MeshSecurityConfig,\n type DiscoverySecurityConfig,\n type TransportSecurityConfig,\n type TrustConfig,\n type DiscoverySecurityMode,\n type TransportEncryption,\n type TLSMode,\n type SecurityPreset,\n DEFAULT_SECURITY_CONFIG,\n SECURITY_PRESETS,\n getSecurityPreset,\n mergeSecurityConfig,\n validateSecurityConfig,\n isSecurityEnabled,\n describeSecurityLevel,\n AuthManager,\n extractBearerToken,\n createBearerHeader,\n type AuthToken,\n type AuthChallengeRequest,\n type AuthChallengeResponse,\n type AuthResult,\n TLSManager,\n getTLSManager,\n resetTLSManager,\n type CertificateInfo,\n type TLSConfig,\n type TLSContextOptions,\n} from './security/index.js';\n\nexport async function initializeMesh(): Promise<void> {\n const { initializeHostsFile } = await import('./config/index.js');\n const { getPeerRegistry } = await import('./peer/index.js');\n\n await initializeHostsFile();\n await getPeerRegistry();\n}\n\nexport async function initializeSecureMesh(\n securityConfig?: import('./security/index.js').MeshSecurityConfig\n): Promise<{\n identity: import('./crypto/index.js').PeerIdentity;\n keystore: import('./crypto/index.js').SecureKeystore;\n}> {\n const { initializeHostsFile } = await import('./config/index.js');\n const { getPeerRegistry } = await import('./peer/index.js');\n const { SecureKeystore } = await import('./crypto/index.js');\n\n await initializeHostsFile();\n await getPeerRegistry();\n\n const keystore = new SecureKeystore({\n path: securityConfig?.identityPath,\n });\n\n const identity = await keystore.loadOrCreateIdentity();\n\n return { identity, keystore };\n}\n","import { createSocket, Socket } from 'node:dgram';\nimport { networkInterfaces } from 'node:os';\nimport type { DiscoveryMessage, Host } from '../types.js';\nimport { DEFAULT_DISCOVERY_PORT, MESH_VERSION } from '../types.js';\nimport { getLocalHostConfig, addKnownHost } from '../config/hosts-config.js';\n\nconst MULTICAST_ADDR = '239.255.255.250';\nconst DISCOVERY_INTERVAL_MS = 30000;\n\nexport interface LocalDiscoveryOptions {\n port?: number;\n interval?: number;\n onDiscover?: (host: Host) => void;\n}\n\nexport class LocalDiscovery {\n private socket: Socket | null = null;\n private announceInterval: NodeJS.Timeout | null = null;\n private running = false;\n private options: Required<LocalDiscoveryOptions>;\n private discoveredHosts: Map<string, Host> = new Map();\n\n constructor(options: LocalDiscoveryOptions = {}) {\n this.options = {\n port: options.port ?? DEFAULT_DISCOVERY_PORT,\n interval: options.interval ?? DISCOVERY_INTERVAL_MS,\n onDiscover: options.onDiscover ?? (() => {}),\n };\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n this.socket = createSocket({ type: 'udp4', reuseAddr: true });\n\n this.socket.on('message', (msg, rinfo) => {\n this.handleMessage(msg, rinfo);\n });\n\n this.socket.on('error', err => {\n console.error('Discovery socket error:', err);\n });\n\n await new Promise<void>((resolve, reject) => {\n this.socket!.bind(this.options.port, () => {\n try {\n this.socket!.addMembership(MULTICAST_ADDR);\n this.socket!.setBroadcast(true);\n this.socket!.setMulticastTTL(1);\n resolve();\n } catch (err) {\n this.socket?.close();\n this.socket = null;\n reject(err);\n }\n });\n });\n\n this.running = true;\n\n await this.announce();\n\n this.announceInterval = setInterval(() => {\n void this.announce().catch(err => {\n console.error('Discovery announce error:', err);\n });\n }, this.options.interval);\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n if (this.announceInterval) {\n clearInterval(this.announceInterval);\n this.announceInterval = null;\n }\n\n if (this.socket) {\n try {\n this.socket.dropMembership(MULTICAST_ADDR);\n } catch {\n }\n this.socket.close();\n this.socket = null;\n }\n\n this.running = false;\n }\n\n async announce(): Promise<void> {\n if (!this.socket || !this.running) return;\n\n const localConfig = await getLocalHostConfig();\n const localAddress = getLocalIPAddress();\n\n const message: DiscoveryMessage = {\n type: 'announce',\n hostId: localConfig.id,\n hostName: localConfig.name,\n address: localAddress,\n port: localConfig.port,\n tailscaleIP: localConfig.tailscaleIP,\n version: MESH_VERSION,\n timestamp: new Date().toISOString(),\n };\n\n const buffer = Buffer.from(JSON.stringify(message));\n\n this.socket.send(buffer, 0, buffer.length, this.options.port, MULTICAST_ADDR);\n }\n\n async query(): Promise<void> {\n if (!this.socket || !this.running) return;\n\n const localConfig = await getLocalHostConfig();\n const localAddress = getLocalIPAddress();\n\n const message: DiscoveryMessage = {\n type: 'query',\n hostId: localConfig.id,\n hostName: localConfig.name,\n address: localAddress,\n port: localConfig.port,\n version: MESH_VERSION,\n timestamp: new Date().toISOString(),\n };\n\n const buffer = Buffer.from(JSON.stringify(message));\n\n this.socket.send(buffer, 0, buffer.length, this.options.port, MULTICAST_ADDR);\n }\n\n getDiscoveredHosts(): Host[] {\n return Array.from(this.discoveredHosts.values());\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n private async handleMessage(msg: Buffer, rinfo: { address: string; port: number }): Promise<void> {\n try {\n const message = JSON.parse(msg.toString()) as Partial<DiscoveryMessage>;\n\n if (!message || (message.type !== 'announce' && message.type !== 'query' && message.type !== 'response')) return;\n if (!message.hostId || !message.hostName) return;\n const port = Number(message.port);\n if (!Number.isInteger(port) || port < 1 || port > 65535) return;\n\n const localConfig = await getLocalHostConfig();\n if (message.hostId === localConfig.id) return;\n\n const host: Host = {\n id: message.hostId,\n name: message.hostName,\n address: rinfo.address,\n port,\n tailscaleIP: message.tailscaleIP,\n status: 'online',\n lastSeen: new Date().toISOString(),\n version: message.version,\n };\n\n this.discoveredHosts.set(host.id, host);\n\n await addKnownHost(host);\n\n this.options.onDiscover(host);\n\n if (message.type === 'query') {\n await this.announce();\n }\n } catch {\n }\n }\n}\n\nexport function getLocalIPAddress(): string {\n const interfaces = networkInterfaces();\n\n for (const name of Object.keys(interfaces)) {\n const iface = interfaces[name];\n if (!iface) continue;\n\n for (const addr of iface) {\n if (addr.family === 'IPv4' && !addr.internal) {\n return addr.address;\n }\n }\n }\n\n return '127.0.0.1';\n}\n\nexport function getAllLocalIPAddresses(): string[] {\n const addresses: string[] = [];\n const interfaces = networkInterfaces();\n\n for (const name of Object.keys(interfaces)) {\n const iface = interfaces[name];\n if (!iface) continue;\n\n for (const addr of iface) {\n if (addr.family === 'IPv4' && !addr.internal) {\n addresses.push(addr.address);\n }\n }\n }\n\n return addresses;\n}\n\nexport async function discoverOnce(timeout = 5000): Promise<Host[]> {\n const discovery = new LocalDiscovery();\n await discovery.start();\n await discovery.query();\n\n await new Promise(resolve => setTimeout(resolve, timeout));\n\n const hosts = discovery.getDiscoveredHosts();\n await discovery.stop();\n\n return hosts;\n}\n","import { createSocket, Socket } from 'node:dgram';\nimport { networkInterfaces } from 'node:os';\nimport type { DiscoveryMessage, SignedDiscoveryMessage, Host } from '../types.js';\nimport { DEFAULT_DISCOVERY_PORT, MESH_VERSION } from '../types.js';\nimport { getLocalHostConfig, addKnownHost } from '../config/hosts-config.js';\nimport { PeerIdentity } from '../crypto/identity.js';\nimport { SecureKeystore } from '../crypto/keystore.js';\nimport {\n type MeshSecurityConfig,\n DEFAULT_SECURITY_CONFIG,\n type DiscoverySecurityMode,\n} from '../security/config.js';\nimport { hexToBytes } from '@noble/hashes/utils';\n\nconst MULTICAST_ADDR = '239.255.255.250';\nconst DISCOVERY_INTERVAL_MS = 30000;\n\nexport interface SecureLocalDiscoveryOptions {\n port?: number;\n interval?: number;\n onDiscover?: (host: Host, fingerprint?: string) => void;\n security?: MeshSecurityConfig;\n identity?: PeerIdentity;\n keystore?: SecureKeystore;\n}\n\nexport class SecureLocalDiscovery {\n private socket: Socket | null = null;\n private announceInterval: NodeJS.Timeout | null = null;\n private running = false;\n private options: Required<Omit<SecureLocalDiscoveryOptions, 'identity' | 'keystore'>>;\n private discoveredHosts: Map<string, Host> = new Map();\n private identity: PeerIdentity | null = null;\n private keystore: SecureKeystore | null = null;\n private securityMode: DiscoverySecurityMode;\n\n constructor(options: SecureLocalDiscoveryOptions = {}) {\n this.options = {\n port: options.port ?? DEFAULT_DISCOVERY_PORT,\n interval: options.interval ?? DISCOVERY_INTERVAL_MS,\n onDiscover: options.onDiscover ?? (() => {}),\n security: options.security ?? DEFAULT_SECURITY_CONFIG,\n };\n this.identity = options.identity ?? null;\n this.keystore = options.keystore ?? null;\n this.securityMode = this.options.security.discovery.mode;\n }\n\n async initialize(): Promise<void> {\n if (!this.identity && this.keystore) {\n this.identity = await this.keystore.loadOrCreateIdentity();\n }\n if (!this.identity && this.securityMode !== 'open') {\n this.identity = await PeerIdentity.generate();\n }\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n await this.initialize();\n\n this.socket = createSocket({ type: 'udp4', reuseAddr: true });\n\n this.socket.on('message', (msg, rinfo) => {\n this.handleMessage(msg, rinfo);\n });\n\n this.socket.on('error', (err) => {\n console.error('Discovery socket error:', err);\n });\n\n await new Promise<void>((resolve, reject) => {\n this.socket!.bind(this.options.port, () => {\n try {\n this.socket!.addMembership(MULTICAST_ADDR);\n this.socket!.setBroadcast(true);\n this.socket!.setMulticastTTL(128);\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n });\n\n this.running = true;\n\n await this.announce();\n\n this.announceInterval = setInterval(() => {\n this.announce();\n }, this.options.interval);\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n if (this.announceInterval) {\n clearInterval(this.announceInterval);\n this.announceInterval = null;\n }\n\n if (this.socket) {\n try {\n this.socket.dropMembership(MULTICAST_ADDR);\n } catch {\n }\n this.socket.close();\n this.socket = null;\n }\n\n this.running = false;\n }\n\n async announce(): Promise<void> {\n if (!this.socket || !this.running) return;\n\n const localConfig = await getLocalHostConfig();\n const localAddress = getLocalIPAddress();\n\n const baseMessage: DiscoveryMessage = {\n type: 'announce',\n hostId: localConfig.id,\n hostName: localConfig.name,\n address: localAddress,\n port: localConfig.port,\n tailscaleIP: localConfig.tailscaleIP,\n version: MESH_VERSION,\n timestamp: new Date().toISOString(),\n };\n\n let message: DiscoveryMessage | SignedDiscoveryMessage = baseMessage;\n\n if (this.identity && this.securityMode !== 'open') {\n const signature = await this.identity.signObject(baseMessage);\n message = {\n ...baseMessage,\n signature,\n publicKey: this.identity.publicKeyHex,\n fingerprint: this.identity.fingerprint,\n } as SignedDiscoveryMessage;\n }\n\n const buffer = Buffer.from(JSON.stringify(message));\n this.socket.send(buffer, 0, buffer.length, this.options.port, MULTICAST_ADDR);\n }\n\n async query(): Promise<void> {\n if (!this.socket || !this.running) return;\n\n const localConfig = await getLocalHostConfig();\n const localAddress = getLocalIPAddress();\n\n const baseMessage: DiscoveryMessage = {\n type: 'query',\n hostId: localConfig.id,\n hostName: localConfig.name,\n address: localAddress,\n port: localConfig.port,\n version: MESH_VERSION,\n timestamp: new Date().toISOString(),\n };\n\n let message: DiscoveryMessage | SignedDiscoveryMessage = baseMessage;\n\n if (this.identity && this.securityMode !== 'open') {\n const signature = await this.identity.signObject(baseMessage);\n message = {\n ...baseMessage,\n signature,\n publicKey: this.identity.publicKeyHex,\n fingerprint: this.identity.fingerprint,\n } as SignedDiscoveryMessage;\n }\n\n const buffer = Buffer.from(JSON.stringify(message));\n this.socket.send(buffer, 0, buffer.length, this.options.port, MULTICAST_ADDR);\n }\n\n getDiscoveredHosts(): Host[] {\n return Array.from(this.discoveredHosts.values());\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getFingerprint(): string | null {\n return this.identity?.fingerprint ?? null;\n }\n\n private async handleMessage(\n msg: Buffer,\n rinfo: { address: string; port: number }\n ): Promise<void> {\n try {\n const raw = JSON.parse(msg.toString());\n\n const localConfig = await getLocalHostConfig();\n if (raw.hostId === localConfig.id) return;\n\n let message: DiscoveryMessage;\n let fingerprint: string | undefined;\n\n if (this.isSignedMessage(raw)) {\n const signedMsg = raw as SignedDiscoveryMessage;\n fingerprint = signedMsg.fingerprint;\n\n if (this.securityMode === 'signed' || this.securityMode === 'trusted-only') {\n const isValid = await this.verifySignedMessage(signedMsg);\n if (!isValid) {\n return;\n }\n }\n\n if (this.securityMode === 'trusted-only' && this.keystore) {\n const isTrusted = await this.keystore.isTrusted(fingerprint);\n const isRevoked = await this.keystore.isRevoked(fingerprint);\n\n if (isRevoked) {\n return;\n }\n\n if (!isTrusted) {\n if (this.options.security.trust.autoTrustFirst) {\n await this.keystore.addTrustedPeer(\n fingerprint,\n signedMsg.publicKey,\n signedMsg.hostName\n );\n } else {\n return;\n }\n }\n }\n\n message = {\n type: signedMsg.type,\n hostId: signedMsg.hostId,\n hostName: signedMsg.hostName,\n address: signedMsg.address,\n port: signedMsg.port,\n tailscaleIP: signedMsg.tailscaleIP,\n version: signedMsg.version,\n timestamp: signedMsg.timestamp,\n };\n } else {\n if (this.securityMode !== 'open') {\n return;\n }\n message = raw as DiscoveryMessage;\n }\n\n const host: Host = {\n id: message.hostId,\n name: message.hostName,\n address: message.address || rinfo.address,\n port: message.port,\n tailscaleIP: message.tailscaleIP,\n status: 'online',\n lastSeen: new Date().toISOString(),\n version: message.version,\n metadata: fingerprint ? { fingerprint } : undefined,\n };\n\n this.discoveredHosts.set(host.id, host);\n await addKnownHost(host);\n this.options.onDiscover(host, fingerprint);\n\n if (message.type === 'query') {\n await this.announce();\n }\n } catch {\n }\n }\n\n private isSignedMessage(msg: unknown): msg is SignedDiscoveryMessage {\n if (typeof msg !== 'object' || msg === null) return false;\n const obj = msg as Record<string, unknown>;\n return (\n typeof obj.signature === 'string' &&\n typeof obj.publicKey === 'string' &&\n typeof obj.fingerprint === 'string'\n );\n }\n\n private async verifySignedMessage(\n msg: SignedDiscoveryMessage\n ): Promise<boolean> {\n try {\n const publicKey = hexToBytes(msg.publicKey);\n\n const computedFingerprint = PeerIdentity.computeFingerprint(publicKey);\n if (computedFingerprint !== msg.fingerprint) {\n return false;\n }\n\n const baseMessage: DiscoveryMessage = {\n type: msg.type,\n hostId: msg.hostId,\n hostName: msg.hostName,\n address: msg.address,\n port: msg.port,\n tailscaleIP: msg.tailscaleIP,\n version: msg.version,\n timestamp: msg.timestamp,\n };\n\n const messageBytes = new TextEncoder().encode(JSON.stringify(baseMessage));\n const signature = hexToBytes(msg.signature);\n return await PeerIdentity.verify(signature, messageBytes, publicKey);\n } catch {\n return false;\n }\n }\n}\n\nexport function getLocalIPAddress(): string {\n const interfaces = networkInterfaces();\n\n for (const name of Object.keys(interfaces)) {\n const iface = interfaces[name];\n if (!iface) continue;\n\n for (const addr of iface) {\n if (addr.family === 'IPv4' && !addr.internal) {\n return addr.address;\n }\n }\n }\n\n return '127.0.0.1';\n}\n\nexport async function discoverOnceSecure(\n timeout = 5000,\n options: SecureLocalDiscoveryOptions = {}\n): Promise<Host[]> {\n const discovery = new SecureLocalDiscovery(options);\n await discovery.start();\n await discovery.query();\n\n await new Promise((resolve) => setTimeout(resolve, timeout));\n\n const hosts = discovery.getDiscoveredHosts();\n await discovery.stop();\n\n return hosts;\n}\n","export type DiscoverySecurityMode = 'open' | 'signed' | 'trusted-only';\nexport type TransportEncryption = 'none' | 'optional' | 'required';\nexport type TLSMode = 'none' | 'self-signed' | 'ca-signed';\n\nexport interface DiscoverySecurityConfig {\n mode: DiscoverySecurityMode;\n}\n\nexport interface TransportSecurityConfig {\n encryption: TransportEncryption;\n tls: TLSMode;\n requireAuth: boolean;\n}\n\nexport interface TrustConfig {\n autoTrustFirst: boolean;\n requireManualApproval: boolean;\n trustedFingerprints?: string[];\n}\n\nexport interface MeshSecurityConfig {\n identityPath?: string;\n discovery: DiscoverySecurityConfig;\n transport: TransportSecurityConfig;\n trust: TrustConfig;\n}\n\nexport const SECURITY_PRESETS = {\n development: {\n discovery: { mode: 'open' as const },\n transport: { encryption: 'none' as const, tls: 'none' as const, requireAuth: false },\n trust: { autoTrustFirst: true, requireManualApproval: false },\n },\n signed: {\n discovery: { mode: 'signed' as const },\n transport: { encryption: 'optional' as const, tls: 'none' as const, requireAuth: false },\n trust: { autoTrustFirst: true, requireManualApproval: false },\n },\n secure: {\n discovery: { mode: 'signed' as const },\n transport: { encryption: 'required' as const, tls: 'self-signed' as const, requireAuth: true },\n trust: { autoTrustFirst: true, requireManualApproval: false },\n },\n strict: {\n discovery: { mode: 'trusted-only' as const },\n transport: { encryption: 'required' as const, tls: 'self-signed' as const, requireAuth: true },\n trust: { autoTrustFirst: false, requireManualApproval: true },\n },\n} as const;\n\nexport type SecurityPreset = keyof typeof SECURITY_PRESETS;\n\nexport const DEFAULT_SECURITY_CONFIG: MeshSecurityConfig = {\n ...SECURITY_PRESETS.secure,\n};\n\nexport function getSecurityPreset(preset: SecurityPreset): MeshSecurityConfig {\n return { ...SECURITY_PRESETS[preset] };\n}\n\nexport function mergeSecurityConfig(\n base: MeshSecurityConfig,\n overrides: Partial<MeshSecurityConfig>\n): MeshSecurityConfig {\n return {\n identityPath: overrides.identityPath ?? base.identityPath,\n discovery: {\n ...base.discovery,\n ...overrides.discovery,\n },\n transport: {\n ...base.transport,\n ...overrides.transport,\n },\n trust: {\n ...base.trust,\n ...overrides.trust,\n },\n };\n}\n\nexport function validateSecurityConfig(config: MeshSecurityConfig): string[] {\n const errors: string[] = [];\n\n const validDiscoveryModes: DiscoverySecurityMode[] = ['open', 'signed', 'trusted-only'];\n if (!validDiscoveryModes.includes(config.discovery.mode)) {\n errors.push(`Invalid discovery mode: ${config.discovery.mode}`);\n }\n\n const validEncryption: TransportEncryption[] = ['none', 'optional', 'required'];\n if (!validEncryption.includes(config.transport.encryption)) {\n errors.push(`Invalid transport encryption: ${config.transport.encryption}`);\n }\n\n const validTLS: TLSMode[] = ['none', 'self-signed', 'ca-signed'];\n if (!validTLS.includes(config.transport.tls)) {\n errors.push(`Invalid TLS mode: ${config.transport.tls}`);\n }\n\n if (config.transport.encryption === 'required' && config.transport.tls === 'none') {\n errors.push('Required encryption needs TLS enabled');\n }\n\n if (config.discovery.mode === 'trusted-only' && !config.trust.trustedFingerprints?.length) {\n if (!config.trust.autoTrustFirst) {\n errors.push('trusted-only discovery requires trustedFingerprints or autoTrustFirst');\n }\n }\n\n return errors;\n}\n\nexport function isSecurityEnabled(config: MeshSecurityConfig): boolean {\n return (\n config.discovery.mode !== 'open' ||\n config.transport.encryption !== 'none' ||\n config.transport.requireAuth\n );\n}\n\nexport function describeSecurityLevel(config: MeshSecurityConfig): string {\n if (\n config.discovery.mode === 'open' &&\n config.transport.encryption === 'none' &&\n !config.transport.requireAuth\n ) {\n return 'development (no security)';\n }\n\n if (\n config.discovery.mode === 'trusted-only' &&\n config.transport.encryption === 'required' &&\n config.transport.requireAuth\n ) {\n return 'strict (maximum security)';\n }\n\n if (\n config.discovery.mode === 'signed' &&\n config.transport.encryption === 'required' &&\n config.transport.requireAuth\n ) {\n return 'secure (recommended)';\n }\n\n if (config.discovery.mode === 'signed') {\n return 'signed (partial security)';\n }\n\n return 'custom';\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { Host } from '../types.js';\nimport { MESH_VERSION } from '../types.js';\n\nconst execAsync = promisify(exec);\n\nexport interface TailscaleStatus {\n available: boolean;\n self?: TailscalePeer;\n peers: TailscalePeer[];\n magicDNSSuffix?: string;\n}\n\nexport interface TailscalePeer {\n id: string;\n name: string;\n tailscaleIP: string;\n hostname: string;\n online: boolean;\n os?: string;\n lastSeen?: string;\n}\n\nexport async function getTailscaleStatus(): Promise<TailscaleStatus> {\n try {\n const { stdout } = await execAsync('tailscale status --json');\n const status = JSON.parse(stdout);\n\n const self: TailscalePeer | undefined = status.Self\n ? {\n id: status.Self.ID,\n name: status.Self.HostName,\n tailscaleIP: status.Self.TailscaleIPs?.[0] || '',\n hostname: status.Self.HostName,\n online: status.Self.Online ?? true,\n os: status.Self.OS,\n }\n : undefined;\n\n const peers: TailscalePeer[] = [];\n if (status.Peer) {\n for (const [id, peer] of Object.entries(status.Peer) as [string, any][]) {\n peers.push({\n id,\n name: peer.HostName,\n tailscaleIP: peer.TailscaleIPs?.[0] || '',\n hostname: peer.HostName,\n online: peer.Online ?? false,\n os: peer.OS,\n lastSeen: peer.LastSeen,\n });\n }\n }\n\n return {\n available: true,\n self,\n peers,\n magicDNSSuffix: status.MagicDNSSuffix,\n };\n } catch {\n return {\n available: false,\n peers: [],\n };\n }\n}\n\nexport async function isTailscaleAvailable(): Promise<boolean> {\n try {\n await execAsync('tailscale version');\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getTailscaleIP(): Promise<string | null> {\n const status = await getTailscaleStatus();\n return status.self?.tailscaleIP ?? null;\n}\n\nexport async function discoverTailscaleHosts(skillkitPort: number): Promise<Host[]> {\n const status = await getTailscaleStatus();\n if (!status.available) return [];\n\n const hosts: Host[] = [];\n\n for (const peer of status.peers) {\n if (!peer.online) continue;\n\n hosts.push({\n id: `tailscale-${peer.id}`,\n name: peer.name,\n address: peer.tailscaleIP,\n port: skillkitPort,\n tailscaleIP: peer.tailscaleIP,\n status: 'unknown',\n lastSeen: peer.lastSeen ?? new Date().toISOString(),\n version: MESH_VERSION,\n metadata: {\n discoveredVia: 'tailscale',\n os: peer.os,\n },\n });\n }\n\n return hosts;\n}\n\nexport async function resolveTailscaleName(hostname: string): Promise<string | null> {\n const status = await getTailscaleStatus();\n if (!status.available) return null;\n\n const normalizedName = hostname.toLowerCase();\n\n for (const peer of status.peers) {\n if (peer.hostname.toLowerCase() === normalizedName || peer.name.toLowerCase() === normalizedName) {\n return peer.tailscaleIP;\n }\n }\n\n if (status.magicDNSSuffix && hostname.endsWith(status.magicDNSSuffix)) {\n const shortName = hostname.slice(0, -status.magicDNSSuffix.length - 1);\n for (const peer of status.peers) {\n if (peer.hostname.toLowerCase() === shortName.toLowerCase()) {\n return peer.tailscaleIP;\n }\n }\n }\n\n return null;\n}\n","import got, { type Got } from 'got';\nimport { randomUUID } from 'node:crypto';\nimport type { TransportMessage, TransportOptions, Host } from '../types.js';\nimport { HEALTH_CHECK_TIMEOUT } from '../types.js';\n\nexport interface HttpTransportOptions extends TransportOptions {\n baseUrl?: string;\n headers?: Record<string, string>;\n}\n\nexport class HttpTransport {\n private client: Got;\n private options: HttpTransportOptions;\n\n constructor(host: Host, options: HttpTransportOptions = {}) {\n this.options = {\n timeout: options.timeout ?? HEALTH_CHECK_TIMEOUT,\n retries: options.retries ?? 2,\n retryDelay: options.retryDelay ?? 1000,\n baseUrl: options.baseUrl ?? `http://${host.address}:${host.port}`,\n headers: options.headers ?? {},\n };\n\n this.client = got.extend({\n prefixUrl: this.options.baseUrl,\n timeout: { request: this.options.timeout },\n retry: {\n limit: this.options.retries,\n calculateDelay: () => this.options.retryDelay!,\n },\n headers: {\n 'Content-Type': 'application/json',\n 'X-SkillKit-Transport': 'http',\n ...this.options.headers,\n },\n });\n }\n\n async send(path: string, payload: unknown): Promise<TransportMessage> {\n const message: TransportMessage = {\n id: randomUUID(),\n type: 'request',\n from: 'local',\n to: path,\n payload,\n timestamp: new Date().toISOString(),\n };\n\n const response = await this.client.post(path, {\n json: message,\n });\n\n return JSON.parse(response.body) as TransportMessage;\n }\n\n async sendMessage(to: string, type: string, payload: unknown): Promise<TransportMessage> {\n return this.send('message', {\n to,\n type,\n payload,\n });\n }\n\n async registerPeer(registration: unknown): Promise<TransportMessage> {\n return this.send('peer/register', registration);\n }\n\n async getPeers(): Promise<TransportMessage> {\n const response = await this.client.get('peers');\n return JSON.parse(response.body) as TransportMessage;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const response = await this.client.get('health');\n return response.statusCode === 200;\n } catch {\n return false;\n }\n }\n}\n\nexport async function sendToHost(\n host: Host,\n path: string,\n payload: unknown,\n options: HttpTransportOptions = {}\n): Promise<TransportMessage> {\n const transport = new HttpTransport(host, options);\n return transport.send(path, payload);\n}\n\nexport async function broadcastToHosts(\n hosts: Host[],\n path: string,\n payload: unknown,\n options: HttpTransportOptions = {}\n): Promise<Map<string, TransportMessage | Error>> {\n const results = new Map<string, TransportMessage | Error>();\n\n await Promise.all(\n hosts.map(async host => {\n try {\n const response = await sendToHost(host, path, payload, options);\n results.set(host.id, response);\n } catch (err) {\n results.set(host.id, err as Error);\n }\n })\n );\n\n return results;\n}\n","import WebSocket, { WebSocketServer } from 'ws';\nimport { randomUUID } from 'node:crypto';\nimport type { TransportMessage, TransportOptions, Host } from '../types.js';\nimport { DEFAULT_PORT } from '../types.js';\n\nexport interface WebSocketTransportOptions extends TransportOptions {\n reconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n}\n\nexport type MessageHandler = (message: TransportMessage, socket: WebSocket) => void;\n\nexport class WebSocketTransport {\n private socket: WebSocket | null = null;\n private options: Required<WebSocketTransportOptions>;\n private url: string;\n private reconnectAttempts = 0;\n private messageHandlers: Set<MessageHandler> = new Set();\n private connected = false;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private manualClose = false;\n\n constructor(host: Host, options: WebSocketTransportOptions = {}) {\n this.url = `ws://${host.address}:${host.port}/ws`;\n this.options = {\n timeout: options.timeout ?? 5000,\n retries: options.retries ?? 3,\n retryDelay: options.retryDelay ?? 1000,\n reconnect: options.reconnect ?? true,\n reconnectInterval: options.reconnectInterval ?? 5000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n };\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.socket = new WebSocket(this.url, {\n handshakeTimeout: this.options.timeout,\n });\n\n const timeout = setTimeout(() => {\n this.socket?.close();\n reject(new Error('Connection timeout'));\n }, this.options.timeout);\n\n this.socket.on('open', () => {\n clearTimeout(timeout);\n this.connected = true;\n this.reconnectAttempts = 0;\n resolve();\n });\n\n this.socket.on('message', data => {\n try {\n const message = JSON.parse(data.toString()) as TransportMessage;\n this.messageHandlers.forEach(handler => handler(message, this.socket!));\n } catch {\n }\n });\n\n this.socket.on('close', () => {\n this.connected = false;\n if (this.options.reconnect && !this.manualClose) {\n this.scheduleReconnect();\n }\n });\n\n this.socket.on('error', err => {\n clearTimeout(timeout);\n if (!this.connected) {\n reject(err);\n }\n });\n });\n }\n\n disconnect(): void {\n this.manualClose = true;\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n\n this.connected = false;\n }\n\n async send(message: Omit<TransportMessage, 'id' | 'timestamp'>): Promise<void> {\n if (!this.socket || !this.connected) {\n throw new Error('Not connected');\n }\n\n const fullMessage: TransportMessage = {\n ...message,\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n\n return new Promise((resolve, reject) => {\n this.socket!.send(JSON.stringify(fullMessage), err => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n onMessage(handler: MessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n return;\n }\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectAttempts++;\n try {\n await this.connect();\n } catch {\n this.scheduleReconnect();\n }\n }, this.options.reconnectInterval);\n }\n}\n\nexport class WebSocketServer2 {\n private server: WebSocketServer | null = null;\n private clients: Set<WebSocket> = new Set();\n private messageHandlers: Set<MessageHandler> = new Set();\n private port: number;\n private running = false;\n\n constructor(port = DEFAULT_PORT) {\n this.port = port;\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n return new Promise((resolve, reject) => {\n this.server = new WebSocketServer({ port: this.port, path: '/ws' });\n\n this.server.on('listening', () => {\n this.running = true;\n resolve();\n });\n\n this.server.on('error', err => {\n reject(err);\n });\n\n this.server.on('connection', socket => {\n this.clients.add(socket);\n\n socket.on('message', data => {\n try {\n const message = JSON.parse(data.toString()) as TransportMessage;\n this.messageHandlers.forEach(handler => handler(message, socket));\n } catch {\n }\n });\n\n socket.on('close', () => {\n this.clients.delete(socket);\n });\n });\n });\n }\n\n stop(): void {\n if (!this.running) return;\n\n for (const client of this.clients) {\n client.close();\n }\n this.clients.clear();\n\n this.server?.close();\n this.server = null;\n this.running = false;\n }\n\n broadcast(message: Omit<TransportMessage, 'id' | 'timestamp'>): void {\n const fullMessage: TransportMessage = {\n ...message,\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n\n const data = JSON.stringify(fullMessage);\n\n for (const client of this.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(data);\n }\n }\n }\n\n sendTo(socket: WebSocket, message: Omit<TransportMessage, 'id' | 'timestamp'>): void {\n if (socket.readyState !== WebSocket.OPEN) return;\n\n const fullMessage: TransportMessage = {\n ...message,\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n\n socket.send(JSON.stringify(fullMessage));\n }\n\n onMessage(handler: MessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n getClientCount(): number {\n return this.clients.size;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import WebSocket, { WebSocketServer } from 'ws';\nimport { createServer as createHttpsServer, type Server as HttpsServer } from 'node:https';\nimport { randomUUID } from 'node:crypto';\nimport type {\n TransportMessage,\n SecureTransportMessage,\n Host,\n} from '../types.js';\nimport { DEFAULT_PORT } from '../types.js';\nimport { PeerIdentity } from '../crypto/identity.js';\nimport { MessageEncryption } from '../crypto/encryption.js';\nimport { AuthManager, type AuthChallengeRequest, type AuthChallengeResponse } from '../security/auth.js';\nimport { TLSManager, type CertificateInfo } from '../security/tls.js';\nimport { type MeshSecurityConfig, DEFAULT_SECURITY_CONFIG } from '../security/config.js';\nimport { SecureKeystore } from '../crypto/keystore.js';\nimport { hexToBytes } from '@noble/hashes/utils';\n\nexport interface SecureWebSocketOptions {\n timeout?: number;\n reconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n security?: MeshSecurityConfig;\n identity?: PeerIdentity;\n keystore?: SecureKeystore;\n}\n\nexport type SecureMessageHandler = (\n message: TransportMessage,\n socket: WebSocket,\n senderFingerprint?: string\n) => void;\n\ninterface AuthenticatedClient {\n socket: WebSocket;\n fingerprint: string;\n publicKey: string;\n encryption?: MessageEncryption;\n}\n\nexport class SecureWebSocketTransport {\n private socket: WebSocket | null = null;\n private host: Host;\n private options: Required<Omit<SecureWebSocketOptions, 'identity' | 'keystore'>>;\n private identity: PeerIdentity | null = null;\n private keystore: SecureKeystore | null = null;\n private authManager: AuthManager | null = null;\n private encryption: MessageEncryption | null = null;\n private reconnectAttempts = 0;\n private messageHandlers: Set<SecureMessageHandler> = new Set();\n private connected = false;\n private authenticated = false;\n private reconnectTimer: NodeJS.Timeout | null = null;\n\n constructor(host: Host, options: SecureWebSocketOptions = {}) {\n this.host = host;\n this.options = {\n timeout: options.timeout ?? 5000,\n reconnect: options.reconnect ?? true,\n reconnectInterval: options.reconnectInterval ?? 5000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n security: options.security ?? DEFAULT_SECURITY_CONFIG,\n };\n this.identity = options.identity ?? null;\n this.keystore = options.keystore ?? null;\n }\n\n async initialize(): Promise<void> {\n if (!this.identity && this.keystore) {\n this.identity = await this.keystore.loadOrCreateIdentity();\n }\n if (!this.identity) {\n this.identity = await PeerIdentity.generate();\n }\n this.authManager = new AuthManager(this.identity);\n }\n\n private getUrl(): string {\n const protocol =\n this.options.security.transport.tls !== 'none' ? 'wss' : 'ws';\n return `${protocol}://${this.host.address}:${this.host.port}/ws`;\n }\n\n async connect(): Promise<void> {\n if (!this.identity) {\n await this.initialize();\n }\n\n return new Promise((resolve, reject) => {\n const url = this.getUrl();\n const wsOptions: WebSocket.ClientOptions = {\n handshakeTimeout: this.options.timeout,\n rejectUnauthorized: false,\n };\n\n this.socket = new WebSocket(url, wsOptions);\n\n const timeout = setTimeout(() => {\n this.socket?.close();\n reject(new Error('Connection timeout'));\n }, this.options.timeout);\n\n this.socket.on('open', async () => {\n clearTimeout(timeout);\n this.connected = true;\n this.reconnectAttempts = 0;\n\n if (this.options.security.transport.requireAuth) {\n try {\n await this.performClientHandshake();\n this.authenticated = true;\n } catch (err) {\n this.socket?.close();\n reject(new Error(`Authentication failed: ${err}`));\n return;\n }\n } else {\n this.authenticated = true;\n }\n\n resolve();\n });\n\n this.socket.on('message', async (data) => {\n try {\n const raw = JSON.parse(data.toString());\n\n if (raw.type === 'auth:challenge') {\n return;\n }\n\n let message: TransportMessage;\n let senderFingerprint: string | undefined;\n\n if (this.encryption && raw.ciphertext) {\n const decrypted = this.encryption.decryptToObject<TransportMessage>({\n nonce: raw.nonce,\n ciphertext: raw.ciphertext,\n });\n message = decrypted;\n senderFingerprint = raw.senderFingerprint;\n } else if (raw.signature) {\n const secure = raw as SecureTransportMessage;\n senderFingerprint = secure.senderFingerprint;\n message = {\n id: secure.id,\n type: secure.type,\n from: secure.from,\n to: secure.to,\n payload: secure.payload,\n timestamp: secure.timestamp,\n };\n } else {\n message = raw as TransportMessage;\n }\n\n this.messageHandlers.forEach((handler) =>\n handler(message, this.socket!, senderFingerprint)\n );\n } catch {\n }\n });\n\n this.socket.on('close', () => {\n this.connected = false;\n this.authenticated = false;\n if (this.options.reconnect) {\n this.scheduleReconnect();\n }\n });\n\n this.socket.on('error', (err) => {\n clearTimeout(timeout);\n if (!this.connected) {\n reject(err);\n }\n });\n });\n }\n\n private async performClientHandshake(): Promise<void> {\n return new Promise((resolve, reject) => {\n const handleChallenge = async (data: WebSocket.Data) => {\n try {\n const msg = JSON.parse(data.toString());\n if (msg.type === 'auth:challenge') {\n const challenge: AuthChallengeRequest = {\n challenge: msg.challenge,\n timestamp: msg.timestamp,\n };\n\n const response = await this.authManager!.respondToChallenge(challenge);\n this.socket!.send(\n JSON.stringify({\n type: 'auth:response',\n ...response,\n })\n );\n } else if (msg.type === 'auth:success') {\n this.socket!.off('message', handleChallenge);\n\n if (msg.serverPublicKey) {\n const serverPubKey = hexToBytes(msg.serverPublicKey);\n const sharedSecret = this.identity!.deriveSharedSecret(serverPubKey);\n this.encryption = new MessageEncryption(sharedSecret);\n }\n\n resolve();\n } else if (msg.type === 'auth:failed') {\n this.socket!.off('message', handleChallenge);\n reject(new Error(msg.error || 'Authentication failed'));\n }\n } catch (err) {\n reject(err);\n }\n };\n\n this.socket!.on('message', handleChallenge);\n\n setTimeout(() => {\n this.socket!.off('message', handleChallenge);\n reject(new Error('Authentication timeout'));\n }, this.options.timeout);\n });\n }\n\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n\n this.connected = false;\n this.authenticated = false;\n this.encryption = null;\n }\n\n async send(\n message: Omit<TransportMessage, 'id' | 'timestamp'>\n ): Promise<void> {\n if (!this.socket || !this.connected) {\n throw new Error('Not connected');\n }\n\n if (!this.authenticated) {\n throw new Error('Not authenticated');\n }\n\n const fullMessage: TransportMessage = {\n ...message,\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n\n let dataToSend: string;\n\n if (\n this.encryption &&\n this.options.security.transport.encryption === 'required'\n ) {\n const encrypted = this.encryption.encryptObject(fullMessage);\n dataToSend = JSON.stringify({\n id: fullMessage.id,\n senderFingerprint: this.identity!.fingerprint,\n nonce: encrypted.nonce,\n ciphertext: encrypted.ciphertext,\n timestamp: fullMessage.timestamp,\n });\n } else if (this.identity) {\n const signature = await this.identity.signObject(fullMessage);\n const secureMessage: SecureTransportMessage = {\n ...fullMessage,\n signature,\n senderFingerprint: this.identity.fingerprint,\n senderPublicKey: this.identity.publicKeyHex,\n nonce: randomUUID(),\n };\n dataToSend = JSON.stringify(secureMessage);\n } else {\n dataToSend = JSON.stringify(fullMessage);\n }\n\n return new Promise((resolve, reject) => {\n this.socket!.send(dataToSend, (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n onMessage(handler: SecureMessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n isAuthenticated(): boolean {\n return this.authenticated;\n }\n\n getFingerprint(): string | null {\n return this.identity?.fingerprint ?? null;\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n return;\n }\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectAttempts++;\n try {\n await this.connect();\n } catch {\n this.scheduleReconnect();\n }\n }, this.options.reconnectInterval);\n }\n}\n\nexport class SecureWebSocketServer {\n private wss: WebSocketServer | null = null;\n private httpsServer: HttpsServer | null = null;\n private clients: Map<WebSocket, AuthenticatedClient> = new Map();\n private messageHandlers: Set<SecureMessageHandler> = new Set();\n private port: number;\n private running = false;\n private identity: PeerIdentity | null = null;\n private keystore: SecureKeystore | null = null;\n private authManager: AuthManager | null = null;\n private tlsManager: TLSManager | null = null;\n private certInfo: CertificateInfo | null = null;\n private security: MeshSecurityConfig;\n private hostId: string;\n\n constructor(\n port = DEFAULT_PORT,\n options: {\n security?: MeshSecurityConfig;\n identity?: PeerIdentity;\n keystore?: SecureKeystore;\n hostId?: string;\n } = {}\n ) {\n this.port = port;\n this.security = options.security ?? DEFAULT_SECURITY_CONFIG;\n this.identity = options.identity ?? null;\n this.keystore = options.keystore ?? null;\n this.hostId = options.hostId ?? randomUUID();\n }\n\n async initialize(): Promise<void> {\n if (!this.identity && this.keystore) {\n this.identity = await this.keystore.loadOrCreateIdentity();\n }\n if (!this.identity) {\n this.identity = await PeerIdentity.generate();\n }\n this.authManager = new AuthManager(this.identity);\n\n if (this.security.transport.tls !== 'none') {\n this.tlsManager = new TLSManager();\n this.certInfo = await this.tlsManager.loadOrCreateCertificate(\n this.hostId,\n 'localhost'\n );\n }\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n await this.initialize();\n\n return new Promise((resolve, reject) => {\n if (this.security.transport.tls !== 'none' && this.certInfo) {\n this.httpsServer = createHttpsServer({\n cert: this.certInfo.cert,\n key: this.certInfo.key,\n });\n\n this.wss = new WebSocketServer({\n server: this.httpsServer,\n path: '/ws',\n });\n\n this.httpsServer.listen(this.port, () => {\n this.running = true;\n resolve();\n });\n\n this.httpsServer.on('error', reject);\n } else {\n this.wss = new WebSocketServer({ port: this.port, path: '/ws' });\n\n this.wss.on('listening', () => {\n this.running = true;\n resolve();\n });\n\n this.wss.on('error', reject);\n }\n\n this.wss.on('connection', (socket) => {\n this.handleConnection(socket);\n });\n });\n }\n\n private async handleConnection(socket: WebSocket): Promise<void> {\n if (this.security.transport.requireAuth) {\n try {\n const client = await this.performServerHandshake(socket);\n this.clients.set(socket, client);\n } catch {\n socket.close();\n return;\n }\n } else {\n this.clients.set(socket, {\n socket,\n fingerprint: 'anonymous',\n publicKey: '',\n });\n }\n\n socket.on('message', async (data) => {\n try {\n const raw = JSON.parse(data.toString());\n\n if (raw.type === 'auth:response') {\n return;\n }\n\n const client = this.clients.get(socket);\n if (!client) return;\n\n let message: TransportMessage;\n let senderFingerprint: string | undefined = client.fingerprint;\n\n if (client.encryption && raw.ciphertext) {\n const decrypted = client.encryption.decryptToObject<TransportMessage>({\n nonce: raw.nonce,\n ciphertext: raw.ciphertext,\n });\n message = decrypted;\n } else if (raw.signature) {\n const secure = raw as SecureTransportMessage;\n senderFingerprint = secure.senderFingerprint;\n message = {\n id: secure.id,\n type: secure.type,\n from: secure.from,\n to: secure.to,\n payload: secure.payload,\n timestamp: secure.timestamp,\n };\n } else {\n message = raw as TransportMessage;\n }\n\n this.messageHandlers.forEach((handler) =>\n handler(message, socket, senderFingerprint)\n );\n } catch {\n }\n });\n\n socket.on('close', () => {\n this.clients.delete(socket);\n });\n }\n\n private async performServerHandshake(\n socket: WebSocket\n ): Promise<AuthenticatedClient> {\n return new Promise((resolve, reject) => {\n const challenge = this.authManager!.createChallenge();\n\n socket.send(\n JSON.stringify({\n type: 'auth:challenge',\n ...challenge,\n })\n );\n\n const timeout = setTimeout(() => {\n socket.off('message', handleResponse);\n reject(new Error('Handshake timeout'));\n }, 10000);\n\n const handleResponse = async (data: WebSocket.Data) => {\n try {\n const msg = JSON.parse(data.toString());\n if (msg.type === 'auth:response') {\n clearTimeout(timeout);\n socket.off('message', handleResponse);\n\n const response: AuthChallengeResponse = {\n challenge: msg.challenge,\n signature: msg.signature,\n publicKey: msg.publicKey,\n fingerprint: msg.fingerprint,\n timestamp: msg.timestamp,\n };\n\n const result =\n await this.authManager!.verifyChallengeResponse(response);\n\n if (!result.authenticated) {\n socket.send(\n JSON.stringify({\n type: 'auth:failed',\n error: result.error,\n })\n );\n reject(new Error(result.error));\n return;\n }\n\n if (this.keystore) {\n const isRevoked = await this.keystore.isRevoked(result.fingerprint!);\n if (isRevoked) {\n socket.send(\n JSON.stringify({\n type: 'auth:failed',\n error: 'Peer is revoked',\n })\n );\n reject(new Error('Peer is revoked'));\n return;\n }\n }\n\n let encryption: MessageEncryption | undefined;\n if (this.security.transport.encryption === 'required') {\n const clientPubKey = hexToBytes(response.publicKey);\n const sharedSecret = this.identity!.deriveSharedSecret(clientPubKey);\n encryption = new MessageEncryption(sharedSecret);\n }\n\n socket.send(\n JSON.stringify({\n type: 'auth:success',\n serverFingerprint: this.identity!.fingerprint,\n serverPublicKey: this.identity!.publicKeyHex,\n })\n );\n\n resolve({\n socket,\n fingerprint: result.fingerprint!,\n publicKey: response.publicKey,\n encryption,\n });\n }\n } catch (err) {\n clearTimeout(timeout);\n reject(err);\n }\n };\n\n socket.on('message', handleResponse);\n });\n }\n\n stop(): void {\n if (!this.running) return;\n\n for (const [socket] of this.clients) {\n socket.close();\n }\n this.clients.clear();\n\n this.wss?.close();\n this.httpsServer?.close();\n this.wss = null;\n this.httpsServer = null;\n this.running = false;\n }\n\n async broadcast(\n message: Omit<TransportMessage, 'id' | 'timestamp'>\n ): Promise<void> {\n const fullMessage: TransportMessage = {\n ...message,\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n\n for (const [socket, client] of this.clients) {\n if (socket.readyState !== WebSocket.OPEN) continue;\n\n let dataToSend: string;\n\n if (client.encryption) {\n const encrypted = client.encryption.encryptObject(fullMessage);\n dataToSend = JSON.stringify({\n id: fullMessage.id,\n senderFingerprint: this.identity!.fingerprint,\n nonce: encrypted.nonce,\n ciphertext: encrypted.ciphertext,\n timestamp: fullMessage.timestamp,\n });\n } else if (this.identity) {\n const signature = await this.identity.signObject(fullMessage);\n const secureMessage: SecureTransportMessage = {\n ...fullMessage,\n signature,\n senderFingerprint: this.identity.fingerprint,\n senderPublicKey: this.identity.publicKeyHex,\n nonce: randomUUID(),\n };\n dataToSend = JSON.stringify(secureMessage);\n } else {\n dataToSend = JSON.stringify(fullMessage);\n }\n\n socket.send(dataToSend);\n }\n }\n\n async sendTo(\n socket: WebSocket,\n message: Omit<TransportMessage, 'id' | 'timestamp'>\n ): Promise<void> {\n if (socket.readyState !== WebSocket.OPEN) return;\n\n const client = this.clients.get(socket);\n if (!client) return;\n\n const fullMessage: TransportMessage = {\n ...message,\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n\n let dataToSend: string;\n\n if (client.encryption) {\n const encrypted = client.encryption.encryptObject(fullMessage);\n dataToSend = JSON.stringify({\n id: fullMessage.id,\n senderFingerprint: this.identity!.fingerprint,\n nonce: encrypted.nonce,\n ciphertext: encrypted.ciphertext,\n timestamp: fullMessage.timestamp,\n });\n } else if (this.identity) {\n const signature = await this.identity.signObject(fullMessage);\n const secureMessage: SecureTransportMessage = {\n ...fullMessage,\n signature,\n senderFingerprint: this.identity.fingerprint,\n senderPublicKey: this.identity.publicKeyHex,\n nonce: randomUUID(),\n };\n dataToSend = JSON.stringify(secureMessage);\n } else {\n dataToSend = JSON.stringify(fullMessage);\n }\n\n socket.send(dataToSend);\n }\n\n onMessage(handler: SecureMessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n getClientCount(): number {\n return this.clients.size;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getFingerprint(): string | null {\n return this.identity?.fingerprint ?? null;\n }\n\n getAuthenticatedClients(): Array<{ fingerprint: string; publicKey: string }> {\n return Array.from(this.clients.values()).map((c) => ({\n fingerprint: c.fingerprint,\n publicKey: c.publicKey,\n }));\n }\n}\n","import { SignJWT, jwtVerify, importPKCS8, importSPKI, type KeyLike } from 'jose';\nimport { randomBytes, createPrivateKey, createPublicKey } from 'node:crypto';\nimport { PeerIdentity } from '../crypto/identity.js';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\n\nexport interface AuthToken {\n hostId: string;\n fingerprint: string;\n publicKey: string;\n capabilities: string[];\n iat: number;\n exp: number;\n}\n\nexport interface AuthChallengeRequest {\n challenge: string;\n timestamp: string;\n}\n\nexport interface AuthChallengeResponse {\n challenge: string;\n signature: string;\n publicKey: string;\n fingerprint: string;\n timestamp: string;\n}\n\nexport interface AuthResult {\n authenticated: boolean;\n fingerprint?: string;\n publicKey?: string;\n error?: string;\n}\n\nconst DEFAULT_TOKEN_TTL = 24 * 60 * 60;\nconst CHALLENGE_SIZE = 32;\nconst CHALLENGE_EXPIRY_MS = 30 * 1000;\n\nexport class AuthManager {\n private identity: PeerIdentity;\n private pendingChallenges: Map<string, { expected: string; expires: number }> =\n new Map();\n\n constructor(identity: PeerIdentity) {\n this.identity = identity;\n }\n\n private async getSigningKey(): Promise<KeyLike> {\n const privateKeyObj = createPrivateKey({\n key: Buffer.concat([\n Buffer.from('302e020100300506032b657004220420', 'hex'),\n Buffer.from(this.identity.privateKey),\n ]),\n format: 'der',\n type: 'pkcs8',\n });\n const pem = privateKeyObj.export({ type: 'pkcs8', format: 'pem' }) as string;\n return importPKCS8(pem, 'EdDSA');\n }\n\n private async getVerifyingKey(publicKeyHex: string): Promise<KeyLike> {\n const publicKeyBytes = hexToBytes(publicKeyHex);\n const publicKeyObj = createPublicKey({\n key: Buffer.concat([\n Buffer.from('302a300506032b6570032100', 'hex'),\n Buffer.from(publicKeyBytes),\n ]),\n format: 'der',\n type: 'spki',\n });\n const pem = publicKeyObj.export({ type: 'spki', format: 'pem' }) as string;\n return importSPKI(pem, 'EdDSA');\n }\n\n async createToken(\n hostId: string,\n capabilities: string[] = [],\n ttlSeconds: number = DEFAULT_TOKEN_TTL\n ): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const signingKey = await this.getSigningKey();\n\n const token = await new SignJWT({\n hostId,\n fingerprint: this.identity.fingerprint,\n publicKey: this.identity.publicKeyHex,\n capabilities,\n })\n .setProtectedHeader({ alg: 'EdDSA' })\n .setIssuedAt(now)\n .setExpirationTime(now + ttlSeconds)\n .setIssuer('skillkit-mesh')\n .sign(signingKey);\n\n return token;\n }\n\n async verifyToken(token: string): Promise<AuthToken | null> {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString());\n\n if (!payload.publicKey) {\n return null;\n }\n\n const computedFingerprint = PeerIdentity.computeFingerprint(hexToBytes(payload.publicKey));\n if (computedFingerprint !== payload.fingerprint) {\n return null;\n }\n\n const verifyingKey = await this.getVerifyingKey(payload.publicKey);\n const { payload: verified } = await jwtVerify(token, verifyingKey, {\n issuer: 'skillkit-mesh',\n });\n\n return {\n hostId: verified.hostId as string,\n fingerprint: verified.fingerprint as string,\n publicKey: verified.publicKey as string,\n capabilities: (verified.capabilities as string[]) || [],\n iat: verified.iat as number,\n exp: verified.exp as number,\n };\n } catch {\n return null;\n }\n }\n\n createChallenge(): AuthChallengeRequest {\n const challengeBytes = randomBytes(CHALLENGE_SIZE);\n const challenge = bytesToHex(challengeBytes);\n const timestamp = new Date().toISOString();\n\n this.pendingChallenges.set(challenge, {\n expected: challenge,\n expires: Date.now() + CHALLENGE_EXPIRY_MS,\n });\n\n this.cleanupExpiredChallenges();\n\n return {\n challenge,\n timestamp,\n };\n }\n\n async respondToChallenge(\n challengeRequest: AuthChallengeRequest\n ): Promise<AuthChallengeResponse> {\n const message = `${challengeRequest.challenge}:${challengeRequest.timestamp}`;\n const signature = await this.identity.signString(message);\n\n return {\n challenge: challengeRequest.challenge,\n signature,\n publicKey: this.identity.publicKeyHex,\n fingerprint: this.identity.fingerprint,\n timestamp: challengeRequest.timestamp,\n };\n }\n\n async verifyChallengeResponse(\n response: AuthChallengeResponse\n ): Promise<AuthResult> {\n const pending = this.pendingChallenges.get(response.challenge);\n\n if (!pending) {\n return {\n authenticated: false,\n error: 'Unknown or expired challenge',\n };\n }\n\n if (Date.now() > pending.expires) {\n this.pendingChallenges.delete(response.challenge);\n return {\n authenticated: false,\n error: 'Challenge expired',\n };\n }\n\n try {\n const publicKey = hexToBytes(response.publicKey);\n const computedFingerprint = PeerIdentity.computeFingerprint(publicKey);\n\n if (computedFingerprint !== response.fingerprint) {\n return {\n authenticated: false,\n error: 'Fingerprint mismatch',\n };\n }\n\n const message = `${response.challenge}:${response.timestamp}`;\n const messageBytes = new TextEncoder().encode(message);\n const signature = hexToBytes(response.signature);\n const valid = await PeerIdentity.verify(signature, messageBytes, publicKey);\n\n if (!valid) {\n return {\n authenticated: false,\n error: 'Invalid signature',\n };\n }\n\n this.pendingChallenges.delete(response.challenge);\n\n return {\n authenticated: true,\n fingerprint: response.fingerprint,\n publicKey: response.publicKey,\n };\n } catch (error) {\n return {\n authenticated: false,\n error: error instanceof Error ? error.message : 'Verification failed',\n };\n }\n }\n\n private cleanupExpiredChallenges(): void {\n const now = Date.now();\n for (const [challenge, data] of this.pendingChallenges) {\n if (now > data.expires) {\n this.pendingChallenges.delete(challenge);\n }\n }\n }\n\n async createSignedMessage(payload: unknown): Promise<{\n payload: unknown;\n signature: string;\n fingerprint: string;\n timestamp: string;\n }> {\n const timestamp = new Date().toISOString();\n const toSign = JSON.stringify({ payload, timestamp });\n const signature = await this.identity.signString(toSign);\n\n return {\n payload,\n signature,\n fingerprint: this.identity.fingerprint,\n timestamp,\n };\n }\n\n async verifySignedMessage(message: {\n payload: unknown;\n signature: string;\n fingerprint: string;\n timestamp: string;\n publicKey?: string;\n }): Promise<{ valid: boolean; fingerprint?: string; error?: string }> {\n try {\n if (!message.publicKey) {\n return { valid: false, error: 'Missing public key' };\n }\n\n const publicKey = hexToBytes(message.publicKey);\n const computedFingerprint = PeerIdentity.computeFingerprint(publicKey);\n\n if (computedFingerprint !== message.fingerprint) {\n return { valid: false, error: 'Fingerprint mismatch' };\n }\n\n const toSign = JSON.stringify({\n payload: message.payload,\n timestamp: message.timestamp,\n });\n const messageBytes = new TextEncoder().encode(toSign);\n const signature = hexToBytes(message.signature);\n const valid = await PeerIdentity.verify(signature, messageBytes, publicKey);\n\n if (!valid) {\n return { valid: false, error: 'Invalid signature' };\n }\n\n return { valid: true, fingerprint: message.fingerprint };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Verification failed',\n };\n }\n }\n\n get fingerprint(): string {\n return this.identity.fingerprint;\n }\n\n get publicKey(): string {\n return this.identity.publicKeyHex;\n }\n}\n\nexport function extractBearerToken(\n authHeader: string | undefined\n): string | null {\n if (!authHeader) return null;\n const match = authHeader.match(/^Bearer\\s+(.+)$/i);\n return match ? match[1] : null;\n}\n\nexport function createBearerHeader(token: string): string {\n return `Bearer ${token}`;\n}\n","import {\n generateKeyPairSync,\n createHash,\n} from 'node:crypto';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface TLSContextOptions {\n cert?: string;\n key?: string;\n ca?: string[];\n requestCert?: boolean;\n rejectUnauthorized?: boolean;\n}\n\nexport interface CertificateInfo {\n cert: string;\n key: string;\n fingerprint: string;\n notBefore: Date;\n notAfter: Date;\n subject: string;\n}\n\nexport interface TLSConfig {\n certPath?: string;\n keyPath?: string;\n caPath?: string;\n rejectUnauthorized?: boolean;\n}\n\nconst DEFAULT_CERT_PATH = join(homedir(), '.skillkit', 'mesh', 'certs');\n\nfunction generateSelfSignedCertificate(\n hostId: string,\n hostName: string,\n validDays: number = 365\n): { cert: string; key: string } {\n const { publicKey, privateKey } = generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: { type: 'spki', format: 'pem' },\n privateKeyEncoding: { type: 'pkcs8', format: 'pem' },\n });\n\n const notBefore = new Date();\n const notAfter = new Date();\n notAfter.setDate(notAfter.getDate() + validDays);\n\n const serialNumber = createHash('sha256')\n .update(hostId + Date.now().toString())\n .digest('hex')\n .slice(0, 16);\n\n const certPem = createSimpleCert({\n publicKey: publicKey as string,\n privateKey: privateKey as string,\n subject: `CN=${hostName},O=SkillKit Mesh,OU=${hostId}`,\n issuer: `CN=${hostName},O=SkillKit Mesh,OU=${hostId}`,\n serialNumber,\n notBefore,\n notAfter,\n altNames: ['localhost', '127.0.0.1', hostName],\n });\n\n return {\n cert: certPem,\n key: privateKey as string,\n };\n}\n\ninterface CertParams {\n publicKey: string;\n privateKey: string;\n subject: string;\n issuer: string;\n serialNumber: string;\n notBefore: Date;\n notAfter: Date;\n altNames: string[];\n}\n\nfunction createSimpleCert(params: CertParams): string {\n const base64Encode = (str: string): string =>\n Buffer.from(str).toString('base64');\n\n const formatDate = (date: Date): string => {\n const y = date.getUTCFullYear().toString().slice(-2);\n const m = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const d = date.getUTCDate().toString().padStart(2, '0');\n const h = date.getUTCHours().toString().padStart(2, '0');\n const min = date.getUTCMinutes().toString().padStart(2, '0');\n const s = date.getUTCSeconds().toString().padStart(2, '0');\n return `${y}${m}${d}${h}${min}${s}Z`;\n };\n\n const certInfo = {\n version: 3,\n serialNumber: params.serialNumber,\n subject: params.subject,\n issuer: params.issuer,\n notBefore: formatDate(params.notBefore),\n notAfter: formatDate(params.notAfter),\n publicKey: params.publicKey,\n altNames: params.altNames,\n };\n\n const certData = JSON.stringify(certInfo);\n const certBase64 = base64Encode(certData);\n\n const lines: string[] = ['-----BEGIN CERTIFICATE-----'];\n for (let i = 0; i < certBase64.length; i += 64) {\n lines.push(certBase64.slice(i, i + 64));\n }\n lines.push('-----END CERTIFICATE-----');\n\n return lines.join('\\n');\n}\n\nexport class TLSManager {\n private certPath: string;\n\n constructor(certPath?: string) {\n this.certPath = certPath || DEFAULT_CERT_PATH;\n }\n\n async ensureDirectory(): Promise<void> {\n if (!existsSync(this.certPath)) {\n await mkdir(this.certPath, { recursive: true, mode: 0o700 });\n }\n }\n\n async generateCertificate(\n hostId: string,\n hostName: string = 'localhost',\n validDays: number = 365\n ): Promise<CertificateInfo> {\n await this.ensureDirectory();\n\n const { cert, key } = generateSelfSignedCertificate(\n hostId,\n hostName,\n validDays\n );\n\n const certFile = join(this.certPath, `${hostId}.crt`);\n const keyFile = join(this.certPath, `${hostId}.key`);\n\n await writeFile(certFile, cert, { mode: 0o644 });\n await writeFile(keyFile, key, { mode: 0o600 });\n\n const fingerprint = createHash('sha256').update(cert).digest('hex');\n const notBefore = new Date();\n const notAfter = new Date();\n notAfter.setDate(notAfter.getDate() + validDays);\n\n return {\n cert,\n key,\n fingerprint,\n notBefore,\n notAfter,\n subject: `CN=${hostName},O=SkillKit Mesh,OU=${hostId}`,\n };\n }\n\n async loadCertificate(hostId: string): Promise<CertificateInfo | null> {\n const certFile = join(this.certPath, `${hostId}.crt`);\n const keyFile = join(this.certPath, `${hostId}.key`);\n\n if (!existsSync(certFile) || !existsSync(keyFile)) {\n return null;\n }\n\n const cert = await readFile(certFile, 'utf-8');\n const key = await readFile(keyFile, 'utf-8');\n const fingerprint = createHash('sha256').update(cert).digest('hex');\n\n return {\n cert,\n key,\n fingerprint,\n notBefore: new Date(),\n notAfter: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000),\n subject: hostId,\n };\n }\n\n async loadOrCreateCertificate(\n hostId: string,\n hostName: string = 'localhost'\n ): Promise<CertificateInfo> {\n const existing = await this.loadCertificate(hostId);\n if (existing) {\n return existing;\n }\n return this.generateCertificate(hostId, hostName);\n }\n\n async hasCertificate(hostId: string): Promise<boolean> {\n const certFile = join(this.certPath, `${hostId}.crt`);\n return existsSync(certFile);\n }\n\n getCertificatePath(hostId: string): { certPath: string; keyPath: string } {\n return {\n certPath: join(this.certPath, `${hostId}.crt`),\n keyPath: join(this.certPath, `${hostId}.key`),\n };\n }\n\n createServerContext(\n certInfo: CertificateInfo,\n options?: { requestClientCert?: boolean; trustedCAs?: string[] }\n ): TLSContextOptions {\n const context: TLSContextOptions = {\n cert: certInfo.cert,\n key: certInfo.key,\n requestCert: options?.requestClientCert ?? false,\n rejectUnauthorized: false,\n };\n\n if (options?.trustedCAs?.length) {\n context.ca = options.trustedCAs;\n context.rejectUnauthorized = true;\n }\n\n return context;\n }\n\n createClientContext(\n certInfo?: CertificateInfo,\n options?: { serverFingerprint?: string; trustedCAs?: string[] }\n ): TLSContextOptions {\n const context: TLSContextOptions = {\n rejectUnauthorized: false,\n };\n\n if (certInfo) {\n context.cert = certInfo.cert;\n context.key = certInfo.key;\n }\n\n if (options?.trustedCAs?.length) {\n context.ca = options.trustedCAs;\n }\n\n return context;\n }\n\n static computeCertFingerprint(cert: string): string {\n return createHash('sha256').update(cert).digest('hex');\n }\n\n static verifyCertFingerprint(\n cert: string,\n expectedFingerprint: string\n ): boolean {\n const actual = TLSManager.computeCertFingerprint(cert);\n return actual.toLowerCase() === expectedFingerprint.toLowerCase();\n }\n}\n\nlet globalTLSManager: TLSManager | null = null;\n\nexport function getTLSManager(certPath?: string): TLSManager {\n if (!globalTLSManager) {\n globalTLSManager = new TLSManager(certPath);\n }\n return globalTLSManager;\n}\n\nexport function resetTLSManager(): void {\n globalTLSManager = null;\n}\n","import got, { type Got } from 'got';\nimport { randomUUID } from 'node:crypto';\nimport type {\n TransportMessage,\n SecureTransportMessage,\n Host,\n} from '../types.js';\nimport { HEALTH_CHECK_TIMEOUT } from '../types.js';\nimport { PeerIdentity } from '../crypto/identity.js';\nimport {\n AuthManager,\n createBearerHeader,\n} from '../security/auth.js';\nimport { type MeshSecurityConfig, DEFAULT_SECURITY_CONFIG } from '../security/config.js';\nimport { SecureKeystore } from '../crypto/keystore.js';\n\nexport interface SecureHttpTransportOptions {\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n security?: MeshSecurityConfig;\n identity?: PeerIdentity;\n keystore?: SecureKeystore;\n authToken?: string;\n}\n\nexport class SecureHttpTransport {\n private client: Got;\n private options: SecureHttpTransportOptions;\n private identity: PeerIdentity | null = null;\n private keystore: SecureKeystore | null = null;\n private authManager: AuthManager | null = null;\n private authToken: string | null = null;\n private host: Host;\n private security: MeshSecurityConfig;\n\n constructor(host: Host, options: SecureHttpTransportOptions = {}) {\n this.host = host;\n this.options = {\n timeout: options.timeout ?? HEALTH_CHECK_TIMEOUT,\n retries: options.retries ?? 2,\n retryDelay: options.retryDelay ?? 1000,\n headers: options.headers ?? {},\n };\n this.identity = options.identity ?? null;\n this.keystore = options.keystore ?? null;\n this.authToken = options.authToken ?? null;\n this.security = options.security ?? DEFAULT_SECURITY_CONFIG;\n\n const protocol =\n this.security.transport.tls !== 'none' ? 'https' : 'http';\n const baseUrl = `${protocol}://${host.address}:${host.port}`;\n\n this.client = got.extend({\n prefixUrl: baseUrl,\n timeout: { request: this.options.timeout },\n retry: {\n limit: this.options.retries,\n calculateDelay: () => this.options.retryDelay!,\n },\n https: {\n rejectUnauthorized: false,\n },\n headers: {\n 'Content-Type': 'application/json',\n 'X-SkillKit-Transport': 'secure-http',\n ...this.options.headers,\n },\n });\n }\n\n async initialize(): Promise<void> {\n if (!this.identity && this.keystore) {\n this.identity = await this.keystore.loadOrCreateIdentity();\n }\n if (!this.identity) {\n this.identity = await PeerIdentity.generate();\n }\n this.authManager = new AuthManager(this.identity);\n\n if (this.security.transport.requireAuth && !this.authToken) {\n this.authToken = await this.authManager.createToken(this.host.id);\n }\n }\n\n private async getSecureHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n\n if (this.authToken) {\n headers['Authorization'] = createBearerHeader(this.authToken);\n }\n\n if (this.identity) {\n headers['X-SkillKit-Fingerprint'] = this.identity.fingerprint;\n }\n\n return headers;\n }\n\n async send(path: string, payload: unknown): Promise<TransportMessage> {\n if (!this.identity) {\n await this.initialize();\n }\n\n const message: TransportMessage = {\n id: randomUUID(),\n type: 'request',\n from: this.identity?.fingerprint ?? 'local',\n to: path,\n payload,\n timestamp: new Date().toISOString(),\n };\n\n let body: TransportMessage | SecureTransportMessage = message;\n\n if (this.identity) {\n const signature = await this.identity.signObject(message);\n body = {\n ...message,\n signature,\n senderFingerprint: this.identity.fingerprint,\n senderPublicKey: this.identity.publicKeyHex,\n nonce: randomUUID(),\n } as SecureTransportMessage;\n }\n\n const secureHeaders = await this.getSecureHeaders();\n\n const response = await this.client.post(path, {\n json: body,\n headers: secureHeaders,\n });\n\n return JSON.parse(response.body) as TransportMessage;\n }\n\n async sendMessage(\n to: string,\n type: string,\n payload: unknown\n ): Promise<TransportMessage> {\n return this.send('message', {\n to,\n type,\n payload,\n });\n }\n\n async registerPeer(registration: unknown): Promise<TransportMessage> {\n return this.send('peer/register', registration);\n }\n\n async getPeers(): Promise<TransportMessage> {\n if (!this.identity) {\n await this.initialize();\n }\n\n const secureHeaders = await this.getSecureHeaders();\n\n const response = await this.client.get('peers', {\n headers: secureHeaders,\n });\n\n return JSON.parse(response.body) as TransportMessage;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const response = await this.client.get('health', {\n headers: await this.getSecureHeaders(),\n });\n return response.statusCode === 200;\n } catch {\n return false;\n }\n }\n\n getFingerprint(): string | null {\n return this.identity?.fingerprint ?? null;\n }\n\n setAuthToken(token: string): void {\n this.authToken = token;\n }\n}\n\nexport async function sendToHostSecure(\n host: Host,\n path: string,\n payload: unknown,\n options: SecureHttpTransportOptions = {}\n): Promise<TransportMessage> {\n const transport = new SecureHttpTransport(host, options);\n await transport.initialize();\n return transport.send(path, payload);\n}\n\nexport async function broadcastToHostsSecure(\n hosts: Host[],\n path: string,\n payload: unknown,\n options: SecureHttpTransportOptions = {}\n): Promise<Map<string, TransportMessage | Error>> {\n const results = new Map<string, TransportMessage | Error>();\n\n await Promise.all(\n hosts.map(async (host) => {\n try {\n const response = await sendToHostSecure(host, path, payload, options);\n results.set(host.id, response);\n } catch (err) {\n results.set(host.id, err as Error);\n }\n })\n );\n\n return results;\n}\n\nexport function verifySecureMessage(\n message: SecureTransportMessage\n): { valid: boolean; error?: string } {\n if (!message.signature || !message.senderPublicKey || !message.senderFingerprint) {\n return { valid: false, error: 'Missing signature fields' };\n }\n\n const computedFingerprint = PeerIdentity.computeFingerprint(\n Buffer.from(message.senderPublicKey, 'hex')\n );\n\n if (computedFingerprint !== message.senderFingerprint) {\n return { valid: false, error: 'Fingerprint mismatch' };\n }\n\n return { valid: true };\n}\n"],"mappings":"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","names":["readFile","writeFile","mkdir","existsSync","join","homedir","hosts","host","peer","randomBytes","bytesToHex","hexToBytes","sha256","x25519","bytesToHex","hexToBytes","sha256","generateNonce","randomBytes","createHash","readFile","writeFile","mkdir","dirname","existsSync","readFile","writeFile","mkdir","join","homedir","existsSync","createSocket","networkInterfaces","hexToBytes","MULTICAST_ADDR","DISCOVERY_INTERVAL_MS","createSocket","getLocalIPAddress","networkInterfaces","got","randomUUID","randomUUID","WebSocket","WebSocketServer","randomUUID","randomBytes","bytesToHex","hexToBytes","readFile","writeFile","mkdir","existsSync","join","homedir","hexToBytes","WebSocket","randomUUID","WebSocketServer","got","randomUUID","got","randomUUID","initializeHostsFile","getPeerRegistry","SecureKeystore"]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@skillkit/mesh",
3
+ "version": "1.8.0",
4
+ "description": "Peer mesh network for multi-machine agent distribution",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "dependencies": {
18
+ "@noble/ed25519": "^2.1.0",
19
+ "@noble/curves": "^1.7.0",
20
+ "@noble/ciphers": "^1.0.0",
21
+ "@noble/hashes": "^1.5.0",
22
+ "jose": "^5.8.0",
23
+ "ws": "^8.16.0",
24
+ "got": "^14.2.0",
25
+ "@skillkit/core": "1.8.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/ws": "^8.5.10",
29
+ "tsup": "^8.0.1",
30
+ "typescript": "^5.3.3",
31
+ "vitest": "^1.2.0"
32
+ },
33
+ "engines": {
34
+ "node": ">=18"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/rohitg00/skillkit.git",
39
+ "directory": "packages/mesh"
40
+ },
41
+ "keywords": [
42
+ "skillkit",
43
+ "mesh",
44
+ "peer",
45
+ "network",
46
+ "distributed"
47
+ ],
48
+ "license": "Apache-2.0",
49
+ "scripts": {
50
+ "build": "tsup",
51
+ "dev": "tsup --watch",
52
+ "typecheck": "tsc --noEmit",
53
+ "test": "vitest run",
54
+ "test:watch": "vitest"
55
+ }
56
+ }