Standard-Opus auf claude-opus-4-7 festlegen (statt CLI-Default)
Dieser Commit ist enthalten in:
19
CLAUDE.md
19
CLAUDE.md
@@ -7,7 +7,7 @@
|
|||||||
```yaml
|
```yaml
|
||||||
projekt: AegisSight-Monitor
|
projekt: AegisSight-Monitor
|
||||||
url: https://monitor.aegis-sight.de
|
url: https://monitor.aegis-sight.de
|
||||||
server: ssh monitor (178.104.43.177, User: claude-dev)
|
server: ssh monitor (46.225.141.13, User: claude-dev)
|
||||||
pfad: /home/claude-dev/AegisSight-Monitor
|
pfad: /home/claude-dev/AegisSight-Monitor
|
||||||
quellcode: /home/claude-dev/AegisSight-Monitor/src/
|
quellcode: /home/claude-dev/AegisSight-Monitor/src/
|
||||||
datenbank: /mnt/gitea/osint-data/osint.db (SQLite WAL, geteilt mit Verwaltungsportal + Globe)
|
datenbank: /mnt/gitea/osint-data/osint.db (SQLite WAL, geteilt mit Verwaltungsportal + Globe)
|
||||||
@@ -203,3 +203,20 @@ regeln:
|
|||||||
- "Frontend-Aenderungen (HTML/JS/CSS) brauchen keinen Neustart"
|
- "Frontend-Aenderungen (HTML/JS/CSS) brauchen keinen Neustart"
|
||||||
- "Backup-Dateien (.bak) nicht committen, vor Push loeschen"
|
- "Backup-Dateien (.bak) nicht committen, vor Push loeschen"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Changelog-Workflow
|
||||||
|
|
||||||
|
Bei JEDER Aenderung am Monitor muessen zwei Dinge passieren:
|
||||||
|
|
||||||
|
1. **TaskMate Wissensdatenbank** (Kategorie: "Changelog Monitor", category_id=31):
|
||||||
|
|
||||||
|
|
||||||
|
2. **Git Commit + Push zu Gitea**
|
||||||
|
|
||||||
|
Changelog-Kategorien in TaskMate:
|
||||||
|
- 31 = Changelog Monitor
|
||||||
|
- 32 = Changelog Globe
|
||||||
|
- 33 = Changelog Netzwerkanalyse
|
||||||
|
- 34 = Changelog Verwaltung
|
||||||
|
- 35 = Changelog Website
|
||||||
|
- 36 = Changelog TaskMate
|
||||||
|
|||||||
2
data
2
data
@@ -1 +1 @@
|
|||||||
/mnt/gitea/osint-data
|
/home/claude-dev/osint-data
|
||||||
@@ -67,7 +67,7 @@ Erstelle ein strukturiertes Briefing auf {output_language} mit folgenden Abschni
|
|||||||
Verwende durchgehend Inline-Quellenverweise [1], [2], [3] etc. im Text.
|
Verwende durchgehend Inline-Quellenverweise [1], [2], [3] etc. im Text.
|
||||||
|
|
||||||
## ZUSAMMENFASSUNG
|
## ZUSAMMENFASSUNG
|
||||||
Kompakte Übersicht als Aufzählung (4-8 Bullet Points mit "- "). Jeder Punkt fasst einen Kernaspekt des Themas in 1-2 Sätzen zusammen. Der Leser soll nach dieser Sektion das Wesentliche erfasst haben, ohne den Rest lesen zu müssen.
|
Kompakte Übersicht als Aufzählung (4-8 Bullet Points mit "- "). Jeder Punkt fasst einen Kernaspekt des Themas in 1-2 Sätzen zusammen. Der Leser soll nach dieser Sektion das Wesentliche erfasst haben, ohne den Rest lesen zu müssen. WICHTIG: Die ZUSAMMENFASSUNG besteht AUSSCHLIESSLICH aus Bullet Points. KEIN Fliesstext vor, zwischen oder nach den Bullet Points. Detaillierte Ausführungen gehören in die anderen Sektionen (HINTERGRUND, AKTUELLE LAGE etc.).
|
||||||
|
|
||||||
## HINTERGRUND
|
## HINTERGRUND
|
||||||
Historischer Kontext, relevante Vorgeschichte
|
Historischer Kontext, relevante Vorgeschichte
|
||||||
@@ -178,6 +178,7 @@ WICHTIG zur Sektion ZUSAMMENFASSUNG:
|
|||||||
- Falls das bisherige Briefing eine Sektion "## ÜBERBLICK" hat, benenne sie in "## ZUSAMMENFASSUNG" um
|
- Falls das bisherige Briefing eine Sektion "## ÜBERBLICK" hat, benenne sie in "## ZUSAMMENFASSUNG" um
|
||||||
- Die ZUSAMMENFASSUNG muss als Aufzählung formatiert sein (4-8 Bullet Points mit "- "). Jeder Punkt fasst einen Kernaspekt in 1-2 Sätzen zusammen
|
- Die ZUSAMMENFASSUNG muss als Aufzählung formatiert sein (4-8 Bullet Points mit "- "). Jeder Punkt fasst einen Kernaspekt in 1-2 Sätzen zusammen
|
||||||
- Falls der bisherige ÜBERBLICK Fliesstext ist, wandle ihn in Bullet Points um
|
- Falls der bisherige ÜBERBLICK Fliesstext ist, wandle ihn in Bullet Points um
|
||||||
|
- KEIN Fliesstext vor, zwischen oder nach den Bullet Points. Die ZUSAMMENFASSUNG besteht AUSSCHLIESSLICH aus Bullet Points. Detaillierte Ausführungen gehören in die anderen Sektionen
|
||||||
## AKTEURE
|
## AKTEURE
|
||||||
## AKTUELLE LAGE
|
## AKTUELLE LAGE
|
||||||
## EINSCHÄTZUNG
|
## EINSCHÄTZUNG
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import contextvars
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from config import CLAUDE_PATH, CLAUDE_TIMEOUT, CLAUDE_MODEL_FAST
|
from config import CLAUDE_PATH, CLAUDE_TIMEOUT, CLAUDE_MODEL_FAST, CLAUDE_MODEL_STANDARD
|
||||||
|
|
||||||
# ContextVar fuer Cancel-Event: Wird vom Orchestrator gesetzt,
|
# ContextVar fuer Cancel-Event: Wird vom Orchestrator gesetzt,
|
||||||
# call_claude prueft automatisch darauf -- kein Durchreichen noetig.
|
# call_claude prueft automatisch darauf -- kein Durchreichen noetig.
|
||||||
@@ -56,11 +56,10 @@ async def call_claude(prompt: str, tools: str | None = "WebSearch,WebFetch", mod
|
|||||||
Args:
|
Args:
|
||||||
prompt: Der Prompt fuer Claude
|
prompt: Der Prompt fuer Claude
|
||||||
tools: Kommagetrennte erlaubte Tools (None = keine Tools, --max-turns 1)
|
tools: Kommagetrennte erlaubte Tools (None = keine Tools, --max-turns 1)
|
||||||
model: Optionales Modell (z.B. CLAUDE_MODEL_FAST fuer Haiku). None = CLI-Default (Opus).
|
model: Optionales Modell (z.B. CLAUDE_MODEL_FAST fuer Haiku). None = CLAUDE_MODEL_STANDARD (Opus 4.7).
|
||||||
"""
|
"""
|
||||||
cmd = [CLAUDE_PATH, "-p", "-", "--output-format", "json"]
|
effective_model = model or CLAUDE_MODEL_STANDARD
|
||||||
if model:
|
cmd = [CLAUDE_PATH, "-p", "-", "--output-format", "json", "--model", effective_model]
|
||||||
cmd.extend(["--model", model])
|
|
||||||
if tools:
|
if tools:
|
||||||
cmd.extend(["--allowedTools", tools])
|
cmd.extend(["--allowedTools", tools])
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ CLAUDE_TIMEOUT = 1800 # Sekunden (30 Min - Lage-Updates mit vielen Artikeln bra
|
|||||||
# Claude Modelle
|
# Claude Modelle
|
||||||
CLAUDE_MODEL_FAST = "claude-haiku-4-5-20251001" # Für einfache Aufgaben (Feed-Selektion)
|
CLAUDE_MODEL_FAST = "claude-haiku-4-5-20251001" # Für einfache Aufgaben (Feed-Selektion)
|
||||||
CLAUDE_MODEL_MEDIUM = "claude-sonnet-4-6" # Für qualitätskritische Aufgaben (Netzwerkanalyse)
|
CLAUDE_MODEL_MEDIUM = "claude-sonnet-4-6" # Für qualitätskritische Aufgaben (Netzwerkanalyse)
|
||||||
|
CLAUDE_MODEL_STANDARD = "claude-opus-4-7" # Standard-Opus für Recherche, Analyse, Faktencheck
|
||||||
|
|
||||||
# Ausgabesprache (Lagebilder, Faktenchecks, Zusammenfassungen)
|
# Ausgabesprache (Lagebilder, Faktenchecks, Zusammenfassungen)
|
||||||
OUTPUT_LANGUAGE = "Deutsch"
|
OUTPUT_LANGUAGE = "Deutsch"
|
||||||
|
|||||||
@@ -606,6 +606,9 @@ const App = {
|
|||||||
}
|
}
|
||||||
} catch (e) { /* Kein kritischer Fehler */ }
|
} catch (e) { /* Kein kritischer Fehler */ }
|
||||||
|
|
||||||
|
// Heartbeat: periodischer Status-Abgleich als Sicherheitsnetz
|
||||||
|
this._statusSyncInterval = setInterval(() => this.syncRefreshStatus(), 60000);
|
||||||
|
|
||||||
// Zuletzt ausgewählte Lage wiederherstellen
|
// Zuletzt ausgewählte Lage wiederherstellen
|
||||||
const savedId = localStorage.getItem('selectedIncidentId');
|
const savedId = localStorage.getItem('selectedIncidentId');
|
||||||
if (savedId) {
|
if (savedId) {
|
||||||
@@ -2241,6 +2244,44 @@ async handleRefresh() {
|
|||||||
UI.showToast('Recherche abgebrochen.', 'info');
|
UI.showToast('Recherche abgebrochen.', 'info');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gleicht den lokalen Refresh-Status mit dem Server ab.
|
||||||
|
* Bereinigt verwaiste Status-Anzeigen, die durch verpasste WebSocket-Nachrichten entstehen.
|
||||||
|
*/
|
||||||
|
async syncRefreshStatus() {
|
||||||
|
if (this._refreshingIncidents.size === 0) return;
|
||||||
|
try {
|
||||||
|
const data = await API.getRefreshingIncidents();
|
||||||
|
const serverRefreshing = new Set(data.refreshing || []);
|
||||||
|
const serverQueued = new Set(data.queued || []);
|
||||||
|
const serverAll = new Set([...serverRefreshing, ...serverQueued]);
|
||||||
|
|
||||||
|
// Finde lokal als refreshing/queued markierte IDs, die serverseitig nicht mehr laufen
|
||||||
|
const stale = [];
|
||||||
|
this._refreshingIncidents.forEach(id => {
|
||||||
|
if (!serverAll.has(id)) stale.push(id);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (stale.length > 0) {
|
||||||
|
console.log('Status-Sync: Bereinige verwaiste Refreshes:', stale);
|
||||||
|
stale.forEach(id => {
|
||||||
|
this._refreshingIncidents.delete(id);
|
||||||
|
this._updateSidebarDot(id);
|
||||||
|
UI._removeSidebarRefreshStatus(id);
|
||||||
|
delete UI._progressState[id];
|
||||||
|
if (id === this.currentIncidentId) {
|
||||||
|
this._updateRefreshButton(false);
|
||||||
|
UI.hideProgress(id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
UI._reindexQueuePositions();
|
||||||
|
this.renderSidebar();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// Netzwerkfehler ignorieren, naechster Zyklus probiert erneut
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
minimizeProgress() {
|
minimizeProgress() {
|
||||||
UI.minimizeProgress(this.currentIncidentId);
|
UI.minimizeProgress(this.currentIncidentId);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -716,7 +716,10 @@ const UI = {
|
|||||||
if (!text) return '<span style="color:var(--text-disabled);">Noch keine Zusammenfassung.</span>';
|
if (!text) return '<span style="color:var(--text-disabled);">Noch keine Zusammenfassung.</span>';
|
||||||
let sources = [];
|
let sources = [];
|
||||||
try { sources = JSON.parse(sourcesJson || '[]'); } catch(e) {}
|
try { sources = JSON.parse(sourcesJson || '[]'); } catch(e) {}
|
||||||
let html = this.escape(text);
|
// Nur Bullet-Point-Zeilen behalten, Fliesstext herausfiltern
|
||||||
|
const bulletLines = text.split("\n").filter(line => line.trim().startsWith("- "));
|
||||||
|
const bulletText = bulletLines.length > 0 ? bulletLines.join("\n") : text;
|
||||||
|
let html = this.escape(bulletText);
|
||||||
// Bullet points
|
// Bullet points
|
||||||
html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
|
html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
|
||||||
html = html.replace(/(<li>.*<\/li>\n?)+/gs, '<ul style="margin:4px 0 4px 18px;line-height:1.7;">$&</ul>');
|
html = html.replace(/(<li>.*<\/li>\n?)+/gs, '<ul style="margin:4px 0 4px 18px;line-height:1.7;">$&</ul>');
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ const WS = {
|
|||||||
console.log('WebSocket verbunden');
|
console.log('WebSocket verbunden');
|
||||||
this.reconnectDelay = 2000;
|
this.reconnectDelay = 2000;
|
||||||
this._startPing();
|
this._startPing();
|
||||||
|
// Nach Reconnect: Refresh-Status mit Server abgleichen
|
||||||
|
if (typeof App !== 'undefined' && App.syncRefreshStatus) {
|
||||||
|
App.syncRefreshStatus();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren