diff --git a/.env.example b/.env.example
index f82a731..b4083ef 100644
--- a/.env.example
+++ b/.env.example
@@ -1,4 +1,4 @@
-# LogWhisperer AI - Environment Variables
+# LogWhispererAI - Environment Variables
# Telegram Bot Configuration
# Ottieni questi valori seguendo le istruzioni in docs/telegram_setup.md
diff --git a/.opencode/agents/n8n_specialist_agent.md b/.opencode/agents/n8n_specialist_agent.md
index 9b734ab..f24772e 100644
--- a/.opencode/agents/n8n_specialist_agent.md
+++ b/.opencode/agents/n8n_specialist_agent.md
@@ -7,7 +7,7 @@ read: true
@n8n-specialist
-Sei un esperto di automazione n8n. Il tuo compito è interfacciare LogWhisperer AI con l'istanza Docker su 192.168.254.12.
+Sei un esperto di automazione n8n. Il tuo compito è interfacciare LogWhispererAI con l'istanza Docker su 192.168.254.12.
Focus Operativo
diff --git a/AGENTS.md b/AGENTS.md
index 559bed5..39ed2ce 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,4 +1,4 @@
-# LogWhisperer AI - Agent Rules
+# LogWhispererAI - Agent Rules
Regole operative per gli agenti AI che collaborano su questo progetto.
diff --git a/LICENSE.md b/LICENSE.md
index b5a6a0e..e42174a 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -20,11 +20,11 @@ Nessuna Modifica: È vietato modificare, alterare, adattare, tradurre, decompila
Uso Non Autorizzato: È vietato vendere, noleggiare, dare in locazione, concedere in licenza o utilizzare il software per scopi commerciali senza una licenza specifica rilasciata dall'autore.
-Tutela del Marchio: I nomi "LogWhisperer AI", "Sacchi's Server Sentinel" e il "Metodo Sacchi" sono marchi e metodologie di proprietà dell'autore.
+Tutela del Marchio: I nomi "LogWhispererAI", "Sacchi's Server Sentinel" e il "Metodo Sacchi" sono marchi e metodologie di proprietà dell'autore.
Legge Applicabile e Foro Competente
-Il presente accordo è regolato dalla legge italiana. Per qualsiasi controversia derivante dall'interpretazione, esecuzione o risoluzione della presente licenza e per ogni disputa relativa al progetto "LogWhisperer AI", sarà competente in via esclusiva il Foro di Milano, Italia.
+Il presente accordo è regolato dalla legge italiana. Per qualsiasi controversia derivante dall'interpretazione, esecuzione o risoluzione della presente licenza e per ogni disputa relativa al progetto "LogWhispererAI", sarà competente in via esclusiva il Foro di Milano, Italia.
Contatti
diff --git a/README.md b/README.md
index 9a8d1cf..db99c5f 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
🎯 Visione del Progetto
-LogWhisperer AI trasforma i log di sistema e database spesso incomprensibili in alert azionabili descritti in "plain language". È pensato per piccole web agency e freelance che gestiscono infrastrutture (AWS, DigitalOcean, VPS) senza avere un sistemista senior dedicato.
+LogWhispererAI trasforma i log di sistema e database spesso incomprensibili in alert azionabili descritti in "plain language". È pensato per piccole web agency e freelance che gestiscono infrastrutture (AWS, DigitalOcean, VPS) senza avere un sistemista senior dedicato.
## 🚀 Stato di Sviluppo
diff --git a/docker-compose.yml b/docker-compose.yml
index e7eadb9..d7accbc 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,4 +1,4 @@
-# Docker Compose - LogWhisperer AI Development Environment
+# Docker Compose - LogWhispererAI Development Environment
# Usage: docker compose up -d
# Access Frontend: http://localhost:5173
# Access Fake Backend API: http://localhost:3000
diff --git a/docs/1.setup_procedure/agents.md b/docs/1.setup_procedure/agents.md
index 8e69065..d6304c0 100644
--- a/docs/1.setup_procedure/agents.md
+++ b/docs/1.setup_procedure/agents.md
@@ -1,6 +1,6 @@
-# LogWhisperer AI - Agent Staff Catalog
+# LogWhispererAI - Agent Staff Catalog
-Catalogo completo degli agenti AI specializzati che collaborano sul progetto LogWhisperer AI.
+Catalogo completo degli agenti AI specializzati che collaborano sul progetto LogWhispererAI.
---
@@ -211,7 +211,7 @@ Mantiene aggiornata la documentazione e il changelog.
Esperto in automazione e orchestrazione n8n.
**Responsabilità:**
-- Interfacciare LogWhisperer AI con l'istanza Docker su 192.168.254.12
+- Interfacciare LogWhispererAI con l'istanza Docker su 192.168.254.12
- Configurazione e testing dei Webhook di ricezione log
- Monitorare esecuzioni per garantire applicazione "Metodo Sacchi" nei prompt LLM
- Troubleshooting della connessione tra script Bash locale e API n8n
diff --git a/docs/1.setup_procedure/setup.md b/docs/1.setup_procedure/setup.md
index ba01fe0..fbf0daa 100644
--- a/docs/1.setup_procedure/setup.md
+++ b/docs/1.setup_procedure/setup.md
@@ -1,4 +1,4 @@
-Ottimo progetto. Per trasformare **LogWhisperer AI** in un prodotto reale in 4 giorni usando **OpenCode.ai**, dobbiamo configurare l'ambiente in modo che l'agente non si limiti a scrivere codice, ma agisca come un vero team di sviluppo (Tech Lead + Developer + QA).
+Ottimo progetto. Per trasformare **LogWhispererAI** in un prodotto reale in 4 giorni usando **OpenCode.ai**, dobbiamo configurare l'ambiente in modo che l'agente non si limiti a scrivere codice, ma agisca come un vero team di sviluppo (Tech Lead + Developer + QA).
Ecco come configurare OpenCode.ai seguendo la tua metodologia **Spec-Driven**, **TDD** e il **Metodo Sacchi**.
diff --git a/docs/frontend_landing_plan.md b/docs/frontend_landing_plan.md
index 1e5e559..6d3932f 100644
--- a/docs/frontend_landing_plan.md
+++ b/docs/frontend_landing_plan.md
@@ -1,6 +1,6 @@
# Piano d'Azione per lo Sviluppo della Landing Page
-**Obiettivo:** Creare una landing page di alta qualità che comunichi efficacemente l'UVP di LogWhisperer AI e converta i visitatori in utenti attivi.
+**Obiettivo:** Creare una landing page di alta qualità che comunichi efficacemente l'UVP di LogWhispererAI e converta i visitatori in utenti attivi.
## 🎯 UVP da Comunicare
> *"Il DevOps tascabile che traduce i crash del tuo server e ti dice l'esatto comando per risolverli"*
diff --git a/docs/git-history.md b/docs/git-history.md
index 797c5ca..ed38c47 100644
--- a/docs/git-history.md
+++ b/docs/git-history.md
@@ -1,6 +1,6 @@
-# Git History - LogWhisperer AI
+# Git History - LogWhispererAI
-**Repository:** LogWhisperer AI
+**Repository:** LogWhispererAI
**Branch Principale:** `main`
**Ultimo Aggiornamento:** 2026-04-02
**Commit Corrente:** `88cfe9a`
@@ -18,7 +18,7 @@
## Panoramica
-Questo documento traccia la storia dei commit del progetto LogWhisperer AI. Viene aggiornato periodicamente per riflettere l'evoluzione del codebase.
+Questo documento traccia la storia dei commit del progetto LogWhispererAI. Viene aggiornato periodicamente per riflettere l'evoluzione del codebase.
### Convenzioni di Commit
diff --git a/docs/prd.md b/docs/prd.md
index 49c44d1..779ed4c 100644
--- a/docs/prd.md
+++ b/docs/prd.md
@@ -1,5 +1,5 @@
# Product Requirements Document (PRD) - MVP
-## Progetto: LogWhisperer AI (aka Sacchi's Server Sentinel)
+## Progetto: LogWhispererAI (aka Sacchi's Server Sentinel)
**Status:** 🟢 MVP Active Development - Sprint 1 Completed
**Last Updated:** 2026-04-02
diff --git a/docs/prompt.project.manager.md b/docs/prompt.project.manager.md
index 9e532d3..9e50b88 100644
--- a/docs/prompt.project.manager.md
+++ b/docs/prompt.project.manager.md
@@ -4,7 +4,7 @@ Here is the English translation:
**PROMPT TO INSERT INTO THE AI:**
-*"Act as a Tech Lead and Project Manager expert in Lean Startup and Micro-SaaS methodologies. I have provided you with the Product Requirements Document (PRD) for the 'LogWhisperer AI' project.
+*"Act as a Tech Lead and Project Manager expert in Lean Startup and Micro-SaaS methodologies. I have provided you with the Product Requirements Document (PRD) for the 'LogWhispererAI' project.
Our goal is to launch this MVP to market in just 4 days ('fail fast, fail cheap' approach) using No-Code/Low-Code logic wherever possible to save time.
Your task is to analyze the PRD and generate a development strategy ('Spec-driven development') structured as follows:*
diff --git a/docs/reviews/sprint1_review.md b/docs/reviews/sprint1_review.md
index aab73f9..5f37bab 100644
--- a/docs/reviews/sprint1_review.md
+++ b/docs/reviews/sprint1_review.md
@@ -1,5 +1,5 @@
# Project Review - Sprint 1
-## LogWhisperer AI - Log Ingestion
+## LogWhispererAI - Log Ingestion
**Data Review:** 2026-04-02
**Sprint:** 1 - Log Ingestion Script
@@ -430,7 +430,7 @@ Tutti i deliverable dello Sprint 1 sono stati prodotti e verificati con successo
---
-**Review Condotta da:** Agent Staff LogWhisperer AI
+**Review Condotta da:** Agent Staff LogWhispererAI
**Data:** 2026-04-02
**Prossima Review:** Post-Sprint 2
diff --git a/docs/roadmap_ideas.md b/docs/roadmap_ideas.md
index 13ab8a2..69ae56d 100644
--- a/docs/roadmap_ideas.md
+++ b/docs/roadmap_ideas.md
@@ -1,6 +1,6 @@
# Roadmap & Suggerimenti di Sviluppo
-> **Documento Living** - Questo file raccoglie idee, suggerimenti e potenziali nuove funzionalità per LogWhisperer AI.
+> **Documento Living** - Questo file raccoglie idee, suggerimenti e potenziali nuove funzionalità per LogWhispererAI.
>
> Ultimo aggiornamento: 2026-04-03
@@ -289,4 +289,4 @@ Hai un'idea? Aggiungila a questo documento seguendo il formato:
---
-*Documento mantenuto dal team LogWhisperer AI*
+*Documento mantenuto dal team LogWhispererAI*
diff --git a/docs/setup_config_archive.md b/docs/setup_config_archive.md
index bdd42b8..86bed7f 100644
--- a/docs/setup_config_archive.md
+++ b/docs/setup_config_archive.md
@@ -1,4 +1,4 @@
-# 🤖 Staff di Agenti AI - LogWhisperer AI
+# 🤖 Staff di Agenti AI - LogWhispererAI
Questo documento definisce i ruoli, le responsabilità e le configurazioni per i sotto-agenti da utilizzare in OpenCode.ai per garantire un workflow "Spec-Driven" e "Safety First".
diff --git a/docs/specs/ai_pipeline.md b/docs/specs/ai_pipeline.md
index f05c48c..49e87d6 100644
--- a/docs/specs/ai_pipeline.md
+++ b/docs/specs/ai_pipeline.md
@@ -10,7 +10,7 @@
## 1. Overview
### 1.1 Scopo
-L'AI Processing Pipeline è il cuore intelligente di LogWhisperer AI. Trasforma log grezzi di sistema in insight azionabili utilizzando OpenRouter per accedere a modelli AI (GPT-4o-mini) con fallback automatico e costi ottimizzati.
+L'AI Processing Pipeline è il cuore intelligente di LogWhispererAI. Trasforma log grezzi di sistema in insight azionabili utilizzando OpenRouter per accedere a modelli AI (GPT-4o-mini) con fallback automatico e costi ottimizzati.
### 1.2 Flusso Dati
@@ -56,7 +56,7 @@ Il prompt di sistema incorpora esplicitamente i tre pilastri del Metodo Sacchi:
### 2.2 System Prompt Completo
```javascript
-const SYSTEM_PROMPT = `Sei LogWhisperer AI, un assistente DevOps esperto specializzato nell'analisi di log di sistema.
+const SYSTEM_PROMPT = `Sei LogWhispererAI, un assistente DevOps esperto specializzato nell'analisi di log di sistema.
## MISSIONE
Analizza i log ricevuti e fornisci insight azionabili in italiano, semplice e chiaro.
@@ -305,7 +305,7 @@ const SITE_URL = process.env.OPENROUTER_SITE_URL || 'https://logwhisperer.ai';
const APP_NAME = process.env.OPENROUTER_APP_NAME || 'LogWhispererAI';
// System Prompt (incollare qui il SYSTEM_PROMPT completo)
-const SYSTEM_PROMPT = `Sei LogWhisperer AI...`;
+const SYSTEM_PROMPT = `Sei LogWhispererAI...`;
// Input dal nodo precedente
const inputData = $input.first().json;
diff --git a/docs/sprint1_verification.md b/docs/sprint1_verification.md
index 9139bee..4cb8e9d 100644
--- a/docs/sprint1_verification.md
+++ b/docs/sprint1_verification.md
@@ -1,6 +1,6 @@
# Sprint 1 Verification Report
-**Progetto:** LogWhisperer AI
+**Progetto:** LogWhispererAI
**Sprint:** 1 - Log Ingestion Script
**Data Verifica:** 2026-04-02
**Verificatore:** OpenCode Agent
@@ -38,7 +38,7 @@
## 1. Overview
-Questo documento certifica il completamento dello Sprint 1 del progetto LogWhisperer AI. Lo sprint aveva come obiettivo la creazione di uno script Bash per l'ingestion dei log di sistema, seguendo la metodologia TDD (Test-Driven Development) e il Metodo Sacchi.
+Questo documento certifica il completamento dello Sprint 1 del progetto LogWhispererAI. Lo sprint aveva come obiettivo la creazione di uno script Bash per l'ingestion dei log di sistema, seguendo la metodologia TDD (Test-Driven Development) e il Metodo Sacchi.
---
diff --git a/docs/tools_fake_backend.md b/docs/tools_fake_backend.md
index dd8968e..7232a96 100644
--- a/docs/tools_fake_backend.md
+++ b/docs/tools_fake_backend.md
@@ -8,7 +8,7 @@
## 📋 Descrizione
-Il `fake-backend` è un server Node.js/Express che simula le risposte dell'API di LogWhisperer AI. È progettato per:
+Il `fake-backend` è un server Node.js/Express che simula le risposte dell'API di LogWhispererAI. È progettato per:
- **Sviluppo UI**: Testare l'interfaccia utente con risposte realistiche
- **Demo offline**: Mostrare il prodotto senza connessione internet
diff --git a/frontend/Dockerfile.dev b/frontend/Dockerfile.dev
index e311e53..d5f046a 100644
--- a/frontend/Dockerfile.dev
+++ b/frontend/Dockerfile.dev
@@ -1,4 +1,4 @@
-# Dockerfile.dev - Development container for LogWhisperer AI Frontend
+# Dockerfile.dev - Development container for LogWhispererAI Frontend
# Optimized for Node.js with Hot Module Replacement (HMR)
FROM node:20-alpine
diff --git a/frontend/src/components/layout/Footer.tsx b/frontend/src/components/layout/Footer.tsx
index a4931e8..c4ecca7 100644
--- a/frontend/src/components/layout/Footer.tsx
+++ b/frontend/src/components/layout/Footer.tsx
@@ -53,7 +53,7 @@ export const Footer: React.FC = () => {
- Benvenuto su LogWhisperer AI
+ Benvenuto su LogWhispererAI
Il tuo assistente DevOps personale che monitora i log del server
diff --git a/frontend/src/components/sections/ProblemSolution.tsx b/frontend/src/components/sections/ProblemSolution.tsx
index c6b8d80..29b1a09 100644
--- a/frontend/src/components/sections/ProblemSolution.tsx
+++ b/frontend/src/components/sections/ProblemSolution.tsx
@@ -75,7 +75,7 @@ export const ProblemSolution: React.FC = () => {
🌌
-
LogWhisperer AI
+
LogWhispererAI
Ora
diff --git a/tools/fake-backend/Dockerfile b/tools/fake-backend/Dockerfile
index dd56154..97f4d13 100644
--- a/tools/fake-backend/Dockerfile
+++ b/tools/fake-backend/Dockerfile
@@ -1,5 +1,5 @@
# Dockerfile for Fake Backend
-# Development mock API server for LogWhisperer AI
+# Development mock API server for LogWhispererAI
FROM node:20-alpine
diff --git a/tools/fake-backend/server.js b/tools/fake-backend/server.js
index 9532cb5..73ff49f 100644
--- a/tools/fake-backend/server.js
+++ b/tools/fake-backend/server.js
@@ -1,10 +1,10 @@
/**
- * Fake Backend Server for LogWhisperer AI
+ * Fake Backend Server for LogWhispererAI
*
* Simulates AI analysis responses for frontend development
* without requiring real backend or OpenRouter API calls.
*
- * @author LogWhisperer AI Team
+ * @author LogWhispererAI Team
* @version 1.0.0
*/
@@ -180,7 +180,7 @@ app.get('/health', (req, res) => {
*/
app.get('/', (req, res) => {
res.json({
- name: 'LogWhisperer AI - Fake Backend',
+ name: 'LogWhispererAI - Fake Backend',
version: '1.0.0',
description: 'Mock API server for frontend development',
endpoints: {
@@ -206,7 +206,7 @@ app.use((err, req, res, next) => {
app.listen(PORT, () => {
console.log(`
╔══════════════════════════════════════════════════════════════╗
-║ LogWhisperer AI - Fake Backend Server ║
+║ LogWhispererAI - Fake Backend Server ║
║ ║
║ 🚀 Server running on http://localhost:${PORT} ║
║ 📖 Documentation: docs/tools_fake_backend.md ║
diff --git a/workflows/README.md b/workflows/README.md
index 9301c3e..f75431d 100644
--- a/workflows/README.md
+++ b/workflows/README.md
@@ -1,4 +1,4 @@
-# LogWhisperer AI - Workflow n8n
+# LogWhispererAI - Workflow n8n
Workflow per l'ingestion sicura dei log con validazione HMAC-SHA256.
diff --git a/workflows/REPORT.md b/workflows/REPORT.md
index a4e9b46..6b1f76a 100644
--- a/workflows/REPORT.md
+++ b/workflows/REPORT.md
@@ -131,7 +131,7 @@ cd /home/google/Sources/LucaSacchiNet/LogWhispererAI
# Output atteso:
# ==========================================
-# LogWhisperer AI - Workflow Test Suite
+# LogWhispererAI - Workflow Test Suite
# Target: http://192.168.254.12:5678
# ==========================================
#
diff --git a/workflows/logwhisperer_ingest.json b/workflows/logwhisperer_ingest.json
index 433e1d9..bfef6a5 100644
--- a/workflows/logwhisperer_ingest.json
+++ b/workflows/logwhisperer_ingest.json
@@ -98,7 +98,7 @@
},
{
"parameters": {
- "jsCode": "// ============================================================================\n// n8n Code Node: OpenRouter Processor\n// ============================================================================\n// Input: JSON dal nodo precedente (log data)\n// Output: Oggetto con analisi AI o fallback\n// Provider: OpenRouter (accesso a 300+ modelli AI)\n\nconst OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY;\nconst OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';\nconst SITE_URL = process.env.OPENROUTER_SITE_URL || 'https://logwhisperer.ai';\nconst APP_NAME = process.env.OPENROUTER_APP_NAME || 'LogWhispererAI';\n\n// System Prompt completo con Metodo Sacchi\nconst SYSTEM_PROMPT = `Sei LogWhisperer AI, un assistente DevOps esperto specializzato nell'analisi di log di sistema.\n\n## MISSIONE\nAnalizza i log ricevuti e fornisci insight azionabili in italiano, semplice e chiaro.\n\n## PRINCIPI OBBLIGATORI (Metodo Sacchi)\n\n### 1. SAFETY FIRST - Sicurezza Prima di Tutto\nMAI suggerire comandi che possano:\n- Cancellare dati (rm, del, truncate senza backup)\n- Modificare configurazioni critiche senza verifica\n- Riavviare servizi in produzione senza warning\n- Eseguire operazioni irreversibili\n\nREGOLE DI SICUREZZA:\n- Preferisci SEMPRE comandi read-only (cat, grep, df, ps, etc.)\n- Se un comando potrebbe essere distruttivo, imposta \\\"sicuro\\\": false\n- Per operazioni rischiose, richiedi sempre conferma umana\n- Non assumere mai che l'utente sappia cosa sta facendo\n\n### 2. LITTLE OFTEN - Piccoli Passi Verificabili\n- Suggerisci UN solo comando alla volta\n- Ogni azione deve essere verificabile prima della prossima\n- Dividi problemi complessi in step incrementali\n- Preferisci diagnostica prima della mitigazione\n\n### 3. DOUBLE CHECK - Verifica le Ipotesi\n- Non assumere MAI il contesto senza verificarlo\n- Se mancano informazioni, chiedi chiarimenti (richiede_conferma: true)\n- Verifica sempre i presupposti prima di suggerire azioni\n- Se l'errore e' ambiguo, richiedi analisi manuale\n\n## FORMATO OUTPUT OBBLIGATORIO\n\nRispondi SEMPRE in formato JSON valido con questa struttura:\n\n{\n \\\"sintesi\\\": \\\"Descrizione breve e chiara del problema in italiano\\\",\n \\\"severita\\\": \\\"low|medium|critical\\\",\n \\\"comando\\\": \\\"Comando bash esatto per diagnostica/mitigazione (o null)\\\",\n \\\"sicuro\\\": true|false,\n \\\"note\\\": \\\"Istruzioni aggiuntive, link documentazione, o 'Nessuna nota aggiuntiva'\\\",\n \\\"richiede_conferma\\\": true|false\n}\n\n## REGOLE JSON\n\n1. \\\"sintesi\\\": Massimo 150 caratteri, linguaggio semplice\n2. \\\"severita\\\": \n - \\\"critical\\\": Servizio down, rischio data loss, security breach\n - \\\"medium\\\": Degradazione performance, warning spazio disco\n - \\\"low\\\": Messaggi informativi, warning minori\n3. \\\"comando\\\": \n - Deve essere copiabile e incollabile in terminale\n - Se incerto o rischioso, usa null\n - Preferisci diagnostica (ls, grep, df) a modifica (rm, kill)\n4. \\\"sicuro\\\": \n - true solo se comando e' read-only o sicuro al 100%\n - false se potenzialmente distruttivo\n5. \\\"note\\\": \n - Spiega il perche' del comando\n - Aggiungi link a documentazione rilevante\n - Suggerisci verifiche aggiuntive\n6. \\\"richiede_conferma\\\": \n - true se serve conferma umana prima di eseguire\n - true se il problema e' ambiguo o poco chiaro\n\n## ESEMPI\n\nLog: \\\"OutOfMemoryError: Java heap space\\\"\n{\n \\\"sintesi\\\": \\\"Applicazione Java ha esaurito la memoria heap\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"ps aux | grep java | head -5 && free -h\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica processi Java attivi e memoria disponibile. Se necessario, aumentare heap size in JVM options.\\\",\n \\\"richiede_conferma\\\": false\n}\n\nLog: \\\"Connection refused to database on port 5432\\\"\n{\n \\\"sintesi\\\": \\\"Impossibile connettersi al database PostgreSQL\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"sudo systemctl status postgresql && netstat -tlnp | grep 5432\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica stato del servizio PostgreSQL. Se stopped: 'sudo systemctl start postgresql'\\\",\n \\\"richiede_conferma\\\": true\n}\n\nLog: \\\"Disk space warning: /var at 85%\\\"\n{\n \\\"sintesi\\\": \\\"Spazio su disco in esaurimento (85% utilizzato)\\\",\n \\\"severita\\\": \\\"medium\\\",\n \\\"comando\\\": \\\"df -h /var && du -sh /var/log/* | sort -hr | head -10\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Identifica file di log piu' grandi. Per pulizia sicura: usa find per eliminare log vecchi.\\\",\n \\\"richiede_conferma\\\": false\n}\n\n## COMANDI PROIBITI (NON MAI SUGGERIRE)\n- rm -rf / o varianti\n- dd if=/dev/zero (sovrascrittura dischi)\n- mkfs, fdisk (formattazione)\n- kill -9 senza verifica processo\n- chmod 777 ricorsivo\n- Qualsiasi comando con pipe a sh/bash senza verifica\n\n## COMANDI PREFERITI (READ-ONLY)\n- Diagnostica: ps, top, htop, df, du, free, iostat, netstat, ss\n- Log: tail, head, grep, cat, less, journalctl\n- Rete: ping, curl, netstat, ss, lsof\n- Systemd: systemctl status, journalctl -u\n\nRICORDA: L'utente potrebbe essere non-tecnico. Spiega in italiano semplice.`;\n\n// Input dal nodo precedente\nconst inputData = $input.first().json;\n\n// Trunca raw_log se troppo lungo\nconst maxLogLength = 2000;\nconst truncatedLog = inputData.raw_log \n ? inputData.raw_log.substring(0, maxLogLength)\n : 'Nessun log fornito';\n\n// Prepara payload per OpenRouter\nconst payload = {\n model: \\\"openai/gpt-4o-mini\\\",\n messages: [\n {\n role: \\\"system\\\",\n content: SYSTEM_PROMPT\n },\n {\n role: \\\"user\\\",\n content: JSON.stringify({\n timestamp: inputData.timestamp,\n severity: inputData.severity,\n source: inputData.source,\n hostname: inputData.hostname,\n client_id: inputData.client_id,\n raw_log: truncatedLog\n })\n }\n ],\n temperature: 0.3,\n max_tokens: 500,\n response_format: { type: \\\"json_object\\\" },\n store: false\n};\n\n// Timeout configurazione\nconst TIMEOUT_MS = 10000;\n\nasync function callOpenRouter() {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);\n \n const response = await fetch(OPENROUTER_API_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + OPENROUTER_API_KEY,\n 'HTTP-Referer': SITE_URL,\n 'X-Title': APP_NAME\n },\n body: JSON.stringify(payload),\n signal: controller.signal\n });\n \n clearTimeout(timeoutId);\n \n if (!response.ok) {\n throw new Error('OpenRouter API error: ' + response.status + ' ' + response.statusText);\n }\n \n const data = await response.json();\n const aiResponse = JSON.parse(data.choices[0].message.content);\n \n // Aggiungi info modello usato (per tracking)\n const modelUsed = data.model || 'unknown';\n \n // Merge con dati originali\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: aiResponse,\n ai_status: 'success',\n ai_timestamp: new Date().toISOString(),\n ai_model: modelUsed\n }\n }];\n \n } catch (error) {\n console.error('OpenRouter Error:', error.message);\n \n // Fallback response\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: {\n sintesi: \\\"Errore durante analisi AI\\\",\n severita: inputData.severity || \\\"medium\\\",\n comando: null,\n sicuro: true,\n note: 'Fallback: ' + error.message + '. Controlla manualmente il log.',\n richiede_conferma: true\n },\n ai_status: 'fallback',\n ai_error: error.message,\n ai_timestamp: new Date().toISOString()\n }\n }];\n }\n}\n\n// Esegui chiamata\nreturn await callOpenRouter();"
+ "jsCode": "// ============================================================================\n// n8n Code Node: OpenRouter Processor\n// ============================================================================\n// Input: JSON dal nodo precedente (log data)\n// Output: Oggetto con analisi AI o fallback\n// Provider: OpenRouter (accesso a 300+ modelli AI)\n\nconst OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY;\nconst OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';\nconst SITE_URL = process.env.OPENROUTER_SITE_URL || 'https://logwhisperer.ai';\nconst APP_NAME = process.env.OPENROUTER_APP_NAME || 'LogWhispererAI';\n\n// System Prompt completo con Metodo Sacchi\nconst SYSTEM_PROMPT = `Sei LogWhispererAI, un assistente DevOps esperto specializzato nell'analisi di log di sistema.\n\n## MISSIONE\nAnalizza i log ricevuti e fornisci insight azionabili in italiano, semplice e chiaro.\n\n## PRINCIPI OBBLIGATORI (Metodo Sacchi)\n\n### 1. SAFETY FIRST - Sicurezza Prima di Tutto\nMAI suggerire comandi che possano:\n- Cancellare dati (rm, del, truncate senza backup)\n- Modificare configurazioni critiche senza verifica\n- Riavviare servizi in produzione senza warning\n- Eseguire operazioni irreversibili\n\nREGOLE DI SICUREZZA:\n- Preferisci SEMPRE comandi read-only (cat, grep, df, ps, etc.)\n- Se un comando potrebbe essere distruttivo, imposta \\\"sicuro\\\": false\n- Per operazioni rischiose, richiedi sempre conferma umana\n- Non assumere mai che l'utente sappia cosa sta facendo\n\n### 2. LITTLE OFTEN - Piccoli Passi Verificabili\n- Suggerisci UN solo comando alla volta\n- Ogni azione deve essere verificabile prima della prossima\n- Dividi problemi complessi in step incrementali\n- Preferisci diagnostica prima della mitigazione\n\n### 3. DOUBLE CHECK - Verifica le Ipotesi\n- Non assumere MAI il contesto senza verificarlo\n- Se mancano informazioni, chiedi chiarimenti (richiede_conferma: true)\n- Verifica sempre i presupposti prima di suggerire azioni\n- Se l'errore e' ambiguo, richiedi analisi manuale\n\n## FORMATO OUTPUT OBBLIGATORIO\n\nRispondi SEMPRE in formato JSON valido con questa struttura:\n\n{\n \\\"sintesi\\\": \\\"Descrizione breve e chiara del problema in italiano\\\",\n \\\"severita\\\": \\\"low|medium|critical\\\",\n \\\"comando\\\": \\\"Comando bash esatto per diagnostica/mitigazione (o null)\\\",\n \\\"sicuro\\\": true|false,\n \\\"note\\\": \\\"Istruzioni aggiuntive, link documentazione, o 'Nessuna nota aggiuntiva'\\\",\n \\\"richiede_conferma\\\": true|false\n}\n\n## REGOLE JSON\n\n1. \\\"sintesi\\\": Massimo 150 caratteri, linguaggio semplice\n2. \\\"severita\\\": \n - \\\"critical\\\": Servizio down, rischio data loss, security breach\n - \\\"medium\\\": Degradazione performance, warning spazio disco\n - \\\"low\\\": Messaggi informativi, warning minori\n3. \\\"comando\\\": \n - Deve essere copiabile e incollabile in terminale\n - Se incerto o rischioso, usa null\n - Preferisci diagnostica (ls, grep, df) a modifica (rm, kill)\n4. \\\"sicuro\\\": \n - true solo se comando e' read-only o sicuro al 100%\n - false se potenzialmente distruttivo\n5. \\\"note\\\": \n - Spiega il perche' del comando\n - Aggiungi link a documentazione rilevante\n - Suggerisci verifiche aggiuntive\n6. \\\"richiede_conferma\\\": \n - true se serve conferma umana prima di eseguire\n - true se il problema e' ambiguo o poco chiaro\n\n## ESEMPI\n\nLog: \\\"OutOfMemoryError: Java heap space\\\"\n{\n \\\"sintesi\\\": \\\"Applicazione Java ha esaurito la memoria heap\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"ps aux | grep java | head -5 && free -h\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica processi Java attivi e memoria disponibile. Se necessario, aumentare heap size in JVM options.\\\",\n \\\"richiede_conferma\\\": false\n}\n\nLog: \\\"Connection refused to database on port 5432\\\"\n{\n \\\"sintesi\\\": \\\"Impossibile connettersi al database PostgreSQL\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"sudo systemctl status postgresql && netstat -tlnp | grep 5432\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica stato del servizio PostgreSQL. Se stopped: 'sudo systemctl start postgresql'\\\",\n \\\"richiede_conferma\\\": true\n}\n\nLog: \\\"Disk space warning: /var at 85%\\\"\n{\n \\\"sintesi\\\": \\\"Spazio su disco in esaurimento (85% utilizzato)\\\",\n \\\"severita\\\": \\\"medium\\\",\n \\\"comando\\\": \\\"df -h /var && du -sh /var/log/* | sort -hr | head -10\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Identifica file di log piu' grandi. Per pulizia sicura: usa find per eliminare log vecchi.\\\",\n \\\"richiede_conferma\\\": false\n}\n\n## COMANDI PROIBITI (NON MAI SUGGERIRE)\n- rm -rf / o varianti\n- dd if=/dev/zero (sovrascrittura dischi)\n- mkfs, fdisk (formattazione)\n- kill -9 senza verifica processo\n- chmod 777 ricorsivo\n- Qualsiasi comando con pipe a sh/bash senza verifica\n\n## COMANDI PREFERITI (READ-ONLY)\n- Diagnostica: ps, top, htop, df, du, free, iostat, netstat, ss\n- Log: tail, head, grep, cat, less, journalctl\n- Rete: ping, curl, netstat, ss, lsof\n- Systemd: systemctl status, journalctl -u\n\nRICORDA: L'utente potrebbe essere non-tecnico. Spiega in italiano semplice.`;\n\n// Input dal nodo precedente\nconst inputData = $input.first().json;\n\n// Trunca raw_log se troppo lungo\nconst maxLogLength = 2000;\nconst truncatedLog = inputData.raw_log \n ? inputData.raw_log.substring(0, maxLogLength)\n : 'Nessun log fornito';\n\n// Prepara payload per OpenRouter\nconst payload = {\n model: \\\"openai/gpt-4o-mini\\\",\n messages: [\n {\n role: \\\"system\\\",\n content: SYSTEM_PROMPT\n },\n {\n role: \\\"user\\\",\n content: JSON.stringify({\n timestamp: inputData.timestamp,\n severity: inputData.severity,\n source: inputData.source,\n hostname: inputData.hostname,\n client_id: inputData.client_id,\n raw_log: truncatedLog\n })\n }\n ],\n temperature: 0.3,\n max_tokens: 500,\n response_format: { type: \\\"json_object\\\" },\n store: false\n};\n\n// Timeout configurazione\nconst TIMEOUT_MS = 10000;\n\nasync function callOpenRouter() {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);\n \n const response = await fetch(OPENROUTER_API_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + OPENROUTER_API_KEY,\n 'HTTP-Referer': SITE_URL,\n 'X-Title': APP_NAME\n },\n body: JSON.stringify(payload),\n signal: controller.signal\n });\n \n clearTimeout(timeoutId);\n \n if (!response.ok) {\n throw new Error('OpenRouter API error: ' + response.status + ' ' + response.statusText);\n }\n \n const data = await response.json();\n const aiResponse = JSON.parse(data.choices[0].message.content);\n \n // Aggiungi info modello usato (per tracking)\n const modelUsed = data.model || 'unknown';\n \n // Merge con dati originali\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: aiResponse,\n ai_status: 'success',\n ai_timestamp: new Date().toISOString(),\n ai_model: modelUsed\n }\n }];\n \n } catch (error) {\n console.error('OpenRouter Error:', error.message);\n \n // Fallback response\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: {\n sintesi: \\\"Errore durante analisi AI\\\",\n severita: inputData.severity || \\\"medium\\\",\n comando: null,\n sicuro: true,\n note: 'Fallback: ' + error.message + '. Controlla manualmente il log.',\n richiede_conferma: true\n },\n ai_status: 'fallback',\n ai_error: error.message,\n ai_timestamp: new Date().toISOString()\n }\n }];\n }\n}\n\n// Esegui chiamata\nreturn await callOpenRouter();"
},
"id": "openrouter-node",
"name": "Call OpenRouter",
diff --git a/workflows/test_workflow.sh b/workflows/test_workflow.sh
index bb62ce0..ec235b9 100755
--- a/workflows/test_workflow.sh
+++ b/workflows/test_workflow.sh
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# LogWhisperer AI - Workflow Test Script
+# LogWhispererAI - Workflow Test Script
# Verifica che il workflow n8n risponda correttamente
#
@@ -205,7 +205,7 @@ EOF
# Main
main() {
echo "=========================================="
- echo "LogWhisperer AI - Workflow Test Suite"
+ echo "LogWhispererAI - Workflow Test Suite"
echo "Target: ${N8N_URL}"
echo "=========================================="
echo ""