@openclaw/crabline 0.1.0 → 0.1.1

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.
@@ -1,78 +1,21 @@
1
1
  import { CRABLINE_FAKE_PROVIDER_CHANNELS, isCrablineFakeProviderChannel, startCrablineFakeProviderServer, } from "./fake-servers/index.js";
2
+ import { TELEGRAM_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/telegram.js";
3
+ import { WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE } from "./openclaw/bridges/whatsapp.js";
4
+ import { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, parseQaTarget, } from "./openclaw/shared.js";
2
5
  import fs from "node:fs/promises";
3
6
  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;
7
+ export { OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, };
8
+ const OPENCLAW_CRABLINE_PROVIDER_BRIDGES = {
9
+ telegram: TELEGRAM_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
10
+ whatsapp: WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE,
11
+ };
12
+ const OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST = Object.values(OPENCLAW_CRABLINE_PROVIDER_BRIDGES);
13
+ function createOpenClawCrablineProviderAdapter(manifest) {
14
+ const bridge = OPENCLAW_CRABLINE_PROVIDER_BRIDGE_LIST.find((candidate) => candidate.provider === manifest.provider);
15
+ if (bridge) {
16
+ return bridge.createAdapterFromManifest(manifest);
17
+ }
18
+ throw new Error("Unsupported OpenClaw fake provider binding.");
76
19
  }
77
20
  export function resolveOpenClawCrablineChannel(input) {
78
21
  const channel = input?.trim().toLowerCase() || OPENCLAW_CRABLINE_DEFAULT_CHANNEL;
@@ -90,152 +33,42 @@ export function resolveOpenClawCrablineChannelDriverSelection(params) {
90
33
  };
91
34
  }
92
35
  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();
36
+ return await createOpenClawCrablineProviderAdapter(manifest).probe();
101
37
  }
102
38
  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
- };
39
+ return createOpenClawCrablineProviderAdapter(manifest).createBinding();
152
40
  }
153
41
  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
- };
42
+ return createOpenClawCrablineProviderAdapter(params.manifest).createAgentDelivery(parseQaTarget(params.target));
165
43
  }
166
44
  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
- };
45
+ return createOpenClawCrablineProviderAdapter(params.manifest).createInbound(params.input);
187
46
  }
188
47
  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
- };
48
+ return createOpenClawCrablineProviderAdapter(params.manifest).createOutboundFromRecorderEvent({
49
+ event: params.event,
50
+ targetByProviderTarget: params.targetByProviderTarget,
51
+ });
213
52
  }
