@openclaw/crabline 0.1.9 → 0.1.11

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 (189) hide show
  1. package/README.md +47 -22
  2. package/assets/crabline-banner.svg +20 -0
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +25 -1
  5. package/dist/src/cli/program.js +579 -82
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +59 -6
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +116 -92
  10. package/dist/src/config/schema.js +179 -73
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.js +9 -2
  13. package/dist/src/core/errors.js.map +1 -1
  14. package/dist/src/core/exit-codes.js.map +1 -1
  15. package/dist/src/core/matcher.js +7 -6
  16. package/dist/src/core/matcher.js.map +1 -1
  17. package/dist/src/core/message-template.js.map +1 -1
  18. package/dist/src/core/nonces.d.ts +1 -0
  19. package/dist/src/core/nonces.js +4 -2
  20. package/dist/src/core/nonces.js.map +1 -1
  21. package/dist/src/core/reporters.d.ts +1 -0
  22. package/dist/src/core/reporters.js +42 -4
  23. package/dist/src/core/reporters.js.map +1 -1
  24. package/dist/src/core/run.d.ts +3 -0
  25. package/dist/src/core/run.js +415 -107
  26. package/dist/src/core/run.js.map +1 -1
  27. package/dist/src/core/safe-regex.d.ts +3 -0
  28. package/dist/src/core/safe-regex.js +21 -0
  29. package/dist/src/core/safe-regex.js.map +1 -0
  30. package/dist/src/index.d.ts +2 -2
  31. package/dist/src/index.js +1 -1
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/openclaw/artifact-generation.d.ts +43 -0
  34. package/dist/src/openclaw/artifact-generation.js +363 -0
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -0
  36. package/dist/src/openclaw/bridges/matrix.js +97 -12
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +32 -10
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/signal.js +55 -18
  41. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  42. package/dist/src/openclaw/bridges/slack.js +85 -7
  43. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  44. package/dist/src/openclaw/bridges/telegram.js +124 -30
  45. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  46. package/dist/src/openclaw/bridges/whatsapp.js +78 -17
  47. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  48. package/dist/src/openclaw/bridges/zalo.js +14 -5
  49. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  50. package/dist/src/openclaw/outbound-contract.d.ts +5 -0
  51. package/dist/src/openclaw/outbound-contract.js +40 -0
  52. package/dist/src/openclaw/outbound-contract.js.map +1 -0
  53. package/dist/src/openclaw/private-file.d.ts +28 -0
  54. package/dist/src/openclaw/private-file.js +465 -0
  55. package/dist/src/openclaw/private-file.js.map +1 -0
  56. package/dist/src/openclaw/shared.d.ts +21 -2
  57. package/dist/src/openclaw/shared.js +115 -18
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +63 -0
  60. package/dist/src/openclaw/smoke-lock.js +1004 -0
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -0
  62. package/dist/src/openclaw.d.ts +16 -8
  63. package/dist/src/openclaw.js +334 -52
  64. package/dist/src/openclaw.js.map +1 -1
  65. package/dist/src/providers/builtin/discord.d.ts +10 -1
  66. package/dist/src/providers/builtin/discord.js +144 -18
  67. package/dist/src/providers/builtin/discord.js.map +1 -1
  68. package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
  69. package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
  70. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
  71. package/dist/src/providers/builtin/feishu.d.ts +19 -2
  72. package/dist/src/providers/builtin/feishu.js +307 -25
  73. package/dist/src/providers/builtin/feishu.js.map +1 -1
  74. package/dist/src/providers/builtin/googlechat.d.ts +20 -1
  75. package/dist/src/providers/builtin/googlechat.js +178 -19
  76. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  77. package/dist/src/providers/builtin/imessage.d.ts +4 -0
  78. package/dist/src/providers/builtin/imessage.js +26 -11
  79. package/dist/src/providers/builtin/imessage.js.map +1 -1
  80. package/dist/src/providers/builtin/loopback.js +92 -30
  81. package/dist/src/providers/builtin/loopback.js.map +1 -1
  82. package/dist/src/providers/builtin/matrix.d.ts +11 -1
  83. package/dist/src/providers/builtin/matrix.js +53 -29
  84. package/dist/src/providers/builtin/matrix.js.map +1 -1
  85. package/dist/src/providers/builtin/mattermost.d.ts +10 -0
  86. package/dist/src/providers/builtin/mattermost.js +38 -15
  87. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  88. package/dist/src/providers/builtin/msteams.d.ts +17 -1
  89. package/dist/src/providers/builtin/msteams.js +113 -14
  90. package/dist/src/providers/builtin/msteams.js.map +1 -1
  91. package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
  92. package/dist/src/providers/builtin/native-local-mock.js +12 -35
  93. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  94. package/dist/src/providers/builtin/script.d.ts +11 -15
  95. package/dist/src/providers/builtin/script.js +566 -104
  96. package/dist/src/providers/builtin/script.js.map +1 -1
  97. package/dist/src/providers/builtin/slack.d.ts +6 -0
  98. package/dist/src/providers/builtin/slack.js +99 -40
  99. package/dist/src/providers/builtin/slack.js.map +1 -1
  100. package/dist/src/providers/builtin/telegram.d.ts +6 -0
  101. package/dist/src/providers/builtin/telegram.js +64 -43
  102. package/dist/src/providers/builtin/telegram.js.map +1 -1
  103. package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
  104. package/dist/src/providers/builtin/whatsapp.js +567 -30
  105. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  106. package/dist/src/providers/builtin/zalo.js +30 -19
  107. package/dist/src/providers/builtin/zalo.js.map +1 -1
  108. package/dist/src/providers/catalog.d.ts +3 -3
  109. package/dist/src/providers/catalog.js +3 -3
  110. package/dist/src/providers/catalog.js.map +1 -1
  111. package/dist/src/providers/local-mock.d.ts +11 -2
  112. package/dist/src/providers/local-mock.js +322 -96
  113. package/dist/src/providers/local-mock.js.map +1 -1
  114. package/dist/src/providers/native-ids.d.ts +1 -0
  115. package/dist/src/providers/native-ids.js +6 -1
  116. package/dist/src/providers/native-ids.js.map +1 -1
  117. package/dist/src/providers/recorder.d.ts +30 -2
  118. package/dist/src/providers/recorder.js +549 -70
  119. package/dist/src/providers/recorder.js.map +1 -1
  120. package/dist/src/providers/registry.d.ts +25 -1
  121. package/dist/src/providers/registry.js +280 -40
  122. package/dist/src/providers/registry.js.map +1 -1
  123. package/dist/src/providers/signed-jwt.d.ts +29 -0
  124. package/dist/src/providers/signed-jwt.js +202 -0
  125. package/dist/src/providers/signed-jwt.js.map +1 -0
  126. package/dist/src/providers/slack-ids.js.map +1 -1
  127. package/dist/src/providers/target-normalizers.d.ts +26 -0
  128. package/dist/src/providers/target-normalizers.js +276 -0
  129. package/dist/src/providers/target-normalizers.js.map +1 -0
  130. package/dist/src/providers/types.d.ts +5 -0
  131. package/dist/src/providers/types.js.map +1 -1
  132. package/dist/src/providers/webhook-server.d.ts +2 -0
  133. package/dist/src/providers/webhook-server.js +72 -25
  134. package/dist/src/providers/webhook-server.js.map +1 -1
  135. package/dist/src/servers/http.d.ts +23 -3
  136. package/dist/src/servers/http.js +213 -20
  137. package/dist/src/servers/http.js.map +1 -1
  138. package/dist/src/servers/index.js +20 -21
  139. package/dist/src/servers/index.js.map +1 -1
  140. package/dist/src/servers/matrix.js +465 -51
  141. package/dist/src/servers/matrix.js.map +1 -1
  142. package/dist/src/servers/mattermost.d.ts +5 -0
  143. package/dist/src/servers/mattermost.js +306 -58
  144. package/dist/src/servers/mattermost.js.map +1 -1
  145. package/dist/src/servers/pending-events.d.ts +2 -0
  146. package/dist/src/servers/pending-events.js +11 -0
  147. package/dist/src/servers/pending-events.js.map +1 -0
  148. package/dist/src/servers/recorder.d.ts +5 -0
  149. package/dist/src/servers/recorder.js +262 -3
  150. package/dist/src/servers/recorder.js.map +1 -1
  151. package/dist/src/servers/signal.d.ts +2 -0
  152. package/dist/src/servers/signal.js +444 -56
  153. package/dist/src/servers/signal.js.map +1 -1
  154. package/dist/src/servers/slack.d.ts +5 -0
  155. package/dist/src/servers/slack.js +515 -49
  156. package/dist/src/servers/slack.js.map +1 -1
  157. package/dist/src/servers/telegram.d.ts +111 -0
  158. package/dist/src/servers/telegram.js +830 -158
  159. package/dist/src/servers/telegram.js.map +1 -1
  160. package/dist/src/servers/webhook-target.d.ts +40 -0
  161. package/dist/src/servers/webhook-target.js +349 -0
  162. package/dist/src/servers/webhook-target.js.map +1 -0
  163. package/dist/src/servers/websocket.d.ts +2 -0
  164. package/dist/src/servers/websocket.js +29 -0
  165. package/dist/src/servers/websocket.js.map +1 -0
  166. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
  167. package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
  168. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  169. package/dist/src/servers/whatsapp-jid.d.ts +5 -0
  170. package/dist/src/servers/whatsapp-jid.js +32 -0
  171. package/dist/src/servers/whatsapp-jid.js.map +1 -0
  172. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
  173. package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
  174. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  175. package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
  176. package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
  177. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  178. package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
  179. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  181. package/dist/src/servers/whatsapp.d.ts +12 -7
  182. package/dist/src/servers/whatsapp.js +269 -107
  183. package/dist/src/servers/whatsapp.js.map +1 -1
  184. package/dist/src/servers/zalo.d.ts +14 -0
  185. package/dist/src/servers/zalo.js +521 -88
  186. package/dist/src/servers/zalo.js.map +1 -1
  187. package/docs/channel-setup.md +197 -19
  188. package/fixtures/examples/crabline.example.yaml +10 -0
  189. package/package.json +20 -15
