feat(diagnostic): warnt, wenn der Proxy mit veralteten Patches laeuft
Der Proxy kopiert proxy-patches/*.js beim START ueber den npm-Code. Wer nach einem git pull nur `restart` macht — oder neu startet, BEVOR der Pull durch ist — laeuft still mit der alten Fassung weiter. Nichts deutet darauf hin: der Container ist "Up", die Oberflaeche sieht normal aus, die Aenderung wirkt einfach nicht. Das hat heute zweimal Zeit gekostet: einmal wirkte ein Proxy-Fix nicht, einmal blieb die Modell-Liste alt, obwohl der Code laengst gepullt war (Proxy gestartet 08:51, Patches gepullt 09:28). Die Einstellungen vergleichen jetzt die Zeitstempel der Quelldateien mit den eingespielten und zeigen einen Hinweis samt fertigem Befehl — inklusive der Angabe, welche Datei wann geaendert und wann eingespielt wurde. Toleranz 5s, weil Quelle und Kopie beim Start kurz nacheinander entstehen. Ein Fehler beim Pruefen loest bewusst KEINEN Alarm aus, sonst stuende dort eine Warnung, die nichts ueber die Patches aussagt. Dazu: der Datenschutz-Block sagt jetzt ausdruecklich, dass KEIN Neustart noetig ist — die CLI liest ~/.claude/settings.json bei jedem Aufruf neu. Nur ein gerade laufender Turn nutzt noch die alte Einstellung. 4 Pruefungen gegen den echten Container, in beide Richtungen: schweigt nach frischem Start, erkennt eine veraltete Kopie samt Zeitstempeln, schweigt nach Wiederherstellung. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+46
-2
@@ -602,6 +602,24 @@
|
||||
selbst (Skills + skill_create Meta-Tool). Es gibt keine granulare
|
||||
Permission-Maske, Brain weiss zur Laufzeit welche Tools es hat. -->
|
||||
|
||||
<!-- Warnung: Proxy laeuft mit veralteten Patches.
|
||||
Der Proxy kopiert proxy-patches/ beim START in den npm-Code. Wer nach
|
||||
einem git pull nur neu startet statt force-recreate — oder vor dem
|
||||
Pull neu startet — laeuft weiter mit der alten Fassung, ohne dass es
|
||||
irgendwo auffaellt. Das hat schon zweimal Zeit gekostet: einmal wirkte
|
||||
ein Fix nicht, einmal blieb die Modell-Liste alt. -->
|
||||
<div id="proxy-patch-warning" style="display:none;margin-bottom:16px;padding:12px 14px;
|
||||
background:#2A1A08;border:1px solid #FF9F0A;border-radius:8px;">
|
||||
<div style="color:#FF9F0A;font-size:13px;font-weight:600;margin-bottom:6px;">
|
||||
⚠ Der Proxy läuft mit veralteten Patches
|
||||
</div>
|
||||
<div id="proxy-patch-detail" style="color:#C8A878;font-size:11px;line-height:1.6;"></div>
|
||||
<div style="margin-top:8px;">
|
||||
<code style="background:#12121E;padding:4px 8px;border-radius:4px;color:#E0E0F0;font-size:11px;display:inline-block;">
|
||||
docker compose up -d --force-recreate proxy</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Brain-Model-Einstellung -->
|
||||
<div class="settings-section">
|
||||
<h2>Sprachmodell (Brain)</h2>
|
||||
@@ -659,8 +677,13 @@
|
||||
<div class="card" style="max-width:620px;">
|
||||
<div style="font-size:11px;color:#8888AA;margin-bottom:12px;line-height:1.55;">
|
||||
Drei Kanäle, über die Claude Code <strong>zusätzlich</strong> zur eigentlichen
|
||||
Anfrage Daten verschickt. Gesetzt wird in <code>~/.claude/settings.json</code> —
|
||||
greift bei jeder neuen Anfrage, <strong>kein Neustart nötig</strong>.
|
||||
Anfrage Daten verschickt.
|
||||
<br><br>
|
||||
<span style="color:#3FFF9F;">✓ Kein Neustart nötig.</span>
|
||||
Gesetzt wird in <code>~/.claude/settings.json</code>, und die Claude-CLI liest
|
||||
die Datei bei <em>jedem</em> Aufruf neu. Speichern genügt — die nächste Anfrage
|
||||
nutzt die neue Einstellung. Nur ein <em>gerade laufender</em> Turn arbeitet noch
|
||||
mit der alten, weil sein Prozess schon gestartet ist.
|
||||
<br><br>
|
||||
Davon unabhängig ist, ob Anthropic mit deinen Unterhaltungen Modelle
|
||||
trainiert — das steht in deinem Konto unter
|
||||
@@ -2748,6 +2771,26 @@
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.type === 'proxy_patch_state') {
|
||||
const box = document.getElementById('proxy-patch-warning');
|
||||
const det = document.getElementById('proxy-patch-detail');
|
||||
if (box) {
|
||||
const stale = msg.stale || [];
|
||||
box.style.display = stale.length ? 'block' : 'none';
|
||||
if (stale.length && det) {
|
||||
const fmt = (ms) => new Date(ms).toLocaleString('de-DE',
|
||||
{ day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' });
|
||||
det.innerHTML =
|
||||
'Diese Dateien wurden nach dem letzten Proxy-Start geändert — der Proxy '
|
||||
+ 'arbeitet noch mit der alten Fassung:<br>'
|
||||
+ stale.map(s => '• <code>' + escapeHtml(s.file) + '</code> — geändert '
|
||||
+ fmt(s.srcAt) + ', eingespielt ' + fmt(s.activeAt)).join('<br>')
|
||||
+ '<br><br>Der Proxy kopiert die Patches nur beim <strong>Start</strong>. '
|
||||
+ 'Ein <code>--build</code> reicht nicht:';
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (msg.type === 'privacy_flags') { renderPrivacyFlags(msg); return; }
|
||||
if (msg.type === 'privacy_flags_saved') {
|
||||
const st = document.getElementById('privacy-flags-status');
|
||||
@@ -4754,6 +4797,7 @@
|
||||
refreshVoiceIdStatus();
|
||||
send({ action: 'get_attachment_limit' });
|
||||
send({ action: 'get_privacy_flags' });
|
||||
send({ action: 'check_proxy_patches' });
|
||||
} else if (tab === 'brain') {
|
||||
loadBrainStatus();
|
||||
loadBrainMemoryList();
|
||||
|
||||
@@ -3217,6 +3217,8 @@ wss.on("connection", (ws) => {
|
||||
handleSetModel(ws, msg.model);
|
||||
} else if (msg.action === "test_model") {
|
||||
handleTestModel(ws, msg.model);
|
||||
} else if (msg.action === "check_proxy_patches") {
|
||||
handleCheckProxyPatches(ws);
|
||||
} else if (msg.action === "get_privacy_flags") {
|
||||
handleGetPrivacyFlags(ws);
|
||||
} else if (msg.action === "set_privacy_flags") {
|
||||
@@ -3647,6 +3649,50 @@ function handleSetModel(clientWs, model) {
|
||||
return;
|
||||
}
|
||||
|
||||
// ── Laufen im Proxy die aktuellen Patches? ──────────────────────────
|
||||
//
|
||||
// Der Proxy kopiert proxy-patches/*.js beim START ueber den npm-Code (siehe
|
||||
// docker-compose.yml, command:). Wer nach einem git pull nur `restart` macht —
|
||||
// oder neu startet, BEVOR der Pull durch ist — laeuft still mit der alten
|
||||
// Fassung weiter. Das faellt sonst nirgends auf: der Container ist "Up", die
|
||||
// Oberflaeche sieht normal aus, nur wirkt die Aenderung nicht.
|
||||
//
|
||||
// Darum: Zeitstempel der Quelldateien gegen die eingespielten vergleichen.
|
||||
const PROXY_PATCH_MAP = [
|
||||
["routes.js", "server/routes.js"],
|
||||
["manager.js", "subprocess/manager.js"],
|
||||
["openai-to-cli.js", "adapter/openai-to-cli.js"],
|
||||
["cli-to-openai.js", "adapter/cli-to-openai.js"],
|
||||
];
|
||||
|
||||
async function handleCheckProxyPatches(clientWs) {
|
||||
try {
|
||||
const dist = "/usr/local/lib/node_modules/claude-max-api-proxy/dist";
|
||||
const pairs = PROXY_PATCH_MAP
|
||||
.map(([src, dst]) => `/proxy-patches/${src} ${dist}/${dst}`).join(" ");
|
||||
// %Y = mtime als Unix-Zeit, %n = Dateiname
|
||||
const out = await dockerExec("aria-proxy", `stat -c '%Y %n' ${pairs} 2>/dev/null || true`);
|
||||
const mtime = {};
|
||||
for (const line of String(out || "").split("\n")) {
|
||||
const m = line.trim().match(/^(\d+)\s+(.+)$/);
|
||||
if (m) mtime[m[2]] = parseInt(m[1], 10);
|
||||
}
|
||||
const stale = [];
|
||||
for (const [src, dst] of PROXY_PATCH_MAP) {
|
||||
const a = mtime[`/proxy-patches/${src}`];
|
||||
const b = mtime[`${dist}/${dst}`];
|
||||
if (a == null || b == null) continue;
|
||||
// Toleranz 5s: Quelle und Kopie entstehen beim Start kurz nacheinander.
|
||||
if (a > b + 5) stale.push({ file: src, srcAt: a * 1000, activeAt: b * 1000 });
|
||||
}
|
||||
clientWs.send(JSON.stringify({ type: "proxy_patch_state", stale }));
|
||||
} catch (err) {
|
||||
// Kein Alarm bei einem Pruef-Fehler — sonst steht da eine Warnung, die
|
||||
// gar nichts ueber die Patches aussagt.
|
||||
clientWs.send(JSON.stringify({ type: "proxy_patch_state", stale: [], error: String((err && err.message) || err) }));
|
||||
}
|
||||
}
|
||||
|
||||
// ── Einstellungen: Datenschutz-Schalter von Claude Code ─────────────
|
||||
//
|
||||
// Drei Kanaele, ueber die Claude Code von sich aus Daten an Anthropic bzw. an
|
||||
|
||||
Reference in New Issue
Block a user