3.3 i18n: модуль с RU/EN словарями, LangMiddleware (cookie+query),
Jinja-фильтр t(), переключатель EN/RU в nav, перевод ключевых
строк интерфейса
3.5 /metrics: Prometheus-совместимый endpoint (scans_total,
scans_flagged, findings_total, by_status, by_ecosystem,
last_scan_timestamp)
3.2 AI disclaimer: сноска под каждым LLM-вердиктом (.llm-disclaimer)
3.4 LLM очередь: asyncio.Semaphore(LLM_MAX_CONCURRENT_ANALYSES)
3.1 initiator + source_ip: поля в Scan, захват из webhook payload,
показ в scan_detail + API
3.6 UI: убран stat-minibar и heatmap с дашборда
32 lines
1.4 KiB
HTML
32 lines
1.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" data-theme="dark">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{% block title %}GuardDog Nexus{% endblock %}</title>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css">
|
|
<script src="https://unpkg.com/htmx.org@2.0.4"></script>
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
<script src="/static/app.js"></script>
|
|
</head>
|
|
<body>
|
|
<main class="container">
|
|
<nav class="sticky">
|
|
<ul><li><strong><a href="/">{{ t('nav_dashboard', request.state.lang) }}</a></strong></li></ul>
|
|
<ul>
|
|
<li><a href="/">{{ t('nav_dashboard', request.state.lang) }}</a></li>
|
|
<li><a href="/scans">{{ t('nav_scans', request.state.lang) }}</a></li>
|
|
<li><a href="/packages">{{ t('nav_packages', request.state.lang) }}</a></li>
|
|
<li style="margin-left: 1rem;">
|
|
{% set next = 'ru' if request.state.lang == 'en' else 'en' %}
|
|
<small><a href="?lang={{ next }}" style="font-size: 0.8rem; opacity: 0.6;">{{ 'RU' if next == 'ru' else 'EN' }}</a></small>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
{% block breadcrumbs %}{% endblock %}
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
{% block scripts %}{% endblock %}
|
|
</body>
|
|
</html>
|