# Web App: directory browsing de-raced, Project defaults reach new drafts, update dot explained, focused model catalog, protocol hints, "temporary workspace" unified

## Directory browsing no longer mis-navigates under repeated clicks

While a listing was loading, clicking a folder row again in the files panel compounded path segments (`home` → `home/home` → `home/home/home/home`) and stranded the user on "path not found"; the workspace picker could also be silently relocated when a slow directory response landed after a newer one. Listings are now bound to the directory they were fetched for (a double-click recomputes the same target regardless of timing), in-flight navigation disables rows and breadcrumbs, picker requests are sequenced so only the newest response wins (the editable path row included), and the `dir_not_found` server error renders localized copy instead of the raw English message with the malformed path in it.

## Saving Project new-chat defaults resets the new-conversation draft

Opening `/chat/new` once pinned the then-current Agent / workspace / approval mode into the per-user draft cache, and that stale draft shadowed any later change to the Project's new-chat defaults. Saving the defaults now strips the corresponding cached pins — typed-but-unsent text, staged skills and chips survive — and live-reseeds a draft page open in the same tab (its debounced persist would otherwise write the old values right back); other tabs pick the change up on their next visit. The model pin is still released exactly when the default model itself changes, keeping the "switch becomes default" carry-over intact.

## The avatar update dot explains itself

The sidebar avatar's update indicator now names the available release in a hover tooltip and accessible label (the update row's exact wording), and the collapsed icon rail's avatar shows the same indicator — previously the dot was unlabeled and the rail showed nothing. A passive subscriber gap in the version-info cache was fixed along the way so the rail sees results that land while it is mounted.

## Model catalog opens focused on DeepSeek

The models page now expands only the DeepSeek group by default; other vendor groups and user-defined groups start collapsed. While a search query is active, any group holding matches is force-opened (derived, not persisted) so results can never hide inside a collapsed group. The user's own expand/collapse toggles persist per Project (localStorage, same pattern as the sidebar's group collapse) and are restored on the next visit; with nothing stored, the DeepSeek-only default applies.

## Model dialog explains protocols instead of warning about them

The model config dialog's base URL field now carries an in-field grey suffix showing the exact path the client appends to the base URL — `/chat/completions` for OpenAI-compatible entries (gateways, custom groups, DeepSeek/Z.AI/Moonshot/Qwen), `/responses` for OpenAI direct, `/v1/messages` for Anthropic, `/v1beta/models` for Gemini (each verified against the actual SDK request paths) — replacing the wordy "this model speaks the vendor's official protocol" warning. Preset direct-vendor groups' mechanism hints (AgentHub auto-routing, env-var fallback) are unified into one user-facing line: "Only <vendor>'s official API protocol is supported; use a custom model group for OpenAI-compatible endpoints."

## "Temporary workspace" unified

The auto-created session workspace is now consistently called 临时工作区 / "temporary workspace" across the workspace picker, its hints, the schedule form, server/SDK error messages, docs, and the penguin-sdk skill (v19) — replacing the mixed "auto temp directory" wording. Persisted keys, ids and the on-disk `workspaces/tmp-<8hex>` shape are untouched.
