Adds an agent filter to the FL0W header (#1473): a select listing the live agents narrows the timeline to messages involving the chosen agent (matched on `from` OR `to`). Each message row now carries `data-from`/`data-to`; non-matching rows get `.flow-hidden`. New rows pick up the active filter at render time; changing the filter re-scans existing rows. The selection persists in localStorage so a reload or tab-switch keeps the view. The dropdown is populated from the live container list (and stays current on container add/remove); a saved selection survives even if that agent isn't currently listed. Pure frontend; composes with the sent+delivered collapse (the surviving collapsed row keeps its `data-from`/`data-to`). Closes #1473.
90 lines
3.9 KiB
HTML
90 lines
3.9 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>hyperhive // FL0W</title>
|
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
<link rel="stylesheet" href="/static/theme.css">
|
|
<link rel="stylesheet" href="/static/common.css">
|
|
<link rel="stylesheet" href="/static/flow.css">
|
|
</head>
|
|
<body class="flow-shell">
|
|
|
|
<!-- Minimal chrome: just a back link. No full tabbar — the main
|
|
dashboard already has the tab strip. The flow page is a
|
|
dedicated full-viewport terminal surface; navigating back
|
|
is the only chrome needed. -->
|
|
<header class="logs-header">
|
|
<a class="logs-back" href="/">← dashboard</a>
|
|
<span class="logs-title">FL0W</span>
|
|
<select id="flow-agent-filter" class="flow-filter" title="filter timeline by agent" aria-label="filter timeline by agent">
|
|
<option value="">all agents</option>
|
|
</select>
|
|
</header>
|
|
|
|
<!-- Operator inbox flyout trigger — count + click → side panel
|
|
(singleton, declared below). Hidden until the inbox is non-
|
|
empty. Mirrors the agent page's header pill pattern. -->
|
|
<button type="button" id="inbox-pill" class="flow-pill" hidden
|
|
title="open operator inbox">
|
|
<span class="flow-pill-icon" aria-hidden="true">📬</span>
|
|
<span class="flow-pill-label">inbox</span>
|
|
<span class="flow-pill-count" id="inbox-pill-count">0</span>
|
|
</button>
|
|
|
|
<!-- Main content: the full-viewport terminal. Padded for the
|
|
overlay header + composer so the first/last rows stay
|
|
reachable. -->
|
|
<main class="flow-main flow-main-slim">
|
|
<div class="terminal-wrap">
|
|
<div id="msgflow" class="live terminal"><div class="meta">connecting…</div></div>
|
|
</div>
|
|
</main>
|
|
|
|
<!-- Fixed-overlay composer at the bottom. Same frosted treatment
|
|
as the header — symmetric framing, terminal goes edge-to-edge
|
|
between them. -->
|
|
<footer class="flow-composer">
|
|
<div id="op-compose" class="op-compose">
|
|
<span id="op-compose-prompt" class="op-compose-prompt">@—></span>
|
|
<textarea id="op-compose-input" class="op-compose-input"
|
|
placeholder="@agent message… (enter sends, shift+enter newline, tab completes @-mention)"
|
|
rows="1" autocomplete="off"></textarea>
|
|
<div id="op-compose-suggest" class="op-compose-suggest" hidden></div>
|
|
</div>
|
|
</footer>
|
|
|
|
<!-- Inbox rendered offscreen — kept in the DOM so flow.js's
|
|
renderInbox keeps working unchanged. The pill click handler
|
|
opens the side panel which displays a clone of the list. The
|
|
legacy section heading would otherwise be visible; hidden
|
|
here. -->
|
|
<div id="inbox-section" class="flow-inbox-headless" hidden>
|
|
<p class="meta">loading…</p>
|
|
</div>
|
|
|
|
<!-- Slide-in side panel. Singleton — JS swaps the title + body
|
|
and toggles `.open`. On this page only used to surface the
|
|
operator inbox flyout; the dashboard's other panel uses
|
|
(approval diffs, file previews, logs) don't apply here. -->
|
|
<div id="side-panel" class="side-panel" aria-hidden="true">
|
|
<div class="side-panel-backdrop" id="side-panel-backdrop"></div>
|
|
<aside class="side-panel-drawer" role="dialog" aria-modal="true"
|
|
aria-labelledby="side-panel-title">
|
|
<header class="side-panel-head">
|
|
<span class="side-panel-title" id="side-panel-title"></span>
|
|
<button type="button" class="side-panel-close" id="side-panel-close"
|
|
title="close (esc)">✕</button>
|
|
</header>
|
|
<div class="side-panel-body" id="side-panel-body"></div>
|
|
</aside>
|
|
</div>
|
|
|
|
<!-- Flow-specific bundle. Contains the broker terminal init, the
|
|
operator-inbox derived store, the inbox pill flyout, and the
|
|
@-mention composer. Tab renderers etc. live in
|
|
`/static/tabs.js` which /flow.html doesn't load. -->
|
|
<script type="module" src="/static/flow.js" defer></script>
|
|
</body>
|
|
</html>
|