added setting and permissions
This commit is contained in:
@@ -987,6 +987,17 @@ wss.on("connection", (ws) => {
|
||||
handleListBrain(ws);
|
||||
} else if (msg.action === "read_brain_file") {
|
||||
handleReadBrainFile(ws, msg.filename);
|
||||
// ── Einstellungen ──
|
||||
} else if (msg.action === "list_permissions") {
|
||||
handleListPermissions(ws);
|
||||
} else if (msg.action === "save_permissions") {
|
||||
handleSavePermissions(ws, msg.allowedTools);
|
||||
} else if (msg.action === "get_model") {
|
||||
handleGetModel(ws);
|
||||
} else if (msg.action === "set_model") {
|
||||
handleSetModel(ws, msg.model);
|
||||
} else if (msg.action === "get_openclaw_config") {
|
||||
handleGetOpenClawConfig(ws);
|
||||
}
|
||||
} catch {}
|
||||
});
|
||||
@@ -1384,6 +1395,166 @@ async function handleReadBrainFile(clientWs, filename) {
|
||||
}
|
||||
}
|
||||
|
||||
// ── Einstellungen: Tool-Berechtigungen ──────────────────
|
||||
|
||||
const OPENCLAW_SETTINGS_PATHS = [
|
||||
"/home/node/.openclaw/settings.json",
|
||||
"/home/node/.openclaw/agents/main/agent/settings.json",
|
||||
"/home/node/.openclaw/config.json",
|
||||
];
|
||||
|
||||
async function findSettingsFile() {
|
||||
// Pruefen welche Settings-Dateien existieren
|
||||
try {
|
||||
const raw = await dockerExec("aria-core", `
|
||||
for f in ${OPENCLAW_SETTINGS_PATHS.join(" ")}; do
|
||||
[ -f "$f" ] && echo "FOUND:$f"
|
||||
done
|
||||
`.trim());
|
||||
for (const line of raw.split("\n")) {
|
||||
if (line.startsWith("FOUND:")) return line.slice(6);
|
||||
}
|
||||
} catch {}
|
||||
// Default: erster Pfad (wird erstellt)
|
||||
return OPENCLAW_SETTINGS_PATHS[0];
|
||||
}
|
||||
|
||||
async function handleListPermissions(clientWs) {
|
||||
try {
|
||||
log("info", "server", "Lade Tool-Berechtigungen...");
|
||||
|
||||
const settingsPath = await findSettingsFile();
|
||||
let settings = {};
|
||||
let info = "";
|
||||
|
||||
try {
|
||||
const raw = await dockerExec("aria-core", `cat '${settingsPath}' 2>/dev/null || echo '{}'`);
|
||||
settings = JSON.parse(raw.trim() || "{}");
|
||||
info = `Geladen aus: ${settingsPath}`;
|
||||
} catch (e) {
|
||||
info = `Settings-Datei nicht lesbar (${settingsPath}) — Default-Berechtigungen`;
|
||||
}
|
||||
|
||||
// OpenClaw/Claude Code Format: allowedTools ist ein Array von Tool-Namen
|
||||
// Wenn leer/nicht vorhanden: alle Tools erlaubt
|
||||
const allowedTools = settings.allowedTools || [];
|
||||
const permissions = settings.permissions || {};
|
||||
|
||||
clientWs.send(JSON.stringify({
|
||||
type: "permissions_list",
|
||||
allowedTools,
|
||||
permissions,
|
||||
settingsPath,
|
||||
info,
|
||||
}));
|
||||
log("info", "server", `Berechtigungen geladen (${allowedTools.length} Tools explizit erlaubt)`);
|
||||
} catch (err) {
|
||||
log("error", "server", `Berechtigungen laden fehlgeschlagen: ${err.message}`);
|
||||
clientWs.send(JSON.stringify({ type: "permissions_list", error: err.message, allowedTools: [], permissions: {} }));
|
||||
}
|
||||
}
|
||||
|
||||
async function handleSavePermissions(clientWs, allowedTools) {
|
||||
if (!Array.isArray(allowedTools)) {
|
||||
clientWs.send(JSON.stringify({ type: "permissions_saved", ok: false, error: "Ungueltige Daten" }));
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const settingsPath = await findSettingsFile();
|
||||
log("info", "server", `Speichere ${allowedTools.length} Tool-Berechtigungen in ${settingsPath}`);
|
||||
|
||||
// Bestehende Settings lesen und mergen
|
||||
const script = [
|
||||
'const fs=require("fs");',
|
||||
`const f="${settingsPath}";`,
|
||||
`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));',
|
||||
].join("");
|
||||
const b64 = Buffer.from(script).toString("base64");
|
||||
await dockerExec("aria-core", `echo ${b64} | base64 -d | node`);
|
||||
|
||||
clientWs.send(JSON.stringify({ type: "permissions_saved", ok: true }));
|
||||
log("info", "server", "Berechtigungen gespeichert");
|
||||
} catch (err) {
|
||||
log("error", "server", `Berechtigungen speichern fehlgeschlagen: ${err.message}`);
|
||||
clientWs.send(JSON.stringify({ type: "permissions_saved", ok: false, error: err.message }));
|
||||
}
|
||||
}
|
||||
|
||||
// ── Einstellungen: Model ────────────────────────────────
|
||||
|
||||
async function handleGetModel(clientWs) {
|
||||
try {
|
||||
const raw = await dockerExec("aria-core", `echo $DEFAULT_MODEL`);
|
||||
clientWs.send(JSON.stringify({ type: "model_info", model: raw.trim(), info: "Aktuelles Model (ENV)" }));
|
||||
} catch (err) {
|
||||
clientWs.send(JSON.stringify({ type: "model_info", error: err.message }));
|
||||
}
|
||||
}
|
||||
|
||||
async function handleSetModel(clientWs, model) {
|
||||
if (!model || typeof model !== "string") {
|
||||
clientWs.send(JSON.stringify({ type: "model_info", error: "Kein Model angegeben" }));
|
||||
return;
|
||||
}
|
||||
try {
|
||||
// Model in Settings speichern (OpenClaw liest das)
|
||||
const settingsPath = await findSettingsFile();
|
||||
const script = [
|
||||
'const fs=require("fs");',
|
||||
`const f="${settingsPath}";`,
|
||||
'let s={};try{s=JSON.parse(fs.readFileSync(f,"utf8"));}catch(e){}',
|
||||
`s.model=${JSON.stringify(model)};`,
|
||||
`const dir=f.substring(0,f.lastIndexOf("/"));`,
|
||||
'try{fs.mkdirSync(dir,{recursive:true});}catch(e){}',
|
||||
'fs.writeFileSync(f,JSON.stringify(s,null,2));',
|
||||
].join("");
|
||||
const b64 = Buffer.from(script).toString("base64");
|
||||
await dockerExec("aria-core", `echo ${b64} | base64 -d | node`);
|
||||
|
||||
clientWs.send(JSON.stringify({ type: "model_info", model, info: `Model auf "${model}" gesetzt (Neustart noetig)` }));
|
||||
log("info", "server", `Model gesetzt: ${model}`);
|
||||
} catch (err) {
|
||||
clientWs.send(JSON.stringify({ type: "model_info", error: err.message }));
|
||||
}
|
||||
}
|
||||
|
||||
// ── Einstellungen: OpenClaw Config ──────────────────────
|
||||
|
||||
async function handleGetOpenClawConfig(clientWs) {
|
||||
try {
|
||||
const raw = await dockerExec("aria-core", `
|
||||
echo '=== Umgebungsvariablen ==='
|
||||
echo "DEFAULT_MODEL=$DEFAULT_MODEL"
|
||||
echo "RATE_LIMIT_PER_USER=$RATE_LIMIT_PER_USER"
|
||||
echo "OPENCLAW_GATEWAY_TOKEN=$(echo $OPENCLAW_GATEWAY_TOKEN | head -c 8)..."
|
||||
echo "OPENCLAW_GATEWAY_BIND=$OPENCLAW_GATEWAY_BIND"
|
||||
echo ""
|
||||
echo '=== Settings-Dateien ==='
|
||||
for f in ${OPENCLAW_SETTINGS_PATHS.join(" ")}; do
|
||||
if [ -f "$f" ]; then
|
||||
echo "--- $f ---"
|
||||
cat "$f"
|
||||
echo ""
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
echo '=== Agent-Verzeichnis ==='
|
||||
ls -la /home/node/.openclaw/agents/main/agent/ 2>&1
|
||||
echo ""
|
||||
echo '=== Workspace ==='
|
||||
ls -la /home/node/.openclaw/workspace/ 2>&1
|
||||
`.trim());
|
||||
clientWs.send(JSON.stringify({ type: "openclaw_config", config: raw }));
|
||||
} catch (err) {
|
||||
clientWs.send(JSON.stringify({ type: "openclaw_config", error: err.message }));
|
||||
}
|
||||
}
|
||||
|
||||
// ── Start ───────────────────────────────────────────────
|
||||
|
||||
server.listen(HTTP_PORT, "0.0.0.0", () => {
|
||||
|
||||
Reference in New Issue
Block a user