214
53
  export async function startOpenClawCrablineAdapter(params) {
215
54
  const server = await startCrablineFakeProviderServer({
216
55
  channel: params.channel,
217
56
  recorderPath: params.recorderPath,
218
57
  });
219
- const binding = createOpenClawCrablineFakeProviderBinding(server.manifest);
58
+ const providerAdapter = createOpenClawCrablineProviderAdapter(server.manifest);
59
+ const binding = providerAdapter.createBinding();
220
60
  return {
221
61
  ...binding,
222
62
  close: server.close,
223
63
  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({
64
+ createAgentDelivery: ({ target }) => providerAdapter.createAgentDelivery(parseQaTarget(target)),
65
+ createInbound: ({ input }) => providerAdapter.createInbound(input),
66
+ createOutboundFromRecorderEvent: ({ event, targetByProviderTarget }) => providerAdapter.createOutboundFromRecorderEvent({
233
67
  event,
234
- manifest: server.manifest,
235
68
  targetByProviderTarget,
236
69
  }),
237
70
  manifest: server.manifest,
238
- probe: () => probeOpenClawCrablineFakeProvider(server.manifest),
71
+ probe: () => providerAdapter.probe(),
239
72
  };
240
73
  }
241
74
  export async function runOpenClawCrablineChannelDriverSmoke(params) {
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/openclaw.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/openclaw.ts"],"names":[],"mappings":"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"}
@@ -76,7 +76,7 @@ Fake provider servers sit below OpenClaw's normal channel adapters. QA starts th
76
76
  server, writes the emitted runtime manifest into OpenClaw config/env, and then
77
77
  OpenClaw talks to the local fake provider instead of the public provider.
78
78
 
79
- Telegram is currently implemented:
79
+ Telegram:
80
80
 
81
81
  ```bash
82
82
  crabline --json serve telegram --ready-file .crabline/telegram-server.json
@@ -107,6 +107,50 @@ The admin ingress accepts JSON like:
107
107
  OpenClaw consumes that message through Telegram `getUpdates`; outbound adapter
108
108
  sends are recorded through Telegram `sendMessage`.
109
109
 
110
+ WhatsApp:
111
+
112
+ ```bash
113
+ crabline --json serve whatsapp --ready-file .crabline/whatsapp-server.json
114
+ ```
115
+
116
+ Manifest fields:
117
+
118
+ - `endpoints.apiRoot`: Crabline WhatsApp fake provider API root
119
+ - `accessToken`: bearer token for fake provider requests
120
+ - `adminToken`: value for the `X-Crabline-Admin-Token` header on admin ingress
121
+ - `selfJid`: fake authenticated WhatsApp user JID
122
+ - `endpoints.adminInboundUrl`: authenticated admin ingress for test user
123
+ messages; subscribed Baileys mock sockets receive them as `messages.upsert`
124
+ - `endpoints.messagesUrl`: text send endpoint used by the Baileys-shaped mock
125
+ - `endpoints.presenceUrl`: presence endpoint used by `sendPresenceUpdate`
126
+ - `recorderPath`: JSONL provider traffic recorder
127
+
128
+ Use the started server's `createBaileysMockSocket()` when a test needs a
129
+ Baileys-style `sendMessage()` / `sendPresenceUpdate()` surface backed by the
130
+ same fake provider server. The admin token is generated randomly unless
131
+ `--admin-token <token>` is provided.
132
+
133
+ OpenClaw bridge callers should post injected user messages with the
134
+ `providerUrl`, `providerHeaders`, and `providerBody` returned by
135
+ `createOpenClawCrablineInbound()`. For WhatsApp, inbound `messages.upsert`
136
+ delivery is an in-process Baileys mock socket behavior: create the fake server
137
+ and Baileys mock socket in the same Node process when testing listener-driven
138
+ inbound delivery. If the socket is created outside the started server, pass the
139
+ same `WhatsAppBaileysMockRegistry` to the server and socket helper.
140
+
141
+ The admin ingress accepts JSON like:
142
+
143
+ ```json
144
+ {
145
+ "chatJid": "120363001234567890@g.us",
146
+ "senderJid": "15551234567@s.whatsapp.net",
147
+ "text": "user nonce-123"
148
+ }
149
+ ```
150
+
151
+ Outbound text sends and composing presence are recorded through the fake
152
+ provider messages and presence endpoints.
153
+
110
154
  ## Webhook Payload
111
155
 
112
156
  Mock webhooks accept provider-native event payloads where Crabline has a built-in
@@ -145,6 +189,8 @@ as `telegram:`, `discord:`, or `slack:`.
145
189
  - Slack threads: `1700000000.000100`
146
190
  - Telegram chats: `-1001234567890` or `@channelusername`
147
191
  - Telegram topics: `42`
192
+ - WhatsApp users: `15551234567@s.whatsapp.net`
193
+ - WhatsApp groups: `120363001234567890@g.us`
148
194
  - Discord channels and threads: Discord snowflake ids such as
149
195
  `123456789012345678`
150
196
  - Google Chat spaces: `spaces/AAAABbbbCCC`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/crabline",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Standalone CLI for deterministic messaging provider E2E tests",
5
5
  "homepage": "https://github.com/openclaw/crabline#readme",
6
6
  "bugs": {