diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index a1a63811..fa929b8c 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -258,10 +258,18 @@ const normalizeUsage = (usage?: Partial | null): LanguageMod } } -// Sort nodes (dirs first, then alphabetically) +// Pinned folders appear first in the sidebar (in this order) +const PINNED_FOLDERS = ['Notes'] + +// Sort nodes (dirs first, pinned folders at top, then alphabetically) function sortNodes(nodes: TreeNode[]): TreeNode[] { return nodes.sort((a, b) => { if (a.kind !== b.kind) return a.kind === 'dir' ? -1 : 1 + const aPinned = PINNED_FOLDERS.indexOf(a.name) + const bPinned = PINNED_FOLDERS.indexOf(b.name) + if (aPinned !== -1 && bPinned !== -1) return aPinned - bPinned + if (aPinned !== -1) return -1 + if (bPinned !== -1) return 1 return a.name.localeCompare(b.name) }).map(node => { if (node.children) { @@ -991,10 +999,12 @@ function App() { } }, []) - // Ensure bases/ directory exists on startup + // Ensure bases/ and knowledge/Notes/ directories exist on startup useEffect(() => { window.ipc.invoke('workspace:mkdir', { path: 'bases', recursive: true }) .catch((err: unknown) => console.error('Failed to ensure bases directory:', err)) + window.ipc.invoke('workspace:mkdir', { path: 'knowledge/Notes', recursive: true }) + .catch((err: unknown) => console.error('Failed to ensure Notes directory:', err)) }, []) // Load initial tree @@ -3113,7 +3123,7 @@ function App() { }, []) const knowledgeActions = React.useMemo(() => ({ - createNote: async (parentPath: string = 'knowledge') => { + createNote: async (parentPath: string = 'knowledge/Notes') => { try { let index = 0 let name = untitledBaseName @@ -3136,7 +3146,7 @@ function App() { throw err } }, - createFolder: async (parentPath: string = 'knowledge') => { + createFolder: async (parentPath: string = 'knowledge/Notes') => { try { await window.ipc.invoke('workspace:mkdir', { path: `${parentPath}/new-folder-${Date.now()}`, diff --git a/apps/x/packages/core/src/knowledge/granola/sync.ts b/apps/x/packages/core/src/knowledge/granola/sync.ts index 2c647c9a..2c1e82c4 100644 --- a/apps/x/packages/core/src/knowledge/granola/sync.ts +++ b/apps/x/packages/core/src/knowledge/granola/sync.ts @@ -18,7 +18,7 @@ const GRANOLA_CLIENT_VERSION = '6.462.1'; const GRANOLA_API_BASE = 'https://api.granola.ai'; const GRANOLA_CONFIG_PATH = path.join(homedir(), 'Library', 'Application Support', 'Granola', 'supabase.json'); const SYNC_DIR = path.join(WorkDir, 'knowledge', 'Meetings', 'granola'); -const STATE_FILE = path.join(SYNC_DIR, 'sync_state.json'); +const STATE_FILE = path.join(WorkDir, 'granola_sync_state.json'); const SYNC_INTERVAL_MS = 5 * 60 * 1000; // Check every 5 minutes const API_DELAY_MS = 1000; // 1 second delay between API calls const RATE_LIMIT_RETRY_DELAY_MS = 60 * 1000; // Wait 1 minute on rate limit diff --git a/apps/x/packages/core/src/knowledge/sync_fireflies.ts b/apps/x/packages/core/src/knowledge/sync_fireflies.ts index 1244b2dd..faa885e2 100644 --- a/apps/x/packages/core/src/knowledge/sync_fireflies.ts +++ b/apps/x/packages/core/src/knowledge/sync_fireflies.ts @@ -8,7 +8,7 @@ import { limitEventItems } from './limit_event_items.js'; // Configuration const SYNC_DIR = path.join(WorkDir, 'knowledge', 'Meetings', 'fireflies'); const SYNC_INTERVAL_MS = 30 * 60 * 1000; // Check every 30 minutes (reduced from 1 minute) -const STATE_FILE = path.join(SYNC_DIR, 'sync_state.json'); +const STATE_FILE = path.join(WorkDir, 'fireflies_sync_state.json'); const LOOKBACK_DAYS = 30; // Last 1 month const API_DELAY_MS = 2000; // 2 second delay between API calls const RATE_LIMIT_RETRY_DELAY_MS = 60 * 1000; // Wait 1 minute on rate limit