@fabric-harness/channels 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +6 -1
  3. package/dist/compatibility.d.ts +143 -0
  4. package/dist/compatibility.d.ts.map +1 -0
  5. package/dist/compatibility.js +30 -0
  6. package/dist/compatibility.js.map +1 -0
  7. package/dist/discord.d.ts +53 -0
  8. package/dist/discord.d.ts.map +1 -0
  9. package/dist/discord.js +95 -0
  10. package/dist/discord.js.map +1 -0
  11. package/dist/github.d.ts +37 -1
  12. package/dist/github.d.ts.map +1 -1
  13. package/dist/github.js +5 -5
  14. package/dist/github.js.map +1 -1
  15. package/dist/google-chat.d.ts +59 -0
  16. package/dist/google-chat.d.ts.map +1 -0
  17. package/dist/google-chat.js +127 -0
  18. package/dist/google-chat.js.map +1 -0
  19. package/dist/index.d.ts +4 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +2 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/intercom.d.ts +47 -0
  24. package/dist/intercom.d.ts.map +1 -0
  25. package/dist/intercom.js +40 -0
  26. package/dist/intercom.js.map +1 -0
  27. package/dist/linear.d.ts +46 -0
  28. package/dist/linear.d.ts.map +1 -0
  29. package/dist/linear.js +27 -0
  30. package/dist/linear.js.map +1 -0
  31. package/dist/messenger.d.ts +59 -0
  32. package/dist/messenger.d.ts.map +1 -0
  33. package/dist/messenger.js +49 -0
  34. package/dist/messenger.js.map +1 -0
  35. package/dist/notion.d.ts +46 -0
  36. package/dist/notion.d.ts.map +1 -0
  37. package/dist/notion.js +32 -0
  38. package/dist/notion.js.map +1 -0
  39. package/dist/resend.d.ts +44 -0
  40. package/dist/resend.d.ts.map +1 -0
  41. package/dist/resend.js +49 -0
  42. package/dist/resend.js.map +1 -0
  43. package/dist/salesforce-marketing-cloud.d.ts +39 -0
  44. package/dist/salesforce-marketing-cloud.d.ts.map +1 -0
  45. package/dist/salesforce-marketing-cloud.js +21 -0
  46. package/dist/salesforce-marketing-cloud.js.map +1 -0
  47. package/dist/shopify.d.ts +38 -0
  48. package/dist/shopify.d.ts.map +1 -0
  49. package/dist/shopify.js +29 -0
  50. package/dist/shopify.js.map +1 -0
  51. package/dist/slack.d.ts +19 -1
  52. package/dist/slack.d.ts.map +1 -1
  53. package/dist/slack.js +19 -7
  54. package/dist/slack.js.map +1 -1
  55. package/dist/stripe.d.ts +40 -0
  56. package/dist/stripe.d.ts.map +1 -0
  57. package/dist/stripe.js +58 -0
  58. package/dist/stripe.js.map +1 -0
  59. package/dist/teams.d.ts +58 -0
  60. package/dist/teams.d.ts.map +1 -0
  61. package/dist/teams.js +154 -0
  62. package/dist/teams.js.map +1 -0
  63. package/dist/telegram.d.ts +53 -0
  64. package/dist/telegram.d.ts.map +1 -0
  65. package/dist/telegram.js +76 -0
  66. package/dist/telegram.js.map +1 -0
  67. package/dist/twilio.d.ts +39 -0
  68. package/dist/twilio.d.ts.map +1 -0
  69. package/dist/twilio.js +83 -0
  70. package/dist/twilio.js.map +1 -0
  71. package/dist/webhook-shared.d.ts +43 -0
  72. package/dist/webhook-shared.d.ts.map +1 -0
  73. package/dist/webhook-shared.js +100 -0
  74. package/dist/webhook-shared.js.map +1 -0
  75. package/dist/whatsapp.d.ts +53 -0
  76. package/dist/whatsapp.d.ts.map +1 -0
  77. package/dist/whatsapp.js +98 -0
  78. package/dist/whatsapp.js.map +1 -0
  79. package/dist/zendesk.d.ts +48 -0
  80. package/dist/zendesk.d.ts.map +1 -0
  81. package/dist/zendesk.js +36 -0
  82. package/dist/zendesk.js.map +1 -0
  83. package/package.json +74 -5
package/NOTICE ADDED
@@ -0,0 +1,4 @@
1
+ Fabric Harness
2
+ Copyright 2026 Fabric
3
+
4
+ This product is licensed under the Apache License, Version 2.0.
package/README.md CHANGED
@@ -2,11 +2,16 @@
2
2
 
3
3
  Event-ingress **channels** for Fabric Harness — turn platform webhooks (Slack, GitHub, …) into agent
4
4
  dispatches. The core `Channel` seam lives in `@fabric-harness/sdk`; this package provides the
5
- vendor adapters behind subpath exports so vendor code stays out of core.
5
+ 17 vendor adapters behind subpath exports so vendor code stays out of core.
6
6
 
7
7
  Handlers are written against the Web `Request`/`Response` API and `crypto.subtle`, so the same channel
8
8
  runs on Node and Cloudflare.
9
9
 
10
+ Maintained subpaths cover Slack, GitHub, Discord, Teams, Telegram, Twilio, WhatsApp, Google Chat,
11
+ Linear, Notion, Stripe, Zendesk, Intercom, Shopify, Messenger, Resend, and Salesforce Marketing
12
+ Cloud. Run `fh add channel <name>` to install a versioned recipe. Import `channelCompatibility` from
13
+ `@fabric-harness/channels/compatibility` for supported provider APIs and the deprecation contract.
14
+
10
15
  ## Slack
11
16
 
