From 094bd6e4f116d6cc5c85c3866d78b721eabbc1a0 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Mon, 11 May 2026 22:29:59 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20OpenClaw-Reste=20raus=20=E2=80=94=20to?= =?UTF-8?q?ols/,=20docs/tool-permissions,=20Diagnostic-Permissions-Section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tools/export-jsonl-to-md.js CLI-Konverter fuer OpenClaw-Session-JSONL zu Markdown. Mit OpenClaw raus. tools/-Ordner ist jetzt leer und auch entfernt. aria-data/docs/tool-permissions.md Geschichts-Dokument zum OpenClaw-Tool-Permission-Bug. Nicht mehr relevant — Brain hat eigenes Tool-Use-System (Skills + Meta-Tools), keine granulare Permission-Maske. aria-data/docs/ Ordner war leer, mit raus. diagnostic/index.html - "Tool-Berechtigungen"-Section aus den Einstellungen raus. War nur ein disabled Info-Toggle aus OpenClaw-Zeit ("Claude darf alle Tools"). Brain weiss zur Laufzeit selbst welche Tools es hat (META_TOOLS + pro aktivem Skill ein dynamisches run_). - .perm-grid / .perm-item / .perm-info CSS-Klassen entfernt (sonst nirgends referenziert). issue.md - tools/export-jsonl-to-md.js-Eintrag mit "(mit OpenClaw raus)" markiert. Co-Authored-By: Claude Opus 4.7 (1M context) --- aria-data/docs/tool-permissions.md | 137 ----------------------------- diagnostic/index.html | 30 +------ issue.md | 2 +- tools/export-jsonl-to-md.js | 74 ---------------- 4 files changed, 4 insertions(+), 239 deletions(-) delete mode 100644 aria-data/docs/tool-permissions.md delete mode 100755 tools/export-jsonl-to-md.js diff --git a/aria-data/docs/tool-permissions.md b/aria-data/docs/tool-permissions.md deleted file mode 100644 index b64639f..0000000 --- a/aria-data/docs/tool-permissions.md +++ /dev/null @@ -1,137 +0,0 @@ -# OpenClaw Tool-Permissions — Stand 2026-03-15 - -## Das Problem (GELÖST) - -ARIA hat ZWEI Tool-Systeme gleichzeitig: Claude Code Tools UND OpenClaw-native Tools. -Das Model hat aber nur Zugriff auf **Claude Code Tools** (über den Proxy), nicht auf OpenClaw-native Tools. - -### Root Cause: DREI Probleme gleichzeitig - -``` -OpenClaw (aria-core) → API Request → claude-max-api-proxy (aria-proxy) → Claude Code CLI (--print Mode) - ↓ - Tools: WebFetch, Bash, etc. (Claude Code) - NICHT: web_fetch, exec (OpenClaw-nativ) -``` - -**Problem 1: Proxy benutzt `--print` Modus** -- `claude-max-api-proxy` ruft Claude Code CLI mit `--print --output-format stream-json` auf -- Der Prompt wird als einziger String übergeben, keine Tool-Definitionen von OpenClaw -- Das Model sieht NUR Claude Code's eingebaute Tools (WebFetch, Bash, etc.) -- OpenClaw-native Tools (web_fetch, exec) existieren NUR auf Gateway-Ebene, kommen nie beim Model an - -**Problem 2: BOOTSTRAP.md hat die falschen Tools angewiesen** -- BOOTSTRAP.md sagte: "NIEMALS WebFetch benutzen, stattdessen web_fetch" -- Aber web_fetch existiert nicht im Claude Code CLI Kontext -- Und WebFetch war das einzige Tool das funktioniert hätte -- → Model hatte keine Tools die es benutzen "durfte" - -**Problem 3: settings.json im Proxy war leer** -- `/root/.claude/settings.json` enthielt nur `{}` (keine Permissions) -- Claude Code CLI im headless-Modus kann keine Tool-Genehmigungen erteilen -- → Selbst wenn das Model WebFetch benutzen wollte, war es nicht vorab genehmigt - -## Die Lösung - -### Fix 1: BOOTSTRAP.md + AGENT.md umgeschrieben - -**Vorher (FALSCH):** -- "NIEMALS WebFetch benutzen — hat Permission-Probleme" -- "Benutze web_fetch (OpenClaw-nativ)" - -**Nachher (KORREKT):** -- "WebFetch — URLs abrufen, Webseiten lesen, APIs aufrufen, Wetter abfragen" -- "Bash — Shell-Befehle ausfuehren (curl, ssh, docker, etc.)" -- "Niemals sagen 'ich habe keinen Zugriff' — du hast Zugriff auf alles" - -### Fix 2: `CLAUDE_CODE_BUBBLEWRAP=1` + `--dangerously-skip-permissions` - -**Der Schlüssel-Fix.** Zwei Zeilen in `docker-compose.yml`: - -```yaml -# 1. sed-Patch: --dangerously-skip-permissions in manager.js einfügen -sed -i 's/"--no-session-persistence",/"--no-session-persistence","--dangerously-skip-permissions",/' $$DIST/subprocess/manager.js && - -# 2. Environment-Variable: Root-Check umgehen -environment: - - CLAUDE_CODE_BUBBLEWRAP=1 -``` - -**Warum beides nötig:** -- `--dangerously-skip-permissions` umgeht alle Tool-Permission-Checks in Claude Code CLI -- Aber: Claude Code CLI blockiert dieses Flag wenn es als root läuft -- `CLAUDE_CODE_BUBBLEWRAP=1` überspringt den Root-Check (gefunden im minifizierten `cli.js`) -- Proxy-Container (`node:22-alpine`) läuft als root → ohne BUBBLEWRAP geht's nicht - -**Resultierende CLI-Argumente:** -``` -claude --print --output-format stream-json --verbose --include-partial-messages \ - --model opus --no-session-persistence --dangerously-skip-permissions "prompt" -``` - -## Wie der Proxy intern funktioniert - -``` -openai-to-cli.js: OpenAI Messages → einzelner Prompt-String - system → ... - user → direkt - assistant → ... - -subprocess/manager.js: Spawnt `claude --print ... --dangerously-skip-permissions "{prompt}"` - -cli-to-openai.js: Claude CLI JSON-Stream → OpenAI Chat Completion Chunks -``` - -Der Proxy leitet KEINE Tool-Definitionen von OpenClaw weiter. -Tool-Calls passieren INTERN in der Claude Code CLI und sind für OpenClaw transparent. - -## Permission-Architektur - -**Granulare Tool-Kontrolle ist NICHT möglich.** Es ist Alles-oder-Nichts: -- `--dangerously-skip-permissions` AN → ARIA kann alle Claude Code Tools benutzen -- `--dangerously-skip-permissions` AUS → ARIA kann keine Tools benutzen - -OpenClaw's eigene Permissions (`tools.allow/deny` in `openclaw.json`) haben **keinen Effekt** auf die -Claude Code Tools — die laufen komplett auf Proxy-Seite. - -## Was NICHT funktioniert hat (17 Versuche) - -1. **settings.json in aria-core** — OpenClaw benutzt NICHT Claude Code's settings.json -2. **tools.allow mit PascalCase** (WebFetch, Grep) — OpenClaw kennt diese Namen nicht -3. **tools.allow mit snake_case** (web_fetch) — Nur exec, read, write, edit erkannt -4. **tools.allow mit Wildcard** `["*"]` — Hat nicht geholfen -5. **tools.allow leer + tools.profile: "full"** — Nur ohne andere Fehler -6. **System-Prompt Anweisung allein** — Reicht nicht wenn Tools blockiert sind -7. **exec-approvals Wildcard allein** — Reicht nicht bei Config-Validation-Error -8. **`openclaw config unset tools.exec.ask`** — CLI kennt den Pfad nicht -9. **BOOTSTRAP.md mit OpenClaw-Tool-Namen** — Tools existieren nur auf Gateway-Ebene -10. **settings.json im Proxy ohne BOOTSTRAP.md Fix** — BOOTSTRAP.md verbot die Tools -11. **tools.byProvider.proxy.profile full** — Kein Effekt -12. **settings.json + BOOTSTRAP.md ohne --dangerously-skip-permissions** — `--print` ignoriert settings.json -13. **Manuelles `docker exec sed`** — Wird bei jedem Restart überschrieben -14. **`--dangerously-skip-permissions` ohne BUBBLEWRAP** — Root-Check blockiert -15. **`--allowedTools`** — Variadisches Argument frisst den Prompt -16. **`--permission-mode bypassPermissions`** — Gleicher Root-Check -17. **Non-Root User (`su node`)** — Auth-Pfad-Probleme, Credentials unerreichbar - -## Wichtige Pfade - -### aria-core (OpenClaw) -- `/home/node/.openclaw/openclaw.json` — OpenClaw Haupt-Config -- `/home/node/.openclaw/exec-approvals.json` — Exec Approvals -- `/tmp/openclaw/openclaw-YYYY-MM-DD.log` — Tages-Log - -### aria-proxy (Claude Code CLI) -- `/root/.claude/.credentials.json` — Auth Credentials (NICHT in /root/.config/claude/) -- `/usr/local/lib/node_modules/claude-max-api-proxy/dist/` — Proxy Source -- `/usr/local/lib/node_modules/@anthropic-ai/claude-code/cli.js` — Claude Code CLI (enthält Root-Check) - -## OpenClaw CLI Referenz - -```bash -openclaw config get/set/unset # Config verwalten -openclaw approvals get # Exec-Approvals anzeigen -openclaw approvals allowlist add # Exec-Pattern freigeben -openclaw doctor [--fix] # Health Check -openclaw gateway status # Gateway-Status -``` diff --git a/diagnostic/index.html b/diagnostic/index.html index 4360bd5..8d514eb 100644 --- a/diagnostic/index.html +++ b/diagnostic/index.html @@ -120,12 +120,6 @@ /* Settings */ .settings-section { margin-bottom:20px; } .settings-section h2 { margin-bottom:12px; } - .perm-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:8px; } - .perm-item { display:flex; align-items:center; justify-content:space-between; background:#12122A; - border:1px solid #1E1E2E; border-radius:6px; padding:8px 12px; } - .perm-item .perm-info { flex:1; min-width:0; } - .perm-item .perm-name { font-size:13px; color:#E0E0F0; font-weight:bold; } - .perm-item .perm-desc { font-size:10px; color:#8888AA; margin-top:2px; } .toggle { position:relative; width:40px; height:22px; flex-shrink:0; margin-left:8px; } .toggle input { opacity:0; width:0; height:0; } .toggle .slider { position:absolute; cursor:pointer; top:0; left:0; right:0; bottom:0; @@ -661,27 +655,9 @@ - -
-

Tool-Berechtigungen

-
- Claude Code laeuft mit --dangerously-skip-permissions im Proxy — Alles oder Nichts. - Granulare Tool-Kontrolle ist in dieser Architektur nicht moeglich. -
-
-
-
-
Claude darf alle Tools benutzen
-
WebFetch, Bash, Read/Write/Edit, WebSearch, Agent, etc.
-
- -
-
- Deaktivieren = --dangerously-skip-permissions aus docker-compose.yml entfernen. - Dann kann ARIA keine Tools mehr benutzen (auch kein WebFetch fuer Wetter etc.). -
-
-
+
diff --git a/issue.md b/issue.md index 13d10c9..158ed11 100644 --- a/issue.md +++ b/issue.md @@ -149,7 +149,7 @@ Wichtige Mechanismen: - [x] Piper komplett entfernt - [x] Gespraechsmodus: Speech-Gate strenger (-28dB / 500ms) - [x] Diagnostic: Archivierte Session-Versionen (.reset.*) angezeigt + exportierbar -- [x] tools/export-jsonl-to-md.js: CLI-Konverter fuer Session-JSONL zu Markdown +- [x] tools/export-jsonl-to-md.js: CLI-Konverter fuer Session-JSONL zu Markdown (mit OpenClaw raus) - [x] NO_REPLY-Filter in Bridge + Diagnostic - [x] Audio-Ducking + Exklusiv-Focus (Kotlin AudioFocusModule) - [x] TTS-Cleanup serverseitig: Code-Bloecke raus, Einheiten ausgeschrieben, Abkuerzungen buchstabiert, URLs zu "ein Link" diff --git a/tools/export-jsonl-to-md.js b/tools/export-jsonl-to-md.js deleted file mode 100755 index 90f3219..0000000 --- a/tools/export-jsonl-to-md.js +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env node -/** - * Exportiert ein OpenClaw Session-JSONL (auch .reset.*) als Markdown. - * - * Nutzung: - * node export-jsonl-to-md.js [output.md] - * - * Oder direkt aus dem aria-core Container: - * docker exec aria-core cat /home/node/.openclaw/agents/main/sessions/.jsonl.reset. \ - * | node export-jsonl-to-md.js - > output.md - */ - -const fs = require("fs"); - -const inputArg = process.argv[2]; -const outputArg = process.argv[3]; - -if (!inputArg) { - console.error("Usage: export-jsonl-to-md.js [output.md]"); - process.exit(1); -} - -const raw = inputArg === "-" ? fs.readFileSync(0, "utf-8") : fs.readFileSync(inputArg, "utf-8"); -const lines = raw.split("\n").filter(l => l.trim()); - -const blocks = []; -for (const line of lines) { - let obj; - try { obj = JSON.parse(line); } catch { continue; } - if (obj.type !== "message" || !obj.message) continue; - const role = obj.message.role; - if (role !== "user" && role !== "assistant") continue; - - let text = ""; - const content = obj.message.content; - if (typeof content === "string") text = content; - else if (Array.isArray(content)) text = content.filter(c => c.type === "text").map(c => c.text || "").join("\n"); - if (!text) continue; - - if (role === "user") { - text = text.replace(/^Sender \(untrusted metadata\):[\s\S]*?```[\s\S]*?```\s*\n*/m, "").trim(); - text = text.replace(/^\[.*?\]\s*/, "").trim(); - } else { - text = text.replace(/^\[\[reply_to_\w+\]\]\s*/g, "").trim(); - } - if (!text) continue; - - const ts = obj.message.timestamp || obj.timestamp || 0; - const when = ts ? new Date(ts).toISOString().replace("T", " ").slice(0, 19) : ""; - const heading = role === "user" ? "## 🧑 User" : "## 🤖 ARIA"; - blocks.push(`${heading}${when ? ` — ${when}` : ""}\n\n${text}`); -} - -const exportedAt = new Date().toISOString().replace("T", " ").slice(0, 19); -const title = inputArg === "-" ? "Session" : inputArg.split("/").pop().replace(/\.jsonl.*/, ""); -const md = [ - `# Session: ${title}`, - ``, - `Exportiert: ${exportedAt} `, - `Quelle: ${inputArg === "-" ? "stdin" : inputArg}`, - `Nachrichten: ${blocks.length}`, - ``, - `---`, - ``, - blocks.join("\n\n---\n\n"), - ``, -].join("\n"); - -if (outputArg) { - fs.writeFileSync(outputArg, md); - console.error(`OK: ${blocks.length} Nachrichten → ${outputArg}`); -} else { - process.stdout.write(md); -}