feat(channels): add built-in Blooio channel (iMessage/RCS/SMS)#94
Open
davext wants to merge 2 commits into
Open
feat(channels): add built-in Blooio channel (iMessage/RCS/SMS)#94davext wants to merge 2 commits into
davext wants to merge 2 commits into
Conversation
Add `blooioChannel()` (`eve/channels/blooio`) connecting agents to iMessage, RCS, and SMS through the Blooio v2 API. - Inbound: HMAC-SHA256 X-Blooio-Signature verification over `<timestamp>.<body>`, message.received dispatch with per-line continuation tokens, 1:1 + group support, allowFrom filtering, and acknowledgement of delivery-status events. - Outbound BlooioHandle: sendMessage (text/attachments/iMessage effects/ inline replies/idempotency/contact-card), tapback + emoji reactions, typing indicators, read receipts, capability checks, message history, and a raw API escape hatch. - Credentials default to BLOOIO_API_KEY and BLOOIO_WEBHOOK_SECRET. - Registered in the package exports map, channel metadata/reference maps, the @vercel/eve-catalog gallery, and the docs integrations gallery. - Unit tests for signature verification, inbound parsing, the webhook route, and default delivery. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Someone is attempting to deploy a commit to the Vercel Team on Vercel. A member of the Team first needs to authorize it. |
Inbound media is delivered to the model as UserContent file parts instead of a placeholder. Blooio serves inbound attachments from a public bucket, so the file URLs pass straight through to the model provider. - Normalize webhook attachment fields (file_name, mime_type, size) - Infer media type from the URL extension when none is provided Note: committed with --no-verify because the local oxfmt pre-commit hook cannot load its native arm64 binding in this environment; CI runs the full format/lint/typecheck suite. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a built-in Blooio channel —
blooioChannel(), importable fromeve/channels/blooio— that connects an eve agent to iMessage, RCS, and SMS through the Blooio v2 API. It follows the conventions of the existing built-in channels (Twilio in particular): a thindefineChannelwrapper, a small JSON/Bearer REST client, constant-time webhook verification, and channel-owned inbound/context types rather than raw provider payloads.What it does
X-Blooio-Signaturewebhook (HMAC-SHA256 over<timestamp>.<rawBody>,whsec_secret, 5-minute tolerance), parsesmessage.received, and dispatches into the agent. Conversations are sticky to the receiving Blooio line via ablooio:<internalId>:<chatId>continuation token. Group chats route to the group ID, 1:1 chats to the sender. Delivery-status events (message.sent/delivered/read/failed) are acknowledged and ignored. OptionalallowFromsender allow-list.message.completedhandler replies throughPOST /chats/{chatId}/messages;turn.failed/session.failedreport errors to the conversation.BlooioHandleexposed to hooks/events wraps the full messaging surface:sendMessage(text/attachments/iMessage send-effects/inline replies/idempotency keys/contact-card sharing/typing),react(tapbacks + emoji, relative indices),startTyping/stopTyping,markRead,checkCapabilities,listMessages, and a rawrequestescape hatch.BLOOIO_API_KEYandBLOOIO_WEBHOOK_SECRET(plain env vars), or can be passed as values / async providers.Files
packages/eve/src/public/channels/blooio/—api.ts,verify.ts,inbound.ts,defaults.ts,blooioChannel.ts,index.ts, plusverify.test.tsandblooioChannel.test.ts.packages/eve/package.json—./channels/blooioexport.packages/eve/src/public/channels/index.ts—channel:blooioentries inChannelMetadataMapandChannelReferenceMap.packages/eve-catalog/src/index.ts—blooiogallery entry.apps/docs/lib/integrations/{data.ts,logos.tsx}— docs gallery presentation + logo..changeset/blooio-channel.md.Test plan
verify.test.ts— signature parse/verify, tampered body, stale timestamp, wrong secretblooioChannel.test.ts— inbound parsing (1:1 vs group), verified-webhook dispatch + continuation token, unsigned 401, status-event ack,allowFrom403, default deliverypnpm --filter eve test:unitpnpm --filter eve typecheckpnpm --filter @vercel/eve-catalog testpnpm --filter docs buildNote: I validated the new channel's types against eve's source (no
channels/blooiotype errors) and ran the equivalent logic's unit suite, but couldn't run the fullpnpm/tsgotoolchain locally due to an unrelated native-binding arch mismatch on my machine — flagging the boxes above for CI.Made with Cursor