状态伴侣有一条硬要求:它必须在不改变 Agent 运行方式的前提下知道它们在干什么。Agent Island 完全不往 Claude Code 或 Codex 里注入任何东西。这两个工具本来就把每一次会话记到本地文件里,App 只是去读
会话都在哪
Claude Code 为每个会话在 ~/.claude/projects/<project>/<session-id>.jsonl 下写一份 JSONL 记录 —— 每条用户消息、助手回合和工具结果都是一行 JSON。通过 Claude 桌面 App 打开的会话,还会在 ~/Library/Application Support/Claude/claude-code-sessions/ 下多一个记账文件,里面带着可读标题、归档标记,以及一个指回 CLI 记录的 cliSessionId。Agent Island 把两者连起来,所以桌面线程会带着它真实的标题出现
Codex 把 rollout 写在 ~/.codex/sessions/YYYY/MM/DD/ 下。第一行是一条 session_meta 记录,含会话 id、工作目录和发起方。有个很实际的细节:这第一行内嵌了完整的基础指令,可能长达几十 KB,固定大小的一次读取会把 JSON 从中间截断 —— 所以扫描器会一直取新的块,直到真的看见第一个换行
从行到状态
岛上的状态 —— 工作中、轮到你了、卡住、被限流、需要认证 —— 来自一台跑在每份记录尾部的小状态机。有意思的是哪些东西不算一个结束的回合:
- 带
stop_reason: "end_turn"的助手行通常意味着轮到你了。但 Claude 写限流横幅(「You've hit your session limit…」)用的是同一个信封,只靠isApiErrorMessage: true区分。从 1.5.1 起,这类行永远不会被判成完成 —— 被告知要等,不是一次回合 - 标了
isSidechain的行会跳过(较老的 Claude Code 会把子 Agent 的流量混进主记录) - Codex 的子 Agent 与自动化 rollout 在扫描时就被过滤掉 —— 那是 另一个故事
文件监听让这一切很便宜:记录被写入时 FSEvents 触发一次重扫,所以一个结束的回合通常一到两秒就出现在你屏幕上,不需要轮询循环
App 发起的每一个网络请求
用量环需要磁盘上没有的数据,所以这里有一份很短、且完整的对外通信清单:
api.anthropic.com/api/oauth/usage—— Claude 的额度窗口,用的是你本机已有的 Claude Code 登录所持的 OAuth tokenchatgpt.com/backend-api/wham/usage—— Codex 的额度窗口,同样的方式,用你本机的 Codex 凭据- GitHub —— 更新检查用的 Sparkle appcast 与发布源,以及本站页头 star 数用的公开仓库 API
就这些。没有 Agent Island 服务器,没有账号,没有分析 SDK,没有崩溃上报。会话内容只被解析成状态,永远不离开你的机器。App 是开源的,所以这句话可以核查:在代码里搜 URLSession / HttpClient,你会正好找到这几个端点
那个会动手的部分,以及它为什么被关掉
历史说明:早期版本里有一个自动续跑功能,可以在额度重置后重启一个会话。该功能已经退役,不属于当前产品。Agent Island 现在只监控本地状态并提醒用户,不提交提示词,也不继续任何一次运行
如果要更短的版本:你的 Agent 早就把一切都告诉了文件系统。Agent Island 只是在听 —— 并且只在真的需要人的时候才打断你