SIGN IN SIGN UP

fix(ui): ten fixes in the agent rail and the schedules empty state (#2820)

This PR:
- Fixes an issue with the agent details left sidebar app extension items
not always being rendered.
- Fixes content layout shift issues on the chat page so that loading
feels smoother.
- The rest are minor cosmetic fixes


--- 

🤖  Written by claude from here:

Ten fixes in the agent rail and the schedules list. Each is independent,
and none changes behaviour for a build with no extension installed.

| # | Was | Now |
|---|---|---|
| 1 | `agentLinks.details` was built and never read, so "Agent Details"
always led to the pair-keyed page | `agentHref` follows the declared
link |
| 2 | `newChatHref` would have followed it | Still the agent's own
address — `/agents/:id/new` serves nothing |
| 3 | Contributions got only a conversation id, so an entry vanished on
the pair-only pages | `ExtensionAgentRailItemProps` also carries `pair`
|
| 4 | A collapsed rail cancelled a hardcoded `space(6)` gap | Measures
the row's own `column-gap` |
| 5 | `ConversationStateDot` drew a state that no longer varies |
Removed, with the optimistic chain that fed it |
| 6 | Agent Details, the card's second line and select-all arrived with
the record, moving the rail | Drawn in place, inert, before it lands |
| 7 | The rail's sticky offset assumed this app's own header | Reads
`--agent-rail-sticky-top`, same default |
| 8 | Schedules said "No schedules yet" and always reserved an 800px
scroll floor | Says what it means; the floor needs rows |
| 9 | New chat stood 2px shorter as a button than as the link it
replaces | It keeps the row's own border, so the rail does not change
height |
| 10 | The example extension declared no `agentLinks` | It does, which
is what gives these points browser coverage |

## Two worth a sentence

**4** — `AgentChatPage` uses `gap: theme.space(2)`; the other three rail
surfaces use `space(6)`. The rail cancelled 24px of an 8px gap, dragging
the gutter past the left edge of the page and under the sidebar.

**7** — a shell that replaces the header starts its content below its
own chrome, so the default offset landed twice. The rail's wrapper is
tall enough that it does not take a sticky offset while the short gutter
does, so the two drifted apart rather than moving together.

## Testing

```
yarn typecheck        clean
yarn lint             0 errors
yarn test             467 passed
yarn test:pw          121 passed (chromium + chromium-with-extension)
```

Each new assertion fails with its own fix reverted. Firefox was not
exercised; it is not installed on the machine this was written on.

---
*🤖 written by Claude*

---------

Signed-off-by: Nicholas Bucher <behappy54321@gmail.com>
N
Nicholas Bucher committed
e40e4fa46f999853b79981f82d7d2d5f19cd757e
Parent: 800015d
Committed by GitHub <noreply@github.com> on 9/14/2026, 7:40:55 PM