memos/apps/memos-local-plugin/website/docs/troubleshooting.html

221 lines
24 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>MemOS Local Plugin 安装排查 | OpenClaw / Hermes</title>
<meta name="description" content="MemOS Local Plugin 安装与运行排查指南,覆盖 OpenClaw、Hermes、Node.js、better-sqlite3、Viewer、Bridge、配置与日志。">
<link rel="icon" href="https://statics.memtensor.com.cn/logo/color-m.svg" type="image/svg+xml">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#06080f;--card:rgba(14,18,32,.72);--card2:rgba(20,26,48,.82);--line:rgba(99,140,255,.12);--line2:rgba(99,140,255,.25);--text:#eef1ff;--muted:rgba(200,210,255,.58);--soft:rgba(160,175,220,.34);--cyan:#00e5ff;--green:#00e676;--amber:#ffca28;--rose:#ff5f8f;--grad:linear-gradient(135deg,#00e5ff,#638cff,#b16cff);--mono:'JetBrains Mono','SF Mono',ui-monospace,monospace;--font:'Inter',system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}
html{scroll-behavior:smooth;scroll-padding-top:86px}
body{font-family:var(--font);background:var(--bg);color:var(--text);line-height:1.72;font-size:15px;overflow-x:hidden}
body::before{content:'';position:fixed;inset:0;z-index:0;pointer-events:none;background-image:linear-gradient(rgba(99,140,255,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(99,140,255,.03) 1px,transparent 1px);background-size:60px 60px}
body::after{content:'';position:fixed;inset:-20% -10%;z-index:0;pointer-events:none;background:radial-gradient(circle at 12% 0,rgba(0,229,255,.10),transparent 28%),radial-gradient(circle at 86% 12%,rgba(177,108,255,.09),transparent 30%),radial-gradient(circle at 50% 80%,rgba(255,60,172,.04),transparent 34%)}
a{color:var(--cyan);text-decoration:none;transition:all .2s}a:hover{color:var(--text)}
.top{position:fixed;inset:0 0 auto 0;height:60px;z-index:30;display:flex;align-items:center;gap:14px;padding:0 24px;border-bottom:1px solid var(--line);background:rgba(6,8,15,.76);backdrop-filter:blur(24px) saturate(1.4)}
.brand{display:flex;align-items:center;gap:10px;color:var(--text);font-weight:800;font-size:17px;letter-spacing:-.02em;text-decoration:none}.brand:hover{color:var(--text);text-decoration:none}.brand img{width:36px;height:36px}.brand .sub,.brand small{display:block;color:var(--muted);font-size:10px;font-weight:400;line-height:1.1}
.top nav{margin-left:auto;display:flex;gap:4px;align-items:center}.top nav a{color:var(--muted);font-size:13px;font-weight:600;padding:6px 12px;border-radius:8px;border:1px solid transparent}.top nav a:hover,.top nav a.active{background:rgba(99,140,255,.08);border-color:var(--line);color:var(--text)}
.lang{display:flex;gap:2px;margin-left:8px;padding:2px;border:1px solid var(--line);border-radius:8px;background:rgba(99,140,255,.04)}
.lang button{color:var(--muted);font-size:13px;font-weight:600;padding:6px 12px;border-radius:8px;border:1px solid transparent;background:transparent;cursor:pointer}
.lang button.active{background:rgba(99,140,255,.08);border-color:var(--line);color:var(--text)}
.lang-en{display:none}body.en .lang-zh{display:none!important}body.en .lang-en{display:initial!important}
.layout{position:relative;z-index:1;display:grid;grid-template-columns:268px minmax(0,960px);gap:40px;align-items:start;margin-top:60px;padding:44px clamp(16px,2vw,32px) 96px}
.sidebar{position:sticky;top:84px;border:1px solid var(--line);background:rgba(14,18,32,.62);border-radius:18px;padding:16px;max-height:calc(100vh - 104px);overflow:auto;backdrop-filter:blur(12px);box-shadow:0 10px 40px rgba(0,0,0,.28)}
.side-title{color:var(--soft);font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.12em;margin:14px 8px 8px}.side-title:first-child{margin-top:0}
.sidebar a{display:block;padding:7px 9px;border-radius:10px;color:var(--muted);font-size:13px;font-weight:650}.sidebar a:hover{background:rgba(99,140,255,.08);color:var(--text)}
main{min-width:0}
.hero{padding:42px 0 34px}.badge{display:inline-flex;gap:8px;align-items:center;border:1px solid rgba(0,229,255,.2);background:rgba(0,229,255,.06);color:var(--cyan);border-radius:24px;padding:6px 18px;font-size:12px;font-weight:700;backdrop-filter:blur(8px)}
h1{font-size:clamp(40px,6vw,72px);font-weight:900;line-height:1.05;letter-spacing:-.055em;margin:18px 0;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.hero p{font-size:18px;color:var(--muted);max-width:820px;line-height:1.85}
section{border-top:1px solid var(--line);padding:50px 0}h2{font-size:clamp(28px,4vw,44px);font-weight:900;letter-spacing:-.04em;line-height:1.1;margin-bottom:14px}h3{font-size:20px;font-weight:800;margin:28px 0 8px;color:var(--text)}p,li{color:var(--muted)}p{margin:8px 0 12px}ul,ol{padding-left:22px;margin:10px 0 16px}strong{color:var(--text)}
pre{overflow:auto;background:rgba(10,14,28,.86);border:1px solid var(--line);border-radius:16px;padding:18px;color:#d4ddff;font-family:var(--mono);font-size:13px;line-height:1.7;margin:14px 0 20px;backdrop-filter:blur(12px);box-shadow:0 10px 40px rgba(0,0,0,.24)}code{font-family:var(--mono);font-size:.9em;color:#aefbf0;background:rgba(0,229,255,.08);border:1px solid rgba(0,229,255,.12);border-radius:5px;padding:1px 5px}pre code{background:transparent;border:0;padding:0;color:inherit}.c{color:rgba(212,221,255,.42)}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:18px 0}.card{border:1px solid var(--line);background:var(--card);border-radius:16px;padding:20px;backdrop-filter:blur(12px);transition:all .25s;position:relative;overflow:hidden}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--grad);opacity:0;transition:opacity .25s}.card:hover{border-color:var(--line2);background:var(--card2);transform:translateY(-3px);box-shadow:0 0 30px rgba(0,229,255,.11)}.card:hover::before{opacity:1}.card h3{margin-top:0}.card p{font-size:14px}
.callout{border:1px solid rgba(0,229,255,.22);background:rgba(0,229,255,.07);border-radius:16px;padding:15px 17px;margin:16px 0;color:var(--muted);backdrop-filter:blur(10px)}.callout.warnbox{border-color:rgba(255,202,40,.25);background:rgba(255,202,40,.07)}.callout.errbox{border-color:rgba(255,95,143,.28);background:rgba(255,95,143,.07)}
table{width:100%;border-collapse:collapse;margin:16px 0 24px;border:1px solid var(--line);border-radius:16px;overflow:hidden;background:rgba(14,18,32,.5);backdrop-filter:blur(12px)}th,td{padding:11px 13px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}th{background:rgba(99,140,255,.08);font-size:13px}td{color:var(--muted);font-size:13px}tr:last-child td{border-bottom:0}
@media(max-width:980px){.layout{grid-template-columns:1fr}.sidebar{position:relative;top:auto;max-height:none}.grid{grid-template-columns:1fr}.top nav a:nth-child(n+4){display:none}}
@media(max-width:720px){.layout{padding:30px 16px 70px}.brand .sub,.brand small{display:none}.brand img{width:32px;height:32px}h1{font-size:38px}table{display:block;overflow:auto}}
.site-footer{position:relative;z-index:1;border-top:1px solid var(--line);padding:36px 0;background:rgba(6,8,15,.6)}
.site-footer .inner{max-width:1200px;margin:0 auto;padding:0 24px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:14px}
.site-footer .brand-foot{display:flex;align-items:center;gap:8px;color:var(--muted);font-weight:700;font-size:13px}
.site-footer .brand-foot img{width:28px;height:28px}
.site-footer .links{display:flex;gap:20px;flex-wrap:wrap}
.site-footer .links a{color:var(--soft);font-size:12px;text-decoration:none}
.site-footer .links a:hover{color:var(--cyan)}
.site-footer .copy{color:var(--soft);font-size:10px;width:100%;text-align:center;margin-top:12px}
</style>
</head>
<body>
<header class="top">
<a class="brand" href="../index.html"><img src="https://statics.memtensor.com.cn/logo/white-memos.svg" alt="MemOS"><span>MemOS<span class="sub lang-zh">安装排查</span><span class="sub lang-en">Troubleshooting</span></span></a>
<nav>
<a href="../index.html"><span class="lang-zh">首页</span><span class="lang-en">Home</span></a>
<a href="index.html"><span class="lang-zh">文档</span><span class="lang-en">Docs</span></a>
<a class="active" href="troubleshooting.html"><span class="lang-zh">排查</span><span class="lang-en">Troubleshooting</span></a>
<a href="#quick"><span class="lang-zh">快速诊断</span><span class="lang-en">Quick Check</span></a>
<a href="#logs"><span class="lang-zh">日志</span><span class="lang-en">Logs</span></a>
</nav>
<div class="lang"><button type="button" data-lang="zh" class="active"></button><button type="button" data-lang="en">EN</button></div>
</header>
<div class="layout">
<aside class="sidebar">
<div class="side-title">Troubleshooting</div>
<a href="#quick"><span class="lang-zh">快速诊断</span><span class="lang-en">Quick Check</span></a>
<a href="#install"><span class="lang-zh">安装器没有检测到宿主</span><span class="lang-en">Installer Cannot Detect Host</span></a>
<a href="#node">Node.js / better-sqlite3</a>
<a href="#openclaw"><span class="lang-zh">OpenClaw 插件未加载</span><span class="lang-en">OpenClaw Plugin Not Loading</span></a>
<a href="#hermes"><span class="lang-zh">Hermes provider / bridge 问题</span><span class="lang-en">Hermes Provider / Bridge</span></a>
<a href="#viewer"><span class="lang-zh">Viewer 无法访问</span><span class="lang-en">Viewer Unreachable</span></a>
<a href="#config"><span class="lang-zh">配置与 API key</span><span class="lang-en">Config and API Keys</span></a>
<a href="#logs"><span class="lang-zh">日志位置</span><span class="lang-en">Log Locations</span></a>
<a href="#upgrade"><span class="lang-zh">升级与旧插件</span><span class="lang-en">Upgrade and Legacy Plugins</span></a>
<a href="#reinstall"><span class="lang-zh">安全重装</span><span class="lang-en">Safe Reinstall</span></a>
</aside>
<main>
<div class="hero">
<div class="badge">OpenClaw + Hermes · Troubleshooting</div>
<h1><span class="lang-zh">MemOS Local Plugin 安装排查</span><span class="lang-en">MemOS Local Plugin Troubleshooting</span></h1>
<p><span class="lang-zh">新版插件同时支持 OpenClaw 和 Hermes。排查时先确认你正在检查的是哪个宿主、哪个运行时目录、哪个 Viewer 端口。</span><span class="lang-en">The current plugin supports both OpenClaw and Hermes. When debugging, first confirm which host, which runtime directory, and which Viewer port you are inspecting.</span></p>
</div>
<section id="quick">
<h2><span class="lang-zh">1. 快速诊断</span><span class="lang-en">1. Quick Check</span></h2>
<p><span class="lang-zh">先跑下面的命令确认安装目录、数据库、Viewer 和核心依赖状态。</span><span class="lang-en">Run the following commands to verify install directory, database, Viewer, and core dependencies.</span></p>
<pre><code><span class="c"># Host homes</span>
test -d ~/.openclaw && echo "OpenClaw home OK"
test -d ~/.hermes && echo "Hermes home OK"
<span class="c"># OpenClaw install/runtime</span>
ls ~/.openclaw/extensions/memos-local-plugin 2>/dev/null
ls ~/.openclaw/memos-plugin 2>/dev/null
<span class="c"># Hermes runtime/package</span>
ls ~/.hermes/memos-plugin 2>/dev/null
ls ~/.hermes/memos-plugin/adapters/hermes 2>/dev/null
<span class="c"># Viewer health</span>
curl -fsS http://127.0.0.1:18799/api/v1/health || true
curl -fsS http://127.0.0.1:18800/api/v1/health || true</code></pre>
<div class="grid">
<div class="card"><h3>OpenClaw</h3><p><span class="lang-zh">代码在 <code>~/.openclaw/extensions/memos-local-plugin/</code>,数据在 <code>~/.openclaw/memos-plugin/</code>Viewer 是 <code>:18799</code></span><span class="lang-en">Code lives at <code>~/.openclaw/extensions/memos-local-plugin/</code>, data at <code>~/.openclaw/memos-plugin/</code>, Viewer at <code>:18799</code>.</span></p></div>
<div class="card"><h3>Hermes</h3><p><span class="lang-zh">包和运行时在 <code>~/.hermes/memos-plugin/</code>Python provider 通过 symlink 接入 HermesViewer 是 <code>:18800</code></span><span class="lang-en">Package and runtime live at <code>~/.hermes/memos-plugin/</code>; the Python provider attaches via symlink, Viewer at <code>:18800</code>.</span></p></div>
</div>
</section>
<section id="install">
<h2><span class="lang-zh">2. 安装器没有检测到宿主</span><span class="lang-en">2. Installer Cannot Detect Host</span></h2>
<p><span class="lang-zh">安装器根据 <code>~/.openclaw</code><code>~/.hermes</code> 判断宿主是否存在。交互式安装时可以手动选择;非交互环境会自动安装到检测到的宿主。</span><span class="lang-en">The installer detects hosts via <code>~/.openclaw</code> and <code>~/.hermes</code>. Interactive runs let you pick manually; non-interactive runs install into whatever is detected.</span></p>
<pre><code><span class="c"># Re-run from repository checkout</span>
cd apps/memos-local-plugin
bash install.sh
<span class="c"># Show installer help</span>
bash install.sh --help</code></pre>
<div class="callout warnbox"><strong><span class="lang-zh">没有 <code>--port</code> 参数。</span><span class="lang-en">No <code>--port</code> flag.</span></strong> <span class="lang-zh">新版端口固定OpenClaw <code>18799</code>Hermes <code>18800</code>。如果端口被占用,请先停掉旧进程,而不是给安装器传端口。</span><span class="lang-en">The new ports are fixed: OpenClaw <code>18799</code>, Hermes <code>18800</code>. If a port is busy, kill the stale process instead of passing a port to the installer.</span></div>
</section>
<section id="node">
<h2>3. Node.js / better-sqlite3</h2>
<p><span class="lang-zh">插件要求 Node.js 20+。Node 25+ 往往没有 <code>better-sqlite3</code> 预编译二进制,会走源码编译;如果失败,建议切换 Node LTS。</span><span class="lang-en">Plugin requires Node.js 20+. Node 25+ often lacks <code>better-sqlite3</code> prebuilt binaries and falls back to building from source; if that fails, switch to Node LTS.</span></p>
<pre><code>node -v
<span class="c"># OpenClaw package check</span>
cd ~/.openclaw/extensions/memos-local-plugin
node -e "require('better-sqlite3'); console.log('better-sqlite3 OK')"
<span class="c"># Hermes package check</span>
cd ~/.hermes/memos-plugin
node -e "require('better-sqlite3'); console.log('better-sqlite3 OK')"</code></pre>
<p><span class="lang-zh">更多平台细节见 <a href="https://github.com/WiseLibs/better-sqlite3/blob/master/docs/troubleshooting.md" target="_blank" rel="noopener">better-sqlite3 官方排查文档</a></span><span class="lang-en">For platform details, see the <a href="https://github.com/WiseLibs/better-sqlite3/blob/master/docs/troubleshooting.md" target="_blank" rel="noopener">official better-sqlite3 troubleshooting docs</a>.</span></p>
</section>
<section id="openclaw">
<h2><span class="lang-zh">4. OpenClaw 插件未加载</span><span class="lang-en">4. OpenClaw Plugin Not Loading</span></h2>
<p><span class="lang-zh">OpenClaw 安装流程会部署包、生成 <code>openclaw.plugin.json</code>,并 patch <code>~/.openclaw/openclaw.json</code> 的 memory slot。</span><span class="lang-en">OpenClaw install deploys the package, writes <code>openclaw.plugin.json</code>, and patches the memory slot in <code>~/.openclaw/openclaw.json</code>.</span></p>
<pre><code>test -f ~/.openclaw/extensions/memos-local-plugin/openclaw.plugin.json
test -f ~/.openclaw/extensions/memos-local-plugin/dist/adapters/openclaw/index.js</code></pre>
<p><span class="lang-zh">修改后重启 OpenClaw gateway</span><span class="lang-en">Restart the OpenClaw gateway after changes:</span></p>
<pre><code>openclaw gateway stop
openclaw gateway start</code></pre>
<div class="callout errbox"><strong><span class="lang-zh">旧 ID 冲突:</span><span class="lang-en">Legacy ID conflict:</span></strong> <span class="lang-zh">如果看到 <code>memos-local-openclaw-plugin</code><code>memos-lite-openclaw-plugin</code>,它们是旧版单适配插件。新版安装器会从配置中移除旧 ID但不会删除旧数据。</span><span class="lang-en">If you see <code>memos-local-openclaw-plugin</code> or <code>memos-lite-openclaw-plugin</code>, those are legacy single-adapter plugins. The new installer removes legacy IDs from config but never deletes legacy data.</span></div>
</section>
<section id="hermes">
<h2><span class="lang-zh">5. Hermes provider / bridge 问题</span><span class="lang-en">5. Hermes Provider / Bridge Issues</span></h2>
<p><span class="lang-zh">Hermes 适配器由 Python provider 加载,再启动或连接 <code>bridge.cts</code>。最常见问题是 provider symlink 没建立、Hermes Python 环境不一致、bridge 旧进程占用端口。</span><span class="lang-en">The Hermes adapter is loaded by a Python provider that starts or connects to <code>bridge.cts</code>. Common failures: missing provider symlink, mismatched Hermes Python env, or stale bridge holding the port.</span></p>
<pre><code>ls ~/.hermes/memos-plugin/adapters/hermes/memos_provider
test -f ~/.hermes/memos-plugin/bridge.cts
pgrep -af "bridge.cts" || true
lsof -nP -iTCP:18800 -sTCP:LISTEN || true</code></pre>
<p><span class="lang-zh">如需重启 Hermes bridge优先重新运行安装器它会停止旧 bridge、重新部署 provider 并等待 Viewer。</span><span class="lang-en">To restart the Hermes bridge, prefer rerunning the installer: it stops the old bridge, redeploys the provider, and waits for Viewer.</span></p>
</section>
<section id="viewer">
<h2><span class="lang-zh">6. Viewer 无法访问</span><span class="lang-en">6. Viewer Unreachable</span></h2>
<table>
<tr><th>Viewer</th><th>URL</th><th>Health</th><th><span class="lang-zh">常见原因</span><span class="lang-en">Common Causes</span></th></tr>
<tr><td>OpenClaw</td><td><code>http://127.0.0.1:18799</code></td><td><code>/api/v1/health</code></td><td><span class="lang-zh">gateway 未启动、插件未加载、端口被旧进程占用。</span><span class="lang-en">Gateway not started, plugin not loaded, or port held by stale process.</span></td></tr>
<tr><td>Hermes</td><td><code>http://127.0.0.1:18800</code></td><td><code>/api/v1/health</code></td><td><span class="lang-zh">bridge 未启动、provider 未加载、Hermes LLM 配置缺失。</span><span class="lang-en">Bridge not started, provider not loaded, or missing Hermes LLM config.</span></td></tr>
</table>
</section>
<section id="config">
<h2><span class="lang-zh">7. 配置与 API key</span><span class="lang-en">7. Config and API Keys</span></h2>
<p><span class="lang-zh"><code>config.yaml</code> 是唯一运行时配置文件。OpenClaw 默认可使用 <code>llm.provider: host</code> 复用宿主模型Hermes 没有 host LLM通常需要配置真实 LLM provider 与 API key。</span><span class="lang-en"><code>config.yaml</code> is the only runtime config. OpenClaw can default to <code>llm.provider: host</code> and reuse the host model; Hermes has no host LLM and usually needs a real LLM provider plus API key.</span></p>
<pre><code>sed -n '1,120p' ~/.openclaw/memos-plugin/config.yaml
sed -n '1,120p' ~/.hermes/memos-plugin/config.yaml</code></pre>
<div class="callout warnbox"><span class="lang-zh">排障时不要把完整 API key 贴到 issue 或聊天里。Viewer 与日志会做脱敏,但终端命令输出不会自动脱敏。</span><span class="lang-en">Do not paste full API keys into issues or chats. Viewer and logs redact secrets, but raw terminal output does not.</span></div>
</section>
<section id="logs">
<h2><span class="lang-zh">8. 日志位置</span><span class="lang-en">8. Log Locations</span></h2>
<table>
<tr><th>Agent</th><th>MemOS logs</th><th>Host logs</th></tr>
<tr><td>OpenClaw</td><td><code>~/.openclaw/memos-plugin/logs/</code></td><td><code>/tmp/openclaw/openclaw-*.log</code>, <code>/tmp/openclaw-memos-gateway.log</code></td></tr>
<tr><td>Hermes</td><td><code>~/.hermes/memos-plugin/logs/</code></td><td><span class="lang-zh"><code>~/.hermes/</code> 下的 Hermes 自身日志,视安装方式而定</span><span class="lang-en">Hermes' own logs under <code>~/.hermes/</code>, depending on install method</span></td></tr>
</table>
<pre><code>rg -i "error|fail|warn" ~/.openclaw/memos-plugin/logs ~/.hermes/memos-plugin/logs</code></pre>
</section>
<section id="upgrade">
<h2><span class="lang-zh">9. 升级与旧插件</span><span class="lang-en">9. Upgrade and Legacy Plugins</span></h2>
<p><span class="lang-zh">旧版包名和插件 ID 包含 <code>memos-local-openclaw-plugin</code>,新版统一为 <code>@memtensor/memos-local-plugin</code> / <code>memos-local-plugin</code>。升级时安装器会清理 OpenClaw 配置里的旧 ID防止两个记忆插件争用 memory slot。</span><span class="lang-en">Legacy package and plugin IDs use <code>memos-local-openclaw-plugin</code>; the current name is <code>@memtensor/memos-local-plugin</code> / <code>memos-local-plugin</code>. The installer cleans legacy IDs from OpenClaw config to prevent two memory plugins competing for the same slot.</span></p>
<pre><code>curl -fsSL https://raw.githubusercontent.com/MemTensor/MemOS/main/apps/memos-local-plugin/install.sh | bash
rg "memos-local-openclaw-plugin|memos-lite" ~/.openclaw/openclaw.json || true</code></pre>
</section>
<section id="reinstall">
<h2><span class="lang-zh">10. 安全重装</span><span class="lang-en">10. Safe Reinstall</span></h2>
<p><span class="lang-zh">安全重装只删除代码包和 provider 链接,不删除数据库、技能、日志和配置。</span><span class="lang-en">A safe reinstall removes only code packages and provider symlinks; databases, skills, logs, and config stay intact.</span></p>
<pre><code>rm -rf ~/.openclaw/extensions/memos-local-plugin
cp -a ~/.hermes/memos-plugin ~/.hermes/memos-plugin.backup.$(date +%Y%m%d-%H%M%S)
cd apps/memos-local-plugin
bash install.sh</code></pre>
<div class="callout errbox"><strong><span class="lang-zh">不要直接删除 <code>~/.hermes/memos-plugin</code></span><span class="lang-en">Do not delete <code>~/.hermes/memos-plugin</code> directly,</span></strong> <span class="lang-zh">除非你已经备份并确认可以同时移除 Hermes 的 MemOS 数据库、配置、日志和技能包。</span><span class="lang-en">unless you have backed up and intentionally want to remove Hermes' MemOS database, config, logs, and skills together.</span></div>
</section>
</main>
</div>
<footer class="site-footer">
<div class="inner">
<div class="brand-foot"><img src="https://statics.memtensor.com.cn/logo/white-memos.svg" alt="MemOS"> MemOS</div>
<div class="links">
<a href="../index.html"><span class="lang-zh">首页</span><span class="lang-en">Home</span></a>
<a href="index.html"><span class="lang-zh">文档</span><span class="lang-en">Docs</span></a>
<a href="troubleshooting.html"><span class="lang-zh">排查</span><span class="lang-en">Troubleshooting</span></a>
<a href="https://www.npmjs.com/package/@memtensor/memos-local-plugin" target="_blank" rel="noopener">npm</a>
<a href="https://github.com/MemTensor/MemOS/tree/main/apps/memos-local-plugin" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/MemTensor/MemOS/blob/main/LICENSE" target="_blank" rel="noopener">MIT</a>
</div>
<div class="copy">© 2026 MemTensor. MemOS Local Plugin.</div>
</div>
</footer>
<script>
(function(){
var key='memos-site-lang';
var saved=localStorage.getItem(key)||'zh';
function setLang(lang){
document.body.classList.toggle('en',lang==='en');
document.documentElement.lang=lang==='en'?'en':'zh-CN';
localStorage.setItem(key,lang);
document.querySelectorAll('[data-lang]').forEach(function(btn){btn.classList.toggle('active',btn.getAttribute('data-lang')===lang);});
}
document.querySelectorAll('[data-lang]').forEach(function(btn){btn.addEventListener('click',function(){setLang(btn.getAttribute('data-lang'));});});
setLang(saved);
})();
</script>
</body>
</html>