@traceprompt/node
Version:
Client-side encrypted, audit-ready logging for LLM applications
1 lines • 59 kB
Source Map (JSON)
{"version":3,"sources":["../src/config.ts","../src/keyring/index.ts","../src/metrics.ts","../src/utils/logger.ts","../src/crypto/encryptor.ts","../src/crypto/hasher.ts","../src/utils/tokenCounter.ts","../src/utils/retry.ts","../src/network/transport.ts","../src/queue/persistentBatcher.ts","../src/wrapper.ts"],"names":["path","tokenCountHist","Histogram","fetch","fs","resolve","initTracePrompt"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as yaml from \"yaml\";\nimport { TracePromptInit } from \"./types\";\n\n// Internal interface that includes the resolved orgId\ninterface InternalTracePromptConfig extends TracePromptInit {\n orgId: string; // Always present after resolution\n}\n\ninterface WhoAmIResponse {\n success: boolean;\n data: {\n type: \"organization\";\n orgId?: string;\n orgName?: string;\n kmsKeyArn?: string;\n scope: string;\n keyId: string;\n };\n} \n\nprocess.env.AWS_PROFILE = \"traceprompt-ingest-role\";\n\n/**\n * Auto-resolve organization info from API key\n * This is handled internally - users don't need to specify any IDs\n */\nasync function resolveOrgFromApiKey(\n apiKey: string,\n ingestUrl: string\n): Promise<{ orgId: string; cmkArn?: string }> {\n try {\n const whoamiUrl = `${ingestUrl.replace(\"/v1/ingest\", \"\")}/v1/whoami`;\n\n const response = await fetch(whoamiUrl, {\n method: \"GET\",\n headers: {\n \"x-api-key\": apiKey,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to resolve organization: ${response.status} ${response.statusText}`\n );\n }\n\n const result: WhoAmIResponse = await response.json();\n\n if (!result.success) {\n throw new Error(\"Failed to resolve organization from API key\");\n }\n\n const orgId = result.data.orgId;\n if (!orgId) {\n throw new Error(\"No organization ID found in API key response\");\n }\n\n const cmkArn = result.data.kmsKeyArn;\n\n console.log(`✓ Traceprompt auto-resolved organization: ${orgId}`);\n\n return { orgId, cmkArn };\n } catch (error) {\n throw new Error(\n `Failed to auto-resolve organization from API key: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n\nfunction readYaml(filePath: string): Partial<TracePromptInit> {\n try {\n const abs = path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(abs)) return {};\n const raw = fs.readFileSync(abs, \"utf8\");\n return yaml.parse(raw) ?? {};\n } catch {\n return {};\n }\n}\n\nclass ConfigManagerClass {\n private _cfg?: Required<InternalTracePromptConfig>;\n private _loadPromise?: Promise<void>;\n\n async load(userCfg: Partial<TracePromptInit> = {}): Promise<void> {\n if (this._cfg) return;\n\n // Prevent multiple concurrent loads\n if (this._loadPromise) {\n await this._loadPromise;\n return;\n }\n\n this._loadPromise = this._doLoad(userCfg);\n await this._loadPromise;\n }\n\n private async _doLoad(userCfg: Partial<TracePromptInit> = {}): Promise<void> {\n const fileCfg = process.env[\"TRACEPROMPT_RC\"]\n ? readYaml(process.env[\"TRACEPROMPT_RC\"])\n : {};\n\n const envCfg: Partial<TracePromptInit> = {\n ...(process.env[\"TRACEPROMPT_API_KEY\"] && {\n apiKey: process.env[\"TRACEPROMPT_API_KEY\"],\n }),\n ...(process.env[\"TRACEPROMPT_BATCH_SIZE\"] && {\n batchSize: Number(process.env[\"TRACEPROMPT_BATCH_SIZE\"]),\n }),\n ...(process.env[\"TRACEPROMPT_FLUSH_INTERVAL_MS\"] && {\n flushIntervalMs: Number(process.env[\"TRACEPROMPT_FLUSH_INTERVAL_MS\"]),\n }),\n ...(process.env[\"TRACEPROMPT_LOG_LEVEL\"] && {\n logLevel: process.env[\"TRACEPROMPT_LOG_LEVEL\"] as any,\n }),\n };\n\n const merged: TracePromptInit = {\n apiKey: \"\",\n cmkArn: \"\",\n ingestUrl: \"http://localhost:3000/v1/ingest\", // Default for local development\n batchSize: 25,\n flushIntervalMs: 2_000,\n staticMeta: {},\n logLevel: \"verbose\",\n ...fileCfg,\n ...envCfg,\n ...userCfg,\n };\n\n // Validate required fields\n if (!merged.apiKey) throw new Error(\"Traceprompt: apiKey is required\");\n\n // Auto-resolve orgId and cmkArn from API key\n let orgId: string;\n let cmkArn: string;\n\n try {\n const resolved = await resolveOrgFromApiKey(\n merged.apiKey,\n merged.ingestUrl\n );\n orgId = resolved.orgId;\n cmkArn = resolved.cmkArn!;\n } catch (error) {\n throw new Error(\n `Failed to auto-resolve organization: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Final validation\n if (merged.batchSize! <= 0) merged.batchSize = 25;\n if (merged.flushIntervalMs! <= 0) merged.flushIntervalMs = 2_000;\n\n // Create internal config with resolved orgId\n this._cfg = {\n ...merged,\n orgId,\n cmkArn,\n apiKey: merged.apiKey,\n ingestUrl: merged.ingestUrl,\n } as Required<InternalTracePromptConfig>;\n }\n\n get cfg(): Readonly<Required<InternalTracePromptConfig>> {\n if (!this._cfg) {\n throw new Error(\"Traceprompt: initTracePrompt() must be called first\");\n }\n return this._cfg;\n }\n}\n\nexport async function initTracePrompt(\n cfg?: Partial<TracePromptInit>\n): Promise<void> {\n await ConfigManager.load(cfg);\n}\n\nexport const ConfigManager = new ConfigManagerClass();\n","import { KmsKeyringNode, RawAesKeyringNode } from \"@aws-crypto/client-node\";\nimport { ConfigManager } from \"../config\";\n\nexport type AnyKeyring = KmsKeyringNode | RawAesKeyringNode;\n\nexport function buildKeyring(): AnyKeyring {\n const { cmkArn } = ConfigManager.cfg;\n\n return new KmsKeyringNode({\n generatorKeyId: cmkArn,\n });\n}\n","import { Registry, Histogram, Counter, Gauge } from \"prom-client\";\n\nexport const registry = new Registry();\n\nexport const encryptHist = new Histogram({\n name: \"traceprompt_encrypt_ms\",\n help: \"Latency of client-side AES-GCM envelope encryption (ms)\",\n buckets: [0.05, 0.1, 0.25, 0.5, 1, 2, 5],\n registers: [registry],\n});\n\nexport const tokenCountHist = new Histogram({\n name: \"traceprompt_token_count\",\n help: \"Tokens counted per prompt/response\",\n buckets: [1, 5, 10, 20, 50, 100, 200, 500, 1000],\n registers: [registry],\n});\n\nexport const flushFailures = new Counter({\n name: \"traceprompt_flush_failures_total\",\n help: \"Number of failed POSTs to the Traceprompt ingest API\",\n registers: [registry],\n});\n\nexport const queueGauge = new Gauge({\n name: \"traceprompt_queue_depth\",\n help: \"Number of events currently buffered in memory\",\n registers: [registry],\n});\n","import winston from \"winston\";\nimport { ConfigManager } from \"../config\";\n\nexport type LogLevel =\n | \"error\"\n | \"warn\"\n | \"info\"\n | \"verbose\"\n | \"debug\"\n | \"silly\";\n\nlet logger: winston.Logger | null = null;\n\nfunction createLogger(): winston.Logger {\n const cfg = ConfigManager.cfg;\n const logLevel = cfg.logLevel || \"verbose\"; // Default to verbose as requested\n\n return winston.createLogger({\n level: logLevel,\n format: winston.format.combine(\n winston.format.timestamp({\n format: \"YYYY-MM-DD HH:mm:ss\",\n }),\n winston.format.errors({ stack: true }),\n winston.format.printf(({ level, message, timestamp, stack }) => {\n const prefix = `[${timestamp}] [TracePrompt] [${level.toUpperCase()}]`;\n if (stack) {\n return `${prefix} ${message}\\n${stack}`;\n }\n return `${prefix} ${message}`;\n })\n ),\n transports: [\n new winston.transports.Console({\n handleExceptions: true,\n handleRejections: true,\n }),\n ],\n exitOnError: false,\n });\n}\n\nfunction getLogger(): winston.Logger {\n if (!logger) {\n logger = createLogger();\n }\n return logger;\n}\n\nexport const log = {\n error: (message: string, meta?: any) => getLogger().error(message, meta),\n warn: (message: string, meta?: any) => getLogger().warn(message, meta),\n info: (message: string, meta?: any) => getLogger().info(message, meta),\n verbose: (message: string, meta?: any) => getLogger().verbose(message, meta),\n debug: (message: string, meta?: any) => getLogger().debug(message, meta),\n silly: (message: string, meta?: any) => getLogger().silly(message, meta),\n};\n\nexport function resetLogger(): void {\n logger = null;\n}\n","import { buildClient, CommitmentPolicy } from \"@aws-crypto/client-node\";\n\nimport { buildKeyring } from \"../keyring\";\nimport { EncryptedBundle } from \"../types\";\nimport { encryptHist } from \"../metrics\";\nimport { ConfigManager } from \"../config\";\nimport { log } from \"../utils/logger\";\n\nconst { encrypt, decrypt } = buildClient(\n CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT\n);\n\nexport async function encryptBuffer(plain: Buffer): Promise<EncryptedBundle> {\n const keyring = buildKeyring();\n const endTimer = encryptHist.startTimer();\n try {\n console.log(\"Encrypting buffer\", ConfigManager.cfg);\n log.info(\"Encrypting buffer\", {\n orgId: ConfigManager.cfg.orgId,\n });\n\n const { result, messageHeader } = await encrypt(keyring, plain, {\n encryptionContext: {\n org_id: ConfigManager.cfg.orgId,\n },\n });\n\n const bundle = {\n ciphertext: Buffer.from(result).toString(\"base64\"),\n encryptedDataKey: Buffer.from(\n messageHeader.encryptedDataKeys[0].encryptedDataKey\n ).toString(\"base64\"),\n suiteId: messageHeader.suiteId,\n };\n\n return bundle;\n } finally {\n endTimer();\n }\n}\n\nexport async function decryptBundle(bundle: EncryptedBundle): Promise<Buffer> {\n const keyring = buildKeyring();\n\n const { plaintext } = await decrypt(\n keyring,\n Buffer.from(bundle.ciphertext, \"base64\")\n );\n return plaintext;\n}\n","import { blake3 } from \"@napi-rs/blake-hash\";\n\nexport function computeLeaf(data: string | Buffer | undefined): string {\n if (data === undefined) {\n data = \"null\";\n }\n return blake3(data).toString(\"hex\");\n}\n","let encodeFn: ((s: string) => number) | null = null;\n\nimport { Histogram } from \"prom-client\";\nimport { registry } from \"../metrics\";\n\nconst tokenCountHist = new Histogram({\n name: \"traceprompt_tokens_per_string\",\n help: \"Number of tokens counted per string passed to countTokens()\",\n buckets: [1, 5, 10, 20, 50, 100, 200, 500, 1000],\n registers: [registry],\n});\n\nexport function setCustomEncoder(fn: ((s: string) => number) | null): void {\n encodeFn = fn;\n}\n\nexport function countTokens(text: string): number {\n if (encodeFn) {\n const t = encodeFn(text);\n tokenCountHist.observe(t);\n return t;\n }\n\n if (maybeInitTiktoken()) {\n const t = encodeFn!(text);\n tokenCountHist.observe(t);\n return t;\n }\n\n const words = text.trim().split(/\\s+/g).length;\n const tokens = Math.ceil(words * 1.33);\n tokenCountHist.observe(tokens);\n return tokens;\n}\n\nlet triedTiktoken = false;\n\nfunction maybeInitTiktoken(): boolean {\n if (encodeFn || triedTiktoken) return !!encodeFn;\n triedTiktoken = true;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { encoding_for_model } = require(\"@dqbd/tiktoken\");\n const enc = encoding_for_model(\"cl100k_base\");\n encodeFn = (s: string): number => enc.encode(s).length;\n return true;\n } catch {\n return false;\n }\n}\n","export async function retry<T>(\n fn: () => Promise<T>,\n attempts = 5,\n baseDelay = 250,\n onError?: (err: unknown, attempt: number) => void\n): Promise<T> {\n let attempt = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n attempt++;\n return await fn();\n } catch (err) {\n onError?.(err, attempt);\n if (attempt >= attempts) throw err;\n\n /* Exponential back-off with full jitter */\n const exp = baseDelay * 2 ** (attempt - 1);\n const jitter = Math.random() * exp;\n await new Promise((res) => setTimeout(res, jitter));\n }\n }\n}\n","import { fetch } from \"undici\";\nimport { ConfigManager } from \"../config\";\nimport { retry } from \"../utils/retry\";\nimport { log } from \"../utils/logger\";\n\ntype HttpMethod = \"POST\" | \"PUT\" | \"PATCH\";\n\ninterface PostOptions {\n path: string;\n body: unknown;\n method?: HttpMethod;\n retries?: number;\n headers?: Record<string, string>;\n}\n\nexport const Transport = {\n async post(\n path: string,\n body: unknown,\n retries = 5,\n headers?: Record<string, string>\n ): Promise<void> {\n await sendJson({ path, body, retries, method: \"POST\", headers });\n },\n};\n\nasync function sendJson(opts: PostOptions): Promise<void> {\n const { ingestUrl, apiKey } = ConfigManager.cfg;\n const url = new URL(opts.path, ingestUrl).toString();\n const extra = opts.headers ?? {};\n\n log.verbose(`Sending request to ${opts.path}`, {\n url: url,\n method: opts.method ?? \"POST\",\n retries: opts.retries ?? 5,\n hasBody: !!opts.body,\n });\n\n await retry(\n async () => {\n const res = await fetch(url, {\n method: opts.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"user-agent\": \"traceprompt-sdk/0.1.0\",\n \"x-api-key\": apiKey,\n ...extra,\n },\n body: JSON.stringify(opts.body),\n });\n\n if (res.status >= 400) {\n const msg = await res.text();\n const errorMessage = `HTTP ${res.status} - ${msg}`;\n\n if (res.status >= 500) {\n log.warn(`Server error (will retry): ${errorMessage}`, {\n status: res.status,\n url: url,\n response: msg,\n });\n } else if (res.status === 429) {\n log.warn(`Rate limited (will retry): ${errorMessage}`, {\n status: res.status,\n url: url,\n response: msg,\n });\n } else if (res.status === 401 || res.status === 403) {\n log.error(`Authentication/authorization error: ${errorMessage}`, {\n status: res.status,\n url: url,\n response: msg,\n hint: \"Check your API key and organization permissions\",\n });\n } else {\n log.error(`Client error: ${errorMessage}`, {\n status: res.status,\n url: url,\n response: msg,\n });\n }\n\n throw new Error(`Traceprompt: ${errorMessage}`);\n }\n\n log.debug(`Request successful`, {\n status: res.status,\n url: url,\n });\n },\n opts.retries ?? 5,\n 250,\n (error: unknown, attempt: number) => {\n log.verbose(`Request attempt ${attempt} failed, retrying...`, {\n error: error instanceof Error ? error.message : String(error),\n attempt: attempt,\n maxRetries: opts.retries ?? 5,\n url: url,\n });\n }\n );\n\n log.verbose(`Request completed successfully`, { url: url });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { ConfigManager } from \"../config\";\nimport type { QueueItem } from \"../types\";\nimport { Transport } from \"../network/transport\";\nimport { log } from \"../utils/logger\";\nimport { queueGauge, flushFailures } from \"../metrics\";\n\nfunction getConfig() {\n return ConfigManager.cfg;\n}\n\nfunction getDir() {\n const cfg = getConfig();\n return path.resolve(cfg.dataDir ?? \".traceprompt\", \"queue\");\n}\n\nfunction getLogPath() {\n return path.join(getDir(), \"outbox.log\");\n}\n\nfunction getMaxRamRecords() {\n const cfg = getConfig();\n return (cfg.batchSize || 10) * 2;\n}\n\nconst MAX_FILE_BYTES = 5 * 1024 * 1024;\n\nlet bootstrapDone = false;\nlet pLimitPromise: Promise<any> | null = null;\nlet closing = false;\n\nasync function getPLimit() {\n if (!pLimitPromise) {\n pLimitPromise = import(\"p-limit\").then((module) => module.default);\n }\n return pLimitPromise;\n}\n\nasync function bootstrap() {\n if (bootstrapDone) return;\n await fs.mkdir(getDir(), { recursive: true });\n bootstrapDone = true;\n}\n\nlet ring: QueueItem[] = [];\nlet head = 0;\nlet len = 0;\nlet ringInitialized = false;\n\nfunction initializeRing() {\n if (ringInitialized) return;\n const maxRecords = getMaxRamRecords();\n ring = new Array(maxRecords);\n ringInitialized = true;\n}\n\nfunction ringPush(item: QueueItem) {\n initializeRing();\n const maxRecords = getMaxRamRecords();\n\n ring[(head + len) % maxRecords] = item;\n if (len < maxRecords) {\n len++;\n return;\n }\n head = (head + 1) % maxRecords;\n}\n\nfunction ringDrip(n: number): QueueItem[] {\n initializeRing();\n const maxRecords = getMaxRamRecords();\n const out: QueueItem[] = [];\n\n while (out.length < n && len > 0) {\n out.push(ring[head]);\n head = (head + 1) % maxRecords;\n len--;\n }\n return out;\n}\n\nasync function append(item: QueueItem) {\n if (closing) {\n throw new Error(\"TracePrompt SDK is shutting down, rejecting new events\");\n }\n\n await bootstrap();\n initializeTimer();\n\n const rec = JSON.stringify({ id: randomUUID(), ...item }) + \"\\n\";\n\n try {\n await fs.appendFile(getLogPath(), rec, \"utf8\");\n log.debug(\"Record appended to outbox\", {\n outboxPath: getLogPath(),\n recordSize: rec.length,\n });\n } catch (error) {\n log.error(\"Failed to append record to outbox\", {\n error: error instanceof Error ? error.message : String(error),\n outboxPath: getLogPath(),\n });\n throw error;\n }\n\n ringPush(item);\n queueGauge.set(len);\n log.verbose(\"Record added to ring buffer\", {\n ringSize: len,\n maxRingSize: getMaxRamRecords(),\n });\n\n try {\n const { size } = await fs.stat(getLogPath());\n if (size > MAX_FILE_BYTES) {\n log.error(\"Outbox file size exceeded limit - applying backpressure\", {\n currentSize: size,\n maxSize: MAX_FILE_BYTES,\n outboxPath: getLogPath(),\n });\n throw new Error(\n \"TracePrompt SDK backpressure: local outbox full, ingest unreachable.\"\n );\n }\n\n if (size > MAX_FILE_BYTES * 0.8) {\n log.warn(\"Outbox file size approaching limit\", {\n currentSize: size,\n maxSize: MAX_FILE_BYTES,\n percentFull: Math.round((size / MAX_FILE_BYTES) * 100),\n outboxPath: getLogPath(),\n });\n }\n } catch (e) {\n if ((e as any).code !== \"ENOENT\") {\n log.warn(\"Failed to check outbox file size\", {\n error: e instanceof Error ? e.message : String(e),\n outboxPath: getLogPath(),\n });\n throw e;\n }\n }\n}\n\nlet limit: any = null;\n\nasync function flushOnce() {\n await bootstrap();\n initializeTimer();\n\n if (!limit) {\n const pLimit = await getPLimit();\n limit = pLimit(1);\n }\n\n return limit(async () => {\n const cfg = getConfig();\n const batchSize = cfg.batchSize || 10;\n\n let batch: (QueueItem & { id: string })[] = [];\n const ringRecords = ringDrip(batchSize);\n\n if (ringRecords.length > 0) {\n log.verbose(\"Using ring buffer records for flush\", {\n ringRecords: ringRecords.length,\n batchSize: batchSize,\n });\n\n batch = ringRecords.map((record) => ({\n id: randomUUID(),\n ...record,\n }));\n }\n\n let diskLines: string[] = [];\n let totalDiskRecords = 0;\n\n if (batch.length < batchSize) {\n const needed = batchSize - batch.length;\n\n try {\n const rl = createInterface({ input: createReadStream(getLogPath()) });\n const diskBatch: (QueueItem & { id: string })[] = [];\n\n for await (const line of rl) {\n if (!line.trim()) continue;\n\n if (diskBatch.length < needed) {\n diskBatch.push(JSON.parse(line));\n }\n\n diskLines.push(line);\n totalDiskRecords++;\n\n if (diskBatch.length >= needed && totalDiskRecords >= needed * 2) {\n break;\n }\n }\n\n rl.close();\n\n if (diskBatch.length > 0) {\n log.verbose(\"Supplementing with disk records\", {\n ringRecords: batch.length,\n diskRecords: diskBatch.length,\n totalDiskRecordsRead: totalDiskRecords,\n });\n\n batch.push(...diskBatch);\n }\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n if (batch.length === 0) {\n log.debug(\"No records in ring buffer or disk, nothing to flush\");\n return;\n }\n } else {\n log.warn(\"Error reading outbox file\", {\n error: error.message,\n outboxPath: getLogPath(),\n });\n }\n }\n } else {\n try {\n const rl = createInterface({ input: createReadStream(getLogPath()) });\n\n for await (const line of rl) {\n if (line.trim()) {\n diskLines.push(line);\n totalDiskRecords++;\n }\n }\n\n rl.close();\n } catch (error: any) {\n if (error.code !== \"ENOENT\") {\n log.warn(\"Error counting disk records\", {\n error: error.message,\n outboxPath: getLogPath(),\n });\n }\n }\n }\n\n if (batch.length === 0) {\n log.debug(\"No records available for flush\");\n return;\n }\n\n const totalPending =\n totalDiskRecords + (ringRecords.length > batch.length ? 0 : len);\n\n queueGauge.set(totalPending);\n\n log.info(\"Starting batch flush\", {\n batchSize: batch.length,\n fromRingBuffer: Math.min(ringRecords.length, batch.length),\n fromDisk: Math.max(0, batch.length - ringRecords.length),\n totalPendingAfterFlush: totalPending - batch.length,\n outboxPath: getLogPath(),\n });\n\n const body = {\n orgId: cfg.orgId,\n records: batch.map(({ payload, leafHash }) => ({ payload, leafHash })),\n };\n\n try {\n // @ts-expect-error - TODO: fix this\n await Transport.post(\"/v1/ingest\", body, {\n \"Idempotency-Key\": batch[0].leafHash,\n });\n\n if (totalDiskRecords > 0) {\n const diskRecordsUsed = Math.max(0, batch.length - ringRecords.length);\n if (diskRecordsUsed > 0) {\n let allDiskLines: string[];\n\n if (diskLines.length === totalDiskRecords) {\n allDiskLines = diskLines;\n } else {\n try {\n const text = await fs.readFile(getLogPath(), \"utf8\");\n allDiskLines = text.trim().split(\"\\n\").filter(Boolean);\n } catch (error) {\n log.error(\"Failed to read outbox file for cleanup\", {\n error: error instanceof Error ? error.message : String(error),\n outboxPath: getLogPath(),\n });\n return;\n }\n }\n\n const remaining = allDiskLines.slice(diskRecordsUsed);\n if (remaining.length > 0) {\n await fs.writeFile(getLogPath(), remaining.join(\"\\n\") + \"\\n\");\n log.info(\"Batch flush successful, updated outbox\", {\n flushedRecords: batch.length,\n fromRingBuffer: ringRecords.length,\n fromDisk: diskRecordsUsed,\n remainingOnDisk: remaining.length,\n });\n queueGauge.set(totalPending - batch.length);\n } else {\n await fs.writeFile(getLogPath(), \"\");\n log.info(\"Batch flush successful, outbox cleared\", {\n flushedRec