@gamalan/pi-gateway 1.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/README.md +366 -0
- package/config/config.default.json +51 -0
- package/dist/adapters/base.d.ts +85 -0
- package/dist/adapters/base.js +34 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/discord.d.ts +53 -0
- package/dist/adapters/discord.js +224 -0
- package/dist/adapters/discord.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/slack.d.ts +49 -0
- package/dist/adapters/slack.js +231 -0
- package/dist/adapters/slack.js.map +1 -0
- package/dist/adapters/telegram.d.ts +64 -0
- package/dist/adapters/telegram.js +274 -0
- package/dist/adapters/telegram.js.map +1 -0
- package/dist/adapters/twitch.d.ts +75 -0
- package/dist/adapters/twitch.js +222 -0
- package/dist/adapters/twitch.js.map +1 -0
- package/dist/adapters/websocket.d.ts +30 -0
- package/dist/adapters/websocket.js +132 -0
- package/dist/adapters/websocket.js.map +1 -0
- package/dist/adapters/whatsapp.d.ts +49 -0
- package/dist/adapters/whatsapp.js +251 -0
- package/dist/adapters/whatsapp.js.map +1 -0
- package/dist/background/index.d.ts +1 -0
- package/dist/background/index.js +2 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/manager.d.ts +70 -0
- package/dist/background/manager.js +291 -0
- package/dist/background/manager.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +1275 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.js +39 -0
- package/dist/logger.js.map +1 -0
- package/dist/paths.d.ts +14 -0
- package/dist/paths.js +32 -0
- package/dist/paths.js.map +1 -0
- package/dist/security/auth.d.ts +91 -0
- package/dist/security/auth.js +316 -0
- package/dist/security/auth.js.map +1 -0
- package/dist/security/index.d.ts +1 -0
- package/dist/security/index.js +2 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/tool-policy.d.ts +66 -0
- package/dist/security/tool-policy.js +467 -0
- package/dist/security/tool-policy.js.map +1 -0
- package/dist/sessions/index.d.ts +1 -0
- package/dist/sessions/index.js +2 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/store.d.ts +64 -0
- package/dist/sessions/store.js +247 -0
- package/dist/sessions/store.js.map +1 -0
- package/package.json +57 -0
- package/src/adapters/base.ts +124 -0
- package/src/adapters/discord.ts +270 -0
- package/src/adapters/index.ts +13 -0
- package/src/adapters/slack.ts +313 -0
- package/src/adapters/telegram.ts +394 -0
- package/src/adapters/twitch.ts +316 -0
- package/src/adapters/websocket.ts +158 -0
- package/src/adapters/whatsapp.ts +296 -0
- package/src/background/index.ts +1 -0
- package/src/background/manager.ts +395 -0
- package/src/index.ts +1665 -0
- package/src/logger.ts +43 -0
- package/src/paths.ts +40 -0
- package/src/security/auth.ts +458 -0
- package/src/security/index.ts +1 -0
- package/src/security/tool-policy.ts +568 -0
- package/src/sessions/index.ts +1 -0
- package/src/sessions/store.ts +360 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Adapter - For web clients and other WebSocket-based platforms
|
|
3
|
+
*/
|
|
4
|
+
import { BaseAdapter } from "./base.js";
|
|
5
|
+
import { logger } from "../logger.js";
|
|
6
|
+
export class WebSocketAdapter extends BaseAdapter {
|
|
7
|
+
platform = "websocket";
|
|
8
|
+
config;
|
|
9
|
+
client = null;
|
|
10
|
+
reconnectAttempts = 0;
|
|
11
|
+
maxReconnectAttempts = 5;
|
|
12
|
+
reconnectDelay = 1000;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
super();
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
async initialize() {
|
|
18
|
+
logger.info(`[WebSocket] Adapter initialized for client ${this.config.clientId}`);
|
|
19
|
+
}
|
|
20
|
+
async start(callbacks) {
|
|
21
|
+
await super.start(callbacks);
|
|
22
|
+
// For server-side: this would be handled by the main gateway
|
|
23
|
+
// This adapter is more for client-side connections
|
|
24
|
+
}
|
|
25
|
+
async connect(url, token) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const headers = {};
|
|
28
|
+
if (token) {
|
|
29
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
30
|
+
}
|
|
31
|
+
this.client = new WebSocket(url, { headers });
|
|
32
|
+
this.client.onopen = () => {
|
|
33
|
+
logger.info(`[WebSocket] Connected to ${url}`);
|
|
34
|
+
this.reconnectAttempts = 0;
|
|
35
|
+
resolve();
|
|
36
|
+
};
|
|
37
|
+
this.client.onmessage = (event) => {
|
|
38
|
+
try {
|
|
39
|
+
const data = JSON.parse(event.data);
|
|
40
|
+
if (data.type === "message") {
|
|
41
|
+
const message = {
|
|
42
|
+
id: this.generateMessageId(),
|
|
43
|
+
platform: this.platform,
|
|
44
|
+
channelId: this.config.clientId,
|
|
45
|
+
userId: this.config.clientId,
|
|
46
|
+
content: data.content,
|
|
47
|
+
timestamp: Date.now(),
|
|
48
|
+
metadata: data.metadata,
|
|
49
|
+
};
|
|
50
|
+
this.emitMessage(message);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
logger.error("[WebSocket] Failed to parse message:", err);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
this.client.onclose = () => {
|
|
58
|
+
logger.info("[WebSocket] Connection closed");
|
|
59
|
+
this.callbacks?.onDisconnect?.();
|
|
60
|
+
this.attemptReconnect(url, token);
|
|
61
|
+
};
|
|
62
|
+
this.client.onerror = (err) => {
|
|
63
|
+
logger.error("[WebSocket] Error:", err);
|
|
64
|
+
reject(err);
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
attemptReconnect(url, token) {
|
|
69
|
+
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
70
|
+
this.reconnectAttempts++;
|
|
71
|
+
const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
72
|
+
logger.info(`[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);
|
|
73
|
+
setTimeout(() => this.connect(url, token), delay);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async sendMessage(channelId, content) {
|
|
77
|
+
if (!this.client || this.client.readyState !== WebSocket.OPEN) {
|
|
78
|
+
throw new Error("WebSocket not connected");
|
|
79
|
+
}
|
|
80
|
+
const id = this.generateMessageId();
|
|
81
|
+
this.client.send(JSON.stringify({
|
|
82
|
+
type: "message",
|
|
83
|
+
id,
|
|
84
|
+
content,
|
|
85
|
+
channelId,
|
|
86
|
+
}));
|
|
87
|
+
return id;
|
|
88
|
+
}
|
|
89
|
+
async editMessage(channelId, messageId, content) {
|
|
90
|
+
if (!this.client || this.client.readyState !== WebSocket.OPEN) {
|
|
91
|
+
throw new Error("WebSocket not connected");
|
|
92
|
+
}
|
|
93
|
+
this.client.send(JSON.stringify({
|
|
94
|
+
type: "edit",
|
|
95
|
+
id: messageId,
|
|
96
|
+
content,
|
|
97
|
+
channelId,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
async deleteMessage(channelId, messageId) {
|
|
101
|
+
if (!this.client || this.client.readyState !== WebSocket.OPEN) {
|
|
102
|
+
throw new Error("WebSocket not connected");
|
|
103
|
+
}
|
|
104
|
+
this.client.send(JSON.stringify({
|
|
105
|
+
type: "delete",
|
|
106
|
+
id: messageId,
|
|
107
|
+
channelId,
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
async setTyping(channelId, isTyping) {
|
|
111
|
+
if (!this.client || this.client.readyState !== WebSocket.OPEN)
|
|
112
|
+
return;
|
|
113
|
+
this.client.send(JSON.stringify({
|
|
114
|
+
type: "typing",
|
|
115
|
+
channelId,
|
|
116
|
+
isTyping,
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
async getStatus() {
|
|
120
|
+
return {
|
|
121
|
+
connected: this.client?.readyState === WebSocket.OPEN,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async stop() {
|
|
125
|
+
if (this.client) {
|
|
126
|
+
this.client.close();
|
|
127
|
+
this.client = null;
|
|
128
|
+
}
|
|
129
|
+
await super.stop();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/adapters/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WhatsApp Adapter - Hermes-style WhatsApp platform adapter
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - WhatsApp Web protocol via Baileys
|
|
6
|
+
* - QR code authentication
|
|
7
|
+
* - Contact and group management
|
|
8
|
+
* - Media messaging
|
|
9
|
+
*/
|
|
10
|
+
import { BaseAdapter, type PlatformConfig } from "./base.js";
|
|
11
|
+
export interface WhatsAppConfig extends PlatformConfig {
|
|
12
|
+
platform: "whatsapp";
|
|
13
|
+
sessionPath?: string;
|
|
14
|
+
printQr?: boolean;
|
|
15
|
+
maxMessageLength?: number;
|
|
16
|
+
}
|
|
17
|
+
interface WhatsAppContact {
|
|
18
|
+
id: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
isGroup: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class WhatsAppAdapter extends BaseAdapter {
|
|
23
|
+
readonly platform: "whatsapp";
|
|
24
|
+
config: WhatsAppConfig;
|
|
25
|
+
private sock;
|
|
26
|
+
private connected;
|
|
27
|
+
private qrCode;
|
|
28
|
+
constructor(config: WhatsAppConfig);
|
|
29
|
+
initialize(): Promise<void>;
|
|
30
|
+
private handleMessages;
|
|
31
|
+
start(callbacks: any): Promise<void>;
|
|
32
|
+
private sleep;
|
|
33
|
+
stop(): Promise<void>;
|
|
34
|
+
sendMessage(channelId: string, content: string): Promise<string>;
|
|
35
|
+
sendImage(channelId: string, imageUrl: string, caption?: string): Promise<string>;
|
|
36
|
+
sendReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
|
|
37
|
+
reply(channelId: string, content: string, messageId: string): Promise<string>;
|
|
38
|
+
editMessage(channelId: string, messageId: string, content: string): Promise<void>;
|
|
39
|
+
deleteMessage(channelId: string, messageId: string): Promise<void>;
|
|
40
|
+
setTyping(channelId: string, isTyping: boolean): Promise<void>;
|
|
41
|
+
getStatus(): Promise<{
|
|
42
|
+
connected: boolean;
|
|
43
|
+
latency?: number;
|
|
44
|
+
}>;
|
|
45
|
+
getContacts(): Promise<WhatsAppContact[]>;
|
|
46
|
+
getContact(jid: string): Promise<WhatsAppContact | null>;
|
|
47
|
+
getQrCode(): string | null;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WhatsApp Adapter - Hermes-style WhatsApp platform adapter
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - WhatsApp Web protocol via Baileys
|
|
6
|
+
* - QR code authentication
|
|
7
|
+
* - Contact and group management
|
|
8
|
+
* - Media messaging
|
|
9
|
+
*/
|
|
10
|
+
import { BaseAdapter } from "./base.js";
|
|
11
|
+
import { logger } from "../logger.js";
|
|
12
|
+
export class WhatsAppAdapter extends BaseAdapter {
|
|
13
|
+
platform = "whatsapp";
|
|
14
|
+
config;
|
|
15
|
+
sock = null;
|
|
16
|
+
connected = false;
|
|
17
|
+
qrCode = null;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
super();
|
|
20
|
+
this.config = {
|
|
21
|
+
enabled: true,
|
|
22
|
+
platform: "whatsapp",
|
|
23
|
+
sessionPath: "./whatsapp-session",
|
|
24
|
+
printQr: true,
|
|
25
|
+
maxMessageLength: 4096,
|
|
26
|
+
...config,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async initialize() {
|
|
30
|
+
try {
|
|
31
|
+
const baileys = await import("@whiskeysockets/baileys");
|
|
32
|
+
const { state, saveCreds } = await baileys.useMultiFileAuthState(this.config.sessionPath || "./whatsapp-session");
|
|
33
|
+
this.sock = baileys.makeWASocket({
|
|
34
|
+
auth: state,
|
|
35
|
+
printQRInTerminal: this.config.printQr,
|
|
36
|
+
defaultQueryTimeoutMs: 60 * 1000,
|
|
37
|
+
});
|
|
38
|
+
// Handle QR code
|
|
39
|
+
this.sock.ev.on("qr", (qr) => {
|
|
40
|
+
this.qrCode = qr;
|
|
41
|
+
logger.info("[WhatsApp] QR Code received - scan with WhatsApp app");
|
|
42
|
+
logger.info(qr);
|
|
43
|
+
});
|
|
44
|
+
// Handle connection update
|
|
45
|
+
this.sock.ev.on("connection.update", ({ qr, connection }) => {
|
|
46
|
+
if (qr) {
|
|
47
|
+
this.qrCode = qr;
|
|
48
|
+
}
|
|
49
|
+
if (connection === "open") {
|
|
50
|
+
this.connected = true;
|
|
51
|
+
this.qrCode = null;
|
|
52
|
+
logger.info("[WhatsApp] Connected!");
|
|
53
|
+
}
|
|
54
|
+
if (connection === "close") {
|
|
55
|
+
this.connected = false;
|
|
56
|
+
logger.info("[WhatsApp] Disconnected");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// Handle credentials update
|
|
60
|
+
this.sock.ev.on("creds.update", saveCreds);
|
|
61
|
+
// Handle messages
|
|
62
|
+
this.sock.ev.on("messages.upsert", ({ messages }) => {
|
|
63
|
+
this.handleMessages(messages);
|
|
64
|
+
});
|
|
65
|
+
logger.info("[WhatsApp] Initializing...");
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
logger.error("[WhatsApp] Failed to initialize:", err);
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
handleMessages(messages) {
|
|
73
|
+
for (const msg of messages) {
|
|
74
|
+
// Skip messages sent by us
|
|
75
|
+
if (msg.key.fromMe)
|
|
76
|
+
continue;
|
|
77
|
+
const jid = msg.key.remoteJid;
|
|
78
|
+
const isGroup = jid?.endsWith("@g.us");
|
|
79
|
+
// Get message content
|
|
80
|
+
const content = msg.message?.conversation ||
|
|
81
|
+
msg.message?.extendedTextMessage?.text ||
|
|
82
|
+
msg.message?.imageMessage?.caption ||
|
|
83
|
+
"";
|
|
84
|
+
if (!content)
|
|
85
|
+
continue;
|
|
86
|
+
const message = {
|
|
87
|
+
id: msg.key.id || this.generateMessageId(),
|
|
88
|
+
platform: "whatsapp",
|
|
89
|
+
channelId: jid,
|
|
90
|
+
userId: msg.key.participant || jid,
|
|
91
|
+
content,
|
|
92
|
+
timestamp: msg.messageTimestamp ? msg.messageTimestamp * 1000 : Date.now(),
|
|
93
|
+
metadata: {
|
|
94
|
+
isGroup,
|
|
95
|
+
messageType: msg.message ? Object.keys(msg.message)[0] : "unknown",
|
|
96
|
+
pushName: msg.pushName,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
this.emitMessage(message);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async start(callbacks) {
|
|
103
|
+
await super.start(callbacks);
|
|
104
|
+
// Wait for connection
|
|
105
|
+
let attempts = 0;
|
|
106
|
+
while (!this.connected && attempts < 30) {
|
|
107
|
+
await this.sleep(1000);
|
|
108
|
+
attempts++;
|
|
109
|
+
}
|
|
110
|
+
if (!this.connected) {
|
|
111
|
+
logger.warn("[WhatsApp] Not yet connected - waiting for QR scan");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
sleep(ms) {
|
|
115
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
116
|
+
}
|
|
117
|
+
async stop() {
|
|
118
|
+
if (this.sock) {
|
|
119
|
+
await this.sock.logout();
|
|
120
|
+
this.sock = null;
|
|
121
|
+
}
|
|
122
|
+
this.connected = false;
|
|
123
|
+
await super.stop();
|
|
124
|
+
}
|
|
125
|
+
async sendMessage(channelId, content) {
|
|
126
|
+
if (!this.sock || !this.connected) {
|
|
127
|
+
throw new Error("WhatsApp not connected");
|
|
128
|
+
}
|
|
129
|
+
// Truncate if too long
|
|
130
|
+
const text = content.length > (this.config.maxMessageLength || 4096)
|
|
131
|
+
? content.slice(0, this.config.maxMessageLength - 3) + "..."
|
|
132
|
+
: content;
|
|
133
|
+
try {
|
|
134
|
+
const result = await this.sock.sendMessage(channelId, { text });
|
|
135
|
+
return result?.key?.id || this.generateMessageId();
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logger.error("[WhatsApp] Send error:", err);
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async sendImage(channelId, imageUrl, caption) {
|
|
143
|
+
if (!this.sock || !this.connected) {
|
|
144
|
+
throw new Error("WhatsApp not connected");
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const result = await this.sock.sendMessage(channelId, {
|
|
148
|
+
image: { url: imageUrl },
|
|
149
|
+
caption,
|
|
150
|
+
});
|
|
151
|
+
return result?.key?.id || this.generateMessageId();
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
logger.error("[WhatsApp] Send image error:", err);
|
|
155
|
+
throw err;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async sendReaction(channelId, messageId, emoji) {
|
|
159
|
+
if (!this.sock || !this.connected) {
|
|
160
|
+
throw new Error("WhatsApp not connected");
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
await this.sock.sendMessage(channelId, {
|
|
164
|
+
react: { text: emoji, key: { remoteJid: channelId, id: messageId } },
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
logger.error("[WhatsApp] Reaction error:", err);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async reply(channelId, content, messageId) {
|
|
172
|
+
if (!this.sock || !this.connected) {
|
|
173
|
+
throw new Error("WhatsApp not connected");
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const result = await this.sock.sendMessage(channelId, {
|
|
177
|
+
text: content,
|
|
178
|
+
contextInfo: {
|
|
179
|
+
stanzaId: messageId,
|
|
180
|
+
remoteJid: channelId,
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
return result?.key?.id || this.generateMessageId();
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
logger.error("[WhatsApp] Reply error:", err);
|
|
187
|
+
throw err;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async editMessage(channelId, messageId, content) {
|
|
191
|
+
if (!this.sock || !this.connected) {
|
|
192
|
+
throw new Error("WhatsApp not connected");
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
await this.sock.relayMessage(channelId, {
|
|
196
|
+
protocolMessage: {
|
|
197
|
+
type: 6, // MESSAGE_EDIT
|
|
198
|
+
key: { remoteJid: channelId, id: messageId },
|
|
199
|
+
editedMessage: { conversation: [{ text: content }] },
|
|
200
|
+
},
|
|
201
|
+
}, {});
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
logger.error("[WhatsApp] Edit error:", err);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async deleteMessage(channelId, messageId) {
|
|
208
|
+
if (!this.sock || !this.connected) {
|
|
209
|
+
throw new Error("WhatsApp not connected");
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
await this.sock.sendMessage(channelId, {
|
|
213
|
+
delete: { remoteJid: channelId, id: messageId },
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
logger.error("[WhatsApp] Delete error:", err);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async setTyping(channelId, isTyping) {
|
|
221
|
+
if (!this.sock || !this.connected)
|
|
222
|
+
return;
|
|
223
|
+
try {
|
|
224
|
+
await this.sock.sendPresenceUpdate(isTyping ? "composing" : "available", channelId);
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
// Ignore presence errors
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async getStatus() {
|
|
231
|
+
return { connected: this.connected };
|
|
232
|
+
}
|
|
233
|
+
async getContacts() {
|
|
234
|
+
if (!this.sock?.store?.contacts) {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
return Object.entries(this.sock.store.contacts).map(([id, contact]) => ({
|
|
238
|
+
id,
|
|
239
|
+
name: contact?.name || contact?.notify || id.split("@")[0],
|
|
240
|
+
isGroup: id.endsWith("@g.us"),
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
async getContact(jid) {
|
|
244
|
+
const contacts = await this.getContacts();
|
|
245
|
+
return contacts.find(c => c.id === jid) || null;
|
|
246
|
+
}
|
|
247
|
+
getQrCode() {
|
|
248
|
+
return this.qrCode;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=whatsapp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../src/adapters/whatsapp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { initBackgroundTasks, startBackgroundTask, getPendingResultsForSession, markTaskDelivered, listTasks, cancelTask, type BackgroundTask, type BackgroundStatus } from "./manager.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAA8C,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Task Manager - Hermes-style background session handling
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Isolated sessions for background tasks
|
|
6
|
+
* - Result delivery to parent session
|
|
7
|
+
* - Progress notifications
|
|
8
|
+
* - Timeout handling
|
|
9
|
+
*/
|
|
10
|
+
import Database from "better-sqlite3";
|
|
11
|
+
export type BackgroundStatus = "running" | "completed" | "failed" | "timeout" | "delivered";
|
|
12
|
+
export interface BackgroundTask {
|
|
13
|
+
id: string;
|
|
14
|
+
sessionId: string;
|
|
15
|
+
parentSessionId: string;
|
|
16
|
+
command: string;
|
|
17
|
+
status: BackgroundStatus;
|
|
18
|
+
progress: number;
|
|
19
|
+
progressMessage?: string;
|
|
20
|
+
result?: unknown;
|
|
21
|
+
error?: string;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
startedAt?: number;
|
|
24
|
+
completedAt?: number;
|
|
25
|
+
deliveredAt?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize background tasks database
|
|
29
|
+
*/
|
|
30
|
+
export declare function initBackgroundTasks(): Database.Database;
|
|
31
|
+
/**
|
|
32
|
+
* Start a background task
|
|
33
|
+
*/
|
|
34
|
+
export declare function startBackgroundTask(parentSessionId: string, command: string, onProgress?: (task: BackgroundTask) => void): BackgroundTask;
|
|
35
|
+
/**
|
|
36
|
+
* Update task progress
|
|
37
|
+
*/
|
|
38
|
+
export declare function updateTaskProgress(taskId: string, progress: number, message?: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Complete a task successfully
|
|
41
|
+
*/
|
|
42
|
+
export declare function completeTask(taskId: string, result: unknown): void;
|
|
43
|
+
/**
|
|
44
|
+
* Fail a task
|
|
45
|
+
*/
|
|
46
|
+
export declare function failTask(taskId: string, error: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Mark task as delivered to user
|
|
49
|
+
*/
|
|
50
|
+
export declare function markTaskDelivered(taskId: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Get task by ID
|
|
53
|
+
*/
|
|
54
|
+
export declare function getTask(taskId: string): BackgroundTask | null;
|
|
55
|
+
/**
|
|
56
|
+
* Get pending results for parent session
|
|
57
|
+
*/
|
|
58
|
+
export declare function getPendingResultsForSession(parentSessionId: string): BackgroundTask[];
|
|
59
|
+
/**
|
|
60
|
+
* List all tasks
|
|
61
|
+
*/
|
|
62
|
+
export declare function listTasks(status?: BackgroundStatus): BackgroundTask[];
|
|
63
|
+
/**
|
|
64
|
+
* Cancel a running task
|
|
65
|
+
*/
|
|
66
|
+
export declare function cancelTask(taskId: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Clean up old tasks
|
|
69
|
+
*/
|
|
70
|
+
export declare function cleanupOldTasks(maxAgeMs?: number): number;
|