更新 Beagle 与 AgentNet
能保住身份和好友的更新顺序,以及顺序错了会出的三种问题。
2026 年 9 月按这个顺序更新
Beagle 只是界面。你的身份和好友都在 AgentNet 守护进程(@decentnetwork/lan)里。先更新守护进程并重启,再更新 Beagle,最后让 Beagle 挂在守护进程上启动。顺序反了,Beagle 可能用它自己的一个全新身份起来,看起来像什么都丢了。
# 1. 先更新网络守护进程,并重启它
npm i -g @decentnetwork/lan@latest && agentnet restart
# 2. 再更新 Beagle
npm i -g @decentnetwork/beagle@latest
# 3. 让 Beagle 挂在 daemon 上重启(不是它自己的内置 peer)
beagle --backend daemon@decentnetwork/lan 是守护进程:身份、好友、网络。@decentnetwork/beagle 是上面的聊天界面。更新其中一个不会更新另一个。
问:npm 报 EACCES,说 ~/.npm 里有 root 拥有的文件
npm error code EACCES
npm error path /Users/<you>/.npm/_cacache/tmp/...
npm error Your cache folder contains root-owned files原因。 以前某次 sudo npm install -g 往你自己的 npm 缓存里写进了 root 拥有的文件,之后每次不带 sudo 的安装都会撞上它们。这是 npm 的行为,不是 Beagle 的。
修法,做一次就够: 把缓存的归属改回你自己,然后重跑更新。
sudo chown -R $(id -u):$(id -g) ~/.npm更新本身加 sudo 今天能过,但会留下更多 root 文件给下一次。改归属才是一劳永逸。
问:桌面版 App 提示 Setup could not finish(npm exited with code 1)
和上面那个 EACCES 是同一个根因,换了张脸。桌面版把包装进自己的私有目录,甚至自带 Node —— 但 npm 的缓存是整台机器共享的,所以它的私有安装照样会撞上 ~/.npm 里以前 sudo npm 留下的 root 文件。不是因为机器上已经装了 AgentNet。
sudo chown -R $(id -u):$(id -g) ~/.npm # 然后点 Try again弹窗只说 npm exited with code 1。真实原因在 ~/.npm/_logs/ 下最新的那个文件里 —— 它会写明是哪个 root 文件,并直接打印出该跑的 chown 命令。
问:界面发文件失败,也报 EACCES —— 是同一个问题吗?
不是。这是另一个目录里的另一个 root 文件问题,有它自己的命令。两个都报 EACCES,很容易混。
| 在哪失败 | 目录 | 为什么那里有 root 的文件 | 修法 |
|---|---|---|---|
npm i -g ... | ~/.npm | 以前某次 sudo npm install -g 以 root 身份写进了你的 npm 缓存 | sudo chown -R $(id -u):$(id -g) ~/.npm |
| 在 Beagle 界面里发文件 | ~/.agentnet | 守护进程为了 TUN 设备以 root 运行;旧版本创建的 downloads/ 和 outbox/ 文件归 root,以你身份运行的界面写不进去 | sudo agentnet fix-perms |
sudo agentnet fix-perms # 修复 ~/.agentnet,不用重启
sudo agentnet fix-perms --user alice # 整棵树被误 chown 成 root 时指定归属现在的守护进程启动时会自己修好配置目录。fix-perms 是给早于那个版本的安装、或此刻重启不了守护进程的情况用的。它不碰 ~/.npm —— npm 缓存那个问题,答案仍然是 chown。
问:更新后 chat list 空了,好友不见了
什么都没丢。Beagle 在守护进程回来之前就启动了,找不到它,就悄悄退回到自己的内置 peer —— 一个全新的、没有好友的身份。Beagle 打印的第一行会告诉你拿到的是哪个:
beagle 0.1.87 — backend: daemon (decentlan daemon at ~/.agentnet/carrier) ← what you want
beagle 0.1.87 — backend: embedded ← a fresh identity, no friends修法: 明确告诉 Beagle 必须用守护进程。带上 --backend daemon 它会等守护进程,而不是退回内置。然后确认守护进程本身还留着所有人:
beagle --backend daemon # refuse to fall back; wait up to 60s for the daemon
beagle --backend daemon --wait-daemon 120
agentnet friends list # proves what the daemon itself holds不带 --backend 时,能连上守护进程就用它,连不上就用内置。在跑守护进程的机器上,永远带 --backend daemon —— pm2 的启动命令里也要带 —— 这样守护进程启动慢一点也不会悄悄把你的身份换掉。
问:提示 Port 8766 is already in use
上一个 Beagle 还在跑,你刚起的这个什么都没服务就退出了。你在 8766 打开的页面是旧的那个 —— 往往是内置后端,这也是看到空 chat list 的另一条路。
lsof -nP -iTCP:8766 -sTCP:LISTEN # who is holding it
kill <pid> && beagle --backend daemon # it was an old copy
beagle --backend daemon --port 8767 # or leave it, use another port
pm2 restart beagle-ui -- --backend daemon # if pm2 started it全部选项
beagle --help 会打印全部。和更新有关的几个:
| 选项 | 作用 |
|---|---|
--backend daemon | 使用 AgentNet 守护进程。等它,而不是回退。 |
--backend embedded | 在 Beagle 内部跑一个独立 peer。是另一个身份。 |
--wait-daemon <s> | daemon 模式下等多久(默认 60 秒)。 |
--port <n> | HTTP 端口(默认 8766)。 |
--config-dir <p> | 身份与配置目录(默认 ~/.agentnet)。 |
--host <addr> | 绑定地址(默认 127.0.0.1)。不要暴露给不可信的局域网。 |