@mono-agent/whatsapp-adapter 0.1.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/README.md +53 -0
- package/dist/adapter.d.ts +127 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +300 -0
- package/dist/adapter.js.map +1 -0
- package/dist/baileys-socket.d.ts +16 -0
- package/dist/baileys-socket.d.ts.map +1 -0
- package/dist/baileys-socket.js +22 -0
- package/dist/baileys-socket.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +117 -0
- package/dist/config.js.map +1 -0
- package/dist/event-runner.d.ts +52 -0
- package/dist/event-runner.d.ts.map +1 -0
- package/dist/event-runner.js +174 -0
- package/dist/event-runner.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/message-normalizer.d.ts +14 -0
- package/dist/message-normalizer.d.ts.map +1 -0
- package/dist/message-normalizer.js +145 -0
- package/dist/message-normalizer.js.map +1 -0
- package/dist/message-stream.d.ts +37 -0
- package/dist/message-stream.d.ts.map +1 -0
- package/dist/message-stream.js +83 -0
- package/dist/message-stream.js.map +1 -0
- package/dist/start.d.ts +57 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +95 -0
- package/dist/start.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { DEFAULT_EMPTY_FINAL_TEXT, DEFAULT_MAX_MESSAGE_CHARS, normalizeTrailing, splitTextByCodePoints, } from "@mono-agent/agent-contracts";
|
|
2
|
+
const DEFAULT_INITIAL_STATUS_TEXT = "Thinking…";
|
|
3
|
+
export class WhatsAppMessageStream {
|
|
4
|
+
socket;
|
|
5
|
+
chatJid;
|
|
6
|
+
initialStatusText;
|
|
7
|
+
sendInitialStatus;
|
|
8
|
+
maxMessageChars;
|
|
9
|
+
quotedMessage;
|
|
10
|
+
logger;
|
|
11
|
+
currentText = "";
|
|
12
|
+
statusSent = false;
|
|
13
|
+
finished = false;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.socket = options.socket;
|
|
16
|
+
this.chatJid = options.chatJid;
|
|
17
|
+
this.initialStatusText = normalizeWhatsAppText(options.initialStatusText ?? DEFAULT_INITIAL_STATUS_TEXT);
|
|
18
|
+
this.sendInitialStatus = options.sendInitialStatus !== false;
|
|
19
|
+
this.maxMessageChars = options.maxMessageChars ?? DEFAULT_MAX_MESSAGE_CHARS;
|
|
20
|
+
this.quotedMessage = options.quotedMessage;
|
|
21
|
+
this.logger = options.logger;
|
|
22
|
+
if (!Number.isInteger(this.maxMessageChars) || this.maxMessageChars < 32) {
|
|
23
|
+
throw new RangeError("maxMessageChars must be an integer of at least 32.");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async status(text) {
|
|
27
|
+
this.assertOpen();
|
|
28
|
+
if (!this.sendInitialStatus || this.statusSent) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const statusText = normalizeWhatsAppText(text.length > 0 ? text : this.initialStatusText);
|
|
32
|
+
await this.sendText(statusText);
|
|
33
|
+
this.statusSent = true;
|
|
34
|
+
}
|
|
35
|
+
async append(delta) {
|
|
36
|
+
this.assertOpen();
|
|
37
|
+
if (delta.length === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.currentText += delta;
|
|
41
|
+
}
|
|
42
|
+
async replace(text) {
|
|
43
|
+
this.assertOpen();
|
|
44
|
+
this.currentText = text;
|
|
45
|
+
}
|
|
46
|
+
async finish(finalText) {
|
|
47
|
+
if (this.finished) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.finished = true;
|
|
51
|
+
if (finalText !== undefined) {
|
|
52
|
+
this.currentText = finalText;
|
|
53
|
+
}
|
|
54
|
+
const chunks = splitWhatsAppText(this.currentText, this.maxMessageChars);
|
|
55
|
+
for (const chunk of chunks) {
|
|
56
|
+
await this.sendText(chunk);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async sendText(text) {
|
|
60
|
+
const options = this.quotedMessage !== undefined ? { quoted: this.quotedMessage } : undefined;
|
|
61
|
+
try {
|
|
62
|
+
await this.socket.sendMessage(this.chatJid, { text }, options);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
this.logger?.error?.("WhatsApp stream send failed.", {
|
|
66
|
+
error: error instanceof Error ? error.message : String(error),
|
|
67
|
+
});
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
assertOpen() {
|
|
72
|
+
if (this.finished) {
|
|
73
|
+
throw new Error("Cannot write to a finished WhatsAppMessageStream.");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function splitWhatsAppText(text, maxChars) {
|
|
78
|
+
return splitTextByCodePoints(normalizeTrailing(text, DEFAULT_EMPTY_FINAL_TEXT), maxChars);
|
|
79
|
+
}
|
|
80
|
+
function normalizeWhatsAppText(text) {
|
|
81
|
+
return normalizeTrailing(text, DEFAULT_EMPTY_FINAL_TEXT);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=message-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-stream.js","sourceRoot":"","sources":["../src/message-stream.ts"],"names":[],"mappings":"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"}
|
package/dist/start.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { WhatsAppAdapter, type AgentResponder, type WhatsAppAdapterLogger, type WhatsAppAdapterMessages, type WhatsAppAdapterStreamOptions, type WhatsAppMessageHandlingResult, type WhatsAppTriggerOptions } from "./adapter.js";
|
|
2
|
+
import { type BaileysWhatsAppSocket, type BaileysWhatsAppSocketOptions } from "./baileys-socket.js";
|
|
3
|
+
import type { WhatsAppAdapterConfig } from "./config.js";
|
|
4
|
+
import { WhatsAppEventRunner, type WhatsAppConnectionUpdate, type WhatsAppEventRunnerLogger } from "./event-runner.js";
|
|
5
|
+
/**
|
|
6
|
+
* Factory seam used to construct the WhatsApp socket. Defaults to the real
|
|
7
|
+
* Baileys factory, but tests inject a fake to exercise the start path without a
|
|
8
|
+
* live WhatsApp connection.
|
|
9
|
+
*/
|
|
10
|
+
export type WhatsAppSocketFactory = (options: BaileysWhatsAppSocketOptions) => Promise<BaileysWhatsAppSocket>;
|
|
11
|
+
export interface WhatsAppAdapterStartLogger extends WhatsAppAdapterLogger, WhatsAppEventRunnerLogger {
|
|
12
|
+
}
|
|
13
|
+
export interface StartWhatsAppAdapterOptions {
|
|
14
|
+
/** Directory the Baileys multi-file auth state is read from / written to. */
|
|
15
|
+
readonly authDir: string;
|
|
16
|
+
/** Resolved adapter config (allowlist + group trigger settings). */
|
|
17
|
+
readonly config: WhatsAppAdapterConfig;
|
|
18
|
+
/** Agent responder invoked for each authorized inbound message. */
|
|
19
|
+
readonly responder: AgentResponder;
|
|
20
|
+
readonly logger?: WhatsAppAdapterStartLogger;
|
|
21
|
+
/** Optional terminal message overrides (welcome/help/error/etc.). */
|
|
22
|
+
readonly messages?: WhatsAppAdapterMessages;
|
|
23
|
+
/** Optional streaming/status-message behavior overrides. */
|
|
24
|
+
readonly stream?: WhatsAppAdapterStreamOptions;
|
|
25
|
+
/** Override or extend the trigger options resolved from config. */
|
|
26
|
+
readonly trigger?: WhatsAppTriggerOptions;
|
|
27
|
+
/** Process Baileys history-sync upserts in addition to live notifications. */
|
|
28
|
+
readonly processHistory?: boolean;
|
|
29
|
+
/** Surface scannable login QR codes. */
|
|
30
|
+
readonly onQr?: (qr: string) => void | Promise<void>;
|
|
31
|
+
/** Observe Baileys connection lifecycle updates. */
|
|
32
|
+
readonly onConnectionUpdate?: (update: WhatsAppConnectionUpdate) => void | Promise<void>;
|
|
33
|
+
/** Observe each adapter message-handling result. */
|
|
34
|
+
readonly onMessageResult?: (result: WhatsAppMessageHandlingResult) => void | Promise<void>;
|
|
35
|
+
/** Socket construction options forwarded to the factory. */
|
|
36
|
+
readonly socketOptions?: Omit<BaileysWhatsAppSocketOptions, "authDir">;
|
|
37
|
+
/** Injectable socket factory seam (defaults to the Baileys factory). */
|
|
38
|
+
readonly createSocket?: WhatsAppSocketFactory;
|
|
39
|
+
}
|
|
40
|
+
export interface WhatsAppAdapterStartResult {
|
|
41
|
+
readonly adapter: WhatsAppAdapter;
|
|
42
|
+
readonly runner: WhatsAppEventRunner;
|
|
43
|
+
readonly socket: BaileysWhatsAppSocket;
|
|
44
|
+
stop(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Composition-root entrypoint: constructs the Baileys socket, the
|
|
48
|
+
* WhatsAppAdapter, and the WhatsAppEventRunner, wires credential persistence,
|
|
49
|
+
* and starts listening. Returns a handle whose `stop()` tears everything down
|
|
50
|
+
* cleanly.
|
|
51
|
+
*
|
|
52
|
+
* Fail-closed: rejects before opening a connection when the responder is
|
|
53
|
+
* missing. The adapter constructor itself rejects a config that neither
|
|
54
|
+
* allowlists chats nor opts into `allowAllChats`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function startWhatsAppAdapter(options: StartWhatsAppAdapterOptions): Promise<WhatsAppAdapterStartResult>;
|
|
57
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EAClC,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC/B,MAAM,mBAAmB,CAAC;AAE3B;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,4BAA4B,KAClC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,MAAM,WAAW,0BACf,SAAQ,qBAAqB,EAC3B,yBAAyB;CAAG;AAEhC,MAAM,WAAW,2BAA2B;IAC1C,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,0BAA0B,CAAC;IAC7C,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAC5C,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,4BAA4B,CAAC;IAC/C,mEAAmE;IACnE,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IAC1C,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,oDAAoD;IACpD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,MAAM,EAAE,wBAAwB,KAC7B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,eAAe,CAAC,EAAE,CACzB,MAAM,EAAE,6BAA6B,KAClC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;IACvE,wEAAwE;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC;CAC/C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAoDrC"}
|
package/dist/start.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { WhatsAppAdapter, } from "./adapter.js";
|
|
2
|
+
import { createBaileysWhatsAppSocket, } from "./baileys-socket.js";
|
|
3
|
+
import { WhatsAppAdapterConfigError } from "./config.js";
|
|
4
|
+
import { WhatsAppEventRunner, } from "./event-runner.js";
|
|
5
|
+
/**
|
|
6
|
+
* Composition-root entrypoint: constructs the Baileys socket, the
|
|
7
|
+
* WhatsAppAdapter, and the WhatsAppEventRunner, wires credential persistence,
|
|
8
|
+
* and starts listening. Returns a handle whose `stop()` tears everything down
|
|
9
|
+
* cleanly.
|
|
10
|
+
*
|
|
11
|
+
* Fail-closed: rejects before opening a connection when the responder is
|
|
12
|
+
* missing. The adapter constructor itself rejects a config that neither
|
|
13
|
+
* allowlists chats nor opts into `allowAllChats`.
|
|
14
|
+
*/
|
|
15
|
+
export async function startWhatsAppAdapter(options) {
|
|
16
|
+
validateOptions(options);
|
|
17
|
+
const createSocket = options.createSocket ?? createBaileysWhatsAppSocket;
|
|
18
|
+
const socket = await createSocket({
|
|
19
|
+
...options.socketOptions,
|
|
20
|
+
authDir: options.authDir,
|
|
21
|
+
});
|
|
22
|
+
const adapter = new WhatsAppAdapter({
|
|
23
|
+
socket: socket.socket,
|
|
24
|
+
responder: options.responder,
|
|
25
|
+
allowedChatJids: [...options.config.allowedChatJids],
|
|
26
|
+
allowAllChats: options.config.allowAllChats,
|
|
27
|
+
trigger: options.trigger ?? resolveTriggerOptions(options.config),
|
|
28
|
+
...(options.stream !== undefined ? { stream: options.stream } : {}),
|
|
29
|
+
...(options.messages !== undefined ? { messages: options.messages } : {}),
|
|
30
|
+
...(options.logger !== undefined ? { logger: options.logger } : {}),
|
|
31
|
+
});
|
|
32
|
+
const runner = new WhatsAppEventRunner({
|
|
33
|
+
socket: socket.socket,
|
|
34
|
+
adapter,
|
|
35
|
+
processHistory: options.processHistory === true,
|
|
36
|
+
saveCreds: socket.saveCreds,
|
|
37
|
+
...(options.onQr !== undefined ? { onQr: options.onQr } : {}),
|
|
38
|
+
...(options.onConnectionUpdate !== undefined
|
|
39
|
+
? { onConnectionUpdate: options.onConnectionUpdate }
|
|
40
|
+
: {}),
|
|
41
|
+
...(options.onMessageResult !== undefined
|
|
42
|
+
? { onMessageResult: options.onMessageResult }
|
|
43
|
+
: {}),
|
|
44
|
+
...(options.logger !== undefined ? { logger: options.logger } : {}),
|
|
45
|
+
});
|
|
46
|
+
runner.start();
|
|
47
|
+
let stopped = false;
|
|
48
|
+
return {
|
|
49
|
+
adapter,
|
|
50
|
+
runner,
|
|
51
|
+
socket,
|
|
52
|
+
async stop() {
|
|
53
|
+
if (stopped) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
stopped = true;
|
|
57
|
+
runner.stop();
|
|
58
|
+
await runner.idle();
|
|
59
|
+
await closeSocket(socket, options.logger);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function resolveTriggerOptions(config) {
|
|
64
|
+
return {
|
|
65
|
+
groupMode: config.trigger.groupMode,
|
|
66
|
+
botJids: [...config.trigger.botJids],
|
|
67
|
+
mentionTextAliases: [...config.trigger.mentionTextAliases],
|
|
68
|
+
stripMentionText: config.trigger.stripMentionText,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async function closeSocket(socket, logger) {
|
|
72
|
+
const end = socket.baileysSocket?.end;
|
|
73
|
+
if (typeof end !== "function") {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
// `end(undefined)` closes the WebSocket without logging out, preserving the
|
|
78
|
+
// persisted auth state for the next start. `logout()` would wipe creds.
|
|
79
|
+
await end.call(socket.baileysSocket, undefined);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger?.error?.("WhatsApp socket failed to close cleanly.", {
|
|
83
|
+
error: error instanceof Error ? error.message : String(error),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function validateOptions(options) {
|
|
88
|
+
if (typeof options.responder?.respond !== "function") {
|
|
89
|
+
throw new WhatsAppAdapterConfigError("missing_required_config", "startWhatsAppAdapter requires a responder.");
|
|
90
|
+
}
|
|
91
|
+
if (typeof options.authDir !== "string" || options.authDir.trim().length === 0) {
|
|
92
|
+
throw new WhatsAppAdapterConfigError("missing_required_config", "startWhatsAppAdapter requires a non-empty authDir.", { env: "authDir" });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAOhB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,GAG5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EACL,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAsD3B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAoC;IAEpC,eAAe,CAAC,OAAO,CAAC,CAAC;IAEzB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,2BAA2B,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,GAAG,OAAO,CAAC,aAAa;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,eAAe,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;QACpD,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa;QAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;QACP,cAAc,EAAE,OAAO,CAAC,cAAc,KAAK,IAAI;QAC/C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,kBAAkB,KAAK,SAAS;YAC1C,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;YACvC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE;YAC9C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO;QACL,OAAO;QACP,MAAM;QACN,MAAM;QACN,KAAK,CAAC,IAAI;YACR,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA6B;IAC1D,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;QACnC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QACpC,kBAAkB,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC1D,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB;KAClD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAA6B,EAC7B,MAA8C;IAE9C,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC;IACtC,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,CAAC,0CAA0C,EAAE;YAC1D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAoC;IAC3D,IAAI,OAAO,OAAO,CAAC,SAAS,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;QACrD,MAAM,IAAI,0BAA0B,CAClC,yBAAyB,EACzB,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,0BAA0B,CAClC,yBAAyB,EACzB,oDAAoD,EACpD,EAAE,GAAG,EAAE,SAAS,EAAE,CACnB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type WhatsAppJid = string;
|
|
2
|
+
export type WhatsAppChatKind = "direct" | "group";
|
|
3
|
+
export interface WhatsAppMessageKeyLike {
|
|
4
|
+
id?: string | null;
|
|
5
|
+
remoteJid?: string | null;
|
|
6
|
+
participant?: string | null;
|
|
7
|
+
fromMe?: boolean | null;
|
|
8
|
+
remoteJidAlt?: string | null;
|
|
9
|
+
participantAlt?: string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface WhatsAppContextInfoLike {
|
|
12
|
+
mentionedJid?: string[] | null;
|
|
13
|
+
participant?: string | null;
|
|
14
|
+
remoteJid?: string | null;
|
|
15
|
+
stanzaId?: string | null;
|
|
16
|
+
}
|
|
17
|
+
export interface WhatsAppMessageContentLike {
|
|
18
|
+
conversation?: string | null;
|
|
19
|
+
extendedTextMessage?: {
|
|
20
|
+
text?: string | null;
|
|
21
|
+
contextInfo?: WhatsAppContextInfoLike | null;
|
|
22
|
+
} | null;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
}
|
|
25
|
+
export interface WhatsAppRawMessage {
|
|
26
|
+
key?: WhatsAppMessageKeyLike | null;
|
|
27
|
+
message?: WhatsAppMessageContentLike | null;
|
|
28
|
+
messageTimestamp?: number | string | LongLike | null;
|
|
29
|
+
pushName?: string | null;
|
|
30
|
+
participant?: string | null;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
export interface LongLike {
|
|
34
|
+
toNumber?: () => number;
|
|
35
|
+
toString?: () => string;
|
|
36
|
+
}
|
|
37
|
+
export interface WhatsAppTextMessage {
|
|
38
|
+
remoteJid: WhatsAppJid;
|
|
39
|
+
chatJid: WhatsAppJid;
|
|
40
|
+
chatKind: WhatsAppChatKind;
|
|
41
|
+
senderJid?: WhatsAppJid;
|
|
42
|
+
participantJid?: WhatsAppJid;
|
|
43
|
+
messageId?: string;
|
|
44
|
+
timestamp?: number;
|
|
45
|
+
pushName?: string;
|
|
46
|
+
text: string;
|
|
47
|
+
mentionedJids: WhatsAppJid[];
|
|
48
|
+
raw: WhatsAppRawMessage;
|
|
49
|
+
}
|
|
50
|
+
export interface WhatsAppSentMessage {
|
|
51
|
+
key?: WhatsAppMessageKeyLike | null;
|
|
52
|
+
message?: WhatsAppMessageContentLike | null;
|
|
53
|
+
[key: string]: unknown;
|
|
54
|
+
}
|
|
55
|
+
export interface WhatsAppSendMessageContent {
|
|
56
|
+
text: string;
|
|
57
|
+
mentions?: WhatsAppJid[];
|
|
58
|
+
}
|
|
59
|
+
export interface WhatsAppSendMessageOptions {
|
|
60
|
+
quoted?: WhatsAppRawMessage;
|
|
61
|
+
}
|
|
62
|
+
export interface WhatsAppSocketLike {
|
|
63
|
+
sendMessage(jid: WhatsAppJid, content: WhatsAppSendMessageContent, options?: WhatsAppSendMessageOptions): Promise<WhatsAppSentMessage | undefined>;
|
|
64
|
+
ev?: WhatsAppEventEmitterLike;
|
|
65
|
+
}
|
|
66
|
+
export interface WhatsAppEventEmitterLike {
|
|
67
|
+
on(event: string, listener: (payload: unknown) => void): void;
|
|
68
|
+
off?(event: string, listener: (payload: unknown) => void): void;
|
|
69
|
+
removeListener?(event: string, listener: (payload: unknown) => void): void;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mono-agent/whatsapp-adapter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "WhatsApp communication adapter for host-compatible runtimes using Baileys.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"private": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@mono-agent/agent-contracts": "0.1.0",
|
|
22
|
+
"@mono-agent/settings": "0.1.0",
|
|
23
|
+
"@whiskeysockets/baileys": "^7.0.0-rc11"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -p tsconfig.build.json",
|
|
30
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
31
|
+
"test": "vitest run --passWithNoTests"
|
|
32
|
+
}
|
|
33
|
+
}
|