{"version":3,"sources":["../src/logger/index.js","../src/logger/transports.js"],"sourcesContent":["import chalk from \"chalk\";\nimport util from \"util\";\n\n\n\n\n\n\n\n\n\n\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\n\n\nconst ALL_LEVELS = [\n    \"silly\",\n    \"debug\",\n    \"logic\",\n    \"info\",\n    \"notice\",\n    \"warn\",\n    \"error\",\n    \"results\",\n    \"request\",\n    \"response\",\n    \"progress\"\n];\nconst DEFAULT_LEVELS = ALL_LEVELS.filter((l) => l !== \"silly\");\n\n// Calculate maximum level name length for alignment\nconst MAX_LEVEL_LENGTH = Math.max(...ALL_LEVELS.map(level => level.toUpperCase().length));\n\nconst LEVEL_COLORS = {\n    error: chalk.red.bold,\n    warn: chalk.rgb(255, 165, 0),\n    notice: chalk.cyan,\n    info: chalk.white.bold,\n    logic: chalk.gray,\n    debug: chalk.gray,\n    silly: chalk.gray,\n    request: chalk.green,\n    response: chalk.yellow,\n    // Magenta stands out from white info / green request lines.\n    progress: chalk.magentaBright,\n    results: chalk.magenta\n};\n\nfunction paint(level, text, { color = true, bold = false } = {}) {\n    if (!color || text == null || text === \"\") return text == null ? \"\" : String(text);\n    const formatter = LEVEL_COLORS[level] ?? chalk.white;\n    return bold ? formatter.bold(text) : formatter(text);\n}\n\nfunction inspectChunks(chunks, color = true) {\n    return (chunks ?? [])\n        .map((chunk) => util.inspect(chunk, { colors: color, depth: null }))\n        .join(\" \");\n}\n\n/**\n * Format a log struct for a terminal. Used by Logger and by UIs (tasksmm)\n * that persist structs and render them later.\n *\n * @param {{ level?: string, message?: string, name?: string, task?: string, prefix?: string, count?: unknown, total?: unknown,\n *           elapsed?: number, remaining?: number, rate?: number, chunks?: unknown[], results?: unknown }} struct\n * @param {{ timestamp?: boolean, showLevel?: boolean, color?: boolean, now?: Date|string|number }} [options]\n */\nexport function formatLog(struct = {}, options = {}) {\n    const level = String(struct.level || \"info\").toLowerCase();\n    const color = options.color !== false;\n    const parts = [];\n    const now = options.now != null ? new Date(options.now) : new Date();\n\n    if (options.timestamp) {\n        const d = Number.isNaN(now.getTime()) ? new Date() : now;\n        parts.push(d.toISOString());\n    }\n\n    if (options.showLevel) {\n        parts.push(level.toUpperCase().padEnd(MAX_LEVEL_LENGTH));\n    }\n\n    const taskName = struct.task != null ? String(struct.task).trim() : \"\";\n    if (taskName) {\n        parts.push(color ? chalk.cyan(`[${taskName}]`) : `[${taskName}]`);\n    }\n\n    if (level === \"progress\") {\n        if (struct.prefix) {\n            parts.push(paint(level, struct.prefix, { color, bold: true }));\n        }\n        if (struct.count !== undefined && struct.total !== undefined) {\n            parts.push(paint(level, `${struct.count}/${struct.total}`, { color }));\n        }\n    } else if (struct.prefix) {\n        parts.push(color ? chalk.cyan(`[${struct.prefix}]`) : `[${struct.prefix}]`);\n    }\n\n    if (struct.message) {\n        parts.push(paint(level, struct.message, { color, bold: true }));\n    }\n\n    if (level === \"progress\") {\n        if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n            parts.push(paint(level, `${struct.elapsed}/${struct.remaining}`, { color }));\n        }\n        if (struct.rate !== undefined) {\n            parts.push(paint(level, Number(struct.rate) >= 0 ? `${struct.rate}/s` : \"-/s\", { color }));\n        }\n    }\n\n    if (struct.chunks && struct.chunks.length) {\n        parts.push(inspectChunks(struct.chunks, color));\n    }\n\n    if (struct.results) {\n        parts.push(paint(level, JSON.stringify(struct.results, null, 4), { color }));\n    }\n\n    return parts.join(\" \");\n}\n\nexport class Logger  {\n    context; // Partial context during initialization\n    options;\n    transport;\n    startTimes = {};\n    /** Count at the first progress sample for each prefix (rate baseline). */\n    startCounts = {};\n    lastProgressTimes = {};\n\n    constructor(context, options = {}) {\n        this.context = context;\n        // Set defaults first\n        this.options = this.getDefaultOptions();\n        // Apply configuration\n        if (options) {\n            this.configure(options);\n        }\n        // Initialize transport\n        this.updateTransport();\n    }\n\n    /**\n     * Configure logger options. Accepts both LoggerOptions shape and flat param names\n     * (levels string, progressWithTimes, progressWithRate, progressThrottleMs).\n     */\n    configure(options) {\n        if (options.mode !== undefined) {\n            this.options.mode = this.isValidMode(options.mode) ? options.mode : \"text\";\n        }\n        if (options.route !== undefined) {\n            this.options.route = options.route;\n            this.updateTransport();\n        }\n        if (options.prefix !== undefined) this.options.prefix = options.prefix;\n        if (options.name !== undefined) this.options.name = options.name;\n        if (options.logName !== undefined) this.options.name = options.logName;\n        if (options.task !== undefined) this.options.task = options.task;\n        if (options.silent !== undefined) this.options.silent = options.silent;\n        if (options.showLevel !== undefined) this.options.showLevel = options.showLevel;\n        if (options.timestamp !== undefined) this.options.timestamp = options.timestamp;\n        if (options.levels !== undefined) {\n            const levels = typeof options.levels === \"string\" ? options.levels.split(\",\") : options.levels;\n            this.options.levels = this.normalizeLevels(levels);\n        }\n        if (options.progress !== undefined) {\n            if (options.progress.withTimes !== undefined) this.options.progressTimes = options.progress.withTimes;\n            if (options.progress.withRate !== undefined) this.options.progressRate = options.progress.withRate;\n            if (options.progress.throttleMs !== undefined) this.options.progressThrottle = options.progress.throttleMs;\n        }\n        const flat = options ;\n        if (flat.progressWithTimes !== undefined) this.options.progressTimes = flat.progressWithTimes;\n        if (flat.progressWithRate !== undefined) this.options.progressRate = flat.progressWithRate;\n        if (flat.progressThrottleMs !== undefined) this.options.progressThrottle = flat.progressThrottleMs;\n    }\n\n    /**\n     * Initialize logger from context and CLI parameters. Whatever is in options goes (after discovered params).\n     * Params are tracked under the `logger` module for --showUsedParams.\n     */\n    static init(context, options) {\n        const paramDefs = {\n            mode: \"string default text\",\n            route: \"string default console\",\n            prefix: \"string\",\n            logName: \"string\",\n            silent: \"boolean default false\",\n            showLevel: \"boolean default true\",\n            timestamp: \"boolean default false\",\n            levels: \"string\",\n            progressWithTimes: \"boolean default false\",\n            progressWithRate: \"boolean default false\",\n            progressThrottleMs: \"number\",\n        };\n        const discovered = context.params.getAllForModule(\"logger\", paramDefs);\n        const config = { ...discovered, ...options } ;\n        if (!config.name && !config.logName) {\n            const fromEnv = process.env.name || process.env.SERVICE_NAME;\n            if (fromEnv) config.name = fromEnv;\n        }\n        const logger = new Logger(context, config);\n        context.logger = logger;\n        return logger;\n    }\n\n    getDefaultOptions() {\n        return {\n            mode: \"text\",\n            route: this.shouldUseIpcRoute() ? \"ipc\" : \"console\",\n            prefix: undefined,\n            name: undefined,\n            task: undefined,\n            silent: false,\n            showLevel: false,\n            timestamp: false,\n            levels: DEFAULT_LEVELS,\n            progressTimes: false,\n            progressRate: false,\n            progressThrottle: undefined,\n        };\n    }\n\n    updateTransport() {\n        this.transport = this.options.route === \"ipc\"\n            ? new ParentProcessTransport()\n            : new ConsoleTransport();\n    }\n\n    /**\n     * Same transport, tagged with a task name on every line. Does not mutate\n     * this instance — safe when maxParallel > 1.\n     *\n     * @param {string} task\n     * @returns {Logger}\n     */\n    child(task) {\n        const next = Object.create(this);\n        next.options = { ...this.options, task: task ? String(task) : this.options.task };\n        return next;\n    }\n\n    setMode(mode) {\n        if (!this.isValidMode(mode)) {\n            throw new Error(`Unsupported logger mode: ${mode}`);\n        }\n        this.options.mode = mode;\n    }\n\n    /** Returns a styled string (bright white) for highlighting; keeps chalk inside logger. */\n    highlight(text) {\n        return chalk.whiteBright(text);\n    }\n\n    debug(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"debug\", message, chunks });\n    }\n\n    info(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"info\", message, chunks });\n    }\n\n    notice(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"notice\", message, chunks });\n    }\n\n    warn(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"warn\", message, chunks });\n    }\n\n    error(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"error\", message, chunks });\n    }\n\n    logic(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"logic\", message, chunks });\n    }\n\n    silly(message, ...chunks) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"silly\", message, chunks });\n    }\n\n    results(results) {\n        const out = this?.out;\n        if (typeof out === \"function\") out.call(this, { level: \"results\", message: \"results\", results });\n    }\n\n    request(operation, ...chunks) {\n        const message = this.inspectChunks([operation, ...chunks]);\n        this.out({ level: \"request\", message });\n    }\n\n    response(operation, ...chunks) {\n        const message = this.inspectChunks([operation, ...chunks]);\n        this.out({ level: \"response\", message });\n    }\n\n    /**\n     * @returns {boolean} true when the progress line was emitted (not throttled)\n     */\n    progress(message, opts) {\n        const { prefix, count, total } = opts;\n        // If count briefly overshoots a stale total, display without negative ETA;\n        // callers should raise `total` when the feed revises @odata.count.\n        const displayTotal = Math.max(Number(total) || 0, Number(count) || 0);\n        const paddedTotal = String(displayTotal).length;\n        const paddedCount = String(count).padStart(paddedTotal, \" \");\n        const payload = {\n            level: \"progress\",\n            message,\n            count: paddedCount,\n            total: displayTotal,\n            prefix\n        };\n\n        const key = prefix ?? \"\";\n        // First sample for this prefix: establish baseline only (no rate yet).\n        // Rate/ETA use items completed since that sample, so batched reporters\n        // (e.g. every 500 records) don't inflate early /s from a late start clock.\n        if (this.startTimes[key] === undefined) {\n            this.startTimes[key] = Date.now();\n            this.startCounts[key] = count;\n        }\n        const wantTimes = this.options.progressTimes;\n        const wantRate = this.options.progressRate;\n        if (wantTimes || wantRate) {\n            const elapsedSeconds = (Date.now() - this.startTimes[key]) / 1000;\n            const done = count - (this.startCounts[key] ?? count);\n            const itemsPerSec = done > 0 && elapsedSeconds > 0 ? done / elapsedSeconds : -1;\n            if (wantTimes) {\n                let remaining = -1;\n                if (itemsPerSec > 0) {\n                    remaining = Math.max(0, (displayTotal - count) / itemsPerSec);\n                }\n                payload.elapsed = this.round(elapsedSeconds, 2);\n                payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n            }\n            if (wantRate) {\n                payload.rate = itemsPerSec >= 0 ? this.round(itemsPerSec, 2) : itemsPerSec;\n            }\n        }\n\n        // Clear rate baseline on exact completion so the next job with the same\n        // prefix re-baselines. Do not clear on overrun (count > total) — that\n        // would zero the rate until total is corrected.\n        if (count === total) {\n            delete this.startTimes[key];\n            delete this.startCounts[key];\n            delete this.lastProgressTimes[key];\n        }\n\n        if (this.shouldOutputProgress(prefix ?? \"\", count, displayTotal)) {\n            this.out(payload);\n            if (this.options.progressThrottle && prefix) {\n                this.lastProgressTimes[prefix] = Date.now();\n            }\n            return true;\n        }\n        return false;\n    }\n\n    shouldOutputProgress(prefix, count, total) {\n        if (!this.options.progressThrottle) {\n            return true;\n        }\n        if (count === 1 || count === total || !prefix) {\n            return true;\n        }\n        const lastTime = this.lastProgressTimes[prefix];\n        if (!lastTime) {\n            return true;\n        }\n        return Date.now() - lastTime >= this.options.progressThrottle;\n    }\n\n    out(struct) {\n        if (this.options.silent) {\n            return;\n        }\n        if (!this.options.levels.includes(struct.level)) {\n            return;\n        }\n\n        if (this.options.task && !struct.task) {\n            struct.task = this.options.task;\n        }\n        if (this.options.prefix && !struct.prefix) {\n            struct.prefix = this.options.prefix;\n        }\n\n        const output = this.options.mode === \"json\"\n            ? JSON.stringify(struct)\n            : this.formatLog(struct);\n\n        this.transport.write(output);\n    }\n\n    formatLog(struct) {\n        return formatLog(struct, {\n            timestamp: this.options.timestamp,\n            showLevel: this.options.showLevel,\n            color: true,\n        });\n    }\n\n    inspectChunks(chunks) {\n        return inspectChunks(chunks, true);\n    }\n\n    shouldUseIpcRoute() {\n        // Don't use IPC in test environments (Vitest workers interfere with process.send)\n        if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n            return false;\n        }\n        // Only use IPC if process.send exists AND we're connected to a parent\n        // In Vitest workers, process.send exists but process.connected is undefined/false\n        // process.connected is only true in actual child processes created with fork()\n        return typeof process.send === \"function\" && process.connected === true;\n    }\n\n    normalizeLevels(levels) {\n        if (!levels || !levels.length) {\n            return DEFAULT_LEVELS;\n        }\n\n        const tokens = levels.map((t) => String(t).trim()).filter(Boolean);\n        const explicitIncludes = tokens\n            .filter((t) => !t.startsWith(\"+\") && !t.startsWith(\"-\"))\n            .map((t) => t );\n        const addIncludes = tokens\n            .filter((t) => t.startsWith(\"+\"))\n            .map((t) => t.slice(1) );\n        const excludes = tokens\n            .filter((t) => t.startsWith(\"-\"))\n            .map((t) => t.slice(1) );\n\n        const unknown = [...explicitIncludes, ...addIncludes, ...excludes].filter(level => !ALL_LEVELS.includes(level));\n        if (unknown.length) {\n            console.warn(`[Logger] Unknown level(s): ${unknown.join(\", \")}`);\n        }\n\n        const base = explicitIncludes.length\n            ? explicitIncludes\n            : Array.from(new Set([...DEFAULT_LEVELS, ...addIncludes]));\n        return base.filter(level => !excludes.includes(level));\n    }\n\n    isValidMode(mode) {\n        return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n    }\n\n    round(value, places) {\n        const factor = Math.pow(10, places);\n        return Math.round(value * factor) / factor;\n    }\n}\n\n","\n\nexport class ConsoleTransport  {\n    write(payload) {\n        console.info(payload);\n    }\n}\n\nexport class ParentProcessTransport  {\n    write(payload) {\n        // Don't use IPC in test environments (Vitest workers interfere with process.send)\n        if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n            console.info(payload);\n            return;\n        }\n        // Only use process.send if we're actually connected to a parent process\n        // In Vitest workers, process.send exists but shouldn't be used\n        if (typeof process.send === \"function\" && process.connected === true) {\n            process.send(payload);\n        } else {\n            console.info(payload);\n        }\n    }\n}\n\n\n"],"mappings":"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","names":["chalk","util"]}