12
17
  ```ts
@@ -0,0 +1,143 @@
1
+ export type ChannelCompatibilityStatus = 'stable' | 'preview' | 'deprecated';
2
+ export interface ChannelCompatibility {
3
+ /** Import suffix under `@fabric-harness/channels`. */
4
+ subpath: string;
5
+ status: ChannelCompatibilityStatus;
6
+ inboundApi: string;
7
+ outboundApi: string;
8
+ /** External runtime SDK dependency. `none` means Fetch/Web Crypto only. */
9
+ sdk: string;
10
+ }
11
+ /**
12
+ * Published channel compatibility contract. Provider payload changes that only add fields are
13
+ * supported without a Fabric release; breaking provider versions are added here before becoming
14
+ * the default.
15
+ */
16
+ export declare const channelCompatibility: {
17
+ readonly slack: {
18
+ readonly subpath: "slack";
19
+ readonly status: "stable";
20
+ readonly inboundApi: "Slack Events API";
21
+ readonly outboundApi: "Slack Web API";
22
+ readonly sdk: "none";
23
+ };
24
+ readonly github: {
25
+ readonly subpath: "github";
26
+ readonly status: "stable";
27
+ readonly inboundApi: "GitHub Webhooks";
28
+ readonly outboundApi: "GitHub REST 2022-11-28";
29
+ readonly sdk: "none";
30
+ };
31
+ readonly discord: {
32
+ readonly subpath: "discord";
33
+ readonly status: "stable";
34
+ readonly inboundApi: "Discord Interactions";
35
+ readonly outboundApi: "Discord REST v10";
36
+ readonly sdk: "none";
37
+ };
38
+ readonly teams: {
39
+ readonly subpath: "teams";
40
+ readonly status: "stable";
41
+ readonly inboundApi: "Bot Framework Activity";
42
+ readonly outboundApi: "Bot Connector v3";
43
+ readonly sdk: "none";
44
+ };
45
+ readonly telegram: {
46
+ readonly subpath: "telegram";
47
+ readonly status: "stable";
48
+ readonly inboundApi: "Telegram Bot API updates";
49
+ readonly outboundApi: "Telegram Bot API";
50
+ readonly sdk: "none";
51
+ };
52
+ readonly twilio: {
53
+ readonly subpath: "twilio";
54
+ readonly status: "stable";
55
+ readonly inboundApi: "Twilio Webhooks";
56
+ readonly outboundApi: "Twilio REST 2010-04-01";
57
+ readonly sdk: "none";
58
+ };
59
+ readonly whatsapp: {
60
+ readonly subpath: "whatsapp";
61
+ readonly status: "stable";
62
+ readonly inboundApi: "WhatsApp Cloud Webhooks";
63
+ readonly outboundApi: "Meta Graph configurable (v23.0 default)";
64
+ readonly sdk: "none";
65
+ };
66
+ readonly googleChat: {
67
+ readonly subpath: "google-chat";
68
+ readonly status: "stable";
69
+ readonly inboundApi: "Google Chat interaction events v1";
70
+ readonly outboundApi: "Google Chat API v1";
71
+ readonly sdk: "none";
72
+ };
73
+ readonly linear: {
74
+ readonly subpath: "linear";
75
+ readonly status: "stable";
76
+ readonly inboundApi: "Linear Webhooks";
77
+ readonly outboundApi: "Linear GraphQL";
78
+ readonly sdk: "none";
79
+ };
80
+ readonly notion: {
81
+ readonly subpath: "notion";
82
+ readonly status: "stable";
83
+ readonly inboundApi: "Notion Webhooks";
84
+ readonly outboundApi: "Notion REST 2022-06-28+";
85
+ readonly sdk: "none";
86
+ };
87
+ readonly stripe: {
88
+ readonly subpath: "stripe";
89
+ readonly status: "stable";
90
+ readonly inboundApi: "Stripe Events v1";
91
+ readonly outboundApi: "Stripe API";
92
+ readonly sdk: "none";
93
+ };
94
+ readonly zendesk: {
95
+ readonly subpath: "zendesk";
96
+ readonly status: "stable";
97
+ readonly inboundApi: "Zendesk Webhooks";
98
+ readonly outboundApi: "Zendesk Support API v2";
99
+ readonly sdk: "none";
100
+ };
101
+ readonly intercom: {
102
+ readonly subpath: "intercom";
103
+ readonly status: "stable";
104
+ readonly inboundApi: "Intercom Webhooks";
105
+ readonly outboundApi: "Intercom REST 2.14+";
106
+ readonly sdk: "none";
107
+ };
108
+ readonly shopify: {
109
+ readonly subpath: "shopify";
110
+ readonly status: "stable";
111
+ readonly inboundApi: "Shopify Webhooks";
112
+ readonly outboundApi: "Shopify Admin API configurable";
113
+ readonly sdk: "none";
114
+ };
115
+ readonly messenger: {
116
+ readonly subpath: "messenger";
117
+ readonly status: "stable";
118
+ readonly inboundApi: "Messenger Platform Webhooks";
119
+ readonly outboundApi: "Meta Graph configurable (v23.0 default)";
120
+ readonly sdk: "none";
121
+ };
122
+ readonly resend: {
123
+ readonly subpath: "resend";
124
+ readonly status: "stable";
125
+ readonly inboundApi: "Resend Webhooks";
126
+ readonly outboundApi: "Resend API";
127
+ readonly sdk: "none";
128
+ };
129
+ readonly salesforceMarketingCloud: {
130
+ readonly subpath: "salesforce-marketing-cloud";
131
+ readonly status: "stable";
132
+ readonly inboundApi: "Marketing Cloud Event Notification Service";
133
+ readonly outboundApi: "Marketing Cloud REST";
134
+ readonly sdk: "none";
135
+ };
136
+ };
137
+ export type FirstPartyChannelName = keyof typeof channelCompatibility;
138
+ export declare const channelCompatibilityPolicy: {
139
+ readonly packageRule: "Adapters remain dependency-free subpaths unless a required SDK, runtime incompatibility, or independent release cadence requires a package.";
140
+ readonly deprecationNoticeDays: 180;
141
+ readonly removalRule: "Removal occurs only in a major release after at least 180 days of published deprecation notice.";
142
+ };
143
+ //# sourceMappingURL=compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../src/compatibility.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAE7E,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,0BAA0B,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkBwB,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAEtE,eAAO,MAAM,0BAA0B;;;;CAI7B,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Published channel compatibility contract. Provider payload changes that only add fields are
3
+ * supported without a Fabric release; breaking provider versions are added here before becoming
4
+ * the default.
5
+ */
6
+ export const channelCompatibility = {
7
+ slack: { subpath: 'slack', status: 'stable', inboundApi: 'Slack Events API', outboundApi: 'Slack Web API', sdk: 'none' },
8
+ github: { subpath: 'github', status: 'stable', inboundApi: 'GitHub Webhooks', outboundApi: 'GitHub REST 2022-11-28', sdk: 'none' },
9
+ discord: { subpath: 'discord', status: 'stable', inboundApi: 'Discord Interactions', outboundApi: 'Discord REST v10', sdk: 'none' },
10
+ teams: { subpath: 'teams', status: 'stable', inboundApi: 'Bot Framework Activity', outboundApi: 'Bot Connector v3', sdk: 'none' },
11
+ telegram: { subpath: 'telegram', status: 'stable', inboundApi: 'Telegram Bot API updates', outboundApi: 'Telegram Bot API', sdk: 'none' },
12
+ twilio: { subpath: 'twilio', status: 'stable', inboundApi: 'Twilio Webhooks', outboundApi: 'Twilio REST 2010-04-01', sdk: 'none' },
13
+ whatsapp: { subpath: 'whatsapp', status: 'stable', inboundApi: 'WhatsApp Cloud Webhooks', outboundApi: 'Meta Graph configurable (v23.0 default)', sdk: 'none' },
14
+ googleChat: { subpath: 'google-chat', status: 'stable', inboundApi: 'Google Chat interaction events v1', outboundApi: 'Google Chat API v1', sdk: 'none' },
15
+ linear: { subpath: 'linear', status: 'stable', inboundApi: 'Linear Webhooks', outboundApi: 'Linear GraphQL', sdk: 'none' },
16
+ notion: { subpath: 'notion', status: 'stable', inboundApi: 'Notion Webhooks', outboundApi: 'Notion REST 2022-06-28+', sdk: 'none' },
17
+ stripe: { subpath: 'stripe', status: 'stable', inboundApi: 'Stripe Events v1', outboundApi: 'Stripe API', sdk: 'none' },
18
+ zendesk: { subpath: 'zendesk', status: 'stable', inboundApi: 'Zendesk Webhooks', outboundApi: 'Zendesk Support API v2', sdk: 'none' },
19
+ intercom: { subpath: 'intercom', status: 'stable', inboundApi: 'Intercom Webhooks', outboundApi: 'Intercom REST 2.14+', sdk: 'none' },
20
+ shopify: { subpath: 'shopify', status: 'stable', inboundApi: 'Shopify Webhooks', outboundApi: 'Shopify Admin API configurable', sdk: 'none' },
21
+ messenger: { subpath: 'messenger', status: 'stable', inboundApi: 'Messenger Platform Webhooks', outboundApi: 'Meta Graph configurable (v23.0 default)', sdk: 'none' },
22
+ resend: { subpath: 'resend', status: 'stable', inboundApi: 'Resend Webhooks', outboundApi: 'Resend API', sdk: 'none' },
23
+ salesforceMarketingCloud: { subpath: 'salesforce-marketing-cloud', status: 'stable', inboundApi: 'Marketing Cloud Event Notification Service', outboundApi: 'Marketing Cloud REST', sdk: 'none' },
24
+ };
25
+ export const channelCompatibilityPolicy = {
26
+ packageRule: 'Adapters remain dependency-free subpaths unless a required SDK, runtime incompatibility, or independent release cadence requires a package.',
27
+ deprecationNoticeDays: 180,
28
+ removalRule: 'Removal occurs only in a major release after at least 180 days of published deprecation notice.',
29
+ };
30
+ //# sourceMappingURL=compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../src/compatibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Channel, ToolDef } from '@fabric-harness/sdk/channel';
2
+ export interface DiscordConversationRef {
3
+ applicationId: string;
4
+ guildId: string;
5
+ channelId: string;
6
+ threadId?: string;
7
+ }
8
+ export interface DiscordInteractionPayload {
9
+ id?: string;
10
+ type?: 1 | 2 | 3 | 4 | 5;
11
+ guild_id?: string;
12
+ channel_id?: string;
13
+ data?: {
14
+ name?: string;
15
+ custom_id?: string;
16
+ options?: Array<{
17
+ name?: string;
18
+ value?: unknown;
19
+ }>;
20
+ };
21
+ member?: {
22
+ user?: {
23
+ id?: string;
24
+ };
25
+ };
26
+ user?: {
27
+ id?: string;
28
+ };
29
+ }
30
+ export interface DiscordChannelOptions {
31
+ applicationId: string;
32
+ publicKey: string;
33
+ agent: string;
34
+ /** Max clock skew (seconds) tolerated on the signed request timestamp. Default 300. */
35
+ maxSkewSeconds?: number;
36
+ /** Clock injection for tests. */
37
+ now?: () => number;
38
+ }
39
+ export interface DiscordChannel extends Channel {
40
+ conversationKey(ref: DiscordConversationRef): string;
41
+ parseConversationKey(id: string): DiscordConversationRef;
42
+ }
43
+ export declare function discordConversationKey(ref: DiscordConversationRef): string;
44
+ export declare function parseDiscordConversationKey(id: string): DiscordConversationRef;
45
+ export declare function createDiscordChannel(options: DiscordChannelOptions): DiscordChannel;
46
+ export declare function verifyDiscordSignature(publicKeyHex: string, timestamp: string, body: Uint8Array, signatureHex: string): Promise<boolean>;
47
+ export declare function replyInDiscord(ref: DiscordConversationRef, options: {
48
+ botToken: string;
49
+ fetchImpl?: typeof fetch;
50
+ }): ToolDef<{
51
+ text: string;
52
+ }, unknown>;
53
+ //# sourceMappingURL=discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../src/discord.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAkB,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEpF,MAAM,WAAW,sBAAsB;IAAG,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AACxH,MAAM,WAAW,yBAAyB;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAClG,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxB;AACD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AACD,MAAM,WAAW,cAAe,SAAQ,OAAO;IAC7C,eAAe,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAAC;IACrD,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,CAAC;CAC1D;AACD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAE1E;AACD,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,CAK9E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CA0CnF;AAED,wBAAsB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS9I;AAWD,wBAAgB,cAAc,CAAC,GAAG,EAAE,sBAAsB,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CAavJ"}
@@ -0,0 +1,95 @@
1
+ import { conversationKey, defineChannel, defineTool, hexToBytes, parseConversationKey, readJsonBody } from '@fabric-harness/sdk/channel';
2
+ export function discordConversationKey(ref) {
3
+ return conversationKey('discord', 'v1', ref.applicationId, ref.guildId, ref.channelId, ref.threadId ?? 'root');
4
+ }
5
+ export function parseDiscordConversationKey(id) {
6
+ const parsed = parseConversationKey(id);
7
+ if (parsed.provider !== 'discord' || parsed.version !== 'v1' || parsed.segments.length !== 4)
8
+ throw new Error(`Invalid Discord conversation key: "${id}".`);
9
+ const [applicationId, guildId, channelId, threadId] = parsed.segments;
10
+ return { applicationId, guildId, channelId, ...(threadId !== 'root' ? { threadId } : {}) };
11
+ }
12
+ export function createDiscordChannel(options) {
13
+ const maxSkew = options.maxSkewSeconds ?? 300;
14
+ const now = options.now ?? (() => Date.now());
15
+ async function interactions(request, ctx) {
16
+ const body = await readJsonBody(request);
17
+ if (!body)
18
+ return new Response(null, { status: 413 });
19
+ const signature = request.headers.get('x-signature-ed25519');
20
+ const timestamp = request.headers.get('x-signature-timestamp');
21
+ if (!signature || !timestamp)
22
+ return new Response(null, { status: 401 });
23
+ // The Ed25519 signature covers timestamp + body, but only a freshness check
24
+ // stops a captured request from being replayed later.
25
+ const timestampSeconds = Number(timestamp);
26
+ if (!Number.isFinite(timestampSeconds) || Math.abs(Math.floor(now() / 1000) - timestampSeconds) > maxSkew)
27
+ return new Response(null, { status: 401 });
28
+ if (!(await verifyDiscordSignature(options.publicKey, timestamp, body.raw, signature)))
29
+ return new Response(null, { status: 401 });
30
+ const interaction = body.json;
31
+ if (!interaction)
32
+ return new Response(null, { status: 400 });
33
+ if (interaction.type === 1)
34
+ return Response.json({ type: 1 });
35
+ const data = interaction.data;
36
+ const user = interaction.member?.user ?? interaction.user;
37
+ const guildId = String(interaction.guild_id ?? 'direct');
38
+ const channelId = String(interaction.channel_id ?? user?.id ?? 'unknown');
39
+ const text = interaction.type === 2 ? commandText(data) : String(data?.custom_id ?? '');
40
+ await ctx.dispatch(options.agent, {
41
+ instanceId: discordConversationKey({ applicationId: options.applicationId, guildId, channelId }),
42
+ input: {
43
+ type: interaction.type === 2 ? 'discord.command' : interaction.type === 3 ? 'discord.component' : 'discord.interaction',
44
+ text,
45
+ interactionId: interaction.id,
46
+ command: data?.name,
47
+ customId: data?.custom_id,
48
+ },
49
+ ...(interaction.id ? { dedupeKey: String(interaction.id) } : {}),
50
+ tenantId: guildId,
51
+ ...(user?.id ? { actor: { onBehalfOf: String(user.id) } } : {}),
52
+ });
53
+ return Response.json({ type: 5 });
54
+ }
55
+ return defineChannel({
56
+ name: 'discord', routes: [{ method: 'POST', path: '/interactions', handler: interactions }],
57
+ conversationKey: (ref) => discordConversationKey(ref),
58
+ parseConversationKey: (id) => parseDiscordConversationKey(id),
59
+ });
60
+ }
61
+ export async function verifyDiscordSignature(publicKeyHex, timestamp, body, signatureHex) {
62
+ try {
63
+ const key = await crypto.subtle.importKey('raw', viewToBuffer(hexToBytes(publicKeyHex)), { name: 'Ed25519' }, false, ['verify']);
64
+ const timestampBytes = new TextEncoder().encode(timestamp);
65
+ const data = new Uint8Array(timestampBytes.byteLength + body.byteLength);
66
+ data.set(timestampBytes);
67
+ data.set(body, timestampBytes.byteLength);
68
+ return await crypto.subtle.verify('Ed25519', key, viewToBuffer(hexToBytes(signatureHex)), viewToBuffer(data));
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ function viewToBuffer(bytes) {
75
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
76
+ }
77
+ function commandText(data) {
78
+ const options = Array.isArray(data?.options) ? data.options : [];
79
+ return [data?.name, ...options.map((item) => item.value)].filter((value) => value !== undefined).join(' ');
80
+ }
81
+ export function replyInDiscord(ref, options) {
82
+ const fetchImpl = options.fetchImpl ?? fetch;
83
+ return defineTool({
84
+ name: 'reply_in_discord', description: 'Post a message in the Discord channel this agent is handling.',
85
+ inputSchema: { type: 'object', additionalProperties: false, properties: { text: { type: 'string', minLength: 1 } }, required: ['text'] },
86
+ metadata: { effect: 'write', provider: 'discord', channel: 'discord' },
87
+ execute: async ({ text }) => {
88
+ const response = await fetchImpl(`https://discord.com/api/v10/channels/${encodeURIComponent(ref.threadId ?? ref.channelId)}/messages`, {
89
+ method: 'POST', headers: { authorization: `Bot ${options.botToken}`, 'content-type': 'application/json' }, body: JSON.stringify({ content: text }),
90
+ });
91
+ return response.json();
92
+ },
93
+ });
94
+ }
95
+ //# sourceMappingURL=discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../src/discord.ts"],"names":[],"mappings":"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"}
package/dist/github.d.ts CHANGED
@@ -1,10 +1,39 @@
1
- import type { Channel, ToolDef } from '@fabric-harness/sdk';
1
+ import type { Channel, ToolDef } from '@fabric-harness/sdk/channel';
2
2
  export interface GitHubIssueRef {
3
3
  owner: string;
4
4
  repo: string;
5
5
  kind: 'issue' | 'pull';
6
6
  number: number;
7
7
  }
