diff --git a/frontend/src/lib/components/ProcessingFlowBoard.svelte b/frontend/src/lib/components/ProcessingFlowBoard.svelte index f66bf77..16752dc 100644 --- a/frontend/src/lib/components/ProcessingFlowBoard.svelte +++ b/frontend/src/lib/components/ProcessingFlowBoard.svelte @@ -1,16 +1,18 @@
- +
처리 머신
@@ -219,80 +297,107 @@ onclick={openFailures} >실패 {totalFailed}건 처리 {/if} - {#if spark} -
- - - - - 요약 24h 유입/소화 -
- {/if} + + + {freshLabel}{#if stale} · 갱신 지연{/if} +
- -
- {#each machineStrip as m (m.key)} -
- - {m.meta?.label ?? m.label} - {m.meta?.model} - {formatRate(m.done_1h)}/h - {#if m.key === 'macbook' && m.deferred_pending > 0} - 보류 {m.deferred_pending} - {/if} + +
+ 지배 백로그 + 요약 + 대기 {eta.pending.toLocaleString()} · 순소화 {formatRate(eta.done_rate_1h)}/h · 유입 {formatRate(eta.inflow_rate_1h)}/h + + 정직 ETA + {honestEtaLabel} + +
+ + +
+ {#each lanes as lane (lane.key)} +
+
+ + {lane.meta.label} + {lane.meta.model} + {formatRate(lane.card?.done_1h ?? 0)}/h + {#if lane.key === 'macbook' && (lane.card?.deferred_pending ?? 0) > 0} + 보류 {lane.card?.deferred_pending} + {/if} + {#if lane.card?.state === 'deferred'} + 잠듦 — 요약은 맥미니로 복귀 + {/if} +
+
+ {#each lane.nodes as n (n.def.key)} + {@const idle = n.pending + n.processing + n.doneToday + n.failed === 0} + + {/each} + {#if lane.key === 'macbook' && offloadActive} + + {/if} +
{/each}
- -
- {#each mainNodes as n, i (n.def.key)} - {#if i > 0} - - {/if} -
toggleNode(n.def.key)} - onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleNode(n.def.key); } }} - title="{n.def.label} — 클릭하면 상세" - > - {#if n.failed > 0} - - {/if} - - {MACHINE_META[n.def.machine].label} · {n.def.engine} - -
- {n.def.label} - {#if n.processing > 0} - - {/if} - {#if n.inflowDominant} - 유입 우세 - {/if} -
-
- {n.pending.toLocaleString()} -
-
- {formatRate(n.done1h)}/h · 오늘 {n.doneToday.toLocaleString()} - {#if n.etaMinutes != null && !n.inflowDominant && n.pending > 0} - · {etaShort(n.etaMinutes)} - {/if} -
+ + {#if burn} +
+
+ 요약 백로그 24시간 + 유입(회색) vs 소화(녹색) + {#if offloadActive}맥북 합류 {burn.markHour} — 소화 급증{/if}
- {/each} -
+ + + + + {#if offloadActive} + + {/if} + +
+ {#each mainNodes.filter((n) => n.pending > 0 && n.def.key !== 'summarize') as n (n.def.key)} + {n.def.label} 대기 {n.pending.toLocaleString()}{#if netEtaLabel(n)} · {netEtaLabel(n)}{/if} + {/each} +
+
+ {/if}

@@ -413,6 +518,9 @@ .mtag-gpu { background: #e7eef6; color: #3b6ea5; } .mtag-macmini { background: #efe9f7; color: #8a5fbf; } .mtag-macbook { background: #f7eedd; color: #b07a10; } + /* 요약 오프로드 분담 막대 채움 (맥미니 보라 / 맥북 황) */ + .mtag-macmini-bar { background: #8a5fbf; } + .mtag-macbook-bar { background: #b07a10; } .node-sel { outline: 2px solid #3b6ea5; outline-offset: 1px; } .detail-frame { border-color: #3b6ea5; } .detail-head { background: #e7eef6; }