@melandlabs/integrations-gmail 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.
@@ -80,5 +80,3 @@ var GmailConversationStore = class {
80
80
  };
81
81
 
82
82
  export { GmailConversationStore };
83
- //# sourceMappingURL=conversation-store.js.map
84
- //# sourceMappingURL=conversation-store.js.map
package/dist/index.js CHANGED
@@ -80,5 +80,3 @@ var GmailConversationStore = class {
80
80
  };
81
81
 
82
82
  export { GmailConversationStore };
83
- //# sourceMappingURL=index.js.map
84
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@melandlabs/integrations-gmail",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "devDependencies": {
37
37
  "typescript": "^5.6.3",
38
- "@melandlabs/config": "0.1.4"
38
+ "@melandlabs/config": "0.2.0"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsup",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/conversation-store.ts"],"names":[],"mappings":"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","file":"conversation-store.js","sourcesContent":["/**\n * Gmail Self-Message Conversation Store\n *\n * File-backed per-day in-memory store for conversation history with AI.\n * Data persists to ~/.opencontext/memory/gmail/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 GmailConversationStore {\n\tprivate cache: Map<string, Map<string, ConversationMessage[]>> = new Map();\n\tprivate loadedPairs = new Set<string>();\n\tprivate readonly PREFIX = \"gmail\";\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(`[GmailConversationStore] 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(`[GmailConversationStore] 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(`[GmailConversationStore] Cleared all conversations for user ${userId}`);\n\t}\n\n\tprivate getUserKey(userId: string): string {\n\t\treturn `gmail:${userId}`;\n\t}\n}\n\nexport { GmailConversationStore };\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/conversation-store.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Gmail Self-Message Conversation Store\n *\n * File-backed per-day in-memory store for conversation history with AI.\n * Data persists to ~/.opencontext/memory/gmail/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 GmailConversationStore {\n\tprivate cache: Map<string, Map<string, ConversationMessage[]>> = new Map();\n\tprivate loadedPairs = new Set<string>();\n\tprivate readonly PREFIX = \"gmail\";\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(`[GmailConversationStore] 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(`[GmailConversationStore] 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(`[GmailConversationStore] Cleared all conversations for user ${userId}`);\n\t}\n\n\tprivate getUserKey(userId: string): string {\n\t\treturn `gmail:${userId}`;\n\t}\n}\n\nexport { GmailConversationStore };\n"]}