From ed3529a9d7768740efba086c5d4e682ce2fc9e11 Mon Sep 17 00:00:00 2001 From: Moritz Graf Date: Fri, 16 Oct 2026 21:25:33 +0200 Subject: [PATCH] feat(openclaw): modularize scripts, implement crons-as-code and EaC governance --- .gitignore | 7 + k8s/openclaw/AGENTS.md | 16 + k8s/openclaw/configmap-scripts.yaml | 940 ++++++++++++++++++ k8s/openclaw/cronjob-wiki-backup.secret.yaml | Bin 6189 -> 8406 bytes k8s/openclaw/crons.yaml | 154 +++ k8s/openclaw/openclaw-instance.secret.yaml | Bin 157975 -> 57205 bytes k8s/openclaw/scripts/bootstrap-deps.sh | 205 ++++ .../scripts/dedup_subagent_vectors.py | 34 + k8s/openclaw/scripts/file_cli.py | 50 + k8s/openclaw/scripts/gateway-preflight.mjs | 78 ++ k8s/openclaw/scripts/patch_garmin_mcp.py | 64 ++ k8s/openclaw/scripts/patch_perplexity.mjs | 61 ++ k8s/openclaw/scripts/recover_sessions.py | 80 ++ .../scripts/replay_interrupted_turns.py | 97 ++ k8s/openclaw/scripts/sync_crons.py | 137 +++ knowledge-wiki | 2 +- 16 files changed, 1924 insertions(+), 1 deletion(-) create mode 100644 k8s/openclaw/configmap-scripts.yaml create mode 100644 k8s/openclaw/crons.yaml create mode 100644 k8s/openclaw/scripts/bootstrap-deps.sh create mode 100644 k8s/openclaw/scripts/dedup_subagent_vectors.py create mode 100644 k8s/openclaw/scripts/file_cli.py create mode 100644 k8s/openclaw/scripts/gateway-preflight.mjs create mode 100644 k8s/openclaw/scripts/patch_garmin_mcp.py create mode 100644 k8s/openclaw/scripts/patch_perplexity.mjs create mode 100644 k8s/openclaw/scripts/recover_sessions.py create mode 100644 k8s/openclaw/scripts/replay_interrupted_turns.py create mode 100644 k8s/openclaw/scripts/sync_crons.py diff --git a/.gitignore b/.gitignore index bb6ea77..d4b486d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,10 @@ k8s/gitea-chart/ .vagrant k8s/tekton-pipelines/auth .DS_Store +node_modules/ +**/node_modules/ +dist/ +**/dist/ +*.tsbuildinfo +.venv/ +**/__pycache__/ diff --git a/k8s/openclaw/AGENTS.md b/k8s/openclaw/AGENTS.md index 183b034..7b600e2 100644 --- a/k8s/openclaw/AGENTS.md +++ b/k8s/openclaw/AGENTS.md @@ -60,8 +60,24 @@ To perform modifications or rotate api keys: ./k8s/openclaw/setup-garmin-cron.sh # Nightly Garmin Connect sync (Daily 03:30) ./k8s/openclaw/setup-compaction-cron.sh # Nightly multi-agent session compaction (Daily 04:45) ./k8s/openclaw/setup-itguy-cron.sh # Weekly health audit (Sun 03:00) + # Or run declarative reconciler: + python3 k8s/openclaw/scripts/sync_crons.py ``` +### 🛡️ Everything-as-Code (EaC) Governance for New Crons, Skills & Binaries (ADR 0003) + +To prevent PVC snowflake drift, **every** new automation, skill, CLI binary, or Python dependency added to OpenClaw MUST be persisted as code: + +1. **New Cron Jobs (`Crons-as-Code`)**: + - **System / Recurring Automations**: Never leave a recurring cron job exclusively inside the pod's SQLite database (`openclaw cron add`). Every permanent automation MUST be codified in `k8s/openclaw/crons.yaml` (or the declarative cron sync scripts) and committed to `infrapuzzle`. + - **Dynamic / User-Created Reminders**: Conversational or temporary crons created by agents at runtime must be exported to `knowledge-wiki/operations/crons-backup.json` during nightly backup so they survive PVC loss. +2. **New Skills (`Skills-as-Code`)**: + - Never leave newly created or agent-authored skills only in `/home/node/.openclaw/skills/`, `workspace*/skills/`, or `skill-workshop/` on the PVC. + - All custom skills MUST be committed and pushed to the **`mop-skills`** repository (`git.moritzgraf.de/moritz/mop-skills`) so they are version-controlled and synced cleanly via the `git-sync` sidecar. +3. **New CLI Binaries, Packages & Patches (`Dependencies-as-Code`)**: + - Never manually drop binaries into `/home/node/.openclaw/bin/` or run ad-hoc `uv pip install` / `npm install -g` on the PVC without codifying them. + - Every new binary (e.g. `ffmpeg`, `kubectl`, `jq`, `openhue`, `sonos`), Python package in `mcp-venv`, or runtime patch MUST be added to the declarative bootstrap script (`k8s/openclaw/scripts/bootstrap-deps.sh` / `configmap-scripts.yaml`) so a fresh PVC rebuild has 100% tool parity. + --- ### 4. 🗂️ The Three Core Repositories Architecture & Weekly Self-Audit diff --git a/k8s/openclaw/configmap-scripts.yaml b/k8s/openclaw/configmap-scripts.yaml new file mode 100644 index 0000000..5bfe25e --- /dev/null +++ b/k8s/openclaw/configmap-scripts.yaml @@ -0,0 +1,940 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: openclaw-scripts + namespace: openclaw + labels: + app.kubernetes.io/name: openclaw + app.kubernetes.io/part-of: openclaw +data: + bootstrap-deps.sh: "#!/bin/sh\nset -e\n\necho \"=== OpenClaw Dependency & Runtime\ + \ Bootstrap ===\"\nexport PATH=\"/home/node/.openclaw/bin:/home/node/.openclaw/.local/bin:$PATH\"\ + \n\nSCRIPTS_DIR=\"/home/node/.openclaw/scripts\"\nmkdir -p /home/node/.openclaw/bin\ + \ \"$SCRIPTS_DIR\" /home/node/.openclaw/.config\ntouch /home/node/.openclaw/.config/keep\n\ + \n# 1. Sanitize legacy config keys in openclaw.json\nnode -e '\n const fs = require(\"\ + fs\");\n for (const file of [\"/home/node/.openclaw/openclaw.json\", \"/home/openclaw/.openclaw/openclaw.json\"\ + ]) {\n if (fs.existsSync(file)) {\n try {\n const cfg = JSON.parse(fs.readFileSync(file,\ + \ \"utf8\"));\n if (cfg.browser) {\n delete cfg.browser.remoteCdpTimeoutMs;\n\ + \ if (cfg.browser.profiles) {\n if (cfg.browser.profiles.default)\ + \ delete cfg.browser.profiles.default.color;\n if (cfg.browser.profiles.chrome)\ + \ delete cfg.browser.profiles.chrome;\n }\n }\n if (cfg.gateway\ + \ && cfg.gateway.controlUi) {\n delete cfg.gateway.controlUi.dangerouslyDisableDeviceAuth;\n\ + \ }\n if (!cfg.agents) cfg.agents = {};\n cfg.agents.ownership\ + \ = \"explicit\";\n if (cfg.agents.entries && cfg.agents.entries.main)\ + \ {\n delete cfg.agents.entries.main.default;\n }\n fs.writeFileSync(file,\ + \ JSON.stringify(cfg, null, 2));\n console.log(\"Sanitized config file:\"\ + , file);\n } catch (e) {\n console.error(\"Failed to sanitize\", file,\ + \ e.message);\n }\n }\n }\n' || true\n\n# 2. Run pre-flight session recovery\n\ + echo \"Running pre-flight self-healing...\"\npython3 \"$SCRIPTS_DIR/recover_sessions.py\"\ + \ || true\n\n# 3. Doctor fix\necho \"Running openclaw doctor --fix to migrate\ + \ runtime config on PVC...\"\nopenclaw doctor --fix || true\n\n# 4. Garmin OAuth\ + \ tokens bootstrap / preserve\nif [ ! -s /home/node/.openclaw/garmin_tokens/garmin_tokens.json\ + \ ] && [ -n \"$GARMIN_TOKENS_BASE64\" ]; then\n echo \"Bootstrapping initial\ + \ Garmin OAuth tokens from secret...\"\n mkdir -p /home/node/.openclaw/garmin_tokens\n\ + \ echo \"$GARMIN_TOKENS_BASE64\" | base64 -d > /home/node/.openclaw/garmin_tokens/garmin_tokens.json\n\ + \ chmod 700 /home/node/.openclaw/garmin_tokens\n chmod 600 /home/node/.openclaw/garmin_tokens/garmin_tokens.json\n\ + elif [ -s /home/node/.openclaw/garmin_tokens/garmin_tokens.json ]; then\n echo\ + \ \"Preserving live Garmin OAuth tokens on PVC...\"\n chmod 700 /home/node/.openclaw/garmin_tokens\n\ + \ chmod 600 /home/node/.openclaw/garmin_tokens/garmin_tokens.json\nfi\n\n# 5.\ + \ Cleanup legacy binaries and superseded local skills\nrm -rf /home/node/.openclaw/bin/whisper*\ + \ /home/node/.openclaw/bin/.whisper* /home/node/.openclaw/scripts/whisper* /home/node/.openclaw/models/whisper\ + \ || true\nrm -rf /home/node/.openclaw/skills/memobird /home/node/.openclaw/skills/nerd-report\ + \ /home/node/.openclaw/skills/rvv-regensburg /home/node/.openclaw/skills/skill-creator\ + \ || true\nrm -rf /home/node/.openclaw/workspace/skills /home/node/.openclaw/workspace-koch/skills\ + \ /home/node/.openclaw/workspace-recherche/skills || true\n\n# 6. Ensure tools.allow\ + \ and models.providers.openrouter.apiKey unset\nopenclaw config unset tools.allow\ + \ || true\nopenclaw config unset models.providers.openrouter.apiKey || true\n\ + openclaw config unset agents.entries.mila_tracker.tools.profile || true\nopenclaw\ + \ config unset agents.entries.nutrition_tracker.tools.profile || true\n\n# 7.\ + \ Decouple hardlinked bootstrap files\nfor dir in /home/node/.openclaw/workspace-*;\ + \ do\n if [ -d \"$dir\" ]; then\n for file in USER.md MEMORY.md; do\n \ + \ if [ -f \"/home/node/.openclaw/workspace/$file\" ]; then\n cp --remove-destination\ + \ \"/home/node/.openclaw/workspace/$file\" \"$dir/$file\"\n chown node:node\ + \ \"$dir/$file\" 2>/dev/null || true\n chmod 664 \"$dir/$file\" 2>/dev/null\ + \ || true\n fi\n done\n fi\ndone\n\n# 8. Install CLI binaries\nif [ !\ + \ -f \"/home/node/.openclaw/bin/openhue.real\" ]; then\n echo \"Installing openhue\ + \ CLI binary...\"\n curl -sL https://github.com/openhue/openhue-cli/releases/download/0.24/openhue_Linux_x86_64.tar.gz\ + \ | tar -xz -C /home/node/.openclaw/bin openhue\n mv /home/node/.openclaw/bin/openhue\ + \ /home/node/.openclaw/bin/openhue.real\n printf '#!/bin/sh\\nexport HOME=/home/node/.openclaw\\\ + nexec /home/node/.openclaw/bin/openhue.real \"$@\"\\n' > /home/node/.openclaw/bin/openhue\n\ + \ chmod +x /home/node/.openclaw/bin/openhue /home/node/.openclaw/bin/openhue.real\n\ + fi\n\nif [ ! -f \"/home/node/.openclaw/bin/summarize\" ]; then\n echo \"Installing\ + \ summarize CLI via npm...\"\n npm install -g --prefix /home/node/.openclaw @steipete/summarize\ + \ || true\nfi\n\nif [ ! -f \"/home/node/.openclaw/bin/mcp-server-github\" ]; then\n\ + \ echo \"Installing @modelcontextprotocol/server-github via npm...\"\n npm install\ + \ -g --prefix /home/node/.openclaw @modelcontextprotocol/server-github || true\n\ + fi\n\nif [ ! -f \"/home/node/.openclaw/bin/kubectl\" ]; then\n echo \"Installing\ + \ kubectl CLI binary...\"\n curl -fsSL https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl\ + \ -o /home/node/.openclaw/bin/kubectl\n chmod +x /home/node/.openclaw/bin/kubectl\n\ + fi\n\nif [ ! -f \"/home/node/.openclaw/bin/jq\" ]; then\n echo \"Installing jq\ + \ CLI binary...\"\n curl -fsSL https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64\ + \ -o /home/node/.openclaw/bin/jq\n chmod +x /home/node/.openclaw/bin/jq\nfi\n\ + \nif [ ! -f \"/home/node/.openclaw/bin/file\" ]; then\n echo \"Setting up file\ + \ CLI helper...\"\n cp \"$SCRIPTS_DIR/file_cli.py\" /home/node/.openclaw/bin/file\n\ + \ chmod +x /home/node/.openclaw/bin/file\nfi\n\nif [ -x \"/home/node/.openclaw/.local/bin/python3\"\ + \ ]; then\n /home/node/.openclaw/bin/uv pip install --break-system-packages --python\ + \ /home/node/.openclaw/.local/bin/python3 pillow google-api-python-client pypdf\ + \ || true\nfi\n\n# 9. Clone or pull infrapuzzle repository to PVC\nmkdir -p /home/node/.openclaw/repos\n\ + if [ ! -d \"/home/node/.openclaw/repos/infrapuzzle/.git\" ]; then\n echo \"Cloning\ + \ infrapuzzle repository to PVC...\"\n git clone --depth 1 \"https://${GIT_SYNC_USERNAME}:${GIT_SYNC_PASSWORD}@git.moritzgraf.de/moritz/infrapuzzle.git\"\ + \ /home/node/.openclaw/repos/infrapuzzle || true\nelse\n echo \"Pulling latest\ + \ infrapuzzle commits on PVC...\"\n git -C /home/node/.openclaw/repos/infrapuzzle\ + \ pull origin master || git -C /home/node/.openclaw/repos/infrapuzzle pull origin\ + \ main || true\nfi\n\n# 10. Seed and maintain persistent mcp-venv\nif [ ! -d \"\ + /home/node/.openclaw/mcp-venv\" ]; then\n echo \"Seeding persistent mcp-venv...\"\ + \n uv venv --python 3.12 /home/node/.openclaw/mcp-venv\n uv pip install --python\ + \ /home/node/.openclaw/mcp-venv \\\n prometheus-mcp-server \\\n ha-mcp \\\ + \n chuk-mcp-open-meteo \\\n gitea-mcp \\\n git+https://github.com/Taxuspt/garmin_mcp\ + \ \\\n \"mcp>=2.0\" \\\n filetype \\\n google-api-python-client \\\n\ + \ google-auth \\\n bring-api \\\n requests \\\n beautifulsoup4 \\\n\ + \ youtube-transcript-api\nfi\n\nif [ -d \"/home/node/.openclaw/mcp-venv\" ];\ + \ then\n python3 -c 'import os; p=\"/home/node/.openclaw/mcp-venv/lib/python3.12/site-packages/mcp/server/fastmcp.py\"\ + ; open(p, \"w\").write(\"import os\\nfrom fastmcp import FastMCP as _FastMCP,\ + \ Context\\n\\nclass FastMCP(_FastMCP):\\n def __init__(self, name=\\\"MCP\ + \ Server\\\", host=None, port=None, **kwargs):\\n if host is not None:\ + \ os.environ[\\\"FASTMCP_HOST\\\"] = str(host)\\n if port is not None:\ + \ os.environ[\\\"FASTMCP_PORT\\\"] = str(port)\\n super().__init__(name=name,\ + \ **kwargs)\\n\")' || true\n python3 \"$SCRIPTS_DIR/patch_garmin_mcp.py\" ||\ + \ true\nfi\n\n# 11. Extensions & Plugins\nif [ ! -d \"/home/node/.openclaw/extensions/perplexity\"\ + \ ]; then\n echo \"Installing perplexity plugin...\"\n openclaw plugins install\ + \ clawhub:@openclaw/perplexity-plugin --accept-capabilities || true\nfi\necho\ + \ \"Enabling memory-wiki plugin...\"\nopenclaw plugins enable memory-wiki || true\n\ + \necho \"Patching perplexity web search runtime for chat completions compatibility...\"\ + \nnode \"$SCRIPTS_DIR/patch_perplexity.mjs\" || true\n\n# 12. Ensure OpenRouter\ + \ auth profile in state DB\necho \"Ensuring OpenRouter auth profile in state DB...\"\ + \nnode --input-type=module -e '\n import { DatabaseSync } from \"node:sqlite\"\ + ;\n const key = process.env.OPENROUTER_API_KEY;\n if (key) {\n try {\n \ + \ const dbPath = \"/home/node/.openclaw/state/openclaw.sqlite\";\n const\ + \ db = new DatabaseSync(dbPath);\n db.prepare(\"CREATE TABLE IF NOT EXISTS\ + \ config_machine_state (state_key TEXT PRIMARY KEY, value_json TEXT NOT NULL,\ + \ updated_at_ms INTEGER NOT NULL)\").run();\n const row = db.prepare(\"SELECT\ + \ value_json FROM config_machine_state WHERE state_key = \\x27authProfiles.store\\\ + x27\").get();\n let store = row?.value_json ? JSON.parse(row.value_json)\ + \ : { version: 1, profiles: {} };\n if (!store.profiles) store.profiles =\ + \ {};\n store.profiles[\"openrouter:default\"] = {\n type: \"api_key\"\ + ,\n provider: \"openrouter\",\n key: key\n };\n db.prepare(\"\ + INSERT INTO config_machine_state (state_key, value_json, updated_at_ms) VALUES\ + \ (\\x27authProfiles.store\\x27, ?, ?) ON CONFLICT(state_key) DO UPDATE SET value_json\ + \ = excluded.value_json, updated_at_ms = excluded.updated_at_ms\")\n .run(JSON.stringify(store),\ + \ Date.now());\n console.log(\"Synchronized openrouter auth profile in state\ + \ DB.\");\n } catch (e) {\n console.error(\"Could not sync auth profile:\"\ + , e.message);\n }\n }\n' || true\n\n# 13. Pre-warm SQLite page cache\necho\ + \ \"Pre-warming SQLite database files into OS page cache for instant cold start...\"\ + \ncat /home/node/.openclaw/state/openclaw.sqlite /home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite\ + \ > /dev/null 2>&1 || true\n\necho \"=== Bootstrap Complete ===\"\n" + gateway-preflight.mjs: " import fs from \"node:fs\";\n import\ + \ path from \"node:path\";\n import { execSync, spawn } from \"node:child_process\"\ + ;\n\n if (!process.env.__OPENCLAW_PREFLIGHT_DONE) {\n process.env.__OPENCLAW_PREFLIGHT_DONE\ + \ = \"1\";\n\n const isGateway = process.argv.some(arg => arg.endsWith(\"\ + openclaw.mjs\") || arg.endsWith(\"openclaw\")) && process.argv.includes(\"gateway\"\ + );\n\n if (isGateway) {\n const t0 = Date.now();\n \ + \ console.log(\"[gateway-preflight] Initializing container self-healing\ + \ preflight...\");\n\n // 1. Clean up stale gateway lock files from\ + \ ungraceful kills\n for (const dir of [\"/tmp/openclaw-1000\", \"\ + /tmp\"]) {\n if (fs.existsSync(dir)) {\n try {\n\ + \ const files = fs.readdirSync(dir);\n for\ + \ (const file of files) {\n if (file.startsWith(\"gateway\"\ + ) && file.endsWith(\".lock\")) {\n const fullPath = path.join(dir,\ + \ file);\n fs.unlinkSync(fullPath);\n \ + \ console.log(`[gateway-preflight] Removed stale lock: ${fullPath}`);\n\ + \ }\n }\n } catch (e)\ + \ {\n console.warn(`[gateway-preflight] Lock cleanup warning\ + \ in ${dir}:`, e.message);\n }\n }\n \ + \ }\n\n // 2. Clear false database quarantines\n \ + \ const qPath = \"/home/node/.openclaw/state/openclaw-quarantine.sqlite\";\n\ + \ if (fs.existsSync(qPath)) {\n try {\n \ + \ execSync(`/home/node/.openclaw/.local/bin/python3 -c \"import sqlite3;\ + \ c=sqlite3.connect(\\x27${qPath}\\x27); c.execute(\\x27DELETE FROM quarantined_databases\\\ + x27); c.commit(); c.close()\"`, { stdio: \"ignore\" });\n console.log(\"\ + [gateway-preflight] Cleared database quarantine.\");\n } catch\ + \ (_) {}\n }\n\n // 3. Deduplicate subagent vector databases\ + \ (keeps non-main agent DBs < 15MB)\n try {\n execSync(\"\ + /home/node/.openclaw/.local/bin/python3 /home/node/.openclaw/scripts/dedup_subagent_vectors.py\"\ + , { stdio: \"inherit\" });\n } catch (e) {\n console.warn(\"\ + [gateway-preflight] Vector deduplication warning:\", e.message);\n \ + \ }\n\n // 4. Pre-warm page cache sequentially (transforms random\ + \ 70 IOPS disk reads into sequential streaming)\n try {\n \ + \ const pw0 = Date.now();\n execSync(\"cat /home/node/.openclaw/state/openclaw.sqlite\ + \ /home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite > /dev/null 2>&1 ||\ + \ true\");\n console.log(`[gateway-preflight] Pre-warmed SQLite\ + \ databases in ${Date.now() - pw0}ms`);\n } catch (_) {}\n\n \ + \ // 5. Recover any wedged running sessions left over from ungraceful\ + \ container restart\n try {\n execSync(\"/home/node/.openclaw/.local/bin/python3\ + \ /home/node/.openclaw/scripts/recover_sessions.py\", { stdio: \"inherit\" });\n\ + \ } catch (e) {\n console.warn(\"[gateway-preflight]\ + \ Session recovery warning:\", e.message);\n }\n\n //\ + \ 6. Spawn background turn replay daemon if interrupted turns were detected\n\ + \ try {\n if (fs.existsSync(\"/tmp/openclaw-interrupted-turns.json\"\ + )) {\n console.log(\"[gateway-preflight] Spawning background\ + \ turn replay daemon...\");\n const child = spawn(\"/home/node/.openclaw/.local/bin/python3\"\ + , [\"/home/node/.openclaw/scripts/replay_interrupted_turns.py\"], {\n \ + \ detached: true,\n stdio: \"ignore\"\n \ + \ });\n child.unref();\n }\n \ + \ } catch (e) {\n console.warn(\"[gateway-preflight] Could\ + \ not spawn turn replay daemon:\", e.message);\n }\n\n \ + \ console.log(`[gateway-preflight] Self-healing completed in ${Date.now() -\ + \ t0}ms.`);\n }\n }\n" + recover_sessions.py: " #!/usr/bin/env python3\n import glob, sqlite3,\ + \ json, os, sys, time\n\n t0 = time.time()\n recovered = 0\n\ + \ interrupted_turns = []\n\n def extract_prompt(msg):\n \ + \ if not msg: return \"\"\n content = msg.get(\"content\"\ + )\n if isinstance(content, str): return content\n if\ + \ isinstance(content, list):\n parts = []\n \ + \ for c in content:\n if isinstance(c, dict): parts.append(c.get(\"\ + text\") or c.get(\"content\") or \"\")\n elif isinstance(c,\ + \ str): parts.append(c)\n return \"\\n\".join(filter(None, parts))\n\ + \ return str(content or \"\")\n\n for db in sorted(glob.glob(\"\ + /home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite\")):\n \ + \ try:\n conn = sqlite3.connect(db, timeout=10.0)\n \ + \ cursor = conn.cursor()\n while True:\n \ + \ cursor.execute(\"PRAGMA foreign_key_check;\")\n \ + \ violations = cursor.fetchall()\n if not violations: break\n\ + \ for table, rowid, parent, fkid in violations:\n \ + \ cursor.execute(f\"DELETE FROM {table} WHERE rowid = ?\", (rowid,))\n\ + \ cursor.execute(\"SELECT session_key, entry_json, current_session_id\ + \ FROM session_nodes WHERE status = \\\"running\\\"\")\n rows\ + \ = cursor.fetchall()\n agent_id = os.path.basename(os.path.dirname(os.path.dirname(db)))\n\ + \ for sk, ej, csid in rows:\n try:\n \ + \ p = json.loads(ej) if ej else {}\n \ + \ sid = csid or p.get(\"sessionId\")\n if sid:\n\ + \ ev = cursor.execute(\"SELECT seq, event_json FROM\ + \ transcript_events WHERE session_id = ? ORDER BY seq DESC LIMIT 1\", (sid,)).fetchone()\n\ + \ if ev:\n ev_seq,\ + \ ev_raw = ev\n try:\n \ + \ ev_data = json.loads(ev_raw)\n \ + \ msg = ev_data.get(\"message\") or ev_data\n \ + \ if msg.get(\"role\") == \"user\":\n \ + \ prompt_text = extract_prompt(msg)\n \ + \ ctx = p.get(\"restartRecoveryDeliveryContext\") or p.get(\"delivery\"\ + , {}).get(\"context\") or p.get(\"delivery\", {}).get(\"route\", {}).get(\"context\"\ + ) or {}\n interrupted_turns.append({\n\ + \ \"agent\": agent_id,\n \ + \ \"session_key\": sk,\n \ + \ \"session_id\": sid,\n \ + \ \"context\": ctx,\n \ + \ \"prompt\": prompt_text\n \ + \ })\n cursor.execute(\"PRAGMA foreign_keys\ + \ = ON\")\n cursor.execute(\"DELETE FROM\ + \ transcript_events WHERE session_id = ? AND seq = ?\", (sid, ev_seq))\n \ + \ except Exception as ex:\n \ + \ print(f\"[recover_sessions] Error parsing event: {ex}\", file=sys.stderr)\n\ + \ p[\"status\"] = \"done\"\n \ + \ p[\"activeWriterRunId\"] = None\n p[\"activeClaimRunId\"\ + ] = None\n p[\"restartRecoveryDeliveryRunId\"] = None\n\ + \ cursor.execute(\"UPDATE session_nodes SET status =\ + \ \\\"done\\\", entry_json = ? WHERE session_key = ?\", (json.dumps(p), sk))\n\ + \ cursor.execute(\"UPDATE session_nodes SET entry_valid\ + \ = 1 WHERE session_key = ?\", (sk,))\n recovered +=\ + \ 1\n except Exception: pass\n cursor.execute(\"\ + UPDATE session_windows SET status = \\\"done\\\" WHERE status = \\\"running\\\"\ + \")\n conn.commit()\n conn.close()\n \ + \ except Exception as e:\n print(f\"[recover_sessions]\ + \ Warning for {db}: {e}\", file=sys.stderr)\n\n if interrupted_turns:\n\ + \ try:\n with open(\"/tmp/openclaw-interrupted-turns.json\"\ + , \"w\") as f:\n json.dump(interrupted_turns, f, indent=2)\n\ + \ print(f\"[recover_sessions] Detected {len(interrupted_turns)}\ + \ interrupted user turn(s) saved to /tmp/openclaw-interrupted-turns.json\")\n\ + \ except Exception as e:\n print(f\"[recover_sessions]\ + \ Error writing interrupted turns: {e}\", file=sys.stderr)\n\n print(f\"\ + [recover_sessions] Completed in {time.time() - t0:.2f}s ({recovered} wedged sessions\ + \ recovered)\")\n" + dedup_subagent_vectors.py: " #!/usr/bin/env python3\n import glob,\ + \ os, sqlite3, sys\n\n vec_path = \"/app/node_modules/sqlite-vec-linux-x64/vec0.so\"\ + \n for db in sorted(glob.glob(\"/home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite\"\ + )):\n agent = os.path.basename(os.path.dirname(os.path.dirname(db)))\n\ + \ if agent == \"main\":\n continue\n \ + \ try:\n conn = sqlite3.connect(db, timeout=10.0)\n \ + \ if os.path.exists(vec_path):\n conn.enable_load_extension(True)\n\ + \ conn.load_extension(vec_path)\n cur =\ + \ conn.cursor()\n chk = cur.execute(\"SELECT count(*) FROM memory_index_chunks\"\ + ).fetchone()[0]\n if chk > 0:\n print(f\"\ + [dedup_subagents] Purging {chk} duplicated vector chunks from agent {agent}...\"\ + )\n for t in [\n \"memory_index_sources\"\ + ,\n \"memory_index_chunks\",\n \ + \ \"memory_index_chunk_recall_metadata\",\n \"memory_index_chunk_provenance\"\ + ,\n \"memory_entry_origins\",\n \ + \ \"memory_embedding_cache\",\n \"memory_index_chunks_vec\"\ + \n ]:\n try: cur.execute(f\"DELETE\ + \ FROM {t}\")\n except Exception: pass\n \ + \ conn.commit()\n cur.execute(\"VACUUM\")\n \ + \ print(f\"[dedup_subagents] Reclaimed disk space for agent {agent}\"\ + )\n conn.close()\n except Exception as e:\n \ + \ print(f\"[dedup_subagents] Notice for {agent}: {e}\", file=sys.stderr)\n" + replay_interrupted_turns.py: " #!/usr/bin/env python3\n import\ + \ json, os, subprocess, sys, time, urllib.request\n\n INTERRUPTED_FILE\ + \ = \"/tmp/openclaw-interrupted-turns.json\"\n\n if not os.path.exists(INTERRUPTED_FILE):\n\ + \ sys.exit(0)\n\n try:\n with open(INTERRUPTED_FILE,\ + \ \"r\") as f:\n turns = json.load(f)\n except Exception\ + \ as e:\n print(f\"[replay_interrupted_turns] Failed to read {INTERRUPTED_FILE}:\ + \ {e}\", file=sys.stderr)\n sys.exit(0)\n\n if not turns:\n\ + \ sys.exit(0)\n\n print(f\"[replay_interrupted_turns] Found\ + \ {len(turns)} interrupted turn(s). Waiting for gateway /healthz...\")\n\n \ + \ gateway_ready = False\n for _ in range(60):\n try:\n\ + \ with urllib.request.urlopen(\"http://127.0.0.1:18790/healthz\"\ + , timeout=3) as resp:\n if resp.status == 200:\n \ + \ gateway_ready = True\n break\n \ + \ except Exception:\n pass\n time.sleep(2)\n\ + \n if not gateway_ready:\n print(\"[replay_interrupted_turns]\ + \ Gateway did not become healthy in 120s. Aborting.\", file=sys.stderr)\n \ + \ sys.exit(1)\n\n # Allow 5s for Telegram ingress to bind\n\ + \ time.sleep(5)\n\n for turn in turns:\n sk = turn.get(\"\ + session_key\")\n sid = turn.get(\"session_id\")\n agent_id\ + \ = turn.get(\"agent\")\n ctx = turn.get(\"context\") or {}\n \ + \ prompt = turn.get(\"prompt\") or \"\"\n \n \ + \ channel = ctx.get(\"channel\") or \"telegram\"\n to_target =\ + \ ctx.get(\"to\") or \"\"\n thread_id = ctx.get(\"threadId\")\n \ + \ \n target = to_target\n if target.startswith(\"\ + telegram:\"):\n parts = target.split(\":\")\n \ + \ target = parts[1] if len(parts) > 1 else target\n\n print(f\"\ + [replay_interrupted_turns] Processing agent '{agent_id}' on session '{sk}' target='{target}'\ + \ thread='{thread_id}'\")\n \n # 1. Send status notification\ + \ to Telegram if target exists\n if target:\n notice\ + \ = \"\u26A0\uFE0F OpenClaw wurde w\xE4hrend der Bearbeitung neu gestartet \u2013\ + \ deine Anfrage wird jetzt nachgeholt...\"\n notify_cmd = [\n\ + \ \"openclaw\", \"message\", \"send\",\n \ + \ \"--channel\", channel,\n \"--target\", str(target),\n\ + \ \"-m\", notice\n ]\n \ + \ if thread_id is not None:\n notify_cmd.extend([\"--thread-id\"\ + , str(thread_id)])\n try:\n subprocess.run(notify_cmd,\ + \ check=False, timeout=30)\n print(f\"[replay_interrupted_turns]\ + \ Sent recovery notice to {target}\")\n except Exception as e:\n\ + \ print(f\"[replay_interrupted_turns] Notice failed: {e}\"\ + , file=sys.stderr)\n\n # 2. Replay agent turn\n if sk\ + \ and prompt:\n p_short = (prompt[:60] + \"...\") if len(prompt)\ + \ > 60 else prompt\n print(f\"[replay_interrupted_turns] Replaying\ + \ agent turn: {p_short}\")\n agent_cmd = [\n \ + \ \"openclaw\", \"agent\",\n \"--session-key\", sk,\n\ + \ \"-m\", prompt,\n \"--deliver\"\n\ + \ ]\n try:\n res = subprocess.run(agent_cmd,\ + \ capture_output=True, text=True, timeout=300)\n if res.returncode\ + \ == 0:\n print(f\"[replay_interrupted_turns] Turn replay\ + \ succeeded for {sk}\")\n else:\n \ + \ print(f\"[replay_interrupted_turns] Turn replay exited with code {res.returncode}:\ + \ {res.stderr[:200]}\", file=sys.stderr)\n except Exception as\ + \ e:\n print(f\"[replay_interrupted_turns] Replay execution\ + \ error: {e}\", file=sys.stderr)\n\n try:\n os.remove(INTERRUPTED_FILE)\n\ + \ print(f\"[replay_interrupted_turns] Cleaned up {INTERRUPTED_FILE}\"\ + )\n except Exception:\n pass\n" + patch_garmin_mcp.py: "import os\n\np = \"/home/node/.openclaw/mcp-venv/lib/python3.12/site-packages/garmin_mcp/workouts.py\"\ + \nif os.path.exists(p):\n with open(p, \"r\") as f:\n c = f.read()\n\ + \ if \"_normalize_sport_type\" not in c:\n patch = '''\nSPORT_TYPE_MAPPINGS\ + \ = {\n \"running\": {\"sportTypeId\": 1, \"sportTypeKey\": \"running\", \"\ + displayOrder\": 1},\n \"cycling\": {\"sportTypeId\": 2, \"sportTypeKey\": \"\ + cycling\", \"displayOrder\": 2},\n \"other\": {\"sportTypeId\": 3, \"sportTypeKey\"\ + : \"other\", \"displayOrder\": 3},\n \"lap_swimming\": {\"sportTypeId\": 4,\ + \ \"sportTypeKey\": \"lap_swimming\", \"displayOrder\": 4},\n \"swimming\"\ + : {\"sportTypeId\": 4, \"sportTypeKey\": \"lap_swimming\", \"displayOrder\": 4},\n\ + \ \"strength_training\": {\"sportTypeId\": 5, \"sportTypeKey\": \"strength_training\"\ + , \"displayOrder\": 5},\n \"cardio_training\": {\"sportTypeId\": 6, \"sportTypeKey\"\ + : \"cardio_training\", \"displayOrder\": 6},\n \"cardio\": {\"sportTypeId\"\ + : 6, \"sportTypeKey\": \"cardio_training\", \"displayOrder\": 6},\n \"yoga\"\ + : {\"sportTypeId\": 7, \"sportTypeKey\": \"yoga\", \"displayOrder\": 8},\n \ + \ \"pilates\": {\"sportTypeId\": 8, \"sportTypeKey\": \"pilates\", \"displayOrder\"\ + : 9},\n \"hiit\": {\"sportTypeId\": 9, \"sportTypeKey\": \"hiit\", \"displayOrder\"\ + : 7},\n \"mobility\": {\"sportTypeId\": 11, \"sportTypeKey\": \"mobility\"\ + , \"displayOrder\": 11},\n \"walking\": {\"sportTypeId\": 12, \"sportTypeKey\"\ + : \"walking\", \"displayOrder\": 10},\n \"rucking\": {\"sportTypeId\": 13,\ + \ \"sportTypeKey\": \"rucking\", \"displayOrder\": 12},\n}\nSPORT_ID_MAPPINGS\ + \ = {v[\"sportTypeId\"]: v for v in SPORT_TYPE_MAPPINGS.values()}\n\ndef _resolve_sport_block(st):\n\ + \ if isinstance(st, str):\n k = st.strip().lower()\n if k in\ + \ SPORT_TYPE_MAPPINGS:\n return dict(SPORT_TYPE_MAPPINGS[k])\n elif\ + \ isinstance(st, dict):\n key = st.get(\"sportTypeKey\")\n sid =\ + \ st.get(\"sportTypeId\")\n if key and str(key).strip().lower() in SPORT_TYPE_MAPPINGS:\n\ + \ base = dict(SPORT_TYPE_MAPPINGS[str(key).strip().lower()])\n \ + \ if sid is not None and sid != 0 and sid != base[\"sportTypeId\"]:\n \ + \ raise ValueError(f\"sportType mismatch: {key} vs {sid}\")\n \ + \ return base\n if sid is not None and sid in SPORT_ID_MAPPINGS:\n\ + \ return dict(SPORT_ID_MAPPINGS[sid])\n return None\n\ndef _normalize_sport_type(workout_data:\ + \ dict) -> None:\n resolved = _resolve_sport_block(workout_data.get(\"sportType\"\ + ))\n segments = workout_data.get(\"workoutSegments\") or []\n if not resolved\ + \ and segments:\n for seg in segments:\n resolved = _resolve_sport_block(seg.get(\"\ + sportType\"))\n if resolved:\n break\n if not resolved:\n\ + \ raise ValueError(\"Missing or invalid sportType. Both sportTypeId and\ + \ sportTypeKey are required.\")\n workout_data[\"sportType\"] = resolved\n\ + \ for seg in segments:\n st = _resolve_sport_block(seg.get(\"sportType\"\ + ))\n seg[\"sportType\"] = st if st else dict(resolved)\n\n'''\n \ + \ t = \"def _normalize_workout_steps(workout_data: dict) -> None:\"\n if\ + \ t in c:\n with open(p, \"w\") as f:\n f.write(c.replace(t,\ + \ patch + t + \"\\n _normalize_sport_type(workout_data)\", 1))\n \ + \ print(\"Successfully patched garmin_mcp workouts.py!\")\n" + patch_perplexity.mjs: "import fs from \"node:fs\";\nimport path from \"node:path\"\ + ;\nimport { globSync } from \"node:fs\";\n\nconst baseDir = \"/home/node/.openclaw/extensions/perplexity/dist\"\ + ;\nif (fs.existsSync(baseDir)) {\n const files = fs.readdirSync(baseDir).filter(f\ + \ => f.startsWith(\"perplexity-web-search-provider.runtime-\") && f.endsWith(\"\ + .js\"));\n for (const filename of files) {\n const file = path.join(baseDir,\ + \ filename);\n let code = fs.readFileSync(file, \"utf8\");\n if (!code.includes(\"\ + /* PATCHED_CHAT_COMPLETIONS */\")) {\n const target = \"const structured\ + \ = runtime.transport === \\\"search_api\\\";\";\n const fastPath = `const\ + \ structured = runtime.transport === \"search_api\"; /* PATCHED_CHAT_COMPLETIONS\ + \ */\n if (!structured) {\n const cacheKey = buildSearchCacheKey([\n\ + \ \"perplexity\",\n runtime.transport,\n runtime.baseUrl,\n\ + \ runtime.model,\n query,\n freshness\n \ + \ ]);\n const cacheTtlMs = resolveSearchCacheTtlMs(searchConfig);\n\ + \ const cached = readCachedSearchPayload(cacheKey, cacheTtlMs);\n \ + \ if (cached) return cached;\n const start = Date.now();\n \ + \ const timeoutSeconds = resolveSearchTimeoutSeconds(searchConfig);\n \ + \ const result = await runPerplexitySearch({\n query,\n \ + \ apiKey: runtime.apiKey,\n baseUrl: runtime.baseUrl,\n \ + \ model: runtime.model,\n timeoutSeconds,\n signal,\n\ + \ freshness\n });\n const payload = {\n \ + \ query,\n provider: \"perplexity\",\n model: runtime.model,\n\ + \ tookMs: Date.now() - start,\n externalContent: {\n \ + \ untrusted: true,\n source: \"web_search\",\n \ + \ provider: \"perplexity\",\n wrapped: true\n },\n\ + \ content: wrapWebContent(result.content, \"web_search\"),\n \ + \ citations: result.citations\n };\n writeCachedSearchPayload(cacheKey,\ + \ payload);\n return payload;\n }`;\n if (code.includes(target))\ + \ {\n code = code.replace(target, fastPath);\n fs.writeFileSync(file,\ + \ code, \"utf8\");\n console.log(\"Patched perplexity runtime for chat\ + \ completions:\", file);\n }\n }\n }\n}\n" + file_cli.py: "#!/home/node/.openclaw/mcp-venv/bin/python3\nimport sys, os, mimetypes,\ + \ filetype\n\ndef get_file_info(filepath, mime_only=False):\n if not os.path.exists(filepath):\n\ + \ return \"cannot open (No such file or directory)\", \"cannot open (No\ + \ such file or directory)\"\n if os.path.isdir(filepath):\n return \"\ + directory\", \"inode/directory\"\n kind = filetype.guess(filepath)\n if\ + \ kind is not None:\n return f\"{kind.extension.upper()} image/media data\ + \ ({kind.mime})\", kind.mime\n guessed_mime, _ = mimetypes.guess_type(filepath)\n\ + \ try:\n with open(filepath, \"rb\") as f:\n sample = f.read(4096)\n\ + \ if len(sample) == 0:\n return \"empty\", \"application/x-empty\"\ + \n try:\n sample.decode(\"utf-8\")\n if guessed_mime:\n\ + \ return f\"{guessed_mime} text\", guessed_mime\n return\ + \ \"ASCII text\", \"text/plain\"\n except UnicodeDecodeError:\n \ + \ return \"data\", \"application/octet-stream\"\n except Exception as e:\n\ + \ return f\"cannot read ({e})\", \"application/octet-stream\"\n\ndef main():\n\ + \ args = sys.argv[1:]\n brief, mime_only, files = False, False, []\n \ + \ for arg in args:\n if arg in (\"-b\", \"--brief\"):\n brief\ + \ = True\n elif arg in (\"-i\", \"--mime\", \"--mime-type\"):\n \ + \ mime_only = True\n elif arg.startswith(\"-\") and len(arg) > 1 and\ + \ not arg.startswith(\"--\"):\n if \"b\" in arg: brief = True\n \ + \ if \"i\" in arg: mime_only = True\n else:\n files.append(arg)\n\ + \ if not files:\n sys.stderr.write(\"Usage: file [-b] [-i|--mime-type]\ + \ ...\\n\")\n sys.exit(1)\n for f in files:\n desc, mime\ + \ = get_file_info(f, mime_only)\n res = mime if mime_only else desc\n \ + \ print(res if brief else f\"{f}: {res}\")\n\nif __name__ == \"__main__\"\ + :\n main()\n" + compact_sessions.py: "#!/usr/bin/env python3\n\"\"\"\nNightly multi-agent session\ + \ maintenance and compaction script for OpenClaw.\n1. Pre-warms OS page cache\ + \ for SQLite databases on spinning disks.\n2. Recovers any wedged or locked sessions\ + \ via recover_sessions.py.\n3. Prunes abandoned isolated cron sessions (>48h old)\ + \ to prevent token/state bloat.\n4. Tier A Hard-Reset: Resets koch, hebamme, and\ + \ shopping topics to 0 tokens (clean archive).\n5. Tier B Smart-Compaction: Compacts\ + \ active sessions exceeding token thresholds (5s pacing).\n6. Checkpoints SQLite\ + \ WAL journals across all agent databases to disk.\n7. Optimizes SQLite query\ + \ planner without blocking full VACUUM.\n\"\"\"\nimport glob\nimport json\nimport\ + \ os\nimport sqlite3\nimport subprocess\nimport sys\nimport time\n\nTHRESHOLD_TOKENS\ + \ = 15000\nTHRESHOLD_TRANSCRIPT_BYTES = 200000\nTHRESHOLD_EVENT_COUNT = 30\nCRON_MAX_AGE_HOURS\ + \ = 48\nRPC_TIMEOUT_MS = 180000\n\n# Tracking Channels: Deterministic sliding-window\ + \ (mila_tracker, nutrition_tracker).\n# Strict sliding window of ~5-8 events (2-3\ + \ turns max), 0 LLM tokens, instant truncation.\nTRACKING_TARGETS = [\n (\"\ + mila_tracker\", \"agent:mila_tracker:telegram:group:-1004326921510:topic:2796\"\ + ),\n (\"nutrition_tracker\", \"agent:nutrition_tracker:telegram:group:-1004326921510:topic:2797\"\ + ),\n]\nMAX_TRACKING_EVENTS = 8\nMAX_TRACKING_LINES = 8\n\n# Tier A: High-frequency\ + \ interaction topics (koch, hebamme, shopping).\n# Deep-compaction keeps a compact\ + \ summary + latest 2 turns without completely wiping conversational memory.\n\ + TIER_A_TARGETS = [\n (\"koch\", \"agent:koch:telegram:group:-1004326921510:topic:21\"\ + ),\n (\"hebamme\", \"agent:hebamme:telegram:group:-1004326921510:topic:22\"\ + ),\n (\"shopping\", \"agent:shopping:telegram:group:-1004326921510:topic:115\"\ + ),\n]\n\ndef prewarm_page_cache():\n print(\"=== Pre-warming SQLite databases\ + \ into OS page cache ===\")\n t0 = time.time()\n try:\n subprocess.run(\n\ + \ \"cat /home/node/.openclaw/state/openclaw.sqlite /home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite\ + \ > /dev/null 2>&1 || true\",\n shell=True,\n timeout=90.0\n\ + \ )\n print(f\"Page cache pre-warmed in {time.time() - t0:.2f}s\"\ + )\n except Exception as e:\n print(f\"Page cache pre-warming warning:\ + \ {e}\")\n\ndef prune_stale_cron_sessions():\n print(f\"=== Pruning isolated\ + \ cron sessions older than {CRON_MAX_AGE_HOURS}h ===\")\n cutoff_ms = int(time.time()\ + \ * 1000) - (CRON_MAX_AGE_HOURS * 3600 * 1000)\n total_pruned = 0\n total_tokens_reclaimed\ + \ = 0\n\n for db in sorted(glob.glob(\"/home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite\"\ + )):\n agent = db.split(\"/\")[5]\n try:\n conn = sqlite3.connect(db,\ + \ timeout=30.0)\n conn.execute(\"PRAGMA foreign_keys = ON;\")\n \ + \ cursor = conn.cursor()\n cursor.execute(\"SELECT name FROM\ + \ sqlite_master WHERE type=\\\"table\\\"\")\n all_tables = set(r[0]\ + \ for r in cursor.fetchall())\n\n cursor.execute(\"SELECT session_key,\ + \ current_session_id, updated_at, entry_json FROM session_nodes WHERE session_key\ + \ LIKE \\\"%:cron:%\\\"\")\n stale = []\n for k, sid, up,\ + \ ej in cursor.fetchall():\n if up and up < cutoff_ms:\n \ + \ tok = 0\n if ej:\n try:\n\ + \ tok = json.loads(ej).get(\"totalTokens\", 0) or 0\n\ + \ except Exception:\n pass\n\ + \ stale.append((k, sid, tok))\n\n if stale:\n \ + \ tokens_reclaimed = sum(t[2] for t in stale)\n for\ + \ k, sid, _ in stale:\n for t in [\"trajectory_runtime_events\"\ + , \"transcript_events\", \"transcript_event_identities\", \"session_transcript_active_events\"\ + , \"transcript_rewrite_watermarks\", \"session_transcript_index_state\", \"session_transcript_fts\"\ + , \"session_conversations\"]:\n if t in all_tables and\ + \ sid:\n cursor.execute(f\"DELETE FROM {t} WHERE session_id\ + \ = ?\", (sid,))\n for t in [\"session_participants\", \"heartbeat_outcomes\"\ + , \"session_progress_cards\", \"board_widgets\", \"board_tabs\"]:\n \ + \ if t in all_tables:\n cursor.execute(f\"\ + DELETE FROM {t} WHERE session_key = ?\", (k,))\n if \"memory_entry_origins\"\ + \ in all_tables:\n cursor.execute(\"DELETE FROM memory_entry_origins\ + \ WHERE session_key = ? OR session_id = ?\", (k, sid or \"\"))\n \ + \ if \"session_windows\" in all_tables:\n cursor.execute(\"\ + DELETE FROM session_windows WHERE session_key = ? OR session_id = ?\", (k, sid\ + \ or \"\"))\n cursor.execute(\"DELETE FROM session_nodes WHERE\ + \ session_key = ?\", (k,))\n conn.commit()\n total_pruned\ + \ += len(stale)\n total_tokens_reclaimed += tokens_reclaimed\n\ + \ print(f\" [{agent}] Pruned {len(stale)} dead cron sessions ({tokens_reclaimed}\ + \ tokens reclaimed)\")\n\n # Unconditionally resolve any dangling foreign\ + \ key references across all tables\n while True:\n cursor.execute(\"\ + PRAGMA foreign_key_check;\")\n violations = cursor.fetchall()\n\ + \ if not violations:\n break\n \ + \ for table, rowid, parent, fkid in violations:\n cursor.execute(f\"\ + DELETE FROM {table} WHERE rowid = ?\", (rowid,))\n conn.commit()\n\ + \ conn.close()\n except Exception as e:\n print(f\"\ + \ [{agent}] Pruning error: {e}\")\n\n # Clear resolved quarantine entries\ + \ if all databases are healthy\n try:\n q_path = \"/home/node/.openclaw/state/openclaw-quarantine.sqlite\"\ + \n if os.path.exists(q_path):\n q_conn = sqlite3.connect(q_path)\n\ + \ q_cur = q_conn.cursor()\n q_cur.execute(\"DELETE FROM\ + \ quarantined_databases\")\n q_conn.commit()\n q_conn.close()\n\ + \ except Exception as e:\n print(f\"Quarantine cleanup error: {e}\"\ + )\n\n print(f\"Cron pruning complete: {total_pruned} sessions pruned, {total_tokens_reclaimed}\ + \ tokens reclaimed.\")\n\ndef compact_tracking_sessions():\n print(\"=== Tracking\ + \ Channels Sliding-Window Maintenance (mila_tracker, nutrition_tracker) ===\"\ + )\n for agent, key in TRACKING_TARGETS:\n db_path = f\"/home/node/.openclaw/agents/{agent}/agent/openclaw-agent.sqlite\"\ + \n if not os.path.exists(db_path):\n continue\n try:\n\ + \ con = sqlite3.connect(db_path, timeout=5.0)\n row = con.execute(\"\ + SELECT current_session_id FROM session_nodes WHERE session_key=?\", (key,)).fetchone()\n\ + \ if not row or not row[0]:\n con.close()\n \ + \ print(f\" [{agent}] No active session node found for {key}.\")\n \ + \ continue\n sid = row[0]\n cnt = con.execute(\"\ + SELECT count(*) FROM transcript_events WHERE session_id=?\", (sid,)).fetchone()[0]\n\ + \ con.close()\n\n if cnt > MAX_TRACKING_EVENTS:\n \ + \ print(f\" [{agent}] Session {key} has {cnt} events (> {MAX_TRACKING_EVENTS}).\ + \ Truncating to last {MAX_TRACKING_LINES} lines...\")\n cmd = [\n\ + \ \"openclaw\", \"sessions\", \"compact\", key,\n \ + \ \"--agent\", agent,\n \"--max-lines\", str(MAX_TRACKING_LINES),\n\ + \ \"--timeout\", \"30000\"\n ]\n \ + \ r = subprocess.run(cmd, capture_output=True, text=True)\n \ + \ if r.returncode == 0:\n print(f\" \u2713 Truncated successfully:\ + \ {r.stdout.strip()}\")\n else:\n print(f\"\ + \ \u2717 Truncation failed: {r.stderr.strip()}\")\n else:\n \ + \ print(f\" [{agent}] Session {key} has {cnt} events (<= {MAX_TRACKING_EVENTS}).\ + \ Clean.\")\n except Exception as e:\n print(f\" \u2717 [{agent}]\ + \ Error during tracking compaction: {e}\")\n\ndef compact_tier_a_sessions():\n\ + \ print(\"=== Tier A: Deep-Compaction (koch, hebamme, shopping) ===\")\n \ + \ for agent, key in TIER_A_TARGETS:\n db_path = f\"/home/node/.openclaw/agents/{agent}/agent/openclaw-agent.sqlite\"\ + \n if not os.path.exists(db_path):\n continue\n try:\n\ + \ con = sqlite3.connect(db_path, timeout=10.0)\n row = con.execute(\"\ + SELECT current_session_id FROM session_nodes WHERE session_key=?\", (key,)).fetchone()\n\ + \ con.close()\n if not row or not row[0]:\n \ + \ print(f\" [Tier A] {agent} ({key}) already at 0 (no active session).\")\n\ + \ continue\n ev_cnt, ev_bytes = get_session_metrics(agent,\ + \ key, row[0])\n if ev_cnt <= 2 and ev_bytes < 20000:\n \ + \ print(f\" [Tier A] {agent} ({key}) has only {ev_cnt} events ({ev_bytes}\ + \ bytes), skipping.\")\n continue\n print(f\" [Tier\ + \ A] Deep-compacting {agent} ({key}) [{ev_cnt} events, {ev_bytes//1024}KB]...\"\ + )\n r = subprocess.run(\n [\"openclaw\", \"sessions\"\ + , \"compact\", key, \"--agent\", agent, \"--timeout\", str(RPC_TIMEOUT_MS)],\n\ + \ capture_output=True, text=True\n )\n if\ + \ r.returncode == 0:\n print(f\" \u2713 Deep-compacted: {r.stdout.strip()}\"\ + )\n elif \"Already compacted\" in r.stderr or \"Already compacted\"\ + \ in r.stdout:\n print(f\" \u2713 Already compacted.\")\n \ + \ else:\n print(f\" \u2717 Standard compact error:\ + \ {r.stderr.strip()}; retrying with --max-lines 40...\")\n fb =\ + \ subprocess.run(\n [\"openclaw\", \"sessions\", \"compact\"\ + , key, \"--agent\", agent, \"--max-lines\", \"40\", \"--timeout\", str(RPC_TIMEOUT_MS)],\n\ + \ capture_output=True, text=True\n )\n \ + \ if fb.returncode == 0:\n print(f\" \u2713 Truncation\ + \ fallback success: {fb.stdout.strip()}\")\n else:\n \ + \ print(f\" \u2717 Truncation fallback failed: {fb.stderr.strip()}\"\ + )\n except Exception as e:\n print(f\" \u2717 Exception deep-compacting\ + \ {agent}: {e}\")\n time.sleep(2)\n\ndef get_session_metrics(agent, key,\ + \ sid=None):\n db_path = f\"/home/node/.openclaw/agents/{agent}/agent/openclaw-agent.sqlite\"\ + \n if not os.path.exists(db_path):\n return 0, 0\n try:\n \ + \ con = sqlite3.connect(db_path, timeout=5.0)\n cur = con.cursor()\n \ + \ if not sid:\n row = cur.execute(\"SELECT current_session_id\ + \ FROM session_nodes WHERE session_key=?\", (key,)).fetchone()\n sid\ + \ = row[0] if row else None\n if not sid:\n con.close()\n \ + \ return 0, 0\n ev_cnt, ev_bytes = cur.execute(\n \"\ + SELECT count(*), coalesce(sum(length(event_json)), 0) FROM transcript_events WHERE\ + \ session_id=?\", \n (sid,)\n ).fetchone()\n con.close()\n\ + \ return ev_cnt, ev_bytes\n except Exception:\n return 0, 0\n\ + \ndef compact_active_sessions():\n excluded_keys = set(t[1] for t in TIER_A_TARGETS)\ + \ | set(t[1] for t in TRACKING_TARGETS)\n print(f\"=== Tier B: Running Multi-Agent\ + \ Compaction (threshold: {THRESHOLD_TOKENS} tokens / {THRESHOLD_TRANSCRIPT_BYTES//1024}KB,\ + \ LLM summarization) ===\")\n res = subprocess.run([\"openclaw\", \"sessions\"\ + , \"--all-agents\", \"--json\"], capture_output=True, text=True)\n if res.returncode\ + \ != 0:\n print(f\"Failed to list sessions: {res.stderr}\")\n return\n\ + \n sessions = json.loads(res.stdout).get(\"sessions\", [])\n compacted =\ + \ 0\n skipped = 0\n\n for s in sessions:\n key = s.get(\"key\", \"\ + \")\n agent = s.get(\"agentId\") or \"main\"\n tokens = s.get(\"\ + totalTokens\") or 0\n sid = s.get(\"sessionId\")\n\n # Skip Tier\ + \ A and Tracking agents as they have dedicated routines\n if key in excluded_keys:\n\ + \ continue\n\n # Target main sessions and all telegram sessions\ + \ (topics and direct)\n is_target = (\n key == \"agent:main:main\"\ + \ or \n \":telegram:\" in key or\n (key.startswith(\"agent:\"\ + ) and key.endswith(\":main\"))\n )\n if is_target and not key.endswith(\"\ + :heartbeat\"):\n ev_cnt, ev_bytes = get_session_metrics(agent, key,\ + \ sid)\n needs_compaction = (\n tokens >= THRESHOLD_TOKENS\ + \ or\n ev_bytes >= THRESHOLD_TRANSCRIPT_BYTES or\n \ + \ (tokens == 0 and ev_cnt >= THRESHOLD_EVENT_COUNT)\n )\n \ + \ if needs_compaction:\n stat_str = f\"{tokens} tokens\" if\ + \ tokens else f\"{ev_bytes//1024}KB / {ev_cnt} events\"\n print(f\"\ + Compacting {agent} ({stat_str}) -> {key}...\")\n c_res = subprocess.run(\n\ + \ [\"openclaw\", \"sessions\", \"compact\", key, \"--agent\"\ + , agent, \"--timeout\", str(RPC_TIMEOUT_MS)],\n capture_output=True,\ + \ text=True\n )\n if c_res.returncode == 0:\n \ + \ print(f\" \u2713 {c_res.stdout.strip()}\")\n \ + \ compacted += 1\n elif \"Already compacted\" in c_res.stderr\ + \ or \"Already compacted\" in c_res.stdout:\n print(f\" \u2713\ + \ Already compacted.\")\n skipped += 1\n else:\n\ + \ print(f\" \u2717 {c_res.stderr.strip()}; retrying with --max-lines\ + \ 80 fallback...\")\n fb_res = subprocess.run(\n \ + \ [\"openclaw\", \"sessions\", \"compact\", key, \"--agent\", agent,\ + \ \"--max-lines\", \"80\", \"--timeout\", str(RPC_TIMEOUT_MS)],\n \ + \ capture_output=True, text=True\n )\n \ + \ if fb_res.returncode == 0:\n print(f\" \u2713\ + \ (fallback) {fb_res.stdout.strip()}\")\n compacted +=\ + \ 1\n else:\n print(f\" \u2717 Fallback\ + \ failed: {fb_res.stderr.strip()}\")\n time.sleep(5) # 5s pause\ + \ to avoid rotational HDD I/O saturation\n else:\n skipped\ + \ += 1\n\n print(f\"Compaction complete: {compacted} compacted, {skipped} skipped.\"\ + )\n\ndef checkpoint_wal_journals():\n print(\"=== Checkpointing SQLite WAL\ + \ journals across all agent databases ===\")\n dbs = [\"/home/node/.openclaw/state/openclaw.sqlite\"\ + ] + glob.glob(\"/home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite\")\n\ + \ wal_freed = 0\n for db in dbs:\n wal = db + \"-wal\"\n if\ + \ os.path.exists(wal):\n sz = os.path.getsize(wal)\n try:\n\ + \ con = sqlite3.connect(db, timeout=30.0)\n con.execute(\"\ + PRAGMA wal_checkpoint(TRUNCATE);\")\n con.close()\n \ + \ wal_freed += sz\n except Exception as e:\n print(f\"\ + \ \u2717 Error checkpointing {db}: {e}\")\n print(f\"WAL Checkpoint complete:\ + \ {wal_freed / (1024*1024):.2f} MB merged to disk.\")\n\ndef vacuum_and_optimize():\n\ + \ print(\"=== Running SQLite OPTIMIZE across all databases ===\")\n dbs\ + \ = [\"/home/node/.openclaw/state/openclaw.sqlite\"] + glob.glob(\"/home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite\"\ + )\n for db in dbs:\n try:\n con = sqlite3.connect(db, timeout=30.0)\n\ + \ con.execute(\"PRAGMA optimize;\")\n con.close()\n \ + \ except Exception as e:\n print(f\" \u2717 Error optimizing {db}:\ + \ {e}\")\n print(\"SQLite optimization complete.\")\n\ndef main():\n prewarm_page_cache()\n\ + \ try:\n subprocess.run([\"python3\", \"/home/node/.openclaw/scripts/recover_sessions.py\"\ + ], check=False)\n except Exception:\n pass\n prune_stale_cron_sessions()\n\ + \ compact_tracking_sessions()\n compact_tier_a_sessions()\n compact_active_sessions()\n\ + \ checkpoint_wal_journals()\n vacuum_and_optimize()\n\nif __name__ == \"\ + __main__\":\n main()\n" + compact_tracking_sessions.py: "#!/usr/bin/env python3\n\"\"\"\nLightweight sliding-window\ + \ compaction for OpenClaw tracking channels:\n- mila_tracker (topic 2796)\n- nutrition_tracker\ + \ (topic 2797)\n\nMaintains a strict sliding window of ~5-8 transcript events\ + \ (max 2-3 turns).\nUses native gateway truncation (--max-lines 8) requiring 0\ + \ LLM tokens and 0 external API calls.\n\"\"\"\nimport os\nimport sqlite3\nimport\ + \ subprocess\nimport sys\nimport time\n\nMAX_TRACKING_EVENTS = 8\nMAX_TRACKING_LINES\ + \ = 8\nTIMEOUT_MS = 30000\n\nTRACKING_TARGETS = [\n (\"mila_tracker\", \"agent:mila_tracker:telegram:group:-1004326921510:topic:2796\"\ + ),\n (\"nutrition_tracker\", \"agent:nutrition_tracker:telegram:group:-1004326921510:topic:2797\"\ + ),\n]\n\ndef check_and_compact_tracking():\n compacted_count = 0\n skipped_count\ + \ = 0\n\n for agent, key in TRACKING_TARGETS:\n db_path = f\"/home/node/.openclaw/agents/{agent}/agent/openclaw-agent.sqlite\"\ + \n if not os.path.exists(db_path):\n continue\n try:\n\ + \ con = sqlite3.connect(db_path, timeout=5.0)\n row = con.execute(\"\ + SELECT current_session_id FROM session_nodes WHERE session_key=?\", (key,)).fetchone()\n\ + \ if not row or not row[0]:\n con.close()\n \ + \ continue\n sid = row[0]\n cnt = con.execute(\"\ + SELECT count(*) FROM transcript_events WHERE session_id=?\", (sid,)).fetchone()[0]\n\ + \ con.close()\n\n if cnt > MAX_TRACKING_EVENTS:\n \ + \ print(f\"[{agent}] Session {key} has {cnt} events (threshold {MAX_TRACKING_EVENTS}).\ + \ Truncating to last {MAX_TRACKING_LINES} lines...\")\n cmd = [\n\ + \ \"openclaw\", \"sessions\", \"compact\", key,\n \ + \ \"--agent\", agent,\n \"--max-lines\", str(MAX_TRACKING_LINES),\n\ + \ \"--timeout\", str(TIMEOUT_MS)\n ]\n \ + \ res = subprocess.run(cmd, capture_output=True, text=True)\n \ + \ if res.returncode == 0:\n print(f\" \u2713 [{agent}]\ + \ Truncated successfully: {res.stdout.strip()}\")\n compacted_count\ + \ += 1\n else:\n print(f\" \u2717 [{agent}]\ + \ Truncation failed: {res.stderr.strip()}\", file=sys.stderr)\n else:\n\ + \ skipped_count += 1\n except Exception as e:\n \ + \ print(f\"[{agent}] Error checking session: {e}\", file=sys.stderr)\n\n \ + \ if compacted_count > 0:\n print(f\"Tracking maintenance: {compacted_count}\ + \ sessions truncated, {skipped_count} within window.\")\n\nif __name__ == \"__main__\"\ + :\n check_and_compact_tracking()\n" + sync_crons.py: "#!/usr/bin/env python3\n\"\"\"\nsync_crons.py\nIdempotently reconciles\ + \ declarative OpenClaw automations defined in crons.yaml\nwith the running OpenClaw\ + \ gateway state.\n\nCan run directly inside the container or remotely via kubectl\ + \ exec.\n\"\"\"\n\nimport json\nimport os\nimport subprocess\nimport sys\nimport\ + \ yaml\n\ndef find_crons_file():\n candidates = [\n os.environ.get(\"\ + CRONS_FILE\"),\n \"crons.yaml\",\n \"k8s/openclaw/crons.yaml\",\n\ + \ \"/home/node/.openclaw/scripts/crons.yaml\",\n os.path.join(os.path.dirname(__file__),\ + \ \"../crons.yaml\"),\n os.path.join(os.path.dirname(__file__), \"crons.yaml\"\ + ),\n ]\n for c in candidates:\n if c and os.path.exists(c):\n \ + \ return os.path.abspath(c)\n raise FileNotFoundError(\"Could not find\ + \ crons.yaml. Pass via CRONS_FILE environment variable.\")\n\ndef is_inside_container():\n\ + \ return os.path.exists(\"/home/node/.openclaw\") or os.environ.get(\"OPENCLAW_HOME\"\ + ) is not None\n\ndef run_openclaw_cmd(args):\n if is_inside_container():\n\ + \ cmd = [\"openclaw\"] + args\n else:\n namespace = os.environ.get(\"\ + NAMESPACE\", \"openclaw\")\n pod = os.environ.get(\"POD_NAME\", \"openclaw-0\"\ + )\n container = os.environ.get(\"CONTAINER_NAME\", \"openclaw\")\n \ + \ cmd = [\"kubectl\", \"exec\", \"-n\", namespace, pod, \"-c\", container,\ + \ \"--\", \"openclaw\"] + args\n \n res = subprocess.run(cmd, capture_output=True,\ + \ text=True)\n if res.returncode != 0:\n raise RuntimeError(f\"OpenClaw\ + \ CLI command failed ({' '.join(cmd)}):\\n{res.stderr}\\n{res.stdout}\")\n \ + \ return res.stdout\n\ndef list_existing_jobs():\n raw = run_openclaw_cmd([\"\ + cron\", \"list\", \"--json\"])\n try:\n data = json.loads(raw)\n \ + \ return data.get(\"jobs\", [])\n except Exception as e:\n print(f\"\ + Warning: could not parse cron list json: {e}\\nRaw output: {raw[:300]}\", file=sys.stderr)\n\ + \ return []\n\ndef reconcile_jobs():\n file_path = find_crons_file()\n\ + \ print(f\"=== Syncing OpenClaw Crons-as-Code from {file_path} ===\")\n \ + \ \n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n spec =\ + \ yaml.safe_load(f)\n\n declarations = spec.get(\"jobs\", [])\n existing_jobs\ + \ = list_existing_jobs()\n \n print(f\"Found {len(declarations)} declared\ + \ jobs in YAML, {len(existing_jobs)} active jobs on gateway.\")\n\n for job\ + \ in declarations:\n name = job.get(\"name\")\n decl_key = job.get(\"\ + declarationKey\") or name\n desc = job.get(\"description\", \"\")\n \ + \ sched = job.get(\"schedule\", {})\n \n # Match existing job\ + \ by declarationKey or exact name\n match = next((j for j in existing_jobs\ + \ if j.get(\"declarationKey\") == decl_key or j.get(\"name\") == name), None)\n\ + \ \n if match:\n existing_id = match.get(\"id\")\n \ + \ print(f\"Removing existing job '{name}' (ID {existing_id}) for idempotent\ + \ recreation...\")\n try:\n run_openclaw_cmd([\"cron\"\ + , \"rm\", existing_id])\n except Exception as e:\n print(f\"\ + Warning removing {existing_id}: {e}\")\n\n # Build add command\n \ + \ cmd = [\n \"cron\", \"add\",\n \"--name\", name,\n \ + \ \"--declaration-key\", decl_key,\n \"--description\", desc,\n\ + \ ]\n\n if sched.get(\"kind\") == \"every\":\n cmd.extend([\"\ + --every\", sched.get(\"every\", \"15m\")])\n elif sched.get(\"kind\") ==\ + \ \"cron\":\n cmd.extend([\"--cron\", sched.get(\"expr\", \"* * * *\ + \ *\")])\n if sched.get(\"tz\"):\n cmd.extend([\"--tz\"\ + , sched.get(\"tz\")])\n\n if job.get(\"session\"):\n cmd.extend([\"\ + --session\", job.get(\"session\")])\n\n if job.get(\"delivery\") == \"\ + none\":\n cmd.append(\"--no-deliver\")\n\n if job.get(\"command\"\ + ):\n cmd.extend([\"--command\", job.get(\"command\")])\n\n if\ + \ job.get(\"agent\"):\n cmd.extend([\"--agent\", job.get(\"agent\"\ + )])\n\n if job.get(\"model\"):\n cmd.extend([\"--model\", job.get(\"\ + model\")])\n\n if job.get(\"channel\"):\n cmd.extend([\"--channel\"\ + , job.get(\"channel\")])\n\n if job.get(\"to\"):\n cmd.extend([\"\ + --to\", job.get(\"to\")])\n\n if job.get(\"threadId\"):\n cmd.extend([\"\ + --thread-id\", str(job.get(\"threadId\"))])\n\n if job.get(\"announce\"\ + ):\n cmd.append(\"--announce\")\n\n if job.get(\"message\"):\n\ + \ cmd.extend([\"--message\", job.get(\"message\")])\n\n print(f\"\ + Registering job '{name}'...\")\n run_openclaw_cmd(cmd)\n print(f\"\ + Successfully registered '{name}'.\")\n\n print(\"=== OpenClaw Crons-as-Code\ + \ reconciliation complete! ===\")\n\nif __name__ == \"__main__\":\n reconcile_jobs()\n" + triage.py: "#!/usr/bin/env python3\n\"\"\"\nopenclaw-triage.py: Rapid zero-dependency\ + \ incident triage for OpenClaw multi-agent sessions.\nDirectly inspects ground-truth\ + \ SQLite session state and transcript events in < 1 second.\n\"\"\"\nimport argparse\n\ + import glob\nimport json\nimport os\nimport sqlite3\nimport sys\nimport time\n\ + \nTOPIC_TO_AGENT = {\n \"20\": \"fitness\",\n \"21\": \"koch\",\n \"\ + 22\": \"hebamme\",\n \"51\": \"travel\",\n \"115\": \"shopping\",\n \"\ + 116\": \"regensburg\",\n \"117\": \"recherche\",\n \"118\": \"doktor\",\n\ + \ \"119\": \"itguy\",\n \"164\": \"grabengasse_media\",\n \"2796\": \"\ + mila_tracker\",\n \"2797\": \"nutrition_tracker\",\n}\n\ndef parse_args():\n\ + \ parser = argparse.ArgumentParser(description=\"Rapid OpenClaw multi-agent\ + \ session triage.\")\n parser.add_argument(\"--topic\", \"-t\", help=\"Telegram\ + \ forum topic ID (e.g. 21, 22, 117)\")\n parser.add_argument(\"--agent\", \"\ + -a\", help=\"Agent identifier (e.g. koch, hebamme, recherche)\")\n parser.add_argument(\"\ + --limit\", \"-n\", type=int, default=10, help=\"Number of recent events to display\ + \ (default: 10)\")\n parser.add_argument(\"--db-root\", default=\"/home/node/.openclaw/agents\"\ + , help=\"Root path of agent SQLite databases\")\n return parser.parse_args()\n\ + \ndef triage_agent_session(agent, topic_id=None, limit=10, db_root=\"/home/node/.openclaw/agents\"\ + ):\n db_path = os.path.join(db_root, agent, \"agent\", \"openclaw-agent.sqlite\"\ + )\n if not os.path.exists(db_path):\n print(f\"[-] Database not found\ + \ for agent '{agent}': {db_path}\")\n return False\n\n try:\n \ + \ con = sqlite3.connect(db_path, timeout=5.0)\n except Exception as e:\n \ + \ print(f\"[-] Failed to connect to SQLite DB for agent '{agent}': {e}\"\ + )\n return False\n\n cur = con.cursor()\n # Find matching session\n\ + \ if topic_id:\n target_pattern = f\"%topic:{topic_id}%\"\n cur.execute(\n\ + \ \"SELECT session_key, current_session_id, status, updated_at, entry_json\ + \ FROM session_nodes WHERE session_key LIKE ? AND session_key NOT LIKE '%:heartbeat'\ + \ ORDER BY updated_at DESC LIMIT 1\",\n (target_pattern,)\n \ + \ )\n else:\n cur.execute(\n \"SELECT session_key, current_session_id,\ + \ status, updated_at, entry_json FROM session_nodes WHERE session_key NOT LIKE\ + \ '%:heartbeat' ORDER BY updated_at DESC LIMIT 1\"\n )\n\n row = cur.fetchone()\n\ + \ if not row:\n print(f\"[-] No session found in {agent} DB (filter:\ + \ topic={topic_id})\")\n con.close()\n return False\n\n skey,\ + \ sid, status, updated_at_ms, entry_json = row\n now_ms = time.time() * 1000\n\ + \ age_min = (now_ms - updated_at_ms) / 60000.0 if updated_at_ms else 0.0\n\n\ + \ entry = {}\n if entry_json:\n try:\n entry = json.loads(entry_json)\n\ + \ except Exception:\n pass\n\n tokens = entry.get(\"totalTokens\"\ + , \"?\")\n model = entry.get(\"model\", \"default\")\n last_run_id = entry.get(\"\ + activeWriterRunId\") or entry.get(\"activeRunId\", None)\n\n # Detect anomalies\n\ + \ badges = []\n if isinstance(tokens, int):\n if tokens > 60000:\n\ + \ badges.append(\"\U0001F6A8 [CRITICAL_CONTEXT_BLOAT: >60k tokens]\"\ + )\n elif tokens > 20000:\n badges.append(\"\u26A0\uFE0F [HIGH_CONTEXT_TOKENS:\ + \ >20k tokens]\")\n if status == \"running\" and age_min > 5.0:\n badges.append(\"\ + \U0001F512 [POSSIBLY_WEDGED_RUNNING: updated >5m ago]\")\n elif status == \"\ + processing\":\n badges.append(\"\u26A1 [ACTIVE_PROCESSING]\")\n\n #\ + \ Check ingress queue status\n state_db = \"/home/node/.openclaw/state/openclaw.sqlite\"\ + \n if topic_id and os.path.exists(state_db):\n try:\n s_con\ + \ = sqlite3.connect(state_db, timeout=2.0)\n lane_pat = f\"%topic:{topic_id}%\"\ + \n pending_cnt = s_con.execute(\n \"SELECT count(*)\ + \ FROM channel_ingress_events WHERE lane_key LIKE ? AND status IN ('pending',\ + \ 'claimed')\",\n (lane_pat,)\n ).fetchone()[0]\n \ + \ s_con.close()\n if pending_cnt > 0:\n badges.append(f\"\ + \U0001F4EC [INGRESS_STALLED: {pending_cnt} message(s) pending]\")\n except\ + \ Exception:\n pass\n\n print(\"=\" * 72)\n print(f\"\U0001F3AF\ + \ AGENT: {agent.upper():<12} | TOPIC: {topic_id or 'N/A':<6} | STATUS: {status.upper()}\"\ + )\n print(f\" SESSION KEY: {skey}\")\n print(f\" SESSION ID: {sid}\"\ + )\n print(f\" MODEL: {model}\")\n print(f\" TOKENS: {tokens}\ + \ | LAST UPDATED: {age_min:.1f}m ago\")\n if badges:\n print(f\" ANOMALIES:\ + \ {' '.join(badges)}\")\n print(\"=\" * 72)\n\n # Query transcript events\n\ + \ cur.execute(\n \"SELECT seq, created_at, event_json FROM transcript_events\ + \ WHERE session_id = ? ORDER BY seq DESC LIMIT ?\",\n (sid, limit)\n \ + \ )\n events = cur.fetchall()\n con.close()\n\n if not events:\n \ + \ print(\" (No transcript events found)\")\n return True\n\n events.reverse()\n\ + \ print(\"\\n\U0001F4DC RECENT TRANSCRIPT EVENTS (Chronological):\")\n \n\ + \ last_role = None\n for seq, ca_ms, ej_str in events:\n try:\n \ + \ ev = json.loads(ej_str)\n except Exception:\n print(f\"\ + [{seq}] \")\n continue\n\n etype = ev.get(\"\ + type\")\n if etype != \"message\":\n continue\n\n msg\ + \ = ev.get(\"message\", {})\n role = msg.get(\"role\")\n last_role\ + \ = role\n content = msg.get(\"content\", [])\n\n if role == \"\ + user\":\n txt = content if isinstance(content, str) else json.dumps(content)\n\ + \ # Check for audio transcript\n if isinstance(content,\ + \ str) and \"[Audio]\" in content:\n print(f\"\\n\U0001F449 [SEQ\ + \ {seq}] \U0001F3A4 USER AUDIO PROMPT:\")\n for line in content.splitlines()[:6]:\n\ + \ print(f\" {line}\")\n if len(content.splitlines())\ + \ > 6:\n print(\" ...\")\n else:\n \ + \ txt_preview = txt.replace(\"\\n\", \" \")[:240]\n print(f\"\ + \\n\U0001F449 [SEQ {seq}] \U0001F464 USER: {txt_preview}\")\n\n elif role\ + \ == \"assistant\":\n print(f\"\\n\U0001F916 [SEQ {seq}] ASSISTANT\ + \ TURN:\")\n if isinstance(content, list):\n for item\ + \ in content:\n if not isinstance(item, dict):\n \ + \ continue\n itype = item.get(\"type\")\n \ + \ if itype == \"thinking\":\n th = item.get(\"\ + thinking\", \"\").replace(\"\\n\", \" \")\n print(f\" \ + \ \U0001F9E0 THINKING: {th[:280]}...\")\n elif itype == \"\ + toolCall\":\n tname = item.get(\"name\", \"unknown\")\n\ + \ targs = json.dumps(item.get(\"arguments\", {}))\n \ + \ print(f\" \u2699\uFE0F TOOL CALL: {tname}({targs[:160]})\"\ + )\n elif itype == \"text\":\n tx = item.get(\"\ + text\", \"\")\n lines = tx.splitlines()\n \ + \ prev = lines[0][:150] if lines else \"\"\n \ + \ print(f\" \U0001F4AC TEXT OUTPUT: {prev}...\")\n elif isinstance(content,\ + \ str):\n print(f\" \U0001F4AC TEXT OUTPUT: {content[:200]}...\"\ + )\n\n elif role == \"toolResult\":\n is_err = ev.get(\"isError\"\ + , False)\n tname = ev.get(\"details\", {}).get(\"tool\") or msg.get(\"\ + toolName\", \"tool\")\n res_txt = json.dumps(content) if not isinstance(content,\ + \ str) else content\n if is_err or \"error\" in res_txt.lower() or\ + \ \"must have required property\" in res_txt:\n print(f\" \u274C\ + \ [SEQ {seq}] TOOL ERROR ({tname}): {res_txt[:260]}\")\n else:\n \ + \ print(f\" \u2705 [SEQ {seq}] TOOL RESULT ({tname}): {res_txt[:180]}\"\ + )\n\n if last_role == \"user\":\n print(\"\\n\u26A0\uFE0F WARNING: The\ + \ last event in the transcript is an UNANSWERED USER MESSAGE!\")\n print(\"\ + \ The agent turn either crashed, timed out, or was killed before producing a\ + \ response.\")\n\n print(\"\\n\" + \"=\" * 72)\n return True\n\ndef main():\n\ + \ args = parse_args()\n if not args.topic and not args.agent:\n print(\"\ + Usage: openclaw-triage.py (--topic | --agent ) [--limit ]\")\n \ + \ sys.exit(1)\n\n agent = args.agent\n topic = args.topic\n\n if\ + \ topic and not agent:\n agent = TOPIC_TO_AGENT.get(str(topic))\n \ + \ if not agent:\n # Search all DBs\n for a, t in TOPIC_TO_AGENT.items():\n\ + \ if t == topic:\n agent = a\n \ + \ break\n\n if not agent:\n # Scan all DBs for the topic\n \ + \ for db in sorted(glob.glob(os.path.join(args.db_root, \"*/agent/openclaw-agent.sqlite\"\ + ))):\n cand_agent = db.split(os.sep)[-3]\n try:\n \ + \ con = sqlite3.connect(db, timeout=2.0)\n cur = con.cursor()\n\ + \ cur.execute(\n \"SELECT session_key FROM session_nodes\ + \ WHERE session_key LIKE ? LIMIT 1\",\n (f\"%topic:{topic}%\"\ + ,)\n )\n if cur.fetchone():\n \ + \ agent = cand_agent\n con.close()\n break\n\ + \ con.close()\n except Exception:\n pass\n\ + \n if not agent:\n print(f\"[-] Could not map topic '{topic}' to any\ + \ known OpenClaw agent.\")\n sys.exit(1)\n\n success = triage_agent_session(agent,\ + \ topic_id=topic, limit=args.limit, db_root=args.db_root)\n sys.exit(0 if success\ + \ else 1)\n\nif __name__ == \"__main__\":\n main()\n" + crons.yaml: "# Declarative Crons-as-Code for OpenClaw (Haumdaucher)\n# Reconciled\ + \ idempotently via k8s/openclaw/scripts/sync_crons.py\n\nversion: 1\njobs:\n \ + \ # 1. Maintenance & State Truncation\n - name: \"tracking-session-sliding-window\"\ + \n declarationKey: \"tracking-session-sliding-window\"\n description: \"\ + Lightweight sliding-window truncation (max 8 events) for mila_tracker and nutrition_tracker\"\ + \n schedule:\n kind: \"every\"\n every: \"15m\"\n session: \"\ + isolated\"\n delivery: \"none\"\n command: \"python3 /home/node/.openclaw/scripts/compact_tracking_sessions.py\"\ + \n\n - name: \"nightly-session-compaction\"\n declarationKey: \"nightly-session-compaction\"\ + \n description: \"Nightly multi-agent session compaction and SQLite WAL checkpointing\"\ + \n schedule:\n kind: \"cron\"\n expr: \"45 4 * * *\"\n tz: \"\ + Europe/Berlin\"\n session: \"isolated\"\n delivery: \"none\"\n command:\ + \ \"python3 /home/node/.openclaw/scripts/compact_sessions.py\"\n\n # 2. Family\ + \ Dashboards & Web Analytics\n - name: \"dashboards-periodic-publish\"\n declarationKey:\ + \ \"dashboards-periodic-publish\"\n description: \"Periodically regenerates\ + \ and uploads Mila & Moritz family HTML dashboards to S3\"\n schedule:\n \ + \ kind: \"every\"\n every: \"10m\"\n session: \"isolated\"\n delivery:\ + \ \"none\"\n command: \"sh -lc 'export PATH=/home/node/.openclaw/bin:$PATH;\ + \ cd /home/node/mop-skills/mop-skills/skills/datastore && uv run scripts/update_website.py\ + \ --data-dir /home/node/.openclaw/wiki/main/data && uv run scripts/update_moritz_website.py\ + \ --data-dir /home/node/.openclaw/wiki/main/data'\"\n\n # 3. Nightly Garmin Connect\ + \ Mirror\n - name: \"garmin-nightly-mirror\"\n declarationKey: \"garmin-nightly-mirror\"\ + \n description: \"N\xE4chtlicher deterministischer Spiegel der Garmin Connect\ + \ Daten (Aktivit\xE4ten, Daily Summary, Schlaf) in Git JSONL\"\n schedule:\n\ + \ kind: \"cron\"\n expr: \"30 3 * * *\"\n tz: \"Europe/Berlin\"\ + \n agent: \"fitness\"\n model: \"openrouter/deepseek/deepseek-v4.1-flash\"\ + \n session: \"isolated\"\n channel: \"telegram\"\n to: \"-1004326921510\"\ + \n threadId: \"20\"\n announce: true\n message: |\n F\xFChre den\ + \ n\xE4chtlichen Garmin Connect Sync durch.\n Vorgehen:\n 1. F\xFChre\ + \ den Garmin-Sync-Befehl aus:\n uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/garmin_sync.py\ + \ --days 2 --data-dir /home/node/.openclaw/wiki/main/data\n 2. Aktualisiere\ + \ die gerenderten Markdown-Ansichten:\n PYTHONPATH=/home/node/mop-skills/mop-skills/skills/datastore/scripts\ + \ uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/render_views.py\ + \ --data-dir /home/node/.openclaw/wiki/main/data --wiki-dir /home/node/.openclaw/wiki/main\n\ + \ 3. Aktualisiere das pers\xF6nliche Health & Nutrition Dashboard (moritz.html):\n\ + \ uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/update_moritz_website.py\ + \ --data-dir /home/node/.openclaw/wiki/main/data\n 4. Git Commit & Push im\ + \ Knowledge Wiki:\n cd /home/node/.openclaw/wiki/main && git add data/garmin/\ + \ entities/nutrition-log/ public/ && git diff --staged --quiet || (git commit\ + \ -m \"chore(garmin): automated nightly mirror [skip ci]\" && git push origin\ + \ main)\n 5. Finale Antwort:\n - Bei Erfolg: Gib exakt 'NO_REPLY'\ + \ aus (intentional silence, kein Telegram-Spam in der Nacht).\n - Nur\ + \ bei Authentifizierungsfehlern: Informiere kurz via Telegram (Thema #Sport),\ + \ dass ein Garmin-Re-Auth n\xF6tig ist, oder starte den Re-Auth-Flow.\n\n # 4.\ + \ Weekly Autonomous System & Error Audit\n - name: \"itguy-weekly-health-audit\"\ + \n declarationKey: \"itguy-weekly-health-audit\"\n description: \"W\xF6\ + chentlicher Self-Audit der OpenClaw-Logs, Tool-Failures und Session-Transkripte\ + \ mit Git-Commit-Korrelation\"\n schedule:\n kind: \"cron\"\n expr:\ + \ \"0 3 * * 0\"\n tz: \"Europe/Berlin\"\n agent: \"itguy\"\n model:\ + \ \"openrouter/deepseek/deepseek-v4.1-flash\"\n session: \"isolated\"\n \ + \ channel: \"telegram\"\n to: \"-1004326921510\"\n threadId: \"119\"\n \ + \ announce: true\n message: |\n F\xFChre den w\xF6chentlichen OpenClaw\ + \ System- und Log-Audit durch.\n Vorgehen:\n 1. F\xFChre den Audit-Befehl\ + \ aus:\n uv run /home/node/mop-skills/mop-skills/skills/openclaw-audit/scripts/audit_openclaw.py\ + \ --since 7d --write-report --add-task --git-push\n 2. Analysiere die Ausgabe\ + \ und korreliere eventuelle Fehler-Cluster mit den j\xFCngsten Commits in infrapuzzle,\ + \ mop-skills und knowledge-wiki.\n 3. Finale Antwort:\n - Wenn NEUE\ + \ Probleme gefunden oder Tasks in tasks/antigravity.md eingetragen wurden: Fasse\ + \ die Ergebnisse kurz, pr\xE4zise und l\xF6sungsorientiert zusammen (betroffene\ + \ Tools, vermutete Ursache, Link zur Task-Queue) und gib diese Zusammenfassung\ + \ als finale Antwort aus.\n - Wenn das System gesund ist und KEINE neuen\ + \ Tasks erzeugt wurden: Gib als finale Antwort exakt 'NO_REPLY' aus (intentional\ + \ silence, kein Telegram-Spam).\n\n # 5. Weekly AI Roundup (Recherche)\n - name:\ + \ \"weekly-ai-roundup\"\n declarationKey: \"weekly-ai-roundup:recherche\"\n\ + \ description: \"W\xF6chentlicher AI-Roundup und Tech-Scanning f\xFCr Topic\ + \ #Research\"\n schedule:\n kind: \"cron\"\n expr: \"30 6 * * 5\"\ + \n tz: \"Europe/Berlin\"\n agent: \"recherche\"\n model: \"openrouter/deepseek/deepseek-v4.1-flash\"\ + \n session: \"isolated\"\n channel: \"telegram\"\n to: \"-1004326921510\"\ + \n threadId: \"117\"\n announce: true\n message: |\n \U0001F5D3\uFE0F\ + \ W\xD6CHENTLICHER AI-ROUNDUP (Freitag). F\xFChre den in sources.md im Workspace\ + \ definierten Ablauf aus und poste das Ergebnis als EINE kompakte Telegram-Nachricht\ + \ in diesen Topic (#Research).\n\n 1) Hacker News: Algolia API \u2013 https://hn.algolia.com/api/v1/search_by_date?tags=story&numericFilters=points>150,created_at_i>{Unix-Timestamp\ + \ von vor 7 Tagen}&hitsPerPage=100 \u2192 daraus die KI-relevanten Top-Stories\ + \ nach Punkten ziehen.\n 2) Frontier-Labs pr\xFCfen: OpenAI, Anthropic, Google\ + \ DeepMind, Meta AI, Mistral, xAI.\n 3) China-Labs pr\xFCfen: GLM/Z.ai, Qwen,\ + \ DeepSeek, Moonshot/Kimi, MiniMax.\n 4) Tracker: Artificial Analysis Releases,\ + \ Hugging Face Trending, OpenRouter Rankings, LMArena.\n 5) Newsletter/Blogs:\ + \ The Batch, Import AI, Interconnects, Ahead of AI, Simon Willison, TLDR AI.\n\ + \ 6) GitHub: Trending (weekly) + neue Releases der Kern-Orgs (openai, anthropics,\ + \ google-deepmind, QwenLM, deepseek-ai, zai-org, meta-llama, mistralai).\n \ + \ 7) YouTube nur als Hype-Indikator (Titel/Snippets), KEINE Transkripte.\n\n\ + \ Ausgabe (Deutsch, Markdown, KEINE Tabellen):\n - Top-3-Highlights\ + \ der Woche (je 1 Satz + Link)\n - Danach Bullets je Kategorie: \u2460 Frontier-Modelle\ + \ \xB7 \u2461 China-Modelle \xB7 \u2462 Tools/Infra/Procedures \xB7 \u2463 Trends\ + \ (HN/GitHub/YouTube), je Eintrag genau 1 Quell-Link\n - Scope 60/40 (Modelle/Tools).\ + \ Wenn eine Kategorie nichts Neues hat: kurz 'nichts Neues'.\n - Am Ende\ + \ NUR falls n\xF6tig eine Zeile: welche Quelle in sources.md erg\xE4nzt/entfernt\ + \ werden sollte.\n\n Nutze web_search/web_fetch. Effort: medium.\n\n # 6.\ + \ Weekly Bridge Tracker (Holzgartensteg)\n - name: \"Recherche: Holzgartensteg\ + \ (w\xF6chentlich)\"\n declarationKey: \"recherche:holzgartensteg\"\n description:\ + \ \"W\xF6chentlicher Status-Check zum Holzgartensteg Regensburg via ALLRIS & Web\"\ + \n schedule:\n kind: \"cron\"\n expr: \"0 16 * * 5\"\n tz: \"\ + Europe/Berlin\"\n agent: \"main\"\n session: \"isolated\"\n channel:\ + \ \"telegram\"\n to: \"306373425\"\n announce: true\n message: |\n \ + \ W\xF6chentlicher Recherche-Task (Holzgartensteg, Stadt Regensburg).\n\n \ + \ AUFGABE: Pr\xFCfe, ob es NEUIGKEITEN zum geplanten Holzgartensteg (geplante\ + \ Fu\xDF-/Radbr\xFCcke zwischen Grieser Spitz und Maria-Beer-Platz / Weichs) gibt\ + \ \u2014 seit dem letzten Check bzw. den letzten ~7 Tagen.\n\n QUELLEN:\n\ + \ 1) ALLRIS via Skill 'regensburg-stadtrat': Script /home/node/mop-skills/mop-skills/skills/regensburg-stadtrat/scripts/regensburg_ris.py\ + \ \u2014 Befehle: search \"Holzgartensteg\" --limit 30 ; calendar --days 30 ;\ + \ vorlage ; session . Achte auf NEUE Vorlagen, Beschl\xFCsse, Anfragen\ + \ und Sitzungstermine (Ausschuss f\xFCr Stadtplanung, Verkehr und Wohnungsfragen\ + \ / Stadtrat).\n 2) Lokale Medien via web_search: regensburg-digital.de,\ + \ idowa.de, mittelbayerische.de, tvaktuell.com, regensburger-nachrichten.de.\n\ + \n FOKUS: neue Vorlagen/Beschl\xFCsse, Ausschuss-/Stadtrattermine, Mittel/Budget,\ + \ Planungsstand (Variante, Kosten, Termin), politische Positionen.\n\n BEKANNTER\ + \ STAND (nicht wiederholen, nur Abweichungen melden): 2020 aus Investitionsprogramm\ + \ gestrichen ('beerdigt'); Comeback ab 2025 (Gr\xFCne/Verb\xE4nde); Kommunalwahl\ + \ 2026 mehrere Parteien daf\xFCr; Haushalt 2026: ~100.000 EUR Planungsmittel im\ + \ Investitionsprogramm, Stadtrat-Beschluss 26.02.2026, Genehmigung Regierung der\ + \ Oberpfalz 06.03.2026; Koalitionsvereinbarung 2026 mit Wiederaufnahme der Planungen.\n\ + \n AUSGABE: Kurz auf Deutsch an Moritz. Falls echte Neuigkeiten: 3-6 Bullets\ + \ mit Quelle+Link. Falls NICHTS Neues: eine kurze Zeile, z.B. 'Holzgartensteg:\ + \ keine neuen Entwicklungen diese Woche.' Kein Hintergrund-Recycling.\n" diff --git a/k8s/openclaw/cronjob-wiki-backup.secret.yaml b/k8s/openclaw/cronjob-wiki-backup.secret.yaml index 663b255ebc6c4702a0a40798fc9ea2223d43df4f..9f223f250f1ef2f34fc1f3b5f35bcfef57bd88a3 100644 GIT binary patch literal 8406 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 Lrt3d2%OhDVc^&=z diff --git a/k8s/openclaw/crons.yaml b/k8s/openclaw/crons.yaml new file mode 100644 index 0000000..886d9b8 --- /dev/null +++ b/k8s/openclaw/crons.yaml @@ -0,0 +1,154 @@ +# Declarative Crons-as-Code for OpenClaw (Haumdaucher) +# Reconciled idempotently via k8s/openclaw/scripts/sync_crons.py + +version: 1 +jobs: + # 1. Maintenance & State Truncation + - name: "tracking-session-sliding-window" + declarationKey: "tracking-session-sliding-window" + description: "Lightweight sliding-window truncation (max 8 events) for mila_tracker and nutrition_tracker" + schedule: + kind: "every" + every: "15m" + session: "isolated" + delivery: "none" + command: "python3 /home/node/.openclaw/scripts/compact_tracking_sessions.py" + + - name: "nightly-session-compaction" + declarationKey: "nightly-session-compaction" + description: "Nightly multi-agent session compaction and SQLite WAL checkpointing" + schedule: + kind: "cron" + expr: "45 4 * * *" + tz: "Europe/Berlin" + session: "isolated" + delivery: "none" + command: "python3 /home/node/.openclaw/scripts/compact_sessions.py" + + # 2. Family Dashboards & Web Analytics + - name: "dashboards-periodic-publish" + declarationKey: "dashboards-periodic-publish" + description: "Periodically regenerates and uploads Mila & Moritz family HTML dashboards to S3" + schedule: + kind: "every" + every: "10m" + session: "isolated" + delivery: "none" + command: "sh -lc 'export PATH=/home/node/.openclaw/bin:$PATH; cd /home/node/mop-skills/mop-skills/skills/datastore && uv run scripts/update_website.py --data-dir /home/node/.openclaw/wiki/main/data && uv run scripts/update_moritz_website.py --data-dir /home/node/.openclaw/wiki/main/data'" + + # 3. Nightly Garmin Connect Mirror + - name: "garmin-nightly-mirror" + declarationKey: "garmin-nightly-mirror" + description: "Nächtlicher deterministischer Spiegel der Garmin Connect Daten (Aktivitäten, Daily Summary, Schlaf) in Git JSONL" + schedule: + kind: "cron" + expr: "30 3 * * *" + tz: "Europe/Berlin" + agent: "fitness" + model: "openrouter/deepseek/deepseek-v4.1-flash" + session: "isolated" + channel: "telegram" + to: "-1004326921510" + threadId: "20" + announce: true + message: | + Führe den nächtlichen Garmin Connect Sync durch. + Vorgehen: + 1. Führe den Garmin-Sync-Befehl aus: + uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/garmin_sync.py --days 2 --data-dir /home/node/.openclaw/wiki/main/data + 2. Aktualisiere die gerenderten Markdown-Ansichten: + PYTHONPATH=/home/node/mop-skills/mop-skills/skills/datastore/scripts uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/render_views.py --data-dir /home/node/.openclaw/wiki/main/data --wiki-dir /home/node/.openclaw/wiki/main + 3. Aktualisiere das persönliche Health & Nutrition Dashboard (moritz.html): + uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/update_moritz_website.py --data-dir /home/node/.openclaw/wiki/main/data + 4. Git Commit & Push im Knowledge Wiki: + cd /home/node/.openclaw/wiki/main && git add data/garmin/ entities/nutrition-log/ public/ && git diff --staged --quiet || (git commit -m "chore(garmin): automated nightly mirror [skip ci]" && git push origin main) + 5. Finale Antwort: + - Bei Erfolg: Gib exakt 'NO_REPLY' aus (intentional silence, kein Telegram-Spam in der Nacht). + - Nur bei Authentifizierungsfehlern: Informiere kurz via Telegram (Thema #Sport), dass ein Garmin-Re-Auth nötig ist, oder starte den Re-Auth-Flow. + + # 4. Weekly Autonomous System & Error Audit + - name: "itguy-weekly-health-audit" + declarationKey: "itguy-weekly-health-audit" + description: "Wöchentlicher Self-Audit der OpenClaw-Logs, Tool-Failures und Session-Transkripte mit Git-Commit-Korrelation" + schedule: + kind: "cron" + expr: "0 3 * * 0" + tz: "Europe/Berlin" + agent: "itguy" + model: "openrouter/deepseek/deepseek-v4.1-flash" + session: "isolated" + channel: "telegram" + to: "-1004326921510" + threadId: "119" + announce: true + message: | + Führe den wöchentlichen OpenClaw System- und Log-Audit durch. + Vorgehen: + 1. Führe den Audit-Befehl aus: + uv run /home/node/mop-skills/mop-skills/skills/openclaw-audit/scripts/audit_openclaw.py --since 7d --write-report --add-task --git-push + 2. Analysiere die Ausgabe und korreliere eventuelle Fehler-Cluster mit den jüngsten Commits in infrapuzzle, mop-skills und knowledge-wiki. + 3. Finale Antwort: + - Wenn NEUE Probleme gefunden oder Tasks in tasks/antigravity.md eingetragen wurden: Fasse die Ergebnisse kurz, präzise und lösungsorientiert zusammen (betroffene Tools, vermutete Ursache, Link zur Task-Queue) und gib diese Zusammenfassung als finale Antwort aus. + - Wenn das System gesund ist und KEINE neuen Tasks erzeugt wurden: Gib als finale Antwort exakt 'NO_REPLY' aus (intentional silence, kein Telegram-Spam). + + # 5. Weekly AI Roundup (Recherche) + - name: "weekly-ai-roundup" + declarationKey: "weekly-ai-roundup:recherche" + description: "Wöchentlicher AI-Roundup und Tech-Scanning für Topic #Research" + schedule: + kind: "cron" + expr: "30 6 * * 5" + tz: "Europe/Berlin" + agent: "recherche" + model: "openrouter/deepseek/deepseek-v4.1-flash" + session: "isolated" + channel: "telegram" + to: "-1004326921510" + threadId: "117" + announce: true + message: | + 🗓️ WÖCHENTLICHER AI-ROUNDUP (Freitag). Führe den in sources.md im Workspace definierten Ablauf aus und poste das Ergebnis als EINE kompakte Telegram-Nachricht in diesen Topic (#Research). + + 1) Hacker News: Algolia API – https://hn.algolia.com/api/v1/search_by_date?tags=story&numericFilters=points>150,created_at_i>{Unix-Timestamp von vor 7 Tagen}&hitsPerPage=100 → daraus die KI-relevanten Top-Stories nach Punkten ziehen. + 2) Frontier-Labs prüfen: OpenAI, Anthropic, Google DeepMind, Meta AI, Mistral, xAI. + 3) China-Labs prüfen: GLM/Z.ai, Qwen, DeepSeek, Moonshot/Kimi, MiniMax. + 4) Tracker: Artificial Analysis Releases, Hugging Face Trending, OpenRouter Rankings, LMArena. + 5) Newsletter/Blogs: The Batch, Import AI, Interconnects, Ahead of AI, Simon Willison, TLDR AI. + 6) GitHub: Trending (weekly) + neue Releases der Kern-Orgs (openai, anthropics, google-deepmind, QwenLM, deepseek-ai, zai-org, meta-llama, mistralai). + 7) YouTube nur als Hype-Indikator (Titel/Snippets), KEINE Transkripte. + + Ausgabe (Deutsch, Markdown, KEINE Tabellen): + - Top-3-Highlights der Woche (je 1 Satz + Link) + - Danach Bullets je Kategorie: ① Frontier-Modelle · ② China-Modelle · ③ Tools/Infra/Procedures · ④ Trends (HN/GitHub/YouTube), je Eintrag genau 1 Quell-Link + - Scope 60/40 (Modelle/Tools). Wenn eine Kategorie nichts Neues hat: kurz 'nichts Neues'. + - Am Ende NUR falls nötig eine Zeile: welche Quelle in sources.md ergänzt/entfernt werden sollte. + + Nutze web_search/web_fetch. Effort: medium. + + # 6. Weekly Bridge Tracker (Holzgartensteg) + - name: "Recherche: Holzgartensteg (wöchentlich)" + declarationKey: "recherche:holzgartensteg" + description: "Wöchentlicher Status-Check zum Holzgartensteg Regensburg via ALLRIS & Web" + schedule: + kind: "cron" + expr: "0 16 * * 5" + tz: "Europe/Berlin" + agent: "main" + session: "isolated" + channel: "telegram" + to: "306373425" + announce: true + message: | + Wöchentlicher Recherche-Task (Holzgartensteg, Stadt Regensburg). + + AUFGABE: Prüfe, ob es NEUIGKEITEN zum geplanten Holzgartensteg (geplante Fuß-/Radbrücke zwischen Grieser Spitz und Maria-Beer-Platz / Weichs) gibt — seit dem letzten Check bzw. den letzten ~7 Tagen. + + QUELLEN: + 1) ALLRIS via Skill 'regensburg-stadtrat': Script /home/node/mop-skills/mop-skills/skills/regensburg-stadtrat/scripts/regensburg_ris.py — Befehle: search "Holzgartensteg" --limit 30 ; calendar --days 30 ; vorlage ; session . Achte auf NEUE Vorlagen, Beschlüsse, Anfragen und Sitzungstermine (Ausschuss für Stadtplanung, Verkehr und Wohnungsfragen / Stadtrat). + 2) Lokale Medien via web_search: regensburg-digital.de, idowa.de, mittelbayerische.de, tvaktuell.com, regensburger-nachrichten.de. + + FOKUS: neue Vorlagen/Beschlüsse, Ausschuss-/Stadtrattermine, Mittel/Budget, Planungsstand (Variante, Kosten, Termin), politische Positionen. + + BEKANNTER STAND (nicht wiederholen, nur Abweichungen melden): 2020 aus Investitionsprogramm gestrichen ('beerdigt'); Comeback ab 2025 (Grüne/Verbände); Kommunalwahl 2026 mehrere Parteien dafür; Haushalt 2026: ~100.000 EUR Planungsmittel im Investitionsprogramm, Stadtrat-Beschluss 26.02.2026, Genehmigung Regierung der Oberpfalz 06.03.2026; Koalitionsvereinbarung 2026 mit Wiederaufnahme der Planungen. + + AUSGABE: Kurz auf Deutsch an Moritz. Falls echte Neuigkeiten: 3-6 Bullets mit Quelle+Link. Falls NICHTS Neues: eine kurze Zeile, z.B. 'Holzgartensteg: keine neuen Entwicklungen diese Woche.' Kein Hintergrund-Recycling. diff --git a/k8s/openclaw/openclaw-instance.secret.yaml b/k8s/openclaw/openclaw-instance.secret.yaml index 0ebdcf78ccb081c6c11f20b7e33e9eb4d9b7054f..2a64040e7394435db86a6ec558f658024120ff90 100644 GIT binary patch literal 57205 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

