feat(studio): Phase 3 - Fall-Chat (RAG) mit Guardrails, Timeline, Recherche-Angebot
Fall-Chat und Ereignis-Timeline, alles ueber Claude, strikt fallorientiert.
incidents.py:
- GET /{id}/events: Aktivitaets-Timeline (article_ingest/refresh/analysis/chat_qa/source_change)
- POST /{id}/ask: Fall-Chat/RAG mit Guardrails:
* tools=None (kein Netz/kein Werkzeug) = zentrale Anti-Exfil-Abwehr (GitLost)
* nur Materialien DIESES Falls (scope=alle entfaellt), [n]-Zitate, strikt aus Materialien
* Claude-Vorauswahl der relevanten Artikel statt lokalem Embedding (kein lokales Modell)
* _escape_prompt_content + Ausgabe-Leak-Filter + EchoLeak-Haertung (externe Bilder/Links/URLs raus)
* Verbotsliste: kein Backend/App/Modell/Anbieter, kein Fremd-Fall
* chat_qa in incident_events protokolliert
- Recherche-Angebot: liefert die Materialien die Frage nicht, haengt der Analyst einen
needs_research-Block an (focus + description_addition, NUR aus der Frage abgeleitet).
- POST /{id}/clarify (nur auf Nutzer-Bestaetigung): Beschreibung ergaenzen + fokussierte
Folge-Recherche AUSSCHLIESSLICH zur Frage (Researcher title=focus/description=frage),
url-dedupliziert in den Fall. Laeuft als Hintergrund-Job (stage_runners.start_job).
stage_runners.py: generischer start_job() fuer Hintergrund-Jobs (run-status-sichtbar).
api.js: clarify(). studio.js + studio.css: Angebot rendern, bestaetigen, run-status pollen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -1361,3 +1361,13 @@
|
||||
.studio-cols { grid-template-columns: 1fr; grid-auto-rows: minmax(0, 1fr); }
|
||||
.studio-col { max-height: 60vh; }
|
||||
}
|
||||
|
||||
/* Fall-Chat: Recherche-Angebot des Analysten (Phase 3) */
|
||||
.chat-offer{margin-top:10px;padding:12px 14px;border:1px solid var(--studio-border,#8aa0c022);border-radius:10px;background:var(--studio-panel-2,rgba(120,140,180,.08));font-size:13px;}
|
||||
.chat-offer-title{font-weight:600;margin-bottom:4px;}
|
||||
.chat-offer-text{opacity:.85;margin-bottom:8px;line-height:1.45;}
|
||||
.chat-offer-label{display:block;font-size:12px;opacity:.7;margin-bottom:4px;}
|
||||
.chat-offer-add{width:100%;box-sizing:border-box;resize:vertical;font:inherit;padding:6px 8px;border:1px solid var(--studio-border,#8aa0c033);border-radius:8px;background:rgba(127,127,127,.06);color:inherit;margin-bottom:6px;}
|
||||
.chat-offer-focus{font-size:12px;opacity:.7;margin-bottom:8px;}
|
||||
.chat-offer-btn{cursor:pointer;}
|
||||
.chat-offer-btn:disabled{opacity:.6;cursor:default;}
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren