diff --git a/diagnostic/index.html b/diagnostic/index.html
index d6a0268..a40ba44 100644
--- a/diagnostic/index.html
+++ b/diagnostic/index.html
@@ -582,10 +582,12 @@
const s = document.getElementById('perms-status');
s.style.display = 'block';
if (msg.ok) {
- s.style.color = '#34C759';
- s.innerHTML = (msg.info || 'Berechtigungen gespeichert!')
+ // Nachricht merken und nach Reload wieder anzeigen
+ permsSavedMsg = (msg.info || 'Berechtigungen gespeichert!')
+ '
Aenderungen werden erst bei einer neuen Session wirksam.'
+ ' ';
+ s.style.color = '#34C759';
+ s.innerHTML = permsSavedMsg;
loadPermissions();
} else {
s.style.color = '#FF6B6B';
@@ -1207,6 +1209,7 @@
let permState = {}; // { toolId: true/false }
let permsDirty = false;
+ let permsSavedMsg = ''; // Gespeicherte Erfolgsmeldung (ueberlebt renderPermissions)
function loadPermissions() {
const grid = document.getElementById('perms-grid');
@@ -1249,6 +1252,14 @@
status.style.color = '#FFD60A';
status.textContent = (data.info || '') + ' — Kein Tool-Filter gesetzt: alle Tools sind erlaubt. Speichern um explizit zu setzen.';
}
+ // Debug-Info anzeigen (Settings-Pfade)
+ if (data.debug) {
+ const dbg = document.createElement('div');
+ dbg.style.cssText = 'font-size:9px;color:#555570;margin-top:6px;font-family:monospace;white-space:pre-line;';
+ dbg.textContent = (data.debug.allPaths || '?') + '\nKeys: ' + (data.debug.rawKeys || 'keine');
+ if (hasExplicitList) dbg.textContent += '\nallowedTools: [' + data.allowedTools.join(', ') + ']';
+ status.appendChild(dbg);
+ }
// Gruppieren nach Kategorie
const cats = {};
@@ -1271,6 +1282,14 @@
grid.innerHTML = html;
permsDirty = false;
document.getElementById('btn-save-perms').disabled = true;
+
+ // Gespeicherte Erfolgsmeldung nach Reload wieder anzeigen
+ if (permsSavedMsg) {
+ status.style.display = 'block';
+ status.style.color = '#34C759';
+ status.innerHTML = permsSavedMsg;
+ permsSavedMsg = ''; // Nur einmal anzeigen
+ }
}
function togglePerm(toolId, enabled) {
diff --git a/diagnostic/server.js b/diagnostic/server.js
index fd585c9..e447a36 100644
--- a/diagnostic/server.js
+++ b/diagnostic/server.js
@@ -1423,13 +1423,28 @@ async function handleListPermissions(clientWs) {
try {
log("info", "server", "Lade Tool-Berechtigungen...");
+ // Alle moeglichen Settings-Dateien pruefen (Debug-Info)
+ let allPaths = "";
+ try {
+ allPaths = await dockerExec("aria-core", `
+ for f in ${OPENCLAW_SETTINGS_PATHS.join(" ")}; do
+ if [ -f "$f" ]; then
+ echo "EXISTS: $f ($(wc -c < "$f") bytes)"
+ else
+ echo "MISSING: $f"
+ fi
+ done
+ `.trim());
+ } catch {}
+
const settingsPath = await findSettingsFile();
let settings = {};
+ let rawContent = "";
let info = "";
try {
- const raw = await dockerExec("aria-core", `cat '${settingsPath}' 2>/dev/null || echo '{}'`);
- settings = JSON.parse(raw.trim() || "{}");
+ rawContent = await dockerExec("aria-core", `cat '${settingsPath}' 2>/dev/null || echo '{}'`);
+ settings = JSON.parse(rawContent.trim() || "{}");
info = `Geladen aus: ${settingsPath}`;
} catch (e) {
info = `Settings-Datei nicht lesbar (${settingsPath}) — Default-Berechtigungen`;
@@ -1446,8 +1461,10 @@ async function handleListPermissions(clientWs) {
permissions,
settingsPath,
info,
+ debug: { allPaths: allPaths.trim(), rawKeys: Object.keys(settings).join(", ") },
}));
- log("info", "server", `Berechtigungen geladen (${allowedTools.length} Tools explizit erlaubt)`);
+ log("info", "server", `Berechtigungen geladen (${allowedTools.length} Tools explizit erlaubt) aus ${settingsPath}`);
+ if (allPaths) log("info", "server", `Settings-Dateien:\n${allPaths}`);
} catch (err) {
log("error", "server", `Berechtigungen laden fehlgeschlagen: ${err.message}`);
clientWs.send(JSON.stringify({ type: "permissions_list", error: err.message, allowedTools: [], permissions: {} }));
@@ -1460,21 +1477,23 @@ async function handleSavePermissions(clientWs, allowedTools) {
return;
}
try {
- const settingsPath = await findSettingsFile();
- log("info", "server", `Speichere ${allowedTools.length} Tool-Berechtigungen in ${settingsPath}`);
+ log("info", "server", `Speichere ${allowedTools.length} Tool-Berechtigungen in alle Settings-Pfade`);
// Bestehende Settings lesen und mergen
+ // Schreiben in ALLE moeglichen Pfade damit OpenClaw es sicher findet
const script = [
- 'const fs=require("fs");',
- `const f="${settingsPath}";`,
+ 'const fs=require("fs");const path=require("path");',
+ `const paths=${JSON.stringify(OPENCLAW_SETTINGS_PATHS)};`,
`const tools=${JSON.stringify(allowedTools)};`,
- 'let s={};try{s=JSON.parse(fs.readFileSync(f,"utf8"));}catch(e){}',
- 's.allowedTools=tools;',
- `const dir=f.substring(0,f.lastIndexOf("/"));`,
- 'try{fs.mkdirSync(dir,{recursive:true});}catch(e){}',
- 'fs.writeFileSync(f,JSON.stringify(s,null,2));',
- // Verify: zuruecklesen und pruefen
- 'const v=JSON.parse(fs.readFileSync(f,"utf8"));',
+ 'for(const f of paths){',
+ 'let s={};try{s=JSON.parse(fs.readFileSync(f,"utf8"));}catch(e){}',
+ 's.allowedTools=tools;',
+ 'const dir=path.dirname(f);',
+ 'try{fs.mkdirSync(dir,{recursive:true});}catch(e){}',
+ 'fs.writeFileSync(f,JSON.stringify(s,null,2));',
+ '}',
+ // Verify: ersten Pfad zuruecklesen
+ `const v=JSON.parse(fs.readFileSync(paths[0],"utf8"));`,
'process.stdout.write(JSON.stringify(v.allowedTools||[]));',
].join("");
const b64 = Buffer.from(script).toString("base64");
@@ -1501,7 +1520,7 @@ async function handleSavePermissions(clientWs, allowedTools) {
clientWs.send(JSON.stringify({
type: "permissions_saved", ok: true,
- info: `${allowedTools.length} Tools gespeichert und verifiziert in ${settingsPath}`,
+ info: `${allowedTools.length} Tools gespeichert und verifiziert (alle ${OPENCLAW_SETTINGS_PATHS.length} Pfade)`,
needsRestart: true,
}));
log("info", "server", `Berechtigungen gespeichert und verifiziert (${allowedTools.length} Tools)`);