@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.
- package/README.md +47 -22
- package/assets/crabline-banner.svg +20 -0
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +25 -1
- package/dist/src/cli/program.js +579 -82
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +59 -6
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +116 -92
- package/dist/src/config/schema.js +179 -73
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.js +9 -2
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/exit-codes.js.map +1 -1
- package/dist/src/core/matcher.js +7 -6
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/message-template.js.map +1 -1
- package/dist/src/core/nonces.d.ts +1 -0
- package/dist/src/core/nonces.js +4 -2
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +1 -0
- package/dist/src/core/reporters.js +42 -4
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -0
- package/dist/src/core/run.js +415 -107
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/core/safe-regex.d.ts +3 -0
- package/dist/src/core/safe-regex.js +21 -0
- package/dist/src/core/safe-regex.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +43 -0
- package/dist/src/openclaw/artifact-generation.js +363 -0
- package/dist/src/openclaw/artifact-generation.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +97 -12
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +32 -10
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +55 -18
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +85 -7
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +124 -30
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +78 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +14 -5
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.d.ts +5 -0
- package/dist/src/openclaw/outbound-contract.js +40 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -0
- package/dist/src/openclaw/private-file.d.ts +28 -0
- package/dist/src/openclaw/private-file.js +465 -0
- package/dist/src/openclaw/private-file.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +21 -2
- package/dist/src/openclaw/shared.js +115 -18
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +63 -0
- package/dist/src/openclaw/smoke-lock.js +1004 -0
- package/dist/src/openclaw/smoke-lock.js.map +1 -0
- package/dist/src/openclaw.d.ts +16 -8
- package/dist/src/openclaw.js +334 -52
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/builtin/discord.d.ts +10 -1
- package/dist/src/providers/builtin/discord.js +144 -18
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
- package/dist/src/providers/builtin/feishu.d.ts +19 -2
- package/dist/src/providers/builtin/feishu.js +307 -25
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +20 -1
- package/dist/src/providers/builtin/googlechat.js +178 -19
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.d.ts +4 -0
- package/dist/src/providers/builtin/imessage.js +26 -11
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +92 -30
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +11 -1
- package/dist/src/providers/builtin/matrix.js +53 -29
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +10 -0
- package/dist/src/providers/builtin/mattermost.js +38 -15
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +17 -1
- package/dist/src/providers/builtin/msteams.js +113 -14
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
- package/dist/src/providers/builtin/native-local-mock.js +12 -35
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.d.ts +11 -15
- package/dist/src/providers/builtin/script.js +566 -104
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +6 -0
- package/dist/src/providers/builtin/slack.js +99 -40
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +6 -0
- package/dist/src/providers/builtin/telegram.js +64 -43
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
- package/dist/src/providers/builtin/whatsapp.js +567 -30
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.js +30 -19
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +3 -3
- package/dist/src/providers/catalog.js +3 -3
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +11 -2
- package/dist/src/providers/local-mock.js +322 -96
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +1 -0
- package/dist/src/providers/native-ids.js +6 -1
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +30 -2
- package/dist/src/providers/recorder.js +549 -70
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +25 -1
- package/dist/src/providers/registry.js +280 -40
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +29 -0
- package/dist/src/providers/signed-jwt.js +202 -0
- package/dist/src/providers/signed-jwt.js.map +1 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +26 -0
- package/dist/src/providers/target-normalizers.js +276 -0
- package/dist/src/providers/target-normalizers.js.map +1 -0
- package/dist/src/providers/types.d.ts +5 -0
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +2 -0
- package/dist/src/providers/webhook-server.js +72 -25
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/http.d.ts +23 -3
- package/dist/src/servers/http.js +213 -20
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.js +20 -21
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.js +465 -51
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +306 -58
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/pending-events.d.ts +2 -0
- package/dist/src/servers/pending-events.js +11 -0
- package/dist/src/servers/pending-events.js.map +1 -0
- package/dist/src/servers/recorder.d.ts +5 -0
- package/dist/src/servers/recorder.js +262 -3
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +2 -0
- package/dist/src/servers/signal.js +444 -56
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +5 -0
- package/dist/src/servers/slack.js +515 -49
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.d.ts +111 -0
- package/dist/src/servers/telegram.js +830 -158
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +40 -0
- package/dist/src/servers/webhook-target.js +349 -0
- package/dist/src/servers/webhook-target.js.map +1 -0
- package/dist/src/servers/websocket.d.ts +2 -0
- package/dist/src/servers/websocket.js +29 -0
- package/dist/src/servers/websocket.js.map +1 -0
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +5 -0
- package/dist/src/servers/whatsapp-jid.js +32 -0
- package/dist/src/servers/whatsapp-jid.js.map +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
- package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +12 -7
- package/dist/src/servers/whatsapp.js +269 -107
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +14 -0
- package/dist/src/servers/zalo.js +521 -88
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +197 -19
- package/fixtures/examples/crabline.example.yaml +10 -0
- 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 {
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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") ??
|
|
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,
|
|
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:
|
|
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":"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","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
|
-
|
|
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,
|
|
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 {};
|