Files
Lucas RayanandClaude Sonnet 5 be47b607df
Release / Plan (reuse the published image?) (push) Successful in 4s
CI / Docker image (build and smoke test) (push) Skipped
CI / Format and clippy (push) Successful in 16s
CI / Dependency audit (push) Successful in 17s
CI / Tests (Linux) (push) Successful in 34s
Release / ci (push) Successful in 35s
Release / Build image (arm64) (push) Successful in 4m55s
Release / Build image (amd64) (push) Failing after 11m10s
Release / Publish tags (push) Skipped
Release / Gitea release (push) Skipped
feat: build a real dashboard and fix dead panel navigation in the web UI
The sidebar nav (Overview/Alerts/Analysis) only did scrollIntoView on a
single stacked page, so clicking it produced no visible change. The
Alerts/Analysis panels were also placeholder shells with no real data
exploration despite the API already exposing rich per-pillar evidence.

- app.js/app.css/index.html: real panel switching via showView()/currentView,
  toggling an .active class with `.view:not(.active) { display: none }`;
  settings keeps opening its own dialog without disturbing the active view.
- New Hosts panel: table of observed hosts ranked by fusion score, with
  per-pillar (P1/P2/P3) columns, search, and drill-down into each pillar's
  evidence. Documents the known limitation that /api/alerts only lists hosts
  with at least one alert (no /api/hosts endpoint exists yet), so a benign
  host with no alert won't appear.
- Alerts panel: filterable by pillar and minimum score, sortable, with
  full evidence rendered as a formatted key/value table instead of raw JSON.
- Overview panel: KPI tiles (alert count, hosts with alerts, max score,
  dataset records) plus two interactive SVG charts (top hosts by fusion
  score, alert distribution by pillar) with hover tooltips.
- i18n-en.js: English strings for all new UI text.

No Rust files changed; this is purely apps/gui/ui/ consuming the existing
/api/alerts, /api/analyze and /api/status endpoints.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAyr8d7HuAdUGB6aA5xmDD
2026-11-01 08:28:08 -03:00

