{"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              flushedRecords: batch.length,\n              fromRingBuffer: ringRecords.length,\n              fromDisk: diskRecordsUsed,\n            });\n            queueGauge.set(totalPending - batch.length);\n          }\n        } else {\n          log.info(\"Batch flush successful, used only ring buffer\", {\n            flushedRecords: batch.length,\n            diskRecordsRemaining: totalDiskRecords,\n          });\n          queueGauge.set(totalPending - batch.length);\n        }\n      } else {\n        log.info(\"Batch flush successful, used only ring buffer\", {\n          flushedRecords: batch.length,\n        });\n        queueGauge.set(totalPending - batch.length);\n      }\n    } catch (e) {\n      const errorMessage = e instanceof Error ? e.message : String(e);\n\n      if (ringRecords.length > 0) {\n        log.warn(\"Flush failed, restoring ring buffer records to disk\", {\n          ringRecordsToRestore: ringRecords.length,\n        });\n\n        const ringRecordsAsLines = ringRecords.map((record) =>\n          JSON.stringify({ id: randomUUID(), ...record })\n        );\n\n        try {\n          let existingContent = \"\";\n          try {\n            existingContent = await fs.readFile(getLogPath(), \"utf8\");\n          } catch {}\n\n          const allLines = [...ringRecordsAsLines];\n          if (existingContent.trim()) {\n            allLines.push(\n              ...existingContent.trim().split(\"\\n\").filter(Boolean)\n            );\n          }\n\n          await fs.writeFile(getLogPath(), allLines.join(\"\\n\") + \"\\n\");\n        } catch (restoreError) {\n          log.error(\"Failed to restore ring buffer records to disk\", {\n            error:\n              restoreError instanceof Error\n                ? restoreError.message\n                : String(restoreError),\n            lostRecords: ringRecords.length,\n          });\n        }\n      }\n\n      if (errorMessage.includes(\"HTTP 5\")) {\n        log.warn(\"Server error during batch flush, will retry\", {\n          error: errorMessage,\n          batchSize: batch.length,\n          totalPending: totalPending,\n        });\n      } else if (errorMessage.includes(\"HTTP 429\")) {\n        log.warn(\"Rate limited during batch flush, will retry\", {\n          error: errorMessage,\n          batchSize: batch.length,\n          totalPending: totalPending,\n        });\n      } else if (errorMessage.includes(\"HTTP 4\")) {\n        log.error(\"Client error during batch flush\", {\n          error: errorMessage,\n          batchSize: batch.length,\n          totalPending: totalPending,\n          hint: \"Check API configuration and request format\",\n        });\n      } else {\n        log.error(\"Network error during batch flush\", {\n          error: errorMessage,\n          batchSize: batch.length,\n          totalPending: totalPending,\n        });\n      }\n\n      flushFailures.inc();\n\n      throw e;\n    }\n  });\n}\n\nlet timerInitialized = false;\nlet flushTimer: NodeJS.Timeout | null = null;\n\nfunction initializeTimer() {\n  if (timerInitialized) return;\n  timerInitialized = true;\n\n  const cfg = getConfig();\n  log.info(\"Initializing periodic flush timer\", {\n    flushIntervalMs: cfg.flushIntervalMs,\n  });\n\n  flushTimer = setInterval(\n    () =>\n      flushOnce().catch((error) => {\n        log.verbose(\"Periodic flush failed, will retry on next interval\", {\n          error: error instanceof Error ? error.message : String(error),\n          nextRetryIn: cfg.flushIntervalMs,\n        });\n      }),\n    cfg.flushIntervalMs\n  );\n  flushTimer.unref();\n}\n\nasync function flushWithRetry(opts: { maxRetries: number }): Promise<void> {\n  for (let attempt = 1; attempt <= opts.maxRetries; attempt++) {\n    try {\n      await flushOnce();\n      return; // Success\n    } catch (error) {\n      if (attempt === opts.maxRetries) throw error;\n\n      const delayMs = Math.min(500 * Math.pow(2, attempt - 1), 4000);\n      log.debug(\"Flush attempt failed, retrying\", {\n        attempt,\n        maxRetries: opts.maxRetries,\n        delayMs,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      await new Promise((resolve) => setTimeout(resolve, delayMs));\n    }\n  }\n}\n\nasync function drainOutboxWithRetry(opts: {\n  maxRetries: number;\n  maxTimeoutMs: number;\n}): Promise<void> {\n  const startTime = Date.now();\n  let attempt = 0;\n\n  while (Date.now() - startTime < opts.maxTimeoutMs) {\n    attempt++;\n\n    try {\n      // Check if outbox is empty\n      const outboxContent = await fs\n        .readFile(getLogPath(), \"utf8\")\n        .catch(() => \"\");\n      if (!outboxContent.trim()) {\n        log.info(\"Outbox is empty, drain complete\");\n        return;\n      }\n\n      // Flush with retry\n      await flushWithRetry({ maxRetries: opts.maxRetries });\n    } catch (error) {\n      log.warn(\"Outbox drain attempt failed\", {\n        attempt,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      const delayMs = Math.min(500 * Math.pow(2, attempt - 1), 4000);\n      await new Promise((resolve) => setTimeout(resolve, delayMs));\n    }\n  }\n\n  throw new Error(`Outbox drain timed out after ${opts.maxTimeoutMs}ms`);\n}\n\nasync function gracefulShutdown(): Promise<void> {\n  log.info(\"Starting graceful shutdown\");\n  closing = true; // Stop accepting new events\n\n  if (flushTimer) {\n    clearInterval(flushTimer);\n    log.debug(\"Cleared periodic flush timer\");\n  }\n\n  // 1. Flush in-memory ring buffer first\n  log.info(\"Flushing in-memory ring buffer\");\n  await flushWithRetry({ maxRetries: 3 });\n\n  // 2. Drain entire outbox.log file\n  log.info(\"Draining persistent outbox\");\n  await drainOutboxWithRetry({ maxRetries: 5, maxTimeoutMs: 30_000 });\n\n  log.info(\"Graceful shutdown completed successfully\");\n}\n\nprocess.on(\"SIGTERM\", async () => {\n  try {\n    await gracefulShutdown();\n    process.exit(0);\n  } catch (error) {\n    log.error(\"Graceful shutdown failed\", {\n      error: error instanceof Error ? error.message : String(error),\n    });\n    flushFailures.inc();\n    process.exit(1); // Non-zero exit for K8s to detect failure\n  }\n});\n\nprocess.on(\"SIGINT\", async () => {\n  try {\n    await gracefulShutdown();\n    process.exit(0);\n  } catch (error) {\n    log.error(\"Graceful shutdown failed\", {\n      error: error instanceof Error ? error.message : String(error),\n    });\n    flushFailures.inc();\n    process.exit(1); // Non-zero exit for K8s to detect failure\n  }\n});\n\nexport const PersistentBatcher = {\n  enqueue: append,\n  flush: flushOnce,\n  gracefulShutdown,\n};\n","import { performance } from \"node:perf_hooks\";\nimport { initTracePrompt as initCfgAsync, ConfigManager } from \"./config\";\nimport { encryptBuffer } from \"./crypto/encryptor\";\nimport { computeLeaf } from \"./crypto/hasher\";\nimport { countTokens } from \"./utils/tokenCounter\";\nimport { PersistentBatcher as Batcher } from \"./queue/persistentBatcher\";\nconst stringify = require(\"json-stable-stringify\") as (v: any) => string;\nimport type { TracePromptInit, WrapOpts, EncryptedBundle } from \"./types\";\n\nimport { registry } from \"./metrics\";\nimport { Histogram } from \"prom-client\";\n\nconst wrapperLatencyHist = new Histogram({\n  name: \"traceprompt_llm_wrapper_latency_ms\",\n  help: \"End‑to‑end latency from prompt send to response receive in the SDK wrapper (ms)\",\n  buckets: [50, 100, 250, 500, 1000, 2000, 5000],\n  registers: [registry],\n});\n\nexport async function initTracePrompt(\n  cfg?: Partial<TracePromptInit>\n): Promise<void> {\n  await initCfgAsync(cfg);\n}\n\nexport function wrapLLM<P extends Record<string, any>, R>(\n  originalFn: (prompt: string, params?: P) => Promise<R>,\n  meta: WrapOpts\n): (prompt: string, params?: P) => Promise<R> {\n  const staticMeta = ConfigManager.cfg.staticMeta;\n\n  return async function wrapped(prompt: string, params?: P): Promise<R> {\n    const t0 = performance.now();\n    const result = await originalFn(prompt, params);\n    const t1 = performance.now();\n\n    wrapperLatencyHist.observe(t1 - t0);\n\n    const plaintextJson = JSON.stringify({\n      prompt,\n      response: result,\n    });\n\n    const enc = await encryptBuffer(Buffer.from(plaintextJson, \"utf8\"));\n\n    const payload = {\n      ...staticMeta,\n      orgId: ConfigManager.cfg.orgId,\n      modelVendor: meta.modelVendor,\n      modelName: meta.modelName,\n      userId: meta.userId,\n      ts_client: new Date().toISOString(),\n      latency_ms: +(t1 - t0).toFixed(2),\n      prompt_tokens: countTokens(prompt),\n      response_tokens: countTokens(\n        typeof result === \"string\" ? result : JSON.stringify(result)\n      ),\n      enc,\n    };\n\n    const leafHash = computeLeaf(stringify(payload));\n    Batcher.enqueue({ payload, leafHash });\n\n    return result;\n  };\n}\n"]}