1/**2 * Minimal leveled logger, shared by the page and the sim worker.3 * Default level 'warn'; enable verbose output with ?log=debug (or ?debug) —4 * the page reads the URL and forwards the level to the worker in the init5 * message, since workers can't see location.search themselves.6 */7export type LogLevel = 'debug' | 'info' | 'warn' | 'error';89const ORDER: Record<LogLevel, number> = { debug: 0, info: 1, warn: 2, error: 3 };1011let current: LogLevel = 'warn';1213export function setLogLevel(level: LogLevel): void {14 current = level;15}1617export function logLevelFromSearch(search: string): LogLevel {18 const params = new URLSearchParams(search);19 const raw = params.get('log');20 if (raw !== null && raw in ORDER) return raw as LogLevel;21 if (params.has('debug')) return 'debug';22 return 'warn';23}2425function emit(level: LogLevel, args: unknown[]): void {26 if (ORDER[level] < ORDER[current]) return;27 // eslint-disable-next-line no-console28 console[level === 'debug' ? 'log' : level](`[tribes:${level}]`, ...args);29}3031export const log = {32 debug: (...args: unknown[]) => emit('debug', args),33 info: (...args: unknown[]) => emit('info', args),34 warn: (...args: unknown[]) => emit('warn', args),35 error: (...args: unknown[]) => emit('error', args),36};