{"files":{"main.ts":"import {run} from './core.ts';\nimport {POLICY} from './policy.ts';\nexport function evaluate(payload: any): any { return run(payload, POLICY); }\n","policy.ts":"export const POLICY: any = {\n  delete_wins: true,\n  latest_by: 'seq',\n  scope_key: 'tenant',\n  tie_policy: 'first',\n  allow_resurrection: true,\n  amount_mode: 'absolute',\n  gap_policy: 'accept',\n  precision: 0,\n  audit_duplicate: true,\n  order: 'key',\n  inclusive_age: true,\n  max_age: 60\n};\n","helpers.ts":"export type Dec = { n: bigint; s: number };\nexport function parseDec(str: any): Dec {\n  let t = String(str).trim();\n  let neg = false;\n  if (t[0] === '-') { neg = true; t = t.slice(1); } else if (t[0] === '+') { t = t.slice(1); }\n  const i = t.indexOf('.');\n  let ip = i < 0 ? t : t.slice(0, i);\n  let fp = i < 0 ? '' : t.slice(i + 1);\n  if (ip === '') ip = '0';\n  let n = BigInt(ip + fp);\n  if (neg) n = -n;\n  return { n, s: fp.length };\n}\nexport function addDec(a: Dec, b: Dec): Dec {\n  const s = Math.max(a.s, b.s);\n  const an = a.n * 10n ** BigInt(s - a.s);\n  const bn = b.n * 10n ** BigInt(s - b.s);\n  return { n: an + bn, s };\n}\nexport function fmtDec(a: Dec, p: number): string {\n  let neg = a.n < 0n;\n  let n = neg ? -a.n : a.n;\n  if (a.s <= p) {\n    n = n * 10n ** BigInt(p - a.s);\n  } else {\n    const d = 10n ** BigInt(a.s - p);\n    let q = n / d;\n    const r = n % d;\n    if (r * 2n >= d) q += 1n;\n    n = q;\n  }\n  let str = n.toString();\n  if (p > 0) {\n    while (str.length <= p) str = '0' + str;\n    str = str.slice(0, str.length - p) + '.' + str.slice(str.length - p);\n  }\n  if (neg && n !== 0n) str = '-' + str;\n  return str;\n}\nexport function cmp(a: string, b: string): number {\n  return a < b ? -1 : a > b ? 1 : 0;\n}\n","core.ts":"import {parseDec, addDec, fmtDec, cmp} from './helpers.ts';\n\nexport function run(payload: any, policy: any): any {\n  const now = payload.now;\n  const events: any[] = payload.events || [];\n  const field = policy.latest_by === 'ts' ? 'ts' : 'seq';\n  const kept: { e: any; i: number }[] = [];\n  for (let i = 0; i < events.length; i++) {\n    const e = events[i];\n    const age = now - e.ts;\n    if (age > policy.max_age) continue;\n    if (age === policy.max_age && !policy.inclusive_age) continue;\n    kept.push({ e, i });\n  }\n  const seen = new Set<string>();\n  const duplicates: any[] = [];\n  const uniq: { e: any; i: number }[] = [];\n  for (const k of kept) {\n    const key = policy.scope_key === 'tenant' ? JSON.stringify([k.e.tenant, k.e.id]) : JSON.stringify([k.e.id]);\n    if (seen.has(key)) {\n      if (policy.audit_duplicate) duplicates.push(k.e.id);\n      continue;\n    }\n    seen.add(key);\n    uniq.push(k);\n  }\n  const groups = new Map<string, { tenant: any; entity: any; items: { e: any; i: number }[] }>();\n  for (const k of uniq) {\n    const gk = JSON.stringify([k.e.tenant, k.e.entity]);\n    let g = groups.get(gk);\n    if (!g) { g = { tenant: k.e.tenant, entity: k.e.entity, items: [] }; groups.set(gk, g); }\n    g.items.push(k);\n  }\n  const out: { tenant: any; entity: any; value: string; deleted: boolean; first: number }[] = [];\n  const prec = policy.precision;\n  for (const g of groups.values()) {\n    const first = g.items[0].i;\n    const byField = new Map<number, { e: any; i: number }>();\n    for (const k of g.items) {\n      const f = k.e[field];\n      if (!byField.has(f)) byField.set(f, k);\n      else if (policy.tie_policy === 'last') byField.set(f, k);\n    }\n    const retained = Array.from(byField.values());\n    retained.sort((a, b) => a.e[field] - b.e[field] || a.i - b.i);\n    let seq = 0;\n    let value = { n: 0n, s: 0 };\n    let deleted = false;\n    let anyDelete = false;\n    for (const k of retained) {\n      const e = k.e;\n      if (e.kind === 'delete') anyDelete = true;\n      if (policy.gap_policy === 'ignore' && e.seq !== seq + 1) continue;\n      seq = e.seq;\n      if (e.kind === 'delete') {\n        deleted = true;\n      } else if (e.kind === 'set') {\n        if (!deleted || policy.allow_resurrection) {\n          deleted = false;\n          const amt = parseDec(e.amount);\n          value = policy.amount_mode === 'delta' ? addDec(value, amt) : amt;\n        }\n      }\n    }\n    if (policy.delete_wins && anyDelete) deleted = true;\n    out.push({ tenant: g.tenant, entity: g.entity, value: fmtDec(value, prec), deleted, first });\n  }\n  if (policy.order === 'key') {\n    out.sort((a, b) => cmp(String(a.tenant), String(b.tenant)) || cmp(String(a.entity), String(b.entity)));\n  } else {\n    out.sort((a, b) => a.first - b.first);\n  }\n  return {\n    entities: out.map(o => ({ tenant: o.tenant, entity: o.entity, value: o.value, deleted: o.deleted })),\n    duplicates\n  };\n}\n"}}