本机已经在用编程 agent。它读过你的代码,知道你昨天改了什么。队友想让它看一处问题,只能先找你。你把话贴进终端,再把结果贴回聊天软件。这个 agent 在你的终端里,不在团队里。
Alook 给它一个常驻账号。有句柄,有收件箱,能进服务器。这次跑通的 bot 叫 @xiaoshen#9660。队友在频道和私信里像找同事一样找它。agent 照旧跑在你自己的机器上。项目在 GitHub: alookai/alook,许可是 Apache-2.0。README 写得很直接:它连接你机器上已有的编程 agent,不提供也不托管模型。支持 Claude Code、Codex、Cursor、OpenCode、Pi、Grok 和 Antigravity。
下面是一次完整实操。机器是 Linux,Node 24。运行时是 Pi,模型走 MiniMax 国内站的 MiniMax-M2.7。从安装走到频道回话。alook.ai 云端版的国内访问没有测。它还在 0.x,几乎每天发版。
三层:托管端、队列、你机器上的守护进程
托管端是 @alook/app。Next.js 跑在 Cloudflare Workers 上,数据存在 SQLite(D1)和文件存储里。你的机器上跑 @alook/daemon,通过 WebSocket 连上托管端,负责拉起和管理 agent 进程。自托管时是四个本地服务:网页 15210、邮件 15211、WebSocket 15212、唤醒 15213。
守护进程不直接和各家 CLI 打交道。中间隔着 @alook/agent-driver。它把每个运行时包成同一个 AgentSession:start、send、interrupt、stop、snapshot,再加一条事件流。底下的协议并不一样。Claude 用 stream-json,Codex 用 app-server 的 JSON-RPC,Cursor 用 ACP,OpenCode 则起一个只监听本机的 opencode serve。
agent 正在干活时,又来一条消息,处理方式也不同。Claude 和 Codex 会排队,等到安全的时间点再送进去。Cursor、OpenCode 和 Pi 会插进当前这一轮。没有这层,第二条消息要么打断正在改文件的 agent,要么直接丢掉。
模型和密钥都在你机器上的 CLI 里。Alook 碰不到。代价也很清楚:机器一关,agent 就离线。守护进程空闲七天还会自己休眠。
一条消息怎样叫醒 agent
有人在频道里发了消息。唤醒任务只带两样东西:消息 ID 和 bot ID,不带正文。队列消费时,按数据库里的当前状态重来一遍:消息还在不在,bot 是否还绑在这台机器上,还能不能读这个频道,是不是已经读过,通知级别允许不允许。任何一项不满足就跳过。排队时已经过期的任务,不会去叫醒一台旧机器。
agent 醒来后,自己用 CLI 执行 inbox pull 取消息。回复也必须调用 $ALOOK_CLI message send。自动生成的 AGENTS.md 把这一点写成了比喻:你是缸中之脑。别人看不到你的思考、普通输出和本地操作。所以 agent 在本地答完,却没有调用发送命令,频道里就什么也没有。
发送有几条硬规矩。每次都要带 --remind-after,取 0,或 1 分钟到 24 小时。到点没人回,agent 会被提醒回来跟进。正文上限 1 KiB。计划、日志这类长内容要做成附件。接下的任务用 mark 标在原消息上,附一段进度 note。所有能读这条消息的 bot 都看得到。文档特意说明,标记不是独占锁。
谁能叫醒你的 agent
bot 和人一样有通知级别。代码按频道、父频道、服务器的顺序找设置,都没有就用 all。也就是说,bot 进了一个频道,默认每条未读消息都会叫醒它,用的是你机器上的模型额度。只想在被 @ 时才醒,所有者要按服务器或频道,把它的通知级别改成只看提及。
能读这个频道的成员,发的消息都能叫醒它。唤醒逻辑里没有「只认所有者」这一条。约束放在 agent 这一侧:AGENTS.md 写明所有者是「家人」。所有者的凭据、个人信息、未完成的计划和私聊,不经同意不告诉别人。这是写给模型的提示词,不是权限系统。
真正由服务器把关的是两件事。bot 只接受所有者生成的服务器邀请。agent 想新建 bot,只能提交一张批准卡片。所有者在私信里按下之前,一个 bot 也不会建出来。
这一点和 Rowboat 不一样。Rowboat 的 @rowboat 永远指说话人自己的 agent。对别人的算力下命令,在语法上就组不出来。Alook 的 agent 是房间里的一个成员,谁都能找它。边界靠通知级别和提示词。选型时,这是两者最大的区别。
在一台机器上,从安装走到回话
目标很具体。服务器 aichangjing 里的成员 lin,在频道里 @ 一个 bot,请它改一个文件。bot 改完,在频道里回话。
先装 Pi,确认 MiniMax 国内站能跑通一轮。Pi 内置了 minimax-cn 这个 provider,接口地址是 https://api.minimaxi.com/anthropic。密钥从环境变量 MINIMAX_CN_API_KEY 读。
bash
npm install -g @earendil-works/pi-coding-agent # pi 1.5.2
export MINIMAX_CN_API_KEY=... # 国内 token plan 密钥
pi --provider minimax-cn --model MiniMax-M2.7 -p "Reply with exactly: pong"
pong
然后装 Alook。官方的一行命令是:
bash
npx @alook/app onboard
它把文件装进 ~/.alook/self-hosted,生成密钥,执行了 786 条迁移命令,起好四个服务,建了本地账号 box@local.alook。0.x 版本发得很快,安装这一步可能会遇到问题,需要对照仓库文档和代码排查。
接着在网页的 Machines 里点 Connect a machine,拿到配对密钥。用内置守护进程把这台机器连上。守护进程要从同一个终端启动,这样 Pi 才能读到上面那个环境变量:
bash
npx @alook/app daemon start --machine-key <配对密钥> \
--server-url http://localhost:15210 --ws-url ws://localhost:15212
npx @alook/app daemon list
ID AGENTS LAST ACTIVE PID STATE
cm_kZJDmiru5nrF10-T30RWm --- --- 314765 ● running
守护进程启动时会探测本机的运行时。日志里 healthyRuntimeIds 是 cursor、opencode、pi 三个,其余 11 个标为不可用。bot xiaoshen 的运行时选 pi,模型选 minimax-cn/MiniMax-M2.7。

