feat: WriteDebugLog binding writes frontend logs to <vault>/.verstak/debug.log

- New cmd/verstak-gui/bindings_debug.go: WriteDebugLog(msg) appends a
  timestamped line to the vault's .verstak/debug.log
- Frontend: console.log replaced with writeDebugLog() which calls
  wailsCall('WriteDebugLog', ...) — works in production Wails builds
- Both acceptTodaySuggestion and acceptJournalSuggestion log eventIds,
  events, and errors to the file
This commit is contained in:
mirivlad 2026-06-03 17:06:17 +08:00
parent 9338b0a851
commit 3e55b08e6f
4 changed files with 32 additions and 7 deletions

View File

@ -0,0 +1,21 @@
package main
import (
"fmt"
"os"
"path/filepath"
"time"
)
// WriteDebugLog appends a line to <vault>/.verstak/debug.log.
// Called from frontend to log JS-side diagnostics in production GUI builds.
func (a *App) WriteDebugLog(msg string) {
logPath := filepath.Join(a.vault, ".verstak", "debug.log")
line := fmt.Sprintf("[%s] %s\n", time.Now().Format("2006-01-02T15:04:05"), msg)
f, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
if err != nil {
return
}
defer f.Close()
f.WriteString(line)
}

View File

@ -16,7 +16,7 @@
background: #13131f;
}
</style>
<script type="module" crossorigin src="/assets/main-BTm9jSp2.js"></script>
<script type="module" crossorigin src="/assets/main-DctkOBUz.js"></script>
<link rel="stylesheet" crossorigin href="/assets/main-BafVhx43.css">
</head>
<body>

View File

@ -976,24 +976,28 @@
return []
}
function writeDebugLog(msg) {
try { wailsCall('WriteDebugLog', msg) } catch(e) {}
}
async function acceptTodaySuggestion(s) {
try {
const eventIds = extractEventIds(s)
const eventIdsJSON = JSON.stringify(eventIds)
console.log('DEBUG acceptTodaySuggestion:', { nodeId: s.nodeId, eventIds, eventIdsJSON, events: (s.events || []).map(ev => ({ id: ev.id, type: ev.eventType, title: ev.title })) })
writeDebugLog('acceptTodaySuggestion: nodeId=' + s.nodeId + ' eventIds=' + eventIdsJSON + ' events=' + JSON.stringify((s.events || []).map(ev => ({ id: ev.id, type: ev.eventType, title: ev.title }))))
await wailsCall('AcceptSuggestionWith', s.nodeId, s.summary, s.suggestedMin, '', eventIdsJSON)
await refreshAfterSuggestion()
} catch (e) { console.error(e) }
} catch (e) { writeDebugLog('acceptTodaySuggestion error: ' + e) }
}
async function acceptJournalSuggestion(s) {
try {
const eventIds = extractEventIds(s)
const eventIdsJSON = JSON.stringify(eventIds)
console.log('DEBUG acceptJournalSuggestion:', { nodeId: s.nodeId, eventIds, eventIdsJSON, events: (s.events || []).map(ev => ({ id: ev.id, type: ev.eventType, title: ev.title })) })
writeDebugLog('acceptJournalSuggestion: nodeId=' + s.nodeId + ' eventIds=' + eventIdsJSON + ' events=' + JSON.stringify((s.events || []).map(ev => ({ id: ev.id, type: ev.eventType, title: ev.title }))))
await wailsCall('AcceptSuggestionWith', s.nodeId, s.summary, s.suggestedMin, '', eventIdsJSON)
await refreshAfterSuggestion()
} catch (e) { console.error(e) }
} catch (e) { writeDebugLog('acceptJournalSuggestion error: ' + e) }
}
// ===== Journal =====