@fabric-harness/channels
v0.17.1
Published
Event-ingress channels (Slack, GitHub, …) for Fabric Harness agents.
Readme
@fabric-harness/channels
Event-ingress channels for Fabric Harness — turn platform webhooks (Slack, GitHub, …) into agent
dispatches. The core Channel seam lives in @fabric-harness/sdk; this package provides the
17 vendor adapters behind subpath exports so vendor code stays out of core.
Handlers are written against the Web Request/Response API and crypto.subtle, so the same channel
runs on Node and Cloudflare.
Maintained subpaths cover Slack, GitHub, Discord, Teams, Telegram, Twilio, WhatsApp, Google Chat,
Linear, Notion, Stripe, Zendesk, Intercom, Shopify, Messenger, Resend, and Salesforce Marketing
Cloud. Run fh add channel <name> to install a versioned recipe. Import channelCompatibility from
@fabric-harness/channels/compatibility for supported provider APIs and the deprecation contract.
Slack
// .fabricharness/channels/slack.ts
import { createSlackChannel } from '@fabric-harness/channels/slack';
export const channel = createSlackChannel({
signingSecret: process.env.SLACK_SIGNING_SECRET!,
agent: 'assistant', // dispatch app mentions / threaded messages here
});The events handler verifies the v0 HMAC signature, answers the URL-verification challenge, and
dispatches app_mention / threaded message events to the agent keyed by the Slack thread — with the
Slack event_id as the dedupe key (exactly-once), the team as tenantId, and the user as the
acting actor (which powers on-behalf-of governance).
Outbound, bind the reply tool to the thread at agent init:
import { replyInSlackThread } from '@fabric-harness/channels/slack';
export default createAgent(({ id }) => {
const thread = channel.parseConversationKey(id);
return { tools: [replyInSlackThread(thread, { botToken: process.env.SLACK_BOT_TOKEN! })] };
});