@@ -1,8 +1,11 @@
1
+ import { createPublicKey, verify } from "node:crypto";
1
2
  import path from "node:path";
2
3
  import { CrablineError } from "../../core/errors.js";
3
4
  import { LocalMockProviderAdapter } from "../local-mock.js";
4
- import { authorFromBotFlag, createNativeTargetCodec, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
5
- export async function resolveDiscordAdapterConfig(config, userName, env = process.env) {
5
+ import { DISCORD_SNOWFLAKE_RULE, getBuiltinTargetCodec } from "../target-normalizers.js";
6
+ import { authorFromBotFlag, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
7
+ import { requireExternalWebhookAuthentication } from "./external-webhook-auth.js";
8
+ function resolveDiscordAdapterConfigValue(config, userName, env = process.env) {
6
9
  return {
7
10
  ...((config.discord?.applicationId ?? env.DISCORD_APPLICATION_ID)
8
11
  ? { applicationId: config.discord?.applicationId ?? env.DISCORD_APPLICATION_ID }
@@ -19,28 +22,108 @@ export async function resolveDiscordAdapterConfig(config, userName, env = proces
19
22
  userName,
20
23
  };
21
24
  }
25
+ export async function resolveDiscordAdapterConfig(config, userName, env = process.env) {
26
+ return resolveDiscordAdapterConfigValue(config, userName, env);
27
+ }
28
+ function discordPublicKey(value) {
29
+ if (!/^[0-9a-f]{64}$/iu.test(value)) {
30
+ throw new CrablineError("Discord publicKey must be a 32-byte hexadecimal Ed25519 key.", {
31
+ kind: "config",
32
+ });
33
+ }
34
+ return createPublicKey({
35
+ format: "der",
36
+ key: Buffer.concat([Buffer.from("302a300506032b6570032100", "hex"), Buffer.from(value, "hex")]),
37
+ type: "spki",
38
+ });
39
+ }
40
+ function authenticateDiscordWebhook(publicKey, request, rawBody) {
41
+ const signature = request.headers.get("x-signature-ed25519");
42
+ const timestamp = request.headers.get("x-signature-timestamp");
43
+ if (!signature ||
44
+ !timestamp ||
45
+ !/^[0-9a-f]{128}$/iu.test(signature) ||
46
+ !verify(null, Buffer.from(timestamp + rawBody), publicKey, Buffer.from(signature, "hex"))) {
47
+ return new Response("invalid request signature", { status: 401 });
48
+ }
49
+ return undefined;
50
+ }
51
+ function discordApplicationCommandText(data) {
52
+ const name = optionalString(data, "name");
53
+ if (!name) {
54
+ return undefined;
55
+ }
56
+ const values = [];
57
+ const collectValues = (options) => {
58
+ if (!Array.isArray(options)) {
59
+ return;
60
+ }
61
+ for (const option of options) {
62
+ if (!isRecord(option)) {
63
+ continue;
64
+ }
65
+ if ((option.type === 1 || option.type === 2) && typeof option.name === "string") {
66
+ values.push(option.name);
67
+ }
68
+ const value = option.value;
69
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
70
+ values.push(String(value));
71
+ }
72
+ collectValues(option.options);
73
+ }
74
+ };
75
+ collectValues(data.options);
76
+ return [name, ...values].join(" ");
77
+ }
78
+ function discordInteractionText(data) {
79
+ const command = discordApplicationCommandText(data);
80
+ if (command) {
81
+ return command;
82
+ }
83
+ const values = [];
84
+ const collectValues = (value) => {
85
+ if (Array.isArray(value)) {
86
+ for (const child of value) {
87
+ collectValues(child);
88
+ }
89
+ return;
90
+ }
91
+ if (!isRecord(value)) {
92
+ return;
93
+ }
94
+ if (typeof value.value === "string") {
95
+ values.push(value.value);
96
+ }
97
+ if (Array.isArray(value.values)) {
98
+ for (const selected of value.values) {
99
+ if (typeof selected === "string" ||
100
+ typeof selected === "number" ||
101
+ typeof selected === "boolean") {
102
+ values.push(String(selected));
103
+ }
104
+ }
105
+ }
106
+ collectValues(value.components);
107
+ };
108
+ collectValues(data);
109
+ const customId = optionalString(data, "custom_id");
110
+ const parts = [...(customId ? [customId] : []), ...values];
111
+ return parts.length > 0 ? parts.join(" ") : undefined;
112
+ }
22
113
  function toRecorderPath(providerId, config) {
23
114
  const configuredPath = config.discord?.recorder.path;
24
115
  return configuredPath
25
116
  ? path.resolve(configuredPath)
26
117
  : path.resolve(".crabline", "recorders", `${providerId}.jsonl`);
27
118
  }
28
- const DISCORD_SNOWFLAKE_RULE = {
29
- example: "123456789012345678",
30
- name: "Discord snowflake id",
31
- pattern: /^\d{17,20}$/u,
32
- };
33
- const DISCORD_CODEC = createNativeTargetCodec({
34
- channel: DISCORD_SNOWFLAKE_RULE,
35
- channelLabel: "Discord channel_id",
36
- thread: DISCORD_SNOWFLAKE_RULE,
37
- threadLabel: "Discord thread id",
38
- });
39
- function normalizeDiscordWebhookPayload(payload) {
119
+ export function normalizeDiscordWebhookPayload(payload) {
40
120
  if (!isRecord(payload)) {
41
121
  throw new CrablineError("Discord webhook payload must be an object", { kind: "inbound" });
42
122
  }
43
- if (optionalRecord(payload, "message")) {
123
+ const message = optionalRecord(payload, "message");
124
+ if ((message && ("text" in message || "threadId" in message)) ||
125
+ "text" in payload ||
126
+ "threadId" in payload) {
44
127
  return genericMockPayloadWithNativeThread({
45
128
  channelRule: DISCORD_SNOWFLAKE_RULE,
46
129
  payload,
@@ -51,7 +134,8 @@ function normalizeDiscordWebhookPayload(payload) {
51
134
  const author = optionalRecord(payload, "author") ?? optionalRecord(payload, "member")?.user;
52
135
  const channelId = optionalString(payload, "channel_id");
53
136
  const text = optionalString(payload, "content") ??
54
- (data ? (optionalString(data, "content") ?? optionalString(data, "name")) : undefined);
137
+ (data ? (optionalString(data, "content") ?? discordInteractionText(data)) : undefined) ??
138
+ (message ? optionalString(message, "content") : undefined);
55
139
  if (!channelId || !text) {
56
140
  throw new CrablineError("Discord event payload requires channel_id and content", {
57
141
  kind: "inbound",
@@ -67,19 +151,61 @@ function normalizeDiscordWebhookPayload(payload) {
67
151
  threadId: requireNativeInboundId(threadId, DISCORD_SNOWFLAKE_RULE, "Discord thread_id"),
68
152
  };
69
153
  }
154
+ export function createDiscordInteractionResponse(payload) {
155
+ if (!isRecord(payload)) {
156
+ return Response.json({ type: 5 }, { status: 200 });
157
+ }
158
+ if (payload.type === 3) {
159
+ return Response.json({ type: 6 }, { status: 200 });
160
+ }
161
+ if (payload.type === 4) {
162
+ return Response.json({ data: { choices: [] }, type: 8 }, { status: 200 });
163
+ }
164
+ return Response.json({ type: 5 }, { status: 200 });
165
+ }
166
+ export function handleDiscordWebhookPayload(payload) {
167
+ if (!isRecord(payload)) {
168
+ return undefined;
169
+ }
170
+ if (payload.type === 1) {
171
+ return Response.json({ type: 1 }, { status: 200 });
172
+ }
173
+ if (payload.type === 4) {
174
+ return createDiscordInteractionResponse(payload);
175
+ }
176
+ return undefined;
177
+ }
70
178
  export class DiscordProviderAdapter extends LocalMockProviderAdapter {
71
- constructor(id, config, _userName) {
179
+ constructor(id, config, userName, runtime) {
180
+ const env = runtime?.env ?? process.env;
181
+ const resolvedConfig = resolveDiscordAdapterConfigValue(config, userName, env);
182
+ const publicKey = resolvedConfig.publicKey
183
+ ? discordPublicKey(resolvedConfig.publicKey)
184
+ : undefined;
185
+ requireExternalWebhookAuthentication({
186
+ authenticated: Boolean(publicKey),
187
+ provider: "Discord",
188
+ requirement: "discord.publicKey or DISCORD_PUBLIC_KEY",
189
+ webhook: config.discord?.webhook,
190
+ });
72
191
  super({
73
- codec: DISCORD_CODEC,
192
+ codec: getBuiltinTargetCodec("discord"),
74
193
  config,
75
194
  id,
76
195
  options: {
196
+ ...(publicKey
197
+ ? {
198
+ authenticateWebhookRequest: (request, rawBody) => authenticateDiscordWebhook(publicKey, request, rawBody),
199
+ }
200
+ : {}),
77
201
  defaultWebhook: {
78
202
  host: "127.0.0.1",
79
203
  path: "/discord/interactions",
80
204
  port: 8788,
81
205
  },
206
+ createWebhookSuccessResponse: createDiscordInteractionResponse,
82
207
  endpointLabel: "interactions endpoint",
208
+ handleWebhookPayload: handleDiscordWebhookPayload,
83
209
  normalizeWebhookPayload: normalizeDiscordWebhookPayload,
84
210
  platform: "discord",
85
211
  publicUrl: config.discord?.webhook.publicUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../../src/providers/builtin/discord.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../../src/providers/builtin/discord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAkB,MAAM,aAAa,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EACL,iBAAiB,EACjB,kCAAkC,EAClC,QAAQ,EACR,cAAc,EACd,cAAc,EACd,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oCAAoC,EAAE,MAAM,4BAA4B,CAAC;AAUlF,SAAS,gCAAgC,CACvC,MAAsB,EACtB,QAAgB,EAChB,GAAG,GAAuB,OAAO,CAAC,GAAG;IAErC,OAAO;QACL,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,IAAI,GAAG,CAAC,sBAAsB,CAAC;YAC/D,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,IAAI,GAAG,CAAC,sBAAuB,EAAE;YACjF,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC,iBAAiB,CAAC;YACrD,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC,iBAAkB,EAAE;YAClE,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;YACnD,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC,kBAAkB,CAAC;YACvD,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC,kBAAmB,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAsB,EACtB,QAAgB,EAChB,GAAG,GAAuB,OAAO,CAAC,GAAG;IAErC,OAAO,gCAAgC,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,aAAa,CAAC,8DAA8D,EAAE;YACtF,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IACD,OAAO,eAAe,CAAC;QACrB,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/F,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAoB,EAAE,OAAgB,EAAE,OAAe;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC/D,IACE,CAAC,SAAS;QACV,CAAC,SAAS;QACV,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EACzF,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,6BAA6B,CAAC,IAA6B;IAClE,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAQ,EAAE;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,sBAAsB,CAAC,IAA6B;IAC3D,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAG,CAAC,KAAc,EAAQ,EAAE;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,aAAa,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpC,IACE,OAAO,QAAQ,KAAK,QAAQ;oBAC5B,OAAO,QAAQ,KAAK,QAAQ;oBAC5B,OAAO,QAAQ,KAAK,SAAS,EAC7B,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QACD,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,MAAsB;IAChE,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;IACrD,OAAO,cAAc;QACnB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,UAAU,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAgB;IAC7D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CAAC,2CAA2C,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,IACE,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO,CAAC,CAAC;QACzD,MAAM,IAAI,OAAO;QACjB,UAAU,IAAI,OAAO,EACrB,CAAC;QACD,OAAO,kCAAkC,CAAC;YACxC,WAAW,EAAE,sBAAsB;YACnC,OAAO;YACP,UAAU,EAAE,sBAAsB;SACnC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC;IAC5F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,IAAI,GACR,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC;QAClC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,uDAAuD,EAAE;YAC/E,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,SAAS,CAAC;IACnE,OAAO;QACL,MAAM,EAAE,iBAAiB,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC;QACrD,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,EAAE,OAAO;QACZ,IAAI;QACJ,QAAQ,EAAE,sBAAsB,CAAC,QAAQ,EAAE,sBAAsB,EAAE,mBAAmB,CAAC;KACxF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAgB;IAC/D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IAC1D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,gCAAgC,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,sBAAuB,SAAQ,wBAAwB;IAClE,YAAY,EAAU,EAAE,MAAsB,EAAE,QAAgB,EAAE,OAAiB;QACjF,MAAM,GAAG,GAAI,OAAsC,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACxE,MAAM,cAAc,GAAG,gCAAgC,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS;YACxC,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,SAAS,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QACd,oCAAoC,CAAC;YACnC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC;YACjC,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,yCAAyC;YACtD,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO;SACjC,CAAC,CAAC;QACH,KAAK,CAAC;YACJ,KAAK,EAAE,qBAAqB,CAAC,SAAS,CAAC;YACvC,MAAM;YACN,EAAE;YACF,OAAO,EAAE;gBACP,GAAG,CAAC,SAAS;oBACX,CAAC,CAAC;wBACE,0BAA0B,EAAE,CAAC,OAAgB,EAAE,OAAe,EAAE,EAAE,CAChE,0BAA0B,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;qBAC1D;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,cAAc,EAAE;oBACd,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,IAAI;iBACX;gBACD,4BAA4B,EAAE,gCAAgC;gBAC9D,aAAa,EAAE,uBAAuB;gBACtC,oBAAoB,EAAE,2BAA2B;gBACjD,uBAAuB,EAAE,8BAA8B;gBACvD,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS;gBAC5C,YAAY,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC;gBACxC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO;aACjC;SACF,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { createPublicKey, verify, type KeyObject } from \"node:crypto\";\nimport path from \"node:path\";\nimport { CrablineError } from \"../../core/errors.js\";\nimport type { ProviderConfig } from \"../../config/schema.js\";\nimport { LocalMockProviderAdapter } from \"../local-mock.js\";\nimport type { ProviderAdapter } from \"../types.js\";\nimport { DISCORD_SNOWFLAKE_RULE, getBuiltinTargetCodec } from \"../target-normalizers.js\";\nimport {\n authorFromBotFlag,\n genericMockPayloadWithNativeThread,\n isRecord,\n optionalRecord,\n optionalString,\n requireNativeInboundId,\n} from \"./native-local-mock.js\";\nimport { requireExternalWebhookAuthentication } from \"./external-webhook-auth.js\";\n\ntype DiscordEnvironment = Partial<\n Pick<NodeJS.ProcessEnv, \"DISCORD_APPLICATION_ID\" | \"DISCORD_BOT_TOKEN\" | \"DISCORD_PUBLIC_KEY\">\n>;\n\ntype DiscordRuntime = {\n env?: DiscordEnvironment | undefined;\n};\n\nfunction resolveDiscordAdapterConfigValue(\n config: ProviderConfig,\n userName: string,\n env: DiscordEnvironment = process.env,\n) {\n return {\n ...((config.discord?.applicationId ?? env.DISCORD_APPLICATION_ID)\n ? { applicationId: config.discord?.applicationId ?? env.DISCORD_APPLICATION_ID! }\n : {}),\n ...((config.discord?.botToken ?? env.DISCORD_BOT_TOKEN)\n ? { botToken: config.discord?.botToken ?? env.DISCORD_BOT_TOKEN! }\n : {}),\n ...((config.discord?.mentionRoleIds?.length ?? 0) > 0\n ? { mentionRoleIds: config.discord?.mentionRoleIds }\n : {}),\n ...((config.discord?.publicKey ?? env.DISCORD_PUBLIC_KEY)\n ? { publicKey: config.discord?.publicKey ?? env.DISCORD_PUBLIC_KEY! }\n : {}),\n userName,\n };\n}\n\nexport async function resolveDiscordAdapterConfig(\n config: ProviderConfig,\n userName: string,\n env: DiscordEnvironment = process.env,\n) {\n return resolveDiscordAdapterConfigValue(config, userName, env);\n}\n\nfunction discordPublicKey(value: string): KeyObject {\n if (!/^[0-9a-f]{64}$/iu.test(value)) {\n throw new CrablineError(\"Discord publicKey must be a 32-byte hexadecimal Ed25519 key.\", {\n kind: \"config\",\n });\n }\n return createPublicKey({\n format: \"der\",\n key: Buffer.concat([Buffer.from(\"302a300506032b6570032100\", \"hex\"), Buffer.from(value, \"hex\")]),\n type: \"spki\",\n });\n}\n\nfunction authenticateDiscordWebhook(publicKey: KeyObject, request: Request, rawBody: string) {\n const signature = request.headers.get(\"x-signature-ed25519\");\n const timestamp = request.headers.get(\"x-signature-timestamp\");\n if (\n !signature ||\n !timestamp ||\n !/^[0-9a-f]{128}$/iu.test(signature) ||\n !verify(null, Buffer.from(timestamp + rawBody), publicKey, Buffer.from(signature, \"hex\"))\n ) {\n return new Response(\"invalid request signature\", { status: 401 });\n }\n return undefined;\n}\n\nfunction discordApplicationCommandText(data: Record<string, unknown>): string | undefined {\n const name = optionalString(data, \"name\");\n if (!name) {\n return undefined;\n }\n\n const values: string[] = [];\n const collectValues = (options: unknown): void => {\n if (!Array.isArray(options)) {\n return;\n }\n for (const option of options) {\n if (!isRecord(option)) {\n continue;\n }\n if ((option.type === 1 || option.type === 2) && typeof option.name === \"string\") {\n values.push(option.name);\n }\n const value = option.value;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n values.push(String(value));\n }\n collectValues(option.options);\n }\n };\n collectValues(data.options);\n return [name, ...values].join(\" \");\n}\n\nfunction discordInteractionText(data: Record<string, unknown>): string | undefined {\n const command = discordApplicationCommandText(data);\n if (command) {\n return command;\n }\n\n const values: string[] = [];\n const collectValues = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const child of value) {\n collectValues(child);\n }\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n if (typeof value.value === \"string\") {\n values.push(value.value);\n }\n if (Array.isArray(value.values)) {\n for (const selected of value.values) {\n if (\n typeof selected === \"string\" ||\n typeof selected === \"number\" ||\n typeof selected === \"boolean\"\n ) {\n values.push(String(selected));\n }\n }\n }\n collectValues(value.components);\n };\n collectValues(data);\n const customId = optionalString(data, \"custom_id\");\n const parts = [...(customId ? [customId] : []), ...values];\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n\nfunction toRecorderPath(providerId: string, config: ProviderConfig): string {\n const configuredPath = config.discord?.recorder.path;\n return configuredPath\n ? path.resolve(configuredPath)\n : path.resolve(\".crabline\", \"recorders\", `${providerId}.jsonl`);\n}\n\nexport function normalizeDiscordWebhookPayload(payload: unknown) {\n if (!isRecord(payload)) {\n throw new CrablineError(\"Discord webhook payload must be an object\", { kind: \"inbound\" });\n }\n\n const message = optionalRecord(payload, \"message\");\n if (\n (message && (\"text\" in message || \"threadId\" in message)) ||\n \"text\" in payload ||\n \"threadId\" in payload\n ) {\n return genericMockPayloadWithNativeThread({\n channelRule: DISCORD_SNOWFLAKE_RULE,\n payload,\n threadRule: DISCORD_SNOWFLAKE_RULE,\n });\n }\n\n const data = optionalRecord(payload, \"data\");\n const author = optionalRecord(payload, \"author\") ?? optionalRecord(payload, \"member\")?.user;\n const channelId = optionalString(payload, \"channel_id\");\n const text =\n optionalString(payload, \"content\") ??\n (data ? (optionalString(data, \"content\") ?? discordInteractionText(data)) : undefined) ??\n (message ? optionalString(message, \"content\") : undefined);\n if (!channelId || !text) {\n throw new CrablineError(\"Discord event payload requires channel_id and content\", {\n kind: \"inbound\",\n });\n }\n\n const authorRecord = isRecord(author) ? author : undefined;\n const threadId = optionalString(payload, \"thread_id\") ?? channelId;\n return {\n author: authorFromBotFlag(authorRecord?.bot === true),\n ...(optionalString(payload, \"id\") ? { id: optionalString(payload, \"id\") } : {}),\n raw: payload,\n text,\n threadId: requireNativeInboundId(threadId, DISCORD_SNOWFLAKE_RULE, \"Discord thread_id\"),\n };\n}\n\nexport function createDiscordInteractionResponse(payload: unknown): Response {\n if (!isRecord(payload)) {\n return Response.json({ type: 5 }, { status: 200 });\n }\n if (payload.type === 3) {\n return Response.json({ type: 6 }, { status: 200 });\n }\n if (payload.type === 4) {\n return Response.json({ data: { choices: [] }, type: 8 }, { status: 200 });\n }\n return Response.json({ type: 5 }, { status: 200 });\n}\n\nexport function handleDiscordWebhookPayload(payload: unknown): Response | undefined {\n if (!isRecord(payload)) {\n return undefined;\n }\n if (payload.type === 1) {\n return Response.json({ type: 1 }, { status: 200 });\n }\n if (payload.type === 4) {\n return createDiscordInteractionResponse(payload);\n }\n return undefined;\n}\n\nexport class DiscordProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {\n constructor(id: string, config: ProviderConfig, userName: string, runtime?: unknown) {\n const env = (runtime as DiscordRuntime | undefined)?.env ?? process.env;\n const resolvedConfig = resolveDiscordAdapterConfigValue(config, userName, env);\n const publicKey = resolvedConfig.publicKey\n ? discordPublicKey(resolvedConfig.publicKey)\n : undefined;\n requireExternalWebhookAuthentication({\n authenticated: Boolean(publicKey),\n provider: \"Discord\",\n requirement: \"discord.publicKey or DISCORD_PUBLIC_KEY\",\n webhook: config.discord?.webhook,\n });\n super({\n codec: getBuiltinTargetCodec(\"discord\"),\n config,\n id,\n options: {\n ...(publicKey\n ? {\n authenticateWebhookRequest: (request: Request, rawBody: string) =>\n authenticateDiscordWebhook(publicKey, request, rawBody),\n }\n : {}),\n defaultWebhook: {\n host: \"127.0.0.1\",\n path: \"/discord/interactions\",\n port: 8788,\n },\n createWebhookSuccessResponse: createDiscordInteractionResponse,\n endpointLabel: \"interactions endpoint\",\n handleWebhookPayload: handleDiscordWebhookPayload,\n normalizeWebhookPayload: normalizeDiscordWebhookPayload,\n platform: \"discord\",\n publicUrl: config.discord?.webhook.publicUrl,\n recorderPath: toRecorderPath(id, config),\n webhook: config.discord?.webhook,\n },\n });\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ type WebhookConfig = {
2
+ host?: string | undefined;
3
+ publicUrl?: string | undefined;
4
+ };
5
+ export declare function requireExternalWebhookAuthentication(params: {
6
+ authenticated: boolean;
7
+ provider: string;
8
+ requirement: string;
9
+ webhook: WebhookConfig | undefined;
10
+ }): void;
11
+ export {};
@@ -0,0 +1,10 @@
1
+ import { CrablineError } from "../../core/errors.js";
2
+ import { isLoopbackHost } from "../../servers/http.js";
3
+ export function requireExternalWebhookAuthentication(params) {
4
+ const host = params.webhook?.host ?? "127.0.0.1";
5
+ const externallyReachable = Boolean(params.webhook?.publicUrl) || !isLoopbackHost(host);
6
+ if (externallyReachable && !params.authenticated) {
7
+ throw new CrablineError(`${params.provider} externally reachable webhooks require ${params.requirement}.`, { kind: "config" });
8
+ }
9
+ }
10
+ //# sourceMappingURL=external-webhook-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-webhook-auth.js","sourceRoot":"","sources":["../../../../src/providers/builtin/external-webhook-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAOvD,MAAM,UAAU,oCAAoC,CAAC,MAKpD;IACC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC;IACjD,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACxF,IAAI,mBAAmB,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACjD,MAAM,IAAI,aAAa,CACrB,GAAG,MAAM,CAAC,QAAQ,0CAA0C,MAAM,CAAC,WAAW,GAAG,EACjF,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { CrablineError } from \"../../core/errors.js\";\nimport { isLoopbackHost } from \"../../servers/http.js\";\n\ntype WebhookConfig = {\n host?: string | undefined;\n publicUrl?: string | undefined;\n};\n\nexport function requireExternalWebhookAuthentication(params: {\n authenticated: boolean;\n provider: string;\n requirement: string;\n webhook: WebhookConfig | undefined;\n}): void {\n const host = params.webhook?.host ?? \"127.0.0.1\";\n const externallyReachable = Boolean(params.webhook?.publicUrl) || !isLoopbackHost(host);\n if (externallyReachable && !params.authenticated) {\n throw new CrablineError(\n `${params.provider} externally reachable webhooks require ${params.requirement}.`,\n { kind: \"config\" },\n );\n }\n}\n"]}
@@ -1,10 +1,27 @@
1
1
  import type { ProviderConfig } from "../../config/schema.js";
2
2
  import { LocalMockProviderAdapter } from "../local-mock.js";
3
3
  import type { ProviderAdapter } from "../types.js";
4
- export declare function resolveFeishuAdapterConfig(config: ProviderConfig, _env?: NodeJS.ProcessEnv): {
4
+ type FeishuEnvironment = Partial<Pick<NodeJS.ProcessEnv, "FEISHU_ENCRYPT_KEY" | "FEISHU_VERIFICATION_TOKEN">>;
5
+ type FeishuAuthRuntime = {
6
+ now?: (() => number) | undefined;
7
+ };
8
+ export declare function resolveFeishuAdapterConfig(config: ProviderConfig, env?: FeishuEnvironment): {
5
9
  appId: string;
10
+ encryptKey: string | undefined;
6
11
  userName: string | undefined;
12
+ verificationToken: string | undefined;
7
13
  };
14
+ export declare function handleFeishuWebhookPayload(payload: unknown): Response | undefined;
15
+ export declare function createFeishuWebhookAuthenticator(config: ProviderConfig, env?: FeishuEnvironment, runtime?: FeishuAuthRuntime): ((request: Request, rawBody: string) => Promise<Response | undefined>) | undefined;
8
16
  export declare class FeishuProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
9
- constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
17
+ constructor(id: string, config: ProviderConfig, _userName: string, runtime?: unknown);
10
18
  }
19
+ export declare function normalizeFeishuWebhookPayload(payload: unknown): {
20
+ author?: "assistant" | "system" | "user" | undefined;
21
+ authorIsBot?: boolean;
22
+ id?: string | undefined;
23
+ raw: {};
24
+ text?: string | undefined;
25
+ };
26
+ export declare function decryptFeishuWebhookPayload(payload: unknown, encryptKey: string): unknown;
27
+ export {};