168 lines
8.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const EN = {
'Acauã': 'Acauã',
'caça a ameaças em rede': 'network threat hunting',
'Navegação': 'Navigation',
'Visão geral': 'Overview',
'painel e estado': 'dashboard and status',
'Alertas': 'Alerts',
'evidências recentes': 'recent evidence',
'Análise': 'Analysis',
'dataset Zeek': 'Zeek dataset',
'Configurações': 'Settings',
'idioma e tema': 'language and theme',
'Conectando…': 'Connecting…',
'pré-lançamento': 'pre-release',
'checar atualização': 'check for updates',
'Caça a ameaças em rede': 'Network threat hunting',
'Pesquisa determinística, sem IA opaca': 'Deterministic research, no opaque AI',
'Estado atual.': 'Current state.',
'Ingestão de conn.log e dns.log do Zeek, armazenamento Parquet/DuckDB e os pilares 1 a 4 em versão inicial, validados com tráfego público real. Ainda não: ingestão contínua automática, alertas persistidos entre reinícios, movimentação lateral e sessões UDP.': 'Zeek conn.log and dns.log ingestion, Parquet/DuckDB storage and pillars 1 to 4 in an initial version, validated against real public traffic. Not yet: automatic continuous ingestion, alerts persisted across restarts, lateral movement and UDP sessions.',
'Uso autorizado.': 'Authorized use.',
'Use somente em redes próprias ou com autorização explícita. Nenhum pacote é enviado para fora.': 'Use only on your own networks or with explicit authorization. No packet leaves the machine.',
'Pilares de detecção': 'Detection pillars',
'Pilar {n}': 'Pillar {n}',
'Pilar 1': 'Pillar 1',
'Periodograma de Rayleigh/Schuster com grade limitada ao intervalo observado.': 'Rayleigh/Schuster periodogram with a grid bounded by the observed span.',
'versão inicial': 'initial version',
'Pilar 2': 'Pillar 2',
'Sessões persistentes': 'Persistent sessions',
'Sessões TCP longas, inclusive as que o Zeek divide por inatividade.': 'Long TCP sessions, including those Zeek splits on inactivity.',
'Pilar 3': 'Pillar 3',
'Anomalias de protocolo': 'Protocol anomalies',
'Volume de informação (entropia de Shannon) em subdomínios DNS.': 'Information volume (Shannon entropy) in DNS subdomains.',
'Pilar 4': 'Pillar 4',
'Fusão de evidências': 'Evidence fusion',
'Prioridade por host com evidência por alerta.': 'Per-host priority with per-alert evidence.',
'Analisar dataset': 'Analyze dataset',
'Aponte para um diretório de logs Zeek ou para um dataset local.': 'Point to a Zeek log directory or a local dataset.',
'Diretório de logs': 'Log directory',
'Analisar': 'Analyze',
'Atualizar status': 'Refresh status',
'Nenhuma análise executada.': 'No analysis has run yet.',
'Alertas recentes': 'Recent alerts',
'Cada alerta carrega a evidência determinística que o sustenta.': 'Each alert carries the deterministic evidence behind it.',
'Nenhum alerta ainda. Analise um diretório de logs do Zeek.': 'No alerts yet. Analyze a Zeek log directory.',
'Acauã · pré-lançamento': 'Acauã · pre-release',
'Fechar configurações': 'Close settings',
'Fechar': 'Close',
'Idioma': 'Language',
'Tema': 'Theme',
'Claro': 'Light',
'Escuro': 'Dark',
'Navegação principal': 'Main navigation',
'Serviço local ativo': 'Local service online',
'Serviço indisponível': 'Service unavailable',
'Nenhum dataset selecionado.': 'No dataset selected.',
'Analisando…': 'Analyzing…',
'Análise concluída: {n} registros e {n} alertas.': 'Analysis complete: {n} records and {n} alerts.',
'Falha na análise: {n}': 'Analysis failed: {n}',
'Verificando atualização…': 'Checking for updates…',
'Versão {n} é a mais recente.': 'Version {n} is the latest.',
'Atualização {n} disponível.': 'Update {n} available.',
'Não foi possível verificar a atualização: {n}': 'Could not check for updates: {n}',
'Nenhum alerta ainda.': 'No alerts yet.',
'Alertas carregados: {n}': 'Alerts loaded: {n}',
'versão {n}': 'version {n}',
'estado e prioridades': 'status and priorities',
'filtros e evidências': 'filters and evidence',
'fusão por evidência': 'fusion by evidence',
'Hosts': 'Hosts',
'Estado, prioridades e distribuição dos alertas': 'Status, priorities and alert distribution',
'Filtre, ordene e abra a evidência completa': 'Filter, sort and open the full evidence',
'Prioridade por fusão de evidências entre pilares': 'Priority by cross-pillar evidence fusion',
'Ingestão de logs Zeek e relatório da execução': 'Zeek log ingestion and run report',
'carregando…': 'loading…',
'Hosts com alerta': 'Hosts with alerts',
'ranqueados por fusão': 'ranked by fusion',
'melhor host observado': 'top observed host',
'Registros no dataset': 'Dataset records',
'armazenamento local': 'local storage',
'Top hosts por fusão': 'Top hosts by fusion',
'Score ponderado de evidências (0 a 1). Passe o mouse para ver os pilares.': 'Weighted evidence score (0 to 1). Hover to see the pillars.',
'Alertas por pilar': 'Alerts per pillar',
'Distribuição observada. Clique em uma barra para filtrar os alertas.': 'Observed distribution. Click a bar to filter alerts.',
'Alertas prioritários': 'Priority alerts',
'Os alertas com maior score individual. Abra a lista completa para filtrar.': 'The alerts with the highest individual score. Open the full list to filter.',
'Ver todos os alertas': 'View all alerts',
'sem hosts': 'no hosts',
'Filtre, ordene e expanda cada alerta para ver a evidência completa como tabela.': 'Filter, sort and expand each alert to see the full evidence as a table.',
'Ordenar': 'Sort',
'Maior score': 'Highest score',
'Menor score': 'Lowest score',
'Mais recentes': 'Newest',
'Pilar': 'Pillar',
'Todos': 'All',
'Score mínimo': 'Minimum score',
'Buscar': 'Search',
'IP, host, domínio ou ID': 'IP, host, domain or ID',
'Ranking por score de fusão (desc). Clique em uma linha para ver a evidência de cada pilar.': 'Ranked by fusion score (desc). Click a row to see each pillar’s evidence.',
'Buscar host': 'Search host',
'Fusão': 'Fusion',
'Nenhum host carregado.': 'No hosts loaded.',
'Detalhes': 'Details',
'A API de fusão lista apenas hosts com pelo menos um alerta. Hosts sem alerta não aparecem nesta tabela.': 'The fusion API only lists hosts with at least one alert. Hosts without alerts do not appear in this table.',
'Ver alertas': 'View alerts',
'Ver hosts': 'View hosts',
'Estado do serviço': 'Service status',
'Versão, dataset e armazenamento informados pela API local.': 'Version, dataset and storage reported by the local API.',
'{n} pilares ativos': '{n} active pillars',
'{n} com múltiplos pilares': '{n} with multiple pillars',
'{n} partições · {n}': '{n} partitions · {n}',
'{n} de {n} alertas': '{n} of {n} alerts',
'{n} hosts': '{n} hosts',
'Sem evidência registrada.': 'No evidence recorded.',
'Período': 'Period',
'Regularidade': 'Regularity',
'p-valor': 'p-value',
'Significância': 'Significance',
'Observações': 'Observations',
'Sessão': 'Session',
'Partes': 'Parts',
'Falhas': 'Failures',
'Início': 'Start',
'Informação': 'Information',
'Entropia': 'Entropy',
'Únicos': 'Unique',
'Domínio': 'Domain',
'Contribuição': 'Contribution',
'Evidência completa': 'Full evidence',
'Nenhum alerta corresponde aos filtros.': 'No alerts match the filters.',
'Copiar JSON': 'Copy JSON',
'Copiado': 'Copied',
'Ver host': 'View host',
'Sem alerta neste pilar.': 'No alert in this pillar.',
'Abrir alerta': 'Open alert',
'Nenhum host com alerta.': 'No hosts with alerts.',
'Nenhum host corresponde à busca.': 'No hosts match the search.',
'Nenhum host com alerta para exibir.': 'No hosts with alerts to display.',
'Nenhum alerta para exibir.': 'No alerts to display.',
'Pilar {n}: m {n} · peso {n} · contribuição {n}': 'Pillar {n}: m {n} · weight {n} · contribution {n}',
'Pilar {n}: m {n} · contribuição {n}': 'Pillar {n}: m {n} · contribution {n}',
'Score de fusão: {n}': 'Fusion score: {n}',
'Alertas: {n}': 'Alerts: {n}',
'{n}% do total': '{n}% of total',
'Pilar {n}: {n} alertas': 'Pillar {n}: {n} alerts',
'Serviço indisponível.': 'Service unavailable.',
'Versão': 'Version',
'Modo': 'Mode',
'Registros': 'Records',
'Partições': 'Partitions',
'TTL (dias)': 'TTL (days)',
'Backend': 'Backend',
'Status': 'Status',
'Diretório': 'Directory',
'Logs conn': 'conn logs',
'Logs DNS': 'DNS logs',
'Schema de evidência': 'Evidence schema',
'P1 excluídos': 'P1 excluded',
'Análise concluída: {n} registros, {n} alertas e {n} hosts.': 'Analysis complete: {n} records, {n} alerts and {n} hosts.',
'Atualizado às {n}': 'Updated at {n}',
'sim': 'yes',
'não': 'no',
'PCR': 'PCR',
'JSD': 'JSD',
'Hosts por score de fusão': 'Hosts by fusion score',
'Distribuição de alertas por pilar': 'Alert distribution per pillar',
'Filtrar por pilar': 'Filter by pillar',
};