@openclaw/crabline 0.0.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.
- package/LICENSE +21 -0
- package/README.md +226 -0
- package/dist/src/bin/crabline.d.ts +2 -0
- package/dist/src/bin/crabline.js +7 -0
- package/dist/src/bin/crabline.js.map +1 -0
- package/dist/src/cli/program.d.ts +5 -0
- package/dist/src/cli/program.js +295 -0
- package/dist/src/cli/program.js.map +1 -0
- package/dist/src/config/load.d.ts +6 -0
- package/dist/src/config/load.js +41 -0
- package/dist/src/config/load.js.map +1 -0
- package/dist/src/config/schema.d.ts +1571 -0
- package/dist/src/config/schema.js +528 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/core/errors.d.ts +12 -0
- package/dist/src/core/errors.js +28 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/exit-codes.d.ts +13 -0
- package/dist/src/core/exit-codes.js +13 -0
- package/dist/src/core/exit-codes.js.map +1 -0
- package/dist/src/core/matcher.d.ts +2 -0
- package/dist/src/core/matcher.js +30 -0
- package/dist/src/core/matcher.js.map +1 -0
- package/dist/src/core/message-template.d.ts +2 -0
- package/dist/src/core/message-template.js +20 -0
- package/dist/src/core/message-template.js.map +1 -0
- package/dist/src/core/nonces.d.ts +2 -0
- package/dist/src/core/nonces.js +11 -0
- package/dist/src/core/nonces.js.map +1 -0
- package/dist/src/core/reporters.d.ts +3 -0
- package/dist/src/core/reporters.js +23 -0
- package/dist/src/core/reporters.js.map +1 -0
- package/dist/src/core/run.d.ts +30 -0
- package/dist/src/core/run.js +240 -0
- package/dist/src/core/run.js.map +1 -0
- package/dist/src/fake-servers/index.d.ts +10 -0
- package/dist/src/fake-servers/index.js +12 -0
- package/dist/src/fake-servers/index.js.map +1 -0
- package/dist/src/fake-servers/telegram.d.ts +29 -0
- package/dist/src/fake-servers/telegram.js +346 -0
- package/dist/src/fake-servers/telegram.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/openclaw.d.ts +102 -0
- package/dist/src/openclaw.js +289 -0
- package/dist/src/openclaw.js.map +1 -0
- package/dist/src/providers/builtin/discord.d.ts +15 -0
- package/dist/src/providers/builtin/discord.js +92 -0
- package/dist/src/providers/builtin/discord.js.map +1 -0
- package/dist/src/providers/builtin/feishu.d.ts +10 -0
- package/dist/src/providers/builtin/feishu.js +95 -0
- package/dist/src/providers/builtin/feishu.js.map +1 -0
- package/dist/src/providers/builtin/googlechat.d.ts +11 -0
- package/dist/src/providers/builtin/googlechat.js +83 -0
- package/dist/src/providers/builtin/googlechat.js.map +1 -0
- package/dist/src/providers/builtin/imessage.d.ts +11 -0
- package/dist/src/providers/builtin/imessage.js +67 -0
- package/dist/src/providers/builtin/imessage.js.map +1 -0
- package/dist/src/providers/builtin/loopback.d.ts +63 -0
- package/dist/src/providers/builtin/loopback.js +174 -0
- package/dist/src/providers/builtin/loopback.js.map +1 -0
- package/dist/src/providers/builtin/matrix.d.ts +21 -0
- package/dist/src/providers/builtin/matrix.js +84 -0
- package/dist/src/providers/builtin/matrix.js.map +1 -0
- package/dist/src/providers/builtin/mattermost.d.ts +11 -0
- package/dist/src/providers/builtin/mattermost.js +67 -0
- package/dist/src/providers/builtin/mattermost.js.map +1 -0
- package/dist/src/providers/builtin/msteams.d.ts +13 -0
- package/dist/src/providers/builtin/msteams.js +72 -0
- package/dist/src/providers/builtin/msteams.js.map +1 -0
- package/dist/src/providers/builtin/native-local-mock.d.ts +48 -0
- package/dist/src/providers/builtin/native-local-mock.js +119 -0
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -0
- package/dist/src/providers/builtin/script.d.ts +39 -0
- package/dist/src/providers/builtin/script.js +206 -0
- package/dist/src/providers/builtin/script.js.map +1 -0
- package/dist/src/providers/builtin/slack.d.ts +6 -0
- package/dist/src/providers/builtin/slack.js +106 -0
- package/dist/src/providers/builtin/slack.js.map +1 -0
- package/dist/src/providers/builtin/telegram.d.ts +21 -0
- package/dist/src/providers/builtin/telegram.js +123 -0
- package/dist/src/providers/builtin/telegram.js.map +1 -0
- package/dist/src/providers/builtin/whatsapp.d.ts +19 -0
- package/dist/src/providers/builtin/whatsapp.js +90 -0
- package/dist/src/providers/builtin/whatsapp.js.map +1 -0
- package/dist/src/providers/builtin/zalo.d.ts +17 -0
- package/dist/src/providers/builtin/zalo.js +70 -0
- package/dist/src/providers/builtin/zalo.js.map +1 -0
- package/dist/src/providers/catalog.d.ts +69 -0
- package/dist/src/providers/catalog.js +95 -0
- package/dist/src/providers/catalog.js.map +1 -0
- package/dist/src/providers/local-mock.d.ts +41 -0
- package/dist/src/providers/local-mock.js +243 -0
- package/dist/src/providers/local-mock.js.map +1 -0
- package/dist/src/providers/recorder.d.ts +19 -0
- package/dist/src/providers/recorder.js +160 -0
- package/dist/src/providers/recorder.js.map +1 -0
- package/dist/src/providers/registry.d.ts +8 -0
- package/dist/src/providers/registry.js +171 -0
- package/dist/src/providers/registry.js.map +1 -0
- package/dist/src/providers/types.d.ts +94 -0
- package/dist/src/providers/types.js +2 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/providers/webhook-server.d.ts +12 -0
- package/dist/src/providers/webhook-server.js +118 -0
- package/dist/src/providers/webhook-server.js.map +1 -0
- package/docs/channel-setup.md +181 -0
- package/fixtures/examples/crabline.example.yaml +195 -0
- package/fixtures/examples/openclaw-bridge.yaml +125 -0
- package/package.json +64 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { CRABLINE_FAKE_PROVIDER_CHANNELS, isCrablineFakeProviderChannel, startCrablineFakeProviderServer, } from "./fake-servers/index.js";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const TELEGRAM_ACCOUNT_ID = "default";
|
|
5
|
+
const TELEGRAM_DIRECT_CHAT_ID = "100001";
|
|
6
|
+
const TELEGRAM_GROUP_CHAT_ID = "-1001234567890";
|
|
7
|
+
const TELEGRAM_DEFAULT_SENDER_ID = 100001;
|
|
8
|
+
export const OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH = "crabline-fake-provider-capabilities.json";
|
|
9
|
+
export const OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH = "crabline-fake-provider-smoke.json";
|
|
10
|
+
export const OPENCLAW_CRABLINE_MANIFEST_PATH = "crabline-fake-provider-server.json";
|
|
11
|
+
export const OPENCLAW_CRABLINE_DEFAULT_CHANNEL = "telegram";
|
|
12
|
+
function readString(value) {
|
|
13
|
+
if (typeof value === "string" && value.trim()) {
|
|
14
|
+
return value.trim();
|
|
15
|
+
}
|
|
16
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
17
|
+
return String(value);
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
function isRecord(value) {
|
|
22
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
function readInteger(value) {
|
|
25
|
+
const stringValue = readString(value);
|
|
26
|
+
if (!stringValue || !/^-?\d+$/u.test(stringValue)) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return Number(stringValue);
|
|
30
|
+
}
|
|
31
|
+
function parseQaTarget(target) {
|
|
32
|
+
const trimmed = target.trim();
|
|
33
|
+
if (trimmed.startsWith("thread:")) {
|
|
34
|
+
const rest = trimmed.slice("thread:".length);
|
|
35
|
+
const slash = rest.indexOf("/");
|
|
36
|
+
if (slash > 0) {
|
|
37
|
+
return { kind: "group", id: rest.slice(0, slash), threadId: rest.slice(slash + 1) };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (trimmed.startsWith("channel:")) {
|
|
41
|
+
return { kind: "group", id: trimmed.slice("channel:".length) };
|
|
42
|
+
}
|
|
43
|
+
if (trimmed.startsWith("group:")) {
|
|
44
|
+
return { kind: "group", id: trimmed.slice("group:".length) };
|
|
45
|
+
}
|
|
46
|
+
if (trimmed.startsWith("dm:")) {
|
|
47
|
+
return { kind: "direct", id: trimmed.slice("dm:".length) };
|
|
48
|
+
}
|
|
49
|
+
return { kind: "direct", id: trimmed };
|
|
50
|
+
}
|
|
51
|
+
function normalizeTelegramChatId(kind, id) {
|
|
52
|
+
return /^-?\d+$/u.test(id.trim())
|
|
53
|
+
? id.trim()
|
|
54
|
+
: kind === "group"
|
|
55
|
+
? TELEGRAM_GROUP_CHAT_ID
|
|
56
|
+
: TELEGRAM_DIRECT_CHAT_ID;
|
|
57
|
+
}
|
|
58
|
+
function telegramTargetKey(chatId, threadId) {
|
|
59
|
+
return threadId === undefined ? chatId : `${chatId}:topic:${threadId}`;
|
|
60
|
+
}
|
|
61
|
+
function qaTargetForInbound(input) {
|
|
62
|
+
const prefix = input.conversation.kind === "direct"
|
|
63
|
+
? "dm"
|
|
64
|
+
: input.conversation.kind === "channel"
|
|
65
|
+
? "channel"
|
|
66
|
+
: "group";
|
|
67
|
+
return input.threadId
|
|
68
|
+
? `thread:${input.conversation.id}/${input.threadId}`
|
|
69
|
+
: `${prefix}:${input.conversation.id}`;
|
|
70
|
+
}
|
|
71
|
+
function requireTelegramManifest(manifest) {
|
|
72
|
+
if (manifest.provider !== "telegram") {
|
|
73
|
+
throw new Error(`Unsupported OpenClaw fake provider binding: ${String(manifest.provider)}`);
|
|
74
|
+
}
|
|
75
|
+
return manifest;
|
|
76
|
+
}
|
|
77
|
+
export function resolveOpenClawCrablineChannel(input) {
|
|
78
|
+
const channel = input?.trim().toLowerCase() || OPENCLAW_CRABLINE_DEFAULT_CHANNEL;
|
|
79
|
+
if (isCrablineFakeProviderChannel(channel)) {
|
|
80
|
+
return channel;
|
|
81
|
+
}
|
|
82
|
+
throw new Error(`--channel must be one of ${CRABLINE_FAKE_PROVIDER_CHANNELS.join(", ")} for --channel-driver crabline, got "${input}".`);
|
|
83
|
+
}
|
|
84
|
+
export function resolveOpenClawCrablineChannelDriverSelection(params) {
|
|
85
|
+
return {
|
|
86
|
+
channel: resolveOpenClawCrablineChannel(params.channel),
|
|
87
|
+
channelDriver: "crabline",
|
|
88
|
+
capabilityMatrixPath: OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,
|
|
89
|
+
smokeArtifactPath: OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export async function probeOpenClawCrablineFakeProvider(manifest) {
|
|
93
|
+
if (manifest.provider !== "telegram") {
|
|
94
|
+
throw new Error(`OpenClaw Crabline fake-provider smoke does not support ${String(manifest.provider)}.`);
|
|
95
|
+
}
|
|
96
|
+
const response = await fetch(`${manifest.endpoints.apiRoot}/bot${manifest.botToken}/getMe`);
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new Error(`Crabline Telegram getMe probe failed with HTTP ${response.status}.`);
|
|
99
|
+
}
|
|
100
|
+
return await response.json();
|
|
101
|
+
}
|
|
102
|
+
export function createOpenClawCrablineFakeProviderBinding(manifest) {
|
|
103
|
+
const telegram = requireTelegramManifest(manifest);
|
|
104
|
+
return {
|
|
105
|
+
accountId: TELEGRAM_ACCOUNT_ID,
|
|
106
|
+
channel: "telegram",
|
|
107
|
+
createChannelDriverSmokeEnv: (env) => ({
|
|
108
|
+
...env,
|
|
109
|
+
TELEGRAM_BOT_TOKEN: telegram.botToken,
|
|
110
|
+
}),
|
|
111
|
+
createGatewayConfig: (openclawConfig = {}) => {
|
|
112
|
+
const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};
|
|
113
|
+
const telegramConfig = isRecord(channels.telegram) ? channels.telegram : {};
|
|
114
|
+
const groups = isRecord(telegramConfig.groups) ? telegramConfig.groups : {};
|
|
115
|
+
const defaultGroup = isRecord(groups["*"]) ? groups["*"] : {};
|
|
116
|
+
const messages = isRecord(openclawConfig.messages) ? openclawConfig.messages : {};
|
|
117
|
+
const groupChat = isRecord(messages.groupChat) ? messages.groupChat : {};
|
|
118
|
+
return {
|
|
119
|
+
...openclawConfig,
|
|
120
|
+
channels: {
|
|
121
|
+
...channels,
|
|
122
|
+
telegram: {
|
|
123
|
+
...telegramConfig,
|
|
124
|
+
enabled: true,
|
|
125
|
+
botToken: telegram.botToken,
|
|
126
|
+
apiRoot: telegram.endpoints.apiRoot,
|
|
127
|
+
dmPolicy: "open",
|
|
128
|
+
groupPolicy: "open",
|
|
129
|
+
allowFrom: ["*"],
|
|
130
|
+
groupAllowFrom: ["*"],
|
|
131
|
+
groups: {
|
|
132
|
+
...groups,
|
|
133
|
+
"*": {
|
|
134
|
+
...defaultGroup,
|
|
135
|
+
requireMention: false,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
messages: {
|
|
141
|
+
...messages,
|
|
142
|
+
groupChat: {
|
|
143
|
+
...groupChat,
|
|
144
|
+
mentionPatterns: ["\\b@?openclaw\\b"],
|
|
145
|
+
visibleReplies: "automatic",
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
requiredPluginIds: ["telegram"],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export function createOpenClawCrablineAgentDelivery(params) {
|
|
154
|
+
requireTelegramManifest(params.manifest);
|
|
155
|
+
const parsed = parseQaTarget(params.target);
|
|
156
|
+
const chatId = normalizeTelegramChatId(parsed.kind, parsed.id);
|
|
157
|
+
const threadId = readInteger(parsed.threadId);
|
|
158
|
+
const to = telegramTargetKey(chatId, threadId);
|
|
159
|
+
return {
|
|
160
|
+
channel: "telegram",
|
|
161
|
+
to,
|
|
162
|
+
replyChannel: "telegram",
|
|
163
|
+
replyTo: to,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function createOpenClawCrablineInbound(params) {
|
|
167
|
+
requireTelegramManifest(params.manifest);
|
|
168
|
+
const kind = params.input.conversation.kind === "direct" ? "direct" : "group";
|
|
169
|
+
const chatId = normalizeTelegramChatId(kind, params.input.conversation.id);
|
|
170
|
+
const threadId = readInteger(params.input.threadId);
|
|
171
|
+
return {
|
|
172
|
+
providerBody: {
|
|
173
|
+
chatId,
|
|
174
|
+
fromId: readInteger(params.input.senderId) ?? TELEGRAM_DEFAULT_SENDER_ID,
|
|
175
|
+
fromName: params.input.senderName ?? params.input.senderId,
|
|
176
|
+
...(threadId !== undefined ? { messageThreadId: threadId } : {}),
|
|
177
|
+
text: params.input.text,
|
|
178
|
+
},
|
|
179
|
+
providerTargetKey: telegramTargetKey(chatId, threadId),
|
|
180
|
+
qaTarget: qaTargetForInbound(params.input),
|
|
181
|
+
stateConversation: {
|
|
182
|
+
id: chatId,
|
|
183
|
+
kind: kind === "group" ? "group" : "direct",
|
|
184
|
+
},
|
|
185
|
+
...(threadId !== undefined ? { threadId: String(threadId) } : {}),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export function createOpenClawCrablineOutboundFromRecorderEvent(params) {
|
|
189
|
+
requireTelegramManifest(params.manifest);
|
|
190
|
+
const event = params.event;
|
|
191
|
+
if (event.type !== "api" ||
|
|
192
|
+
typeof event.path !== "string" ||
|
|
193
|
+
!event.path.endsWith("/sendMessage") ||
|
|
194
|
+
!event.body ||
|
|
195
|
+
typeof event.body !== "object") {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
const chatId = readString(event.body.chat_id);
|
|
199
|
+
const text = typeof event.body.text === "string" && event.body.text.trim() ? event.body.text : undefined;
|
|
200
|
+
if (!chatId || !text) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const threadId = readInteger(event.body.message_thread_id);
|
|
204
|
+
const providerTargetKey = telegramTargetKey(chatId, threadId);
|
|
205
|
+
return {
|
|
206
|
+
accountId: TELEGRAM_ACCOUNT_ID,
|
|
207
|
+
senderId: "openclaw",
|
|
208
|
+
senderName: "OpenClaw QA",
|
|
209
|
+
text,
|
|
210
|
+
to: params.targetByProviderTarget.get(providerTargetKey) ??
|
|
211
|
+
(threadId === undefined ? chatId : providerTargetKey),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
export async function startOpenClawCrablineAdapter(params) {
|
|
215
|
+
const server = await startCrablineFakeProviderServer({
|
|
216
|
+
channel: params.channel,
|
|
217
|
+
recorderPath: params.recorderPath,
|
|
218
|
+
});
|
|
219
|
+
const binding = createOpenClawCrablineFakeProviderBinding(server.manifest);
|
|
220
|
+
return {
|
|
221
|
+
...binding,
|
|
222
|
+
close: server.close,
|
|
223
|
+
createGatewayConfig: (openclawConfig = params.openclawConfig ?? {}) => binding.createGatewayConfig(openclawConfig),
|
|
224
|
+
createAgentDelivery: ({ target }) => createOpenClawCrablineAgentDelivery({
|
|
225
|
+
manifest: server.manifest,
|
|
226
|
+
target,
|
|
227
|
+
}),
|
|
228
|
+
createInbound: ({ input }) => createOpenClawCrablineInbound({
|
|
229
|
+
input,
|
|
230
|
+
manifest: server.manifest,
|
|
231
|
+
}),
|
|
232
|
+
createOutboundFromRecorderEvent: ({ event, targetByProviderTarget }) => createOpenClawCrablineOutboundFromRecorderEvent({
|
|
233
|
+
event,
|
|
234
|
+
manifest: server.manifest,
|
|
235
|
+
targetByProviderTarget,
|
|
236
|
+
}),
|
|
237
|
+
manifest: server.manifest,
|
|
238
|
+
probe: () => probeOpenClawCrablineFakeProvider(server.manifest),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
export async function runOpenClawCrablineChannelDriverSmoke(params) {
|
|
242
|
+
const manifestPath = path.join(params.outputDir, OPENCLAW_CRABLINE_MANIFEST_PATH);
|
|
243
|
+
const recorderPath = path.join(params.outputDir, "artifacts", "crabline", `${params.selection.channel}-fake-provider.jsonl`);
|
|
244
|
+
await fs.mkdir(path.dirname(recorderPath), { recursive: true });
|
|
245
|
+
const adapter = await startOpenClawCrablineAdapter({
|
|
246
|
+
channel: params.selection.channel,
|
|
247
|
+
openclawConfig: {},
|
|
248
|
+
recorderPath,
|
|
249
|
+
});
|
|
250
|
+
try {
|
|
251
|
+
await fs.writeFile(manifestPath, `${JSON.stringify(adapter.manifest, null, 2)}\n`, "utf8");
|
|
252
|
+
const probe = await adapter.probe();
|
|
253
|
+
return {
|
|
254
|
+
capabilityReport: {
|
|
255
|
+
result: {
|
|
256
|
+
driver: "crabline",
|
|
257
|
+
selectedChannel: params.selection.channel,
|
|
258
|
+
supportedChannels: [...CRABLINE_FAKE_PROVIDER_CHANNELS],
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
manifestPath: path.basename(manifestPath),
|
|
262
|
+
smoke: {
|
|
263
|
+
manifestPath: path.basename(manifestPath),
|
|
264
|
+
result: {
|
|
265
|
+
ok: true,
|
|
266
|
+
probe,
|
|
267
|
+
provider: adapter.manifest.provider,
|
|
268
|
+
endpoints: adapter.manifest.endpoints,
|
|
269
|
+
recorderPath: path.relative(params.outputDir, adapter.manifest.recorderPath),
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
await adapter.close();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
export function createOpenClawCrablineChannelReportNotes(selection) {
|
|
279
|
+
if (!selection) {
|
|
280
|
+
return [];
|
|
281
|
+
}
|
|
282
|
+
return [
|
|
283
|
+
`Channel driver: ${selection.channelDriver} fake provider for ${selection.channel}.`,
|
|
284
|
+
`Channel capability report: ${selection.capabilityMatrixPath}.`,
|
|
285
|
+
`Channel driver smoke: ${selection.smokeArtifactPath}.`,
|
|
286
|
+
"Crabline starts local provider-shaped servers; OpenClaw uses its normal channel adapter against those endpoints.",
|
|
287
|
+
];
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=openclaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/openclaw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProviderConfig } from "../../config/schema.js";
|
|
2
|
+
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
3
|
+
import type { ProviderAdapter } from "../types.js";
|
|
4
|
+
type DiscordEnvironment = Partial<Pick<NodeJS.ProcessEnv, "DISCORD_APPLICATION_ID" | "DISCORD_BOT_TOKEN" | "DISCORD_PUBLIC_KEY">>;
|
|
5
|
+
export declare function resolveDiscordAdapterConfig(config: ProviderConfig, userName: string, env?: DiscordEnvironment): Promise<{
|
|
6
|
+
applicationId?: string;
|
|
7
|
+
botToken?: string;
|
|
8
|
+
mentionRoleIds?: string[] | undefined;
|
|
9
|
+
publicKey?: string;
|
|
10
|
+
userName: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare class DiscordProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
|
|
13
|
+
constructor(id: string, config: ProviderConfig, _userName: string);
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { CrablineError } from "../../core/errors.js";
|
|
3
|
+
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) {
|
|
6
|
+
return {
|
|
7
|
+
...((config.discord?.applicationId ?? env.DISCORD_APPLICATION_ID)
|
|
8
|
+
? { applicationId: config.discord?.applicationId ?? env.DISCORD_APPLICATION_ID }
|
|
9
|
+
: {}),
|
|
10
|
+
...((config.discord?.botToken ?? env.DISCORD_BOT_TOKEN)
|
|
11
|
+
? { botToken: config.discord?.botToken ?? env.DISCORD_BOT_TOKEN }
|
|
12
|
+
: {}),
|
|
13
|
+
...((config.discord?.mentionRoleIds?.length ?? 0) > 0
|
|
14
|
+
? { mentionRoleIds: config.discord?.mentionRoleIds }
|
|
15
|
+
: {}),
|
|
16
|
+
...((config.discord?.publicKey ?? env.DISCORD_PUBLIC_KEY)
|
|
17
|
+
? { publicKey: config.discord?.publicKey ?? env.DISCORD_PUBLIC_KEY }
|
|
18
|
+
: {}),
|
|
19
|
+
userName,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function toRecorderPath(providerId, config) {
|
|
23
|
+
const configuredPath = config.discord?.recorder.path;
|
|
24
|
+
return configuredPath
|
|
25
|
+
? path.resolve(configuredPath)
|
|
26
|
+
: path.resolve(".crabline", "recorders", `${providerId}.jsonl`);
|
|
27
|
+
}
|
|
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) {
|
|
40
|
+
if (!isRecord(payload)) {
|
|
41
|
+
throw new CrablineError("Discord webhook payload must be an object", { kind: "inbound" });
|
|
42
|
+
}
|
|
43
|
+
if (optionalRecord(payload, "message")) {
|
|
44
|
+
return genericMockPayloadWithNativeThread({
|
|
45
|
+
channelRule: DISCORD_SNOWFLAKE_RULE,
|
|
46
|
+
payload,
|
|
47
|
+
threadRule: DISCORD_SNOWFLAKE_RULE,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const data = optionalRecord(payload, "data");
|
|
51
|
+
const author = optionalRecord(payload, "author") ?? optionalRecord(payload, "member")?.user;
|
|
52
|
+
const channelId = optionalString(payload, "channel_id");
|
|
53
|
+
const text = optionalString(payload, "content") ??
|
|
54
|
+
(data ? (optionalString(data, "content") ?? optionalString(data, "name")) : undefined);
|
|
55
|
+
if (!channelId || !text) {
|
|
56
|
+
throw new CrablineError("Discord event payload requires channel_id and content", {
|
|
57
|
+
kind: "inbound",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const authorRecord = isRecord(author) ? author : undefined;
|
|
61
|
+
const threadId = optionalString(payload, "thread_id") ?? channelId;
|
|
62
|
+
return {
|
|
63
|
+
author: authorFromBotFlag(authorRecord?.bot === true),
|
|
64
|
+
...(optionalString(payload, "id") ? { id: optionalString(payload, "id") } : {}),
|
|
65
|
+
raw: payload,
|
|
66
|
+
text,
|
|
67
|
+
threadId: requireNativeInboundId(threadId, DISCORD_SNOWFLAKE_RULE, "Discord thread_id"),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export class DiscordProviderAdapter extends LocalMockProviderAdapter {
|
|
71
|
+
constructor(id, config, _userName) {
|
|
72
|
+
super({
|
|
73
|
+
codec: DISCORD_CODEC,
|
|
74
|
+
config,
|
|
75
|
+
id,
|
|
76
|
+
options: {
|
|
77
|
+
defaultWebhook: {
|
|
78
|
+
host: "127.0.0.1",
|
|
79
|
+
path: "/discord/interactions",
|
|
80
|
+
port: 8788,
|
|
81
|
+
},
|
|
82
|
+
endpointLabel: "interactions endpoint",
|
|
83
|
+
normalizeWebhookPayload: normalizeDiscordWebhookPayload,
|
|
84
|
+
platform: "discord",
|
|
85
|
+
publicUrl: config.discord?.webhook.publicUrl,
|
|
86
|
+
recorderPath: toRecorderPath(id, config),
|
|
87
|
+
webhook: config.discord?.webhook,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=discord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../../src/providers/builtin/discord.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProviderConfig } from "../../config/schema.js";
|
|
2
|
+
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
3
|
+
import type { ProviderAdapter } from "../types.js";
|
|
4
|
+
export declare function resolveFeishuAdapterConfig(config: ProviderConfig, _env?: NodeJS.ProcessEnv): {
|
|
5
|
+
appId: string;
|
|
6
|
+
userName: string | undefined;
|
|
7
|
+
};
|
|
8
|
+
export declare class FeishuProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
|
|
9
|
+
constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
|
|
10
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { CrablineError } from "../../core/errors.js";
|
|
3
|
+
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
4
|
+
import { authorFromBotFlag, createNativeTargetCodec, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
|
|
5
|
+
const FEISHU_CHAT_ID_RULE = {
|
|
6
|
+
example: "oc_abc123",
|
|
7
|
+
name: "Feishu chat_id",
|
|
8
|
+
pattern: /^oc_[A-Za-z0-9_-]+$/u,
|
|
9
|
+
};
|
|
10
|
+
const FEISHU_MESSAGE_ID_RULE = {
|
|
11
|
+
example: "om_abc123",
|
|
12
|
+
name: "Feishu message_id",
|
|
13
|
+
pattern: /^om_[A-Za-z0-9_-]+$/u,
|
|
14
|
+
};
|
|
15
|
+
export function resolveFeishuAdapterConfig(config, _env = process.env) {
|
|
16
|
+
return {
|
|
17
|
+
appId: config.feishu?.appId ?? "local-mock-feishu-app",
|
|
18
|
+
userName: config.feishu?.userName,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export class FeishuProviderAdapter extends LocalMockProviderAdapter {
|
|
22
|
+
constructor(id, config, _userName, _runtime) {
|
|
23
|
+
super({
|
|
24
|
+
codec: createNativeTargetCodec({
|
|
25
|
+
channel: FEISHU_CHAT_ID_RULE,
|
|
26
|
+
channelLabel: "Feishu chat_id",
|
|
27
|
+
thread: FEISHU_MESSAGE_ID_RULE,
|
|
28
|
+
threadLabel: "Feishu message_id",
|
|
29
|
+
}),
|
|
30
|
+
config,
|
|
31
|
+
id,
|
|
32
|
+
options: {
|
|
33
|
+
defaultWebhook: { host: "127.0.0.1", path: "/feishu/webhook", port: 8795 },
|
|
34
|
+
endpointLabel: "webhook endpoint",
|
|
35
|
+
normalizeWebhookPayload: normalizeFeishuWebhookPayload,
|
|
36
|
+
platform: "feishu",
|
|
37
|
+
publicUrl: config.feishu?.webhook.publicUrl,
|
|
38
|
+
recorderPath: config.feishu?.recorder.path
|
|
39
|
+
? path.resolve(config.feishu.recorder.path)
|
|
40
|
+
: undefined,
|
|
41
|
+
webhook: config.feishu?.webhook,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function normalizeFeishuWebhookPayload(payload) {
|
|
47
|
+
if (!isRecord(payload)) {
|
|
48
|
+
throw new CrablineError("Feishu webhook payload must be an object", { kind: "inbound" });
|
|
49
|
+
}
|
|
50
|
+
const event = optionalRecord(payload, "event");
|
|
51
|
+
const message = event ? optionalRecord(event, "message") : undefined;
|
|
52
|
+
if (!message) {
|
|
53
|
+
return genericMockPayloadWithNativeThread({
|
|
54
|
+
channelRule: FEISHU_CHAT_ID_RULE,
|
|
55
|
+
payload,
|
|
56
|
+
threadRule: FEISHU_MESSAGE_ID_RULE,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const chatId = optionalString(message, "chat_id");
|
|
60
|
+
const messageId = optionalString(message, "message_id");
|
|
61
|
+
const rawContent = optionalString(message, "content");
|
|
62
|
+
const text = parseFeishuText(rawContent);
|
|
63
|
+
if (!chatId || !text) {
|
|
64
|
+
throw new CrablineError("Feishu event payload requires message.chat_id and message.content", {
|
|
65
|
+
kind: "inbound",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
author: authorFromBotFlag(false),
|
|
70
|
+
...(messageId
|
|
71
|
+
? { id: requireNativeInboundId(messageId, FEISHU_MESSAGE_ID_RULE, "Feishu message_id") }
|
|
72
|
+
: {}),
|
|
73
|
+
raw: payload,
|
|
74
|
+
text,
|
|
75
|
+
threadId: messageId
|
|
76
|
+
? requireNativeInboundId(messageId, FEISHU_MESSAGE_ID_RULE, "Feishu message_id")
|
|
77
|
+
: requireNativeInboundId(chatId, FEISHU_CHAT_ID_RULE, "Feishu chat_id"),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function parseFeishuText(content) {
|
|
81
|
+
if (!content) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(content);
|
|
86
|
+
if (isRecord(parsed) && typeof parsed.text === "string") {
|
|
87
|
+
return parsed.text;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return content;
|
|
92
|
+
}
|
|
93
|
+
return content;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=feishu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu.js","sourceRoot":"","sources":["../../../../src/providers/builtin/feishu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProviderConfig } from "../../config/schema.js";
|
|
2
|
+
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
3
|
+
import type { ProviderAdapter } from "../types.js";
|
|
4
|
+
export declare function resolveGoogleChatAdapterConfig(config: ProviderConfig, _env?: NodeJS.ProcessEnv): {
|
|
5
|
+
endpointUrl: string | undefined;
|
|
6
|
+
projectNumber: string;
|
|
7
|
+
userName: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
export declare class GoogleChatProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
|
|
10
|
+
constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
|
|
11
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { CrablineError } from "../../core/errors.js";
|
|
3
|
+
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
4
|
+
import { authorFromBotFlag, createNativeTargetCodec, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
|
|
5
|
+
const GOOGLE_CHAT_SPACE_RULE = {
|
|
6
|
+
example: "spaces/AAAABbbbCCC",
|
|
7
|
+
name: "Google Chat space name",
|
|
8
|
+
pattern: /^spaces\/[A-Za-z0-9_-]+$/u,
|
|
9
|
+
};
|
|
10
|
+
const GOOGLE_CHAT_THREAD_RULE = {
|
|
11
|
+
example: "spaces/AAAABbbbCCC/threads/BBBBccccDDD",
|
|
12
|
+
name: "Google Chat thread name",
|
|
13
|
+
pattern: /^spaces\/[A-Za-z0-9_-]+\/threads\/[A-Za-z0-9_-]+$/u,
|
|
14
|
+
};
|
|
15
|
+
export function resolveGoogleChatAdapterConfig(config, _env = process.env) {
|
|
16
|
+
return {
|
|
17
|
+
endpointUrl: config.googlechat?.endpointUrl,
|
|
18
|
+
projectNumber: config.googlechat?.googleChatProjectNumber ?? "local-mock-googlechat",
|
|
19
|
+
userName: config.googlechat?.userName,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export class GoogleChatProviderAdapter extends LocalMockProviderAdapter {
|
|
23
|
+
constructor(id, config, _userName, _runtime) {
|
|
24
|
+
super({
|
|
25
|
+
codec: createNativeTargetCodec({
|
|
26
|
+
channel: GOOGLE_CHAT_SPACE_RULE,
|
|
27
|
+
channelLabel: "Google Chat space.name",
|
|
28
|
+
thread: GOOGLE_CHAT_THREAD_RULE,
|
|
29
|
+
threadLabel: "Google Chat thread.name",
|
|
30
|
+
}),
|
|
31
|
+
config,
|
|
32
|
+
id,
|
|
33
|
+
options: {
|
|
34
|
+
defaultWebhook: { host: "127.0.0.1", path: "/googlechat/webhook", port: 8792 },
|
|
35
|
+
endpointLabel: "webhook endpoint",
|
|
36
|
+
normalizeWebhookPayload: normalizeGoogleChatWebhookPayload,
|
|
37
|
+
platform: "googlechat",
|
|
38
|
+
publicUrl: config.googlechat?.webhook.publicUrl,
|
|
39
|
+
recorderPath: config.googlechat?.recorder.path
|
|
40
|
+
? path.resolve(config.googlechat.recorder.path)
|
|
41
|
+
: undefined,
|
|
42
|
+
webhook: config.googlechat?.webhook,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function normalizeGoogleChatWebhookPayload(payload) {
|
|
48
|
+
if (!isRecord(payload)) {
|
|
49
|
+
throw new CrablineError("Google Chat webhook payload must be an object", {
|
|
50
|
+
kind: "inbound",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const payloadMessage = optionalRecord(payload, "message");
|
|
54
|
+
const message = payloadMessage ?? payload;
|
|
55
|
+
if (payloadMessage && optionalString(payloadMessage, "threadId")) {
|
|
56
|
+
return genericMockPayloadWithNativeThread({
|
|
57
|
+
channelRule: GOOGLE_CHAT_SPACE_RULE,
|
|
58
|
+
payload,
|
|
59
|
+
threadRule: GOOGLE_CHAT_THREAD_RULE,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const space = optionalRecord(message, "space");
|
|
63
|
+
const thread = optionalRecord(message, "thread");
|
|
64
|
+
const sender = optionalRecord(message, "sender");
|
|
65
|
+
const spaceName = space ? optionalString(space, "name") : undefined;
|
|
66
|
+
const threadName = thread ? optionalString(thread, "name") : undefined;
|
|
67
|
+
const text = optionalString(message, "text") ?? optionalString(message, "argumentText");
|
|
68
|
+
if (!spaceName || !text) {
|
|
69
|
+
throw new CrablineError("Google Chat message payload requires space.name and text", {
|
|
70
|
+
kind: "inbound",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
author: authorFromBotFlag(optionalString(sender ?? {}, "type") === "BOT"),
|
|
75
|
+
...(optionalString(message, "name") ? { id: optionalString(message, "name") } : {}),
|
|
76
|
+
raw: payload,
|
|
77
|
+
text,
|
|
78
|
+
threadId: threadName
|
|
79
|
+
? requireNativeInboundId(threadName, GOOGLE_CHAT_THREAD_RULE, "Google Chat thread.name")
|
|
80
|
+
: requireNativeInboundId(spaceName, GOOGLE_CHAT_SPACE_RULE, "Google Chat space.name"),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=googlechat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googlechat.js","sourceRoot":"","sources":["../../../../src/providers/builtin/googlechat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProviderConfig } from "../../config/schema.js";
|
|
2
|
+
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
3
|
+
import type { ProviderAdapter } from "../types.js";
|
|
4
|
+
export declare function resolveIMessageAdapterConfig(config: ProviderConfig, env?: NodeJS.ProcessEnv): {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
local: boolean;
|
|
7
|
+
serverUrl: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
export declare class IMessageProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
|
|
10
|
+
constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
|
|
11
|
+
}
|