Showing recent jobs — completed jobs are pruned after the retention window; dead jobs persist until requeued.

{#if error} {/if} {#if loading}

Loading…

{:else if rows.length === 0}

No jobs match.

{:else} {#each rows as r (r.id)} r.last_error && (expanded = expanded === r.id ? null : r.id)} data-testid={`crawler-history-row-${r.id}`} > {#if expanded === r.id && r.last_error} {/if} {/each}
State Type Target Dur Att. Updated
{r.state} {r.kind ?? '—'} {#if !r.manga_title && r.payload_title && r.source_url} {target(r)} {:else} {target(r)} {/if} {fmtDuration(r.duration_ms)} {r.attempts}/{r.max_attempts} {fmtAgo(r.updated_at)} {#if r.state === 'dead'} {/if}
{r.last_error}
{/if}