diff options
| author | MaheshtheDev <[email protected]> | 2025-09-08 05:19:10 +0000 |
|---|---|---|
| committer | MaheshtheDev <[email protected]> | 2025-09-08 05:19:10 +0000 |
| commit | 3e5ea2fd9ed210644ae29b013b579703e30986de (patch) | |
| tree | 7de64cf7bddca72cf56e89ee4320005dad9f2ac5 /apps/browser-extension/entrypoints/background.ts | |
| parent | fix: billing page (#416) (diff) | |
| download | archived-supermemory-3e5ea2fd9ed210644ae29b013b579703e30986de.tar.xz archived-supermemory-3e5ea2fd9ed210644ae29b013b579703e30986de.zip | |
extension: updated telemetry and batch upload (#415)
Diffstat (limited to 'apps/browser-extension/entrypoints/background.ts')
| -rw-r--r-- | apps/browser-extension/entrypoints/background.ts | 130 |
1 files changed, 75 insertions, 55 deletions
diff --git a/apps/browser-extension/entrypoints/background.ts b/apps/browser-extension/entrypoints/background.ts index 1f4ae24e..05fef55d 100644 --- a/apps/browser-extension/entrypoints/background.ts +++ b/apps/browser-extension/entrypoints/background.ts @@ -1,47 +1,52 @@ -import { getDefaultProject, saveMemory, searchMemories } from "../utils/api"; +import { getDefaultProject, saveMemory, searchMemories } from "../utils/api" import { CONTAINER_TAGS, CONTEXT_MENU_IDS, MESSAGE_TYPES, -} from "../utils/constants"; -import { captureTwitterTokens } from "../utils/twitter-auth"; + POSTHOG_EVENT_KEY, +} from "../utils/constants" +import { trackEvent } from "../utils/posthog" +import { captureTwitterTokens } from "../utils/twitter-auth" import { type TwitterImportConfig, TwitterImporter, -} from "../utils/twitter-import"; +} from "../utils/twitter-import" import type { ExtensionMessage, MemoryData, MemoryPayload, -} from "../utils/types"; +} from "../utils/types" export default defineBackground(() => { - let twitterImporter: TwitterImporter | null = null; + let twitterImporter: TwitterImporter | null = null - browser.runtime.onInstalled.addListener((details) => { + browser.runtime.onInstalled.addListener(async (details) => { browser.contextMenus.create({ id: CONTEXT_MENU_IDS.SAVE_TO_SUPERMEMORY, title: "Save to supermemory", contexts: ["selection", "page", "link"], - }); + }) - // Open welcome tab on first install if (details.reason === "install") { + await trackEvent("extension_installed", { + reason: details.reason, + version: browser.runtime.getManifest().version, + }) browser.tabs.create({ url: browser.runtime.getURL("/welcome.html"), - }); + }) } - }); + }) // Intercept Twitter requests to capture authentication headers. browser.webRequest.onBeforeSendHeaders.addListener( (details) => { - captureTwitterTokens(details); - return {}; + captureTwitterTokens(details) + return {} }, { urls: ["*://x.com/*", "*://twitter.com/*"] }, ["requestHeaders", "extraHeaders"], - ); + ) // Handle context menu clicks. browser.contextMenus.onClicked.addListener(async (info, tab) => { @@ -50,27 +55,28 @@ export default defineBackground(() => { try { await browser.tabs.sendMessage(tab.id, { action: MESSAGE_TYPES.SAVE_MEMORY, - }); + actionSource: "context_menu", + }) } catch (error) { - console.error("Failed to send message to content script:", error); + console.error("Failed to send message to content script:", error) } } } - }); + }) // Send message to current active tab. const sendMessageToCurrentTab = async (message: string) => { const tabs = await browser.tabs.query({ active: true, currentWindow: true, - }); + }) if (tabs.length > 0 && tabs[0].id) { await browser.tabs.sendMessage(tabs[0].id, { type: MESSAGE_TYPES.IMPORT_UPDATE, importedMessage: message, - }); + }) } - }; + } /** * Send import completion message @@ -79,61 +85,71 @@ export default defineBackground(() => { const tabs = await browser.tabs.query({ active: true, currentWindow: true, - }); + }) if (tabs.length > 0 && tabs[0].id) { await browser.tabs.sendMessage(tabs[0].id, { type: MESSAGE_TYPES.IMPORT_DONE, totalImported, - }); + }) } - }; + } /** * Save memory to supermemory API */ const saveMemoryToSupermemory = async ( data: MemoryData, + actionSource: string, ): Promise<{ success: boolean; data?: unknown; error?: string }> => { try { - let containerTag: string = CONTAINER_TAGS.DEFAULT_PROJECT; + let containerTag: string = CONTAINER_TAGS.DEFAULT_PROJECT try { - const defaultProject = await getDefaultProject(); + const defaultProject = await getDefaultProject() if (defaultProject?.containerTag) { - containerTag = defaultProject.containerTag; + containerTag = defaultProject.containerTag } } catch (error) { - console.warn("Failed to get default project, using fallback:", error); + console.warn("Failed to get default project, using fallback:", error) } const payload: MemoryPayload = { containerTags: [containerTag], content: `${data.highlightedText}\n\n${data.html}\n\n${data?.url}`, metadata: { sm_source: "consumer" }, - }; + } + + const responseData = await saveMemory(payload) + + await trackEvent(POSTHOG_EVENT_KEY.SAVE_MEMORY_ATTEMPTED, { + source: `${POSTHOG_EVENT_KEY.SOURCE}_${actionSource}`, + has_highlight: !!data.highlightedText, + url_domain: data.url ? new URL(data.url).hostname : undefined, + }) - const responseData = await saveMemory(payload); - return { success: true, data: responseData }; + return { success: true, data: responseData } } catch (error) { return { success: false, error: error instanceof Error ? error.message : "Unknown error", - }; + } } - }; + } const getRelatedMemories = async ( data: string, + eventSource: string, ): Promise<{ success: boolean; data?: unknown; error?: string }> => { try { const responseData = await searchMemories(data) const response = responseData as { results?: Array<{ memory?: string }> } - let memories = ""; + let memories = "" response.results?.forEach((result, index) => { memories += `[${index + 1}] ${result.memory} ` - }) + }) console.log("Memories:", memories) + await trackEvent(eventSource) return { success: true, data: memories } } catch (error) { return { @@ -141,7 +157,7 @@ export default defineBackground(() => { error: error instanceof Error ? error.message : "Unknown error", } } - }; + } /** * Handle extension messages @@ -154,48 +170,52 @@ export default defineBackground(() => { onProgress: sendMessageToCurrentTab, onComplete: sendImportDoneMessage, onError: async (error: Error) => { - await sendMessageToCurrentTab(`Error: ${error.message}`); + await sendMessageToCurrentTab(`Error: ${error.message}`) }, - }; + } - twitterImporter = new TwitterImporter(importConfig); - twitterImporter.startImport().catch(console.error); - sendResponse({ success: true }); - return true; + twitterImporter = new TwitterImporter(importConfig) + twitterImporter.startImport().catch(console.error) + sendResponse({ success: true }) + return true } // Handle regular memory save request if (message.action === MESSAGE_TYPES.SAVE_MEMORY) { - (async () => { + ;(async () => { try { const result = await saveMemoryToSupermemory( message.data as MemoryData, - ); - sendResponse(result); + message.actionSource || "unknown", + ) + sendResponse(result) } catch (error) { sendResponse({ success: false, error: error instanceof Error ? error.message : "Unknown error", - }); + }) } - })(); - return true; + })() + return true } if (message.action === MESSAGE_TYPES.GET_RELATED_MEMORIES) { - (async () => { + ;(async () => { try { - const result = await getRelatedMemories(message.data as string); - sendResponse(result); + const result = await getRelatedMemories( + message.data as string, + message.actionSource || "unknown", + ) + sendResponse(result) } catch (error) { sendResponse({ success: false, error: error instanceof Error ? error.message : "Unknown error", - }); + }) } - })(); - return true; + })() + return true } }, - ); -}); + ) +}) |