diff --git a/main.js b/main.js index 243817f..a9726df 100755 --- a/main.js +++ b/main.js @@ -2442,6 +2442,27 @@ function buildTrayMenu() { } }); + ipcMain.handle('trigger-rewrite-now', async (_e, folderPath) => { + let folders = store.get('folders') || []; + const idx = folders.findIndex(f => f.path === folderPath); + if (idx === -1) return { success: false, error: 'folder not found' }; + const folderObj = folders[idx]; + if (folderObj.needsRelocation) return { success: false, error: 'needs relocation' }; + if (folderObj.rewriteInProgress) return { success: false, error: 'rewrite in progress' }; + if (!folderObj.llmCandidates || !folderObj.llmCandidates.length) return { success: false, error: 'no candidates' }; + + // Reset counters/timers + folderObj.linesChanged = 0; + folderObj.firstCandidateBirthday = Date.now(); + store.set('folders', folders); + + // Fire and forget + runLLMCommitRewrite(folderObj, win).catch(err => { + debug(`[trigger-rewrite-now] Error for ${folderPath}: ${err.message || err}`); + }); + return { success: true }; + }); + diff --git a/preload.js b/preload.js index 464d3d9..d65cff3 100644 --- a/preload.js +++ b/preload.js @@ -66,6 +66,7 @@ contextBridge.exposeInMainWorld('electronAPI', { generateReadme: (folderPath) => ipcRenderer.invoke('generate-readme', folderPath), pushToGitea: (folderPath) => ipcRenderer.invoke('push-to-gitea', folderPath), initRepo: (folderPath) => ipcRenderer.invoke('init-repo', folderPath), + triggerRewriteNow: (folderPath) => ipcRenderer.invoke('trigger-rewrite-now', folderPath), }); ipcRenderer.on('repo-updated', (_e, folder) => { diff --git a/renderer.js b/renderer.js index 11e7023..8ef21f2 100644 --- a/renderer.js +++ b/renderer.js @@ -593,7 +593,7 @@ window.addEventListener('DOMContentLoaded', async () => { alt="In Rewrite Queue" title="In Rewrite Queue" class="paw-queued" - style="pointer-events: none; z-index:10;">` + style="pointer-events: auto; cursor: pointer; z-index:10;">` : '' } `; @@ -688,6 +688,19 @@ window.addEventListener('DOMContentLoaded', async () => { }); }); + // Paw click: manually trigger rewrite for this folder + contentList.querySelectorAll('.paw-queued').forEach(img => { + img.addEventListener('click', async () => { + try { + await window.electronAPI.triggerRewriteNow(folderObj.path); + } catch (e) { + console.error('Manual rewrite trigger error:', e); + } finally { + await renderContent(folderObj, currentPage); + } + }); + }); + // Copy-Diff-Button contentList.querySelectorAll('.diff-container').forEach(container => { const btn = container.querySelector('.copy-diff-btn');