让 Agent 在场并接手指派的工作
三档在场(关闭 / 前台 / 常驻)、常驻服务的安装、值守范围文件,以及始终由机主本机掌控的主权边界。
三档在场
「在场」指某台机器上有一个 runner 正在替某个 Agent 认领并执行被指派的工作。它有三档,默认关闭,逐档递进——只有机主在本机上显式开启,才会进入更高档。
| 档位 | 含义 | 如何开启 |
|---|---|---|
| 关闭(默认) | 没有 runner。Agent 可被 @、被指派、被委派,但不会有人接手,任务停在队列里。 | 无需操作,这是默认状态。 |
| 前台 | 机主在终端里跑一条前台命令,进程活着时认领并执行工作,关掉终端即结束。 | tandem --as <slug> agent run |
| 常驻 | 把 runner 装成操作系统后台服务,登录后随系统起,崩溃后按节流重启。始终显式安装,绝不自动开启。 | tandem agent service install --as <slug> --yes |
前台:最快的一次在场
tandem --as <slug> agent run前台适合先验证一次:确认这个 Agent 能认领到被指派的工作、能把结果写回。它需要该 Agent 的令牌(先完成 register),并使用你本机上 Agent 运行时自己的登录,Tandem 不持有模型密钥。
常驻:装成后台服务
常驻会为该 Agent 写入当前平台的服务文件,运行的就是前台那条轮询命令(poll 模式,不是一次性)。每个 Agent 一个独立服务,与本机守护进程的服务相互独立。
tandem agent service install --as <slug> --dry-runtandem agent service install --as <slug> --yes| 平台 | 服务管理器 | 崩溃保护 |
|---|---|---|
| macOS | launchd(用户级 LaunchAgent) | KeepAlive + ThrottleInterval |
| Linux | systemd(--user 单元) | Restart=on-failure + RestartSec |
| Windows | 任务计划程序(登录触发) | RestartOnFailure(间隔 + 次数) |
服务文件里不含任何 Tandem 令牌——认证仍留在 ~/.tandem/auth.json。安装时会烘焙 PATH、HOME 以及(若已设置)CLAUDE_CONFIG_DIR,让无头环境也能解析到 tandem/node/claude 并复用你的登录。若你的运行时依赖 CLAUDE_CONFIG_DIR,请在安装前于当前 shell 里设好,以便被捕获。
tandem agent service status --as <slug>值守范围:本机上的一份策略
机主可以约束每个 Agent 在这台机器上愿意接手哪些工作。这份策略只存在于本机 ~/.tandem/duty.json,绝不上传、绝不存到平台——平台即便被攻陷也改不了它。runner 在每次认领前读取它,并把范围作为「收窄」条件随认领请求发送。
文件形如 { "agents": { "mio-claude": { "products": ["tandem", "atlas"], "triggers": ["assignment", "mention"] } } }。顶层按 Agent 的 slug 分组,每个 Agent 下有两个可选字段:
| 字段 | 含义 | 省略时 |
|---|---|---|
| products | 只认领这些产品(按 slug)下的工作。 | 认领该 Agent 有权访问的全部产品。 |
| triggers | 只认领这些触发方式的工作:explicit_dispatch / assignment / mention。 | 全部触发方式都认领。 |
范围只会「收窄」,不会「放宽」——它叠加在服务端已有的「只认领自己的、且权限允许的工作」之上。策略文件缺失、字段缺失或 JSON 写坏了,都会安全地回退到「认领权限允许的全部工作」。但要注意:products 里若写了一个拼错、当前 workspace 里并不存在的产品 slug,该条目会解析到「零个产品」——Agent 仍会保持在线,却什么都认领不到(看起来在场却一直空转)。所以 products 只应写真实存在的 slug,可用 tandem agent service status 复核。改动即时生效,无需重启 runner。
主权边界
- 只有机主能在本机开启在场:没有任何远程或 API 路径可以替你启动或安装 runner。
- 常驻永远是显式选择,绝不是默认,没有任何东西会自动安装它。
- 令牌与值守范围都留在本机 ~/.tandem 下,绝不上传;值守策略也绝不存到平台。
- 长任务期间即使很久没有输出,runner 也会以心跳维持在场,避免被误判为离线;但在场始终是活性判断,不是承诺。