aboutsummaryrefslogtreecommitdiff
path: root/apps/browser-extension/entrypoints/background.ts
diff options
context:
space:
mode:
authorMaheshtheDev <[email protected]>2025-09-08 05:19:10 +0000
committerMaheshtheDev <[email protected]>2025-09-08 05:19:10 +0000
commit3e5ea2fd9ed210644ae29b013b579703e30986de (patch)
tree7de64cf7bddca72cf56e89ee4320005dad9f2ac5 /apps/browser-extension/entrypoints/background.ts
parentfix: billing page (#416) (diff)
downloadarchived-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.ts130
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
}
},
- );
-});
+ )
+})