worker: separate display metadata

This commit is contained in:
2026-07-26 17:45:46 +09:00
parent ff905d4a22
commit 006762f900
12 changed files with 206 additions and 34 deletions
@@ -114,13 +114,16 @@ Deno.test("workspace Worker list lives on the dedicated Workers page", async ()
assert(
workersPage.includes("workerConsoleHref(worker, data.workspaceId)") &&
workersPage.includes('<table class="workers-table">') &&
workersPage.includes('class="icon-action"') &&
workersPage.includes("Delete ${worker.label}"),
workersPage.includes("workerDisplayName = worker.display_name || worker.label") &&
workersPage.includes("worker <code>{worker.worker_id}</code>") &&
workersPage.includes("Delete ${workerDisplayName}"),
"dedicated Workers page should expose a table, console link target, and icon actions per Worker",
);
assert(
workersNav.includes("href={`/w/${workspaceId}/workers`}") &&
workersNav.includes("filter(canShowWorkerInSidebar)") &&
workersNav.includes("worker.display_name || worker.label") &&
workersNav.includes("worker {worker.worker_id}") &&
!workersNav.includes('aria-disabled="true"'),
"Workers sidebar should link to the Worker list page and omit registry-only Workers",
);
@@ -105,11 +105,11 @@
<li>
<a href={href} class="nav-item worker-nav-item" class:active={currentPath === href} aria-current={currentPath === href ? 'page' : undefined}>
<span class="worker-title-row">
<span class="item-title">{worker.label}</span>
<span class="item-title">{worker.display_name || worker.label}</span>
<span class="worker-task-title">-</span>
</span>
<span class="item-meta">
{worker.role ? `${worker.role} · ` : ''}{worker.state} · 🖥 {worker.host_id}
worker {worker.worker_id} · {worker.role ? `${worker.role} · ` : ''}{worker.state} · 🖥 {worker.host_id}
{worker.working_directory ? ` · wd:${worker.working_directory.repository_id}@${worker.working_directory.resolved_commit.slice(0, 8)}` : ''}
</span>
</a>
@@ -77,9 +77,12 @@ export type Worker = {
runtime_id: string;
worker_id: string;
host_id: string;
display_name: string;
label: string;
role?: string | null;
profile?: string | null;
singleton_key?: string | null;
tags: string[];
workspace: { visibility: string; identity: string };
state: string;
pinned?: boolean;
@@ -16,9 +16,12 @@ function worker(overrides: Partial<Worker>): Worker {
runtime_id: "arc",
worker_id: "1",
host_id: "host",
label: "worker-1",
display_name: "Worker 1",
label: "Worker 1",
role: null,
profile: null,
singleton_key: null,
tags: [],
workspace: { visibility: "workspace", identity: "workspace" },
state: "running",
pinned: false,
@@ -190,14 +190,15 @@
{@const cleanup = cleanupCandidate(worker)}
{@const canDelete = cleanup && !cleanup.blocking_reason}
{@const anyActionDisabled = actionsDisabled()}
{@const workerDisplayName = worker.display_name || worker.label}
<tr>
<td>
{#if canOpenWorkerConsole(worker)}
<a class="worker-title-link" href={workerConsoleHref(worker, data.workspaceId)}><strong>{worker.label}</strong></a>
<a class="worker-title-link" href={workerConsoleHref(worker, data.workspaceId)}><strong>{workerDisplayName}</strong></a>
{:else}
<strong>{worker.label}</strong>
<strong>{workerDisplayName}</strong>
{/if}
<small><code>{worker.worker_id}</code></small>
<small>worker <code>{worker.worker_id}</code></small>
</td>
<td><code>{worker.runtime_id}</code></td>
<td>{workerProfile(worker)}</td>
@@ -205,12 +206,12 @@
<td><span class="pill {worker.pinned ? 'success' : 'muted'}">{worker.retention_state ?? 'normal'}</span></td>
<td>{workerDirectory(worker)}</td>
<td>
<div class="worker-actions" aria-label={`Actions for ${worker.label}`}>
<div class="worker-actions" aria-label={`Actions for ${workerDisplayName}`}>
<button
class="icon-action"
type="button"
disabled={anyActionDisabled}
aria-label={worker.pinned ? `Unpin ${worker.label}` : `Pin ${worker.label}`}
aria-label={worker.pinned ? `Unpin ${workerDisplayName}` : `Pin ${workerDisplayName}`}
title={worker.pinned ? 'Unpin' : 'Pin'}
onclick={() => setPinned(worker, !worker.pinned)}
>
@@ -227,7 +228,7 @@
class="icon-action danger"
type="button"
disabled={!canDelete || anyActionDisabled}
aria-label={`Delete ${worker.label}`}
aria-label={`Delete ${workerDisplayName}`}
title={cleanup.blocking_reason ?? cleanup.reason}
onclick={() => deleteWorker(worker, cleanup)}
>