Add logs tab with real-time server output and consolidate syntax highlighting

- Implement dedicated Logs tab showing stdout/stderr from OpenCode server
- Add log level parsing (INFO, ERROR, WARN, DEBUG) with color coding
- Stream logs from main process to renderer via IPC events
- Persist scroll position and auto-scroll state per instance
- Synchronize instance IDs between renderer and main process
- Consolidate syntax highlighting to single shared highlighter instance
- Optimize markdown rendering with global highlighter initialization
- Fix code block copy button to always appear on right side
- Enable debug logging with --print-logs --log-level DEBUG flags
This commit is contained in:
Shantur Rathore
2025-10-23 11:14:35 +01:00
parent b836086978
commit 3c5c4755b8
13 changed files with 779 additions and 157 deletions

View File

@@ -6,6 +6,8 @@ import InstanceTabs from "./components/instance-tabs"
import SessionTabs from "./components/session-tabs"
import MessageStream from "./components/message-stream"
import PromptInput from "./components/prompt-input"
import LogsView from "./components/logs-view"
import { initMarkdown } from "./lib/markdown"
import {
hasInstances,
isSelectingFolder,
@@ -23,6 +25,7 @@ import {
setActiveInstanceId,
stopInstance,
getActiveInstance,
addLog,
} from "./stores/instances"
import {
getSessions,
@@ -173,6 +176,8 @@ const App: Component = () => {
}
onMount(() => {
initMarkdown(false).catch(console.error)
setupTabKeyboardShortcuts(handleSelectFolder, handleNewSession, handleCloseSession)
window.electronAPI.onNewInstance(() => {
@@ -193,6 +198,10 @@ const App: Component = () => {
console.log("Instance stopped:", id)
updateInstance(id, { status: "stopped" })
})
window.electronAPI.onInstanceLog(({ id, entry }) => {
addLog(id, entry)
})
})
return (
@@ -255,10 +264,7 @@ const App: Component = () => {
</Show>
}
>
<div class="p-4 text-gray-600">
<p class="font-semibold mb-2">Server Logs</p>
<p class="text-sm">Log viewer will be implemented in Task 013</p>
</div>
<LogsView instanceId={instance().id} />
</Show>
</div>
</Show>