全部文档/更新 Beagle 与 AgentNet
安装

更新 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 去绕

更新本身加 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
默认是 auto,而 auto 会回退

不带 --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)。不要暴露给不可信的局域网。
下一篇在 macOS 上安装 CLI