惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix: use node for Parallels config scrub · openclaw/openc...
steipete · 2026-04-24 · via Recent Commits to openclaw:main

@@ -1406,29 +1406,31 @@ if [ -z "\${$API_KEY_ENV:-}" ]; then

14061406

fi

14071407

cd "\$HOME"

14081408

scrub_future_plugin_entries() {

1409-

/opt/homebrew/bin/python3 - <<'PY' || true

1410-

import json

1411-

from pathlib import Path

1412-1413-

config_path = Path.home() / ".openclaw" / "openclaw.json"

1414-

if not config_path.exists():

1415-

raise SystemExit(0)

1416-

try:

1417-

config = json.loads(config_path.read_text())

1418-

except Exception:

1419-

raise SystemExit(0)

1420-

plugins = config.get("plugins")

1421-

if not isinstance(plugins, dict):

1422-

raise SystemExit(0)

1423-

entries = plugins.get("entries")

1424-

if isinstance(entries, dict):

1425-

for plugin_id in ("feishu", "whatsapp"):

1426-

entries.pop(plugin_id, None)

1427-

allow = plugins.get("allow")

1428-

if isinstance(allow, list):

1429-

plugins["allow"] = [plugin_id for plugin_id in allow if plugin_id not in {"feishu", "whatsapp"}]

1430-

config_path.write_text(json.dumps(config, indent=2) + "\n")

1431-

PY

1409+

node - <<'JS' || true

1410+

const fs = require("fs");

1411+

const os = require("os");

1412+

const path = require("path");

1413+1414+

const configPath = path.join(os.homedir(), ".openclaw", "openclaw.json");

1415+

if (!fs.existsSync(configPath)) process.exit(0);

1416+

let config;

1417+

try {

1418+

config = JSON.parse(fs.readFileSync(configPath, "utf8"));

1419+

} catch {

1420+

process.exit(0);

1421+

}

1422+

const plugins = config?.plugins;

1423+

if (!plugins || typeof plugins !== "object" || Array.isArray(plugins)) process.exit(0);

1424+

const entries = plugins.entries;

1425+

if (entries && typeof entries === "object" && !Array.isArray(entries)) {

1426+

delete entries.feishu;

1427+

delete entries.whatsapp;

1428+

}

1429+

if (Array.isArray(plugins.allow)) {

1430+

plugins.allow = plugins.allow.filter((pluginId) => pluginId !== "feishu" && pluginId !== "whatsapp");

1431+

}

1432+

fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);

1433+

JS

14321434

}

14331435

stop_openclaw_gateway_processes() {

14341436

/opt/homebrew/bin/openclaw gateway stop >/dev/null 2>&1 || true

@@ -1530,29 +1532,31 @@ set -euo pipefail

15301532

export HOME=/root

15311533

cd "\$HOME"

15321534

scrub_future_plugin_entries() {

1533-

python3 - <<'PY' || true

1534-

import json

1535-

from pathlib import Path

1536-1537-

config_path = Path.home() / ".openclaw" / "openclaw.json"

1538-

if not config_path.exists():

1539-

raise SystemExit(0)

1540-

try:

1541-

config = json.loads(config_path.read_text())

1542-

except Exception:

1543-

raise SystemExit(0)

1544-

plugins = config.get("plugins")

1545-

if not isinstance(plugins, dict):

1546-

raise SystemExit(0)

1547-

entries = plugins.get("entries")

1548-

if isinstance(entries, dict):

1549-

for plugin_id in ("feishu", "whatsapp"):

1550-

entries.pop(plugin_id, None)

1551-

allow = plugins.get("allow")

1552-

if isinstance(allow, list):

1553-

plugins["allow"] = [plugin_id for plugin_id in allow if plugin_id not in {"feishu", "whatsapp"}]

1554-

config_path.write_text(json.dumps(config, indent=2) + "\n")

1555-

PY

1535+

node - <<'JS' || true

1536+

const fs = require("fs");

1537+

const os = require("os");

1538+

const path = require("path");

1539+1540+

const configPath = path.join(os.homedir(), ".openclaw", "openclaw.json");

1541+

if (!fs.existsSync(configPath)) process.exit(0);

1542+

let config;

1543+

try {

1544+

config = JSON.parse(fs.readFileSync(configPath, "utf8"));

1545+

} catch {

1546+

process.exit(0);

1547+

}

1548+

const plugins = config?.plugins;

1549+

if (!plugins || typeof plugins !== "object" || Array.isArray(plugins)) process.exit(0);

1550+

const entries = plugins.entries;

1551+

if (entries && typeof entries === "object" && !Array.isArray(entries)) {

1552+

delete entries.feishu;

1553+

delete entries.whatsapp;

1554+

}

1555+

if (Array.isArray(plugins.allow)) {

1556+

plugins.allow = plugins.allow.filter((pluginId) => pluginId !== "feishu" && pluginId !== "whatsapp");

1557+

}

1558+

fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);

1559+

JS

15561560

}

15571561

stop_openclaw_gateway_processes() {

15581562

openclaw gateway stop >/dev/null 2>&1 || true