关于 imsg-rpc
imsg-rpc 是用于管理 launchd 服务的技能,该服务通过 Unix socket 将 JoelClaw Gateway 守护进程连接到 iMessage。内容涵盖服务健康检查、应用构建与签名、完全磁盘访问设置及 socket 故障排查。
主要功能
- 01管理 launchd 服务
- 02检查 socket 与 Gateway 健康状态
- 03构建并签名 imsg 应用
- 04设置完全磁盘访问权限
- 05排查 JSON-RPC socket 问题
适用场景
- 01检查 iMessage Gateway 连通性
- 02在新机器上设置服务
- 03恢复缺失或无响应的 socket
- 04诊断完全磁盘访问故障
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ joelhooks/ joelclaw --skill imsg-rpc安装后在 Claude Code 中输入/imsg-rpc确认已加载。
附带文件agents/openai.yaml
详细介绍
imsg-rpc 技能
管理 com.joel.imsg-rpc launchd 服务,通过 Unix 套接字将网关守护进程连接到 iMessage。
架构(ADR-0121)
gateway daemon (bun, no FDA)
↕ JSON-RPC over /tmp/imsg.sock
imsg-rpc (com.joel.imsg-rpc launchd agent, has FDA)
↕ SQLite reads
~/Library/Messages/chat.db
- 源代码:
~/Code/steipete/imsg(由我们维护,可自由修改) - 构建二进制文件:
~/Code/steipete/imsg/bin/imsg - 启动二进制文件:
/Applications/imsg-rpc.app/Contents/MacOS/imsg - 套接字:
/tmp/imsg.sock - launchd plist:
~/Library/LaunchAgents/com.joel.imsg-rpc.plist - 日志:
/tmp/joelclaw/imsg-rpc.{log,err} - 网关频道:
packages/gateway/src/channels/imessage.ts
状态检查
launchctl print gui/$(id -u)/com.joel.imsg-rpc | rg "state =|pid =|runs =|last exit code"
lsof -p "$(launchctl print gui/$(id -u)/com.joel.imsg-rpc | awk '/pid =/{print $3; exit}')" | rg "imsg.sock|chat.db"
lsof -nP -U | rg "imsg.sock|com.joel.gateway|/tmp/imsg.sock" # gateway socket peer
tail -10 /tmp/joelclaw/gateway.log | rg imessage
健康状态:PID 存在,退出代码为 0,网关显示 watch.subscribe OK。
重启
launchctl unload ~/Library/LaunchAgents/com.joel.imsg-rpc.plist
launchctl load ~/Library/LaunchAgents/com.joel.imsg-rpc.plist
重新构建 imsg
始终使用 build-local.sh,而不是 make build,这样签名才能保持稳定,并确保 /Applications/imsg-rpc.app 与源代码构建保持同步:
cd ~/Code/steipete/imsg && ./build-local.sh
build-local.sh 现在会:
- 构建
bin/imsg - 使用
imsg Local Signing签名 - 通过
scripts/install-rpc-app.sh更新并签名/Applications/imsg-rpc.app
设置 FDA(新设备)
imsg 二进制文件需要“完全磁盘访问”权限。macOS 要求代码签名可验证,才能授予此权限。
1. 使用现有签名身份
检查可用的代码签名身份,无需导出密钥。身份有效时,复用服务已采用的身份。如需新身份,请使用获准的钥匙串流程;私钥必须保留在钥匙串中,或存放在任务专用且权限严格的临时目录中,并在完成后清理。不要使用共享的固定临时文件名,也不要使用硬编码的导出密码。签名前验证身份和信任状态。
2. 构建并签名
cd ~/Code/steipete/imsg && ./build-local.sh
3. 在“系统设置”中授予 FDA
open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"
- 点击 +
- 按 ⌘⇧G,粘贴
/Applications/imsg-rpc.app,然后按 Enter - 切换为 开启
4. 加载服务
launchctl load ~/Library/LaunchAgents/com.joel.imsg-rpc.plist
验证:运行 tail -f /tmp/joelclaw/gateway.log | grep imessage,应显示 watch.subscribe OK。
故障排查
imsg-rpc.log 中出现 permissionDenied
缺少 FDA,或 csreq 不匹配。检查:
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client, auth_value FROM access WHERE client LIKE '%imsg%';"
# auth_value 2 = allowed, 0 = denied
/usr/bin/log show --last 10m --style compact \
--predicate 'process == "tccd" && (eventMessage CONTAINS "com.steipete.imsg" || eventMessage CONTAINS "kTCCServiceSystemPolicyAllFiles")' \
| tail -80
如果被拒绝(0):前往“系统设置”→“完全磁盘访问”,将 imsg 切换为开启。
如果缺少:重新执行 FDA 设置步骤 3。
如果 tccd 对 /Applications/imsg-rpc.app/Contents/MacOS/imsg 显示 AUTHREQ_RESULT ... authValue=2,则表示已授予 FDA。
套接字存在,但网关无法订阅
imsg-rpc 在接受连接后崩溃了。检查 /tmp/joelclaw/imsg-rpc.err。重启服务。
出现 connect ENOENT /tmp/imsg.sock,但 launchd 显示服务正在运行
守护进程可以继续运行,但 Unix 套接字路径已被取消链接。必须重新创建套接字路径,网关才能连接。
launchctl kickstart -k gui/$(id -u)/com.joel.imsg-rpc
ls -l /tmp/imsg.sock
网关现在会在反复出现 ENOENT 时尝试自动修复,但在故障期间,手动 kickstart 是最快的恢复方式。
重新构建后切换 FDA 没有帮助
你可能重新构建时没有更新应用包。重新运行:
cd ~/Code/steipete/imsg && ./build-local.sh
imsg-rpc 不断重启(退出代码 1)
可能是 FDA 授权被拒绝。在终端中运行以进行测试:
/Applications/imsg-rpc.app/Contents/MacOS/imsg chats --limit 1
如果运行成功,但 launchd 仍失败 → FDA 条目对应的路径或签名有误。
JSON-RPC 协议参考
网关通过 /tmp/imsg.sock 使用以下方法:
// Subscribe to incoming messages
{"jsonrpc":"2.0","method":"watch.subscribe","params":{"participants":["handle"]},"id":1}
// Send a message
{"jsonrpc":"2.0","method":"send","params":{"to":"handle","text":"..."},"id":2}
// Inbound notification format
{"jsonrpc":"2.0","method":"message","params":{"subscription":1,"message":{...}}}
文件
| 路径 | 用途 |
|---|---|
~/Code/steipete/imsg/ | imsg 源代码(由我们维护) |
~/Code/steipete/imsg/bin/imsg | 已构建的二进制文件 |
/Applications/imsg-rpc.app | launchd 进程的 FDA 目标应用包 |
~/Code/steipete/imsg/build-local.sh | 构建 + 签名 + 同步应用 |
~/Code/steipete/imsg/scripts/install-rpc-app.sh | 创建并签名 /Applications/imsg-rpc.app |
~/Library/LaunchAgents/com.joel.imsg-rpc.plist | launchd 服务(不在 git 中) |
packages/gateway/src/channels/imessage.ts | 网关套接字客户端 |
apps/web/content/adrs/0121-imsg-rpc-socket-daemon.md | ADR |