From ef453ccb269fc363017b79145d30778a1a4009cb Mon Sep 17 00:00:00 2001 From: dom-inspector-4 Date: Sun, 4 Oct 2026 04:31:11 +0000 Subject: [PATCH] Verify + extend DOM-SETTINGS/SEARCH/NOTIFICATIONS (2026-10-04, 3 nodes) Session: sidechat/dom-settings --- docs/DOM-NOTIFICATIONS.md | 76 +++++++++++++++++++++++----- docs/DOM-SEARCH.md | 41 ++++++++++++++-- docs/DOM-SETTINGS.md | 101 ++++++++++++++++++++++++-------------- 3 files changed, 164 insertions(+), 54 deletions(-) diff --git a/docs/DOM-NOTIFICATIONS.md b/docs/DOM-NOTIFICATIONS.md index bd82b74..57aa00b 100644 --- a/docs/DOM-NOTIFICATIONS.md +++ b/docs/DOM-NOTIFICATIONS.md @@ -1,23 +1,30 @@ # DOM reference: notifications & activity (muse.ai) Inspected live via CDP on the opm browser (warp-opm netns, port 9440), -2026-10-04. Companion docs: `DOM-CHAT-PANEL.md`, `DOM-MESSAGES.md`, +2026-10-04. Re-verified 2026-10-04 across all three fleet nodes +(muse 9410, pip 9420, opm 9440). +Companion docs: `DOM-CHAT-PANEL.md`, `DOM-MESSAGES.md`, `DOM-PAGE-STRUCTURE.md`. ## TL;DR muse.ai has **no bell icon and no notification center/dropdown**. The -notification surface is three separate things: +notification surface is four separate things: 1. **Toast live region** — `section[aria-label="Notifications alt+T"]` (transient toasts, aria-live). 2. **Activity tab** — `button[aria-label="Activity"]` in the status-panel toolbar (activity feed; tabs: Activity / Approvals / Upcoming / Identity). 3. **Chat nav unread** — `a[data-testid="hatch-nav-chat"]` whose `aria-label` - becomes `"Chat, N notification(s)"` when chats are unread. + becomes `"Chat, N notification(s)"` when chats are unread (observed live on + pip: `"Chat, 1 notification"`, later cleared to `"Chat"`). +4. **Unread dot badges** — transient blue-dot `SPAN`s (see §5). **Correction + 2026-10-04:** these DO exist; the earlier "no badge elements" claim was + wrong — the first sweep ran on opm while it was clean, and the badges only + render while there is unread activity. -There are no badge/dot/pill unread elements in the DOM, and no element with -`notif` in its `data-testid`. +There is no bell icon. The one `data-testid` containing `notif` is +`hatch-dock-chat-notification-badge` (see §5). --- @@ -191,20 +198,55 @@ Do not match the element itself by aria-label — the count suffix changes. ## 5. What does NOT exist -Verified absent (three DOM sweeps, 2026-10-04): +Verified absent (sweeps on all three nodes, 2026-10-04): -- No bell icon element. -- No `data-testid` containing `notif` (full inventory checked). -- No badge / dot / pill / count / unread elements anywhere in the DOM - (regex sweep over testids, class names, and aria-labels — zero hits). +- No bell icon element (zero `aria-label` matches for /bell/i on every node). - No notification dropdown, menu, or dialog container. - No `[data-radix-portal]` / portal roots hosting hidden dropdowns. - Clicking the Activity tab revealed no additional notification list UI (the status panel was already open on the Activity feed). -Unread state is therefore conveyed **only** through: -1. the `hatch-nav-chat` aria-label suffix, and -2. (presumably) unread styling on individual `[data-testid="hatch-thread-row"]` +## 5a. Unread dot badges — CORRECTION 2026-10-04 + +The earlier claim ("no badge / dot / pill elements anywhere") is **wrong**. +Three badge testids exist; they render only while there is unread activity and +are absent when clean (which is why the first sweep on opm missed them): + +| `data-testid` | Observed on | Markup | +|---|---|---| +| `hatch-dock-chat-notification-badge` | pip (while `"Chat, 1 notification"`) | blue dot | +| `hatch-chat-switcher-unread-indicator` | muse | `` — 8×8 blue dot, no text, no `aria-label` | +| `hatch-invite-activity-badge` | muse, pip | `` — 8×8 blue dot | + +All are empty `SPAN`s (`innerText === ""`, no `aria-label`, no `role`) — +pure CSS dots (`bg-fill-blue`, `rounded-full`, `size-2`). **They are transient**: +pip's `hatch-dock-chat-notification-badge` was present during one sweep and gone +minutes later after the unread cleared. Never match on class names (Tailwind); +match on `data-testid` presence: + +```js +// Any unread-dot badges currently rendered? +const unreadDots = [ + 'hatch-dock-chat-notification-badge', + 'hatch-chat-switcher-unread-indicator', + 'hatch-invite-activity-badge', +].filter(tid => document.querySelector(`[data-testid="${tid}"]`)); +``` + +Notes: + +- `hatch-invite-activity-badge` was present on muse and pip even when the chat + nav label was clean (`"Chat"`), so it likely signals invites/activity rather + than chat unread — treat it as its own signal, not as "unread chats". +- `hatch-chat-switcher-unread-indicator` sits on the chat switcher (rect ≈ + (110,20), 8×8 on muse) — useful when the panel is open and the nav label + is out of view. + +Unread state is therefore conveyed through: + +1. the `hatch-nav-chat` aria-label suffix (`"Chat, N notification(s)"`), +2. the transient dot badges above (`data-testid` presence), +3. (presumably) unread styling on individual `[data-testid="hatch-thread-row"]` rows in the chat panel — see `DOM-CHAT-PANEL.md`. The panel was closed during this inspection so row-level unread markers were not sampled; re-probe with the panel open if row-level detection is needed. @@ -222,6 +264,12 @@ document.querySelector('section[aria-label="Notifications alt+T"]') /notification/.test( document.querySelector('[data-testid="hatch-nav-chat"]').getAttribute('aria-label')); +// Any unread dots currently rendered? (transient — absent when clean) +['hatch-dock-chat-notification-badge', + 'hatch-chat-switcher-unread-indicator', + 'hatch-invite-activity-badge' +].filter(tid => document.querySelector(`[data-testid="${tid}"]`)); + // Open the Activity feed (select tab): document.querySelector('button[aria-label="Activity"]').click(); // Which status tab is selected? @@ -240,3 +288,5 @@ document.querySelector('button[data-testid="hatch-status-panel-close"]').click() - Whether tab buttons ever carry counts/badges when items are pending (Approvals tab is the likely candidate — re-probe with a pending approval). - Row-level unread markers inside `hatch-thread-row` (needs panel-open probe). +- What clears `hatch-dock-chat-notification-badge` vs the aria-label suffix + (observed independently transient on pip/muse — may be separate signals). diff --git a/docs/DOM-SEARCH.md b/docs/DOM-SEARCH.md index da145d9..621bc82 100644 --- a/docs/DOM-SEARCH.md +++ b/docs/DOM-SEARCH.md @@ -3,6 +3,7 @@ Muse.ai global search (quick-search / command palette). Inspected live on bl via CDP against the opm browser (warp-opm netns, CDP 127.0.0.1:9440) on 2026-10-04. All selectors verified against the live DOM. +Re-verified end-to-end 2026-10-04 (open → type → results → empty state → Escape). Related: `docs/DOM-CHAT-PANEL.md` (chat panel), `docs/DOM-MESSAGES.md`, `docs/DOM-PAGE-STRUCTURE.md`. @@ -153,14 +154,40 @@ document.querySelectorAll('[data-testid="hatch-quick-search-frame"] [data-testid |---|---|---| | `chat:main` | Main chat | `chat:main` | | `chat:thread:` | Sidechat thread — **the thread UUID is embedded** | `chat:thread:2e2c90a1-4b17-4590-b8ba-fb17d8018d36` | -| `chat:message::` | Individual message match inside a thread | `chat:message:assistant-msg-b2a4e27d-4970-8b1e-8863-a96ed0aa1401:20420` | +| `chat:message:assistant-msg-:` | Individual assistant message match inside a thread | `chat:message:assistant-msg-b2a4e27d-4970-8b1e-8863-a96ed0aa1401:20420` | +| `chat:message::` | Individual message match (non-assistant id form) | `chat:message:08a44cdd-91a7-408e-9073-743e7e15d50f:20890` | Search matches **both threads and individual messages**. A query like `"heartbeat"` -returned 12 results mixing `chat:thread:*` and `chat:message:*` values. +returned 12 results on 2026-10-04 re-verify: 6 `chat:thread:*` + 6 `chat:message:*`, +mixing both message id forms. This is a ready-made thread-lookup mechanism: search for a sidechat name, read `data-value`, extract the UUID — no title-matching or URL polling needed. +### Full result-item markup (verified 2026-10-04) + +```html +
+ cmdk-item="" + role="option" + aria-disabled="false" aria-selected="true" + data-disabled="false" data-selected="true" + data-value="chat:thread:778fbbfa-3bf8-4163-bfe6-92c0f88657e8" + class="... h-12 items-center gap-2 p-1.5 ..."> + …svg icon… + …title + snippet + relative time… +
+``` + +Notes: + +- The **first result is auto-highlighted** on render (`aria-selected="true"` / + `data-selected="true"`); the input's `aria-activedescendant` points at it. + Enter would activate it (navigation not tested). +- `data-value` is the stable automation hook; `id` is random per render. + --- ## 5. Groups @@ -247,9 +274,13 @@ Detection: `querySelector('[cmdk-empty]')` non-null, or item count `=== 0`. // CDP: Input.dispatchMouseEvent mousePressed + mouseReleased at (r.x + r.width/2, r.y + r.height/2) ``` JS `.click()` on the trigger is unreliable (Radix wants trusted events). -2. **Never JS-touch the input.** `focus()`, `click()`, or the native value setter - on `command-palette-search-input` closes the dialog. The input auto-focuses on - open — just send trusted key events (`rawKeyDown` → `char` → `keyUp`). +2. **Type with CDP `Input.insertText`** (verified 2026-10-04 — simplest reliable + path). The raw `rawKeyDown` → `char` → `keyUp` sequence also works but is + unnecessary. **Never JS-touch the input** (`focus()`, `click()`, native value + setter): synthetic interaction on the input **closes the dialog** (verified + twice). One exception observed once: `input.select()` on the already-open + dialog did *not* close it — usable for clearing, but Escape-and-reopen + remains the safest clear. 3. **Closed === absent.** After Escape the dialog node is gone; check `querySelector(...) === null`, with optional chaining (`?.offsetParent`) — without `?.` a missing node throws and a truthy error string can false-positive diff --git a/docs/DOM-SETTINGS.md b/docs/DOM-SETTINGS.md index f534b3f..4f26521 100644 --- a/docs/DOM-SETTINGS.md +++ b/docs/DOM-SETTINGS.md @@ -1,6 +1,7 @@ # DOM Reference: Settings, Profile & Dock Rail Inspected live via CDP on the opm browser (warp-opm netns, CDP 9440), 2026-10-04. +Re-verified 2026-10-04 across all three fleet nodes (muse 9410, pip 9420, opm 9440). Structure only — no credential, token, or personal values are recorded here. Related: `DOM-CHAT-PANEL.md` (chat panel), `DOM-MESSAGES.md` (messages), @@ -18,12 +19,24 @@ The left vertical nav rail. Container: ### Rail items (top to bottom) -| # | Selector | Tag | `aria-label` | Notes | -|---|----------|-----|--------------|-------| -| 1 | `[data-testid="hatch-nav-chat"]` | `` | `Chat` | The chat/message button from the user's screenshot. Navigates `/thread/new` → `https://muse.ai/`. See "chat activation" below. | -| 2 | `[data-testid="hatch-nav-search"]` | `