chore(fleet): sync operator memory, hatch menu dialogs, and watchdog alerts
This commit is contained in:
+37
-15
@@ -48,26 +48,48 @@ settled-state probes (`DOM-PAGE-STRUCTURE.md` §3.2). The dialog is found
|
||||
**by text, not by structure** — this is the central fragility of the current
|
||||
implementation.
|
||||
|
||||
Known structural facts:
|
||||
Known structural facts (Verified 2026-10-06 live capture on fleet):
|
||||
- The dialog is in-DOM (React-rendered), so `Runtime.evaluate` sees it; no
|
||||
shadow-DOM piercing has been needed so far.
|
||||
- Buttons are plain `<button>` elements matched by innerText
|
||||
(`allow` / `deny` / `block`, case-insensitive).
|
||||
- Per `AGENTS.md` (2026-10-03): React selectors behave identically in
|
||||
headful and headless environments, so selectors captured headless apply
|
||||
to the user's browser too — and vice versa.
|
||||
shadow-DOM piercing needed.
|
||||
- Container: `div[data-testid="hatch-inline-approval-card"]` with
|
||||
`data-hatch-approval-surface="panel"`.
|
||||
- Header: `div[data-testid="approval-panel-header"]`.
|
||||
- Primary Allow action: `button[data-hatch-approval-primary-action="true"]` ("Allow once").
|
||||
- Dropdown options: `button[data-slot="dropdown-menu-trigger"]` (contains "Always allow").
|
||||
- Deny action: `<button>` with innerText "Deny".
|
||||
- Secondary/Background queued approvals surface:
|
||||
`div[data-testid="hatch-inline-approval-card"][data-hatch-background-approval-surface="true"]`
|
||||
with `<p class="text-footnote text-text-secondary">N tasks need review</p>`
|
||||
and `<button data-pel-click="chat_background_approval_review">Review</button>`.
|
||||
|
||||
Candidate selectors to verify on next live capture (none confirmed yet):
|
||||
### Confirmed Live Selectors (2026-10-06):
|
||||
```javascript
|
||||
'[role="dialog"]',
|
||||
'[role="alertdialog"]',
|
||||
'[data-testid*="dialog"]',
|
||||
'[data-testid*="approval"]',
|
||||
'[data-testid*="permission"]',
|
||||
// button-level (confirmed pattern, unconfirmed testids):
|
||||
'button' // innerText matches /allow once|always allow|deny/i
|
||||
// Active approval panel container
|
||||
'div[data-testid="hatch-inline-approval-card"]'
|
||||
// Panel header
|
||||
'[data-testid="approval-panel-header"]'
|
||||
// Primary action button ("Allow once")
|
||||
'button[data-hatch-approval-primary-action="true"]'
|
||||
// Background review surface ("N tasks need review" / "A task needs review")
|
||||
'[data-hatch-background-approval-surface="true"]'
|
||||
// Background review button trigger
|
||||
'[data-pel-click="chat_background_approval_review"]'
|
||||
```
|
||||
|
||||
### Queued Background Task Reviews ("N tasks need review")
|
||||
When multiple scheduled tasks or background operations trigger approval prompts concurrently (e.g. `opm` with scheduled Fleet Health Monitor runs):
|
||||
1. Muse renders the first approval card inline over chat.
|
||||
2. Below it, Muse docks a background approval banner:
|
||||
`<div data-testid="hatch-inline-approval-card" data-hatch-background-approval-surface="true">`
|
||||
stating `"N tasks need review"` with a `"Review"` button (`data-pel-click="chat_background_approval_review"`).
|
||||
3. Allowing or denying the active approval immediately advances the queue: the next queued task pops into the active inline panel, decrementing the background count (e.g. from 2 down to "A task needs review" to clear).
|
||||
4. Automated approval engines must inspect both the active card and `[data-hatch-background-approval-surface="true"]` to confirm whether agents remain blocked.
|
||||
|
||||
### Troubleshooting Blocked Agents
|
||||
- **In `muse-tui`**: Type `/blocked` (or press `[a]` / `F2`) from any view to open the Approvals & Blocked Tasks Drawer. Use `j`/`k` or arrow keys to navigate between blocked nodes; press `[1]` to Allow, `[2]` Always, `[3]` Deny, `[R]` Proceed, `[X]` Dismiss. Actions target the highlighted agent.
|
||||
- **In CLI**: Run `box blocked` or `box approvals` to view fleet approval status; use `box approvals allow <node>` to approve.
|
||||
|
||||
|
||||
## 3. How `check_approvals` works today
|
||||
|
||||
Location: `bin/muse-chat-api.py`, `check_approvals(ws)` (~line 70).
|
||||
|
||||
Reference in New Issue
Block a user