fix(ui-web): say a failed connect or test under the agent, not instead of it - #785
Conversation
gloryfromca
left a comment
There was a problem hiding this comment.
Blocking: the failed-test note can direct the user to a button that is not present.
I found one actionable state mismatch inline. I reviewed the full diff and relevant extAgents rendering, store/source state transitions, callers, recent history, compatibility behavior, and the repository rules in AGENTS.md, CONTEXT-MAP.md, and ui-web/CONTEXT.md. I also checked that the changed tests preserve the existing behaviors rather than weakening them.
Verification: npm run type-check passed; the focused extAgents/CSS suite passed (117 tests); the full npm test suite passed (210 files, 3037 tests); npm run lint completed with no errors and four pre-existing warnings in untouched files.
2acd321 to
6838324
Compare
gloryfromca
left a comment
There was a problem hiding this comment.
Blocking: the existing failed-test note/action mismatch remains unchanged.
The rebase compatibility work for the new runtime remedy is coherent, but the open finding still reproduces: after the test case clears needs_auth while leaving the row unconfigured and failed, noteOf names Test while AgentSheet renders Connect. I found no additional blocker in this revision, and the original thread remains open.
I reviewed the fresh github/main...HEAD diff, the rebase delta, the extAgents state/action callers, the new remedy compatibility path, recent history, backward compatibility, test changes, and the applicable AGENTS.md and Web UI context constraints.
Verification: npm run type-check passed; the focused extAgents and CSS suite passed (6 files, 169 tests); the full npm test suite passed (210 files, 3041 tests).
…d of it The agent connector used to replace the line about an agent with a red sentence when a connect was refused or a test failed, and grew the card and the sheet to fit whatever it had to say. Now every card is one fixed shape: the name, two lines of room for what the agent does, and a slot that always speaks. With nothing wrong the slot says which state the row is in (connected, available, not installed, and when a passed test passed); a refused write or a failed test fills it with a single-line strip in clay, one word for what failed and a short reason read from the server's remedy kind; a write in flight fills it in amber. The press that answers a strip is the card's corner control, where connect and install already live, so the strip itself carries no button. The sheet keeps its 520x500 box and folds the server's sentence and its fix into a note that scrolls inside the body. Before the first roster arrives the grid draws one placeholder card per catalogue entry, since the catalogue is the roster on every machine, with the same shimmer the settings sections wait with. Agent marks now sit on a light plate in both themes, the way the app icon does, and the dark theme filters no mark: inverting hermesagent.svg gave its negative and the hue rotation that put qoder's green back landed on a different green. The plate is a token that does not follow the theme, and the embedded color-scheme is pinned light on the tile so raven.svg and miromind.svg draw their light selves on it under either theme. The general settings' language hint now says it picks the interface's language rather than Raven's. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
… note The note at the top of the sheet told the reader to press Test after any failed test on a row that was not connected. The bar offers Test only to an unauthorized row. A row whose test has since cleared its handshake, and an endpoint still waiting on its key, show Connect alone, so the note named a control that was not there. The note now reads its press from the same branches as the bar: a connected row retests, an unauthorized one tests, any other row that is not connected connects, which runs the same test. The endpoint test that pinned Test for a row waiting on its key now expects Connect, and a new case walks every state a failed test can leave a row in and checks the note names a button the bar renders. Co-authored-by: Claude (claude-opus-5-5) <noreply@anthropic.com>
6838324 to
c52fb63
Compare
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
The action-label mismatch is fixed: the note now follows the same state branches as the sheet action bar, and the regression test covers the original transition plus connected, unauthorized, available, and key-waiting rows. I replied to and resolved my finding thread.
I reviewed the updated github/main...HEAD diff, the new commit, the affected state/action callers, compatibility behavior, test changes, and the previously covered repository and Web UI constraints. No new finding survived review.
Verification: npm run type-check passed; the focused extAgents and CSS suite passed (6 files, 181 tests).
Summary
The agent connector (Settings > Agent connections, and the onboarding agents step) is reworked around what goes wrong on it. Frontend only: no RPC change, and every word drawn comes from fields
subagents.*already sends (data.detailanddata.remedyon a refused write,last_test_*on a row).A failure is said under the agent, not instead of it. A refused connect or a failed test used to replace the line about the agent with a red sentence, and a card or sheet grew to fit it. Now:
remedy.kind(every kind, including the ones fix(*): a refused Qwen Code connect names the fix and the command #779, fix(*): a Qwen Code on an old Node.js names it, and its model fix runs /auth #786 and fix(*): a refused Kimi Code connect says why and names the fix #781 added), or "see why" when there is none. A write in flight fills it in amber. Cards measured at one height across every state.healthOf); the why and the how are a note at the top of the body that scrolls with it: a title per remedy kind,FIX_SAY's sentence, the command (or fix(*): a refused Qwen Code connect names the fix and the command #779's two numbered steps whenremedy.thenis set), and the server's sentence folded under it. Without a remedy the server's sentence is shown as it came, since it is the only reason there is.thenas a second piece of code; "run it to see why" fornetwork,silentandconfig; and "open it in a browser" for aplan, whose command is the page that sells one.Waiting. Before the first roster arrives the grid draws one placeholder card per catalogue entry (the catalogue is the roster on every machine), with the settings sections' shimmer; the tab counts wait as bars rather than showing 0. The shimmer gate now covers these bars too.
Agent marks in the dark theme. Every mark now sits on a light plate in both themes, as the app icon does, and no filter reaches a mark. Inverting
hermesagent.svggave its negative, and the hue rotation that put qoder's green back landed on a different green (#2ADB5C -> #008203). The plate is a token (--mark-plate) declared by every theme block, and the embeddedcolor-schemeis pinned light on the tile, soraven.svgandmiromind.svgdraw their light selves on it.agent-mark-css.test.mjsis rewritten to pin that: no filter on a mark, the plate token in every theme path, the scheme pinned on the tile and not on:root.Copy. The general settings' language hint now says it picks the interface's language rather than Raven's.
Rebased onto #773, #779, #786 and #781, which touch the same files. #773's
healthOfstays the one verdict for the dot and the sheet's head; the card's footer and corner, and the sheet's note, are this change's. #773's rule that an off row wears no dot for a failed test is kept; its footer still says so. #779'sFIX_SAYtable and step labels feed the note, with #786's remedy passed through so theruntimesentence names both Node.js versions; aruntimefix sent without them reads as a launch that quit in the title and on the card too (kindOf), asFIX_SAYalready says it; its row sentences (bad_run*,bad_retry,bad_open) and thefix_unknown_*keys have no caller left and are removed.Earlier decisions this changes, for their authors to confirm:
.agent-marktile on the page, not only the connector.configrow says to runkimi doctor configto see where the file is wrong (as fix(*): a refused Kimi Code connect says why and names the fix #781's sheet sentence does), where fix(*): a refused Kimi Code connect says why and names the fix #781's row said to run it and retry.Review follow-up. The failed-test note named Test for every row that was not connected, but the sheet's bar offers Test only to an unauthorized row; a row whose test has since cleared its handshake, and an endpoint still waiting on its key, show Connect alone. The note now reads its press from the same branches as the bar (
testPress), and a test walks every state a failed test can leave a row in and checks the note names a button the bar renders. The endpoint test that expected Test for a row waiting on its key now expects Connect.Type
Verification
After the rebase onto
mainat05cac1f1:npx vitest run --maxWorkers=4inui-web-- 210 files, 3055 tests passed; the extAgents suites and page gates alone (npx vitest run src/features/extAgents scripts/gates) 385 testsnpx tsc --noEmit -p .andnpm run lintinui-web-- 0 errors (the 4 warningsmainalready has)node scripts/check-css.mjs,node scripts/check-class-namespace.mjs,npm run build && python3 build.py && node scripts/check-page.mjsinui-web-- OKnpm run gen:checkinui-web-- generated.ts matches the contractnpm run gen:i18nandnpm run lint:i18ninui-tui-- the generated table is up to dateuv run pytest tests/test_ui_agent_marks.py -q-- 7 passedReal browser (Playwright on the Vite dev page, zh and en, light and dark), with failure states injected from backend-shaped fixtures (sign_in, setup, api_key, download, and model with a
thenstep; the unit tests take every kind): all 11 cards 149px tall across healthy, testing and failed states and in the placeholder grid; the sheet 520x500 for 7 rows in different states; a click on the corner retry does not open the sheetAgainst a live gateway (Vite dev server proxying
/authto it): the real 18-row roster renders with the new footer and plateRelevant tests pass locally
Relevant lint / type checks pass locally
User-facing docs or screenshots are updated when needed
No user-facing docs describe the agent cards.
Risk
User-visible: the card and sheet layout for failures, the corner control now also retries and retests, the waiting grid, and every agent mark sits on a light plate in the dark theme (a visible change to all mark tiles there, including the sub-agents card and pane headers that share
.agent-mark). No RPC, config or stored-state change; reverting the squash commit restores the previous page.Related Issues
N/A