From 1982bce13d67e515fb37b6bedee3c8bbabcc9aa2 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Fri, 29 Aug 2025 12:00:30 +0200 Subject: [PATCH] feat(deps): add tauri http plugin and update dependencies --- bun.lockb | Bin 220532 -> 221279 bytes package.json | 5 +- src-tauri/Cargo.lock | 433 +++++++++++++++++++++++++++- src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 13 +- src-tauri/src/lib.rs | 1 + src/pages/Index.tsx | 213 +++++++------- 7 files changed, 554 insertions(+), 112 deletions(-) diff --git a/bun.lockb b/bun.lockb index b5a2d4f6a122aaef9f844fb84d2726baec0c5535..9315d76e95c995e3acadb75f99246aff7ce9ea5b 100644 GIT binary patch delta 37742 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 delta 37307 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

dSvx*QX|Xblqo`pe3V{uetd2=17)!?;*WA z9`*P>j2xwjUJs*jt?y|kJRGqq;PpC83Xd3BJJuJs_tiXI)cKjwY%?C6z=)GURSdp= zjbXNm;ix!^B=85|c!}tPKjZZmXfW&h*#r6<>X}yi*|!ia-;yH1Rg*-2fj3&#m$aKb zk+kpoc_aD00gpv#;UiuYc==&{N;^BO;mB>PM)uM*)*ByC?VlooSL5-w_4(}8tJ=Qt z;od=Bh$5D6ws4-AP1Gd#-Kp}`=csA&bwS!|0S7v-_Pz|m7V^C@qT06_cbf{uPpeUe zTB61pRQvpUMB_DhDq*&<`3}+g^!8lmhrV6kf4ei{Q4e?qi)Cx{68*!OV&)?Vq8jeR zOz}2U{f}AV_eW4G)~B|AxH9s~;qI<2%zT)&vie@pd@Wl1F41KznoWjBPZMkL$?lY#0{t) z)xl*Uyko6TfsZ-vd^$BE;Z$wy6~yR;o^O3P{`vm-vv$?qdIj$w)Er_?DP>cUNZN>Y zH0#7$e{7DJxLxx_0^}s^IyyBc{1ng7l)aZU=GcLbM}0( zQLnGX-r~dox>#Wy*{7!0&v^gj!eMx&gc>wgba`UI_ZEi`aHP(BS!$gtkdubDCeI(- z<~5-@ji8G^a2lb0E|RZ}8mS*sCn4nh;Pprz=Z`pi%ySBLU694vqT8dG`hWDV;MFkR zZsDAv$b&)LPOO}WF8`~qUR}RE`sJ49)NdM8xE`B6AEt@-9@V{KOA(fD>AimaHLCAB zap~n@D_oDwu~Ut&i=kU?h4mqGw8IDV#8xt zQx~ZJZPLYj{Etn%~gnVrggDvRvRDD@B+aIueeyKlhB7y6DYH}DpPFu;QSBJC<%u+2>L z6Bl3*SK)$f8dx8O4>|C7zec{9I7@+7kkRb^N0x}BEf}fRFv!}XH_vPEAP$fqN7moa z=Bz$aYxctK0>Q9J#Q__e^_lXRm7`|vU%v@+^{WWO;~LhNoKvnPR{x; z{n^B{w1d$-9f%aWL%uAlBbGgm%JUONh(Vp=k+0@%E>>-A(Q-L-cdih1p1|J0`ucpQ zZGRTkFK$;$Wfha*)fHmI6KL;BE9DWLLjxXu_t=MXhI^E~S+>4p->Br!yZ5{ISnPr= zKPo#8$KS<{C(w>95tJ|BlaGD<`ntOwpHXfwK%9hup0iT?jx_2of*}vl94}ocf>v&Q zx7={kO3{2P`t)8{@FdT(YhV53i|-$Mq}<{dd~jSQKec+vy!62{JD2;MT`6WGtnaPM zh(9&oikkBlhXB2u!u$iq{80aT@qYKFeu=t3apJM=PJs{i*ZJ38@oc_jemz|q3x=Iw z5wH$$ewURq)gt*%0;Izwh37Vak3pDRTv_xYIM^==2S@m3Ml7CV1<3 zkgcq8>v}HnIG`XlfzfJ;T|0Hph7rw=t(7%l8}rH==ax_U0-3;xA5N&J*NXEn^}Pa% z+9>bY%vtjtt>QLXwHS-P0twiT+71(mfch!xWNRE z)Z>)mrB=^+SWi@Z`Zc>4wgdGcmoeR{UKv?Emsl%Hm11n>SvXSoj|Hyoz`&Hnu~KRn zXS-FwVr*+RihFmW*;M?p`n}8YmA+1Vw-fv89hgjc6y(P@?wh#olfxgNW_TnA`^1|E zK725rao3x>Np#<(d-a;PNuGZ=yFGo&hGQF_vuZV}f*EgNq3rCpn1Z6>W6UYYvrV8NptzE>~iFFEWzpxmN#v+ys*MCaII z{?$nSyHDD^n|@jCQn^JKe1Z`6((^InQ@;4^M7d9QkzI`SC=&)KM*f%2baEf!-ehgL z!4ml3&rtHeSzya9{-}S=a-VHm#7jt4S2sL*X_5F5y6>+=a#ykG=nE5%)||jYG-$U- z%&N6T(9<~mUsLpYS`Sc%(5fzcN=Nze=MBYT)zf+h%u@K9iL{KYdom`B?tIs=(DO}- z8{t2pdKw3;!iD1*-7lb#yF7OKdFrgq1GoEoM?>cs;sVdqntyt<_$o#1&a_7=-@zu=!{;;PzuYC@8Klz6JC?zN}Nv-;&qd))Wx S1?@%N?|PLze!uH&NB String { pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_opener::init()) + .plugin(tauri_plugin_http::init()) .invoke_handler(tauri::generate_handler![greet]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 0a0164e..610f682 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -11,6 +11,7 @@ import { toast } from '@/hooks/use-toast'; import { Window } from '@tauri-apps/api/window'; import { Switch } from '@/components/ui/switch'; import { useTheme } from 'next-themes'; +import { fetch } from '@tauri-apps/plugin-http' // Global timer that starts immediately when script loads const GLOBAL_START_TIME = Date.now(); @@ -71,7 +72,7 @@ const mapHitToNote = (hit: any): Note => ({ const Index = () => { // Log component mount time immediately console.log(`Component mounted after ${Date.now() - GLOBAL_START_TIME}ms`); - + const [currentNote, setCurrentNote] = useState(''); const [currentNoteTags, setCurrentNoteTags] = useState([]); const [previousNote, setPreviousNote] = useState(null); @@ -100,9 +101,9 @@ const Index = () => { const [includeTagsInSearch, setIncludeTagsInSearch] = useState(true); const [tagGenerationTimeout, setTagGenerationTimeout] = useState(); const [isSettingsOpen, setIsSettingsOpen] = useState(false); - const [systemPrompt, setSystemPrompt] = useState(`You are a helpful assistant that generates searchable tags for journal entries. - -Your task is to analyze the content and generate 1-3 relevant tags that would help the author find this note later. + const [systemPrompt, setSystemPrompt] = useState(`You are a helpful assistant that generates searchable tags for journal entries. + +Your task is to analyze the content and generate 1-3 relevant tags that would help the author find this note later. Focus on the quality of tags, not the quantity. Focus on: @@ -134,12 +135,12 @@ Keep tags concise, use lowercase, and separate words with hyphens if needed.`); const response = await fetch(url, options); const duration = Date.now() - startTime; debugTiming(operation, startTime); - + // Add network diagnostics for slow requests if (duration > 1000) { addDebugInfo(`Slow request: ${operation} took ${duration}ms`); } - + return response; } catch (error) { const duration = Date.now() - startTime; @@ -241,7 +242,7 @@ Keep tags concise, use lowercase, and separate words with hyphens if needed.`); // Add timeout to prevent hanging const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 500); - + const response = await fetch(`${OLLAMA_ENDPOINT}/api/tags`, { method: 'GET', headers: { @@ -249,9 +250,9 @@ Keep tags concise, use lowercase, and separate words with hyphens if needed.`); }, signal: controller.signal, }); - + clearTimeout(timeoutId); - + if (response.ok) { setOllamaStatus('online'); addDebugInfo('Ollama connection successful'); @@ -281,7 +282,7 @@ Keep tags concise, use lowercase, and separate words with hyphens if needed.`); if (tagGenerationTimeout) { clearTimeout(tagGenerationTimeout); } - + const timeout = setTimeout(async () => { if (content.trim() && autoGenerateTags) { try { @@ -300,7 +301,7 @@ Keep tags concise, use lowercase, and separate words with hyphens if needed.`); } } }, 300); - + setTagGenerationTimeout(timeout); }; @@ -313,7 +314,7 @@ Keep tags concise, use lowercase, and separate words with hyphens if needed.`); const contextNotes = []; const start = Math.max(0, noteIndex - contextSize); const end = Math.min(noteCache.length, noteIndex + contextSize + 1); - + for (let i = start; i < end; i++) { if (i !== noteIndex) { const note = noteCache[i]; @@ -321,7 +322,7 @@ Keep tags concise, use lowercase, and separate words with hyphens if needed.`); contextNotes.push(`[${date}] ${note.content.substring(0, 200)}${note.content.length > 200 ? '...' : ''}`); } } - + if (contextNotes.length > 0) { context = `\n\nContext from surrounding notes:\n${contextNotes.join('\n\n')}`; } @@ -351,7 +352,7 @@ ${content}${context}`; const data = await response.json(); const responseText = data.response?.trim(); - + if (!responseText) { throw new Error('Empty response from Ollama - check if model is loaded'); } @@ -361,7 +362,7 @@ ${content}${context}`; .split(',') .map((tag: string) => tag.trim()) .filter((tag: string) => tag.length > 0); - + addDebugInfo(`Generated ${tags.length} tags: ${tags.join(', ')}`); return tags; @@ -371,10 +372,10 @@ ${content}${context}`; } catch (error) { console.error('Error generating tags:', error); const errorMessage = error instanceof Error ? error.message : 'Unknown error'; - + // More detailed error logging and user notification let userMessage = 'Failed to generate tags'; - + if (error instanceof TypeError && error.message.includes('fetch')) { addDebugInfo('Tag generation failed: Network error - Ollama not reachable at localhost:11434'); userMessage = 'Ollama not reachable - check if it\'s running on localhost:11434'; @@ -391,14 +392,14 @@ ${content}${context}`; addDebugInfo(`Tag generation failed: ${errorMessage}`); userMessage = `Tag generation failed: ${errorMessage}`; } - + // Show error to user toast({ title: "Tag Generation Failed", description: userMessage, variant: "destructive", }); - + return []; } }; @@ -593,7 +594,7 @@ ${content}${context}`; const noteIndex = noteCache.findIndex(n => n.id === note.id); tags = await generateTags(trimmedContent, noteIndex); } - + // Generate tags if none are present and auto-generation is enabled if (autoGenerateTags && tags.length === 0) { addDebugInfo('No tags present, generating tags before saving...'); @@ -710,31 +711,31 @@ ${content}${context}`; const data = await response.json(); const notes: Note[] = data.hits.map((hit: any) => mapHitToNote(hit)); - if (offset === 0) { - setNoteCache(notes); - if (notes.length > 0) { - setPreviousNote(notes[0]); - setCurrentNoteIndex(0); - } - const loadTime = Date.now() - loadStartTime; - addDebugInfo(`Loaded ${notes.length} notes in ${loadTime}ms`); - } else { - setNoteCache(prev => [...prev, ...notes]); - const loadTime = Date.now() - loadStartTime; - addDebugInfo(`Loaded ${notes.length} additional notes in ${loadTime}ms`); + if (offset === 0) { + setNoteCache(notes); + if (notes.length > 0) { + setPreviousNote(notes[0]); + setCurrentNoteIndex(0); } - } catch (error) { - console.error('Error loading notes:', error); const loadTime = Date.now() - loadStartTime; - addDebugInfo(`Failed to load notes after ${loadTime}ms`); - toast({ - title: "Error", - description: "Failed to load notes. Please check your connection.", - variant: "destructive", - }); - } finally { - setIsLoading(false); + addDebugInfo(`Loaded ${notes.length} notes in ${loadTime}ms`); + } else { + setNoteCache(prev => [...prev, ...notes]); + const loadTime = Date.now() - loadStartTime; + addDebugInfo(`Loaded ${notes.length} additional notes in ${loadTime}ms`); } + } catch (error) { + console.error('Error loading notes:', error); + const loadTime = Date.now() - loadStartTime; + addDebugInfo(`Failed to load notes after ${loadTime}ms`); + toast({ + title: "Error", + description: "Failed to load notes. Please check your connection.", + variant: "destructive", + }); + } finally { + setIsLoading(false); + } }; // Load notes around a specific note @@ -1091,7 +1092,7 @@ ${content}${context}`; try { setIsLoading(true); addDebugInfo('Regenerating tags for all notes...'); - + // Load all notes const response = await fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes/${NOTE_INDEX}/search`, { method: 'POST', @@ -1112,7 +1113,7 @@ ${content}${context}`; const data = await response.json(); const notes: Note[] = data.hits.map((hit: any) => mapHitToNote(hit)); - + let updatedCount = 0; for (let i = 0; i < notes.length; i++) { const note = notes[i]; @@ -1128,7 +1129,7 @@ ${content}${context}`; console.error(`Error updating tags for note ${note.id}:`, error); } } - + addDebugInfo(`Tag regeneration complete: ${updatedCount} notes updated`); toast({ title: "Tag regeneration complete", @@ -1197,7 +1198,7 @@ ${content}${context}`; document.addEventListener('keydown', handleKeyDown); window.addEventListener('focus', handleWindowFocus); - + return () => { document.removeEventListener('keydown', handleKeyDown); window.removeEventListener('focus', handleWindowFocus); @@ -1346,19 +1347,19 @@ ${content}${context}`; try { console.log('Starting initialization...'); addDebugInfo('Starting initialization...'); - + // Check all indexes in parallel for faster initialization addDebugInfo('Checking all indexes in parallel...'); const indexCheckStart = Date.now(); - + const [notesExists, scratchExists, settingsExists] = await Promise.all([ indexExists(NOTE_INDEX), - indexExists(SCRATCH_INDEX), + indexExists(SCRATCH_INDEX), indexExists(SETTINGS_INDEX) ]); - + addDebugInfo(`All index checks completed: ${Date.now() - indexCheckStart}ms`); - + // Create missing indexes const createPromises = []; if (!notesExists) { @@ -1375,7 +1376,7 @@ ${content}${context}`; }), }, 'Create Notes Index')); } - + if (!scratchExists) { addDebugInfo('Creating scratch index...'); createPromises.push(fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes`, { @@ -1390,7 +1391,7 @@ ${content}${context}`; }), }, 'Create Scratch Index')); } - + if (!settingsExists) { addDebugInfo('Creating settings index...'); createPromises.push(fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes`, { @@ -1405,7 +1406,7 @@ ${content}${context}`; }), }, 'Create Settings Index')); } - + if (createPromises.length > 0) { await Promise.all(createPromises); addDebugInfo('All missing indexes created'); @@ -1414,7 +1415,7 @@ ${content}${context}`; // Configure all indexes in parallel addDebugInfo('Configuring all indexes in parallel...'); const configStart = Date.now(); - + await Promise.all([ // Notes index configurations fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes/${NOTE_INDEX}/settings/sortable-attributes`, { @@ -1425,7 +1426,7 @@ ${content}${context}`; }, body: JSON.stringify(['date']), }, 'Configure Notes Sortable Attributes'), - + fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes/${NOTE_INDEX}/settings/ranking-rules`, { method: 'PUT', headers: { @@ -1434,7 +1435,7 @@ ${content}${context}`; }, body: JSON.stringify(['sort', 'words', 'typo', 'proximity', 'attribute', 'exactness']), }, 'Configure Notes Ranking Rules'), - + fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes/${NOTE_INDEX}/settings/filterable-attributes`, { method: 'PUT', headers: { @@ -1443,7 +1444,7 @@ ${content}${context}`; }, body: JSON.stringify(['date', 'topLetter', 'letterCount', 'topLetterFrequency', 'tags']), }, 'Configure Notes Filterable Attributes'), - + // Scratch index configurations fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes/${SCRATCH_INDEX}/settings/sortable-attributes`, { method: 'PUT', @@ -1453,7 +1454,7 @@ ${content}${context}`; }, body: JSON.stringify(['date']), }, 'Configure Scratch Sortable Attributes'), - + fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes/${SCRATCH_INDEX}/settings/filterable-attributes`, { method: 'PUT', headers: { @@ -1462,7 +1463,7 @@ ${content}${context}`; }, body: JSON.stringify(['date']), }, 'Configure Scratch Filterable Attributes'), - + // Settings index configurations fetchWithTiming(`${MEILISEARCH_ENDPOINT}/indexes/${SETTINGS_INDEX}/settings/filterable-attributes`, { method: 'PUT', @@ -1473,7 +1474,7 @@ ${content}${context}`; body: JSON.stringify(['key', 'value']), }, 'Configure Settings Filterable Attributes'), ]); - + addDebugInfo(`All index configurations completed: ${Date.now() - configStart}ms`); setIsInitialized(true); @@ -1512,7 +1513,7 @@ ${content}${context}`; currentNoteRef.current?.focus(); console.log('Focus set on current note field'); }, 100); - + return () => clearTimeout(focusTimer); }, []); @@ -1530,7 +1531,7 @@ ${content}${context}`; const dataLoadStartTime = Date.now(); console.log('Starting data loading...'); addDebugInfo('Starting data loading...'); - + await loadNotes(); await loadLatestScratch(); await loadFontSizeSetting(); @@ -1539,7 +1540,7 @@ ${content}${context}`; await loadContextSizeSetting(); await loadIncludeTagsSetting(); await checkOllamaStatus(); - + // Retry Ollama connection after a delay if it failed setTimeout(async () => { if (ollamaStatus === 'offline') { @@ -1547,12 +1548,12 @@ ${content}${context}`; await checkOllamaStatus(); } }, 2000); - + const totalTime = Date.now() - dataLoadStartTime; debugTiming('Total Data Loading', dataLoadStartTime); addDebugInfo(`Total Data Loading: ${totalTime}ms`); console.log('Data loading complete'); - + // Re-focus after data loading to ensure focus is maintained currentNoteRef.current?.focus(); } @@ -1934,19 +1935,19 @@ ${content}${context}`; Cleanup - -