{"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  base_delay: 100,\n  exponential: true,\n  max_attempts: 3,\n  retryable_codes: [429, 500],\n  cancel_wins: true,\n  dedup_key: 'id',\n  fifo_ties: true,\n  priority_high_first: true,\n  dead_order: 'id',\n  delay_cap: 150,\n  stale_after: 1000,\n  stale_inclusive: true\n};\n","helpers.ts":"export function cmp(a: any, b: any): number { return a < b ? -1 : a > b ? 1 : 0; }\n","core.ts":"import {cmp} from './helpers.ts';\nexport function run(payload: any, policy: any): any {\n  const now = payload.now;\n  const jobs: any[] = payload.jobs || [];\n  const map = new Map<any, {job: any, idx: number}>();\n  jobs.forEach((job, idx) => {\n    const k = job[policy.dedup_key];\n    map.delete(k);\n    map.set(k, {job, idx});\n  });\n  const entries = Array.from(map.values()).sort((a, b) => a.idx - b.idx);\n  const ready: any[] = [], waiting: any[] = [], dead: any[] = [], cancelled: any[] = [];\n  for (const e of entries) {\n    const j = e.job;\n    const code = j.last_code || 0;\n    const retryable = policy.retryable_codes.includes(code);\n    if (j.cancelled && (policy.cancel_wins || !retryable)) { cancelled.push(e); continue; }\n    const age = now - j.created;\n    const stale = policy.stale_inclusive ? age >= policy.stale_after : age > policy.stale_after;\n    if (stale || j.attempt >= policy.max_attempts || (code !== 0 && !retryable)) { dead.push(e); continue; }\n    let due = j.due;\n    if (retryable) {\n      const mult = policy.exponential ? Math.pow(2, Math.max(0, j.attempt - 1)) : 1;\n      const d = j.failed_at + Math.min(policy.base_delay * mult, policy.delay_cap);\n      due = Math.max(due, d);\n    }\n    if (due > now) waiting.push({e, at: due}); else ready.push(e);\n  }\n  ready.sort((a, b) => {\n    let c = cmp(a.job.priority, b.job.priority);\n    if (policy.priority_high_first) c = -c;\n    if (c) return c;\n    c = cmp(a.job.created, b.job.created);\n    if (!policy.fifo_ties) c = -c;\n    if (c) return c;\n    return a.idx - b.idx;\n  });\n  if (policy.dead_order === 'id') dead.sort((a, b) => cmp(a.job.id, b.job.id) || a.idx - b.idx);\n  return {\n    ready: ready.map(e => e.job.id),\n    waiting: waiting.map(w => ({id: w.e.job.id, at: w.at})),\n    dead: dead.map(e => e.job.id),\n    cancelled: cancelled.map(e => e.job.id)\n  };\n}\n"}}