{#if error} {/if} {#if series}
`${v.toFixed(0)}%`} accent="var(--success, #16a34a)" /> fmtDuration(v)} accent="var(--warning, #d97706)" />
{/if}

Average durations by type

{#if summaryLoading}

Loading…

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

No operations recorded yet.

{:else} {#each orderedSummary as s (s.op)} {#if s.op === 'chapter' && perPageMs != null} {/if} {/each}
Type Avg N OK / Fail Success
{opLabel(s.op)} {fmtDuration(s.avg_ms)} {s.n} {s.ok} / {s.failed} {successPct(s)}
└ per page (≈) {fmtDuration(perPageMs)} ≈{Math.round(chapter?.avg_items ?? 0)} pages/chapter
{/if}

Recent operations

{#if opsLoading}

Loading…

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

No operations match.

{:else} {#each rows as r (r.id)} r.error && (expanded = expanded === r.id ? null : r.id)} data-testid={`crawler-op-${r.id}`} > {#if expanded === r.id && r.error} {/if} {/each}
Type Target Dur Outcome When
{opLabel(r.op)} {r.manga_title ? `${r.manga_title}${r.chapter_number != null ? ` · Ch ${r.chapter_number}` : ''}` : '—'} {fmtDuration(r.duration_ms)} {r.outcome} {fmtAgo(r.finished_at)}
{r.error}
{/if}