mcp-connection-form.test.tsxfix(forms): an input is a well, and the add-MCP modal has room to be one
Inputs and textareas were `bg-background` — the app canvas — while the
select next to them was `bg-sunken`. Inside a dialog, whose sheet is also
`background`, that made every text field the same colour as the paper
behind it while the select beside it read as a control. Same for the
"Popular systems" cards in the add-MCP step, which were `bg-card`
(RAISED), so the thing you pick from sat on top of the sheet instead of
into it. All three are one surface now.
`border-input` went with them: Cedar defines `--input` as the sunken
SURFACE, not a border colour as shadcn means it, so that class was
drawing the border in the fill colour.
The add-MCP and connections dialogs take the wider sizes. Tool
permissions loses both its paragraphs — one told you to do the thing the
button beside it does; the button now sits on the label's own row.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>
Claude-Session: https://claude.ai/code/session_01DFkAfWRuLsdTkpxrFhTKYWAug 31, 2026, 12:18 AMmcp-tool-checklist.test.tsxfeat(agents): frontend for agent-workspace phases 2-14
One pass over every UI surface the design describes:
- Config §2 Connections (ceiling ∩ grant, three tool states not two) + Files grants
- Memory tab: editable panes, char cap, accept/decline proposal cards, reflect
- Home: agents as rows grouped by folder, under a collapsed agenda
- Share menu with publish preview, folder picker, debug rail, Run now
- MCP permissions captured at connection setup, with New/Review badges
Backend gaps the UI exposed, closed rather than papered over:
- accepting a proposal now actually patches the instruction body (resolveProposal
only recorded the decision, so the card claimed a change that never happened)
- agent.replaceMemoryFile: a pane save was clear-then-append, so a failure between
them left the file at its bare heading
- agent.getFileGrants/setFileGrants; the frontmatter patcher learned list values,
written INLINE because its line parser mangles a YAML block list
- userSettings.homeSectionsCollapsed: the blob strips undeclared keys, so the
collapse preference was writing to nowhere. Hook is optimistic — deriving it
from the server value alone made every fold wait for a round trip.
Also fixed: normalizeAuthorizationHeader matched \s not \s, so pasting a full
'Bearer sk-…' produced 'Bearer Bearer sk-…'.
148 frontend tests, 1193 backend tests, both typechecks clean.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 25, 2026, 8:56 PMmcp-tool-policy.test.tsfeat(agents): frontend for agent-workspace phases 2-14
One pass over every UI surface the design describes:
- Config §2 Connections (ceiling ∩ grant, three tool states not two) + Files grants
- Memory tab: editable panes, char cap, accept/decline proposal cards, reflect
- Home: agents as rows grouped by folder, under a collapsed agenda
- Share menu with publish preview, folder picker, debug rail, Run now
- MCP permissions captured at connection setup, with New/Review badges
Backend gaps the UI exposed, closed rather than papered over:
- accepting a proposal now actually patches the instruction body (resolveProposal
only recorded the decision, so the card claimed a change that never happened)
- agent.replaceMemoryFile: a pane save was clear-then-append, so a failure between
them left the file at its bare heading
- agent.getFileGrants/setFileGrants; the frontmatter patcher learned list values,
written INLINE because its line parser mangles a YAML block list
- userSettings.homeSectionsCollapsed: the blob strips undeclared keys, so the
collapse preference was writing to nowhere. Hook is optimistic — deriving it
from the server value alone made every fold wait for a round trip.
Also fixed: normalizeAuthorizationHeader matched \s not \s, so pasting a full
'Bearer sk-…' produced 'Bearer Bearer sk-…'.
148 frontend tests, 1193 backend tests, both typechecks clean.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 25, 2026, 8:56 PMmeeting-integration-card-oauth.test.tsxfix(meetings): stop offering an OAuth alternative that cannot backfill
Granola, Fireflies, Gong and Clari have live MCP endpoints and registered OAuth
drivers, so "Authorize with X" completed and stored a refreshing connection. But
their `listMeetings` still runs a Superglue tool against the provider's REST API
(public-api.granola.ai/v1/notes, api.fireflies.ai/graphql, api.gong.io/v2/calls,
rest-api.copilot.clari.com/calls) with the pasted credential, and an MCP token is
issued for the MCP resource, so it cannot authenticate those calls.
A user who authorized and never pasted a key therefore got a connection that
reads as connected and whose backfill throws from `getGranolaCredentials` and its
siblings. Offering a choice that half-works is worse than not offering it.
`usesMcpOAuth` answers "would the flow complete", which is the right question for
skipping the Klavis round trip and the wrong one for offering the alternative.
Split them: a new `mcpOAuthAlternative` driver capability answers "would the
resulting connection actually fetch", and the button renders on that. No driver
sets it today, so the alternative is offered nowhere.
Flipping it is one line per provider, once that provider's Superglue tool calls
its MCP endpoint the way fetch-circleback-meetings and fetch-krisp-meetings
already do. The server-side allowance in initiateOAuth is left in place: it is
correct, and it is what the flip will need.
The OAuth-flow tests moved off the Granola fixture, which no longer renders that
button, onto Circleback, whose fetch path genuinely reads the MCP token and whose
main Connect button starts the same flow. That is the more representative case.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 30, 2026, 1:26 PM