diff --git a/web/workspace/deno.json b/web/workspace/deno.json
index c3a7acf36..3b9e7853b 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 --bin yoi-server -- serve --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,test,tests,../../docs --allow-env=LOG,VSCODE_TEXTMATE_DEBUG,NODE_ENV tests/workspace-model.test.ts tests/repository-api.test.ts tests/workspace-catalog.test.ts tests/profile-api.test.ts tests/skill-api.test.ts tests/tooltip-contract.test.ts tests/bevel-contract.test.ts tests/bevel-line-contract.test.ts tests/typography-contract.test.ts src/lib/workspace/auth/model.test.ts tests/auth-api.test.ts src/lib/workspace/api/http.test.ts src/lib/workspace/api/workers.test.ts src/lib/workspace/header/breadcrumb-model.test.ts src/lib/workspace/console/chat-submit.test.ts src/lib/workspace/console/composer-delivery.test.ts test/composer-history.test.ts tests/composer-paste.test.ts src/lib/workspace/console/composer-command.test.ts src/lib/workspace/console/composer-draft.test.ts src/lib/workspace/console/composer-completion.test.ts test/console/ansi.test.ts src/lib/workspace/console/model.test.ts src/lib/workspace/console/run-status.test.ts src/lib/workspace/companion/api.test.ts tests/workdir-api.test.ts src/lib/workspace/console/tasks.test.ts test/ticket-detail-route-reuse.test.ts test/objective-pages.test.ts test/repositories/ui.test.ts src/lib/workspace/console/worker-console.ui.test.ts src/lib/workspace/settings/model.test.ts tests/runtime-connection.test.ts tests/runtime-management.test.ts tests/runtime-management-source.test.ts src/lib/workspace/sidebar/override-stack.test.ts src/lib/workspace/sidebar/workers.test.ts src/lib/workspace/sidebar/workspace-switcher.test.ts src/lib/workspace/sidebar/worker-subscription.test.ts src/lib/workspace/sidebar/worker-launch.test.ts test/sidebar/worker-actions.test.ts src/lib/workspace/tickets/merge-request-resources.test.ts src/lib/workspace/tickets/ticket-panel.test.ts test/merge-request-status.test.ts test/config-source/decodal-grammar.test.ts test/config-source/editor-state.test.ts test/config-source/fixed-schema-wrapper.test.ts test/config-source/toolchain.test.ts test/config-source/wasm-parity.test.ts test/repository-access/api.test.ts test/repository-access/loader.test.ts test/repository-access/ui.test.ts test/repository-ssh-connection-ui.test.ts",
+ "test": "deno test --allow-read=src,test,tests,../../docs --allow-env=LOG,VSCODE_TEXTMATE_DEBUG,NODE_ENV tests/workspace-model.test.ts tests/repository-api.test.ts tests/workspace-catalog.test.ts tests/profile-api.test.ts tests/skill-api.test.ts tests/tooltip-contract.test.ts tests/bevel-contract.test.ts tests/bevel-line-contract.test.ts tests/typography-contract.test.ts src/lib/workspace/auth/model.test.ts tests/auth-api.test.ts src/lib/workspace/api/http.test.ts src/lib/workspace/api/workers.test.ts src/lib/workspace/header/breadcrumb-model.test.ts src/lib/workspace/console/chat-submit.test.ts src/lib/workspace/console/composer-delivery.test.ts test/composer-history.test.ts tests/composer-paste.test.ts src/lib/workspace/console/composer-command.test.ts src/lib/workspace/console/composer-draft.test.ts src/lib/workspace/console/composer-completion.test.ts test/console/ansi.test.ts src/lib/workspace/console/model.test.ts src/lib/workspace/console/run-status.test.ts src/lib/workspace/companion/api.test.ts tests/workdir-api.test.ts src/lib/workspace/console/tasks.test.ts test/ticket-detail-route-reuse.test.ts test/objective-pages.test.ts test/repositories/ui.test.ts src/lib/workspace/console/worker-console.ui.test.ts src/lib/workspace/settings/model.test.ts tests/runtime-connection.test.ts tests/runtime-management.test.ts tests/runtime-management-source.test.ts src/lib/workspace/sidebar/override-stack.test.ts src/lib/workspace/sidebar/workers.test.ts src/lib/workspace/sidebar/workspace-switcher.test.ts src/lib/workspace/sidebar/worker-subscription.test.ts src/lib/workspace/sidebar/worker-workdir-meta.test.ts src/lib/workspace/sidebar/worker-launch.test.ts test/sidebar/worker-actions.test.ts src/lib/workspace/tickets/merge-request-resources.test.ts src/lib/workspace/tickets/ticket-panel.test.ts test/merge-request-status.test.ts test/config-source/decodal-grammar.test.ts test/config-source/editor-state.test.ts test/config-source/fixed-schema-wrapper.test.ts test/config-source/toolchain.test.ts test/config-source/wasm-parity.test.ts test/repository-access/api.test.ts test/repository-access/loader.test.ts test/repository-access/ui.test.ts test/repository-ssh-connection-ui.test.ts",
"test:component": "deno run -A npm:vitest@3.2.4 run --config vitest.config.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/lib/workspace/console/worker-console.ui.test.ts b/web/workspace/src/lib/workspace/console/worker-console.ui.test.ts
index 774df4ab1..5f5094f8f 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
@@ -219,6 +219,9 @@ Deno.test("workspace Worker list lives on the dedicated Workers page", async ()
const workersNav = await Deno.readTextFile(
new URL("../sidebar/WorkersNavSection.svelte", import.meta.url),
);
+ const workerWorkdirMeta = await Deno.readTextFile(
+ new URL("../sidebar/worker-workdir-meta.ts", import.meta.url),
+ );
const sidebar = await Deno.readTextFile(
new URL("../sidebar/WorkspaceSidebar.svelte", import.meta.url),
);
@@ -256,12 +259,18 @@ Deno.test("workspace Worker list lives on the dedicated Workers page", async ()
workersNav.includes("worker.display_name || worker.label") &&
workersNav.includes("worker-status-dot") &&
workersNav.includes("worker-status-spinner") &&
- workersNav.includes("workdirMeta(worker)") &&
- workersNav.includes("attachment.alias") &&
- workersNav.includes("attachment.repository_key ?? '—'") &&
- workersNav.includes("attachment.working_directory_id") &&
+ workersNav.includes("sidebarWorkdirMeta(worker.workdir_attachments)") &&
+ workersNav.includes("title={workdir.details}") &&
+ !workersNav.includes("attachment.alias") &&
+ workerWorkdirMeta.includes("workdir.current_selector") &&
+ workerWorkdirMeta.includes("workdir.creation_selector") &&
+ workerWorkdirMeta.includes("explicitReferenceFallback(") &&
+ workerWorkdirMeta.includes('"detached"') &&
+ sidebarCss.includes(".worker-nav-meta") &&
+ sidebarCss.includes("text-overflow: ellipsis") &&
+ sidebarCss.includes("white-space: nowrap") &&
!workersNav.includes('aria-disabled="true"'),
- "Workers sidebar should link to the Worker list page and show state indicators with repository/workdir metadata",
+ "Workers sidebar should show truncated repo:branch Workdir metadata with detached fallback and detail-only attachment identifiers",
);
assert(
workersNav.includes("COLLAPSED_WORKER_COUNT = 6") &&
diff --git a/web/workspace/src/lib/workspace/sidebar/WorkersNavSection.svelte b/web/workspace/src/lib/workspace/sidebar/WorkersNavSection.svelte
index 3260def2e..6adcb63c5 100644
--- a/web/workspace/src/lib/workspace/sidebar/WorkersNavSection.svelte
+++ b/web/workspace/src/lib/workspace/sidebar/WorkersNavSection.svelte
@@ -12,6 +12,7 @@
type SidebarWorker,
} from './worker-subscription';
import { canShowWorkerInSidebar, sidebarWorkerActivity } from './workers';
+ import { sidebarWorkdirMeta } from './worker-workdir-meta';
const COLLAPSED_WORKER_COUNT = 6;
type WorkerActionKind = 'stop' | 'delete';
@@ -37,14 +38,6 @@
Math.max(0, workers.length - COLLAPSED_WORKER_COUNT),
);
- function workdirMeta(worker: SidebarWorker): string {
- const attachments = worker.workdir_attachments;
- if (attachments.length === 0) return '—';
- return attachments
- .map((attachment) => `${attachment.alias}: ${attachment.repository_key ?? '—'}・${attachment.working_directory_id}`)
- .join(', ');
- }
-
function workerKey(worker: SidebarWorker): string {
return `${worker.runtime_id}:${worker.worker_id}`;
}
@@ -180,6 +173,7 @@
{@const activity = sidebarWorkerActivity(worker)}
{@const key = workerKey(worker)}
{@const label = worker.display_name || worker.label}
+ {@const workdir = sidebarWorkdirMeta(worker.workdir_attachments)}
{label}
-
- {workdirMeta(worker)}
+
+ {workdir.text}