feat: enrichers, panel de ingest y menu contextual en el grafo

- Añade enricher.go + directorio enrichers/ para enriquecer entidades con fuentes externas.
- Nuevos componentes frontend: IngestPanel (panel de ingesta de datos) y NodeContextMenu (menu contextual sobre nodos del grafo).
- Retira SearchBar y lib/utils.ts; la busqueda se integra dentro de los paneles existentes.
- Ajusta tipos (types.go, types.ts, wailsjs/go) y theming (postcss + app.css + Mantine).
- Actualiza app.go y wails.json para exponer las nuevas capacidades.
- Añade directorio projects/ con estado inicial.
- Rebuild del frontend (dist actualizado).
This commit is contained in:
2026-04-13 23:32:55 +02:00
parent 23198eee0c
commit c9fd4aa84c
42 changed files with 2615 additions and 1543 deletions
+36 -31
View File
@@ -1,10 +1,10 @@
package main
// EntityTypePreset defines an OSINT entity type with its visual properties and suggested metadata fields.
// EntityTypePreset defines an entity type with its visual properties and suggested metadata fields.
type EntityTypePreset struct {
TypeRef string `json:"type_ref"` // registry type ID
Label string `json:"label"` // human-readable
Color string `json:"color"` // hex color for graph nodes
TypeRef string `json:"type_ref"` // short type name
Label string `json:"label"` // human-readable
Color string `json:"color"` // hex color for graph nodes
MetadataFields []string `json:"metadata_fields"` // suggested metadata keys
}
@@ -77,41 +77,46 @@ type AssertionInput struct {
Description string `json:"description"`
}
// Color map for OSINT entity types
// Color map for entity types (short names aligned with registry)
var entityTypeColors = map[string]string{
"osint_person_go_cybersecurity": "#e74c3c",
"osint_organization_go_cybersecurity": "#3498db",
"osint_crypto_wallet_go_cybersecurity": "#f39c12",
"osint_ip_address_go_cybersecurity": "#2ecc71",
"osint_domain_go_cybersecurity": "#9b59b6",
"osint_email_go_cybersecurity": "#1abc9c",
"osint_phone_go_cybersecurity": "#e67e22",
"osint_malware_go_cybersecurity": "#c0392b",
"osint_vulnerability_go_cybersecurity": "#8e44ad",
"osint_social_media_go_cybersecurity": "#2980b9",
"osint_document_go_cybersecurity": "#7f8c8d",
"osint_event_go_cybersecurity": "#d35400",
"osint_location_go_cybersecurity": "#27ae60",
"person": "#e74c3c",
"organization": "#3498db",
"crypto_wallet": "#f39c12",
"ip_address": "#2ecc71",
"domain": "#9b59b6",
"email": "#1abc9c",
"phone": "#e67e22",
"malware": "#c0392b",
"vulnerability": "#8e44ad",
"social_media": "#2980b9",
"document": "#7f8c8d",
"event": "#d35400",
"location": "#27ae60",
"text": "#78909c",
"url": "#8bc34a",
}
var entityTypePresets = []EntityTypePreset{
{"osint_person_go_cybersecurity", "Person", "#e74c3c", []string{"full_name", "alias", "nationality", "dob", "gender", "risk_score"}},
{"osint_organization_go_cybersecurity", "Organization", "#3498db", []string{"legal_name", "country", "sector", "founded", "risk_score"}},
{"osint_crypto_wallet_go_cybersecurity", "Crypto Wallet", "#f39c12", []string{"address", "blockchain", "balance", "first_seen", "last_seen"}},
{"osint_ip_address_go_cybersecurity", "IP Address", "#2ecc71", []string{"ip", "asn", "country", "isp", "geolocation", "last_seen"}},
{"osint_domain_go_cybersecurity", "Domain", "#9b59b6", []string{"fqdn", "registrar", "created_date", "expires_date", "name_servers"}},
{"osint_email_go_cybersecurity", "Email", "#1abc9c", []string{"address", "provider", "verified", "breached"}},
{"osint_phone_go_cybersecurity", "Phone", "#e67e22", []string{"number", "country_code", "carrier", "phone_type"}},
{"osint_malware_go_cybersecurity", "Malware", "#c0392b", []string{"family", "hash_sha256", "first_seen", "last_seen", "threat_level"}},
{"osint_vulnerability_go_cybersecurity", "Vulnerability", "#8e44ad", []string{"cve_id", "cvss", "affected_product", "published", "exploited"}},
{"osint_social_media_go_cybersecurity", "Social Media", "#2980b9", []string{"platform", "username", "url", "followers", "verified"}},
{"osint_document_go_cybersecurity", "Document", "#7f8c8d", []string{"title", "format", "classification", "hash_sha256", "source"}},
{"osint_event_go_cybersecurity", "Event", "#d35400", []string{"event_type", "date", "location", "description", "severity"}},
{"osint_location_go_cybersecurity", "Location", "#27ae60", []string{"lat", "lon", "address", "country", "city"}},
{"person", "Person", "#e74c3c", []string{"full_name", "alias", "nationality", "dob", "gender", "risk_score"}},
{"organization", "Organization", "#3498db", []string{"legal_name", "country", "sector", "founded", "risk_score"}},
{"crypto_wallet", "Crypto Wallet", "#f39c12", []string{"address", "blockchain", "balance", "first_seen", "last_seen"}},
{"ip_address", "IP Address", "#2ecc71", []string{"ip", "asn", "country", "isp", "geolocation", "last_seen"}},
{"domain", "Domain", "#9b59b6", []string{"fqdn", "registrar", "created_date", "expires_date", "name_servers"}},
{"email", "Email", "#1abc9c", []string{"address", "provider", "verified", "breached"}},
{"phone", "Phone", "#e67e22", []string{"number", "country_code", "carrier", "phone_type"}},
{"malware", "Malware", "#c0392b", []string{"family", "hash_sha256", "first_seen", "last_seen", "threat_level"}},
{"vulnerability", "Vulnerability", "#8e44ad", []string{"cve_id", "cvss", "affected_product", "published", "exploited"}},
{"social_media", "Social Media", "#2980b9", []string{"platform", "username", "url", "followers", "verified"}},
{"document", "Document", "#7f8c8d", []string{"title", "format", "classification", "file_path", "source"}},
{"event", "Event", "#d35400", []string{"event_type", "date", "location", "description", "severity"}},
{"location", "Location", "#27ae60", []string{"lat", "lon", "address", "country", "city"}},
{"text", "Text", "#78909c", []string{"content_preview", "source", "char_count"}},
{"url", "URL", "#8bc34a", []string{"url", "domain", "status_code"}},
}
var relationPresets = []string{
"funds", "employs", "communicates_with", "owns", "operates",
"controls", "affiliated_with", "located_at", "resolves_to",
"registered_by", "hosts", "exploits", "attributed_to", "related_to",
"extracted_from", "contains", "fetched_from",
}