Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/blooio-channel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"eve": minor
"@vercel/eve-catalog": minor
---

Add a built-in Blooio channel (`eve/channels/blooio`).

`blooioChannel()` connects an agent to iMessage, RCS, and SMS through the Blooio v2 API. It verifies inbound `X-Blooio-Signature` webhooks (HMAC-SHA256 over `<timestamp>.<body>`), dispatches `message.received` events with per-line continuation tokens, and supports 1:1 and group conversations. The `BlooioHandle` exposed to hooks and event handlers wraps the full messaging surface: sending text/attachments with iMessage send-effects, inline replies, idempotency keys and contact-card sharing, tapback/emoji reactions, typing indicators, read receipts, contact capability checks, message history, and a raw API escape hatch. Credentials default to `BLOOIO_API_KEY` and `BLOOIO_WEBHOOK_SECRET`.
21 changes: 21 additions & 0 deletions apps/docs/lib/integrations/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,27 @@ export default twilioChannel({
\`\`\``,
configure: `In the Twilio console, point your messaging service or phone number webhook at eve's route (\`/eve/v1/twilio\`). Provide the account SID and auth token via environment variables. See the [Twilio channel docs](/docs/channels/twilio) for SMS vs. WhatsApp specifics.`,
},
blooio: {
logo: "blooio",
docsHref: "/docs/channels/blooio",
keywords: ["imessage", "rcs", "sms", "messaging", "phone", "apple"],
install: `Install the framework and the Blooio channel:

\`\`\`bash
npm install eve@latest
\`\`\``,
quickStart: `Create \`agent/channels/blooio.ts\`:

\`\`\`ts
// agent/channels/blooio.ts
import { blooioChannel } from "eve/channels/blooio";

export default blooioChannel();
\`\`\`

The channel reads \`BLOOIO_API_KEY\` and \`BLOOIO_WEBHOOK_SECRET\` from the environment by default.`,
configure: `Create a Blooio API key and a webhook that points at the route eve serves (\`/eve/v1/blooio\`). Provide the API key and webhook signing secret through \`BLOOIO_API_KEY\` and \`BLOOIO_WEBHOOK_SECRET\`. Inbound \`message.received\` events are verified with HMAC-SHA256 and dispatched to your agent; replies, tapback reactions, typing indicators, and read receipts go back through the Blooio v2 API. See the [Blooio channel docs](/docs/channels/blooio) for group chats and send options.`,
},
github: {
logo: "github",
docsHref: "/docs/channels/github",
Expand Down
14 changes: 14 additions & 0 deletions apps/docs/lib/integrations/logos.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,19 @@ export const twilioLogo = (props: LogoProps) => (
</svg>
);

export const blooioLogo = (props: LogoProps) => (
<svg fill="none" viewBox="0 0 265 155" xmlns="http://www.w3.org/2000/svg" {...props}>
<path
d="M86.5954 73.4747C86.092 74.9551 85.6415 76.4636 85.2439 78C85.2439 78 83.0013 85 83.0013 97.0351C83.0013 109.07 82.9999 135.233 82.9999 135.233V154.268H107.111L138.202 154.268L151.24 154.268L153.486 154.268L209.393 154.268C218.091 154.256 225.81 152.846 232.55 150.038C239.459 147.077 245.24 143.058 249.893 137.982C254.687 132.906 258.282 126.843 260.679 119.793C263.217 112.743 264.486 104.988 264.486 96.5283C264.486 88.2092 263.217 80.5247 260.679 73.4747C258.282 66.4246 254.687 60.3616 249.893 55.2856C245.24 50.2095 239.459 46.2615 232.55 43.4415C225.81 40.4928 218.091 39.0123 209.393 39.0001L138.202 39C129.46 39 121.634 40.4805 114.725 43.4415C107.957 46.2615 102.176 50.2095 97.3818 55.2856C92.7288 60.3616 89.1334 66.4246 86.5954 73.4747Z"
fill="currentColor"
/>
<path
d="M177.891 34.4747C178.394 35.9551 178.845 37.4636 179.242 39C179.242 39 181.485 46 181.485 58.0351C181.485 70.0702 181.486 96.2328 181.486 96.2328V115.268H157.375L126.285 115.268L113.246 115.268L111 115.268L55.093 115.268C46.3954 115.256 38.6766 113.846 31.9366 111.038C25.0276 108.077 19.2466 104.058 14.5936 98.9825C9.79956 93.9064 6.2041 87.8434 3.80707 80.7934C1.26904 73.7433 0 65.9883 0 57.5283C0 49.2092 1.26904 41.5247 3.80707 34.4747C6.2041 27.4246 9.79956 21.3616 14.5936 16.2856C19.2466 11.2095 25.0276 7.26154 31.9366 4.44153C38.6766 1.4928 46.3954 0.0122986 55.093 6.10352e-05L126.285 0C135.027 0 142.852 1.4805 149.761 4.44153C156.529 7.26154 162.31 11.2095 167.104 16.2856C171.758 21.3616 175.353 27.4246 177.891 34.4747Z"
fill="#007AFF"
/>
</svg>
);

export const linearLogo = (props: LogoProps) => (
<svg fill="none" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" {...props}>
<path
Expand Down Expand Up @@ -142,6 +155,7 @@ export const logos = {
teams: teamsLogo,
telegram: telegramLogo,
twilio: twilioLogo,
blooio: blooioLogo,
linear: linearLogo,
notion: notionLogo,
datadog: datadogLogo,
Expand Down
7 changes: 7 additions & 0 deletions packages/eve-catalog/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ export const INTEGRATIONS: readonly IntegrationEntry[] = [
tagline: "Reach users over SMS and WhatsApp through Twilio.",
surfaces: { scaffoldable: false, gallery: true },
},
{
slug: "blooio",
name: "Blooio",
kind: "channel",
tagline: "Send and receive iMessage, RCS, and SMS through Blooio.",
surfaces: { scaffoldable: false, gallery: true },
},
{
slug: "github",
name: "GitHub",
Expand Down
5 changes: 5 additions & 0 deletions packages/eve/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,11 @@
"import": "./dist/src/public/channels/github/index.js",
"default": "./dist/src/public/channels/github/index.js"
},
"./channels/blooio": {
"types": "./dist/src/public/channels/blooio/index.d.ts",
"import": "./dist/src/public/channels/blooio/index.js",
"default": "./dist/src/public/channels/blooio/index.js"
},
"./channels/discord": {
"types": "./dist/src/public/channels/discord/index.d.ts",
"import": "./dist/src/public/channels/discord/index.js",
Expand Down
Loading