feat(desk): promover modern UI v0.12.2 para produção desk.ligbox.com.br
Merge staging validado: topnav por zonas, desk-modern.css, app unificado (Escopo OPS, blocklist, SSO Console), backup legacy e scripts promote/rollback. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
a1e4f43dbb
commit
aef9864034
8 changed files with 5443 additions and 129 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
# Backlog — Ligbox Ops Platform (VM122)
|
# Backlog — Ligbox Ops Platform (VM122)
|
||||||
|
|
||||||
**Última atualização:** 2026-06-25 (Console v2 F1 · Spec 019)
|
**Última atualização:** 2026-06-26 (Desk modern v0.12.2 prod · Spec 018/019)
|
||||||
**Projeto:** `ligbox-ops-platform`
|
**Projeto:** `ligbox-ops-platform`
|
||||||
**VM122:** `ligbox-ops` · `10.10.10.122` · SSH WAN `:2522`
|
**VM122:** `ligbox-ops` · `10.10.10.122` · SSH WAN `:2522`
|
||||||
**VM112:** Portal/Wizard — integração **API + webhooks** (fora do compose)
|
**VM112:** Portal/Wizard — integração **API + webhooks** (fora do compose)
|
||||||
|
|
@ -111,6 +111,7 @@
|
||||||
| **OPS-3** | P0 | `tenant-registry` (VM112 = 1º nó) | ✅ |
|
| **OPS-3** | P0 | `tenant-registry` (VM112 = 1º nó) | ✅ |
|
||||||
| **OPS-7** | P1 | VM123 finance stack (Spec 024) | ✅ |
|
| **OPS-7** | P1 | VM123 finance stack (Spec 024) | ✅ |
|
||||||
| **OPS-8** | P1 | Console v2 F1 — home unificada `console.ligbox.com.br` (Spec 019) | ✅ 2026-06-25 |
|
| **OPS-8** | P1 | Console v2 F1 — home unificada `console.ligbox.com.br` (Spec 019) | ✅ 2026-06-25 |
|
||||||
|
| **OPS-9** | P1 | Desk modern UI v0.12.2 — topnav + Serviços IaaS (`desk.ligbox.com.br`) | ✅ 2026-06-26 |
|
||||||
| **AUD-1** | P0 | Collectors: Carbonio, DNS, nginx | 🔄 parcial |
|
| **AUD-1** | P0 | Collectors: Carbonio, DNS, nginx | 🔄 parcial |
|
||||||
| **AUD-2** | P0 | UI `/ops/overview` + API scorecard | 🔄 parcial |
|
| **AUD-2** | P0 | UI `/ops/overview` + API scorecard | 🔄 parcial |
|
||||||
| **AUD-3** | P1 | Scorecard por domínio (8 checks) | 🔄 |
|
| **AUD-3** | P1 | Scorecard por domínio (8 checks) | 🔄 |
|
||||||
|
|
|
||||||
46
deploy/desk-staging-modern/promote-staging-to-prod.sh
Executable file
46
deploy/desk-staging-modern/promote-staging-to-prod.sh
Executable file
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Promove Desk modern UI (staging validado) → produção desk.ligbox.com.br
|
||||||
|
# Rollback: index.legacy.html + app.legacy.js no repo
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
HOST="${1:-root@10.10.10.122}"
|
||||||
|
PASS="${DESK_SSH_PASS:-805353}"
|
||||||
|
CONTAINER="ligbox-ops-platform_frontend_1"
|
||||||
|
ROOT="$(cd "$(dirname "$0")/../../projects/ops-desk/frontend" && pwd)"
|
||||||
|
HTML="${ROOT}/assets"
|
||||||
|
|
||||||
|
echo "==> Desk modern → PRODUÇÃO"
|
||||||
|
echo "==> Container: ${CONTAINER}"
|
||||||
|
|
||||||
|
sshpass -p "${PASS}" ssh -o StrictHostKeyChecking=no "${HOST}" "mkdir -p /tmp/desk-prod-deploy"
|
||||||
|
|
||||||
|
sshpass -p "${PASS}" scp -o StrictHostKeyChecking=no \
|
||||||
|
"${ROOT}/index.html" \
|
||||||
|
"${HTML}/topnav.js" \
|
||||||
|
"${HTML}/desk-modern.css" \
|
||||||
|
"${HTML}/app.js" \
|
||||||
|
"${HTML}/styles.css" \
|
||||||
|
"${HTML}/servicos.js" \
|
||||||
|
"${HTML}/auth.js" \
|
||||||
|
"${HOST}:/tmp/desk-prod-deploy/"
|
||||||
|
|
||||||
|
sshpass -p "${PASS}" ssh -o StrictHostKeyChecking=no "${HOST}" bash -s <<EOF
|
||||||
|
set -e
|
||||||
|
C=${CONTAINER}
|
||||||
|
docker cp /tmp/desk-prod-deploy/index.html \$C:/usr/share/nginx/html/index.html
|
||||||
|
docker cp /tmp/desk-prod-deploy/topnav.js \$C:/usr/share/nginx/html/assets/topnav.js
|
||||||
|
docker cp /tmp/desk-prod-deploy/desk-modern.css \$C:/usr/share/nginx/html/assets/desk-modern.css
|
||||||
|
docker cp /tmp/desk-prod-deploy/app.js \$C:/usr/share/nginx/html/assets/app.js
|
||||||
|
docker cp /tmp/desk-prod-deploy/styles.css \$C:/usr/share/nginx/html/assets/styles.css
|
||||||
|
docker cp /tmp/desk-prod-deploy/servicos.js \$C:/usr/share/nginx/html/assets/servicos.js
|
||||||
|
docker cp /tmp/desk-prod-deploy/auth.js \$C:/usr/share/nginx/html/assets/auth.js
|
||||||
|
echo "=== Produção verificada ==="
|
||||||
|
docker exec \$C grep "20260626prod1" /usr/share/nginx/html/index.html | head -3
|
||||||
|
docker exec \$C grep -c "navigateScope\\|shell--v2\\|DeskTopnav" /usr/share/nginx/html/assets/app.js /usr/share/nginx/html/assets/servicos.js /usr/share/nginx/html/index.html 2>/dev/null | tail -1
|
||||||
|
docker exec \$C test -f /usr/share/nginx/html/assets/desk-modern.css && echo "desk-modern.css OK"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Produção actualizada: https://desk.ligbox.com.br/?desk=1"
|
||||||
|
echo "Rollback: ./rollback-prod-to-legacy.sh"
|
||||||
26
deploy/desk-staging-modern/rollback-prod-to-legacy.sh
Executable file
26
deploy/desk-staging-modern/rollback-prod-to-legacy.sh
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Rollback produção Desk → layout legado (index.legacy.html)
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
HOST="${1:-root@10.10.10.122}"
|
||||||
|
PASS="${DESK_SSH_PASS:-805353}"
|
||||||
|
CONTAINER="ligbox-ops-platform_frontend_1"
|
||||||
|
ROOT="$(cd "$(dirname "$0")/../../projects/ops-desk/frontend" && pwd)"
|
||||||
|
|
||||||
|
echo "==> ROLLBACK Desk produção → legacy"
|
||||||
|
|
||||||
|
sshpass -p "${PASS}" ssh -o StrictHostKeyChecking=no "${HOST}" "mkdir -p /tmp/desk-prod-rollback"
|
||||||
|
|
||||||
|
sshpass -p "${PASS}" scp -o StrictHostKeyChecking=no \
|
||||||
|
"${ROOT}/index.legacy.html" \
|
||||||
|
"${ROOT}/assets/app.legacy.js" \
|
||||||
|
"${HOST}:/tmp/desk-prod-rollback/"
|
||||||
|
|
||||||
|
sshpass -p "${PASS}" ssh -o StrictHostKeyChecking=no "${HOST}" bash -s <<EOF
|
||||||
|
set -e
|
||||||
|
C=${CONTAINER}
|
||||||
|
docker cp /tmp/desk-prod-rollback/index.legacy.html \$C:/usr/share/nginx/html/index.html
|
||||||
|
docker cp /tmp/desk-prod-rollback/app.legacy.js \$C:/usr/share/nginx/html/assets/app.js
|
||||||
|
echo "Rollback aplicado — hard refresh no browser"
|
||||||
|
EOF
|
||||||
|
|
@ -114,3 +114,21 @@ ssh root@10.10.10.122 'docker exec ligbox-ops-platform-staging_frontend-staging_
|
||||||
```
|
```
|
||||||
|
|
||||||
Ou rebuild: `docker-compose -f docker-compose.agentic-staging.yml build frontend-staging`
|
Ou rebuild: `docker-compose -f docker-compose.agentic-staging.yml build frontend-staging`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Promoção produção (2026-06-26) ✅
|
||||||
|
|
||||||
|
| Item | Valor |
|
||||||
|
|------|--------|
|
||||||
|
| Versão | **v0.12.2** · cache `20260626prod1` |
|
||||||
|
| URL | https://desk.ligbox.com.br/?desk=1 |
|
||||||
|
| Commit | merge staging → `index.html` + `app.js` + `desk-modern.css` + `topnav.js` |
|
||||||
|
| Backup rollback | `index.legacy.html` · `app.legacy.js` |
|
||||||
|
| Script promote | `deploy/desk-staging-modern/promote-staging-to-prod.sh` |
|
||||||
|
| Script rollback | `deploy/desk-staging-modern/rollback-prod-to-legacy.sh` |
|
||||||
|
|
||||||
|
**Incluído na produção:** modals purge-history + infra-process, tickets-workspace, dns-viewer, filtro Purge eventos, Escopo OPS completo.
|
||||||
|
|
||||||
|
**Removido:** banners console-v2 inline (link Console no topnav substitui).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,108 @@
|
||||||
const API = '/api';
|
const API = '/api';
|
||||||
|
const CONSOLE_BASE_URL = 'https://console.ligbox.com.br';
|
||||||
|
|
||||||
|
function consoleHomeUrl(base) {
|
||||||
|
return `${String(base || CONSOLE_BASE_URL).replace(/\/$/, '')}/`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** SSO/handoff Console → Desk (?desk_handoff= ou cookie). */
|
||||||
|
async function consumeSsoFromUrl() {
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
const handoff = params.get('desk_handoff');
|
||||||
|
if (!handoff) return false;
|
||||||
|
try {
|
||||||
|
const res = await fetchWithTimeout('/api/v1/auth/console-handoff/exchange', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ handoff_token: handoff }),
|
||||||
|
});
|
||||||
|
const data = await res.json().catch(() => ({}));
|
||||||
|
if (res.ok && data.access_token) {
|
||||||
|
setSession(data.access_token, {
|
||||||
|
username: data.username,
|
||||||
|
role: data.role,
|
||||||
|
display_name: data.display_name,
|
||||||
|
}, { maxAgeSec: data.expires_in });
|
||||||
|
params.delete('desk_handoff');
|
||||||
|
const qs = params.toString();
|
||||||
|
window.history.replaceState({}, '', `${window.location.pathname}${qs ? `?${qs}` : ''}`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('consumeSsoFromUrl:', err?.name || err);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setupConsoleReturnLink() {
|
||||||
|
const link = document.getElementById('nav-console-return');
|
||||||
|
if (!link) return;
|
||||||
|
let consoleUrl = CONSOLE_BASE_URL;
|
||||||
|
try {
|
||||||
|
const f = await fetch(`${API}/v1/desk/features`);
|
||||||
|
if (f.ok) {
|
||||||
|
const data = await f.json();
|
||||||
|
if (data.console_url) consoleUrl = data.console_url;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
/* fallback */
|
||||||
|
}
|
||||||
|
link.href = consoleHomeUrl(consoleUrl);
|
||||||
|
link.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
window.location.href = consoleHomeUrl(consoleUrl);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupDeskNavBreadcrumb() {
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
if (params.get('from') !== 'console' && !params.get('desk_handoff')) return;
|
||||||
|
const toolbar = document.getElementById('page-toolbar');
|
||||||
|
if (!toolbar || document.getElementById('desk-console-crumb')) return;
|
||||||
|
const crumb = document.createElement('a');
|
||||||
|
crumb.id = 'desk-console-crumb';
|
||||||
|
crumb.className = 'btn btn-ghost btn-sm desk-console-crumb';
|
||||||
|
crumb.textContent = '← Console';
|
||||||
|
crumb.href = '#';
|
||||||
|
crumb.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const link = document.getElementById('nav-console-return');
|
||||||
|
if (link?.href) window.location.href = link.href;
|
||||||
|
});
|
||||||
|
toolbar.insertBefore(crumb, toolbar.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function maybeConsoleCutover() {
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
if (params.get('desk') === '1') return false;
|
||||||
|
if (/login|register|activate|matriz/.test(window.location.pathname)) return false;
|
||||||
|
try {
|
||||||
|
const res = await fetch(`${API}/v1/desk/features`);
|
||||||
|
if (!res.ok) return false;
|
||||||
|
const f = await res.json();
|
||||||
|
if (f.console_cutover && f.console_url) {
|
||||||
|
window.location.replace(f.console_url);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('console cutover', err);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveBootView() {
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
const requested = params.get('view');
|
||||||
|
const fallback = window.DeskModules?.isViewEnabled?.('agentic-ops') ? 'agentic-ops' : resolveDefaultView();
|
||||||
|
if (!requested || requested === 'tenants') {
|
||||||
|
if (requested === 'tenants') {
|
||||||
|
window.open(`${CONSOLE_BASE_URL}/#infra-nodes`, '_blank', 'noopener');
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
if (window.DeskModules?.isViewEnabled?.(requested)) return requested;
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
async function api(path, options = {}) {
|
async function api(path, options = {}) {
|
||||||
const res = await fetchWithTimeout(`${API}${path}`, {
|
const res = await fetchWithTimeout(`${API}${path}`, {
|
||||||
|
|
@ -64,6 +168,7 @@ let state = {
|
||||||
adminUsers: [],
|
adminUsers: [],
|
||||||
adminFilter: { q: '', role: 'all', status: 'all', mfa: 'all' },
|
adminFilter: { q: '', role: 'all', status: 'all', mfa: 'all' },
|
||||||
adminSelected: null,
|
adminSelected: null,
|
||||||
|
adminPanel: 'team',
|
||||||
features: { access_matrix_ui: false },
|
features: { access_matrix_ui: false },
|
||||||
socWindow: '24h',
|
socWindow: '24h',
|
||||||
socLastEventId: null,
|
socLastEventId: null,
|
||||||
|
|
@ -231,6 +336,7 @@ function setView(name) {
|
||||||
state.accountLoaded = false;
|
state.accountLoaded = false;
|
||||||
}
|
}
|
||||||
state.view = name;
|
state.view = name;
|
||||||
|
if (name === 'admin') state.adminPanel = 'team';
|
||||||
const titles = {
|
const titles = {
|
||||||
dashboard: 'Dashboard',
|
dashboard: 'Dashboard',
|
||||||
overview: 'Audit Overview',
|
overview: 'Audit Overview',
|
||||||
|
|
@ -271,6 +377,13 @@ function setView(name) {
|
||||||
document.querySelectorAll('.nav button').forEach((b) => {
|
document.querySelectorAll('.nav button').forEach((b) => {
|
||||||
b.classList.toggle('active', b.dataset.view === name);
|
b.classList.toggle('active', b.dataset.view === name);
|
||||||
});
|
});
|
||||||
|
document.querySelectorAll('[data-desk-nav]').forEach((b) => {
|
||||||
|
b.classList.toggle('active', b.dataset.view === name);
|
||||||
|
if (b.dataset.view === name) b.setAttribute('aria-current', 'page');
|
||||||
|
else b.removeAttribute('aria-current');
|
||||||
|
});
|
||||||
|
window.DeskTopnav?.updateTopnavActive?.(name);
|
||||||
|
window.DeskTopnav?.updateContextSidebar?.(name);
|
||||||
Object.entries(views).forEach(([k, el]) => el?.classList.toggle('active', k === name));
|
Object.entries(views).forEach(([k, el]) => el?.classList.toggle('active', k === name));
|
||||||
reschedulePoll();
|
reschedulePoll();
|
||||||
refresh();
|
refresh();
|
||||||
|
|
@ -4529,6 +4642,10 @@ document.querySelectorAll('.nav button').forEach((btn) => {
|
||||||
btn.addEventListener('click', () => setView(btn.dataset.view));
|
btn.addEventListener('click', () => setView(btn.dataset.view));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('[data-desk-nav]').forEach((btn) => {
|
||||||
|
btn.addEventListener('click', () => setView(btn.dataset.view));
|
||||||
|
});
|
||||||
|
|
||||||
document.querySelectorAll('.filter-btn[data-filter]').forEach((btn) => {
|
document.querySelectorAll('.filter-btn[data-filter]').forEach((btn) => {
|
||||||
btn.addEventListener('click', () => {
|
btn.addEventListener('click', () => {
|
||||||
state.ticketFilter = btn.dataset.filter;
|
state.ticketFilter = btn.dataset.filter;
|
||||||
|
|
@ -4591,21 +4708,26 @@ document.getElementById('nav-console')?.addEventListener('click', (ev) => {
|
||||||
(async function boot() {
|
(async function boot() {
|
||||||
const dash = document.getElementById('dashboard-content');
|
const dash = document.getElementById('dashboard-content');
|
||||||
try {
|
try {
|
||||||
|
if (await maybeConsoleCutover()) return;
|
||||||
if (!getToken()) {
|
if (!getToken()) {
|
||||||
window.location.replace('/login.html');
|
window.location.replace('/login.html');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
await consumeSsoFromUrl();
|
||||||
setupSidebarUser();
|
setupSidebarUser();
|
||||||
|
window.DeskTopnav?.initTopnavDropdowns?.();
|
||||||
|
await setupConsoleReturnLink();
|
||||||
|
setupDeskNavBreadcrumb();
|
||||||
await loadDeskFeatures();
|
await loadDeskFeatures();
|
||||||
await DeskModules.load();
|
await DeskModules.load();
|
||||||
applyRoleNav();
|
applyRoleNav();
|
||||||
DeskModules.applyVisibility();
|
|
||||||
applyAccessMatrixNav();
|
applyAccessMatrixNav();
|
||||||
|
DeskModules.applyVisibility();
|
||||||
bindOverviewModal();
|
bindOverviewModal();
|
||||||
bindInfraProcessModal();
|
bindInfraProcessModal();
|
||||||
bindTeamDrawerClose();
|
bindTeamDrawerClose();
|
||||||
bindSocTestModal();
|
bindSocTestModal();
|
||||||
setView(DEFAULT_VIEW);
|
setView(resolveBootView());
|
||||||
|
|
||||||
ensureValidSession().then((valid) => {
|
ensureValidSession().then((valid) => {
|
||||||
if (!valid) window.location.replace('/login.html');
|
if (!valid) window.location.replace('/login.html');
|
||||||
|
|
|
||||||
4622
projects/ops-desk/frontend/assets/app.legacy.js
Normal file
4622
projects/ops-desk/frontend/assets/app.legacy.js
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -4,9 +4,13 @@
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<title>Ligbox Ops — Support Desk</title>
|
<title>Ligbox Ops — Support Desk</title>
|
||||||
<link rel="stylesheet" href="/assets/styles.css?v=20260625align1"/>
|
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400..700&display=swap" rel="stylesheet"/>
|
||||||
|
<link rel="stylesheet" href="/assets/styles.css?v=20260626prod1"/>
|
||||||
|
<link rel="stylesheet" href="/assets/desk-modern.css?v=20260626prod1"/>
|
||||||
<link rel="stylesheet" href="/assets/tickets-workspace.css?v=20260619tickets2"/>
|
<link rel="stylesheet" href="/assets/tickets-workspace.css?v=20260619tickets2"/>
|
||||||
<link rel="stylesheet" href="/assets/agentic-ops.css?v=20260620v10"/>
|
<link rel="stylesheet" href="/assets/agentic-ops.css?v=20260625pollfix"/>
|
||||||
<link rel="stylesheet" href="/assets/access-matrix.css?v=20260620am7"/>
|
<link rel="stylesheet" href="/assets/access-matrix.css?v=20260620am7"/>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -180,91 +184,83 @@
|
||||||
</symbol>
|
</symbol>
|
||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
||||||
<div class="shell">
|
<div class="shell shell--v2 shell--no-context">
|
||||||
<aside class="sidebar">
|
<header class="app-chrome app-chrome--modern">
|
||||||
<div class="brand">
|
<div class="app-chrome__inner">
|
||||||
|
<div class="app-chrome__brand">
|
||||||
|
<span class="app-chrome__mark" aria-hidden="true"></span>
|
||||||
<h1>Ligbox <span class="brand-ops">Ops</span></h1>
|
<h1>Ligbox <span class="brand-ops">Ops</span></h1>
|
||||||
<p>Support Desk · Ibytera</p>
|
|
||||||
</div>
|
</div>
|
||||||
<nav class="nav">
|
<nav class="app-chrome__nav" aria-label="Módulos Desk">
|
||||||
<button type="button" data-view="agentic-ops" data-module="agentic-ops" id="nav-agentic-ops" class="active nav-item nav-item-agentic">
|
<div class="nav-zone" data-topnav-group="operacoes">
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-infra"/></svg></span>
|
<span class="nav-zone__label">Operações</span>
|
||||||
<span class="nav-label">Agentic Ops</span>
|
<div class="nav-zone__links">
|
||||||
</button>
|
<button type="button" data-view="agentic-ops" data-module="agentic-ops" id="nav-agentic-ops" data-desk-nav class="nav-link">Agentic Ops</button>
|
||||||
<button type="button" data-view="dashboard" data-module="core" class="nav-item nav-item-dashboard">
|
<button type="button" data-view="dashboard" data-module="core" data-desk-nav class="nav-link">Dashboard</button>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-dashboard"/></svg></span>
|
<button type="button" data-view="tickets" data-module="core" data-desk-nav class="nav-link">Tickets</button>
|
||||||
<span class="nav-label">Dashboard</span>
|
<button type="button" data-view="events" data-module="events" id="nav-events" data-desk-nav class="nav-link">Eventos</button>
|
||||||
</button>
|
</div>
|
||||||
<button type="button" data-view="overview" data-module="overview" id="nav-overview" class="nav-item nav-item-overview">
|
</div>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-overview"/></svg></span>
|
<div class="nav-zone__sep" aria-hidden="true"></div>
|
||||||
<span class="nav-label">Overview</span>
|
<div class="nav-zone" data-topnav-group="comercial">
|
||||||
</button>
|
<span class="nav-zone__label">Comercial</span>
|
||||||
<button type="button" data-view="overview-home" data-module="overview-home" id="nav-overview-home" class="nav-item nav-item-overview-home">
|
<div class="nav-zone__links">
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-overview-home"/></svg></span>
|
<button type="button" data-view="overview-home" data-module="overview-home" id="nav-overview-home" data-desk-nav class="nav-link">Serviços</button>
|
||||||
<span class="nav-label">Serviços IaaS</span>
|
<button type="button" data-view="leads" data-module="leads" id="nav-leads" hidden data-desk-nav class="nav-link">Leads</button>
|
||||||
</button>
|
</div>
|
||||||
<button type="button" data-view="tickets" data-module="core" class="nav-item nav-item-tickets">
|
</div>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-tickets"/></svg></span>
|
<div class="nav-zone__sep" aria-hidden="true"></div>
|
||||||
<span class="nav-label">Tickets</span>
|
<a id="nav-console-return" class="nav-zone nav-zone--console" href="https://console.ligbox.com.br">
|
||||||
</button>
|
<span class="nav-zone__label">Plataforma</span>
|
||||||
<button type="button" data-view="leads" data-module="leads" id="nav-leads" hidden class="nav-item nav-item-leads">
|
<span class="nav-link nav-link--console">Console</span>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-leads"/></svg></span>
|
</a>
|
||||||
<span class="nav-label">Leads</span>
|
<div class="nav-zone__sep" aria-hidden="true"></div>
|
||||||
</button>
|
<div class="nav-zone" data-topnav-group="infra">
|
||||||
<button type="button" data-view="events" data-module="events" id="nav-events" class="nav-item nav-item-events">
|
<span class="nav-zone__label">Infra</span>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-events"/></svg></span>
|
<div class="nav-zone__links">
|
||||||
<span class="nav-label">Eventos</span>
|
<button type="button" data-view="infra" data-module="infra" data-desk-nav class="nav-link">Infra</button>
|
||||||
</button>
|
<button type="button" data-view="infra2" data-module="infra2-soc" data-desk-nav class="nav-link">Infra 2 SOC</button>
|
||||||
<button type="button" class="nav-item nav-item-console" id="nav-console" title="Console unificado — Domínio & DNS">
|
<button type="button" data-view="email-migration" data-module="email-migration" id="nav-email-migration" data-desk-nav class="nav-link">Migração E-mail</button>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-dashboard"/></svg></span>
|
</div>
|
||||||
<span class="nav-label">Console</span>
|
</div>
|
||||||
</button>
|
<div class="nav-zone__sep" aria-hidden="true"></div>
|
||||||
<button type="button" data-view="tenants" data-module="tenants" id="nav-tenants" hidden class="nav-item nav-item-tenants">
|
<div class="nav-zone" data-topnav-group="sistema">
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-tenants"/></svg></span>
|
<span class="nav-zone__label">Sistema</span>
|
||||||
<span class="nav-label">Tenants</span>
|
<div class="nav-zone__links">
|
||||||
</button>
|
<button type="button" data-view="overview" data-module="overview" id="nav-overview" data-desk-nav class="nav-link">Overview</button>
|
||||||
<button type="button" data-view="email-migration" data-module="email-migration" id="nav-email-migration" class="nav-item nav-item-email-migration">
|
<button type="button" data-view="account" data-module="core" id="nav-account" data-desk-nav class="nav-link">Minha conta</button>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-events"/></svg></span>
|
<button type="button" data-view="messages" data-module="messages" id="nav-messages" hidden data-desk-nav class="nav-link">Mensagens</button>
|
||||||
<span class="nav-label">Migração E-mail</span>
|
<button type="button" data-view="admin" data-module="admin-users" id="nav-admin" hidden data-desk-nav class="nav-link">Administradores</button>
|
||||||
</button>
|
<button type="button" data-view="access-matrix" data-module="access-matrix" id="nav-access-matrix" hidden data-desk-nav class="nav-link">Matriz</button>
|
||||||
<button type="button" data-view="infra" data-module="infra" class="nav-item nav-item-infra">
|
<button type="button" data-view="modules" data-module="modules-admin" id="nav-modules" hidden data-desk-nav class="nav-link">Módulos</button>
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-infra"/></svg></span>
|
</div>
|
||||||
<span class="nav-label">INFRA CODE</span>
|
</div>
|
||||||
</button>
|
|
||||||
<button type="button" data-view="infra2" data-module="infra2-soc" class="nav-item nav-item-infra2">
|
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-infra2"/></svg></span>
|
|
||||||
<span class="nav-label">Infra 2 <span class="nav-badge-new">SOC</span></span>
|
|
||||||
</button>
|
|
||||||
<button type="button" data-view="account" data-module="core" id="nav-account" class="nav-item nav-item-account">
|
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-account"/></svg></span>
|
|
||||||
<span class="nav-label">Minha conta</span>
|
|
||||||
</button>
|
|
||||||
<button type="button" data-view="messages" data-module="messages" id="nav-messages" hidden class="nav-item nav-item-messages">
|
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-messages"/></svg></span>
|
|
||||||
<span class="nav-label">Mensagens</span>
|
|
||||||
</button>
|
|
||||||
<button type="button" data-view="admin" data-module="admin-users" id="nav-admin" hidden class="nav-item nav-item-admin">
|
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-admin"/></svg></span>
|
|
||||||
<span class="nav-label">Administradores</span>
|
|
||||||
</button>
|
|
||||||
<button type="button" data-view="access-matrix" id="nav-access-matrix" hidden class="nav-item nav-item-admin">
|
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-admin"/></svg></span>
|
|
||||||
<span class="nav-label">Matriz <span class="nav-badge-new">β</span></span>
|
|
||||||
</button>
|
|
||||||
<button type="button" data-view="modules" data-module="modules-admin" id="nav-modules" hidden class="nav-item nav-item-modules">
|
|
||||||
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-admin"/></svg></span>
|
|
||||||
<span class="nav-label">Módulos</span>
|
|
||||||
</button>
|
|
||||||
</nav>
|
</nav>
|
||||||
<div class="sidebar-user" id="sidebar-user"></div>
|
<div class="app-chrome__meta">
|
||||||
<div class="sidebar-footer">VM122 · ligbox-ops · v0.9.3</div>
|
<span id="header-user" class="header-user" hidden></span>
|
||||||
|
<span id="global-health" class="status-pill">…</span>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" id="btn-logout" hidden>Sair</button>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" id="btn-refresh">Atualizar</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="workspace">
|
||||||
|
<aside class="context-sidebar" id="context-sidebar" hidden>
|
||||||
|
<div class="context-sidebar__head">
|
||||||
|
<p class="context-sidebar__label" id="context-sidebar-label">Processo</p>
|
||||||
|
<p class="context-sidebar__title" id="context-sidebar-title"></p>
|
||||||
|
</div>
|
||||||
|
<nav class="context-nav" id="context-nav" aria-label="Navegação do processo"></nav>
|
||||||
|
<div class="context-sidebar__foot">VM122 · ligbox-ops · v0.12.2</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
|
<div class="workspace-main">
|
||||||
<main class="main">
|
<main class="main">
|
||||||
<header class="page-header">
|
<header class="page-header">
|
||||||
<div>
|
<div>
|
||||||
<h2 id="page-title">Agentic Ops</h2>
|
<h2 id="page-title">Dashboard</h2>
|
||||||
<p id="page-subtitle">Vigilância 24/7, findings, advisor IA e copiloto ops (Spec 029)</p>
|
<p id="page-subtitle">Operações Ligbox — onboarding, tickets e monitoramento</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="page-toolbar" id="page-toolbar">
|
<div class="page-toolbar" id="page-toolbar">
|
||||||
<span id="header-user" class="header-user" hidden></span>
|
<span id="header-user" class="header-user" hidden></span>
|
||||||
|
|
@ -275,19 +271,10 @@
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<section id="view-dashboard" class="view">
|
<section id="view-dashboard" class="view">
|
||||||
<div class="console-v2-banner" role="note">
|
|
||||||
<strong>Console v2</strong> — KPIs e ranking técnico migram para
|
|
||||||
<a href="https://console.ligbox.com.br" target="_blank" rel="noopener noreferrer">console.ligbox.com.br</a>.
|
|
||||||
Este painel permanece até cutover Fase 4.
|
|
||||||
</div>
|
|
||||||
<div id="dashboard-content"><p class="loading">Carregando…</p></div>
|
<div id="dashboard-content"><p class="loading">Carregando…</p></div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="view-overview" class="view">
|
<section id="view-overview" class="view">
|
||||||
<div class="console-v2-banner" role="note">
|
|
||||||
<strong>Saúde migrada</strong> — scorecard e domínios com atenção estão no
|
|
||||||
<a href="https://console.ligbox.com.br" target="_blank" rel="noopener noreferrer">Console unificado</a>.
|
|
||||||
</div>
|
|
||||||
<div id="overview-content"><p class="loading">Carregando…</p></div>
|
<div id="overview-content"><p class="loading">Carregando…</p></div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
@ -300,10 +287,6 @@
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="view-tickets" class="view">
|
<section id="view-tickets" class="view">
|
||||||
<div class="console-v2-banner" role="note">
|
|
||||||
<strong>Chamados CH-*</strong> — investigação unificada em
|
|
||||||
<a href="https://console.ligbox.com.br/chamados" target="_blank" rel="noopener noreferrer">console.ligbox.com.br/chamados</a>.
|
|
||||||
</div>
|
|
||||||
<div class="toolbar">
|
<div class="toolbar">
|
||||||
<button type="button" class="filter-btn active" data-filter="all">Todos</button>
|
<button type="button" class="filter-btn active" data-filter="all">Todos</button>
|
||||||
<button type="button" class="filter-btn" data-filter="active">Activos</button>
|
<button type="button" class="filter-btn" data-filter="active">Activos</button>
|
||||||
|
|
@ -325,10 +308,6 @@
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="view-events" class="view">
|
<section id="view-events" class="view">
|
||||||
<div class="console-v2-banner" role="note">
|
|
||||||
<strong>Discover</strong> — feed de eventos Wazuh/onboard em
|
|
||||||
<a href="https://console.ligbox.com.br/discover" target="_blank" rel="noopener noreferrer">console.ligbox.com.br/discover</a>.
|
|
||||||
</div>
|
|
||||||
<div class="toolbar" id="events-toolbar">
|
<div class="toolbar" id="events-toolbar">
|
||||||
<button type="button" class="filter-btn active" data-events-tab="webhooks">Webhooks</button>
|
<button type="button" class="filter-btn active" data-events-tab="webhooks">Webhooks</button>
|
||||||
<button type="button" class="filter-btn" data-events-tab="purges" id="events-tab-purges" hidden>Histórico de purges</button>
|
<button type="button" class="filter-btn" data-events-tab="purges" id="events-tab-purges" hidden>Histórico de purges</button>
|
||||||
|
|
@ -358,8 +337,8 @@
|
||||||
<div id="infra2-content"><p class="loading">Carregando SOC…</p></div>
|
<div id="infra2-content"><p class="loading">Carregando SOC…</p></div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="view-agentic-ops" class="view active">
|
<section id="view-agentic-ops" class="view">
|
||||||
<div id="agentic-ops-content"><p class="loading">Carregando Agentic Ops…</p></div>
|
<div id="agentic-ops-content"><p class="loading">Carregando Agent Squad…</p></div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="view-account" class="view">
|
<section id="view-account" class="view">
|
||||||
|
|
@ -383,6 +362,9 @@
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="sidebar-user" hidden aria-hidden="true"></div>
|
||||||
<div id="team-drawer" class="team-drawer hidden" aria-hidden="true">
|
<div id="team-drawer" class="team-drawer hidden" aria-hidden="true">
|
||||||
<div class="team-drawer-backdrop" data-close-team-drawer></div>
|
<div class="team-drawer-backdrop" data-close-team-drawer></div>
|
||||||
<aside class="team-drawer-panel" role="dialog" aria-modal="true" aria-labelledby="team-drawer-title">
|
<aside class="team-drawer-panel" role="dialog" aria-modal="true" aria-labelledby="team-drawer-title">
|
||||||
|
|
@ -419,6 +401,19 @@
|
||||||
<div id="overview-modal-body" class="modal-body"></div>
|
<div id="overview-modal-body" class="modal-body"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="event-auditor-modal" class="modal hidden" aria-hidden="true">
|
||||||
|
<div class="modal-backdrop" data-close-event-auditor></div>
|
||||||
|
<div class="modal-panel modal-panel-xl event-auditor-panel" role="dialog" aria-modal="true" aria-labelledby="event-auditor-modal-title">
|
||||||
|
<div class="modal-header">
|
||||||
|
<div>
|
||||||
|
<h3 id="event-auditor-modal-title">Auditor de Eventos</h3>
|
||||||
|
<p id="event-auditor-modal-sub" class="ticket-meta"></p>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-event-auditor>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="event-auditor-modal-body" class="modal-body"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div id="purge-history-modal" class="modal hidden" aria-hidden="true">
|
<div id="purge-history-modal" class="modal hidden" aria-hidden="true">
|
||||||
<div class="modal-backdrop" data-close-purge-history-modal></div>
|
<div class="modal-backdrop" data-close-purge-history-modal></div>
|
||||||
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="purge-history-modal-title">
|
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="purge-history-modal-title">
|
||||||
|
|
@ -432,19 +427,6 @@
|
||||||
<div id="purge-history-modal-body" class="modal-body"></div>
|
<div id="purge-history-modal-body" class="modal-body"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="event-auditor-modal" class="modal hidden" aria-hidden="true">
|
|
||||||
<div class="modal-backdrop" data-close-event-auditor-modal></div>
|
|
||||||
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="event-auditor-modal-title">
|
|
||||||
<div class="modal-header">
|
|
||||||
<div>
|
|
||||||
<h3 id="event-auditor-modal-title">Auditor de Eventos</h3>
|
|
||||||
<p id="event-auditor-modal-sub" class="ticket-meta"></p>
|
|
||||||
</div>
|
|
||||||
<button type="button" class="btn btn-ghost btn-sm" data-close-event-auditor-modal>Fechar</button>
|
|
||||||
</div>
|
|
||||||
<div id="event-auditor-modal-body" class="modal-body"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="vm112-domain-modal" class="modal hidden" aria-hidden="true">
|
<div id="vm112-domain-modal" class="modal hidden" aria-hidden="true">
|
||||||
<div class="modal-backdrop" data-close-vm112-modal></div>
|
<div class="modal-backdrop" data-close-vm112-modal></div>
|
||||||
<div class="vm112-modal-shell" id="vm112-modal-shell">
|
<div class="vm112-modal-shell" id="vm112-modal-shell">
|
||||||
|
|
@ -481,16 +463,17 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/assets/auth.js?v=20260625serv1"></script>
|
<script src="/assets/auth.js?v=20260626prod1"></script>
|
||||||
<script src="/assets/modules.js?v=20260619tickets2"></script>
|
<script src="/assets/modules.js?v=20260619tickets2"></script>
|
||||||
<script src="/assets/billing-ui.js?v=20260619tickets2"></script>
|
<script src="/assets/billing-ui.js?v=20260619tickets2"></script>
|
||||||
<script src="/assets/desk-live-stub.js?v=20260619tickets2"></script>
|
<script src="/assets/desk-live-stub.js?v=20260619tickets2"></script>
|
||||||
<script src="/assets/tickets-workspace.js?v=20260619tickets2"></script>
|
<script src="/assets/tickets-workspace.js?v=20260619tickets2"></script>
|
||||||
<script src="/assets/tickets-detail-panel.js?v=20260619tickets2"></script>
|
<script src="/assets/tickets-detail-panel.js?v=20260619tickets2"></script>
|
||||||
<script src="/assets/servicos.js?v=20260625align1"></script>
|
<script src="/assets/servicos.js?v=20260626prod1"></script>
|
||||||
<script src="/assets/app.js?v=20260625scope1"></script>
|
|
||||||
<script src="/assets/agentic-ops.js?v=20260625pollfix"></script>
|
<script src="/assets/agentic-ops.js?v=20260625pollfix"></script>
|
||||||
<script src="/assets/access-matrix.js?v=20260620am7"></script>
|
<script src="/assets/access-matrix.js?v=20260620am7"></script>
|
||||||
<script src="/assets/dns-viewer.js?v=20260625handoff1"></script>
|
<script src="/assets/dns-viewer.js?v=20260625handoff1"></script>
|
||||||
|
<script src="/assets/topnav.js?v=20260626prod1"></script>
|
||||||
|
<script src="/assets/app.js?v=20260626prod1"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
496
projects/ops-desk/frontend/index.legacy.html
Normal file
496
projects/ops-desk/frontend/index.legacy.html
Normal file
|
|
@ -0,0 +1,496 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="pt-BR">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<title>Ligbox Ops — Support Desk</title>
|
||||||
|
<link rel="stylesheet" href="/assets/styles.css?v=20260625align1"/>
|
||||||
|
<link rel="stylesheet" href="/assets/tickets-workspace.css?v=20260619tickets2"/>
|
||||||
|
<link rel="stylesheet" href="/assets/agentic-ops.css?v=20260620v10"/>
|
||||||
|
<link rel="stylesheet" href="/assets/access-matrix.css?v=20260620am7"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<svg width="0" height="0" style="position:absolute;visibility:hidden" aria-hidden="true" focusable="false">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="lg-dashboard" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#f6f6f8"/>
|
||||||
|
<stop offset="100%" stop-color="#d8d6dc"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-overview" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#ff9fb5"/>
|
||||||
|
<stop offset="100%" stop-color="#8d233d"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-ticket" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#ffd36d"/>
|
||||||
|
<stop offset="100%" stop-color="#e29b20"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-target" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#ff9aa4"/>
|
||||||
|
<stop offset="100%" stop-color="#d11f42"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-calendar" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#b38dff"/>
|
||||||
|
<stop offset="100%" stop-color="#6b42c9"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-building" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#b9dbff"/>
|
||||||
|
<stop offset="100%" stop-color="#4c8fd5"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-server" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#8b929e"/>
|
||||||
|
<stop offset="100%" stop-color="#4b4f58"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-gear" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#f2f3f7"/>
|
||||||
|
<stop offset="100%" stop-color="#9aa0ab"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-chat" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#6fc1ff"/>
|
||||||
|
<stop offset="100%" stop-color="#2f6ef0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="lg-admin" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#c07aff"/>
|
||||||
|
<stop offset="100%" stop-color="#6c2eb9"/>
|
||||||
|
</linearGradient>
|
||||||
|
|
||||||
|
<filter id="nav-shadow" x="-25%" y="-25%" width="150%" height="150%">
|
||||||
|
<feDropShadow dx="0" dy="3" stdDeviation="2.5" flood-color="#000000" flood-opacity="0.28"/>
|
||||||
|
</filter>
|
||||||
|
|
||||||
|
<symbol id="icon-dashboard" viewBox="0 0 64 64">
|
||||||
|
<rect x="8" y="6" width="48" height="52" rx="10" fill="url(#lg-dashboard)" stroke="#b8b3bf" stroke-width="2"/>
|
||||||
|
<rect x="14" y="12" width="36" height="40" rx="6" fill="#f7fbff" stroke="#c9d2db"/>
|
||||||
|
<rect x="18" y="32" width="8" height="16" rx="2" fill="#2dc7b7"/>
|
||||||
|
<rect x="29" y="22" width="8" height="26" rx="2" fill="#57b5ff"/>
|
||||||
|
<rect x="40" y="16" width="8" height="32" rx="2" fill="#ef6179"/>
|
||||||
|
<rect x="12" y="8" width="44" height="6" rx="3" fill="#ffffff" opacity="0.55"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-overview" viewBox="0 0 64 64">
|
||||||
|
<path d="M32 6 51 13v15c0 14-8.9 23.7-19 29-10.1-5.3-19-15-19-29V13L32 6Z" fill="url(#lg-overview)" stroke="#f1c2cf" stroke-width="2.2"/>
|
||||||
|
<path d="M32 13 45 18v10c0 9.5-5.8 16.5-13 20.8-7.2-4.3-13-11.3-13-20.8V18L32 13Z" fill="#fff3f6" opacity="0.85"/>
|
||||||
|
<path d="M20 18h24v10c0 8.6-5.2 14.9-12 18.9-6.8-4-12-10.3-12-18.9V18Z" fill="#8e1f3a"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-tickets" viewBox="0 0 64 64">
|
||||||
|
<path d="M10 18a6 6 0 0 0 6-6h32a6 6 0 0 0 6 6v8a6 6 0 0 0 0 12v8a6 6 0 0 0-6 6H16a6 6 0 0 0-6-6v-8a6 6 0 0 0 0-12v-8Z" fill="url(#lg-ticket)" stroke="#d38b1a" stroke-width="2"/>
|
||||||
|
<path d="M24 18v28" stroke="#f9e0a9" stroke-width="2" stroke-dasharray="3 3"/>
|
||||||
|
<path d="m39 22 2.8 5.6 6.2.9-4.5 4.4 1.1 6.2-5.6-2.9-5.6 2.9 1.1-6.2-4.5-4.4 6.2-.9L39 22Z" fill="#7d4510"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-leads" viewBox="0 0 64 64">
|
||||||
|
<circle cx="30" cy="34" r="20" fill="url(#lg-target)" stroke="#f1a5b1" stroke-width="2"/>
|
||||||
|
<circle cx="30" cy="34" r="13" fill="#ffd9df" opacity="0.88"/>
|
||||||
|
<circle cx="30" cy="34" r="7" fill="#fff"/>
|
||||||
|
<circle cx="30" cy="34" r="3.8" fill="#df2d51"/>
|
||||||
|
<path d="m37 27 13-9 4 4-9 13-1.6-6.5L37 27Z" fill="#4ba3ff" stroke="#2d6fd1" stroke-width="1.4" stroke-linejoin="round"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-events" viewBox="0 0 64 64">
|
||||||
|
<rect x="10" y="14" width="44" height="38" rx="9" fill="url(#lg-calendar)" stroke="#cdb8ff" stroke-width="2"/>
|
||||||
|
<rect x="10" y="14" width="44" height="10" rx="9" fill="#f7efff" opacity="0.9"/>
|
||||||
|
<path d="M20 10v10M44 10v10" stroke="#7c52dd" stroke-width="4" stroke-linecap="round"/>
|
||||||
|
<g fill="#efe7ff">
|
||||||
|
<rect x="18" y="28" width="6" height="6" rx="1.2"/>
|
||||||
|
<rect x="28" y="28" width="6" height="6" rx="1.2"/>
|
||||||
|
<rect x="38" y="28" width="6" height="6" rx="1.2"/>
|
||||||
|
<rect x="18" y="38" width="6" height="6" rx="1.2"/>
|
||||||
|
<rect x="28" y="38" width="6" height="6" rx="1.2"/>
|
||||||
|
</g>
|
||||||
|
<circle cx="47" cy="46" r="9" fill="#8a57da" stroke="#e6d8ff" stroke-width="1.8"/>
|
||||||
|
<path d="m47 40 1.7 3.5 3.8.6-2.7 2.6.6 3.8-3.4-1.8-3.4 1.8.6-3.8-2.7-2.6 3.8-.6L47 40Z" fill="#fff3a7"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-tenants" viewBox="0 0 64 64">
|
||||||
|
<rect x="14" y="10" width="28" height="42" rx="4" fill="url(#lg-building)" stroke="#7ab3ea" stroke-width="2"/>
|
||||||
|
<rect x="28" y="18" width="22" height="34" rx="4" fill="#98cbf7" stroke="#5f9ed8" stroke-width="2"/>
|
||||||
|
<g fill="#eaf6ff">
|
||||||
|
<rect x="19" y="16" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="27" y="16" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="19" y="25" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="27" y="25" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="19" y="34" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="27" y="34" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="33" y="23" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="41" y="23" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="33" y="32" width="5" height="5" rx="1"/>
|
||||||
|
<rect x="41" y="32" width="5" height="5" rx="1"/>
|
||||||
|
</g>
|
||||||
|
<rect x="29" y="42" width="8" height="10" rx="1.5" fill="#5a7ca0"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-infra" viewBox="0 0 64 64">
|
||||||
|
<rect x="16" y="8" width="32" height="48" rx="6" fill="url(#lg-server)" stroke="#969daa" stroke-width="2"/>
|
||||||
|
<g fill="#2a2f38" stroke="#6c727d" stroke-width="1">
|
||||||
|
<rect x="20" y="14" width="24" height="10" rx="2"/>
|
||||||
|
<rect x="20" y="28" width="24" height="10" rx="2"/>
|
||||||
|
<rect x="20" y="42" width="24" height="8" rx="2"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<circle cx="25" cy="19" r="1.8" fill="#ff5f72"/>
|
||||||
|
<circle cx="25" cy="33" r="1.8" fill="#ff5f72"/>
|
||||||
|
<circle cx="25" cy="46" r="1.6" fill="#ff5f72"/>
|
||||||
|
<rect x="30" y="18" width="10" height="2" rx="1" fill="#d9dde5"/>
|
||||||
|
<rect x="30" y="32" width="10" height="2" rx="1" fill="#d9dde5"/>
|
||||||
|
<rect x="30" y="45" width="10" height="2" rx="1" fill="#d9dde5"/>
|
||||||
|
</g>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-account" viewBox="0 0 64 64">
|
||||||
|
<circle cx="32" cy="32" r="10" fill="#872338"/>
|
||||||
|
<path d="M32 10 36.5 14.1 42.7 13.3 45 19.1 50.9 21.4 50.1 27.6 54.2 32 50.1 36.4 50.9 42.6 45 44.9 42.7 50.7 36.5 49.9 32 54 27.5 49.9 21.3 50.7 19 44.9 13.1 42.6 13.9 36.4 9.8 32 13.9 27.6 13.1 21.4 19 19.1 21.3 13.3 27.5 14.1Z" fill="url(#lg-gear)" stroke="#b9bec8" stroke-width="2" stroke-linejoin="round"/>
|
||||||
|
<circle cx="32" cy="32" r="11.5" fill="none" stroke="#dfe2e8" stroke-width="2"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-messages" viewBox="0 0 64 64">
|
||||||
|
<path d="M15 14h26c6.1 0 11 4.9 11 11v9c0 6.1-4.9 11-11 11H31l-10 8v-8h-6c-6.1 0-11-4.9-11-11v-9c0-6.1 4.9-11 11-11Z" fill="url(#lg-chat)" stroke="#7fccff" stroke-width="2"/>
|
||||||
|
<rect x="16" y="24" width="20" height="3.4" rx="1.7" fill="#eef7ff"/>
|
||||||
|
<rect x="16" y="31" width="24" height="3.4" rx="1.7" fill="#eef7ff"/>
|
||||||
|
<rect x="16" y="38" width="17" height="3.4" rx="1.7" fill="#eef7ff"/>
|
||||||
|
<circle cx="48" cy="18" r="7" fill="#ff6d85" stroke="#ffb1be" stroke-width="2"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-admin" viewBox="0 0 64 64">
|
||||||
|
<circle cx="24" cy="25" r="11" fill="url(#lg-admin)" stroke="#d8b7ff" stroke-width="2"/>
|
||||||
|
<circle cx="41" cy="26" r="10" fill="#8a45dd" stroke="#d8b7ff" stroke-width="2"/>
|
||||||
|
<path d="M10 51c0-8.3 6.7-15 15-15h1c8.3 0 15 6.7 15 15v3H10v-3Z" fill="#7a34cb"/>
|
||||||
|
<path d="M30 52c0-7.2 5.8-13 13-13s13 5.8 13 13v2H30v-2Z" fill="#5c27a3"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-overview-home" viewBox="0 0 64 64">
|
||||||
|
<rect x="8" y="10" width="48" height="44" rx="8" fill="#eef4ff" stroke="#9bbcff" stroke-width="2"/>
|
||||||
|
<rect x="14" y="16" width="14" height="12" rx="3" fill="#2f6fed" opacity="0.9"/>
|
||||||
|
<rect x="32" y="16" width="18" height="12" rx="3" fill="#dbeafe"/>
|
||||||
|
<rect x="14" y="32" width="36" height="16" rx="3" fill="#fff" stroke="#c7d7fe"/>
|
||||||
|
<path d="M14 32h36" stroke="#c7d7fe"/>
|
||||||
|
<rect x="18" y="36" width="10" height="2.5" rx="1" fill="#64748b"/>
|
||||||
|
<rect x="32" y="36" width="14" height="2.5" rx="1" fill="#64748b"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol id="icon-infra2" viewBox="0 0 64 64">
|
||||||
|
<rect x="6" y="8" width="52" height="48" rx="8" fill="#0f172a" stroke="#38bdf8" stroke-width="2"/>
|
||||||
|
<circle cx="32" cy="32" r="14" fill="none" stroke="#22d3ee" stroke-width="2" opacity="0.5"/>
|
||||||
|
<circle cx="32" cy="32" r="8" fill="none" stroke="#38bdf8" stroke-width="1.5" opacity="0.7"/>
|
||||||
|
<path d="M32 18v28M18 32h28" stroke="#38bdf8" stroke-width="1" opacity="0.35"/>
|
||||||
|
<circle cx="32" cy="32" r="3" fill="#22d3ee"/>
|
||||||
|
<circle cx="44" cy="22" r="4" fill="#ef4444" stroke="#fecaca" stroke-width="1.2"/>
|
||||||
|
<path d="M36 28 L41 24" stroke="#f87171" stroke-width="2" stroke-linecap="round"/>
|
||||||
|
<rect x="12" y="12" width="8" height="3" rx="1" fill="#22c55e" opacity="0.9"/>
|
||||||
|
<rect x="12" y="49" width="14" height="3" rx="1" fill="#64748b"/>
|
||||||
|
</symbol>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<div class="shell">
|
||||||
|
<aside class="sidebar">
|
||||||
|
<div class="brand">
|
||||||
|
<h1>Ligbox <span class="brand-ops">Ops</span></h1>
|
||||||
|
<p>Support Desk · Ibytera</p>
|
||||||
|
</div>
|
||||||
|
<nav class="nav">
|
||||||
|
<button type="button" data-view="agentic-ops" data-module="agentic-ops" id="nav-agentic-ops" class="active nav-item nav-item-agentic">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-infra"/></svg></span>
|
||||||
|
<span class="nav-label">Agentic Ops</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="dashboard" data-module="core" class="nav-item nav-item-dashboard">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-dashboard"/></svg></span>
|
||||||
|
<span class="nav-label">Dashboard</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="overview" data-module="overview" id="nav-overview" class="nav-item nav-item-overview">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-overview"/></svg></span>
|
||||||
|
<span class="nav-label">Overview</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="overview-home" data-module="overview-home" id="nav-overview-home" class="nav-item nav-item-overview-home">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-overview-home"/></svg></span>
|
||||||
|
<span class="nav-label">Serviços IaaS</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="tickets" data-module="core" class="nav-item nav-item-tickets">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-tickets"/></svg></span>
|
||||||
|
<span class="nav-label">Tickets</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="leads" data-module="leads" id="nav-leads" hidden class="nav-item nav-item-leads">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-leads"/></svg></span>
|
||||||
|
<span class="nav-label">Leads</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="events" data-module="events" id="nav-events" class="nav-item nav-item-events">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-events"/></svg></span>
|
||||||
|
<span class="nav-label">Eventos</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="nav-item nav-item-console" id="nav-console" title="Console unificado — Domínio & DNS">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-dashboard"/></svg></span>
|
||||||
|
<span class="nav-label">Console</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="tenants" data-module="tenants" id="nav-tenants" hidden class="nav-item nav-item-tenants">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-tenants"/></svg></span>
|
||||||
|
<span class="nav-label">Tenants</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="email-migration" data-module="email-migration" id="nav-email-migration" class="nav-item nav-item-email-migration">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-events"/></svg></span>
|
||||||
|
<span class="nav-label">Migração E-mail</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="infra" data-module="infra" class="nav-item nav-item-infra">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-infra"/></svg></span>
|
||||||
|
<span class="nav-label">INFRA CODE</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="infra2" data-module="infra2-soc" class="nav-item nav-item-infra2">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-infra2"/></svg></span>
|
||||||
|
<span class="nav-label">Infra 2 <span class="nav-badge-new">SOC</span></span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="account" data-module="core" id="nav-account" class="nav-item nav-item-account">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-account"/></svg></span>
|
||||||
|
<span class="nav-label">Minha conta</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="messages" data-module="messages" id="nav-messages" hidden class="nav-item nav-item-messages">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-messages"/></svg></span>
|
||||||
|
<span class="nav-label">Mensagens</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="admin" data-module="admin-users" id="nav-admin" hidden class="nav-item nav-item-admin">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-admin"/></svg></span>
|
||||||
|
<span class="nav-label">Administradores</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="access-matrix" id="nav-access-matrix" hidden class="nav-item nav-item-admin">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-admin"/></svg></span>
|
||||||
|
<span class="nav-label">Matriz <span class="nav-badge-new">β</span></span>
|
||||||
|
</button>
|
||||||
|
<button type="button" data-view="modules" data-module="modules-admin" id="nav-modules" hidden class="nav-item nav-item-modules">
|
||||||
|
<span class="nav-icon-wrap" aria-hidden="true"><svg class="nav-icon-svg"><use href="#icon-admin"/></svg></span>
|
||||||
|
<span class="nav-label">Módulos</span>
|
||||||
|
</button>
|
||||||
|
</nav>
|
||||||
|
<div class="sidebar-user" id="sidebar-user"></div>
|
||||||
|
<div class="sidebar-footer">VM122 · ligbox-ops · v0.9.3</div>
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
<main class="main">
|
||||||
|
<header class="page-header">
|
||||||
|
<div>
|
||||||
|
<h2 id="page-title">Agentic Ops</h2>
|
||||||
|
<p id="page-subtitle">Vigilância 24/7, findings, advisor IA e copiloto ops (Spec 029)</p>
|
||||||
|
</div>
|
||||||
|
<div class="page-toolbar" id="page-toolbar">
|
||||||
|
<span id="header-user" class="header-user" hidden></span>
|
||||||
|
<span id="global-health" class="status-pill">…</span>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" id="btn-logout" hidden>Sair</button>
|
||||||
|
<button type="button" class="btn btn-ghost" id="btn-refresh">Atualizar</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section id="view-dashboard" class="view">
|
||||||
|
<div class="console-v2-banner" role="note">
|
||||||
|
<strong>Console v2</strong> — KPIs e ranking técnico migram para
|
||||||
|
<a href="https://console.ligbox.com.br" target="_blank" rel="noopener noreferrer">console.ligbox.com.br</a>.
|
||||||
|
Este painel permanece até cutover Fase 4.
|
||||||
|
</div>
|
||||||
|
<div id="dashboard-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-overview" class="view">
|
||||||
|
<div class="console-v2-banner" role="note">
|
||||||
|
<strong>Saúde migrada</strong> — scorecard e domínios com atenção estão no
|
||||||
|
<a href="https://console.ligbox.com.br" target="_blank" rel="noopener noreferrer">Console unificado</a>.
|
||||||
|
</div>
|
||||||
|
<div id="overview-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-overview-home" class="view">
|
||||||
|
<div id="overview-home-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-leads" class="view">
|
||||||
|
<div id="leads-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-tickets" class="view">
|
||||||
|
<div class="console-v2-banner" role="note">
|
||||||
|
<strong>Chamados CH-*</strong> — investigação unificada em
|
||||||
|
<a href="https://console.ligbox.com.br/chamados" target="_blank" rel="noopener noreferrer">console.ligbox.com.br/chamados</a>.
|
||||||
|
</div>
|
||||||
|
<div class="toolbar">
|
||||||
|
<button type="button" class="filter-btn active" data-filter="all">Todos</button>
|
||||||
|
<button type="button" class="filter-btn" data-filter="active">Activos</button>
|
||||||
|
<button type="button" class="filter-btn" data-filter="escalated">Escalados</button>
|
||||||
|
<button type="button" class="filter-btn" data-filter="assisting">Assistindo</button>
|
||||||
|
<button type="button" class="filter-btn" data-filter="closed">Fechados</button>
|
||||||
|
<button type="button" class="filter-btn" data-filter="leads" id="filter-leads" hidden>Leads</button>
|
||||||
|
<span class="toolbar-sep">|</span>
|
||||||
|
<button type="button" class="filter-btn active" data-source="all" data-kind="ticket">Todas origens</button>
|
||||||
|
<button type="button" class="filter-btn" data-source="vm112-onboard" data-kind="ticket">Onboard</button>
|
||||||
|
<button type="button" class="filter-btn" data-source="wazuh" data-kind="ticket">Wazuh</button>
|
||||||
|
</div>
|
||||||
|
<div class="grid-2">
|
||||||
|
<div id="ticket-list"><p class="loading">Carregando…</p></div>
|
||||||
|
<div id="ticket-detail">
|
||||||
|
<div class="card detail-panel"><p class="empty">Selecione um ticket para ver detalhes</p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-events" class="view">
|
||||||
|
<div class="console-v2-banner" role="note">
|
||||||
|
<strong>Discover</strong> — feed de eventos Wazuh/onboard em
|
||||||
|
<a href="https://console.ligbox.com.br/discover" target="_blank" rel="noopener noreferrer">console.ligbox.com.br/discover</a>.
|
||||||
|
</div>
|
||||||
|
<div class="toolbar" id="events-toolbar">
|
||||||
|
<button type="button" class="filter-btn active" data-events-tab="webhooks">Webhooks</button>
|
||||||
|
<button type="button" class="filter-btn" data-events-tab="purges" id="events-tab-purges" hidden>Histórico de purges</button>
|
||||||
|
<button type="button" class="filter-btn" data-events-tab="security" id="events-tab-security" hidden>Segurança wizard</button>
|
||||||
|
<button type="button" class="filter-btn" data-events-tab="carbonio" id="events-tab-carbonio" data-module="carbonio-release" hidden>Bloqueios Carbonio</button>
|
||||||
|
<span class="toolbar-sep events-webhooks-only">|</span>
|
||||||
|
<button type="button" class="filter-btn active events-webhooks-only" data-source="all" data-kind="event">Todas origens</button>
|
||||||
|
<button type="button" class="filter-btn events-webhooks-only" data-source="vm112-onboard" data-kind="event">Onboard</button>
|
||||||
|
<button type="button" class="filter-btn events-webhooks-only" data-source="wazuh" data-kind="event">Wazuh</button>
|
||||||
|
<button type="button" class="filter-btn events-webhooks-only" data-source="desk.purge" data-kind="event">Purge</button>
|
||||||
|
</div>
|
||||||
|
<div id="events-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-tenants" class="view">
|
||||||
|
<div id="tenants-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-email-migration" class="view" hidden>
|
||||||
|
<div id="email-migration-content"></div>
|
||||||
|
</section>
|
||||||
|
<section id="view-infra" class="view">
|
||||||
|
<div id="infra-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-infra2" class="view">
|
||||||
|
<div id="infra2-content"><p class="loading">Carregando SOC…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-agentic-ops" class="view active">
|
||||||
|
<div id="agentic-ops-content"><p class="loading">Carregando Agentic Ops…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-account" class="view">
|
||||||
|
<div id="account-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-messages" class="view">
|
||||||
|
<div id="messages-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-admin" class="view">
|
||||||
|
<div id="admin-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-access-matrix" class="view">
|
||||||
|
<div id="access-matrix-content"><p class="loading">Carregando matriz…</p></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="view-modules" class="view">
|
||||||
|
<div id="modules-content"><p class="loading">Carregando…</p></div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
<div id="team-drawer" class="team-drawer hidden" aria-hidden="true">
|
||||||
|
<div class="team-drawer-backdrop" data-close-team-drawer></div>
|
||||||
|
<aside class="team-drawer-panel" role="dialog" aria-modal="true" aria-labelledby="team-drawer-title">
|
||||||
|
<div class="team-drawer-header">
|
||||||
|
<h3 id="team-drawer-title">Editar membro</h3>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-team-drawer>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="team-drawer-body" class="team-drawer-body"></div>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
<div id="soc-test-modal" class="modal hidden" aria-hidden="true">
|
||||||
|
<div class="modal-backdrop" data-close-soc-test-modal></div>
|
||||||
|
<div class="modal-panel soc-test-modal-panel" role="dialog" aria-modal="true" aria-labelledby="soc-test-modal-title">
|
||||||
|
<div class="modal-header">
|
||||||
|
<div>
|
||||||
|
<h3 id="soc-test-modal-title">Teste de webhook</h3>
|
||||||
|
<p id="soc-test-modal-sub" class="ticket-meta"></p>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-soc-test-modal>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="soc-test-modal-body" class="modal-body"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="overview-modal" class="modal hidden" aria-hidden="true">
|
||||||
|
<div class="modal-backdrop" data-close-overview-modal></div>
|
||||||
|
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="overview-modal-title">
|
||||||
|
<div class="modal-header">
|
||||||
|
<div>
|
||||||
|
<h3 id="overview-modal-title">Detalhes do tenant</h3>
|
||||||
|
<p id="overview-modal-sub" class="ticket-meta"></p>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-overview-modal>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="overview-modal-body" class="modal-body"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="purge-history-modal" class="modal hidden" aria-hidden="true">
|
||||||
|
<div class="modal-backdrop" data-close-purge-history-modal></div>
|
||||||
|
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="purge-history-modal-title">
|
||||||
|
<div class="modal-header">
|
||||||
|
<div>
|
||||||
|
<h3 id="purge-history-modal-title">Detalhe do purge</h3>
|
||||||
|
<p id="purge-history-modal-sub" class="ticket-meta"></p>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-purge-history-modal>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="purge-history-modal-body" class="modal-body"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="event-auditor-modal" class="modal hidden" aria-hidden="true">
|
||||||
|
<div class="modal-backdrop" data-close-event-auditor-modal></div>
|
||||||
|
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="event-auditor-modal-title">
|
||||||
|
<div class="modal-header">
|
||||||
|
<div>
|
||||||
|
<h3 id="event-auditor-modal-title">Auditor de Eventos</h3>
|
||||||
|
<p id="event-auditor-modal-sub" class="ticket-meta"></p>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-event-auditor-modal>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="event-auditor-modal-body" class="modal-body"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="vm112-domain-modal" class="modal hidden" aria-hidden="true">
|
||||||
|
<div class="modal-backdrop" data-close-vm112-modal></div>
|
||||||
|
<div class="vm112-modal-shell" id="vm112-modal-shell">
|
||||||
|
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="vm112-domain-modal-title">
|
||||||
|
<div class="modal-header">
|
||||||
|
<div>
|
||||||
|
<h3 id="vm112-domain-modal-title">Domínio VM112</h3>
|
||||||
|
<p id="vm112-domain-modal-sub" class="ticket-meta"></p>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-vm112-modal>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="vm112-domain-modal-body" class="modal-body"></div>
|
||||||
|
</div>
|
||||||
|
<aside id="vm112-purge-drawer" class="vm112-purge-drawer" aria-hidden="true" aria-label="Timeline purge">
|
||||||
|
<div class="vm112-purge-drawer-head">
|
||||||
|
<h4>Execução purge</h4>
|
||||||
|
<span id="vm112-purge-elapsed" class="vm112-purge-elapsed">—</span>
|
||||||
|
</div>
|
||||||
|
<ol id="vm112-purge-timeline" class="vm112-purge-timeline"></ol>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="infra-process-modal" class="modal hidden" aria-hidden="true">
|
||||||
|
<div class="modal-backdrop" data-close-infra-process-modal></div>
|
||||||
|
<div class="modal-panel modal-panel-lg" role="dialog" aria-modal="true" aria-labelledby="infra-process-modal-title">
|
||||||
|
<div class="modal-header">
|
||||||
|
<div>
|
||||||
|
<h3 id="infra-process-modal-title">Processo</h3>
|
||||||
|
<p id="infra-process-modal-sub" class="ticket-meta"></p>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-ghost btn-sm" data-close-infra-process-modal>Fechar</button>
|
||||||
|
</div>
|
||||||
|
<div id="infra-process-modal-body" class="modal-body"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="/assets/auth.js?v=20260625serv1"></script>
|
||||||
|
<script src="/assets/modules.js?v=20260619tickets2"></script>
|
||||||
|
<script src="/assets/billing-ui.js?v=20260619tickets2"></script>
|
||||||
|
<script src="/assets/desk-live-stub.js?v=20260619tickets2"></script>
|
||||||
|
<script src="/assets/tickets-workspace.js?v=20260619tickets2"></script>
|
||||||
|
<script src="/assets/tickets-detail-panel.js?v=20260619tickets2"></script>
|
||||||
|
<script src="/assets/servicos.js?v=20260625align1"></script>
|
||||||
|
<script src="/assets/app.js?v=20260625scope1"></script>
|
||||||
|
<script src="/assets/agentic-ops.js?v=20260625pollfix"></script>
|
||||||
|
<script src="/assets/access-matrix.js?v=20260620am7"></script>
|
||||||
|
<script src="/assets/dns-viewer.js?v=20260625handoff1"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
Reference in a new issue