MINARA
使用 Minara客户端与界面消息平台

Signal

通过本地 signal-cli 子进程发送注重隐私的提醒,无需 SDK、无 Meta、无第三方中转。

🟢 运行时就绪:Signal 没有 HTTP API,Minara 在本地调用 signal-cli。 仅支持发送:Signal 协议不支持编辑消息, 因此 helper 会缓冲 token,在最终化时统一发送。

你能获得什么

  • 通过自己的 Signal 账户发送端到端加密提醒
  • 无需商业账户,无第三方中转
  • 每条消息最多 4 096 个字符(helper 默认值)
  • 通过 channel 按消息覆盖收件人,必须是有权发送消息的 E.164 号码

前置条件

signal-cli 是一个基于 Java 的 Signal 客户端,负责处理注册、密钥材料和发送流程。Minara 不内置该工具,需在主机上单独安装,并为 Minara 提供一个手机号。

若 Minara 启动时 signal-cli 不在主机的 PATH 中,signal 提供商会从网关映射中静默移除(Agent 仍正常启动,其他提供商不受影响)。这样可将 Signal 设计为可选项,不会影响其他用户的启动流程。

配置步骤

1. 安装 signal-cli

macOS(Homebrew):

brew install signal-cli

Linux / Docker: 参见上游仓库说明: github.com/AsamK/signal-cli。 大多数发行版需要 Java 17+ 作为前置依赖。

验证安装:

signal-cli --version

2. 注册发送方号码

使用一个尚未关联 Signal 账户的手机号(或先将其从 Signal 应用解绑):

signal-cli -u +15555550100 register

Signal 会发送一条包含验证码的短信。完成注册:

signal-cli -u +15555550100 verify 123456

一次性操作:密钥会缓存到磁盘,后续发送无需重复注册。

3. 从 shell 发送测试消息(健全性检查)

接入 Minara 前,先确认 signal-cli 本身可正常工作:

signal-cli -u +15555550100 send -m "hello" +15555550200

收件人的 Signal 应用应在一秒内收到消息。若此步骤失败,Minara 无法修复该问题,请先排查 signal-cli

4. 配置 Minara

minara auth messaging add signal

或直接写入项目根目录的 .env 文件:

SIGNAL_CLI_NUMBER=+15555550100
SIGNAL_RECIPIENT=+15555550200
SIGNAL_CLI_BINARY=signal-cli

两个号码均须符合严格的 E.164 格式:以 + 开头,包含国家代码,仅含数字,不含空格或连字符。Minara 会在每次 send_message() 调用时重新验证收件人,确保错误的覆盖值无法通过。

SIGNAL_CLI_BINARY 为可选项;若 signal-cli 安装在默认 PATH 查找范围之外,可将其设置为绝对路径。

5. 通过 Minara 测试

minara auth messaging test signal

安全机制:Signal 为何区别处理

Signal 会启动一个子进程,属于 CLAUDE.md §4a Bucket B 范畴。apps/agent/src/messaging/signal.ts 模块豁免于 guardCommand / detectJail,原因如下:

  1. argv 是静态的:signal-cli -u <number> send -m <body> -- <recipient>,不会将 LLM 输入拼接到参数中
  2. 两个手机号均在工厂函数初始化时(发送方)及每次发送时(收件人)通过严格的 E.164 正则验证
  3. 消息体通过独立的 -m 参数槽传入,不会拼接到命令字符串中
  4. 收件人前的 -- 终止符可阻断以连字符开头的参数注入尝试,对已验证的输入同样生效
  5. 子进程以 shell: false 方式启动,不经过 shell 对特殊字符的解释

LLM 可见的字符串不会进入 argv。查看源码可见模块文档注释中对 "Bucket B" 的标注。

覆盖收件人

send_message({
  provider: "signal",
  channel: "+15555559999",
  text: "Critical: position liquidation imminent",
})

故障排查

Minara 启动时未挂载 signal 提供商

  • signal-cli 不在 PATH 中。运行 which signal-cli 确认;修复安装,或将 SIGNAL_CLI_BINARY 设为绝对路径
  • 环境变量未设置。工厂函数要求 SIGNAL_CLI_NUMBERSIGNAL_RECIPIENT 均不为空才能返回网关

"Rate limit exceeded (429)"

  • Signal 对自动化发送有较严格的发送方频率限制。请勿频繁发送;将提醒分散发出,或将多个事件合并为一条消息

"Invalid E.164 format"

  • 两个号码均须为 +<国家代码><号码> 格式,仅含数字,不含空格、连字符或括号。Minara 会拒绝 (202) 555-1234,请使用 +12025551234

"Unregistered user"

  • 收件人未注册 Signal,或其账户已被删除或解绑。只有 Signal 系统中存在的号码才能接收消息

参考

本页目录