[FEAT] Help online feedback, traduzioni IT/EN, AI system prompt aggiornato
- help.js: nuova sezione 'feedback' con 6 sotto-sezioni (come usare FAB, risposta AI, password gate, le mie segnalazioni, worker autonomo, consigli) - i18n.js: 30 chiavi IT/EN per tutto il sistema feedback - AIService::callAPI: system prompt esteso con lista completa moduli NIS2 Agile - AIService::classifyFeedback: system prompt NIS2-aware Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
3a382d34be
commit
c52766953d
@ -197,7 +197,27 @@ PROMPT;
|
||||
*/
|
||||
private function callAPI(string $prompt, ?string $systemPrompt = null): string
|
||||
{
|
||||
$system = $systemPrompt ?? 'Sei un esperto consulente di cybersecurity e compliance NIS2. Rispondi sempre in italiano in modo professionale e accurato.';
|
||||
$system = $systemPrompt ?? <<<SYSTEM
|
||||
Sei un esperto consulente di cybersecurity e compliance NIS2, integrato nella piattaforma SaaS "NIS2 Agile".
|
||||
|
||||
Moduli della piattaforma che conosci:
|
||||
- Gap Analysis (80 domande, 10 categorie Art.21)
|
||||
- Risk Management (registro rischi ISO 27005, matrice 5×5)
|
||||
- Incident Management (flussi Art.23: early warning 24h, notifica 72h, report 30d)
|
||||
- Policy Management (generazione e approvazione policy NIS2)
|
||||
- Supply Chain (valutazione fornitori, risk scoring)
|
||||
- Training (assegnazione corsi, compliance Art.20)
|
||||
- Asset Inventory (asset critici, dipendenze)
|
||||
- Audit & Report (controlli, evidenze, export CSV)
|
||||
- NCR/CAPA (non conformità, azioni correttive)
|
||||
- Whistleblowing (segnalazioni anomalie Art.32)
|
||||
- Normative Updates (feed NIS2/ACN/DORA con ACK)
|
||||
- Segnalazioni Feedback (bug reporting con risoluzione autonoma AI)
|
||||
- Services API (endpoint pubblici per integrazioni B2B)
|
||||
|
||||
Rispondi sempre in italiano, in modo professionale, preciso e conciso.
|
||||
Non includere dati identificativi dell'organizzazione nelle risposte.
|
||||
SYSTEM;
|
||||
|
||||
$body = [
|
||||
'model' => $this->model,
|
||||
@ -351,7 +371,7 @@ PROMPT;
|
||||
CURLOPT_POSTFIELDS => json_encode([
|
||||
'model' => $this->model,
|
||||
'max_tokens' => 500,
|
||||
'system' => 'Sei un assistente tecnico. Rispondi SEMPRE con JSON puro, senza markdown né testo aggiuntivo.',
|
||||
'system' => 'Sei l\'assistente tecnico di NIS2 Agile, piattaforma SaaS per compliance NIS2. Conosci tutti i moduli: gap analysis, rischi, incidenti, policy, supply chain, formazione, asset, audit, NCR/CAPA, whistleblowing, normative, feedback. Rispondi SEMPRE con JSON puro, senza markdown né testo aggiuntivo.',
|
||||
'messages' => [['role' => 'user', 'content' => $prompt]],
|
||||
]),
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
|
||||
@ -563,6 +563,73 @@ const HelpSystem = (function () {
|
||||
'D.Lgs. 138/2024 - Recepimento NIS2 in Italia',
|
||||
'ACN - Linee guida attuative per i soggetti NIS2'
|
||||
]
|
||||
},
|
||||
|
||||
// ─── Segnalazioni (Feedback) ─────────────────────────────────
|
||||
'feedback': {
|
||||
title: 'Guida - Segnalazioni & Feedback',
|
||||
intro: 'Il sistema di segnalazioni ti permette di comunicare direttamente con il team tecnico di NIS2 Agile. Puoi segnalare bug, proporre miglioramenti, fare domande o richiedere nuove funzionalita\'. L\'intelligenza artificiale analizza ogni segnalazione in tempo reale e tenta la risoluzione autonoma.',
|
||||
sections: [
|
||||
{
|
||||
heading: 'Come aprire una segnalazione',
|
||||
items: [
|
||||
'Clicca il <strong>pulsante rosso</strong> <i class="fas fa-comment-alt"></i> in basso a destra — visibile su tutte le pagine quando sei autenticato.',
|
||||
'Scegli il <strong>tipo</strong>: Bug/Errore, Miglioramento interfaccia, Nuova funzionalita\', Domanda o Altro.',
|
||||
'Indica la <strong>priorita\' percepita</strong>: Alta (blocca il lavoro), Media (workaround disponibile) o Bassa (miglioria).',
|
||||
'Descrivi il problema in modo dettagliato: cosa hai fatto, cosa ti aspettavi, cosa e\' successo invece.',
|
||||
'Puoi allegare uno <strong>screenshot</strong> trascinandolo nell\'area dedicata (max 1.5 MB).',
|
||||
'L\'URL della pagina viene catturato automaticamente — non devi copiarlo.'
|
||||
]
|
||||
},
|
||||
{
|
||||
heading: 'Risposta AI immediata',
|
||||
items: [
|
||||
'Dopo l\'invio, l\'<strong>AI analizza la segnalazione</strong> entro pochi secondi e mostra una risposta personalizzata.',
|
||||
'La risposta AI include suggerimenti su come procedere o conferma che il problema e\' stato registrato.',
|
||||
'L\'AI assegna automaticamente la categoria (es. rischi, incidenti, interfaccia) e la priorita\' tecnica.',
|
||||
'Se il suggerimento AI ha gia\' risolto il tuo problema, puoi confermarlo con <strong>"Si\', problema risolto"</strong>.'
|
||||
]
|
||||
},
|
||||
{
|
||||
heading: 'Conferma risoluzione (Password Gate)',
|
||||
items: [
|
||||
'Quando clicchi <strong>"Si\', problema risolto"</strong> viene richiesta una <strong>password di conferma</strong>.',
|
||||
'La password previene chiusure accidentali dei ticket — assicurandosi che la risoluzione sia intenzionale.',
|
||||
'Se la segnalazione non e\' risolta, scegli <strong>"No, il problema persiste"</strong>: il ticket rimane aperto e il team lo prende in carico.',
|
||||
'Puoi monitorare lo stato nella tab <strong>"Le mie segnalazioni"</strong>.'
|
||||
]
|
||||
},
|
||||
{
|
||||
heading: 'Le mie segnalazioni',
|
||||
items: [
|
||||
'La tab <strong>"Le mie segnalazioni"</strong> mostra le ultime 20 segnalazioni inviate per questa organizzazione.',
|
||||
'I badge colorati indicano lo stato: <span style="color:#64748b">Aperto</span>, <span style="color:#f59e0b">In lavorazione</span>, <span style="color:#22c55e">Risolto</span>, <span style="color:#3b82f6">Chiuso</span>.',
|
||||
'La risposta AI e\' sempre visibile sotto ogni segnalazione.'
|
||||
]
|
||||
},
|
||||
{
|
||||
heading: 'Risoluzione autonoma AI (Worker)',
|
||||
items: [
|
||||
'I ticket marcati <strong>"In lavorazione"</strong> vengono processati automaticamente ogni 30 minuti da un worker AI.',
|
||||
'Il worker utilizza <strong>Claude Code CLI</strong> per analizzare il codice e applicare correzioni in autonomia.',
|
||||
'Se la correzione ha successo, il ticket viene marcato come <strong>Risolto</strong> e tutti i membri dell\'organizzazione ricevono una notifica email.',
|
||||
'I ticket non risolvibili automaticamente rimangono in lavorazione per l\'intervento manuale del team.'
|
||||
]
|
||||
},
|
||||
{
|
||||
heading: 'Consigli per segnalazioni efficaci',
|
||||
items: [
|
||||
'<strong>Sii specifico</strong>: "Il bottone Salva nella pagina Rischi non risponde" e\' meglio di "qualcosa non funziona".',
|
||||
'<strong>Includi i passi</strong>: "1. Apro la pagina Rischi, 2. Clicco Nuovo Rischio, 3. Compilo il modulo, 4. Il salvataggio da\' errore 500".',
|
||||
'<strong>Allega screenshot</strong> quando possibile: accelera enormemente la diagnosi.',
|
||||
'Usa il tipo <strong>Domanda</strong> per richieste di chiarimento sull\'utilizzo della piattaforma.'
|
||||
]
|
||||
}
|
||||
],
|
||||
references: [
|
||||
'Sistema ispirato a alltax.it/docs/sistema-segnalazioni-standard.html',
|
||||
'Risoluzione autonoma tramite Anthropic Claude Code CLI'
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
@ -592,7 +659,8 @@ const HelpSystem = (function () {
|
||||
'settings.html': 'settings',
|
||||
'settings': 'settings',
|
||||
'workflow.html': 'workflow',
|
||||
'workflow': 'workflow'
|
||||
'workflow': 'workflow',
|
||||
'feedback': 'feedback'
|
||||
};
|
||||
|
||||
// ── Stili CSS (iniettati una sola volta) ─────────────────────────
|
||||
|
||||
@ -276,6 +276,43 @@ const I18n = (function () {
|
||||
Object.assign(_dict, entries);
|
||||
}
|
||||
|
||||
// ── Feedback & Segnalazioni ─────────────────────────────────
|
||||
addTranslations({
|
||||
'feedback.fab_title': { it: 'Segnala un problema o un miglioramento', en: 'Report an issue or improvement' },
|
||||
'feedback.tab_new': { it: 'Nuova segnalazione', en: 'New report' },
|
||||
'feedback.tab_mine': { it: 'Le mie segnalazioni', en: 'My reports' },
|
||||
'feedback.tipo_label': { it: 'Tipo', en: 'Type' },
|
||||
'feedback.tipo_bug': { it: 'Bug / Errore', en: 'Bug / Error' },
|
||||
'feedback.tipo_ux': { it: 'Miglioramento interfaccia', en: 'UX improvement' },
|
||||
'feedback.tipo_funzionalita':{ it: 'Nuova funzionalità', en: 'New feature' },
|
||||
'feedback.tipo_domanda': { it: 'Domanda / Supporto', en: 'Question / Support' },
|
||||
'feedback.tipo_altro': { it: 'Altro', en: 'Other' },
|
||||
'feedback.priorita_label': { it: 'Priorità percepita', en: 'Perceived priority' },
|
||||
'feedback.priorita_alta': { it: 'Alta', en: 'High' },
|
||||
'feedback.priorita_media': { it: 'Media', en: 'Medium' },
|
||||
'feedback.priorita_bassa': { it: 'Bassa', en: 'Low' },
|
||||
'feedback.desc_label': { it: 'Descrizione', en: 'Description' },
|
||||
'feedback.desc_hint': { it: 'Sii specifico: cosa hai fatto, cosa ti aspettavi, cosa è successo', en: 'Be specific: what you did, what you expected, what happened' },
|
||||
'feedback.attach_label': { it: 'Screenshot (opzionale)', en: 'Screenshot (optional)' },
|
||||
'feedback.submit_btn': { it: 'Invia segnalazione', en: 'Submit report' },
|
||||
'feedback.submitting': { it: 'Analisi AI in corso…', en: 'AI analysis in progress…' },
|
||||
'feedback.ai_badge': { it: 'Analisi AI completata', en: 'AI analysis complete' },
|
||||
'feedback.resolve_question': { it: 'Il problema è stato risolto grazie a questo suggerimento?', en: 'Was the problem resolved by this suggestion?' },
|
||||
'feedback.resolve_yes': { it: 'Sì, problema risolto', en: 'Yes, problem resolved' },
|
||||
'feedback.resolve_no': { it: 'No, il problema persiste', en: 'No, problem persists' },
|
||||
'feedback.resolve_password': { it: 'Conferma con password di verifica', en: 'Confirm with verification password' },
|
||||
'feedback.resolve_confirm': { it: 'Conferma', en: 'Confirm' },
|
||||
'feedback.resolved_ok': { it: 'Segnalazione marcata come risolta. Grazie per il feedback.', en: 'Report marked as resolved. Thank you for your feedback.' },
|
||||
'feedback.status_aperto': { it: 'Aperto', en: 'Open' },
|
||||
'feedback.status_lavorazione': { it: 'In lavorazione', en: 'In progress' },
|
||||
'feedback.status_risolto': { it: 'Risolto', en: 'Resolved' },
|
||||
'feedback.status_chiuso': { it: 'Chiuso', en: 'Closed' },
|
||||
'feedback.empty': { it: 'Nessuna segnalazione ancora. Usala per segnalare problemi!', en: 'No reports yet. Use it to report issues!' },
|
||||
'feedback.error_short': { it: 'Descrizione troppo breve (minimo 10 caratteri).', en: 'Description too short (minimum 10 characters).' },
|
||||
'feedback.error_password': { it: 'Password non corretta.', en: 'Incorrect password.' },
|
||||
'feedback.notif_open': { it: 'Segnalazione registrata. Il team la prenderà in carico.', en: 'Report registered. The team will handle it.' },
|
||||
});
|
||||
|
||||
return { init, getLang, setLang, t, applyTranslations, addTranslations };
|
||||
})();
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user