8
+ export interface GitHubWebhookPayload {
9
+ action?: string;
10
+ repository?: {
11
+ name?: string;
12
+ owner?: {
13
+ login?: string;
14
+ };
15
+ };
16
+ issue?: {
17
+ number?: number;
18
+ title?: string;
19
+ body?: string;
20
+ html_url?: string;
21
+ };
22
+ pull_request?: {
23
+ number?: number;
24
+ title?: string;
25
+ body?: string;
26
+ html_url?: string;
27
+ };
28
+ comment?: {
29
+ body?: string;
30
+ html_url?: string;
31
+ };
32
+ sender?: {
33
+ login?: string;
34
+ type?: string;
35
+ };
36
+ }
8
37
  export interface GitHubChannelOptions {
9
38
  /** Webhook secret configured on the GitHub App / repo webhook. */
10
39
  secret: string;
@@ -15,6 +44,13 @@ export interface GitHubChannel extends Channel {
15
44
  conversationKey(ref: GitHubIssueRef): string;
16
45
  parseConversationKey(id: string): GitHubIssueRef;
17
46
  }
47
+ export declare function githubConversationKey(ref: GitHubIssueRef): string;
48
+ export declare function parseGitHubConversationKey(id: string): GitHubIssueRef;
49
+ export interface NormalizedGitHubEvent {
50
+ ref: GitHubIssueRef;
51
+ input: Record<string, unknown>;
52
+ }
53
+ export declare function normalizeGitHubEvent(eventType: string, payload: GitHubWebhookPayload): NormalizedGitHubEvent | undefined;
18
54
  /**
19
55
  * GitHub webhook channel. Verifies the `X-Hub-Signature-256` (`sha256=<hex>` HMAC over the raw body),
20
56
  * and dispatches issue / PR / comment events to a persistent agent keyed by `owner/repo/<kind>/<number>`
@@ -1 +1 @@
1
- {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAkB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC;IAC7C,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAAC;CAClD;AAsDD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAiDhF;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CA0BlJ"}
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAkB,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC3D,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,YAAY,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC;IAC7C,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAAC;CAClD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAEjE;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAQrE;AASD,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,qBAAqB,GAAG,SAAS,CAwBxH;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAiDhF;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CA0BlJ"}
package/dist/github.js CHANGED
@@ -1,8 +1,8 @@
1
- import { conversationKey, defineChannel, defineTool, hexToBytes, parseConversationKey, readJsonBody, verifyHmacSha256, } from '@fabric-harness/sdk';
2
- function githubConversationKey(ref) {
1
+ import { conversationKey, defineChannel, defineTool, hexToBytes, parseConversationKey, readJsonBody, verifyHmacSha256, } from '@fabric-harness/sdk/channel';
2
+ export function githubConversationKey(ref) {
3
3
  return conversationKey('github', 'v1', ref.owner, ref.repo, ref.kind, String(ref.number));
4
4
  }
5
- function parseGitHubConversationKey(id) {
5
+ export function parseGitHubConversationKey(id) {
6
6
  const parsed = parseConversationKey(id);
7
7
  if (parsed.provider !== 'github' || parsed.version !== 'v1' || parsed.segments.length !== 4) {
8
8
  throw new Error(`Invalid GitHub conversation key: "${id}".`);
@@ -18,7 +18,7 @@ const HANDLED = {
18
18
  pull_request: new Set(['opened', 'edited', 'reopened', 'synchronize']),
19
19
  pull_request_review_comment: new Set(['created', 'edited']),
20
20
  };
21
- function normalize(eventType, payload) {
21
+ export function normalizeGitHubEvent(eventType, payload) {
22
22
  const repository = payload.repository;
23
23
  const owner = repository?.owner?.login;
24
24
  const repo = repository?.name;
@@ -82,7 +82,7 @@ export function createGitHubChannel(options) {
82
82
  const sender = payload.sender;
83
83
  if (sender?.type === 'Bot')
84
84
  return new Response(null, { status: 200 }); // don't react to our own bot
85
- const normalized = normalize(eventType, payload);
85
+ const normalized = normalizeGitHubEvent(eventType, payload);
86
86
  if (normalized) {
87
87
  const delivery = request.headers.get('x-github-delivery') ?? undefined;
88
88
  await ctx.dispatch(options.agent, {
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { Channel, ToolDef } from '@fabric-harness/sdk/channel';
2
+ import { type SimpleConversationRef } from './webhook-shared.js';
3
+ export interface GoogleChatConversationRef extends SimpleConversationRef {
4
+ }
5
+ export interface GoogleChatEvent {
6
+ type?: string;
7
+ eventTime?: string;
8
+ space?: {
9
+ name?: string;
10
+ };
11
+ thread?: {
12
+ name?: string;
13
+ };
14
+ message?: {
15
+ name?: string;
16
+ text?: string;
17
+ sender?: {
18
+ name?: string;
19
+ type?: string;
20
+ };
21
+ };
22
+ user?: {
23
+ name?: string;
24
+ type?: string;
25
+ };
26
+ common?: {
27
+ userLocale?: string;
28
+ };
29
+ }
30
+ export interface GoogleChatChannelOptions {
31
+ agent: string;
32
+ /** Verify the Google Chat bearer JWT/ID token for the configured endpoint or project audience. */
33
+ audience?: string | readonly string[];
34
+ authenticate?(request: Request): boolean | Promise<boolean>;
35
+ fetchImpl?: typeof fetch;
36
+ now?: () => number;
37
+ tenantId?: string | ((event: GoogleChatEvent) => string | undefined);
38
+ }
39
+ export interface GoogleChatChannel extends Channel {
40
+ conversationKey(ref: GoogleChatConversationRef): string;
41
+ parseConversationKey(id: string): GoogleChatConversationRef;
42
+ }
43
+ export declare function googleChatConversationKey(ref: GoogleChatConversationRef): string;
44
+ export declare function parseGoogleChatConversationKey(id: string): GoogleChatConversationRef;
45
+ export declare function createGoogleChatChannel(options: GoogleChatChannelOptions): GoogleChatChannel;
46
+ export declare function verifyGoogleChatRequest(request: Request, options: {
47
+ audience: string | readonly string[];
48
+ fetchImpl?: typeof fetch | undefined;
49
+ now?: (() => number) | undefined;
50
+ }): Promise<boolean>;
51
+ export declare function replyInGoogleChat(ref: GoogleChatConversationRef, options: {
52
+ accessToken: string;
53
+ space: string;
54
+ thread?: string;
55
+ fetchImpl?: typeof fetch;
56
+ }): ToolDef<{
57
+ text: string;
58
+ }, unknown>;
59
+ //# sourceMappingURL=google-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-chat.d.ts","sourceRoot":"","sources":["../src/google-chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,yBAA0B,SAAQ,qBAAqB;CAAG;AAC3E,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACtF,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AACD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;CACtE;AACD,MAAM,WAAW,iBAAkB,SAAQ,OAAO;IAChD,eAAe,CAAC,GAAG,EAAE,yBAAyB,GAAG,MAAM,CAAC;IACxD,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,yBAAyB,CAAC;CAC7D;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,yBAAyB,GAAG,MAAM,CAEhF;AACD,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,MAAM,GAAG,yBAAyB,CAEpF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAqB5F;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB3M;AA6CD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,yBAAyB,EAAE,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CAQhM"}