feat(channels): add Linq channel for iMessage/RCS/SMS support
The existing iMessage channel relies on AppleScript and only works on macOS. Linq provides a REST API for iMessage, RCS, and SMS — this gives ZeroClaw native iMessage support on any platform via webhooks. Implements LinqChannel following the same patterns as WhatsAppChannel: - Channel trait impl (send, listen, health_check, typing indicators) - Webhook handler with HMAC-SHA256 signature verification - Sender allowlist filtering - Onboarding wizard step with connection testing - 18 unit tests covering parsing, auth, and signature verification Resolves #656 — the prior issue was closed without a merged PR, so this is the actual implementation.
This commit is contained in:
parent
e23edde44b
commit
361e750576
5 changed files with 1003 additions and 5 deletions
|
|
@ -5,6 +5,7 @@ pub mod email_channel;
|
|||
pub mod imessage;
|
||||
pub mod irc;
|
||||
pub mod lark;
|
||||
pub mod linq;
|
||||
pub mod matrix;
|
||||
pub mod mattermost;
|
||||
pub mod qq;
|
||||
|
|
@ -21,6 +22,7 @@ pub use email_channel::EmailChannel;
|
|||
pub use imessage::IMessageChannel;
|
||||
pub use irc::IrcChannel;
|
||||
pub use lark::LarkChannel;
|
||||
pub use linq::LinqChannel;
|
||||
pub use matrix::MatrixChannel;
|
||||
pub use mattermost::MattermostChannel;
|
||||
pub use qq::QQChannel;
|
||||
|
|
@ -1255,6 +1257,7 @@ pub fn handle_command(command: crate::ChannelCommands, config: &Config) -> Resul
|
|||
("Matrix", config.channels_config.matrix.is_some()),
|
||||
("Signal", config.channels_config.signal.is_some()),
|
||||
("WhatsApp", config.channels_config.whatsapp.is_some()),
|
||||
("Linq", config.channels_config.linq.is_some()),
|
||||
("Email", config.channels_config.email.is_some()),
|
||||
("IRC", config.channels_config.irc.is_some()),
|
||||
("Lark", config.channels_config.lark.is_some()),
|
||||
|
|
@ -1391,6 +1394,17 @@ pub async fn doctor_channels(config: Config) -> Result<()> {
|
|||
));
|
||||
}
|
||||
|
||||
if let Some(ref lq) = config.channels_config.linq {
|
||||
channels.push((
|
||||
"Linq",
|
||||
Arc::new(LinqChannel::new(
|
||||
lq.api_token.clone(),
|
||||
lq.from_phone.clone(),
|
||||
lq.allowed_senders.clone(),
|
||||
)),
|
||||
));
|
||||
}
|
||||
|
||||
if let Some(ref email_cfg) = config.channels_config.email {
|
||||
channels.push(("Email", Arc::new(EmailChannel::new(email_cfg.clone()))));
|
||||
}
|
||||
|
|
@ -1711,6 +1725,14 @@ pub async fn start_channels(config: Config) -> Result<()> {
|
|||
)));
|
||||
}
|
||||
|
||||
if let Some(ref lq) = config.channels_config.linq {
|
||||
channels.push(Arc::new(LinqChannel::new(
|
||||
lq.api_token.clone(),
|
||||
lq.from_phone.clone(),
|
||||
lq.allowed_senders.clone(),
|
||||
)));
|
||||
}
|
||||
|
||||
if let Some(ref email_cfg) = config.channels_config.email {
|
||||
channels.push(Arc::new(EmailChannel::new(email_cfg.clone())));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue