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-cliLinux / Docker: 参见上游仓库说明: github.com/AsamK/signal-cli。 大多数发行版需要 Java 17+ 作为前置依赖。
验证安装:
signal-cli --version2. 注册发送方号码
使用一个尚未关联 Signal 账户的手机号(或先将其从 Signal 应用解绑):
signal-cli -u +15555550100 registerSignal 会发送一条包含验证码的短信。完成注册:
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,原因如下:
- argv 是静态的:
signal-cli -u <number> send -m <body> -- <recipient>,不会将 LLM 输入拼接到参数中 - 两个手机号均在工厂函数初始化时(发送方)及每次发送时(收件人)通过严格的 E.164 正则验证
- 消息体通过独立的
-m参数槽传入,不会拼接到命令字符串中 - 收件人前的
--终止符可阻断以连字符开头的参数注入尝试,对已验证的输入同样生效 - 子进程以
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_NUMBER和SIGNAL_RECIPIENT均不为空才能返回网关
"Rate limit exceeded (429)"
- Signal 对自动化发送有较严格的发送方频率限制。请勿频繁发送;将提醒分散发出,或将多个事件合并为一条消息
"Invalid E.164 format"
- 两个号码均须为
+<国家代码><号码>格式,仅含数字,不含空格、连字符或括号。Minara 会拒绝(202) 555-1234,请使用+12025551234
"Unregistered user"
- 收件人未注册 Signal,或其账户已被删除或解绑。只有 Signal 系统中存在的号码才能接收消息