diff --git a/.yoi/tickets/00001KX7Z3WE6/item.md b/.yoi/tickets/00001KX7Z3WE6/item.md index 66c79193..8b96ed13 100644 --- a/.yoi/tickets/00001KX7Z3WE6/item.md +++ b/.yoi/tickets/00001KX7Z3WE6/item.md @@ -1,8 +1,8 @@ --- title: 'Disable Console links for archived Workers' -state: 'inprogress' +state: 'done' created_at: '2026-07-11T06:51:23Z' -updated_at: '2026-07-11T06:52:17Z' +updated_at: '2026-07-11T07:01:17Z' assignee: null queued_by: 'yoi ticket' queued_at: '2026-07-11T06:52:17Z' diff --git a/.yoi/tickets/00001KX7Z3WE6/thread.md b/.yoi/tickets/00001KX7Z3WE6/thread.md index c9a99f57..f9ba66ed 100644 --- a/.yoi/tickets/00001KX7Z3WE6/thread.md +++ b/.yoi/tickets/00001KX7Z3WE6/thread.md @@ -39,4 +39,33 @@ Ticket を `yoi ticket` が queued にしました。 State changed to `inprogress`. +--- + + + +## Implementation report + +Archived registry-only Workers no longer render as Console links. + +- Added shared `canOpenWorkerConsole` helper that rejects `state: archived` and `implementation.kind: backend_worker_registry`. +- Sidebar renders archived Workers as disabled readonly rows instead of anchors. +- Workers page shows `Archived` instead of `Open Console` for archived Workers. +- Added unit coverage for live vs archived Console availability. + +Validation: +- cd web/workspace && deno task check +- cd web/workspace && deno task test +- git diff --check +- nix build .#yoi --no-link + + +--- + + + +## State changed + +State changed to `done`. + + --- diff --git a/web/workspace/deno.json b/web/workspace/deno.json index aa67cda9..bec65306 100644 --- a/web/workspace/deno.json +++ b/web/workspace/deno.json @@ -6,7 +6,7 @@ "dev": "deno run -A npm:vite@7.2.7 dev", "dev:backend": "cd ../.. && cargo run -p yoi-workspace-server -- serve --workspace . --db .yoi/workspace.db --listen 127.0.0.1:8787", "check": "deno run -A npm:@sveltejs/kit@2.49.4 sync && deno run -A npm:svelte-check@4.3.4 --tsconfig ./tsconfig.json", - "test": "deno test --allow-read=src --allow-env=VSCODE_TEXTMATE_DEBUG src/lib/workspace-api/http.test.ts src/lib/workspace-console/markdown.test.ts src/lib/workspace-console/model.test.ts src/lib/workspace-console/worker-console.ui.test.ts src/lib/workspace-settings/model.test.ts src/lib/workspace-sidebar/worker-launch.test.ts src/lib/workspace-sidebar/repository-nav.test.ts", + "test": "deno test --allow-read=src --allow-env=VSCODE_TEXTMATE_DEBUG src/lib/workspace-api/http.test.ts src/lib/workspace-console/markdown.test.ts src/lib/workspace-console/model.test.ts src/lib/workspace-console/worker-console.ui.test.ts src/lib/workspace-settings/model.test.ts src/lib/workspace-sidebar/workers.test.ts src/lib/workspace-sidebar/worker-launch.test.ts src/lib/workspace-sidebar/repository-nav.test.ts", "build": "deno run -A npm:vite@7.2.7 build", "preview": "deno run -A npm:vite@7.2.7 preview" }, diff --git a/web/workspace/src/app.css b/web/workspace/src/app.css index 562eaeb1..03028145 100644 --- a/web/workspace/src/app.css +++ b/web/workspace/src/app.css @@ -436,6 +436,15 @@ gap: 2px; } + .worker-nav-item.disabled { + cursor: default; + opacity: 0.62; + } + + .worker-nav-item.disabled .item-title { + color: var(--text-muted); + } + .worker-title-row { display: grid; grid-template-columns: minmax(0, max-content) minmax(0, 1fr); diff --git a/web/workspace/src/lib/workspace-console/worker-console.ui.test.ts b/web/workspace/src/lib/workspace-console/worker-console.ui.test.ts index 292c0667..c7cd3ed4 100644 --- a/web/workspace/src/lib/workspace-console/worker-console.ui.test.ts +++ b/web/workspace/src/lib/workspace-console/worker-console.ui.test.ts @@ -14,7 +14,10 @@ Deno.test("workspace Worker list lives on the dedicated Workers page", async () new URL("./../../routes/w/[workspaceId]/+page.svelte", import.meta.url), ); const workersPage = await Deno.readTextFile( - new URL("./../../routes/w/[workspaceId]/workers/+page.svelte", import.meta.url), + new URL( + "./../../routes/w/[workspaceId]/workers/+page.svelte", + import.meta.url, + ), ); const workersNav = await Deno.readTextFile( new URL("../workspace-sidebar/WorkersNavSection.svelte", import.meta.url), @@ -24,8 +27,8 @@ Deno.test("workspace Worker list lives on the dedicated Workers page", async () ); assert( - workspacePage.includes('href={`/w/${workspaceId}/runtimes`}') && - workspacePage.includes('href={`/w/${workspaceId}/workers`}'), + workspacePage.includes("href={`/w/${workspaceId}/runtimes`}") && + workspacePage.includes("href={`/w/${workspaceId}/workers`}"), "top workspace page should link to Runtimes and Workers pages", ); assert( @@ -35,15 +38,15 @@ Deno.test("workspace Worker list lives on the dedicated Workers page", async () ); assert( workersPage.includes("workerConsoleHref(worker, data.workspaceId)") && - workersPage.includes("