@openclaw/crabline 0.1.0 → 0.1.3
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 +68 -1
- package/dist/src/cli/program.js +62 -12
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/fake-servers/http.d.ts +30 -0
- package/dist/src/fake-servers/http.js +130 -0
- package/dist/src/fake-servers/http.js.map +1 -0
- package/dist/src/fake-servers/index.d.ts +21 -6
- package/dist/src/fake-servers/index.js +19 -5
- package/dist/src/fake-servers/index.js.map +1 -1
- package/dist/src/fake-servers/slack.d.ts +34 -0
- package/dist/src/fake-servers/slack.js +445 -0
- package/dist/src/fake-servers/slack.js.map +1 -0
- package/dist/src/fake-servers/telegram.js +3 -20
- package/dist/src/fake-servers/telegram.js.map +1 -1
- package/dist/src/fake-servers/whatsapp-socket-factory.d.ts +34 -0
- package/dist/src/fake-servers/whatsapp-socket-factory.js +225 -0
- package/dist/src/fake-servers/whatsapp-socket-factory.js.map +1 -0
- package/dist/src/fake-servers/whatsapp.d.ts +96 -0
- package/dist/src/fake-servers/whatsapp.js +474 -0
- package/dist/src/fake-servers/whatsapp.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.d.ts +1 -0
- package/dist/src/openclaw/bridges/slack.js +150 -0
- package/dist/src/openclaw/bridges/slack.js.map +1 -0
- package/dist/src/openclaw/bridges/telegram.d.ts +1 -0
- package/dist/src/openclaw/bridges/telegram.js +137 -0
- package/dist/src/openclaw/bridges/telegram.js.map +1 -0
- package/dist/src/openclaw/bridges/whatsapp.d.ts +1 -0
- package/dist/src/openclaw/bridges/whatsapp.js +115 -0
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +125 -0
- package/dist/src/openclaw/shared.js +78 -0
- package/dist/src/openclaw/shared.js.map +1 -0
- package/dist/src/openclaw.d.ts +3 -76
- package/dist/src/openclaw.js +31 -196
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.d.ts +2 -5
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/slack.js +1 -10
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +5 -0
- package/dist/src/providers/native-ids.js +2 -0
- package/dist/src/providers/native-ids.js.map +1 -0
- package/dist/src/providers/slack-ids.d.ts +6 -0
- package/dist/src/providers/slack-ids.js +24 -0
- package/dist/src/providers/slack-ids.js.map +1 -0
- package/docs/channel-setup.md +82 -1
- package/package.json +5 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import fsPromises from "node:fs/promises";
|
|
3
|
+
import { createWhatsAppBaileysMockSocket, } from "./whatsapp.js";
|
|
4
|
+
export const CRABLINE_WHATSAPP_ACCESS_TOKEN_ENV = "CRABLINE_WHATSAPP_ACCESS_TOKEN";
|
|
5
|
+
export const CRABLINE_WHATSAPP_API_ROOT_ENV = "CRABLINE_WHATSAPP_API_ROOT";
|
|
6
|
+
export const CRABLINE_WHATSAPP_RECORDER_PATH_ENV = "CRABLINE_WHATSAPP_RECORDER_PATH";
|
|
7
|
+
export const CRABLINE_WHATSAPP_SELF_JID_ENV = "CRABLINE_WHATSAPP_SELF_JID";
|
|
8
|
+
const DEFAULT_RECORDER_POLL_MS = 50;
|
|
9
|
+
const RECORDER_BRIDGE_STATE_KEY = Symbol.for("crabline.whatsapp.baileysRecorderBridge");
|
|
10
|
+
function readNonEmptyString(value) {
|
|
11
|
+
const trimmed = typeof value === "string" ? value.trim() : "";
|
|
12
|
+
return trimmed || undefined;
|
|
13
|
+
}
|
|
14
|
+
function readRequiredEnv(env, key) {
|
|
15
|
+
const value = readNonEmptyString(env[key]);
|
|
16
|
+
if (!value) {
|
|
17
|
+
throw new Error(`${key} is required to create a WhatsApp Baileys mock socket.`);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function readOptionalEnv(env, key) {
|
|
22
|
+
return readNonEmptyString(env[key]);
|
|
23
|
+
}
|
|
24
|
+
function isRecord(value) {
|
|
25
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
26
|
+
}
|
|
27
|
+
function readRecordedInboundMessage(value) {
|
|
28
|
+
if (!isRecord(value) || !isRecord(value.key) || !isRecord(value.message)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
const id = readNonEmptyString(value.key.id);
|
|
32
|
+
const remoteJid = readNonEmptyString(value.key.remoteJid);
|
|
33
|
+
if (!id || !remoteJid || value.key.fromMe !== false) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
function getRecorderBridgeState(recorderPath) {
|
|
39
|
+
const globalState = globalThis;
|
|
40
|
+
const states = globalState[RECORDER_BRIDGE_STATE_KEY] ?? new Map();
|
|
41
|
+
globalState[RECORDER_BRIDGE_STATE_KEY] = states;
|
|
42
|
+
const state = states.get(recorderPath) ?? {
|
|
43
|
+
cursor: readRecorderLineCountSync(recorderPath),
|
|
44
|
+
interval: null,
|
|
45
|
+
sockets: new Set(),
|
|
46
|
+
syncPromise: null,
|
|
47
|
+
};
|
|
48
|
+
states.set(recorderPath, state);
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
function parseRecorderLine(line) {
|
|
52
|
+
try {
|
|
53
|
+
return JSON.parse(line);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function createInboundMessageFromRecorderEvent(event, lineIndex) {
|
|
60
|
+
if (!isRecord(event) || event.type !== "admin" || typeof event.path !== "string") {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
if (!event.path.endsWith("/crabline/whatsapp/inbound")) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const recordedMessage = readRecordedInboundMessage(event.message);
|
|
67
|
+
if (recordedMessage) {
|
|
68
|
+
return recordedMessage;
|
|
69
|
+
}
|
|
70
|
+
if (!isRecord(event.body)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const chatJid = readNonEmptyString(event.body.chatJid ?? event.body.chatId);
|
|
74
|
+
const senderJid = readNonEmptyString(event.body.senderJid ?? event.body.from);
|
|
75
|
+
const text = readNonEmptyString(event.body.text);
|
|
76
|
+
if (!chatJid || !senderJid || !text) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const messageId = readNonEmptyString(event.body.messageId) ??
|
|
80
|
+
`wamid.FAKEQA${String(lineIndex + 1).padStart(8, "0")}`;
|
|
81
|
+
return {
|
|
82
|
+
key: {
|
|
83
|
+
fromMe: false,
|
|
84
|
+
id: messageId,
|
|
85
|
+
...(chatJid.endsWith("@g.us") ? { participant: senderJid } : {}),
|
|
86
|
+
remoteJid: chatJid,
|
|
87
|
+
},
|
|
88
|
+
message: {
|
|
89
|
+
conversation: text,
|
|
90
|
+
},
|
|
91
|
+
messageTimestamp: Math.floor(Date.now() / 1000),
|
|
92
|
+
pushName: readNonEmptyString(event.body.pushName) ?? "Test User",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async function readRecorderLines(recorderPath) {
|
|
96
|
+
const text = await fsPromises.readFile(recorderPath, "utf8").catch((error) => {
|
|
97
|
+
if (isRecord(error) && error.code === "ENOENT") {
|
|
98
|
+
return "";
|
|
99
|
+
}
|
|
100
|
+
throw error;
|
|
101
|
+
});
|
|
102
|
+
return text.split(/\r?\n/u).filter((line) => line.trim().length > 0);
|
|
103
|
+
}
|
|
104
|
+
function readRecorderLineCountSync(recorderPath) {
|
|
105
|
+
try {
|
|
106
|
+
return fs
|
|
107
|
+
.readFileSync(recorderPath, "utf8")
|
|
108
|
+
.split(/\r?\n/u)
|
|
109
|
+
.filter((line) => line.trim().length > 0).length;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (isRecord(error) && error.code === "ENOENT") {
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function startWhatsAppBaileysRecorderBridge(params) {
|
|
119
|
+
const state = getRecorderBridgeState(params.recorderPath);
|
|
120
|
+
state.sockets.add(params.socket);
|
|
121
|
+
const sync = async () => {
|
|
122
|
+
if (state.syncPromise) {
|
|
123
|
+
await state.syncPromise;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
state.syncPromise = (async () => {
|
|
127
|
+
const lines = await readRecorderLines(params.recorderPath);
|
|
128
|
+
if (lines.length < state.cursor) {
|
|
129
|
+
state.cursor = 0;
|
|
130
|
+
}
|
|
131
|
+
for (let lineIndex = state.cursor; lineIndex < lines.length; lineIndex += 1) {
|
|
132
|
+
const event = parseRecorderLine(lines[lineIndex] ?? "");
|
|
133
|
+
const message = createInboundMessageFromRecorderEvent(event, lineIndex);
|
|
134
|
+
if (message) {
|
|
135
|
+
const payload = { messages: [message], type: "notify" };
|
|
136
|
+
for (const socket of state.sockets) {
|
|
137
|
+
socket.ev.emit("messages.upsert", payload);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
state.cursor = lines.length;
|
|
142
|
+
})();
|
|
143
|
+
try {
|
|
144
|
+
await state.syncPromise;
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
state.syncPromise = null;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
if (!state.interval) {
|
|
151
|
+
state.interval = setInterval(() => {
|
|
152
|
+
void sync().catch(() => undefined);
|
|
153
|
+
}, params.recorderPollMs ?? DEFAULT_RECORDER_POLL_MS);
|
|
154
|
+
state.interval.unref?.();
|
|
155
|
+
}
|
|
156
|
+
void sync().catch(() => undefined);
|
|
157
|
+
return () => {
|
|
158
|
+
state.sockets.delete(params.socket);
|
|
159
|
+
if (state.sockets.size === 0 && state.interval) {
|
|
160
|
+
clearInterval(state.interval);
|
|
161
|
+
state.interval = null;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export function createWhatsAppBaileysRuntimeMockSocket(config) {
|
|
166
|
+
const socket = createWhatsAppBaileysMockSocket(config);
|
|
167
|
+
const stopRecorderBridge = config.recorderPath
|
|
168
|
+
? startWhatsAppBaileysRecorderBridge({
|
|
169
|
+
recorderPath: config.recorderPath,
|
|
170
|
+
recorderPollMs: config.recorderPollMs,
|
|
171
|
+
socket,
|
|
172
|
+
})
|
|
173
|
+
: () => { };
|
|
174
|
+
const openTimer = config.emitConnectionOpen === false
|
|
175
|
+
? null
|
|
176
|
+
: setTimeout(() => {
|
|
177
|
+
socket.ev.emit("connection.update", { connection: "open" });
|
|
178
|
+
}, 0);
|
|
179
|
+
openTimer?.unref?.();
|
|
180
|
+
let closed = false;
|
|
181
|
+
return {
|
|
182
|
+
...socket,
|
|
183
|
+
end(error) {
|
|
184
|
+
if (closed) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
closed = true;
|
|
188
|
+
if (openTimer) {
|
|
189
|
+
clearTimeout(openTimer);
|
|
190
|
+
}
|
|
191
|
+
stopRecorderBridge();
|
|
192
|
+
socket.ev.emit("connection.update", {
|
|
193
|
+
connection: "close",
|
|
194
|
+
lastDisconnect: error ? { error } : undefined,
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
async groupFetchAllParticipating() {
|
|
198
|
+
return {};
|
|
199
|
+
},
|
|
200
|
+
async groupMetadata(jid) {
|
|
201
|
+
return {
|
|
202
|
+
id: jid,
|
|
203
|
+
participants: [],
|
|
204
|
+
subject: "Test Group",
|
|
205
|
+
};
|
|
206
|
+
},
|
|
207
|
+
async readMessages() {
|
|
208
|
+
return undefined;
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export function createWhatsAppBaileysRuntimeMockSocketFromEnv(env = process.env, options = {}) {
|
|
213
|
+
return createWhatsAppBaileysRuntimeMockSocket({
|
|
214
|
+
accessToken: readRequiredEnv(env, CRABLINE_WHATSAPP_ACCESS_TOKEN_ENV),
|
|
215
|
+
apiRoot: readRequiredEnv(env, CRABLINE_WHATSAPP_API_ROOT_ENV),
|
|
216
|
+
fetch: options.fetch,
|
|
217
|
+
recorderPath: readOptionalEnv(env, CRABLINE_WHATSAPP_RECORDER_PATH_ENV),
|
|
218
|
+
selfJid: readOptionalEnv(env, CRABLINE_WHATSAPP_SELF_JID_ENV) ?? options.selfJid,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
export async function createWhatsAppSocket(_printQr, _verbose, options = {}) {
|
|
222
|
+
return createWhatsAppBaileysRuntimeMockSocketFromEnv(process.env, options);
|
|
223
|
+
}
|
|
224
|
+
export default createWhatsAppSocket;
|
|
225
|
+
//# sourceMappingURL=whatsapp-socket-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-socket-factory.js","sourceRoot":"","sources":["../../../src/fake-servers/whatsapp-socket-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export type WhatsAppBaileysPresence = "available" | "composing" | "paused" | "unavailable";
|
|
2
|
+
export type WhatsAppBaileysMockSocket = {
|
|
3
|
+
ev: {
|
|
4
|
+
emit(event: string, payload: unknown): boolean;
|
|
5
|
+
off(event: string, handler: (payload: unknown) => void): void;
|
|
6
|
+
on(event: string, handler: (payload: unknown) => void): void;
|
|
7
|
+
};
|
|
8
|
+
sendMessage(jid: string, content: {
|
|
9
|
+
conversation?: string | undefined;
|
|
10
|
+
text?: string | undefined;
|
|
11
|
+
}, options?: Record<string, unknown>): Promise<WhatsAppBaileysMessage>;
|
|
12
|
+
sendPresenceUpdate(presence: WhatsAppBaileysPresence, jid?: string): Promise<void>;
|
|
13
|
+
user: {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export type WhatsAppBaileysMessage = ReturnType<typeof createWhatsAppMessage>;
|
|
19
|
+
export type WhatsAppBaileysMockConfig = {
|
|
20
|
+
accessToken: string;
|
|
21
|
+
apiRoot: string;
|
|
22
|
+
fetch?: typeof fetch | undefined;
|
|
23
|
+
registry?: WhatsAppBaileysMockRegistry | undefined;
|
|
24
|
+
selfJid?: string | undefined;
|
|
25
|
+
};
|
|
26
|
+
export type WhatsAppBaileysMockSocketOverrides = {
|
|
27
|
+
fetch?: typeof fetch | undefined;
|
|
28
|
+
selfJid?: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
export type WhatsAppFakeServerManifest = {
|
|
31
|
+
accessToken: string;
|
|
32
|
+
adminToken: string;
|
|
33
|
+
baseUrl: string;
|
|
34
|
+
endpoints: {
|
|
35
|
+
adminInboundUrl: string;
|
|
36
|
+
apiRoot: string;
|
|
37
|
+
messagesUrl: string;
|
|
38
|
+
presenceUrl: string;
|
|
39
|
+
};
|
|
40
|
+
env: {
|
|
41
|
+
CRABLINE_WHATSAPP_ADMIN_TOKEN: string;
|
|
42
|
+
CRABLINE_WHATSAPP_ACCESS_TOKEN: string;
|
|
43
|
+
CRABLINE_WHATSAPP_API_ROOT: string;
|
|
44
|
+
CRABLINE_WHATSAPP_RECORDER_PATH: string;
|
|
45
|
+
CRABLINE_WHATSAPP_SELF_JID: string;
|
|
46
|
+
};
|
|
47
|
+
provider: "whatsapp";
|
|
48
|
+
recorderPath: string;
|
|
49
|
+
selfJid: string;
|
|
50
|
+
version: 1;
|
|
51
|
+
};
|
|
52
|
+
export type StartedWhatsAppFakeServer = {
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
createBaileysMockSocket(config?: WhatsAppBaileysMockSocketOverrides | undefined): WhatsAppBaileysMockSocket;
|
|
55
|
+
manifest: WhatsAppFakeServerManifest;
|
|
56
|
+
};
|
|
57
|
+
export type StartWhatsAppFakeServerParams = {
|
|
58
|
+
accessToken?: string | undefined;
|
|
59
|
+
adminToken?: string | undefined;
|
|
60
|
+
baileysRegistry?: WhatsAppBaileysMockRegistry | undefined;
|
|
61
|
+
host?: string | undefined;
|
|
62
|
+
port?: number | undefined;
|
|
63
|
+
recorderPath?: string | undefined;
|
|
64
|
+
selfJid?: string | undefined;
|
|
65
|
+
};
|
|
66
|
+
declare function createWhatsAppMessage(params: {
|
|
67
|
+
fromMe: boolean;
|
|
68
|
+
id: string;
|
|
69
|
+
pushName?: string | undefined;
|
|
70
|
+
remoteJid: string;
|
|
71
|
+
senderJid?: string | undefined;
|
|
72
|
+
text: string;
|
|
73
|
+
}): {
|
|
74
|
+
key: {
|
|
75
|
+
fromMe: boolean;
|
|
76
|
+
id: string;
|
|
77
|
+
participant?: string;
|
|
78
|
+
remoteJid: string;
|
|
79
|
+
};
|
|
80
|
+
message: {
|
|
81
|
+
conversation: string;
|
|
82
|
+
};
|
|
83
|
+
messageTimestamp: number;
|
|
84
|
+
pushName: string;
|
|
85
|
+
};
|
|
86
|
+
export declare class WhatsAppBaileysMockRegistry {
|
|
87
|
+
#private;
|
|
88
|
+
clear(apiRoot: string): void;
|
|
89
|
+
createSocket(config: Omit<WhatsAppBaileysMockConfig, "registry">): WhatsAppBaileysMockSocket;
|
|
90
|
+
emitInbound(apiRoot: string, message: WhatsAppBaileysMessage): void;
|
|
91
|
+
private register;
|
|
92
|
+
}
|
|
93
|
+
export declare const DEFAULT_WHATSAPP_BAILEYS_MOCK_REGISTRY: WhatsAppBaileysMockRegistry;
|
|
94
|
+
export declare function createWhatsAppBaileysMockSocket(config: WhatsAppBaileysMockConfig): WhatsAppBaileysMockSocket;
|
|
95
|
+
export declare function startWhatsAppFakeServer(params?: StartWhatsAppFakeServerParams): Promise<StartedWhatsAppFakeServer>;
|
|
96
|
+
export {};
|