{"files": {"main.ts": "import {run} from './core.ts';\nimport {POLICY} from './policy.ts';\nexport function evaluate(payload: any): any { return run(payload, POLICY); }\n", "core.ts": "import {computeEffectiveDue, isRetryableCode, compareValues} from './helpers.ts';\nexport function run(payload: any, policy: any): any {\n  const now: any = payload ? payload.now : 0;\n  const jobs: any[] = payload && Array.isArray(payload.jobs) ? payload.jobs : [];\n  const byKey = new Map<any, any>();\n  for (let i = 0; i < jobs.length; i++) {\n    const job: any = jobs[i];\n    const dedupValue: any = job ? job[policy.dedup_key] : undefined;\n    byKey.set(dedupValue, {job: job, index: i});\n  }\n  const selected: any[] = Array.from(byKey.values());\n  const ready: any[] = [];\n  const waiting: any[] = [];\n  const dead: any[] = [];\n  const cancelled: any[] = [];\n  for (const entry of selected) {\n    const job: any = entry.job;\n    const retryable: boolean = isRetryableCode(job.last_code, policy.retryable_codes);\n    if (job.cancelled && (policy.cancel_wins || !retryable)) {\n      cancelled.push(entry);\n      continue;\n    }\n    const age: number = now - job.created;\n    const stale: boolean = policy.stale_inclusive ? age >= policy.stale_after : age > policy.stale_after;\n    const exhausted: boolean = job.attempt >= policy.max_attempts;\n    const nonretryableFailure: boolean = job.last_code !== 0 && !retryable;\n    if (stale || exhausted || nonretryableFailure) {\n      dead.push(entry);\n      continue;\n    }\n    const effectiveDue: number = computeEffectiveDue(job, policy, retryable);\n    const enriched: any = {job: job, index: entry.index, at: effectiveDue};\n    if (effectiveDue > now) {\n      waiting.push(enriched);\n    } else {\n      ready.push(enriched);\n    }\n  }\n  ready.sort((a: any, b: any) => {\n    const priorityDiff: number = policy.priority_high_first ? b.job.priority - a.job.priority : a.job.priority - b.job.priority;\n    if (priorityDiff !== 0) return priorityDiff;\n    const createdDiff: number = policy.fifo_ties ? a.job.created - b.job.created : b.job.created - a.job.created;\n    if (createdDiff !== 0) return createdDiff;\n    return a.index - b.index;\n  });\n  if (policy.dead_order === 'id') {\n    dead.sort((a: any, b: any) => {\n      const diff: number = compareValues(a.job.id, b.job.id);\n      if (diff !== 0) return diff;\n      return a.index - b.index;\n    });\n  } else {\n    dead.sort((a: any, b: any) => a.index - b.index);\n  }\n  waiting.sort((a: any, b: any) => a.index - b.index);\n  cancelled.sort((a: any, b: any) => a.index - b.index);\n  return {ready: ready.map((x: any) => x.job.id), waiting: waiting.map((x: any) => ({id: x.job.id, at: x.at})), dead: dead.map((x: any) => x.job.id), cancelled: cancelled.map((x: any) => x.job.id)};\n}\n", "policy.ts": "export const POLICY: any = {\"base_delay\": 200, \"cancel_wins\": false, \"dead_order\": \"input\", \"dedup_key\": \"key\", \"delay_cap\": 400, \"exponential\": false, \"fifo_ties\": false, \"max_attempts\": 4, \"priority_high_first\": false, \"retryable_codes\": [408, 503], \"stale_after\": 2000, \"stale_inclusive\": false};\n", "helpers.ts": "export function isRetryableCode(code: any, codes: any): boolean { return Array.isArray(codes) && codes.includes(code); }\nexport function computeEffectiveDue(job: any, policy: any, retryable: boolean): number { if (!retryable || job.last_code === 0) return job.due; const factor: number = policy.exponential ? 2 ** Math.max(0, job.attempt - 1) : 1; const delay: number = Math.min(policy.base_delay * factor, policy.delay_cap); return Math.max(job.due, job.failed_at + delay); }\nexport function compareValues(a: any, b: any): number { if (typeof a === 'number' && typeof b === 'number') return a - b; const sa: string = String(a); const sb: string = String(b); return sa < sb ? -1 : sa > sb ? 1 : 0; }\n"}}