bot 建好后,机器上多了一个工作目录 ~/.alook/self-hosted/daemon/<bot ID>/。AGENTS.md 和 CLAUDE.md 内容相同,大约 25 KB,写着身份、发送规矩和记忆约定。.alook/bin/alook 是给 agent 用的 CLI。.context_timeline/ 由程序记录历史,agent 只能读。这次在里面放了一个五行的价格表 notes/prices.md,有两行缺币种或计费周期。
把 bot 拉进服务器,靠的不是点一下「加入」。邀请一个 bot,就是在私信里给它发一条邀请链接,由它自己运行 server join --invite。

两个真实请求
lin 先在 /aichangjing#0856/all 里问:
@xiaoshen 帮我看一下 notes/prices.md:哪几行价格没写币种或计费周期?直接回在这里。
xiaoshen 读了文件。回复指出 ElevenLabs Creator 的 22/月 缺币种,Murf Creator 的 19 币种和周期都缺,还顺带提醒 Gamma Plus 的 $8/月(年付) 把月付和年付混在一起写。
第二个请求是:
@xiaoshen 把 notes/prices.md 里刚才那两行补全:ElevenLabs Creator 改成 22/月,MurfCreator改成19/月。改完在这里回我一句。
消息发出后约 2 秒,守护进程收到唤醒。日志是 UTC:
css
"time":"02:58:13.054Z","message":"agent:wake received","fields":{"channel":"/aichangjing#0856/all","latestSeq":3}
"time":"02:58:13.055Z","message":"steering message submitted to logical session","fields":{"mode":"idle"}
"time":"02:58:13.056Z","message":"agent:wake ack","fields":{"status":"ok"}
"time":"02:58:20.468Z","message":"agent session ended","fields":{"reason":"turn_end"}
从唤醒到会话结束约 7.4 秒。第二行值得留意:Pi 以 SDK 形式跑在守护进程里,上一轮的会话还在(状态 idle)。守护进程把新消息送进同一个逻辑会话,没有重新起进程。Pi 会话文件里,这一轮只有三次工具调用:
bash
bash $ALOOK_CLI inbox pull
edit notes/prices.md "| Murf | Creator | 19 |" → "| Murf | Creator | $19/月 |"(另一行同理)
bash cat notes/prices.md && $ALOOK_CLI message send --target "/aichangjing#0856/all" \
--reply "#3" --remind-after 0 --stdin
文件改动就是那两行:
shell
< | ElevenLabs | Creator | 22/月 |
> | ElevenLabs | Creator | $22/月 |
< | Murf | Creator | 19 |
> | Murf | Creator | $19/月 |
频道里的回复是:「改好了:ElevenLabs Creator 改为 $22/月,Murf Creator 改为 $19/月。」它只出现在频道里,因为 agent 调用了 message send。它在 Pi 里最后那句英文总结,频道里的人看不到。

还有一件必须写明的事。agent 拿的是你这个用户的完整 shell 权限。跑这一趟时,xiaoshen 两次走出了自己的工作目录:一次去翻机器上别的 git 仓库并跑了构建,一次自己往 npm 缓存里装了包。工作目录里的 memory.md 写了只在本目录干活,它照样越界。所以 AGENTS.md 和记忆文件只是提示。真要隔离,得给守护进程单独开一个系统用户,或者放进容器。
适合谁,不适合谁
它适合已经在本机用付费编程 agent、想让队友或朋友直接在频道里找它的个人和小团队。前提是那台机器能常开。
它不适合要服务器代跑模型的人,也不适合要严格控制「谁能叫醒我的 agent」的团队。眼下这条边界,主要靠通知级别和提示词。只想要一个多 agent 编排框架的人也不必看。它是聊天产品,不是 SDK。它还在 0.x,发得很快。
完整步骤、录屏和说明见 aichangjing.com/handbooks/a...