mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-09-07 08:26:15 +00:00
### TL;DR Added proper semicolons throughout the codebase, improved Twitter import functionality, enhanced memory search results display, and added various icon sizes for the browser extension. ### What changed? - Added semicolons at the end of statements throughout the browser extension codebase for consistent code style - Fixed the Twitter import button to only appear on the bookmarks page - Updated the saveMemoriesToSupermemory function to use the correct action type - Enhanced the memory search functionality to include related memories in search results - Added an expandable UI component in the chat interface to display memory search results with details - Updated the welcome page text to better describe supermemory's capabilities - Added multiple icon sizes (48x48 to 512x512) for better browser extension display across platforms - Updated the sign-in button text from "login in" to "Sign in or create account" - Added turbo flag to the Next.js dev script for faster development ### How to test? 1. Test the Twitter import functionality by visiting the Twitter bookmarks page 2. Verify that the memory search functionality works correctly in chat interfaces 3. Check that the expandable memory results UI displays properly with memory details 4. Confirm that the browser extension icons display correctly at different sizes 5. Verify the sign-in flow with the updated button text ### Why make this change? This change improves code consistency by standardizing semicolon usage throughout the codebase. It enhances the user experience by making the Twitter import feature more targeted and fixing the memory saving functionality. The expandable memory results UI provides users with more detailed information about their memories, making the search functionality more useful. The additional icon sizes ensure the extension displays properly across different platforms and contexts. Overall, these changes improve both the developer experience through consistent code style and the user experience through enhanced functionality and clearer UI elements.
156 lines
3.5 KiB
TypeScript
156 lines
3.5 KiB
TypeScript
/**
|
|
* API service for supermemory browser extension
|
|
*/
|
|
import { API_ENDPOINTS, STORAGE_KEYS } from "./constants";
|
|
import {
|
|
AuthenticationError,
|
|
type MemoryPayload,
|
|
type Project,
|
|
type ProjectsResponse,
|
|
SupermemoryAPIError,
|
|
} from "./types";
|
|
|
|
/**
|
|
* Get bearer token from storage
|
|
*/
|
|
async function getBearerToken(): Promise<string> {
|
|
const result = await chrome.storage.local.get([STORAGE_KEYS.BEARER_TOKEN]);
|
|
const token = result[STORAGE_KEYS.BEARER_TOKEN];
|
|
|
|
if (!token) {
|
|
throw new AuthenticationError("Bearer token not found");
|
|
}
|
|
|
|
return token;
|
|
}
|
|
|
|
/**
|
|
* Make authenticated API request
|
|
*/
|
|
async function makeAuthenticatedRequest<T>(
|
|
endpoint: string,
|
|
options: RequestInit = {},
|
|
): Promise<T> {
|
|
const token = await getBearerToken();
|
|
|
|
const response = await fetch(`${API_ENDPOINTS.SUPERMEMORY_API}${endpoint}`, {
|
|
...options,
|
|
credentials: "omit",
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
"Content-Type": "application/json",
|
|
...options.headers,
|
|
},
|
|
});
|
|
|
|
if (!response.ok) {
|
|
if (response.status === 401) {
|
|
throw new AuthenticationError("Invalid or expired token");
|
|
}
|
|
throw new SupermemoryAPIError(
|
|
`API request failed: ${response.statusText}`,
|
|
response.status,
|
|
);
|
|
}
|
|
|
|
return response.json();
|
|
}
|
|
|
|
/**
|
|
* Fetch all projects from API
|
|
*/
|
|
export async function fetchProjects(): Promise<Project[]> {
|
|
try {
|
|
const response =
|
|
await makeAuthenticatedRequest<ProjectsResponse>("/v3/projects");
|
|
return response.projects;
|
|
} catch (error) {
|
|
console.error("Failed to fetch projects:", error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get default project from storage
|
|
*/
|
|
export async function getDefaultProject(): Promise<Project | null> {
|
|
try {
|
|
const result = await chrome.storage.local.get([
|
|
STORAGE_KEYS.DEFAULT_PROJECT,
|
|
]);
|
|
return result[STORAGE_KEYS.DEFAULT_PROJECT] || null;
|
|
} catch (error) {
|
|
console.error("Failed to get default project:", error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set default project in storage
|
|
*/
|
|
export async function setDefaultProject(project: Project): Promise<void> {
|
|
try {
|
|
await chrome.storage.local.set({
|
|
[STORAGE_KEYS.DEFAULT_PROJECT]: project,
|
|
});
|
|
} catch (error) {
|
|
console.error("Failed to set default project:", error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Save memory to Supermemory API
|
|
*/
|
|
export async function saveMemory(payload: MemoryPayload): Promise<unknown> {
|
|
try {
|
|
const response = await makeAuthenticatedRequest<unknown>("/v3/memories", {
|
|
method: "POST",
|
|
body: JSON.stringify(payload),
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error("Failed to save memory:", error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Search memories using Supermemory API
|
|
*/
|
|
export async function searchMemories(query: string): Promise<unknown> {
|
|
try {
|
|
const response = await makeAuthenticatedRequest<unknown>("/v4/search", {
|
|
method: "POST",
|
|
body: JSON.stringify({ q: query, include: { relatedMemories: true } }),
|
|
});
|
|
return response;
|
|
} catch (error) {
|
|
console.error("Failed to search memories:", error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Save tweet to Supermemory API (specific for Twitter imports)
|
|
*/
|
|
export async function saveTweet(
|
|
content: string,
|
|
metadata: { sm_source: string; [key: string]: unknown },
|
|
containerTag = "sm_project_twitter_bookmarks",
|
|
): Promise<void> {
|
|
try {
|
|
const payload: MemoryPayload = {
|
|
containerTags: [containerTag],
|
|
content,
|
|
metadata,
|
|
};
|
|
await saveMemory(payload);
|
|
} catch (error) {
|
|
if (error instanceof SupermemoryAPIError && error.statusCode === 409) {
|
|
// Skip if already exists (409 Conflict)
|
|
return;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|