?vKS 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

Z9woMbYs_ljr0_Fh=rBa3FA#832 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 /home/node/.openclaw/garmin_tokens/garmin_tokens.json + chmod 700 /home/node/.openclaw/garmin_tokens + chmod 600 /home/node/.openclaw/garmin_tokens/garmin_tokens.json +elif [ -s /home/node/.openclaw/garmin_tokens/garmin_tokens.json ]; then + echo "Preserving live Garmin OAuth tokens on PVC..." + chmod 700 /home/node/.openclaw/garmin_tokens + chmod 600 /home/node/.openclaw/garmin_tokens/garmin_tokens.json +fi + +# 5. Cleanup legacy binaries and superseded local skills +rm -rf /home/node/.openclaw/bin/whisper* /home/node/.openclaw/bin/.whisper* /home/node/.openclaw/scripts/whisper* /home/node/.openclaw/models/whisper || true +rm -rf /home/node/.openclaw/skills/memobird /home/node/.openclaw/skills/nerd-report /home/node/.openclaw/skills/rvv-regensburg /home/node/.openclaw/skills/skill-creator || true +rm -rf /home/node/.openclaw/workspace/skills /home/node/.openclaw/workspace-koch/skills /home/node/.openclaw/workspace-recherche/skills || true + +# 6. Ensure tools.allow and models.providers.openrouter.apiKey unset +openclaw config unset tools.allow || true +openclaw config unset models.providers.openrouter.apiKey || true +openclaw config unset agents.entries.mila_tracker.tools.profile || true +openclaw config unset agents.entries.nutrition_tracker.tools.profile || true + +# 7. Decouple hardlinked bootstrap files +for dir in /home/node/.openclaw/workspace-*; do + if [ -d "$dir" ]; then + for file in USER.md MEMORY.md; do + if [ -f "/home/node/.openclaw/workspace/$file" ]; then + cp --remove-destination "/home/node/.openclaw/workspace/$file" "$dir/$file" + chown node:node "$dir/$file" 2>/dev/null || true + chmod 664 "$dir/$file" 2>/dev/null || true + fi + done + fi +done + +# 8. Install CLI binaries +if [ ! -f "/home/node/.openclaw/bin/openhue.real" ]; then + echo "Installing openhue CLI binary..." + curl -sL https://github.com/openhue/openhue-cli/releases/download/0.24/openhue_Linux_x86_64.tar.gz | tar -xz -C /home/node/.openclaw/bin openhue + mv /home/node/.openclaw/bin/openhue /home/node/.openclaw/bin/openhue.real + printf '#!/bin/sh\nexport HOME=/home/node/.openclaw\nexec /home/node/.openclaw/bin/openhue.real "$@"\n' > /home/node/.openclaw/bin/openhue + chmod +x /home/node/.openclaw/bin/openhue /home/node/.openclaw/bin/openhue.real +fi + +if [ ! -f "/home/node/.openclaw/bin/summarize" ]; then + echo "Installing summarize CLI via npm..." + npm install -g --prefix /home/node/.openclaw @steipete/summarize || true +fi + +if [ ! -f "/home/node/.openclaw/bin/mcp-server-github" ]; then + echo "Installing @modelcontextprotocol/server-github via npm..." + npm install -g --prefix /home/node/.openclaw @modelcontextprotocol/server-github || true +fi + +if [ ! -f "/home/node/.openclaw/bin/kubectl" ]; then + echo "Installing kubectl CLI binary..." + curl -fsSL https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl -o /home/node/.openclaw/bin/kubectl + chmod +x /home/node/.openclaw/bin/kubectl +fi + +if [ ! -f "/home/node/.openclaw/bin/jq" ]; then + echo "Installing jq CLI binary..." + curl -fsSL https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64 -o /home/node/.openclaw/bin/jq + chmod +x /home/node/.openclaw/bin/jq +fi + +if [ ! -f "/home/node/.openclaw/bin/file" ]; then + echo "Setting up file CLI helper..." + cp "$SCRIPTS_DIR/file_cli.py" /home/node/.openclaw/bin/file + chmod +x /home/node/.openclaw/bin/file +fi + +if [ -x "/home/node/.openclaw/.local/bin/python3" ]; then + /home/node/.openclaw/bin/uv pip install --break-system-packages --python /home/node/.openclaw/.local/bin/python3 pillow google-api-python-client pypdf || true +fi + +# 9. Clone or pull infrapuzzle repository to PVC +mkdir -p /home/node/.openclaw/repos +if [ ! -d "/home/node/.openclaw/repos/infrapuzzle/.git" ]; then + echo "Cloning infrapuzzle repository to PVC..." + git clone --depth 1 "https://${GIT_SYNC_USERNAME}:${GIT_SYNC_PASSWORD}@git.moritzgraf.de/moritz/infrapuzzle.git" /home/node/.openclaw/repos/infrapuzzle || true +else + echo "Pulling latest infrapuzzle commits on PVC..." + git -C /home/node/.openclaw/repos/infrapuzzle pull origin master || git -C /home/node/.openclaw/repos/infrapuzzle pull origin main || true +fi + +# 10. Seed and maintain persistent mcp-venv +if [ ! -d "/home/node/.openclaw/mcp-venv" ]; then + echo "Seeding persistent mcp-venv..." + uv venv --python 3.12 /home/node/.openclaw/mcp-venv + uv pip install --python /home/node/.openclaw/mcp-venv \ + prometheus-mcp-server \ + ha-mcp \ + chuk-mcp-open-meteo \ + gitea-mcp \ + git+https://github.com/Taxuspt/garmin_mcp \ + "mcp>=2.0" \ + filetype \ + google-api-python-client \ + google-auth \ + bring-api \ + requests \ + beautifulsoup4 \ + youtube-transcript-api +fi + +if [ -d "/home/node/.openclaw/mcp-venv" ]; then + python3 -c 'import os; p="/home/node/.openclaw/mcp-venv/lib/python3.12/site-packages/mcp/server/fastmcp.py"; open(p, "w").write("import os\nfrom fastmcp import FastMCP as _FastMCP, Context\n\nclass FastMCP(_FastMCP):\n def __init__(self, name=\"MCP Server\", host=None, port=None, **kwargs):\n if host is not None: os.environ[\"FASTMCP_HOST\"] = str(host)\n if port is not None: os.environ[\"FASTMCP_PORT\"] = str(port)\n super().__init__(name=name, **kwargs)\n")' || true + python3 "$SCRIPTS_DIR/patch_garmin_mcp.py" || true +fi + +# 11. Extensions & Plugins +if [ ! -d "/home/node/.openclaw/extensions/perplexity" ]; then + echo "Installing perplexity plugin..." + openclaw plugins install clawhub:@openclaw/perplexity-plugin --accept-capabilities || true +fi +echo "Enabling memory-wiki plugin..." +openclaw plugins enable memory-wiki || true + +echo "Patching perplexity web search runtime for chat completions compatibility..." +node "$SCRIPTS_DIR/patch_perplexity.mjs" || true + +# 12. Ensure OpenRouter auth profile in state DB +echo "Ensuring OpenRouter auth profile in state DB..." +node --input-type=module -e ' + import { DatabaseSync } from "node:sqlite"; + const key = process.env.OPENROUTER_API_KEY; + if (key) { + try { + const dbPath = "/home/node/.openclaw/state/openclaw.sqlite"; + const db = new DatabaseSync(dbPath); + db.prepare("CREATE TABLE IF NOT EXISTS config_machine_state (state_key TEXT PRIMARY KEY, value_json TEXT NOT NULL, updated_at_ms INTEGER NOT NULL)").run(); + const row = db.prepare("SELECT value_json FROM config_machine_state WHERE state_key = \x27authProfiles.store\x27").get(); + let store = row?.value_json ? JSON.parse(row.value_json) : { version: 1, profiles: {} }; + if (!store.profiles) store.profiles = {}; + store.profiles["openrouter:default"] = { + type: "api_key", + provider: "openrouter", + key: key + }; + db.prepare("INSERT INTO config_machine_state (state_key, value_json, updated_at_ms) VALUES (\x27authProfiles.store\x27, ?, ?) ON CONFLICT(state_key) DO UPDATE SET value_json = excluded.value_json, updated_at_ms = excluded.updated_at_ms") + .run(JSON.stringify(store), Date.now()); + console.log("Synchronized openrouter auth profile in state DB."); + } catch (e) { + console.error("Could not sync auth profile:", e.message); + } + } +' || true + +# 13. Pre-warm SQLite page cache +echo "Pre-warming SQLite database files into OS page cache for instant cold start..." +cat /home/node/.openclaw/state/openclaw.sqlite /home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite > /dev/null 2>&1 || true + +echo "=== Bootstrap Complete ===" diff --git a/k8s/openclaw/scripts/dedup_subagent_vectors.py b/k8s/openclaw/scripts/dedup_subagent_vectors.py new file mode 100644 index 0000000..b4752ac --- /dev/null +++ b/k8s/openclaw/scripts/dedup_subagent_vectors.py @@ -0,0 +1,34 @@ + #!/usr/bin/env python3 + import glob, os, sqlite3, sys + + vec_path = "/app/node_modules/sqlite-vec-linux-x64/vec0.so" + for db in sorted(glob.glob("/home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite")): + agent = os.path.basename(os.path.dirname(os.path.dirname(db))) + if agent == "main": + continue + try: + conn = sqlite3.connect(db, timeout=10.0) + if os.path.exists(vec_path): + conn.enable_load_extension(True) + conn.load_extension(vec_path) + cur = conn.cursor() + chk = cur.execute("SELECT count(*) FROM memory_index_chunks").fetchone()[0] + if chk > 0: + print(f"[dedup_subagents] Purging {chk} duplicated vector chunks from agent {agent}...") + for t in [ + "memory_index_sources", + "memory_index_chunks", + "memory_index_chunk_recall_metadata", + "memory_index_chunk_provenance", + "memory_entry_origins", + "memory_embedding_cache", + "memory_index_chunks_vec" + ]: + try: cur.execute(f"DELETE FROM {t}") + except Exception: pass + conn.commit() + cur.execute("VACUUM") + print(f"[dedup_subagents] Reclaimed disk space for agent {agent}") + conn.close() + except Exception as e: + print(f"[dedup_subagents] Notice for {agent}: {e}", file=sys.stderr) diff --git a/k8s/openclaw/scripts/file_cli.py b/k8s/openclaw/scripts/file_cli.py new file mode 100644 index 0000000..cb1c199 --- /dev/null +++ b/k8s/openclaw/scripts/file_cli.py @@ -0,0 +1,50 @@ +#!/home/node/.openclaw/mcp-venv/bin/python3 +import sys, os, mimetypes, filetype + +def get_file_info(filepath, mime_only=False): + if not os.path.exists(filepath): + return "cannot open (No such file or directory)", "cannot open (No such file or directory)" + if os.path.isdir(filepath): + return "directory", "inode/directory" + kind = filetype.guess(filepath) + if kind is not None: + return f"{kind.extension.upper()} image/media data ({kind.mime})", kind.mime + guessed_mime, _ = mimetypes.guess_type(filepath) + try: + with open(filepath, "rb") as f: + sample = f.read(4096) + if len(sample) == 0: + return "empty", "application/x-empty" + try: + sample.decode("utf-8") + if guessed_mime: + return f"{guessed_mime} text", guessed_mime + return "ASCII text", "text/plain" + except UnicodeDecodeError: + return "data", "application/octet-stream" + except Exception as e: + return f"cannot read ({e})", "application/octet-stream" + +def main(): + args = sys.argv[1:] + brief, mime_only, files = False, False, [] + for arg in args: + if arg in ("-b", "--brief"): + brief = True + elif arg in ("-i", "--mime", "--mime-type"): + mime_only = True + elif arg.startswith("-") and len(arg) > 1 and not arg.startswith("--"): + if "b" in arg: brief = True + if "i" in arg: mime_only = True + else: + files.append(arg) + if not files: + sys.stderr.write("Usage: file [-b] [-i|--mime-type] ...\n") + sys.exit(1) + for f in files: + desc, mime = get_file_info(f, mime_only) + res = mime if mime_only else desc + print(res if brief else f"{f}: {res}") + +if __name__ == "__main__": + main() diff --git a/k8s/openclaw/scripts/gateway-preflight.mjs b/k8s/openclaw/scripts/gateway-preflight.mjs new file mode 100644 index 0000000..0c6b2f9 --- /dev/null +++ b/k8s/openclaw/scripts/gateway-preflight.mjs @@ -0,0 +1,78 @@ + import fs from "node:fs"; + import path from "node:path"; + import { execSync, spawn } from "node:child_process"; + + if (!process.env.__OPENCLAW_PREFLIGHT_DONE) { + process.env.__OPENCLAW_PREFLIGHT_DONE = "1"; + + const isGateway = process.argv.some(arg => arg.endsWith("openclaw.mjs") || arg.endsWith("openclaw")) && process.argv.includes("gateway"); + + if (isGateway) { + const t0 = Date.now(); + console.log("[gateway-preflight] Initializing container self-healing preflight..."); + + // 1. Clean up stale gateway lock files from ungraceful kills + for (const dir of ["/tmp/openclaw-1000", "/tmp"]) { + if (fs.existsSync(dir)) { + try { + const files = fs.readdirSync(dir); + for (const file of files) { + if (file.startsWith("gateway") && file.endsWith(".lock")) { + const fullPath = path.join(dir, file); + fs.unlinkSync(fullPath); + console.log(`[gateway-preflight] Removed stale lock: ${fullPath}`); + } + } + } catch (e) { + console.warn(`[gateway-preflight] Lock cleanup warning in ${dir}:`, e.message); + } + } + } + + // 2. Clear false database quarantines + const qPath = "/home/node/.openclaw/state/openclaw-quarantine.sqlite"; + if (fs.existsSync(qPath)) { + try { + execSync(`/home/node/.openclaw/.local/bin/python3 -c "import sqlite3; c=sqlite3.connect(\x27${qPath}\x27); c.execute(\x27DELETE FROM quarantined_databases\x27); c.commit(); c.close()"`, { stdio: "ignore" }); + console.log("[gateway-preflight] Cleared database quarantine."); + } catch (_) {} + } + + // 3. Deduplicate subagent vector databases (keeps non-main agent DBs < 15MB) + try { + execSync("/home/node/.openclaw/.local/bin/python3 /home/node/.openclaw/scripts/dedup_subagent_vectors.py", { stdio: "inherit" }); + } catch (e) { + console.warn("[gateway-preflight] Vector deduplication warning:", e.message); + } + + // 4. Pre-warm page cache sequentially (transforms random 70 IOPS disk reads into sequential streaming) + try { + const pw0 = Date.now(); + execSync("cat /home/node/.openclaw/state/openclaw.sqlite /home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite > /dev/null 2>&1 || true"); + console.log(`[gateway-preflight] Pre-warmed SQLite databases in ${Date.now() - pw0}ms`); + } catch (_) {} + + // 5. Recover any wedged running sessions left over from ungraceful container restart + try { + execSync("/home/node/.openclaw/.local/bin/python3 /home/node/.openclaw/scripts/recover_sessions.py", { stdio: "inherit" }); + } catch (e) { + console.warn("[gateway-preflight] Session recovery warning:", e.message); + } + + // 6. Spawn background turn replay daemon if interrupted turns were detected + try { + if (fs.existsSync("/tmp/openclaw-interrupted-turns.json")) { + console.log("[gateway-preflight] Spawning background turn replay daemon..."); + const child = spawn("/home/node/.openclaw/.local/bin/python3", ["/home/node/.openclaw/scripts/replay_interrupted_turns.py"], { + detached: true, + stdio: "ignore" + }); + child.unref(); + } + } catch (e) { + console.warn("[gateway-preflight] Could not spawn turn replay daemon:", e.message); + } + + console.log(`[gateway-preflight] Self-healing completed in ${Date.now() - t0}ms.`); + } + } diff --git a/k8s/openclaw/scripts/patch_garmin_mcp.py b/k8s/openclaw/scripts/patch_garmin_mcp.py new file mode 100644 index 0000000..eab89f7 --- /dev/null +++ b/k8s/openclaw/scripts/patch_garmin_mcp.py @@ -0,0 +1,64 @@ +import os + +p = "/home/node/.openclaw/mcp-venv/lib/python3.12/site-packages/garmin_mcp/workouts.py" +if os.path.exists(p): + with open(p, "r") as f: + c = f.read() + if "_normalize_sport_type" not in c: + patch = ''' +SPORT_TYPE_MAPPINGS = { + "running": {"sportTypeId": 1, "sportTypeKey": "running", "displayOrder": 1}, + "cycling": {"sportTypeId": 2, "sportTypeKey": "cycling", "displayOrder": 2}, + "other": {"sportTypeId": 3, "sportTypeKey": "other", "displayOrder": 3}, + "lap_swimming": {"sportTypeId": 4, "sportTypeKey": "lap_swimming", "displayOrder": 4}, + "swimming": {"sportTypeId": 4, "sportTypeKey": "lap_swimming", "displayOrder": 4}, + "strength_training": {"sportTypeId": 5, "sportTypeKey": "strength_training", "displayOrder": 5}, + "cardio_training": {"sportTypeId": 6, "sportTypeKey": "cardio_training", "displayOrder": 6}, + "cardio": {"sportTypeId": 6, "sportTypeKey": "cardio_training", "displayOrder": 6}, + "yoga": {"sportTypeId": 7, "sportTypeKey": "yoga", "displayOrder": 8}, + "pilates": {"sportTypeId": 8, "sportTypeKey": "pilates", "displayOrder": 9}, + "hiit": {"sportTypeId": 9, "sportTypeKey": "hiit", "displayOrder": 7}, + "mobility": {"sportTypeId": 11, "sportTypeKey": "mobility", "displayOrder": 11}, + "walking": {"sportTypeId": 12, "sportTypeKey": "walking", "displayOrder": 10}, + "rucking": {"sportTypeId": 13, "sportTypeKey": "rucking", "displayOrder": 12}, +} +SPORT_ID_MAPPINGS = {v["sportTypeId"]: v for v in SPORT_TYPE_MAPPINGS.values()} + +def _resolve_sport_block(st): + if isinstance(st, str): + k = st.strip().lower() + if k in SPORT_TYPE_MAPPINGS: + return dict(SPORT_TYPE_MAPPINGS[k]) + elif isinstance(st, dict): + key = st.get("sportTypeKey") + sid = st.get("sportTypeId") + if key and str(key).strip().lower() in SPORT_TYPE_MAPPINGS: + base = dict(SPORT_TYPE_MAPPINGS[str(key).strip().lower()]) + if sid is not None and sid != 0 and sid != base["sportTypeId"]: + raise ValueError(f"sportType mismatch: {key} vs {sid}") + return base + if sid is not None and sid in SPORT_ID_MAPPINGS: + return dict(SPORT_ID_MAPPINGS[sid]) + return None + +def _normalize_sport_type(workout_data: dict) -> None: + resolved = _resolve_sport_block(workout_data.get("sportType")) + segments = workout_data.get("workoutSegments") or [] + if not resolved and segments: + for seg in segments: + resolved = _resolve_sport_block(seg.get("sportType")) + if resolved: + break + if not resolved: + raise ValueError("Missing or invalid sportType. Both sportTypeId and sportTypeKey are required.") + workout_data["sportType"] = resolved + for seg in segments: + st = _resolve_sport_block(seg.get("sportType")) + seg["sportType"] = st if st else dict(resolved) + +''' + t = "def _normalize_workout_steps(workout_data: dict) -> None:" + if t in c: + with open(p, "w") as f: + f.write(c.replace(t, patch + t + "\n _normalize_sport_type(workout_data)", 1)) + print("Successfully patched garmin_mcp workouts.py!") diff --git a/k8s/openclaw/scripts/patch_perplexity.mjs b/k8s/openclaw/scripts/patch_perplexity.mjs new file mode 100644 index 0000000..102a823 --- /dev/null +++ b/k8s/openclaw/scripts/patch_perplexity.mjs @@ -0,0 +1,61 @@ +import fs from "node:fs"; +import path from "node:path"; +import { globSync } from "node:fs"; + +const baseDir = "/home/node/.openclaw/extensions/perplexity/dist"; +if (fs.existsSync(baseDir)) { + const files = fs.readdirSync(baseDir).filter(f => f.startsWith("perplexity-web-search-provider.runtime-") && f.endsWith(".js")); + for (const filename of files) { + const file = path.join(baseDir, filename); + let code = fs.readFileSync(file, "utf8"); + if (!code.includes("/* PATCHED_CHAT_COMPLETIONS */")) { + const target = "const structured = runtime.transport === \"search_api\";"; + const fastPath = `const structured = runtime.transport === "search_api"; /* PATCHED_CHAT_COMPLETIONS */ + if (!structured) { + const cacheKey = buildSearchCacheKey([ + "perplexity", + runtime.transport, + runtime.baseUrl, + runtime.model, + query, + freshness + ]); + const cacheTtlMs = resolveSearchCacheTtlMs(searchConfig); + const cached = readCachedSearchPayload(cacheKey, cacheTtlMs); + if (cached) return cached; + const start = Date.now(); + const timeoutSeconds = resolveSearchTimeoutSeconds(searchConfig); + const result = await runPerplexitySearch({ + query, + apiKey: runtime.apiKey, + baseUrl: runtime.baseUrl, + model: runtime.model, + timeoutSeconds, + signal, + freshness + }); + const payload = { + query, + provider: "perplexity", + model: runtime.model, + tookMs: Date.now() - start, + externalContent: { + untrusted: true, + source: "web_search", + provider: "perplexity", + wrapped: true + }, + content: wrapWebContent(result.content, "web_search"), + citations: result.citations + }; + writeCachedSearchPayload(cacheKey, payload); + return payload; + }`; + if (code.includes(target)) { + code = code.replace(target, fastPath); + fs.writeFileSync(file, code, "utf8"); + console.log("Patched perplexity runtime for chat completions:", file); + } + } + } +} diff --git a/k8s/openclaw/scripts/recover_sessions.py b/k8s/openclaw/scripts/recover_sessions.py new file mode 100644 index 0000000..8db7cc6 --- /dev/null +++ b/k8s/openclaw/scripts/recover_sessions.py @@ -0,0 +1,80 @@ + #!/usr/bin/env python3 + import glob, sqlite3, json, os, sys, time + + t0 = time.time() + recovered = 0 + interrupted_turns = [] + + def extract_prompt(msg): + if not msg: return "" + content = msg.get("content") + if isinstance(content, str): return content + if isinstance(content, list): + parts = [] + for c in content: + if isinstance(c, dict): parts.append(c.get("text") or c.get("content") or "") + elif isinstance(c, str): parts.append(c) + return "\n".join(filter(None, parts)) + return str(content or "") + + for db in sorted(glob.glob("/home/node/.openclaw/agents/*/agent/openclaw-agent.sqlite")): + try: + conn = sqlite3.connect(db, timeout=10.0) + cursor = conn.cursor() + while True: + cursor.execute("PRAGMA foreign_key_check;") + violations = cursor.fetchall() + if not violations: break + for table, rowid, parent, fkid in violations: + cursor.execute(f"DELETE FROM {table} WHERE rowid = ?", (rowid,)) + cursor.execute("SELECT session_key, entry_json, current_session_id FROM session_nodes WHERE status = \"running\"") + rows = cursor.fetchall() + agent_id = os.path.basename(os.path.dirname(os.path.dirname(db))) + for sk, ej, csid in rows: + try: + p = json.loads(ej) if ej else {} + sid = csid or p.get("sessionId") + if sid: + ev = cursor.execute("SELECT seq, event_json FROM transcript_events WHERE session_id = ? ORDER BY seq DESC LIMIT 1", (sid,)).fetchone() + if ev: + ev_seq, ev_raw = ev + try: + ev_data = json.loads(ev_raw) + msg = ev_data.get("message") or ev_data + if msg.get("role") == "user": + prompt_text = extract_prompt(msg) + ctx = p.get("restartRecoveryDeliveryContext") or p.get("delivery", {}).get("context") or p.get("delivery", {}).get("route", {}).get("context") or {} + interrupted_turns.append({ + "agent": agent_id, + "session_key": sk, + "session_id": sid, + "context": ctx, + "prompt": prompt_text + }) + cursor.execute("PRAGMA foreign_keys = ON") + cursor.execute("DELETE FROM transcript_events WHERE session_id = ? AND seq = ?", (sid, ev_seq)) + except Exception as ex: + print(f"[recover_sessions] Error parsing event: {ex}", file=sys.stderr) + p["status"] = "done" + p["activeWriterRunId"] = None + p["activeClaimRunId"] = None + p["restartRecoveryDeliveryRunId"] = None + cursor.execute("UPDATE session_nodes SET status = \"done\", entry_json = ? WHERE session_key = ?", (json.dumps(p), sk)) + cursor.execute("UPDATE session_nodes SET entry_valid = 1 WHERE session_key = ?", (sk,)) + recovered += 1 + except Exception: pass + cursor.execute("UPDATE session_windows SET status = \"done\" WHERE status = \"running\"") + conn.commit() + conn.close() + except Exception as e: + print(f"[recover_sessions] Warning for {db}: {e}", file=sys.stderr) + + if interrupted_turns: + try: + with open("/tmp/openclaw-interrupted-turns.json", "w") as f: + json.dump(interrupted_turns, f, indent=2) + print(f"[recover_sessions] Detected {len(interrupted_turns)} interrupted user turn(s) saved to /tmp/openclaw-interrupted-turns.json") + except Exception as e: + print(f"[recover_sessions] Error writing interrupted turns: {e}", file=sys.stderr) + + print(f"[recover_sessions] Completed in {time.time() - t0:.2f}s ({recovered} wedged sessions recovered)") diff --git a/k8s/openclaw/scripts/replay_interrupted_turns.py b/k8s/openclaw/scripts/replay_interrupted_turns.py new file mode 100644 index 0000000..47f5e0a --- /dev/null +++ b/k8s/openclaw/scripts/replay_interrupted_turns.py @@ -0,0 +1,97 @@ + #!/usr/bin/env python3 + import json, os, subprocess, sys, time, urllib.request + + INTERRUPTED_FILE = "/tmp/openclaw-interrupted-turns.json" + + if not os.path.exists(INTERRUPTED_FILE): + sys.exit(0) + + try: + with open(INTERRUPTED_FILE, "r") as f: + turns = json.load(f) + except Exception as e: + print(f"[replay_interrupted_turns] Failed to read {INTERRUPTED_FILE}: {e}", file=sys.stderr) + sys.exit(0) + + if not turns: + sys.exit(0) + + print(f"[replay_interrupted_turns] Found {len(turns)} interrupted turn(s). Waiting for gateway /healthz...") + + gateway_ready = False + for _ in range(60): + try: + with urllib.request.urlopen("http://127.0.0.1:18790/healthz", timeout=3) as resp: + if resp.status == 200: + gateway_ready = True + break + except Exception: + pass + time.sleep(2) + + if not gateway_ready: + print("[replay_interrupted_turns] Gateway did not become healthy in 120s. Aborting.", file=sys.stderr) + sys.exit(1) + + # Allow 5s for Telegram ingress to bind + time.sleep(5) + + for turn in turns: + sk = turn.get("session_key") + sid = turn.get("session_id") + agent_id = turn.get("agent") + ctx = turn.get("context") or {} + prompt = turn.get("prompt") or "" + + channel = ctx.get("channel") or "telegram" + to_target = ctx.get("to") or "" + thread_id = ctx.get("threadId") + + target = to_target + if target.startswith("telegram:"): + parts = target.split(":") + target = parts[1] if len(parts) > 1 else target + + print(f"[replay_interrupted_turns] Processing agent '{agent_id}' on session '{sk}' target='{target}' thread='{thread_id}'") + + # 1. Send status notification to Telegram if target exists + if target: + notice = "⚠️ OpenClaw wurde während der Bearbeitung neu gestartet – deine Anfrage wird jetzt nachgeholt..." + notify_cmd = [ + "openclaw", "message", "send", + "--channel", channel, + "--target", str(target), + "-m", notice + ] + if thread_id is not None: + notify_cmd.extend(["--thread-id", str(thread_id)]) + try: + subprocess.run(notify_cmd, check=False, timeout=30) + print(f"[replay_interrupted_turns] Sent recovery notice to {target}") + except Exception as e: + print(f"[replay_interrupted_turns] Notice failed: {e}", file=sys.stderr) + + # 2. Replay agent turn + if sk and prompt: + p_short = (prompt[:60] + "...") if len(prompt) > 60 else prompt + print(f"[replay_interrupted_turns] Replaying agent turn: {p_short}") + agent_cmd = [ + "openclaw", "agent", + "--session-key", sk, + "-m", prompt, + "--deliver" + ] + try: + res = subprocess.run(agent_cmd, capture_output=True, text=True, timeout=300) + if res.returncode == 0: + print(f"[replay_interrupted_turns] Turn replay succeeded for {sk}") + else: + print(f"[replay_interrupted_turns] Turn replay exited with code {res.returncode}: {res.stderr[:200]}", file=sys.stderr) + except Exception as e: + print(f"[replay_interrupted_turns] Replay execution error: {e}", file=sys.stderr) + + try: + os.remove(INTERRUPTED_FILE) + print(f"[replay_interrupted_turns] Cleaned up {INTERRUPTED_FILE}") + except Exception: + pass diff --git a/k8s/openclaw/scripts/sync_crons.py b/k8s/openclaw/scripts/sync_crons.py new file mode 100644 index 0000000..fbf6f71 --- /dev/null +++ b/k8s/openclaw/scripts/sync_crons.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +""" +sync_crons.py +Idempotently reconciles declarative OpenClaw automations defined in crons.yaml +with the running OpenClaw gateway state. + +Can run directly inside the container or remotely via kubectl exec. +""" + +import json +import os +import subprocess +import sys +import yaml + +def find_crons_file(): + candidates = [ + os.environ.get("CRONS_FILE"), + "crons.yaml", + "k8s/openclaw/crons.yaml", + "/home/node/.openclaw/scripts/crons.yaml", + os.path.join(os.path.dirname(__file__), "../crons.yaml"), + os.path.join(os.path.dirname(__file__), "crons.yaml"), + ] + for c in candidates: + if c and os.path.exists(c): + return os.path.abspath(c) + raise FileNotFoundError("Could not find crons.yaml. Pass via CRONS_FILE environment variable.") + +def is_inside_container(): + return os.path.exists("/home/node/.openclaw") or os.environ.get("OPENCLAW_HOME") is not None + +def run_openclaw_cmd(args): + if is_inside_container(): + cmd = ["openclaw"] + args + else: + namespace = os.environ.get("NAMESPACE", "openclaw") + pod = os.environ.get("POD_NAME", "openclaw-0") + container = os.environ.get("CONTAINER_NAME", "openclaw") + cmd = ["kubectl", "exec", "-n", namespace, pod, "-c", container, "--", "openclaw"] + args + + res = subprocess.run(cmd, capture_output=True, text=True) + if res.returncode != 0: + raise RuntimeError(f"OpenClaw CLI command failed ({' '.join(cmd)}):\n{res.stderr}\n{res.stdout}") + return res.stdout + +def list_existing_jobs(): + raw = run_openclaw_cmd(["cron", "list", "--json"]) + try: + data = json.loads(raw) + return data.get("jobs", []) + except Exception as e: + print(f"Warning: could not parse cron list json: {e}\nRaw output: {raw[:300]}", file=sys.stderr) + return [] + +def reconcile_jobs(): + file_path = find_crons_file() + print(f"=== Syncing OpenClaw Crons-as-Code from {file_path} ===") + + with open(file_path, "r", encoding="utf-8") as f: + spec = yaml.safe_load(f) + + declarations = spec.get("jobs", []) + existing_jobs = list_existing_jobs() + + print(f"Found {len(declarations)} declared jobs in YAML, {len(existing_jobs)} active jobs on gateway.") + + for job in declarations: + name = job.get("name") + decl_key = job.get("declarationKey") or name + desc = job.get("description", "") + sched = job.get("schedule", {}) + + # Match existing job by declarationKey or exact name + match = next((j for j in existing_jobs if j.get("declarationKey") == decl_key or j.get("name") == name), None) + + if match: + existing_id = match.get("id") + print(f"Removing existing job '{name}' (ID {existing_id}) for idempotent recreation...") + try: + run_openclaw_cmd(["cron", "rm", existing_id]) + except Exception as e: + print(f"Warning removing {existing_id}: {e}") + + # Build add command + cmd = [ + "cron", "add", + "--name", name, + "--declaration-key", decl_key, + "--description", desc, + ] + + if sched.get("kind") == "every": + cmd.extend(["--every", sched.get("every", "15m")]) + elif sched.get("kind") == "cron": + cmd.extend(["--cron", sched.get("expr", "* * * * *")]) + if sched.get("tz"): + cmd.extend(["--tz", sched.get("tz")]) + + if job.get("session"): + cmd.extend(["--session", job.get("session")]) + + if job.get("delivery") == "none": + cmd.append("--no-deliver") + + if job.get("command"): + cmd.extend(["--command", job.get("command")]) + + if job.get("agent"): + cmd.extend(["--agent", job.get("agent")]) + + if job.get("model"): + cmd.extend(["--model", job.get("model")]) + + if job.get("channel"): + cmd.extend(["--channel", job.get("channel")]) + + if job.get("to"): + cmd.extend(["--to", job.get("to")]) + + if job.get("threadId"): + cmd.extend(["--thread-id", str(job.get("threadId"))]) + + if job.get("announce"): + cmd.append("--announce") + + if job.get("message"): + cmd.extend(["--message", job.get("message")]) + + print(f"Registering job '{name}'...") + run_openclaw_cmd(cmd) + print(f"Successfully registered '{name}'.") + + print("=== OpenClaw Crons-as-Code reconciliation complete! ===") + +if __name__ == "__main__": + reconcile_jobs() diff --git a/knowledge-wiki b/knowledge-wiki index 39074f8..1008b2c 160000 --- a/knowledge-wiki +++ b/knowledge-wiki @@ -1 +1 @@ -Subproject commit 39074f81d9b54c68fcbcf908408a3af58ccf5568 +Subproject commit 1008b2c18dd1c1e4a7ff4bd6353fe5756a8cd8db