diff --git a/apps/browser-extension/entrypoints/background.ts b/apps/browser-extension/entrypoints/background.ts index 0ee09e3f4..3b0a545fa 100644 --- a/apps/browser-extension/entrypoints/background.ts +++ b/apps/browser-extension/entrypoints/background.ts @@ -6,7 +6,6 @@ import { } from "../utils/api" import { CONTAINER_TAGS, - CONTEXT_MENU_IDS, MESSAGE_TYPES, POSTHOG_EVENT_KEY, } from "../utils/constants" @@ -26,18 +25,6 @@ export default defineBackground(() => { let twitterImporter: TwitterImporter | null = null browser.runtime.onInstalled.addListener(async (details) => { - browser.contextMenus.create({ - id: CONTEXT_MENU_IDS.SAVE_TO_SUPERMEMORY, - title: "sync to supermemory", - contexts: ["selection", "page", "link"], - }) - - browser.contextMenus.create({ - id: CONTEXT_MENU_IDS.SEARCH_SUPERMEMORY, - title: "search supermemory", - contexts: ["selection"], - }) - if (details.reason === "install") { await trackEvent("extension_installed", { reason: details.reason, @@ -59,38 +46,6 @@ export default defineBackground(() => { ["requestHeaders", "extraHeaders"], ) - // Handle context menu clicks. - browser.contextMenus.onClicked.addListener(async (info, tab) => { - if (info.menuItemId === CONTEXT_MENU_IDS.SAVE_TO_SUPERMEMORY) { - if (tab?.id) { - 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) - } - } - } - - if (info.menuItemId === CONTEXT_MENU_IDS.SEARCH_SUPERMEMORY) { - if (tab?.id && info.selectionText) { - try { - await browser.tabs.sendMessage(tab.id, { - action: MESSAGE_TYPES.OPEN_SEARCH_PANEL, - data: info.selectionText, - }) - } catch (error) { - console.error( - "Failed to send search message to content script:", - error, - ) - } - } - } - }) - // Send message to current active tab. const sendMessageToCurrentTab = async (message: string) => { const tabs = await browser.tabs.query({ @@ -319,30 +274,6 @@ export default defineBackground(() => { return true } - if (message.action === MESSAGE_TYPES.SEARCH_SELECTION) { - ;(async () => { - try { - const query = message.data as string - const responseData = await searchMemories(query) - await trackEvent(POSTHOG_EVENT_KEY.SELECTION_SEARCH_TRIGGERED, { - query_length: query.length, - }) - sendResponse({ success: true, data: responseData }) - } catch (error) { - const errorMessage = - error instanceof Error ? error.message : "Unknown error" - const isAuthError = - errorMessage.includes("Authentication") || - errorMessage.includes("token") - sendResponse({ - success: false, - error: errorMessage, - isAuthError, - }) - } - })() - return true - } }, ) }) diff --git a/apps/browser-extension/entrypoints/content/index.ts b/apps/browser-extension/entrypoints/content/index.ts index 34a77b6c8..cba33ce28 100644 --- a/apps/browser-extension/entrypoints/content/index.ts +++ b/apps/browser-extension/entrypoints/content/index.ts @@ -2,10 +2,6 @@ import { DOMAINS, MESSAGE_TYPES } from "../../utils/constants" import { DOMUtils } from "../../utils/ui-components" import { initializeChatGPT } from "./chatgpt" import { initializeClaude } from "./claude" -import { - handleOpenSearchPanel, - initializeSelectionSearch, -} from "./selection-search" import { saveMemory, setupGlobalKeyboardShortcut, @@ -28,8 +24,6 @@ export default defineContentScript({ DOMUtils.showToast(message.state) } else if (message.action === MESSAGE_TYPES.SAVE_MEMORY) { await saveMemory() - } else if (message.action === MESSAGE_TYPES.OPEN_SEARCH_PANEL) { - handleOpenSearchPanel(message.data as string) } else if (message.action === MESSAGE_TYPES.TWITTER_IMPORT_OPEN_MODAL) { await openImportModal() } else if (message.type === MESSAGE_TYPES.IMPORT_UPDATE) { @@ -74,9 +68,6 @@ export default defineContentScript({ initializeT3() initializeTwitter() - // Initialize universal selection search - initializeSelectionSearch() - // Start observing for dynamic changes if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", observeForDynamicChanges) diff --git a/apps/browser-extension/entrypoints/content/selection-search.ts b/apps/browser-extension/entrypoints/content/selection-search.ts deleted file mode 100644 index 57c871880..000000000 --- a/apps/browser-extension/entrypoints/content/selection-search.ts +++ /dev/null @@ -1,647 +0,0 @@ -import { ELEMENT_IDS, MESSAGE_TYPES, UI_CONFIG } from "../../utils/constants" - -// State -let currentQuery = "" -let fabElement: HTMLElement | null = null -let panelElement: HTMLElement | null = null -const selectedResults: Set = new Set() - -/** - * Get the selection rectangle for positioning the FAB - */ -function getSelectionRect(): DOMRect | null { - const selection = window.getSelection() - if (!selection || selection.rangeCount === 0) return null - - const range = selection.getRangeAt(0) - return range.getBoundingClientRect() -} - -/** - * Check if the selection is inside our extension UI - */ -function isSelectionInsideExtensionUI(): boolean { - const selection = window.getSelection() - if (!selection || selection.rangeCount === 0) return false - - const anchorNode = selection.anchorNode - if (!anchorNode) return false - - const element = - anchorNode.nodeType === Node.ELEMENT_NODE - ? (anchorNode as Element) - : anchorNode.parentElement - - if (!element) return false - - // Check if selection is inside FAB or panel - return ( - !!element.closest(`#${ELEMENT_IDS.SELECTION_SEARCH_FAB}`) || - !!element.closest(`#${ELEMENT_IDS.SELECTION_SEARCH_PANEL}`) - ) -} - -/** - * Create the floating action button (FAB) - */ -function createFAB(): HTMLElement { - const fab = document.createElement("div") - fab.id = ELEMENT_IDS.SELECTION_SEARCH_FAB - - const iconUrl = browser.runtime.getURL("/icon-16.png") - - fab.innerHTML = ` - Search - Search - ` - - fab.style.cssText = ` - position: fixed; - z-index: 2147483646; - display: flex; - align-items: center; - gap: 6px; - padding: 8px 12px; - background: #05070A; - color: #ffffff; - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 8px; - font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - font-size: 13px; - font-weight: 500; - cursor: pointer; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); - transition: all 0.15s ease; - user-select: none; - ` - - fab.addEventListener("mouseenter", () => { - fab.style.background = "#0F151F" - fab.style.borderColor = "rgba(255, 255, 255, 0.2)" - }) - - fab.addEventListener("mouseleave", () => { - fab.style.background = "#05070A" - fab.style.borderColor = "rgba(255, 255, 255, 0.1)" - }) - - fab.addEventListener("click", (e) => { - e.preventDefault() - e.stopPropagation() - triggerSearch() - }) - - return fab -} - -/** - * Show the FAB near the selection - */ -function showFAB(rect: DOMRect, text: string) { - hideFAB() - - currentQuery = text - fabElement = createFAB() - - // Position FAB above the selection, centered - const fabWidth = 90 // approximate width - let left = rect.left + rect.width / 2 - fabWidth / 2 - let top = rect.top - 40 - - // Ensure FAB stays within viewport - if (left < 10) left = 10 - if (left + fabWidth > window.innerWidth - 10) { - left = window.innerWidth - fabWidth - 10 - } - if (top < 10) { - // Show below selection if not enough space above - top = rect.bottom + 10 - } - - fabElement.style.left = `${left}px` - fabElement.style.top = `${top}px` - - document.body.appendChild(fabElement) -} - -/** - * Hide the FAB - */ -export function hideFAB() { - if (fabElement) { - fabElement.remove() - fabElement = null - } -} - -/** - * Trigger search with the current query - */ -async function triggerSearch() { - if (!currentQuery) return - - hideFAB() - showPanel(currentQuery, "loading") - - try { - const response = await browser.runtime.sendMessage({ - action: MESSAGE_TYPES.SEARCH_SELECTION, - data: currentQuery, - }) - - if (response.success) { - showPanel(currentQuery, "results", response.data) - } else if (response.isAuthError) { - showPanel(currentQuery, "auth_error") - } else { - showPanel(currentQuery, "error", null, response.error) - } - } catch (error) { - console.error("Search failed:", error) - showPanel( - currentQuery, - "error", - null, - error instanceof Error ? error.message : "Search failed", - ) - } -} - -/** - * Create and show the search results panel - */ -function showPanel( - query: string, - state: "loading" | "results" | "error" | "auth_error", - data?: unknown, - errorMessage?: string, -) { - hidePanel() - selectedResults.clear() - - panelElement = document.createElement("div") - panelElement.id = ELEMENT_IDS.SELECTION_SEARCH_PANEL - - panelElement.style.cssText = ` - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 2147483647; - width: 420px; - max-width: 90vw; - max-height: 70vh; - background: #05070A; - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 12px; - font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); - display: flex; - flex-direction: column; - overflow: hidden; - ` - - // Header - const header = document.createElement("div") - header.style.cssText = ` - padding: 16px; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - display: flex; - justify-content: space-between; - align-items: center; - flex-shrink: 0; - ` - - const iconUrl = browser.runtime.getURL("/icon-16.png") - header.innerHTML = ` -
- supermemory - Search Results -
- - ` - - panelElement.appendChild(header) - - // Query display - const queryDisplay = document.createElement("div") - queryDisplay.style.cssText = ` - padding: 12px 16px; - background: rgba(91, 126, 245, 0.04); - border-bottom: 1px solid rgba(255, 255, 255, 0.05); - flex-shrink: 0; - ` - queryDisplay.innerHTML = ` -
Searching for:
-
${escapeHtml(query)}
- ` - panelElement.appendChild(queryDisplay) - - // Content area - const content = document.createElement("div") - content.id = "sm-panel-content" - content.style.cssText = ` - flex: 1; - overflow-y: auto; - padding: 16px; - min-height: 150px; - ` - - if (state === "loading") { - content.innerHTML = ` -
-
- Searching memories... -
- ` - } else if (state === "auth_error") { - content.innerHTML = ` -
-
Sign in required
-

Please sign in to supermemory to search your memories.

- -
- ` - } else if (state === "error") { - content.innerHTML = ` -
-
Search failed
-

${escapeHtml(errorMessage || "An error occurred")}

-
- ` - } else if (state === "results") { - const response = data as { - searchResults?: { results?: Array<{ memory?: string; id?: string }> } - } - const results = response?.searchResults?.results || [] - - if (results.length === 0) { - content.innerHTML = ` -
-
No memories found
-

Try a different search query.

-
- ` - } else { - content.innerHTML = results - .map( - (result, index) => ` -
- -
-

${escapeHtml(result.memory || "")}

-
-
- `, - ) - .join("") - } - } - - panelElement.appendChild(content) - - // Footer with copy button (only for results) - if (state === "results") { - const response = data as { - searchResults?: { results?: Array<{ memory?: string }> } - } - const results = response?.searchResults?.results || [] - - if (results.length > 0) { - const footer = document.createElement("div") - footer.style.cssText = ` - padding: 12px 16px; - border-top: 1px solid rgba(255, 255, 255, 0.1); - display: flex; - justify-content: space-between; - align-items: center; - flex-shrink: 0; - ` - footer.innerHTML = ` - 0 selected - - ` - panelElement.appendChild(footer) - } - } - - // Add animations style - if (!document.getElementById("sm-panel-styles")) { - const style = document.createElement("style") - style.id = "sm-panel-styles" - style.textContent = ` - @keyframes sm-spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } - } - .sm-result-item:hover { - background: rgba(91, 126, 245, 0.08) !important; - } - .sm-result-item.selected { - border-color: rgba(91, 190, 251, 0.3) !important; - background: rgba(91, 126, 245, 0.08) !important; - } - ` - document.head.appendChild(style) - } - - document.body.appendChild(panelElement) - - // Event listeners - setupPanelEventListeners(data) -} - -/** - * Setup event listeners for the panel - */ -function setupPanelEventListeners(data: unknown) { - if (!panelElement) return - - // Close button - const closeBtn = panelElement.querySelector("#sm-panel-close") - closeBtn?.addEventListener("click", hidePanel) - - // Sign in button - const signInBtn = panelElement.querySelector("#sm-sign-in-btn") - signInBtn?.addEventListener("click", () => { - window.open( - import.meta.env.PROD - ? "https://app.supermemory.ai/login" - : "http://localhost:3000/login", - "_blank", - ) - }) - - // Result item checkboxes - const checkboxes = panelElement.querySelectorAll( - '.sm-result-item input[type="checkbox"]', - ) - checkboxes.forEach((checkbox) => { - checkbox.addEventListener("change", (e) => { - const target = e.target as HTMLInputElement - const index = Number.parseInt(target.dataset.index || "0", 10) - const item = target.closest(".sm-result-item") as HTMLElement - - if (target.checked) { - selectedResults.add(index) - item?.classList.add("selected") - } else { - selectedResults.delete(index) - item?.classList.remove("selected") - } - - updateSelectionUI() - }) - }) - - // Result item click (toggle checkbox) - const items = panelElement.querySelectorAll(".sm-result-item") - items.forEach((item) => { - item.addEventListener("click", (e) => { - const target = e.target as HTMLElement - if (target.tagName === "INPUT") return - - const checkbox = item.querySelector( - 'input[type="checkbox"]', - ) as HTMLInputElement - if (checkbox) { - checkbox.checked = !checkbox.checked - checkbox.dispatchEvent(new Event("change")) - } - }) - }) - - // Copy button - const copyBtn = panelElement.querySelector("#sm-copy-btn") - copyBtn?.addEventListener("click", () => { - copySelectedResults(data) - }) - - // Close on escape - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === "Escape") { - hidePanel() - } - } - document.addEventListener("keydown", handleKeyDown) - - // Close on outside click - const handleOutsideClick = (e: MouseEvent) => { - if (panelElement && !panelElement.contains(e.target as Node)) { - hidePanel() - } - } - setTimeout(() => { - document.addEventListener("click", handleOutsideClick) - }, 100) - - // Cleanup listeners when panel is removed - const observer = new MutationObserver(() => { - if (!document.contains(panelElement)) { - document.removeEventListener("keydown", handleKeyDown) - document.removeEventListener("click", handleOutsideClick) - observer.disconnect() - } - }) - observer.observe(document.body, { childList: true }) -} - -/** - * Update the selection count UI - */ -function updateSelectionUI() { - const countEl = document.getElementById("sm-selected-count") - const copyBtn = document.getElementById("sm-copy-btn") as HTMLButtonElement - - if (countEl) { - countEl.textContent = `${selectedResults.size} selected` - } - - if (copyBtn) { - copyBtn.disabled = selectedResults.size === 0 - copyBtn.style.opacity = selectedResults.size === 0 ? "0.5" : "1" - } -} - -/** - * Copy selected results to clipboard - */ -async function copySelectedResults(data: unknown) { - const response = data as { - searchResults?: { results?: Array<{ memory?: string }> } - } - const results = response?.searchResults?.results || [] - - const selectedMemories = Array.from(selectedResults) - .sort((a, b) => a - b) - .map((index) => results[index]?.memory) - .filter(Boolean) - - if (selectedMemories.length === 0) return - - // Format the copied content - const formattedContent = selectedMemories - .map((memory, i) => `${i + 1}. ${memory}`) - .join("\n\n") - - try { - await navigator.clipboard.writeText(formattedContent) - - // Show copied feedback - const copyBtn = document.getElementById("sm-copy-btn") - if (copyBtn) { - const originalText = copyBtn.textContent - copyBtn.textContent = "Copied!" - setTimeout(() => { - if (copyBtn) copyBtn.textContent = originalText - }, 1500) - } - - // Track event - browser.runtime.sendMessage({ - action: MESSAGE_TYPES.CAPTURE_PROMPT, - data: { - prompt: `Copied ${selectedMemories.length} memories`, - platform: "selection_search", - source: "copy_selected", - }, - }) - } catch (error) { - console.error("Failed to copy to clipboard:", error) - } -} - -/** - * Hide the panel - */ -export function hidePanel() { - if (panelElement) { - panelElement.remove() - panelElement = null - } - selectedResults.clear() -} - -/** - * Escape HTML to prevent XSS - */ -function escapeHtml(text: string): string { - const div = document.createElement("div") - div.textContent = text - return div.innerHTML -} - -/** - * Handle selection change - */ -function handleSelectionChange() { - const selection = window.getSelection() - const text = selection?.toString().trim() || "" - - // Hide FAB if selection is empty or inside extension UI - if ( - !text || - text.length < UI_CONFIG.SELECTION_MIN_LENGTH || - text.length > UI_CONFIG.SELECTION_MAX_LENGTH || - isSelectionInsideExtensionUI() - ) { - hideFAB() - return - } - - const rect = getSelectionRect() - if (rect && rect.width > 0 && rect.height > 0) { - showFAB(rect, text) - } -} - -/** - * Handle message from background to open search panel - */ -export function handleOpenSearchPanel(query: string) { - currentQuery = query - hideFAB() - triggerSearch() -} - -/** - * Initialize selection search functionality - */ -export function initializeSelectionSearch() { - // Listen for mouseup to detect selection - document.addEventListener("mouseup", () => { - // Small delay to ensure selection is complete - setTimeout(handleSelectionChange, 10) - }) - - // Listen for keyup for keyboard selection - document.addEventListener("keyup", (e) => { - if (e.shiftKey) { - setTimeout(handleSelectionChange, 10) - } - }) - - // Hide FAB when clicking elsewhere - document.addEventListener("mousedown", (e) => { - const target = e.target as HTMLElement - if ( - fabElement && - !fabElement.contains(target) && - !panelElement?.contains(target) - ) { - // Don't hide immediately to allow FAB click - setTimeout(() => { - const selection = window.getSelection() - if (!selection || selection.toString().trim().length === 0) { - hideFAB() - } - }, 100) - } - }) -} diff --git a/apps/browser-extension/utils/constants.ts b/apps/browser-extension/utils/constants.ts index 58481706c..20977642d 100644 --- a/apps/browser-extension/utils/constants.ts +++ b/apps/browser-extension/utils/constants.ts @@ -24,8 +24,6 @@ export const ELEMENT_IDS = { CLAUDE_INPUT_BAR_ELEMENT: "sm-claude-input-bar-element", T3_INPUT_BAR_ELEMENT: "sm-t3-input-bar-element", PROJECT_SELECTION_MODAL: "sm-project-selection-modal", - SELECTION_SEARCH_FAB: "sm-selection-search-fab", - SELECTION_SEARCH_PANEL: "sm-selection-search-panel", } as const /** @@ -51,8 +49,6 @@ export const UI_CONFIG = { OBSERVER_THROTTLE_DELAY: 300, // milliseconds between observer callback executions ROUTE_CHECK_INTERVAL: 2000, // milliseconds between route change checks API_REQUEST_TIMEOUT: 10000, // milliseconds for API request timeout - SELECTION_MIN_LENGTH: 3, // minimum characters to show FAB - SELECTION_MAX_LENGTH: 500, // maximum characters to show FAB } as const /** @@ -86,16 +82,9 @@ export const MESSAGE_TYPES = { GET_RELATED_MEMORIES: "sm-get-related-memories", CAPTURE_PROMPT: "sm-capture-prompt", FETCH_PROJECTS: "sm-fetch-projects", - SEARCH_SELECTION: "sm-search-selection", - OPEN_SEARCH_PANEL: "sm-open-search-panel", TWITTER_IMPORT_OPEN_MODAL: "sm-twitter-import-open-modal", } as const -export const CONTEXT_MENU_IDS = { - SAVE_TO_SUPERMEMORY: "sm-save-to-supermemory", - SEARCH_SUPERMEMORY: "sm-search-supermemory", -} as const - export const POSTHOG_EVENT_KEY = { TWITTER_IMPORT_STARTED: "twitter_import_started", SAVE_MEMORY_ATTEMPTED: "save_memory_attempted", @@ -107,6 +96,4 @@ export const POSTHOG_EVENT_KEY = { CLAUDE_CHAT_MEMORIES_AUTO_SEARCHED: "claude_chat_memories_auto_searched", CHATGPT_CHAT_MEMORIES_SEARCHED: "chatgpt_chat_memories_searched", CHATGPT_CHAT_MEMORIES_AUTO_SEARCHED: "chatgpt_chat_memories_auto_searched", - SELECTION_SEARCH_TRIGGERED: "selection_search_triggered", - SELECTION_SEARCH_COPIED: "selection_search_copied", } as const diff --git a/apps/browser-extension/wxt.config.ts b/apps/browser-extension/wxt.config.ts index 6d6895573..fe3d0281c 100644 --- a/apps/browser-extension/wxt.config.ts +++ b/apps/browser-extension/wxt.config.ts @@ -11,8 +11,8 @@ export default defineConfig({ manifest: { name: "supermemory", homepage_url: "https://supermemory.ai", - version: "6.1.0", - permissions: ["contextMenus", "storage", "activeTab", "webRequest", "tabs"], + version: "6.1.1", + permissions: ["storage", "activeTab", "webRequest", "tabs"], host_permissions: [ "*://x.com/*", "*://twitter.com/*", diff --git a/apps/mcp/src/client.ts b/apps/mcp/src/client.ts index ce88be339..c5cade72f 100644 --- a/apps/mcp/src/client.ts +++ b/apps/mcp/src/client.ts @@ -111,7 +111,7 @@ export class SupermemoryClient { // Delete the most similar match const memoryToDelete = searchResult.results[0] - await this.client.memories.delete(memoryToDelete.id) + await this.client.documents.delete(memoryToDelete.id) const memoryText = memoryToDelete.memory || memoryToDelete.content || "" return { diff --git a/apps/web/app/(app)/layout.tsx b/apps/web/app/(app)/layout.tsx index 765abcf63..5fa70049c 100644 --- a/apps/web/app/(app)/layout.tsx +++ b/apps/web/app/(app)/layout.tsx @@ -1,6 +1,6 @@ "use client" -import { MobileBanner } from "@/components/new/mobile-banner" +import { MobileBanner } from "@/components/mobile-banner" export default function AppLayout({ children }: { children: React.ReactNode }) { return ( diff --git a/apps/web/app/(app)/onboarding/setup/page.tsx b/apps/web/app/(app)/onboarding/setup/page.tsx index e53d447b3..350352331 100644 --- a/apps/web/app/(app)/onboarding/setup/page.tsx +++ b/apps/web/app/(app)/onboarding/setup/page.tsx @@ -2,12 +2,12 @@ import { motion, AnimatePresence } from "motion/react" -import { RelatableQuestion } from "@/components/new/onboarding/setup/relatable-question" -import { IntegrationsStep } from "@/components/new/onboarding/setup/integrations-step" +import { RelatableQuestion } from "@/components/onboarding/setup/relatable-question" +import { IntegrationsStep } from "@/components/onboarding/setup/integrations-step" -import { SetupHeader } from "@/components/new/onboarding/setup/header" -import { ChatSidebar } from "@/components/new/onboarding/setup/chat-sidebar" -import { AnimatedGradientBackground } from "@/components/new/animated-gradient-background" +import { SetupHeader } from "@/components/onboarding/setup/header" +import { ChatSidebar } from "@/components/onboarding/setup/chat-sidebar" +import { AnimatedGradientBackground } from "@/components/animated-gradient-background" import { useIsMobile } from "@hooks/use-mobile" import { useSetupContext, type SetupStep } from "./layout" diff --git a/apps/web/app/(app)/onboarding/welcome/page.tsx b/apps/web/app/(app)/onboarding/welcome/page.tsx index a09f93b5d..a43c65d6c 100644 --- a/apps/web/app/(app)/onboarding/welcome/page.tsx +++ b/apps/web/app/(app)/onboarding/welcome/page.tsx @@ -3,15 +3,15 @@ import { motion, AnimatePresence } from "motion/react" import { cn } from "@lib/utils" -import { InputStep } from "@/components/new/onboarding/welcome/input-step" -import { GreetingStep } from "@/components/new/onboarding/welcome/greeting-step" -import { WelcomeStep } from "@/components/new/onboarding/welcome/welcome-step" -import { OnboardingContentStep } from "@/components/new/onboarding/welcome/continue-step" +import { InputStep } from "@/components/onboarding/welcome/input-step" +import { GreetingStep } from "@/components/onboarding/welcome/greeting-step" +import { WelcomeStep } from "@/components/onboarding/welcome/welcome-step" +import { OnboardingContentStep } from "@/components/onboarding/welcome/continue-step" import { InitialHeader } from "@/components/initial-header" import { Logo } from "@ui/assets/Logo" import NovaOrb from "@/components/nova/nova-orb" -import { AnimatedGradientBackground } from "@/components/new/animated-gradient-background" +import { AnimatedGradientBackground } from "@/components/animated-gradient-background" import { useWelcomeContext, diff --git a/apps/web/app/(app)/page.tsx b/apps/web/app/(app)/page.tsx index a85cec134..b9366efb6 100644 --- a/apps/web/app/(app)/page.tsx +++ b/apps/web/app/(app)/page.tsx @@ -2,17 +2,17 @@ import { useState, useCallback, useEffect } from "react" import { useQueryState } from "nuqs" -import { Header } from "@/components/new/header" -import { ChatSidebar } from "@/components/new/chat" -import { MemoriesGrid } from "@/components/new/memories-grid" -import { GraphLayoutView } from "@/components/new/graph-layout-view" -import { IntegrationsView } from "@/components/new/integrations-view" -import { AnimatedGradientBackground } from "@/components/new/animated-gradient-background" -import { AddDocumentModal } from "@/components/new/add-document" -import { DocumentModal } from "@/components/new/document-modal" -import { DocumentsCommandPalette } from "@/components/new/documents-command-palette" -import { FullscreenNoteModal } from "@/components/new/fullscreen-note-modal" -import type { HighlightItem } from "@/components/new/highlights-card" +import { Header } from "@/components/header" +import { ChatSidebar } from "@/components/chat" +import { MemoriesGrid } from "@/components/memories-grid" +import { GraphLayoutView } from "@/components/graph-layout-view" +import { IntegrationsView } from "@/components/integrations-view" +import { AnimatedGradientBackground } from "@/components/animated-gradient-background" +import { AddDocumentModal } from "@/components/add-document" +import { DocumentModal } from "@/components/document-modal" +import { DocumentsCommandPalette } from "@/components/documents-command-palette" +import { FullscreenNoteModal } from "@/components/fullscreen-note-modal" +import type { HighlightItem } from "@/components/highlights-card" import { HotkeysProvider } from "react-hotkeys-hook" import { useHotkeys } from "react-hotkeys-hook" import { AnimatePresence } from "motion/react" @@ -313,7 +313,7 @@ export default function NewPage() { {isGraphMode && (
)}
}> - {viewMode === "integrations" ? ( -
- -
- ) : viewMode === "graph" && !isMobile ? ( -
- -
- ) : ( -
- -
- )} + {viewMode === "integrations" ? ( +
+ +
+ ) : viewMode === "graph" && !isMobile ? ( +
+ +
+ ) : ( +
+ +
+ )}
diff --git a/apps/web/app/(app)/settings/page.tsx b/apps/web/app/(app)/settings/page.tsx index bcea11861..26e646fc9 100644 --- a/apps/web/app/(app)/settings/page.tsx +++ b/apps/web/app/(app)/settings/page.tsx @@ -7,10 +7,10 @@ import NovaOrb from "@/components/nova/nova-orb" import { useState, useEffect, useRef } from "react" import { cn } from "@lib/utils" import { dmSansClassName } from "@/lib/fonts" -import Account from "@/components/new/settings/account" -import Integrations from "@/components/new/settings/integrations" -import ConnectionsMCP from "@/components/new/settings/connections-mcp" -import Support from "@/components/new/settings/support" +import Account from "@/components/settings/account" +import Integrations from "@/components/settings/integrations" +import ConnectionsMCP from "@/components/settings/connections-mcp" +import Support from "@/components/settings/support" import { ErrorBoundary } from "@/components/error-boundary" import { useRouter } from "next/navigation" import { useIsMobile } from "@hooks/use-mobile" diff --git a/apps/web/components/new/add-document/connections.tsx b/apps/web/components/add-document/connections.tsx similarity index 100% rename from apps/web/components/new/add-document/connections.tsx rename to apps/web/components/add-document/connections.tsx diff --git a/apps/web/components/new/add-document/file.tsx b/apps/web/components/add-document/file.tsx similarity index 100% rename from apps/web/components/new/add-document/file.tsx rename to apps/web/components/add-document/file.tsx diff --git a/apps/web/components/new/add-document/index.tsx b/apps/web/components/add-document/index.tsx similarity index 99% rename from apps/web/components/new/add-document/index.tsx rename to apps/web/components/add-document/index.tsx index 56142b301..2310c9564 100644 --- a/apps/web/components/new/add-document/index.tsx +++ b/apps/web/components/add-document/index.tsx @@ -13,7 +13,7 @@ import { LinkContent, type LinkData } from "./link" import { FileContent, type FileData } from "./file" import { useProject } from "@/stores" import { toast } from "sonner" -import { useDocumentMutations } from "../../../hooks/use-document-mutations" +import { useDocumentMutations } from "../../hooks/use-document-mutations" import { useCustomer } from "autumn-js/react" import { useTokenUsage } from "@/hooks/use-token-usage" import { tokensToCredits, formatUsageNumber } from "@/lib/billing-utils" diff --git a/apps/web/components/new/add-document/link.tsx b/apps/web/components/add-document/link.tsx similarity index 100% rename from apps/web/components/new/add-document/link.tsx rename to apps/web/components/add-document/link.tsx diff --git a/apps/web/components/new/add-document/note.tsx b/apps/web/components/add-document/note.tsx similarity index 100% rename from apps/web/components/new/add-document/note.tsx rename to apps/web/components/add-document/note.tsx diff --git a/apps/web/components/new/add-space-modal.tsx b/apps/web/components/add-space-modal.tsx similarity index 100% rename from apps/web/components/new/add-space-modal.tsx rename to apps/web/components/add-space-modal.tsx diff --git a/apps/web/components/new/animated-gradient-background.tsx b/apps/web/components/animated-gradient-background.tsx similarity index 100% rename from apps/web/components/new/animated-gradient-background.tsx rename to apps/web/components/animated-gradient-background.tsx diff --git a/apps/web/components/new/chat/index.tsx b/apps/web/components/chat/index.tsx similarity index 99% rename from apps/web/components/new/chat/index.tsx rename to apps/web/components/chat/index.tsx index 47ee09177..a67a1f39c 100644 --- a/apps/web/components/new/chat/index.tsx +++ b/apps/web/components/chat/index.tsx @@ -36,7 +36,7 @@ import ChatModelSelector from "./model-selector" import { GradientLogo, LogoBgGradient } from "@ui/assets/Logo" import { useProject } from "@/stores" import type { ModelId } from "@/lib/models" -import { SuperLoader } from "../../superloader" +import { SuperLoader } from "../superloader" import { UserMessage } from "./message/user-message" import { AgentMessage } from "./message/agent-message" import { ChainOfThought } from "./input/chain-of-thought" diff --git a/apps/web/components/new/chat/input/actions.tsx b/apps/web/components/chat/input/actions.tsx similarity index 100% rename from apps/web/components/new/chat/input/actions.tsx rename to apps/web/components/chat/input/actions.tsx diff --git a/apps/web/components/new/chat/input/chain-of-thought.tsx b/apps/web/components/chat/input/chain-of-thought.tsx similarity index 100% rename from apps/web/components/new/chat/input/chain-of-thought.tsx rename to apps/web/components/chat/input/chain-of-thought.tsx diff --git a/apps/web/components/new/chat/input/index.tsx b/apps/web/components/chat/input/index.tsx similarity index 100% rename from apps/web/components/new/chat/input/index.tsx rename to apps/web/components/chat/input/index.tsx diff --git a/apps/web/components/new/chat/message/agent-message.tsx b/apps/web/components/chat/message/agent-message.tsx similarity index 100% rename from apps/web/components/new/chat/message/agent-message.tsx rename to apps/web/components/chat/message/agent-message.tsx diff --git a/apps/web/components/new/chat/message/follow-up-questions.tsx b/apps/web/components/chat/message/follow-up-questions.tsx similarity index 100% rename from apps/web/components/new/chat/message/follow-up-questions.tsx rename to apps/web/components/chat/message/follow-up-questions.tsx diff --git a/apps/web/components/new/chat/message/message-actions.tsx b/apps/web/components/chat/message/message-actions.tsx similarity index 100% rename from apps/web/components/new/chat/message/message-actions.tsx rename to apps/web/components/chat/message/message-actions.tsx diff --git a/apps/web/components/new/chat/message/related-memories.tsx b/apps/web/components/chat/message/related-memories.tsx similarity index 100% rename from apps/web/components/new/chat/message/related-memories.tsx rename to apps/web/components/chat/message/related-memories.tsx diff --git a/apps/web/components/new/chat/message/user-message.tsx b/apps/web/components/chat/message/user-message.tsx similarity index 100% rename from apps/web/components/new/chat/message/user-message.tsx rename to apps/web/components/chat/message/user-message.tsx diff --git a/apps/web/components/new/chat/model-selector.tsx b/apps/web/components/chat/model-selector.tsx similarity index 100% rename from apps/web/components/new/chat/model-selector.tsx rename to apps/web/components/chat/model-selector.tsx diff --git a/apps/web/components/new/document-cards/file-preview.tsx b/apps/web/components/document-cards/file-preview.tsx similarity index 98% rename from apps/web/components/new/document-cards/file-preview.tsx rename to apps/web/components/document-cards/file-preview.tsx index 44c2476ba..e5510f935 100644 --- a/apps/web/components/new/document-cards/file-preview.tsx +++ b/apps/web/components/document-cards/file-preview.tsx @@ -5,7 +5,7 @@ import type { DocumentsWithMemoriesResponseSchema } from "@repo/validation/api" import type { z } from "zod" import { dmSansClassName } from "@/lib/fonts" import { cn } from "@lib/utils" -import { DocumentIcon } from "@/components/new/document-icon" +import { DocumentIcon } from "@/components/document-icon" type DocumentsResponse = z.infer type DocumentWithMemories = DocumentsResponse["documents"][0] diff --git a/apps/web/components/new/document-cards/google-docs-preview.tsx b/apps/web/components/document-cards/google-docs-preview.tsx similarity index 93% rename from apps/web/components/new/document-cards/google-docs-preview.tsx rename to apps/web/components/document-cards/google-docs-preview.tsx index 06136e870..2516a3660 100644 --- a/apps/web/components/new/document-cards/google-docs-preview.tsx +++ b/apps/web/components/document-cards/google-docs-preview.tsx @@ -4,10 +4,7 @@ import type { DocumentsWithMemoriesResponseSchema } from "@repo/validation/api" import type { z } from "zod" import { dmSansClassName } from "@/lib/fonts" import { cn } from "@lib/utils" -import { - DocumentIcon, - getDocumentTypeLabel, -} from "@/components/new/document-icon" +import { DocumentIcon, getDocumentTypeLabel } from "@/components/document-icon" type DocumentsResponse = z.infer type DocumentWithMemories = DocumentsResponse["documents"][0] diff --git a/apps/web/components/new/document-cards/mcp-preview.tsx b/apps/web/components/document-cards/mcp-preview.tsx similarity index 100% rename from apps/web/components/new/document-cards/mcp-preview.tsx rename to apps/web/components/document-cards/mcp-preview.tsx diff --git a/apps/web/components/new/document-cards/note-preview.tsx b/apps/web/components/document-cards/note-preview.tsx similarity index 94% rename from apps/web/components/new/document-cards/note-preview.tsx rename to apps/web/components/document-cards/note-preview.tsx index 3e684a883..c05645f3a 100644 --- a/apps/web/components/new/document-cards/note-preview.tsx +++ b/apps/web/components/document-cards/note-preview.tsx @@ -4,7 +4,7 @@ import type { DocumentsWithMemoriesResponseSchema } from "@repo/validation/api" import type { z } from "zod" import { dmSansClassName } from "@/lib/fonts" import { cn } from "@lib/utils" -import { DocumentIcon } from "@/components/new/document-icon" +import { DocumentIcon } from "@/components/document-icon" type DocumentsResponse = z.infer type DocumentWithMemories = DocumentsResponse["documents"][0] diff --git a/apps/web/components/new/document-cards/notion-preview.tsx b/apps/web/components/document-cards/notion-preview.tsx similarity index 100% rename from apps/web/components/new/document-cards/notion-preview.tsx rename to apps/web/components/document-cards/notion-preview.tsx diff --git a/apps/web/components/new/document-cards/tweet-preview.tsx b/apps/web/components/document-cards/tweet-preview.tsx similarity index 100% rename from apps/web/components/new/document-cards/tweet-preview.tsx rename to apps/web/components/document-cards/tweet-preview.tsx diff --git a/apps/web/components/new/document-cards/website-preview.tsx b/apps/web/components/document-cards/website-preview.tsx similarity index 100% rename from apps/web/components/new/document-cards/website-preview.tsx rename to apps/web/components/document-cards/website-preview.tsx diff --git a/apps/web/components/new/document-cards/youtube-preview.tsx b/apps/web/components/document-cards/youtube-preview.tsx similarity index 100% rename from apps/web/components/new/document-cards/youtube-preview.tsx rename to apps/web/components/document-cards/youtube-preview.tsx diff --git a/apps/web/components/new/document-icon.tsx b/apps/web/components/document-icon.tsx similarity index 100% rename from apps/web/components/new/document-icon.tsx rename to apps/web/components/document-icon.tsx diff --git a/apps/web/components/new/document-modal/content/google-doc.tsx b/apps/web/components/document-modal/content/google-doc.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/google-doc.tsx rename to apps/web/components/document-modal/content/google-doc.tsx diff --git a/apps/web/components/new/document-modal/content/image-preview.tsx b/apps/web/components/document-modal/content/image-preview.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/image-preview.tsx rename to apps/web/components/document-modal/content/image-preview.tsx diff --git a/apps/web/components/new/document-modal/content/index.tsx b/apps/web/components/document-modal/content/index.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/index.tsx rename to apps/web/components/document-modal/content/index.tsx diff --git a/apps/web/components/new/document-modal/content/notion-doc.tsx b/apps/web/components/document-modal/content/notion-doc.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/notion-doc.tsx rename to apps/web/components/document-modal/content/notion-doc.tsx diff --git a/apps/web/components/new/document-modal/content/pdf.tsx b/apps/web/components/document-modal/content/pdf.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/pdf.tsx rename to apps/web/components/document-modal/content/pdf.tsx diff --git a/apps/web/components/new/document-modal/content/text-editor-content.tsx b/apps/web/components/document-modal/content/text-editor-content.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/text-editor-content.tsx rename to apps/web/components/document-modal/content/text-editor-content.tsx diff --git a/apps/web/components/new/document-modal/content/tweet.tsx b/apps/web/components/document-modal/content/tweet.tsx similarity index 91% rename from apps/web/components/new/document-modal/content/tweet.tsx rename to apps/web/components/document-modal/content/tweet.tsx index 528cf72fc..61867af99 100644 --- a/apps/web/components/new/document-modal/content/tweet.tsx +++ b/apps/web/components/document-modal/content/tweet.tsx @@ -1,7 +1,7 @@ "use client" import type { Tweet } from "react-tweet/api" -import { TweetPreview } from "@/components/new/document-cards/tweet-preview" +import { TweetPreview } from "@/components/document-cards/tweet-preview" import { ExternalLinkIcon } from "lucide-react" interface TweetContentProps { diff --git a/apps/web/components/new/document-modal/content/web-page.tsx b/apps/web/components/document-modal/content/web-page.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/web-page.tsx rename to apps/web/components/document-modal/content/web-page.tsx diff --git a/apps/web/components/new/document-modal/content/yt-video.tsx b/apps/web/components/document-modal/content/yt-video.tsx similarity index 100% rename from apps/web/components/new/document-modal/content/yt-video.tsx rename to apps/web/components/document-modal/content/yt-video.tsx diff --git a/apps/web/components/new/document-modal/document-icon.tsx b/apps/web/components/document-modal/document-icon.tsx similarity index 84% rename from apps/web/components/new/document-modal/document-icon.tsx rename to apps/web/components/document-modal/document-icon.tsx index cef93d019..de561ade8 100644 --- a/apps/web/components/new/document-modal/document-icon.tsx +++ b/apps/web/components/document-modal/document-icon.tsx @@ -7,4 +7,4 @@ export { getDocumentIcon, getDocumentTypeLabel, type DocumentIconProps, -} from "@/components/new/document-icon" +} from "@/components/document-icon" diff --git a/apps/web/components/new/document-modal/graph-list-memories.tsx b/apps/web/components/document-modal/graph-list-memories.tsx similarity index 100% rename from apps/web/components/new/document-modal/graph-list-memories.tsx rename to apps/web/components/document-modal/graph-list-memories.tsx diff --git a/apps/web/components/new/document-modal/index.tsx b/apps/web/components/document-modal/index.tsx similarity index 100% rename from apps/web/components/new/document-modal/index.tsx rename to apps/web/components/document-modal/index.tsx diff --git a/apps/web/components/new/document-modal/summary.tsx b/apps/web/components/document-modal/summary.tsx similarity index 100% rename from apps/web/components/new/document-modal/summary.tsx rename to apps/web/components/document-modal/summary.tsx diff --git a/apps/web/components/new/document-modal/title.tsx b/apps/web/components/document-modal/title.tsx similarity index 94% rename from apps/web/components/new/document-modal/title.tsx rename to apps/web/components/document-modal/title.tsx index 6f3ecb1ef..94ce07722 100644 --- a/apps/web/components/new/document-modal/title.tsx +++ b/apps/web/components/document-modal/title.tsx @@ -1,6 +1,6 @@ import { cn } from "@lib/utils" import { dmSansClassName } from "@/lib/fonts" -import { DocumentIcon } from "@/components/new/document-icon" +import { DocumentIcon } from "@/components/document-icon" function getFileExtension(documentType: string): string | null { switch (documentType) { diff --git a/apps/web/components/new/documents-command-palette.tsx b/apps/web/components/documents-command-palette.tsx similarity index 99% rename from apps/web/components/new/documents-command-palette.tsx rename to apps/web/components/documents-command-palette.tsx index 8dae7e580..ec001aaeb 100644 --- a/apps/web/components/new/documents-command-palette.tsx +++ b/apps/web/components/documents-command-palette.tsx @@ -13,7 +13,7 @@ import { dmSansClassName } from "@/lib/fonts" import { useIsMobile } from "@hooks/use-mobile" import { Dialog, DialogContent, DialogTitle } from "@repo/ui/components/dialog" import { SearchIcon, Settings, Home, Plus, Code2, Loader2 } from "lucide-react" -import { DocumentIcon } from "@/components/new/document-icon" +import { DocumentIcon } from "@/components/document-icon" import { $fetch } from "@lib/api" type DocumentsResponse = z.infer diff --git a/apps/web/components/new/feedback-modal.tsx b/apps/web/components/feedback-modal.tsx similarity index 100% rename from apps/web/components/new/feedback-modal.tsx rename to apps/web/components/feedback-modal.tsx diff --git a/apps/web/components/new/fullscreen-note-modal.tsx b/apps/web/components/fullscreen-note-modal.tsx similarity index 100% rename from apps/web/components/new/fullscreen-note-modal.tsx rename to apps/web/components/fullscreen-note-modal.tsx diff --git a/apps/web/components/new/graph-layout-view.tsx b/apps/web/components/graph-layout-view.tsx similarity index 100% rename from apps/web/components/new/graph-layout-view.tsx rename to apps/web/components/graph-layout-view.tsx diff --git a/apps/web/components/new/header.tsx b/apps/web/components/header.tsx similarity index 99% rename from apps/web/components/new/header.tsx rename to apps/web/components/header.tsx index 061d73d8f..a94d7e2de 100644 --- a/apps/web/components/new/header.tsx +++ b/apps/web/components/header.tsx @@ -22,7 +22,7 @@ import { Button } from "@ui/components/button" import { cn } from "@lib/utils" import { dmSansClassName } from "@/lib/fonts" import { Tabs, TabsList, TabsTrigger } from "@ui/components/tabs" -import { GraphIcon } from "@/components/new/integration-icons" +import { GraphIcon, IntegrationsIcon } from "@/components/integration-icons" import { DropdownMenu, DropdownMenuContent, @@ -184,7 +184,7 @@ export function Header({ onAddMemory, onOpenChat, onOpenSearch }: HeaderProps) { dmSansClassName(), )} > - + Integrations diff --git a/apps/web/components/new/highlights-card.tsx b/apps/web/components/highlights-card.tsx similarity index 100% rename from apps/web/components/new/highlights-card.tsx rename to apps/web/components/highlights-card.tsx diff --git a/apps/web/components/new/integration-icons.tsx b/apps/web/components/integration-icons.tsx similarity index 67% rename from apps/web/components/new/integration-icons.tsx rename to apps/web/components/integration-icons.tsx index 4603346c4..7629f38e2 100644 --- a/apps/web/components/new/integration-icons.tsx +++ b/apps/web/components/integration-icons.tsx @@ -3,6 +3,47 @@ import { Rotate3d } from "lucide-react" export { Rotate3d as GraphIcon } +export function IntegrationsIcon({ className }: { className?: string }) { + return ( + + Integrations + + + + + + ) +} + export function ChromeIcon({ className }: { className?: string }) { return (

Save any webpage directly from your browser

@@ -88,10 +85,7 @@ export function ChromeDetail() {
{text} diff --git a/apps/web/components/new/integrations/connections-detail.tsx b/apps/web/components/integrations/connections-detail.tsx similarity index 61% rename from apps/web/components/new/integrations/connections-detail.tsx rename to apps/web/components/integrations/connections-detail.tsx index 69dbcb060..3ffd91ad5 100644 --- a/apps/web/components/new/integrations/connections-detail.tsx +++ b/apps/web/components/integrations/connections-detail.tsx @@ -13,14 +13,18 @@ import { toast } from "sonner" import type { ConnectionResponseSchema } from "@repo/validation/api" import type { z } from "zod" import { analytics } from "@/lib/analytics" -import { AddDocumentModal } from "@/components/new/add-document" +import { AddDocumentModal } from "@/components/add-document" import { DEFAULT_PROJECT_ID } from "@repo/lib/constants" import type { Project } from "@repo/lib/types" type Connection = z.infer const CONNECTORS = { - "google-drive": { title: "Google Drive", icon: GoogleDrive, documentLabel: "documents" }, + "google-drive": { + title: "Google Drive", + icon: GoogleDrive, + documentLabel: "documents", + }, notion: { title: "Notion", icon: Notion, documentLabel: "pages" }, onedrive: { title: "OneDrive", icon: OneDrive, documentLabel: "documents" }, } as const @@ -44,7 +48,8 @@ function ConnectionRow({ if (!config) return null const Icon = config.icon - const isConnected = !connection.expiresAt || new Date(connection.expiresAt) > new Date() + const isConnected = + !connection.expiresAt || new Date(connection.expiresAt) > new Date() const formatRelativeTime = (date: string | null | undefined) => { if (!date) return "Never" @@ -61,29 +66,63 @@ function ConnectionRow({ const getProjectName = (tag: string): string => { if (tag === DEFAULT_PROJECT_ID) return "Default Project" - return projects.find((p) => p.containerTag === tag)?.name ?? tag.replace(/^sm_project_/, "") + return ( + projects.find((p) => p.containerTag === tag)?.name ?? + tag.replace(/^sm_project_/, "") + ) } const documentCount = (connection.metadata?.documentCount as number) ?? 0 - const containerTags = (connection as Connection & { containerTags?: string[] }).containerTags - const projectName = containerTags?.[0] ? getProjectName(containerTags[0]) : null + const containerTags = ( + connection as Connection & { containerTags?: string[] } + ).containerTags + const projectName = containerTags?.[0] + ? getProjectName(containerTags[0]) + : null return ( -
+
- {config.title} + + {config.title} +
-
- +
+ {isConnected ? "Connected" : "Disconnected"}
- {connection.email || "Unknown"} + + {connection.email || "Unknown"} +
@@ -115,10 +169,13 @@ export function ConnectionsDetail() { const autumn = useCustomer() const [isAddDocumentOpen, setIsAddDocumentOpen] = useState(false) - const projects = (queryClient.getQueryData(["projects"]) || []) as Project[] + const projects = (queryClient.getQueryData(["projects"]) || + []) as Project[] - const { data: status = { api_pro: { allowed: false, status: null } }, isLoading: isCheckingStatus } = - fetchSubscriptionStatus(autumn, !autumn.isLoading) + const { + data: status = { api_pro: { allowed: false, status: null } }, + isLoading: isCheckingStatus, + } = fetchSubscriptionStatus(autumn, !autumn.isLoading) const hasProProduct = status.api_pro?.status !== null @@ -127,11 +184,18 @@ export function ConnectionsDetail() { const connectionsLimit = connectionsFeature?.included_usage ?? 10 const canAddConnection = connectionsUsed < connectionsLimit - const { data: connections = [], isLoading: isLoadingConnections, error: connectionsError } = useQuery({ + const { + data: connections = [], + isLoading: isLoadingConnections, + error: connectionsError, + } = useQuery({ queryKey: ["connections"], queryFn: async () => { - const response = await $fetch("@post/connections/list", { body: { containerTags: [] } }) - if (response.error) throw new Error(response.error?.message || "Failed to load connections") + const response = await $fetch("@post/connections/list", { + body: { containerTags: [] }, + }) + if (response.error) + throw new Error(response.error?.message || "Failed to load connections") return response.data as Connection[] }, staleTime: 30 * 1000, @@ -142,7 +206,10 @@ export function ConnectionsDetail() { useEffect(() => { if (connectionsError) { toast.error("Failed to load connections", { - description: connectionsError instanceof Error ? connectionsError.message : "Unknown error", + description: + connectionsError instanceof Error + ? connectionsError.message + : "Unknown error", }) } }, [connectionsError]) @@ -153,7 +220,9 @@ export function ConnectionsDetail() { }, onSuccess: () => { analytics.connectionDeleted() - toast.success("Connection removal has started. Documents will be permanently deleted in the next few minutes.") + toast.success( + "Connection removal has started. Documents will be permanently deleted in the next few minutes.", + ) queryClient.invalidateQueries({ queryKey: ["connections"] }) }, onError: (error) => { @@ -165,7 +234,10 @@ export function ConnectionsDetail() { const handleUpgrade = async () => { try { - await autumn.attach({ productId: "api_pro", successUrl: "https://app.supermemory.ai/?view=integrations" }) + await autumn.attach({ + productId: "api_pro", + successUrl: "https://app.supermemory.ai/?view=integrations", + }) window.location.reload() } catch (error) { console.error(error) @@ -176,21 +248,44 @@ export function ConnectionsDetail() { return ( <> -
+
{!hasProProduct && !isLoading && ( <>
-

- Connect Google Drive, Notion, and OneDrive to import your knowledge +

+ Connect Google Drive, Notion, and OneDrive to import your + knowledge

- {["Unlimited memories", "10 connections", "Advanced search", "Priority support"].map((text) => ( + {[ + "Unlimited memories", + "10 connections", + "Advanced search", + "Priority support", + ].map((text) => (
- {text} + + {text} +
))}
@@ -211,12 +306,27 @@ export function ConnectionsDetail() { )} -
+
- + Connected to Supermemory - + {connections.length}/{connectionsLimit} connections used
@@ -231,7 +341,9 @@ export function ConnectionsDetail() { deleteConnectionMutation.mutate(connection.id)} + onDelete={() => + deleteConnectionMutation.mutate(connection.id) + } isDeleting={deleteConnectionMutation.isPending} disabled={!hasProProduct} projects={projects} @@ -240,8 +352,22 @@ export function ConnectionsDetail() { ) : (
-

No connections yet

-

Connect a service below to import your knowledge

+

+ No connections yet +

+

+ Connect a service below to import your knowledge +

)}
@@ -260,12 +386,18 @@ export function ConnectionsDetail() { )} > - Connect knowledge bases + + Connect knowledge bases +
- setIsAddDocumentOpen(false)} defaultTab="connect" /> + setIsAddDocumentOpen(false)} + defaultTab="connect" + /> ) } diff --git a/apps/web/components/new/integrations/plugins-detail.tsx b/apps/web/components/integrations/plugins-detail.tsx similarity index 100% rename from apps/web/components/new/integrations/plugins-detail.tsx rename to apps/web/components/integrations/plugins-detail.tsx diff --git a/apps/web/components/new/integrations/raycast-detail.tsx b/apps/web/components/integrations/raycast-detail.tsx similarity index 74% rename from apps/web/components/new/integrations/raycast-detail.tsx rename to apps/web/components/integrations/raycast-detail.tsx index 29ecdf209..7a96241ab 100644 --- a/apps/web/components/new/integrations/raycast-detail.tsx +++ b/apps/web/components/integrations/raycast-detail.tsx @@ -2,7 +2,7 @@ import { cn } from "@lib/utils" import { dmSans125ClassName } from "@/lib/fonts" -import { RaycastIcon } from "@/components/new/integration-icons" +import { RaycastIcon } from "@/components/integration-icons" import { authClient } from "@lib/auth" import { useAuth } from "@lib/auth-context" import { generateId } from "@lib/generate-id" @@ -101,17 +101,30 @@ export function RaycastDetail() {
-

+

Raycast Extension

-

+

Add and search memories from Mac and Windows

- createKeyMutation.mutate()} disabled={createKeyMutation.isPending}> + createKeyMutation.mutate()} + disabled={createKeyMutation.isPending} + > {createKeyMutation.isPending ? ( ) : ( @@ -121,28 +134,49 @@ export function RaycastDetail() { {createKeyMutation.isPending ? "Generating..." : "Get API key"} - window.open(RAYCAST_EXTENSION_URL, "_blank")}> + window.open(RAYCAST_EXTENSION_URL, "_blank")} + > - Install extension + + Install extension +
- { - setShowModal(open) - if (!open) { setApiKey(""); setCopied(false) } - }}> + { + setShowModal(open) + if (!open) { + setApiKey("") + setCopied(false) + } + }} + > - + Setup Raycast Extension
-
-

Follow these steps:

+

+ Follow these steps: +

{[ "Install the Raycast extension from the Raycast Store", "Open Raycast preferences and paste your API key", - "Use \"Add Memory\" or \"Search Memories\" commands!", + 'Use "Add Memory" or "Search Memories" commands!', ].map((text, i) => (
{i + 1}
-

{text}

+

+ {text} +

))}
diff --git a/apps/web/components/new/integrations/shortcuts-detail.tsx b/apps/web/components/integrations/shortcuts-detail.tsx similarity index 72% rename from apps/web/components/new/integrations/shortcuts-detail.tsx rename to apps/web/components/integrations/shortcuts-detail.tsx index 6a3f7368e..1ac3fb0d3 100644 --- a/apps/web/components/new/integrations/shortcuts-detail.tsx +++ b/apps/web/components/integrations/shortcuts-detail.tsx @@ -2,7 +2,7 @@ import { cn } from "@lib/utils" import { dmSans125ClassName } from "@/lib/fonts" -import { AppleShortcutsIcon } from "@/components/new/integration-icons" +import { AppleShortcutsIcon } from "@/components/integration-icons" import { authClient } from "@lib/auth" import { useAuth } from "@lib/auth-context" import { generateId } from "@lib/generate-id" @@ -120,10 +120,20 @@ export function ShortcutsDetail() {
-

+

Apple Shortcuts

-

+

Add memories directly from iPhone, iPad or Mac

@@ -134,13 +144,15 @@ export function ShortcutsDetail() { onClick={() => handleShortcutClick("add")} disabled={createApiKeyMutation.isPending} > - {createApiKeyMutation.isPending && selectedShortcutType === "add" ? ( + {createApiKeyMutation.isPending && + selectedShortcutType === "add" ? ( ) : ( )} - {createApiKeyMutation.isPending && selectedShortcutType === "add" + {createApiKeyMutation.isPending && + selectedShortcutType === "add" ? "Creating..." : "Add memory shortcut"} @@ -149,13 +161,15 @@ export function ShortcutsDetail() { onClick={() => handleShortcutClick("search")} disabled={createApiKeyMutation.isPending} > - {createApiKeyMutation.isPending && selectedShortcutType === "search" ? ( + {createApiKeyMutation.isPending && + selectedShortcutType === "search" ? ( ) : ( )} - {createApiKeyMutation.isPending && selectedShortcutType === "search" + {createApiKeyMutation.isPending && + selectedShortcutType === "search" ? "Creating..." : "Search memory shortcut"} @@ -164,20 +178,38 @@ export function ShortcutsDetail() {
- { - setShowApiKeyModal(open) - if (!open) { setSelectedShortcutType(null); setApiKey(""); setCopied(false) } - }}> + { + setShowApiKeyModal(open) + if (!open) { + setSelectedShortcutType(null) + setApiKey("") + setCopied(false) + } + }} + > - + Setup Apple Shortcut
-
-

Follow these steps:

+

+ Follow these steps: +

- {["Click \"Add to Shortcuts\" below to open the shortcut", "Paste your API key when prompted", "Start using your shortcut!"].map((text, i) => ( + {[ + 'Click "Add to Shortcuts" below to open the shortcut', + "Paste your API key when prompted", + "Start using your shortcut!", + ].map((text, i) => (
{i + 1}
-

{text}

+

+ {text} +

))}
@@ -222,7 +279,12 @@ export function ShortcutsDetail() { dmSans125ClassName(), )} > - iOS Shortcuts + iOS Shortcuts Add to Shortcuts
diff --git a/apps/web/components/new/mcp-modal/index.tsx b/apps/web/components/mcp-modal/index.tsx similarity index 100% rename from apps/web/components/new/mcp-modal/index.tsx rename to apps/web/components/mcp-modal/index.tsx diff --git a/apps/web/components/new/mcp-modal/mcp-detail-view.tsx b/apps/web/components/mcp-modal/mcp-detail-view.tsx similarity index 100% rename from apps/web/components/new/mcp-modal/mcp-detail-view.tsx rename to apps/web/components/mcp-modal/mcp-detail-view.tsx diff --git a/apps/web/components/new/memories-grid.tsx b/apps/web/components/memories-grid.tsx similarity index 100% rename from apps/web/components/new/memories-grid.tsx rename to apps/web/components/memories-grid.tsx diff --git a/apps/web/components/new/memory-graph/api-types.ts b/apps/web/components/memory-graph/api-types.ts similarity index 100% rename from apps/web/components/new/memory-graph/api-types.ts rename to apps/web/components/memory-graph/api-types.ts diff --git a/apps/web/components/new/memory-graph/canvas/hit-test.ts b/apps/web/components/memory-graph/canvas/hit-test.ts similarity index 100% rename from apps/web/components/new/memory-graph/canvas/hit-test.ts rename to apps/web/components/memory-graph/canvas/hit-test.ts diff --git a/apps/web/components/new/memory-graph/canvas/input-handler.ts b/apps/web/components/memory-graph/canvas/input-handler.ts similarity index 100% rename from apps/web/components/new/memory-graph/canvas/input-handler.ts rename to apps/web/components/memory-graph/canvas/input-handler.ts diff --git a/apps/web/components/new/memory-graph/canvas/renderer.ts b/apps/web/components/memory-graph/canvas/renderer.ts similarity index 100% rename from apps/web/components/new/memory-graph/canvas/renderer.ts rename to apps/web/components/memory-graph/canvas/renderer.ts diff --git a/apps/web/components/new/memory-graph/canvas/simulation.ts b/apps/web/components/memory-graph/canvas/simulation.ts similarity index 100% rename from apps/web/components/new/memory-graph/canvas/simulation.ts rename to apps/web/components/memory-graph/canvas/simulation.ts diff --git a/apps/web/components/new/memory-graph/canvas/version-chain.ts b/apps/web/components/memory-graph/canvas/version-chain.ts similarity index 100% rename from apps/web/components/new/memory-graph/canvas/version-chain.ts rename to apps/web/components/memory-graph/canvas/version-chain.ts diff --git a/apps/web/components/new/memory-graph/canvas/viewport.ts b/apps/web/components/memory-graph/canvas/viewport.ts similarity index 100% rename from apps/web/components/new/memory-graph/canvas/viewport.ts rename to apps/web/components/memory-graph/canvas/viewport.ts diff --git a/apps/web/components/new/memory-graph/constants.ts b/apps/web/components/memory-graph/constants.ts similarity index 100% rename from apps/web/components/new/memory-graph/constants.ts rename to apps/web/components/memory-graph/constants.ts diff --git a/apps/web/components/new/memory-graph/graph-canvas.tsx b/apps/web/components/memory-graph/graph-canvas.tsx similarity index 100% rename from apps/web/components/new/memory-graph/graph-canvas.tsx rename to apps/web/components/memory-graph/graph-canvas.tsx diff --git a/apps/web/components/new/memory-graph/graph-card.tsx b/apps/web/components/memory-graph/graph-card.tsx similarity index 100% rename from apps/web/components/new/memory-graph/graph-card.tsx rename to apps/web/components/memory-graph/graph-card.tsx diff --git a/apps/web/components/new/memory-graph/hooks/use-graph-api.ts b/apps/web/components/memory-graph/hooks/use-graph-api.ts similarity index 100% rename from apps/web/components/new/memory-graph/hooks/use-graph-api.ts rename to apps/web/components/memory-graph/hooks/use-graph-api.ts diff --git a/apps/web/components/new/memory-graph/hooks/use-graph-data.ts b/apps/web/components/memory-graph/hooks/use-graph-data.ts similarity index 100% rename from apps/web/components/new/memory-graph/hooks/use-graph-data.ts rename to apps/web/components/memory-graph/hooks/use-graph-data.ts diff --git a/apps/web/components/new/memory-graph/index.ts b/apps/web/components/memory-graph/index.ts similarity index 100% rename from apps/web/components/new/memory-graph/index.ts rename to apps/web/components/memory-graph/index.ts diff --git a/apps/web/components/new/memory-graph/legend.tsx b/apps/web/components/memory-graph/legend.tsx similarity index 100% rename from apps/web/components/new/memory-graph/legend.tsx rename to apps/web/components/memory-graph/legend.tsx diff --git a/apps/web/components/new/memory-graph/loading-indicator.tsx b/apps/web/components/memory-graph/loading-indicator.tsx similarity index 100% rename from apps/web/components/new/memory-graph/loading-indicator.tsx rename to apps/web/components/memory-graph/loading-indicator.tsx diff --git a/apps/web/components/new/memory-graph/memory-graph.tsx b/apps/web/components/memory-graph/memory-graph.tsx similarity index 100% rename from apps/web/components/new/memory-graph/memory-graph.tsx rename to apps/web/components/memory-graph/memory-graph.tsx diff --git a/apps/web/components/new/memory-graph/navigation-controls.tsx b/apps/web/components/memory-graph/navigation-controls.tsx similarity index 100% rename from apps/web/components/new/memory-graph/navigation-controls.tsx rename to apps/web/components/memory-graph/navigation-controls.tsx diff --git a/apps/web/components/new/memory-graph/node-hover-popover.tsx b/apps/web/components/memory-graph/node-hover-popover.tsx similarity index 100% rename from apps/web/components/new/memory-graph/node-hover-popover.tsx rename to apps/web/components/memory-graph/node-hover-popover.tsx diff --git a/apps/web/components/new/memory-graph/node-popover.tsx b/apps/web/components/memory-graph/node-popover.tsx similarity index 100% rename from apps/web/components/new/memory-graph/node-popover.tsx rename to apps/web/components/memory-graph/node-popover.tsx diff --git a/apps/web/components/new/memory-graph/types.ts b/apps/web/components/memory-graph/types.ts similarity index 100% rename from apps/web/components/new/memory-graph/types.ts rename to apps/web/components/memory-graph/types.ts diff --git a/apps/web/components/new/mobile-banner.tsx b/apps/web/components/mobile-banner.tsx similarity index 100% rename from apps/web/components/new/mobile-banner.tsx rename to apps/web/components/mobile-banner.tsx diff --git a/apps/web/components/new/onboarding/setup/chat-sidebar.tsx b/apps/web/components/onboarding/setup/chat-sidebar.tsx similarity index 100% rename from apps/web/components/new/onboarding/setup/chat-sidebar.tsx rename to apps/web/components/onboarding/setup/chat-sidebar.tsx diff --git a/apps/web/components/new/onboarding/setup/header.tsx b/apps/web/components/onboarding/setup/header.tsx similarity index 100% rename from apps/web/components/new/onboarding/setup/header.tsx rename to apps/web/components/onboarding/setup/header.tsx diff --git a/apps/web/components/new/onboarding/setup/integrations-step.tsx b/apps/web/components/onboarding/setup/integrations-step.tsx similarity index 97% rename from apps/web/components/new/onboarding/setup/integrations-step.tsx rename to apps/web/components/onboarding/setup/integrations-step.tsx index 1bd4e2283..32e420054 100644 --- a/apps/web/components/new/onboarding/setup/integrations-step.tsx +++ b/apps/web/components/onboarding/setup/integrations-step.tsx @@ -2,8 +2,8 @@ import { useState } from "react" import { Button } from "@ui/components/button" -import { MCPDetailView } from "@/components/new/mcp-modal/mcp-detail-view" -import { XBookmarksDetailView } from "@/components/new/onboarding/x-bookmarks-detail-view" +import { MCPDetailView } from "@/components/mcp-modal/mcp-detail-view" +import { XBookmarksDetailView } from "@/components/onboarding/x-bookmarks-detail-view" import { useRouter } from "next/navigation" import { cn } from "@lib/utils" import { dmSansClassName } from "@/lib/fonts" diff --git a/apps/web/components/new/onboarding/setup/relatable-question.tsx b/apps/web/components/onboarding/setup/relatable-question.tsx similarity index 100% rename from apps/web/components/new/onboarding/setup/relatable-question.tsx rename to apps/web/components/onboarding/setup/relatable-question.tsx diff --git a/apps/web/components/new/onboarding/welcome/continue-step.tsx b/apps/web/components/onboarding/welcome/continue-step.tsx similarity index 100% rename from apps/web/components/new/onboarding/welcome/continue-step.tsx rename to apps/web/components/onboarding/welcome/continue-step.tsx diff --git a/apps/web/components/new/onboarding/welcome/greeting-step.tsx b/apps/web/components/onboarding/welcome/greeting-step.tsx similarity index 100% rename from apps/web/components/new/onboarding/welcome/greeting-step.tsx rename to apps/web/components/onboarding/welcome/greeting-step.tsx diff --git a/apps/web/components/new/onboarding/welcome/input-step.tsx b/apps/web/components/onboarding/welcome/input-step.tsx similarity index 100% rename from apps/web/components/new/onboarding/welcome/input-step.tsx rename to apps/web/components/onboarding/welcome/input-step.tsx diff --git a/apps/web/components/new/onboarding/welcome/profile-step.tsx b/apps/web/components/onboarding/welcome/profile-step.tsx similarity index 100% rename from apps/web/components/new/onboarding/welcome/profile-step.tsx rename to apps/web/components/onboarding/welcome/profile-step.tsx diff --git a/apps/web/components/new/onboarding/welcome/welcome-step.tsx b/apps/web/components/onboarding/welcome/welcome-step.tsx similarity index 100% rename from apps/web/components/new/onboarding/welcome/welcome-step.tsx rename to apps/web/components/onboarding/welcome/welcome-step.tsx diff --git a/apps/web/components/new/onboarding/x-bookmarks-detail-view.tsx b/apps/web/components/onboarding/x-bookmarks-detail-view.tsx similarity index 100% rename from apps/web/components/new/onboarding/x-bookmarks-detail-view.tsx rename to apps/web/components/onboarding/x-bookmarks-detail-view.tsx diff --git a/apps/web/components/query-client.tsx b/apps/web/components/query-client.tsx index 1826e08c9..11f03a005 100644 --- a/apps/web/components/query-client.tsx +++ b/apps/web/components/query-client.tsx @@ -1,7 +1,6 @@ "use client" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" -import { ReactQueryDevtools } from "@tanstack/react-query-devtools" import { useState } from "react" export const QueryProvider = ({ children }: { children: React.ReactNode }) => { diff --git a/apps/web/components/new/quick-note-card.tsx b/apps/web/components/quick-note-card.tsx similarity index 100% rename from apps/web/components/new/quick-note-card.tsx rename to apps/web/components/quick-note-card.tsx diff --git a/apps/web/components/new/select-spaces-modal.tsx b/apps/web/components/select-spaces-modal.tsx similarity index 100% rename from apps/web/components/new/select-spaces-modal.tsx rename to apps/web/components/select-spaces-modal.tsx diff --git a/apps/web/components/new/settings/account.tsx b/apps/web/components/settings/account.tsx similarity index 100% rename from apps/web/components/new/settings/account.tsx rename to apps/web/components/settings/account.tsx diff --git a/apps/web/components/new/settings/connections-mcp.tsx b/apps/web/components/settings/connections-mcp.tsx similarity index 99% rename from apps/web/components/new/settings/connections-mcp.tsx rename to apps/web/components/settings/connections-mcp.tsx index 538eb3e81..a99740973 100644 --- a/apps/web/components/new/settings/connections-mcp.tsx +++ b/apps/web/components/settings/connections-mcp.tsx @@ -14,7 +14,7 @@ import type { ConnectionResponseSchema } from "@repo/validation/api" import type { z } from "zod" import { analytics } from "@/lib/analytics" import { ConnectAIModal } from "@/components/connect-ai-modal" -import { AddDocumentModal } from "@/components/new/add-document" +import { AddDocumentModal } from "@/components/add-document" import { DEFAULT_PROJECT_ID } from "@repo/lib/constants" import type { Project } from "@repo/lib/types" diff --git a/apps/web/components/new/settings/integrations.tsx b/apps/web/components/settings/integrations.tsx similarity index 99% rename from apps/web/components/new/settings/integrations.tsx rename to apps/web/components/settings/integrations.tsx index 479a5852f..e1c412100 100644 --- a/apps/web/components/new/settings/integrations.tsx +++ b/apps/web/components/settings/integrations.tsx @@ -28,7 +28,7 @@ import { ChromeIcon, AppleShortcutsIcon, RaycastIcon, -} from "@/components/new/integration-icons" +} from "@/components/integration-icons" function SectionTitle({ children }: { children: React.ReactNode }) { return ( @@ -111,7 +111,6 @@ function FeatureItem({ text }: { text: string }) { ) } - export default function Integrations() { const { org } = useAuth() const searchParams = useSearchParams() diff --git a/apps/web/components/new/settings/support.tsx b/apps/web/components/settings/support.tsx similarity index 100% rename from apps/web/components/new/settings/support.tsx rename to apps/web/components/settings/support.tsx diff --git a/apps/web/components/new/share-modal.tsx b/apps/web/components/share-modal.tsx similarity index 100% rename from apps/web/components/new/share-modal.tsx rename to apps/web/components/share-modal.tsx diff --git a/apps/web/components/new/space-selector.tsx b/apps/web/components/space-selector.tsx similarity index 100% rename from apps/web/components/new/space-selector.tsx rename to apps/web/components/space-selector.tsx diff --git a/apps/web/components/new/text-editor/extensions.tsx b/apps/web/components/text-editor/extensions.tsx similarity index 100% rename from apps/web/components/new/text-editor/extensions.tsx rename to apps/web/components/text-editor/extensions.tsx diff --git a/apps/web/components/new/text-editor/index.tsx b/apps/web/components/text-editor/index.tsx similarity index 100% rename from apps/web/components/new/text-editor/index.tsx rename to apps/web/components/text-editor/index.tsx diff --git a/apps/web/components/new/text-editor/slash-command.tsx b/apps/web/components/text-editor/slash-command.tsx similarity index 100% rename from apps/web/components/new/text-editor/slash-command.tsx rename to apps/web/components/text-editor/slash-command.tsx diff --git a/apps/web/components/new/text-editor/suggestions.tsx b/apps/web/components/text-editor/suggestions.tsx similarity index 100% rename from apps/web/components/new/text-editor/suggestions.tsx rename to apps/web/components/text-editor/suggestions.tsx diff --git a/apps/web/components/new/utils.ts b/apps/web/components/utils.ts similarity index 100% rename from apps/web/components/new/utils.ts rename to apps/web/components/utils.ts