# muse.ai Chat Panel & Sidechat DOM Reference
> Captured live via CDP on `opm` browser (warp-opm netns, CDP 9440) on 2026-10-04.
> Page: `https://muse.ai/`, title "Chat — operator-main".
> This is a development reference for reliable automation of the chat navigation panel
> and sidechat creation. Prefer these selectors over text matching.
---
## 1. Chat Panel Switcher
**Selector:** `[data-testid="hatch-chat-switcher-trigger"]`
The button that toggles the chat navigation panel open/closed. Always present in the DOM,
top-left of the viewport.
```html
```
**Key facts:**
| Property | Value |
|---|---|
| Tag | `BUTTON` |
| Always in DOM | Yes (both panel states) |
| Visible | Yes (`offsetParent !== null`) |
| Position | Top-left: `x:84, y:12, w:82, h:36` |
| `aria-expanded` | **Not set** (`null`) — do NOT use for state detection |
| Visible text | `Chats` |
| Screen-reader text | `Open chat and side chats` |
| Icon | Hamburger menu (3 horizontal lines), not a chat bubble |
**Parent chain (bottom-up, 4 levels):**
```
1. DIV [data-testid="hatch-chat-leading-controls"]
class="pointer-events-auto absolute start-3 top-0 flex h-[60px] items-center gap-2"
2. DIV (no testid) class="pointer-events-none absolute inset-x-0 top-0 z-10 h-44"
3. DIV (no testid) class="absolute inset-0 overflow-hidden"
4. DIV (no testid) class="relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden"
```
**Behavior:** The switcher **toggles**. Clicking when the panel is closed opens it;
clicking when open closes it. Always check panel state before clicking — never
blind-click.
**Child testids** (for reference):
- `[data-testid="hatch-chat-switcher-icon-knockout"]` — icon wrapper span
- `[data-testid="hatch-chat-switcher-navigation-icon"]` — the hamburger SVG span
---
## 2. Sidechat Create Button ("New side chat")
**Selector:** `[data-testid="hatch-chat-compose"]`
The `+` button that creates a new sidechat. **Only exists in the DOM when the panel
is OPEN.** This makes it the most reliable "panel is open and ready" signal.
```html
```
**Key facts:**
| Property | Value |
|---|---|
| Tag | `BUTTON` |
| In DOM when panel closed | **No** — completely absent |
| In DOM when panel open | Yes |
| Text content | None (icon-only) |
| `aria-label` | `New side chat` |
| `title` | `New side chat` |
| Icon | Plus sign (`+`), single SVG path |
**Parent chain (bottom-up, 8 levels):**
```
1. SPAN (no testid) class="contents" ← direct wrapper
2. DIV (no testid) class="group/nav-section flex w-full items-center"
children: [H3 "Side chats", SPAN(contents) > BUTTON#compose]
3. SECTION (no testid) class="flex flex-col" ← "Side chats" section
children: [DIV(header: H3 + compose), DIV(chat list)]
4. DIV (no testid) class="flex flex-col relative grow-1"
children: [DIV[data-testid="hatch-thread-row"] (Main chat),
SECTION (Side chats),
DIV[data-testid="active-side-chat-load-more-sentinel"]]
5. DIV (no testid) class="flex flex-col overflow-hidden relative z-0 overflow-y-auto overscroll-y-contain min-h-0 min-w-0 flex-1 px-3 pb-3"
6. DIV (no testid) class="flex min-h-0 flex-1 flex-col"
7. DIV (no testid) class="text-text-primary flex h-full min-h-0 w-full flex-col overflow-hidden"
8. DIV (no testid) class="min-h-0 min-w-0 flex-1"
```
**Location in UI:** Inside the "Side chats" section header row, to the right of the
`H3` "Side chats" collapsible heading.
**What clicking does:** Creates a new sidechat. Browser navigates to
`https://muse.ai/thread/new` (placeholder URL; the real thread UUID appears after
the first message is sent or navigation settles).
---
## 3. Chat Navigation Panel Structure
### 3a. Panel shell (always in DOM)
**Selector:** `[data-testid="hatch-side-chats-panel-shell"]`
```html
```
| State | `innerHTML` | `innerText` |
|---|---|---|
| Closed | `""` (empty string) | `""` |
| Open | Full `