{"version":3,"sources":["../../src/observability/index.ts","../../src/observability/RouterMetrics.ts","../../src/observability/ObservabilitySnapshotBuilder.ts","../../src/state/MeshStateStore.ts","../../src/core/errors.ts","../../src/utils/fs.ts","../../src/utils/time.ts","../../src/registry/RegistryRecordTools.ts","../../src/registry/FileMeshRegistry.ts","../../src/registry/RegistrationSigner.ts","../../src/registry/redis/SimpleRedisClient.ts","../../src/registry/redis/RedisMeshRegistry.ts","../../src/registry/RegistryFactory.ts","../../src/logs/LogStore.ts","../../src/locks/LockLease.ts","../../src/locks/MemoryLockBackend.ts","../../src/locks/LockManager.ts","../../src/locks/LockErrors.ts","../../src/locks/redis/RedisLockBackend.ts","../../src/locks/LockFactory.ts","../../src/leader/LeaderElection.ts","../../src/observability/DashboardRenderer.ts","../../src/observability/DashboardCommand.ts"],"sourcesContent":["export { RouterMetrics } from './RouterMetrics.js'\nexport { ObservabilitySnapshotBuilder } from './ObservabilitySnapshotBuilder.js'\nexport { DashboardRenderer } from './DashboardRenderer.js'\nexport { DashboardCommand } from './DashboardCommand.js'\nexport type {\n  MeshDashboardBuildOptions,\n  MeshDashboardCommandOptions,\n  MeshDashboardLogEntry,\n  MeshDashboardRenderOptions,\n  MeshDashboardRouteSummary,\n  MeshDashboardServiceSummary,\n  MeshDashboardSnapshot,\n  MeshRouterMetricsSnapshot,\n  MeshRouterServiceStats\n} from './types.js'\n","import type { MeshConnectionCounters } from '../core/types.js'\nimport type { MeshRouterMetricsSnapshot, MeshRouterServiceStats } from './types.js'\n\ninterface MutableServiceStats {\n  service: string\n  requests: number\n  upgrades: number\n  errors: number\n}\n\nexport class RouterMetrics {\n  private readonly startedAt = new Date()\n  private requestsTotal = 0\n  private proxiedTotal = 0\n  private noTargetTotal = 0\n  private errorsTotal = 0\n  private upgradesTotal = 0\n  private readonly services = new Map<string, MutableServiceStats>()\n\n  public recordProxy(service: string): void {\n    this.requestsTotal += 1\n    this.proxiedTotal += 1\n    this.service(service).requests += 1\n  }\n\n  public recordUpgrade(service: string): void {\n    this.requestsTotal += 1\n    this.proxiedTotal += 1\n    this.upgradesTotal += 1\n    const stats = this.service(service)\n    stats.requests += 1\n    stats.upgrades += 1\n  }\n\n  public recordNoTarget(): void {\n    this.requestsTotal += 1\n    this.noTargetTotal += 1\n  }\n\n  public recordError(service?: string): void {\n    this.errorsTotal += 1\n    if (service) this.service(service).errors += 1\n  }\n\n  public snapshot(active: MeshConnectionCounters, serviceActive: ReadonlyMap<string, MeshConnectionCounters>, draining: boolean): MeshRouterMetricsSnapshot {\n    const services: MeshRouterServiceStats[] = []\n    for (const stats of this.services.values()) {\n      services.push({\n        service: stats.service,\n        requests: stats.requests,\n        upgrades: stats.upgrades,\n        errors: stats.errors,\n        active: serviceActive.get(stats.service) ?? { http: 0, sockets: 0, total: 0 }\n      })\n    }\n    services.sort((a, b) => a.service.localeCompare(b.service))\n    return {\n      router: {\n        startedAt: this.startedAt.toISOString(),\n        uptimeMs: Date.now() - this.startedAt.getTime(),\n        draining\n      },\n      requests: {\n        total: this.requestsTotal,\n        proxied: this.proxiedTotal,\n        noTarget: this.noTargetTotal,\n        errors: this.errorsTotal,\n        upgrades: this.upgradesTotal\n      },\n      active,\n      services\n    }\n  }\n\n  private service(service: string): MutableServiceStats {\n    const existing = this.services.get(service)\n    if (existing) return existing\n    const created: MutableServiceStats = { service, requests: 0, upgrades: 0, errors: 0 }\n    this.services.set(service, created)\n    return created\n  }\n}\n","import http from 'node:http'\nimport type { MeshInstanceRecord, NormalizedMeshConfig } from '../core/types.js'\nimport { RegistryFactory } from '../registry/RegistryFactory.js'\nimport { LogStore } from '../logs/LogStore.js'\nimport type { MeshRegistry } from '../registry/types.js'\nimport { LockFactory } from '../locks/LockFactory.js'\nimport { LeaderElection } from '../leader/LeaderElection.js'\nimport type { MeshDashboardBuildOptions, MeshDashboardLogEntry, MeshDashboardRouteSummary, MeshDashboardServiceSummary, MeshDashboardSnapshot, MeshRouterMetricsSnapshot } from './types.js'\n\nexport class ObservabilitySnapshotBuilder {\n  private readonly registry: MeshRegistry\n  private readonly logs: LogStore\n\n  public constructor(private readonly config: NormalizedMeshConfig) {\n    this.registry = new RegistryFactory().create(config)\n    this.logs = new LogStore(config.runtime.logsDir)\n  }\n\n  public async build(options: MeshDashboardBuildOptions = {}): Promise<MeshDashboardSnapshot> {\n    const instances = await this.registry.list({ includeExpired: true })\n    const routerUrl = `http://${this.config.router.host}:${this.config.router.port}`\n    const metricsPath = `${this.config.observability.path}/metrics`\n    const metrics = await this.readRouterMetrics(`${routerUrl}${metricsPath}`)\n    const serviceSummaries = this.serviceSummaries(instances)\n    const routes = this.routeSummaries()\n    const logs = options.includeLogs ? await this.readLogs(instances, options.logLines ?? this.config.observability.logLines) : undefined\n    const coordination = await this.readCoordination()\n\n    return {\n      app: this.config.app,\n      generatedAt: new Date().toISOString(),\n      projectRoot: this.config.projectRoot,\n      router: {\n        enabled: this.config.router.enabled,\n        url: routerUrl,\n        metricsPath,\n        ...(metrics.ok ? { metrics: metrics.value } : { metricsError: metrics.error })\n      },\n      registry: {\n        type: this.config.registry.type,\n        ttlMs: this.config.registry.ttlMs,\n        heartbeatIntervalMs: this.config.registry.heartbeatIntervalMs\n      },\n      streaming: {\n        enabled: this.config.streaming.enabled,\n        transport: this.config.streaming.transport,\n        logs: this.config.streaming.logs,\n        events: this.config.streaming.events,\n        keyPrefix: this.config.streaming.keyPrefix\n      },\n      services: serviceSummaries,\n      instances,\n      routes,\n      coordination,\n      hsm: {\n        enabled: this.config.hsm.enabled,\n        routeCount: this.config.hsm.routes.length,\n        ...(this.config.hsm.schema?.id !== undefined ? { schemaId: this.config.hsm.schema.id } : {}),\n        ...(this.config.hsm.schema?.version !== undefined ? { schemaVersion: this.config.hsm.schema.version } : {})\n      },\n      ...(logs ? { logs } : {})\n    }\n  }\n\n  private serviceSummaries(instances: readonly MeshInstanceRecord[]): readonly MeshDashboardServiceSummary[] {\n    const summaries: MeshDashboardServiceSummary[] = []\n    for (const service of this.config.services.values()) {\n      const owned = instances.filter(instance => instance.service === service.name)\n      summaries.push({\n        service: service.name,\n        type: service.type,\n        strategy: service.strategy,\n        configuredInstances: service.instances,\n        running: owned.filter(instance => instance.status === 'running' || instance.status === 'starting').length,\n        draining: owned.filter(instance => instance.status === 'draining').length,\n        expired: owned.filter(instance => instance.status === 'expired').length,\n        failed: owned.filter(instance => instance.status === 'failed').length,\n        routes: service.routes\n      })\n    }\n    summaries.sort((a, b) => a.service.localeCompare(b.service))\n    return summaries\n  }\n\n  private routeSummaries(): readonly MeshDashboardRouteSummary[] {\n    const routes: MeshDashboardRouteSummary[] = []\n    for (const service of this.config.services.values()) {\n      const hsmRoutes = new Set(service.hsmRoutes.map(route => route.route))\n      for (const route of service.routes) {\n        if (hsmRoutes.has(route)) continue\n        routes.push({ service: service.name, route, source: 'config' })\n      }\n      for (const route of service.hsmRoutes) {\n        routes.push({ service: service.name, route: route.route, source: route.source, stateId: route.stateId })\n      }\n    }\n    routes.sort((a, b) => b.route.length - a.route.length || a.service.localeCompare(b.service) || a.route.localeCompare(b.route))\n    return routes\n  }\n\n\n  private async readCoordination() {\n    if (!this.config.coordination.enabled) {\n      return { enabled: false, backend: this.config.coordination.backend, locks: [], leaders: [] }\n    }\n    try {\n      const locks = new LockFactory().createManager(this.config, 'dashboard')\n      const leader = new LeaderElection(locks, 'dashboard')\n      return {\n        enabled: true,\n        backend: this.config.coordination.locks.backend,\n        locks: await locks.list(),\n        leaders: await leader.list()\n      }\n    } catch (error) {\n      return {\n        enabled: true,\n        backend: this.config.coordination.locks.backend,\n        locks: [],\n        leaders: [],\n        errors: [error instanceof Error ? error.message : String(error)]\n      }\n    }\n  }\n\n  private async readLogs(instances: readonly MeshInstanceRecord[], lines: number): Promise<readonly MeshDashboardLogEntry[]> {\n    const selected = instances\n      .filter(instance => instance.logFile)\n      .sort((a, b) => a.service.localeCompare(b.service) || a.id.localeCompare(b.id))\n    const output: MeshDashboardLogEntry[] = []\n    for (const instance of selected) {\n      const text = await this.logs.readLastLines(instance.logFile, lines)\n      output.push({ instanceId: instance.id, service: instance.service, logFile: instance.logFile, text })\n    }\n    return output\n  }\n\n  private async readRouterMetrics(url: string): Promise<{ ok: true; value: MeshRouterMetricsSnapshot } | { ok: false; error: string }> {\n    return await new Promise(resolve => {\n      const request = http.request(url, { method: 'GET', timeout: 750 }, response => {\n        let body = ''\n        response.setEncoding('utf8')\n        response.on('data', chunk => { body += String(chunk) })\n        response.on('end', () => {\n          try {\n            if ((response.statusCode ?? 500) < 200 || (response.statusCode ?? 500) >= 300) {\n              resolve({ ok: false, error: `router metrics returned HTTP ${response.statusCode ?? 'unknown'}` })\n              return\n            }\n            resolve({ ok: true, value: JSON.parse(body) as MeshRouterMetricsSnapshot })\n          } catch (error) {\n            resolve({ ok: false, error: error instanceof Error ? error.message : String(error) })\n          }\n        })\n      })\n      request.once('timeout', () => {\n        request.destroy()\n        resolve({ ok: false, error: 'router metrics timed out' })\n      })\n      request.once('error', error => resolve({ ok: false, error: error.message }))\n      request.end()\n    })\n  }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { MeshStateError } from '../core/errors.js'\nimport type { MeshInstanceRecord, MeshStateFile } from '../core/types.js'\nimport { atomicWriteJson, ensureDir, pathExists } from '../utils/fs.js'\nimport { nowIso } from '../utils/time.js'\n\nexport class MeshStateStore {\n  public constructor(\n    private readonly app: string,\n    private readonly stateDir: string\n  ) {}\n\n  public get statePath(): string {\n    return path.join(this.stateDir, 'state.json')\n  }\n\n  public async read(): Promise<MeshStateFile> {\n    if (!(await pathExists(this.statePath))) {\n      return this.empty()\n    }\n    try {\n      const text = await fs.promises.readFile(this.statePath, 'utf8')\n      const parsed = this.parseState(text)\n      if (parsed.version !== 1) throw new MeshStateError(`Unsupported mesh state version: ${String(parsed.version)}`)\n      return parsed\n    } catch (error) {\n      if (error instanceof SyntaxError) {\n        const recovered = await this.recoverCorruptedState()\n        if (recovered) return recovered\n      }\n      if (error instanceof MeshStateError) throw error\n      throw new MeshStateError(`Failed to read mesh state: ${(error as Error).message}`)\n    }\n  }\n\n  public async write(instances: readonly MeshInstanceRecord[]): Promise<void> {\n    await ensureDir(this.stateDir)\n    await atomicWriteJson(this.statePath, {\n      version: 1,\n      app: this.app,\n      updatedAt: nowIso(),\n      instances\n    } satisfies MeshStateFile)\n  }\n\n  public async upsert(instance: MeshInstanceRecord): Promise<void> {\n    const state = await this.read()\n    const others = state.instances.filter(item => item.id !== instance.id)\n    await this.write([...others, instance])\n  }\n\n  public async update(instanceId: string, patch: Partial<MeshInstanceRecord>): Promise<MeshInstanceRecord> {\n    const state = await this.read()\n    const current = state.instances.find(item => item.id === instanceId)\n    if (!current) throw new MeshStateError(`Instance not found in state: ${instanceId}`)\n    const next = { ...current, ...patch } as MeshInstanceRecord\n    await this.write(state.instances.map(item => item.id === instanceId ? next : item))\n    return next\n  }\n\n  public async remove(instanceIds: readonly string[]): Promise<void> {\n    const set = new Set(instanceIds)\n    const state = await this.read()\n    await this.write(state.instances.filter(instance => !set.has(instance.id)))\n  }\n\n  public empty(): MeshStateFile {\n    return {\n      version: 1,\n      app: this.app,\n      updatedAt: nowIso(),\n      instances: []\n    }\n  }\n\n  private parseState(text: string): MeshStateFile {\n    return JSON.parse(text) as MeshStateFile\n  }\n\n  private async recoverCorruptedState(): Promise<MeshStateFile | null> {\n    const text = await fs.promises.readFile(this.statePath, 'utf8')\n    const prefix = this.extractRootJsonPrefix(text)\n    if (!prefix) return null\n\n    try {\n      const parsed = this.parseState(prefix)\n      if (parsed.version !== 1) throw new MeshStateError(`Unsupported mesh state version: ${String(parsed.version)}`)\n      await atomicWriteJson(this.statePath, parsed)\n      return parsed\n    } catch {\n      return null\n    }\n  }\n\n  private extractRootJsonPrefix(text: string): string | null {\n    const start = text.search(/\\s*[{[]/)\n    if (start < 0) return null\n\n    let depth = 0\n    let inString = false\n    let escaped = false\n\n    for (let index = start; index < text.length; index += 1) {\n      const char = text[index]\n\n      if (inString) {\n        if (escaped) {\n          escaped = false\n          continue\n        }\n        if (char === '\\\\') {\n          escaped = true\n          continue\n        }\n        if (char === '\"') inString = false\n        continue\n      }\n\n      if (char === '\"') {\n        inString = true\n        continue\n      }\n\n      if (char === '{' || char === '[') {\n        depth += 1\n        continue\n      }\n\n      if (char === '}' || char === ']') {\n        depth -= 1\n        if (depth === 0) {\n          return text.slice(start, index + 1)\n        }\n      }\n    }\n\n    return null\n  }\n}\n","export class MeshError extends Error {\n  public constructor(message: string) {\n    super(message)\n    this.name = new.target.name\n  }\n}\n\nexport class MeshConfigError extends MeshError {}\nexport class MeshStateError extends MeshError {}\nexport class MeshProcessError extends MeshError {}\nexport class MeshIdResolutionError extends MeshError {}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport async function ensureDir(dir: string): Promise<void> {\n  await fs.promises.mkdir(dir, { recursive: true })\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n  try {\n    await fs.promises.access(filePath)\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {\n  await ensureDir(path.dirname(filePath))\n  const tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`\n  await fs.promises.writeFile(tempPath, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n  await fs.promises.rename(tempPath, filePath)\n}\n","export function nowIso(): string {\n  return new Date().toISOString()\n}\n\nexport function formatDurationSince(iso: string): string {\n  const started = new Date(iso).getTime()\n  const diff = Math.max(0, Date.now() - started)\n  const seconds = Math.floor(diff / 1000)\n  if (seconds < 60) return `${seconds}s`\n  const minutes = Math.floor(seconds / 60)\n  if (minutes < 60) return `${minutes}m`\n  const hours = Math.floor(minutes / 60)\n  if (hours < 24) return `${hours}h`\n  const days = Math.floor(hours / 24)\n  return `${days}d`\n}\n\nexport async function sleep(ms: number): Promise<void> {\n  if (ms <= 0) return\n  await new Promise<void>(resolve => setTimeout(resolve, ms))\n}\n","import type { MeshInstanceRecord, MeshInstanceStatus } from '../core/types.js'\n\nexport class RegistryRecordTools {\n  public static touch(instance: MeshInstanceRecord, ttlMs: number, now = Date.now()): MeshInstanceRecord {\n    return {\n      ...instance,\n      status: instance.status === 'expired' ? 'running' : instance.status,\n      lastSeenAt: new Date(now).toISOString(),\n      expiresAt: new Date(now + ttlMs).toISOString()\n    }\n  }\n\n  public static markExpired(instance: MeshInstanceRecord, now = Date.now()): MeshInstanceRecord {\n    if (!this.isExpired(instance, now)) return instance\n    return { ...instance, status: 'expired' as MeshInstanceStatus }\n  }\n\n  public static isExpired(instance: MeshInstanceRecord, now = Date.now()): boolean {\n    if (!instance.expiresAt) return false\n    return new Date(instance.expiresAt).getTime() <= now\n  }\n\n  public static isRoutable(instance: MeshInstanceRecord, now = Date.now()): boolean {\n    return instance.status === 'running'\n      && instance.url !== null\n      && instance.serviceType !== 'worker'\n      && instance.serviceType !== 'router'\n      && !this.isExpired(instance, now)\n  }\n}\n","import type { MeshInstanceRecord } from '../core/types.js'\nimport { MeshStateStore } from '../state/MeshStateStore.js'\nimport type { MeshRegistry, MeshRegistryHeartbeatOptions, MeshRegistryListOptions, MeshRegistryRegisterOptions } from './types.js'\nimport { RegistryRecordTools } from './RegistryRecordTools.js'\n\nexport class FileMeshRegistry implements MeshRegistry {\n  public readonly kind = 'file'\n  private readonly store: MeshStateStore\n\n  public constructor(app: string, stateDir: string) {\n    this.store = new MeshStateStore(app, stateDir)\n  }\n\n  public async register(instance: MeshInstanceRecord, options: MeshRegistryRegisterOptions = {}): Promise<MeshInstanceRecord> {\n    const record = options.ttlMs ? RegistryRecordTools.touch(instance, options.ttlMs) : instance\n    await this.store.upsert(record)\n    return record\n  }\n\n  public async heartbeat(instanceId: string, options: MeshRegistryHeartbeatOptions = {}): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    const patched = { ...current, ...(options.patch ?? {}) } as MeshInstanceRecord\n    const next = options.ttlMs ? RegistryRecordTools.touch(patched, options.ttlMs) : patched\n    await this.store.upsert(next)\n    return next\n  }\n\n  public async list(options: MeshRegistryListOptions = {}): Promise<readonly MeshInstanceRecord[]> {\n    const state = await this.store.read()\n    const refreshed = state.instances.map(instance => RegistryRecordTools.markExpired(instance))\n    if (refreshed.some((instance, index) => instance !== state.instances[index])) {\n      await this.store.write(refreshed)\n    }\n    return refreshed.filter(instance => {\n      if (options.service && instance.service !== options.service) return false\n      if (!options.includeExpired && instance.status === 'expired') return false\n      return true\n    })\n  }\n\n  public async get(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const state = await this.store.read()\n    return state.instances.find(instance => instance.id === instanceId) ?? null\n  }\n\n  public async markDraining(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    const next = { ...current, status: 'draining' as const }\n    await this.store.upsert(next)\n    return next\n  }\n\n  public async unregister(instanceId: string): Promise<void> {\n    await this.store.remove([instanceId])\n  }\n}\n","import crypto from 'node:crypto'\nimport type { MeshInstanceRecord } from '../core/types.js'\n\nexport interface RegistrationSignaturePayload {\n  readonly app: string\n  readonly id: string\n  readonly service: string\n  readonly serviceType: string\n  readonly url: string | null\n  readonly pid: number | null\n  readonly issuedAt: string\n}\n\nexport class RegistrationSigner {\n  public constructor(\n    private readonly app: string,\n    private readonly secret: string\n  ) {}\n\n  public sign(instance: MeshInstanceRecord, issuedAt = new Date().toISOString()): string {\n    return this.hmac(this.payload(instance, issuedAt))\n  }\n\n  public attach(instance: MeshInstanceRecord, issuedAt = new Date().toISOString()): MeshInstanceRecord {\n    const signature = this.sign(instance, issuedAt)\n    return {\n      ...instance,\n      metadata: {\n        ...(instance.metadata ?? {}),\n        registration: {\n          app: this.app,\n          issuedAt,\n          signature\n        }\n      }\n    }\n  }\n\n  public verify(instance: MeshInstanceRecord): boolean {\n    const registration = this.registration(instance)\n    if (!registration) return false\n    const expected = this.sign(instance, registration.issuedAt)\n    return this.safeEqual(expected, registration.signature)\n  }\n\n  private payload(instance: MeshInstanceRecord, issuedAt: string): RegistrationSignaturePayload {\n    return {\n      app: this.app,\n      id: instance.id,\n      service: instance.service,\n      serviceType: instance.serviceType,\n      url: instance.url,\n      pid: instance.pid,\n      issuedAt\n    }\n  }\n\n  private hmac(payload: RegistrationSignaturePayload): string {\n    return crypto.createHmac('sha256', this.secret).update(JSON.stringify(payload)).digest('base64url')\n  }\n\n  private registration(instance: MeshInstanceRecord): { issuedAt: string; signature: string } | null {\n    const value = instance.metadata?.registration\n    if (!value || typeof value !== 'object') return null\n    const record = value as Record<string, unknown>\n    if (record.app !== this.app || typeof record.issuedAt !== 'string' || typeof record.signature !== 'string') return null\n    return { issuedAt: record.issuedAt, signature: record.signature }\n  }\n\n  private safeEqual(a: string, b: string): boolean {\n    const left = Buffer.from(a)\n    const right = Buffer.from(b)\n    return left.length === right.length && crypto.timingSafeEqual(left, right)\n  }\n}\n","import net from 'node:net'\nimport tls from 'node:tls'\n\nexport type RedisCommandArg = string | number\n\nexport interface SimpleRedisClientOptions {\n  readonly url: string\n  readonly connectTimeoutMs?: number\n}\n\nexport class SimpleRedisClient {\n  private readonly url: URL\n  private readonly timeoutMs: number\n\n  public constructor(options: SimpleRedisClientOptions) {\n    this.url = new URL(options.url)\n    this.timeoutMs = options.connectTimeoutMs ?? 5_000\n  }\n\n  public async command(args: readonly RedisCommandArg[]): Promise<unknown> {\n    const socket = await this.connect()\n    try {\n      const reader = new RespReader(socket)\n      socket.write(this.encode(args))\n      return await reader.read()\n    } finally {\n      socket.end()\n    }\n  }\n\n  private async connect(): Promise<net.Socket> {\n    const port = Number(this.url.port || (this.url.protocol === 'rediss:' ? 6380 : 6379))\n    const host = this.url.hostname || '127.0.0.1'\n    const socket = this.url.protocol === 'rediss:' ? tls.connect({ port, host }) : net.connect({ port, host })\n\n    await new Promise<void>((resolve, reject) => {\n      const timer = setTimeout(() => {\n        socket.destroy(new Error('Redis connection timed out.'))\n      }, this.timeoutMs)\n      socket.once('connect', () => {\n        clearTimeout(timer)\n        resolve()\n      })\n      socket.once('error', error => {\n        clearTimeout(timer)\n        reject(error)\n      })\n    })\n\n    if (this.url.password) {\n      if (this.url.username) await this.commandOnSocket(socket, ['AUTH', decodeURIComponent(this.url.username), decodeURIComponent(this.url.password)])\n      else await this.commandOnSocket(socket, ['AUTH', decodeURIComponent(this.url.password)])\n    }\n\n    const db = this.url.pathname.replace(/^\\//, '')\n    if (db) await this.commandOnSocket(socket, ['SELECT', db])\n    return socket\n  }\n\n  private async commandOnSocket(socket: net.Socket, args: readonly RedisCommandArg[]): Promise<unknown> {\n    const reader = new RespReader(socket)\n    socket.write(this.encode(args))\n    return reader.read()\n  }\n\n  private encode(args: readonly RedisCommandArg[]): string {\n    return `*${args.length}\\r\\n${args.map(arg => {\n      const value = String(arg)\n      return `$${Buffer.byteLength(value)}\\r\\n${value}\\r\\n`\n    }).join('')}`\n  }\n}\n\nclass RespReader {\n  private buffer = Buffer.alloc(0)\n  private waiters: Array<() => void> = []\n\n  public constructor(private readonly socket: net.Socket) {\n    socket.on('data', chunk => {\n      this.buffer = Buffer.concat([this.buffer, chunk])\n      for (const waiter of this.waiters.splice(0)) waiter()\n    })\n  }\n\n  public async read(): Promise<unknown> {\n    while (true) {\n      const parsed = this.tryParse(0)\n      if (parsed) {\n        this.buffer = this.buffer.subarray(parsed.offset)\n        if (parsed.value instanceof RedisError) throw parsed.value\n        return parsed.value\n      }\n      await new Promise<void>((resolve, reject) => {\n        const onError = (error: Error): void => {\n          cleanup()\n          reject(error)\n        }\n        const onClose = (): void => {\n          cleanup()\n          reject(new Error('Redis socket closed before response.'))\n        }\n        const wake = (): void => {\n          cleanup()\n          resolve()\n        }\n        const cleanup = (): void => {\n          this.socket.off('error', onError)\n          this.socket.off('close', onClose)\n          const index = this.waiters.indexOf(wake)\n          if (index >= 0) this.waiters.splice(index, 1)\n        }\n        this.socket.once('error', onError)\n        this.socket.once('close', onClose)\n        this.waiters.push(wake)\n      })\n    }\n  }\n\n  private tryParse(offset: number): { value: unknown; offset: number } | null {\n    if (offset >= this.buffer.length) return null\n    const type = String.fromCharCode(this.buffer[offset]!)\n    const line = this.readLine(offset + 1)\n    if (!line) return null\n\n    if (type === '+') return { value: line.text, offset: line.offset }\n    if (type === '-') return { value: new RedisError(line.text), offset: line.offset }\n    if (type === ':') return { value: Number(line.text), offset: line.offset }\n    if (type === '$') {\n      const length = Number(line.text)\n      if (length === -1) return { value: null, offset: line.offset }\n      const end = line.offset + length\n      if (this.buffer.length < end + 2) return null\n      return { value: this.buffer.subarray(line.offset, end).toString('utf8'), offset: end + 2 }\n    }\n    if (type === '*') {\n      const count = Number(line.text)\n      if (count === -1) return { value: null, offset: line.offset }\n      const values: unknown[] = []\n      let current = line.offset\n      for (let index = 0; index < count; index += 1) {\n        const item = this.tryParse(current)\n        if (!item) return null\n        values.push(item.value)\n        current = item.offset\n      }\n      return { value: values, offset: current }\n    }\n    return null\n  }\n\n  private readLine(offset: number): { text: string; offset: number } | null {\n    const end = this.buffer.indexOf('\\r\\n', offset)\n    if (end < 0) return null\n    return { text: this.buffer.subarray(offset, end).toString('utf8'), offset: end + 2 }\n  }\n}\n\nclass RedisError extends Error {\n  public constructor(message: string) {\n    super(message)\n    this.name = 'RedisError'\n  }\n}\n","import type { MeshInstanceRecord } from '../../core/types.js'\nimport type { MeshRegistry, MeshRegistryHeartbeatOptions, MeshRegistryListOptions, MeshRegistryRegisterOptions } from '../types.js'\nimport { RegistryRecordTools } from '../RegistryRecordTools.js'\nimport { RegistrationSigner } from '../RegistrationSigner.js'\nimport { SimpleRedisClient, type SimpleRedisClientOptions } from './SimpleRedisClient.js'\n\nexport interface RedisMeshRegistryOptions extends SimpleRedisClientOptions {\n  readonly app: string\n  readonly secret?: string\n  readonly keyPrefix?: string\n  readonly requireSignature?: boolean\n}\n\nexport class RedisMeshRegistry implements MeshRegistry {\n  public readonly kind = 'redis'\n  private readonly client: SimpleRedisClient\n  private readonly prefix: string\n  private readonly signer: RegistrationSigner | undefined\n  private readonly requireSignature: boolean\n\n  public constructor(private readonly options: RedisMeshRegistryOptions) {\n    this.client = new SimpleRedisClient(options)\n    this.prefix = options.keyPrefix ?? `mesh:${options.app}`\n    this.signer = options.secret ? new RegistrationSigner(options.app, options.secret) : undefined\n    this.requireSignature = options.requireSignature ?? Boolean(options.secret)\n  }\n\n  public async register(instance: MeshInstanceRecord, options: MeshRegistryRegisterOptions = {}): Promise<MeshInstanceRecord> {\n    const ttlMs = options.ttlMs ?? 15_000\n    const touched = RegistryRecordTools.touch(instance, ttlMs)\n    const signed = this.signer ? this.signer.attach(touched) : touched\n    await this.client.command(['SADD', this.indexKey(), signed.id])\n    await this.client.command(['SET', this.instanceKey(signed.id), JSON.stringify(signed), 'PX', ttlMs])\n    return signed\n  }\n\n  public async heartbeat(instanceId: string, options: MeshRegistryHeartbeatOptions = {}): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    const ttlMs = options.ttlMs ?? this.remainingTtl(current) ?? 15_000\n    const patched = { ...current, ...(options.patch ?? {}) } as MeshInstanceRecord\n    const touched = RegistryRecordTools.touch(patched, ttlMs)\n    const signed = this.signer ? this.signer.attach(touched) : touched\n    await this.client.command(['SET', this.instanceKey(instanceId), JSON.stringify(signed), 'PX', ttlMs])\n    return signed\n  }\n\n  public async list(options: MeshRegistryListOptions = {}): Promise<readonly MeshInstanceRecord[]> {\n    const ids = await this.ids()\n    const items = await Promise.all(ids.map(id => this.get(id)))\n    const now = Date.now()\n    const alive: MeshInstanceRecord[] = []\n    const staleIds: string[] = []\n\n    for (let index = 0; index < ids.length; index += 1) {\n      const id = ids[index]!\n      const item = items[index]\n      if (!item) {\n        staleIds.push(id)\n        continue\n      }\n      const refreshed = RegistryRecordTools.markExpired(item, now)\n      if (options.service && refreshed.service !== options.service) continue\n      if (!options.includeExpired && refreshed.status === 'expired') continue\n      alive.push(refreshed)\n    }\n\n    if (staleIds.length > 0) await this.client.command(['SREM', this.indexKey(), ...staleIds])\n    return alive\n  }\n\n  public async get(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const raw = await this.client.command(['GET', this.instanceKey(instanceId)])\n    if (typeof raw !== 'string') return null\n    const parsed = JSON.parse(raw) as MeshInstanceRecord\n    if (this.requireSignature && (!this.signer || !this.signer.verify(parsed))) return null\n    return parsed\n  }\n\n  public async markDraining(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    return this.heartbeat(instanceId, { patch: { status: 'draining' } })\n  }\n\n  public async unregister(instanceId: string): Promise<void> {\n    await this.client.command(['DEL', this.instanceKey(instanceId)])\n    await this.client.command(['SREM', this.indexKey(), instanceId])\n  }\n\n  private async ids(): Promise<readonly string[]> {\n    const value = await this.client.command(['SMEMBERS', this.indexKey()])\n    return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []\n  }\n\n  private remainingTtl(instance: MeshInstanceRecord): number | null {\n    if (!instance.expiresAt) return null\n    return Math.max(1_000, new Date(instance.expiresAt).getTime() - Date.now())\n  }\n\n  private indexKey(): string {\n    return `${this.prefix}:instances`\n  }\n\n  private instanceKey(id: string): string {\n    return `${this.prefix}:instance:${id}`\n  }\n}\n","import { FileMeshRegistry } from './FileMeshRegistry.js'\nimport type { MeshRegistry } from './types.js'\nimport type { NormalizedMeshConfig } from '../core/types.js'\nimport { RedisMeshRegistry } from './redis/RedisMeshRegistry.js'\n\nexport class RegistryFactory {\n  public create(config: NormalizedMeshConfig): MeshRegistry {\n    if (config.registry.type === 'file') {\n      return new FileMeshRegistry(config.app, config.runtime.stateDir)\n    }\n    return new RedisMeshRegistry({\n      app: config.app,\n      url: config.registry.url,\n      ...(config.registry.keyPrefix !== undefined ? { keyPrefix: config.registry.keyPrefix } : {}),\n      ...(config.registry.secret !== undefined ? { secret: config.registry.secret } : {}),\n      requireSignature: config.registry.requireSignature,\n      connectTimeoutMs: config.registry.connectTimeoutMs\n    })\n  }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { ensureDir } from '../utils/fs.js'\n\nexport class LogStore {\n  public constructor(private readonly logsDir: string) {}\n\n  public getLogPath(instanceId: string): string {\n    return path.join(this.logsDir, `${instanceId}.log`)\n  }\n\n  public async createStream(instanceId: string): Promise<fs.WriteStream> {\n    await ensureDir(this.logsDir)\n    return fs.createWriteStream(this.getLogPath(instanceId), { flags: 'a' })\n  }\n\n  public async readLastLines(logFile: string, lines: number): Promise<string> {\n    try {\n      const text = await fs.promises.readFile(logFile, 'utf8')\n      return text.split(/\\r?\\n/).slice(-Math.max(1, lines)).join('\\n')\n    } catch {\n      return ''\n    }\n  }\n\n  public tail(logFile: string, onChunk: (chunk: string) => void): () => void {\n    let position = 0\n    let closed = false\n\n    const readNew = async (): Promise<void> => {\n      if (closed) return\n      try {\n        const stat = await fs.promises.stat(logFile)\n        if (stat.size < position) position = 0\n        if (stat.size === position) return\n        const handle = await fs.promises.open(logFile, 'r')\n        const buffer = Buffer.alloc(stat.size - position)\n        await handle.read(buffer, 0, buffer.length, position)\n        await handle.close()\n        position = stat.size\n        onChunk(buffer.toString('utf8'))\n      } catch {\n        // log file can be created after tail starts\n      }\n    }\n\n    void readNew()\n    const interval = setInterval(() => void readNew(), 500)\n    return () => {\n      closed = true\n      clearInterval(interval)\n    }\n  }\n}\n","import type { MeshLockBackend, MeshLockLease as MeshLockLeaseContract } from './types.js'\n\nexport class LockLease implements MeshLockLeaseContract {\n  public constructor(\n    private readonly backend: MeshLockBackend,\n    public readonly key: string,\n    public readonly ownerId: string,\n    public readonly acquiredAt: string,\n    public readonly expiresAt: string\n  ) {}\n\n  public async renew(ttlMs = 30_000): Promise<boolean> {\n    return this.backend.renew(this.key, this.ownerId, ttlMs)\n  }\n\n  public async release(): Promise<boolean> {\n    return this.backend.release(this.key, this.ownerId)\n  }\n}\n","import { LockLease } from './LockLease.js'\nimport type { MeshLockAcquireOptions, MeshLockBackend, MeshLockLease, MeshLockRecord } from './types.js'\n\nexport class MemoryLockBackend implements MeshLockBackend {\n  public readonly kind = 'memory'\n  private readonly locks = new Map<string, MeshLockRecord>()\n\n  public async acquire(key: string, ownerId: string, options: MeshLockAcquireOptions = {}): Promise<MeshLockLease | null> {\n    this.pruneExpired()\n    if (this.locks.has(key)) return null\n    const ttlMs = options.ttlMs ?? 30_000\n    const acquiredAt = new Date().toISOString()\n    const expiresAt = new Date(Date.now() + ttlMs).toISOString()\n    const record: MeshLockRecord = { key, ownerId, acquiredAt, expiresAt, ...(options.metadata ? { metadata: options.metadata } : {}) }\n    this.locks.set(key, record)\n    return new LockLease(this, key, ownerId, acquiredAt, expiresAt)\n  }\n\n  public async renew(key: string, ownerId: string, ttlMs: number): Promise<boolean> {\n    this.pruneExpired()\n    const current = this.locks.get(key)\n    if (!current || current.ownerId !== ownerId) return false\n    this.locks.set(key, { ...current, expiresAt: new Date(Date.now() + ttlMs).toISOString() })\n    return true\n  }\n\n  public async release(key: string, ownerId: string): Promise<boolean> {\n    this.pruneExpired()\n    const current = this.locks.get(key)\n    if (!current || current.ownerId !== ownerId) return false\n    this.locks.delete(key)\n    return true\n  }\n\n  public async list(): Promise<readonly MeshLockRecord[]> {\n    this.pruneExpired()\n    return Array.from(this.locks.values()).sort((a, b) => a.key.localeCompare(b.key))\n  }\n\n  private pruneExpired(): void {\n    const now = Date.now()\n    for (const [key, record] of this.locks) {\n      if (new Date(record.expiresAt).getTime() <= now) this.locks.delete(key)\n    }\n  }\n}\n","import { randomUUID } from 'node:crypto'\nimport { sleep } from '../utils/time.js'\nimport { MeshLockTimeoutError } from './LockErrors.js'\nimport type { MeshLockAcquireOptions, MeshLockBackend, MeshLockLease, MeshLockRecord, MeshLockRunOptions } from './types.js'\n\nexport class LockManager {\n  private readonly ownerId: string\n\n  public constructor(private readonly backend: MeshLockBackend, ownerId?: string) {\n    this.ownerId = ownerId ?? `mesh-${process.pid}-${randomUUID()}`\n  }\n\n  public async tryAcquire(key: string, options: MeshLockAcquireOptions = {}): Promise<MeshLockLease | null> {\n    return this.backend.acquire(key, this.ownerId, options)\n  }\n\n  public async acquire(key: string, options: MeshLockAcquireOptions = {}): Promise<MeshLockLease> {\n    const waitMs = options.waitMs ?? 0\n    const retryMs = options.retryMs ?? 250\n    const deadline = Date.now() + waitMs\n    while (true) {\n      const lease = await this.tryAcquire(key, options)\n      if (lease) return lease\n      if (Date.now() >= deadline) throw new MeshLockTimeoutError(key)\n      await sleep(Math.min(retryMs, Math.max(1, deadline - Date.now())))\n    }\n  }\n\n  public async runExclusive<T>(key: string, fn: (lease: MeshLockLease) => Promise<T> | T, options: MeshLockRunOptions = {}): Promise<T> {\n    const lease = await this.acquire(key, options)\n    const ttlMs = options.ttlMs ?? 30_000\n    let stopped = false\n    let timer: NodeJS.Timeout | null = null\n    if (options.autoRenew ?? true) {\n      const every = options.renewEveryMs ?? Math.max(1_000, Math.floor(ttlMs / 2))\n      timer = setInterval(() => { if (!stopped) void lease.renew(ttlMs) }, every)\n      timer.unref?.()\n    }\n    try {\n      return await fn(lease)\n    } finally {\n      stopped = true\n      if (timer) clearInterval(timer)\n      await lease.release()\n    }\n  }\n\n  public list(): Promise<readonly MeshLockRecord[]> {\n    return this.backend.list()\n  }\n}\n","export class MeshLockError extends Error {\n  public constructor(message: string) {\n    super(message)\n    this.name = 'MeshLockError'\n  }\n}\n\nexport class MeshLockTimeoutError extends MeshLockError {\n  public constructor(key: string) {\n    super(`Timed out waiting for mesh lock \"${key}\".`)\n    this.name = 'MeshLockTimeoutError'\n  }\n}\n","import { SimpleRedisClient, type SimpleRedisClientOptions } from '../../registry/redis/SimpleRedisClient.js'\nimport { LockLease } from '../LockLease.js'\nimport type { MeshLockAcquireOptions, MeshLockBackend, MeshLockLease, MeshLockRecord } from '../types.js'\n\nexport interface RedisLockBackendOptions extends SimpleRedisClientOptions {\n  readonly app: string\n  readonly keyPrefix?: string\n}\n\ninterface StoredLock {\n  readonly key: string\n  readonly ownerId: string\n  readonly acquiredAt: string\n  readonly expiresAt: string\n  readonly metadata?: Record<string, unknown>\n}\n\nexport class RedisLockBackend implements MeshLockBackend {\n  public readonly kind = 'redis'\n  private readonly client: SimpleRedisClient\n  private readonly prefix: string\n\n  public constructor(options: RedisLockBackendOptions) {\n    this.client = new SimpleRedisClient(options)\n    this.prefix = options.keyPrefix ?? `mesh:${options.app}`\n  }\n\n  public async acquire(key: string, ownerId: string, options: MeshLockAcquireOptions = {}): Promise<MeshLockLease | null> {\n    const ttlMs = options.ttlMs ?? 30_000\n    const acquiredAt = new Date().toISOString()\n    const expiresAt = new Date(Date.now() + ttlMs).toISOString()\n    const stored: StoredLock = { key, ownerId, acquiredAt, expiresAt, ...(options.metadata ? { metadata: options.metadata } : {}) }\n    const response = await this.client.command(['SET', this.lockKey(key), JSON.stringify(stored), 'NX', 'PX', ttlMs])\n    if (response !== 'OK') return null\n    await this.client.command(['SADD', this.indexKey(), key])\n    return new LockLease(this, key, ownerId, acquiredAt, expiresAt)\n  }\n\n  public async renew(key: string, ownerId: string, ttlMs: number): Promise<boolean> {\n    const script = `local v = redis.call('GET', KEYS[1]); if not v then return 0 end; local ok, decoded = pcall(cjson.decode, v); if not ok or decoded.ownerId ~= ARGV[1] then return 0 end; decoded.expiresAt = ARGV[3]; redis.call('SET', KEYS[1], cjson.encode(decoded), 'PX', ARGV[2]); return 1`\n    const result = await this.client.command(['EVAL', script, 1, this.lockKey(key), ownerId, ttlMs, new Date(Date.now() + ttlMs).toISOString()])\n    return result === 1\n  }\n\n  public async release(key: string, ownerId: string): Promise<boolean> {\n    const script = `local v = redis.call('GET', KEYS[1]); if not v then return 0 end; local ok, decoded = pcall(cjson.decode, v); if not ok or decoded.ownerId ~= ARGV[1] then return 0 end; redis.call('DEL', KEYS[1]); redis.call('SREM', KEYS[2], ARGV[2]); return 1`\n    const result = await this.client.command(['EVAL', script, 2, this.lockKey(key), this.indexKey(), ownerId, key])\n    return result === 1\n  }\n\n  public async list(): Promise<readonly MeshLockRecord[]> {\n    const keys = await this.keys()\n    const records: MeshLockRecord[] = []\n    const stale: string[] = []\n    for (const key of keys) {\n      const raw = await this.client.command(['GET', this.lockKey(key)])\n      if (typeof raw !== 'string') {\n        stale.push(key)\n        continue\n      }\n      try {\n        const parsed = JSON.parse(raw) as MeshLockRecord\n        records.push(parsed)\n      } catch {\n        stale.push(key)\n      }\n    }\n    if (stale.length > 0) await this.client.command(['SREM', this.indexKey(), ...stale])\n    return records.sort((a, b) => a.key.localeCompare(b.key))\n  }\n\n  private async keys(): Promise<readonly string[]> {\n    const value = await this.client.command(['SMEMBERS', this.indexKey()])\n    return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []\n  }\n\n  private lockKey(key: string): string { return `${this.prefix}:lock:${key}` }\n  private indexKey(): string { return `${this.prefix}:locks` }\n}\n","import type { NormalizedMeshConfig } from '../core/types.js'\nimport { MemoryLockBackend } from './MemoryLockBackend.js'\nimport { LockManager } from './LockManager.js'\nimport { RedisLockBackend } from './redis/RedisLockBackend.js'\nimport type { MeshLockBackend } from './types.js'\n\nexport class LockFactory {\n  public createBackend(config: NormalizedMeshConfig): MeshLockBackend {\n    if (config.coordination.locks.backend === 'redis') {\n      return new RedisLockBackend({\n        app: config.app,\n        url: config.coordination.locks.url,\n        keyPrefix: config.coordination.keyPrefix,\n        connectTimeoutMs: config.coordination.connectTimeoutMs\n      })\n    }\n    return new MemoryLockBackend()\n  }\n\n  public createManager(config: NormalizedMeshConfig, ownerId?: string): LockManager {\n    return new LockManager(this.createBackend(config), ownerId)\n  }\n}\n","import type { LockManager } from '../locks/LockManager.js'\nimport type { MeshLockLease } from '../locks/types.js'\nimport type { MeshLeaderHandle, MeshLeaderRecord, MeshLeaderRunOptions } from './types.js'\n\nexport class LeaderElection {\n  public constructor(private readonly locks: LockManager, private readonly leaderId: string) {}\n\n  public async tryElect(group: string, options: MeshLeaderRunOptions = {}): Promise<MeshLeaderHandle | null> {\n    const lease = await this.locks.tryAcquire(this.key(group), {\n      ttlMs: options.ttlMs ?? 30_000,\n      waitMs: 0,\n      metadata: { ...(options.metadata ?? {}), group, leaderId: this.leaderId, kind: 'leader' }\n    })\n    return lease ? this.toHandle(group, lease) : null\n  }\n\n  public async elect(group: string, options: MeshLeaderRunOptions = {}): Promise<MeshLeaderHandle> {\n    const lease = await this.locks.acquire(this.key(group), {\n      ttlMs: options.ttlMs ?? 30_000,\n      waitMs: options.waitMs ?? 0,\n      metadata: { ...(options.metadata ?? {}), group, leaderId: this.leaderId, kind: 'leader' }\n    })\n    return this.toHandle(group, lease)\n  }\n\n  public async runWhenLeader<T>(group: string, fn: (signal: AbortSignal, leader: MeshLeaderHandle) => Promise<T> | T, options: MeshLeaderRunOptions = {}): Promise<T | null> {\n    const handle = await this.tryElect(group, options)\n    if (!handle) return null\n    const controller = new AbortController()\n    const ttlMs = options.ttlMs ?? 30_000\n    const every = options.renewEveryMs ?? Math.max(1_000, Math.floor(ttlMs / 2))\n    const timer = setInterval(() => { void handleRenew(handle, ttlMs, controller) }, every)\n    timer.unref?.()\n    try {\n      return await fn(controller.signal, handle)\n    } finally {\n      controller.abort()\n      clearInterval(timer)\n      await handle.release()\n    }\n  }\n\n  public async list(): Promise<readonly MeshLeaderRecord[]> {\n    const locks = await this.locks.list()\n    return locks\n      .filter(lock => lock.metadata?.kind === 'leader' && typeof lock.metadata.group === 'string')\n      .map(lock => ({\n        group: String(lock.metadata!.group),\n        leaderId: String(lock.metadata!.leaderId ?? lock.ownerId),\n        acquiredAt: lock.acquiredAt,\n        expiresAt: lock.expiresAt,\n        ...(lock.metadata ? { metadata: lock.metadata } : {})\n      }))\n      .sort((a, b) => a.group.localeCompare(b.group))\n  }\n\n  private toHandle(group: string, lease: MeshLockLease): MeshLeaderHandle & { renew(ttlMs?: number): Promise<boolean> } {\n    return {\n      group,\n      leaderId: this.leaderId,\n      acquiredAt: lease.acquiredAt,\n      expiresAt: lease.expiresAt,\n      release: () => lease.release(),\n      renew: (ttlMs?: number) => lease.renew(ttlMs)\n    }\n  }\n\n  private key(group: string): string {\n    return `leader:${group}`\n  }\n}\n\nasync function handleRenew(handle: MeshLeaderHandle & { renew?: (ttlMs?: number) => Promise<boolean> }, ttlMs: number, controller: AbortController): Promise<void> {\n  const renew = handle.renew\n  if (!renew) return\n  const ok = await renew(ttlMs)\n  if (!ok) controller.abort()\n}\n","import type { MeshDashboardRenderOptions, MeshDashboardSnapshot } from './types.js'\n\nexport class DashboardRenderer {\n  public render(snapshot: MeshDashboardSnapshot, options: MeshDashboardRenderOptions = {}): string {\n    const color = (code: string, value: string): string => options.colors === false ? value : `\\u001b[${code}m${value}\\u001b[0m`\n    const lines: string[] = []\n    lines.push(color('1;36', `@panomapp/mesh dashboard — ${snapshot.app}`))\n    lines.push(`generated: ${snapshot.generatedAt}`)\n    lines.push(`router:    ${snapshot.router.enabled ? snapshot.router.url : 'disabled'}${snapshot.router.metricsError ? ` (${snapshot.router.metricsError})` : ''}`)\n    lines.push(`registry:  ${snapshot.registry.type}, ttl=${snapshot.registry.ttlMs}ms, heartbeat=${snapshot.registry.heartbeatIntervalMs}ms`)\n    lines.push(`streaming: ${snapshot.streaming.enabled ? snapshot.streaming.transport : 'disabled'}${snapshot.streaming.enabled ? `, logs=${snapshot.streaming.logs}, events=${snapshot.streaming.events}` : ''}`)\n    if (snapshot.coordination.enabled) lines.push(`coordination: ${snapshot.coordination.backend}, locks=${snapshot.coordination.locks.length}, leaders=${snapshot.coordination.leaders.length}`)\n    if (snapshot.hsm.enabled) lines.push(`hsm:       ${snapshot.hsm.schemaId ?? 'schema'}${snapshot.hsm.schemaVersion ? `@${snapshot.hsm.schemaVersion}` : ''}, routes=${snapshot.hsm.routeCount}`)\n\n    if (snapshot.router.metrics) {\n      const metrics = snapshot.router.metrics\n      lines.push('')\n      lines.push(color('1', 'Router Metrics'))\n      lines.push(this.table([\n        ['uptime', this.duration(metrics.router.uptimeMs)],\n        ['draining', String(metrics.router.draining)],\n        ['requests', String(metrics.requests.total)],\n        ['proxied', String(metrics.requests.proxied)],\n        ['errors', String(metrics.requests.errors)],\n        ['no target', String(metrics.requests.noTarget)],\n        ['upgrades', String(metrics.requests.upgrades)],\n        ['active', `${metrics.active.total} total / ${metrics.active.http} http / ${metrics.active.sockets} socket`]\n      ], ['METRIC', 'VALUE']))\n    }\n\n    lines.push('')\n    lines.push(color('1', 'Services'))\n    lines.push(this.table(snapshot.services.map(service => [\n      service.service,\n      service.type,\n      service.strategy,\n      String(service.configuredInstances),\n      String(service.running),\n      String(service.draining),\n      String(service.expired),\n      String(service.failed),\n      service.routes.join(', ') || '-'\n    ]), ['SERVICE', 'TYPE', 'STRATEGY', 'CFG', 'RUN', 'DRAIN', 'EXP', 'FAIL', 'ROUTES']))\n\n    lines.push('')\n    lines.push(color('1', 'Instances'))\n    lines.push(this.table(snapshot.instances.map(instance => [\n      instance.id,\n      instance.service,\n      instance.status,\n      instance.port === null ? '-' : String(instance.port),\n      instance.pid === null ? '-' : String(instance.pid),\n      instance.url ?? '-',\n      instance.lastSeenAt ? this.age(instance.lastSeenAt) : '-'\n    ]), ['ID', 'SERVICE', 'STATUS', 'PORT', 'PID', 'URL', 'LAST SEEN']))\n\n\n    if (!options.compact && snapshot.coordination.enabled) {\n      lines.push('')\n      lines.push(color('1', 'Coordination'))\n      lines.push(this.table(snapshot.coordination.locks.map(lock => [\n        lock.key,\n        lock.ownerId,\n        this.age(lock.acquiredAt),\n        lock.expiresAt,\n        lock.metadata?.kind ? String(lock.metadata.kind) : '-'\n      ]), ['LOCK', 'OWNER', 'AGE', 'EXPIRES', 'KIND']))\n      lines.push('')\n      lines.push(color('1', 'Leaders'))\n      lines.push(this.table(snapshot.coordination.leaders.map(leader => [\n        leader.group,\n        leader.leaderId,\n        this.age(leader.acquiredAt),\n        leader.expiresAt\n      ]), ['GROUP', 'LEADER', 'AGE', 'EXPIRES']))\n      if (snapshot.coordination.errors?.length) lines.push(`coordination errors: ${snapshot.coordination.errors.join('; ')}`)\n    }\n\n    if (!options.compact) {\n      lines.push('')\n      lines.push(color('1', 'Route Plan'))\n      lines.push(this.table(snapshot.routes.map(route => [\n        route.route,\n        route.service,\n        route.source,\n        route.stateId ?? '-'\n      ]), ['ROUTE', 'SERVICE', 'SOURCE', 'STATE']))\n    }\n\n    if (snapshot.logs && snapshot.logs.length > 0) {\n      lines.push('')\n      lines.push(color('1', 'Logs'))\n      for (const log of snapshot.logs) {\n        lines.push(color('2', `--- ${log.instanceId} (${log.service}) ${log.logFile}`))\n        lines.push(log.text.trimEnd() || '(no log output)')\n      }\n    }\n\n    return `${lines.join('\\n')}\\n`\n  }\n\n  private table(rows: readonly (readonly string[])[], headers: readonly string[]): string {\n    if (rows.length === 0) return '(none)'\n    const widths = headers.map((header, index) => Math.max(header.length, ...rows.map(row => (row[index] ?? '').length)))\n    const format = (row: readonly string[]): string => row.map((cell, index) => (cell ?? '').padEnd(widths[index] ?? 0)).join('  ')\n    return [format(headers), format(widths.map(width => '-'.repeat(width))), ...rows.map(format)].join('\\n')\n  }\n\n  private duration(ms: number): string {\n    if (ms < 1_000) return `${ms}ms`\n    if (ms < 60_000) return `${Math.floor(ms / 1_000)}s`\n    if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m ${Math.floor((ms % 60_000) / 1_000)}s`\n    return `${Math.floor(ms / 3_600_000)}h ${Math.floor((ms % 3_600_000) / 60_000)}m`\n  }\n\n  private age(iso: string): string {\n    const ms = Date.now() - new Date(iso).getTime()\n    if (!Number.isFinite(ms) || ms < 1_000) return 'now'\n    if (ms < 60_000) return `${Math.floor(ms / 1_000)}s ago`\n    if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m ago`\n    return `${Math.floor(ms / 3_600_000)}h ago`\n  }\n}\n","import process from 'node:process'\nimport type { NormalizedMeshConfig } from '../core/types.js'\nimport { sleep } from '../utils/time.js'\nimport { DashboardRenderer } from './DashboardRenderer.js'\nimport { ObservabilitySnapshotBuilder } from './ObservabilitySnapshotBuilder.js'\nimport type { MeshDashboardCommandOptions } from './types.js'\n\nexport class DashboardCommand {\n  private readonly builder: ObservabilitySnapshotBuilder\n  private readonly renderer = new DashboardRenderer()\n\n  public constructor(private readonly config: NormalizedMeshConfig) {\n    this.builder = new ObservabilitySnapshotBuilder(config)\n  }\n\n  public async renderOnce(options: MeshDashboardCommandOptions = {}): Promise<string> {\n    const snapshot = await this.builder.build({\n      includeLogs: options.includeLogs ?? this.config.observability.includeLogs,\n      logLines: options.logLines ?? this.config.observability.logLines\n    })\n    if (options.json) return `${JSON.stringify(snapshot, null, 2)}\\n`\n    return this.renderer.render(snapshot, options)\n  }\n\n  public async watch(options: MeshDashboardCommandOptions = {}): Promise<void> {\n    const intervalMs = options.intervalMs ?? this.config.observability.refreshIntervalMs\n    let stopped = false\n    const stop = (): void => { stopped = true }\n    process.once('SIGINT', stop)\n    process.once('SIGTERM', stop)\n\n    while (!stopped) {\n      const output = await this.renderOnce(options)\n      if (options.json) {\n        process.stdout.write(output)\n        return\n      }\n      process.stdout.write('\\u001b[2J\\u001b[H')\n      process.stdout.write(output)\n      await sleep(intervalMs)\n    }\n  }\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","fs","path","path","fs","crypto","tls","net","import_node_fs","import_node_path","path","fs","import_node_crypto","http","process"]}