feat: surface L2 agent pool and escalations on supervisor screen

- routing-service: GET /escalations (list recent escalation attempts)
- supervisor UI: new panel showing the real agent pool (status, level,
  tenant, skills, calls handled) fed by GET /agents, with a form to add
  operators to the pool
- supervisor UI: new live escalation feed (AI->L2 handoffs, status,
  assigned operator), auto-refreshed every 5s alongside live calls
This commit is contained in:
Hermes Agent
2026-08-29 13:28:14 +05:00
parent 2243f305b8
commit 1ad4e1ec6e
4 changed files with 332 additions and 2 deletions
+41
View File
@@ -35,6 +35,8 @@
<a class="nav-link" href="#realtime"><span class="nav-bullet"></span>Оперативный срез</a>
<a class="nav-link" href="#liveCalls"><span class="nav-bullet"></span>Живые звонки</a>
<a class="nav-link" href="#agents"><span class="nav-bullet"></span>Агенты</a>
<a class="nav-link" href="#callRoutingAgents"><span class="nav-bullet"></span>Пул L2 (звонки)</a>
<a class="nav-link" href="#escalations"><span class="nav-bullet"></span>Эскалации</a>
<a class="nav-link" href="#queues"><span class="nav-bullet"></span>Очереди</a>
<a class="nav-link" href="#knowledge"><span class="nav-bullet"></span>База знаний</a>
</div>
@@ -153,6 +155,45 @@
<ul id="agentsList" class="list"></ul>
</article>
<article class="panel reveal" id="callRoutingAgents">
<h2>Пул операторов L2 (звонки)</h2>
<p class="hint">Реальный пул для эскалации звонков с Voice AI (L1) на живых операторов +7 747 645 6048. Отдельно от демо-статусов в блоке «Агенты» выше — здесь показан фактический пул Routing Engine.</p>
<div class="actions compact-actions">
<button id="loadCallAgentsBtn" class="btn ghost">Обновить пул</button>
</div>
<div id="callAgentsSummary" class="summary-grid"></div>
<ul id="callAgentsList" class="list"></ul>
<details class="details-block">
<summary>Добавить оператора в пул</summary>
<div class="inline-form split-two">
<input id="newAgentExtension" placeholder="Внутренний номер (напр. 2001)" />
<input id="newAgentDisplayName" placeholder="Имя оператора" />
</div>
<div class="inline-form split-two">
<select id="newAgentLevel">
<option value="L2" selected>L2 — оператор</option>
<option value="L3">L3 — технический специалист</option>
</select>
<input id="newAgentTenant" placeholder="Tenant ID" value="konturai" />
</div>
<div class="inline-form compact">
<input id="newAgentSkills" placeholder="Навыки через запятую (необязательно)" />
<button id="createCallAgentBtn" class="btn">Добавить в пул</button>
</div>
</details>
</article>
<article class="panel reveal" id="escalations">
<h2>Эскалации AI → оператор</h2>
<p class="hint">Живая лента: какие звонки Voice AI передал(-ает) на L2 и кто из операторов их принял.</p>
<div class="actions compact-actions">
<button id="loadEscalationsBtn" class="btn ghost">Обновить эскалации</button>
</div>
<div id="escalationsSummary" class="summary-grid"></div>
<ul id="escalationsList" class="list"></ul>
</article>
<article class="panel reveal" id="queues">
<h2>Очередь</h2>
<div class="inline-form split-two">