mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
> 🤖 This PR was modified by Coder Agents on behalf of Jake Howell. The agent logs tab was snapping to **Startup Script** whenever `getAgentHealthIssues` returned _any_ issue, including non-script issues like: - agent `status` of `connecting`, `timeout`, or `disconnected` - lifecycle `shutting_down`, `shutdown_error`, or `shutdown_timeout` - any script with status `timed_out`, `exit_failure`, or `pipes_left_open` So users routinely landed on a filtered Startup Script view (even mid-connect) and had to click back to **All Logs** to see the full picture. ### Change - Default to **All Logs** on mount. - Once logs stream in, if any script has actually failed _and_ its source has rendered log entries, auto-select that script's tab. The visibility check is the same one the tab list uses, so we never point `selectedLogTab` at a tab that isn't rendered. - A ref ensures the auto-select fires at most once and never overrides a manual tab change by the user. - The failure predicate (`exit_code` truthy or `status` set and not `"ok"`) is extracted into an `isScriptFailed` helper so the auto-select and the per-tab error indicator stay aligned. ### Behavior matrix | Agent state | Before | After | | ------------------------------------------------------ | --------------- | ------------------------------ | | Healthy, scripts running normally | All Logs | All Logs | | `connecting` / `timeout` / `disconnected` | Startup Script | All Logs | | `shutting_down` / `shutdown_error` | Startup Script | All Logs | | Startup Script failed, has logs | Startup Script | Startup Script | | Non-startup script failed, has logs (e.g. install) | Startup Script | The failed script's tab | | Failed script with **no logs**, other sources have logs| Startup Script (broken: tab not rendered) | All Logs | ### Test coverage Four `play` functions on `AgentRow.stories.tsx`, each pinned to a hardcoded tab name so a predicate regression can't silently pass: - **`StartError`** — failed script with logs is auto-selected. - **`StartErrorWithoutFailedSourceLogs`** — failed script with no logs keeps All Logs active; we never point at an invisible tab. - **`ConnectingWithStartupLogs`** — connecting agent with no script failure stays on All Logs (locks in the bug fix for connection-only issues). - **`NonStartupScriptError`** — only a non-startup script fails (Startup Script is OK); the auto-select tracks the failure, not position or display name. Each play function was verified to actually run by deliberately failing the assertion once and confirming the test errored. <details> <summary>Decision log</summary> The shape evolved during review: 1. First pass: collapse to `useState("all")`. Reviewer noted this lost the auto-jump for legitimate failures. 2. Second pass: `useState(failedSourceId ?? "all")`. Codex flagged that `failedSourceId` could point to a tab with no rendered entries, breaking the Logs panel. 3. Final pass (this PR): `useState("all")` + `useEffect` + ref. Auto-jump only fires once, only when the failed source has rendered logs, and never overrides a manual selection. Deferred from coder-agents-review feedback: - **DEREM-5**: `agent.log_sources.find(...)` can disagree with the tab bar's sort order when multiple non-startup scripts fail concurrently. Low probability, one click to recover. Worth a follow-up if it becomes a real complaint. </details> ### Verification - `pnpm check` (biome) — clean - `pnpm lint:types` (tsc) — clean - `pnpm vitest run --project "storybook (chromium)" src/modules/resources/AgentRow` — 28/28 passed --------- Co-authored-by: Atif Ali <atif@coder.com> Co-authored-by: Jeremy Ruppel <jeremy.ruppel@gmail.com>