@melandlabs/integrations-whatsapp 0.1.5 → 0.2.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/dist/client-registry.js +0 -2
- package/dist/conversation-store.js +0 -2
- package/dist/index.js +0 -2
- package/dist/markdown.js +0 -2
- package/package.json +4 -4
- package/dist/client-registry.js.map +0 -1
- package/dist/conversation-store.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/markdown.js.map +0 -1
package/dist/client-registry.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -6325,5 +6325,3 @@ function markdownToWhatsApp(text) {
|
|
|
6325
6325
|
}
|
|
6326
6326
|
|
|
6327
6327
|
export { WhatsAppAdapter, WhatsAppClientRegistry, WhatsAppConversationStore, WhatsAppMessageHistoryStore, activeAdapters, markdownToWhatsApp };
|
|
6328
|
-
//# sourceMappingURL=index.js.map
|
|
6329
|
-
//# sourceMappingURL=index.js.map
|
package/dist/markdown.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@melandlabs/integrations-whatsapp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -35,13 +35,13 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@whiskeysockets/baileys": "^7.0.0-rc.9",
|
|
37
37
|
"@melandlabs/ai": "0.2.0",
|
|
38
|
-
"@melandlabs/integrations": "0.
|
|
39
|
-
"@melandlabs/integrations-channels": "0.
|
|
38
|
+
"@melandlabs/integrations": "0.2.0",
|
|
39
|
+
"@melandlabs/integrations-channels": "0.2.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"typescript": "^5.6.3",
|
|
43
43
|
"vitest": "^2.1.8",
|
|
44
|
-
"@melandlabs/config": "0.
|
|
44
|
+
"@melandlabs/config": "0.2.0"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
47
|
"build": "tsup",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/debug.ts","../src/client-registry.ts"],"names":[],"mappings":";AAAO,IAAM,cAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,cAAA,KAAmB,MAAA;;;ACc7D,IAAM,SAAA,GAAY,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAEvD,IAAM,yBAAN,MAAuD;AAAA,EAC9C,OAAA,uBAAqC,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjD,cAAA,CAAe,YAAoB,MAAA,EAAwB;AAC1D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,QAAA,IAAY,aAAa,MAAA,EAAQ;AACpC,MAAA,IAAI,cAAA,EAAgB;AACnB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACP,CAAA,mDAAA,EAAsD,UAAU,CAAA,mCAAA,EAAsC,MAAA,CAAO,MAAM,EAAE,CAAA,qBAAA,EAAwB,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA,kBAAA;AAAA,SAC/J;AAAA,MACD;AACA,MAAA;AAAA,IACD;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAAA,EAA0B;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AACnC,IAAA,IAAI,cAAA,EAAgB;AACnB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,CAAA,6CAAA,EAAgD,SAAS,CAAA,YAAA,EAAe,UAAU,CAAA,cAAA,EAAiB,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,OAC5H;AAAA,IACD;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,UAAA,EAA0C;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAgC;AAC/B,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,EAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACb,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,CAAS,WAAmB,IAAA,EAAsB;AACjD,IAAA,IAAA,CAAK,cAAA,CAAe,WAAW,IAAI,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,EAAyC;AAC5C,IAAA,OAAO,IAAA,CAAK,sBAAsB,SAAS,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,SAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EAChC;AACD","file":"client-registry.js","sourcesContent":["export const DEBUG_WHATSAPP = process.env.DEBUG_WHATSAPP === \"true\";\n","/**\n * WhatsApp Client Registry\n *\n * Global registry to track all active Baileys WASocket instances.\n * Used by the self-message listener to access connected sockets.\n *\n * Implements the ClientRegistry interface from @melandlabs/integrations/core\n */\n\nimport type { ClientRegistry } from \"@melandlabs/integrations/core\";\nimport type { WASocket } from \"@whiskeysockets/baileys\";\nimport { DEBUG_WHATSAPP } from \"./debug\";\n\n// Module instance ID to detect if the module is being re-imported\nconst MODULE_ID = Math.random().toString(36).slice(2, 8);\n\nclass WhatsAppClientRegistry implements ClientRegistry {\n\tprivate clients: Map<string, WASocket> = new Map();\n\n\t/**\n\t * Register a socket for a specific account. Idempotent — if a socket is already\n\t * registered for this accountId, skip the registration to avoid overwriting the\n\t * existing socket (which may be owned by the self-listener).\n\t */\n\tregisterClient(sessionKey: string, client: WASocket): void {\n\t\tconst existing = this.clients.get(sessionKey);\n\t\tif (existing && existing !== client) {\n\t\t\tif (DEBUG_WHATSAPP) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[WhatsAppClientRegistry] SKIP REGISTER: sessionKey=${sessionKey} already has socket (new sock.user=${client.user?.id}, existing sock.user=${existing.user?.id}), not overwriting`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis.clients.set(sessionKey, client);\n\t}\n\n\t/**\n\t * Unregister a socket\n\t */\n\tunregisterClient(sessionKey: string): void {\n\t\tif (!this.clients.has(sessionKey)) return;\n\t\tif (DEBUG_WHATSAPP) {\n\t\t\tconsole.log(\n\t\t\t\t`[WhatsAppClientRegistry] UNREGISTER instance=${MODULE_ID} sessionKey=${sessionKey} (before keys=${[...this.clients.keys()]})`,\n\t\t\t);\n\t\t}\n\t\tthis.clients.delete(sessionKey);\n\t}\n\n\t/**\n\t * Get a socket by account ID\n\t */\n\tgetClientBySessionKey(sessionKey: string): WASocket | undefined {\n\t\treturn this.clients.get(sessionKey);\n\t}\n\n\t/**\n\t * Get all registered sockets\n\t */\n\tgetAll(): Map<string, WASocket> {\n\t\treturn new Map(this.clients);\n\t}\n\n\t/**\n\t * Check if a socket is registered\n\t */\n\thas(sessionKey: string): boolean {\n\t\treturn this.clients.has(sessionKey);\n\t}\n\n\t/**\n\t * Clear all sockets\n\t */\n\tclear(): void {\n\t\tthis.clients.clear();\n\t}\n\n\t// ---- Backward-compatible aliases for web code ----\n\n\t/**\n\t * @deprecated Use registerClient instead\n\t */\n\tregister(accountId: string, sock: WASocket): void {\n\t\tthis.registerClient(accountId, sock);\n\t}\n\n\t/**\n\t * @deprecated Use getClientBySessionKey instead\n\t */\n\tget(accountId: string): WASocket | undefined {\n\t\treturn this.getClientBySessionKey(accountId);\n\t}\n\n\t/**\n\t * @deprecated Use unregisterClient instead\n\t */\n\tunregister(accountId: string): void {\n\t\tthis.unregisterClient(accountId);\n\t}\n}\n\nexport { WhatsAppClientRegistry };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/conversation-store.ts"],"names":[],"mappings":"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","file":"conversation-store.js","sourcesContent":["/**\n * WhatsApp Self-Message Conversation Store\n *\n * File-backed per-day in-memory store for conversation history with AI.\n * Data persists to ~/.opencontext/memory/whatsapp/YYYY-MM-DD.json\n *\n * Token trimming is handled by handleAgentRuntime (40K budget) — not here.\n */\n\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n\tclearAllChannelForUser,\n\tclearChannelConversationFromAllDays,\n\tloadChannelDay,\n\tsaveChannelMessage,\n} from \"@melandlabs/ai/store\";\n\nfunction getAppMemoryDir(userId?: string): string {\n\tconst base = join(homedir(), \".opencontext\", \"data\", \"memory\");\n\treturn userId ? join(base, userId) : base;\n}\n\ninterface ConversationMessage {\n\trole: \"user\" | \"assistant\";\n\tcontent: string;\n\ttimestamp: number;\n}\n\nclass WhatsAppConversationStore {\n\tprivate cache: Map<string, Map<string, ConversationMessage[]>> = new Map();\n\tprivate loadedPairs = new Set<string>();\n\tprivate readonly PREFIX = \"whatsapp\";\n\tprivate readonly memoryDir: string;\n\n\tconstructor(userId: string, memoryDir?: string) {\n\t\tthis.memoryDir = memoryDir ?? getAppMemoryDir(userId);\n\t}\n\n\tprivate pairKey(userKey: string, accountId: string): string {\n\t\treturn `${userKey}::${accountId}`;\n\t}\n\n\tprivate ensureLoaded(userKey: string, accountId: string): void {\n\t\tconst pk = this.pairKey(userKey, accountId);\n\t\tif (this.loadedPairs.has(pk)) return;\n\n\t\tif (!this.cache.has(userKey)) {\n\t\t\tthis.cache.set(userKey, new Map());\n\t\t}\n\n\t\tconst today = new Date().toISOString().slice(0, 10);\n\t\tconst msgs = loadChannelDay(\n\t\t\tthis.memoryDir,\n\t\t\tthis.PREFIX,\n\t\t\ttoday,\n\t\t\tuserKey,\n\t\t\taccountId,\n\t\t) as ConversationMessage[];\n\t\tthis.cache.get(userKey)?.set(accountId, msgs);\n\t\tthis.loadedPairs.add(pk);\n\t}\n\n\tgetConversationHistory(\n\t\tuserId: string,\n\t\taccountId: string,\n\t): Array<{ role: \"user\" | \"assistant\"; content: string }> {\n\t\tconst userKey = this.getUserKey(userId);\n\t\tthis.ensureLoaded(userKey, accountId);\n\t\treturn (this.cache.get(userKey)?.get(accountId) ?? []).map((msg) => ({\n\t\t\trole: msg.role,\n\t\t\tcontent: msg.content,\n\t\t}));\n\t}\n\n\taddMessage(userId: string, accountId: string, role: \"user\" | \"assistant\", content: string): void {\n\t\tconst userKey = this.getUserKey(userId);\n\t\tthis.ensureLoaded(userKey, accountId);\n\n\t\tconst message: ConversationMessage = {\n\t\t\trole,\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tthis.cache.get(userKey)?.get(accountId)?.push(message);\n\t\tsaveChannelMessage(this.memoryDir, this.PREFIX, userKey, accountId, message);\n\n\t\tconsole.log(`[WhatsAppConversationStore] Added ${role} message for user ${userId}, account ${accountId}`);\n\t}\n\n\tclearConversation(userId: string, accountId: string): void {\n\t\tconst userKey = this.getUserKey(userId);\n\t\tconst pk = this.pairKey(userKey, accountId);\n\n\t\tthis.cache.get(userKey)?.get(accountId)?.splice(0);\n\t\tthis.loadedPairs.delete(pk);\n\t\tclearChannelConversationFromAllDays(this.memoryDir, this.PREFIX, userKey, accountId);\n\n\t\tconsole.log(`[WhatsAppConversationStore] Cleared conversation for user ${userId}, account ${accountId}`);\n\t}\n\n\tclearAllConversations(userId: string): void {\n\t\tconst userKey = this.getUserKey(userId);\n\n\t\tfor (const pk of [...this.loadedPairs]) {\n\t\t\tif (pk.startsWith(`${userKey}::`)) {\n\t\t\t\tthis.loadedPairs.delete(pk);\n\t\t\t}\n\t\t}\n\t\tthis.cache.delete(userKey);\n\t\tclearAllChannelForUser(this.memoryDir, this.PREFIX, userKey);\n\n\t\tconsole.log(`[WhatsAppConversationStore] Cleared all conversations for user ${userId}`);\n\t}\n\n\tprivate getUserKey(userId: string): string {\n\t\treturn `whatsapp:${userId}`;\n\t}\n}\n\nexport { WhatsAppConversationStore };\n"]}
|