Expose UI logger controls globally

This commit is contained in:
Shantur Rathore
2025-12-06 12:17:33 +00:00
parent 2b27790a81
commit e345dc1262
3 changed files with 40 additions and 14 deletions

View File

@@ -41,14 +41,13 @@ The UI now routes all logging through a lightweight wrapper around [`debug`](htt
- `session` Session/model state, prompt handling, tool calls - `session` Session/model state, prompt handling, tool calls
- `actions` User-driven interactions in UI components - `actions` User-driven interactions in UI components
You can enable or disable namespaces inside DevTools by importing the helpers: You can enable or disable namespaces from DevTools (in dev or production builds) via the global `window.codenomadLogger` helpers:
```ts ```js
import { listLoggerNamespaces, enableLogger, disableLogger } from "./src/lib/logger" window.codenomadLogger?.listLoggerNamespaces() // => [{ name: "sse", enabled: false }, ...]
window.codenomadLogger?.enableLogger("sse") // turn on SSE logs
listLoggerNamespaces() // => [{ name: "sse", enabled: false }, ...] window.codenomadLogger?.disableLogger("sse") // turn them off again
enableLogger("sse") // turn on SSE logs window.codenomadLogger?.enableAllLoggers() // optional helper
disableLogger("sse") // turn them off again
``` ```
Enabled namespaces are persisted in `localStorage` under `opencode:logger:namespaces`, so your preference survives reloads. Enabled namespaces are persisted in `localStorage` under `opencode:logger:namespaces`, so your preference survives reloads.

View File

@@ -9,11 +9,19 @@ interface Logger {
error: (...args: unknown[]) => void error: (...args: unknown[]) => void
} }
interface NamespaceState { export interface NamespaceState {
name: LoggerNamespace name: LoggerNamespace
enabled: boolean enabled: boolean
} }
export interface LoggerControls {
listLoggerNamespaces: () => NamespaceState[]
enableLogger: (namespace: LoggerNamespace) => void
disableLogger: (namespace: LoggerNamespace) => void
enableAllLoggers: () => void
disableAllLoggers: () => void
}
const KNOWN_NAMESPACES: LoggerNamespace[] = ["sse", "api", "session", "actions"] const KNOWN_NAMESPACES: LoggerNamespace[] = ["sse", "api", "session", "actions"]
const STORAGE_KEY = "opencode:logger:namespaces" const STORAGE_KEY = "opencode:logger:namespaces"
@@ -118,6 +126,21 @@ function enableAllLoggers(): void {
applyEnabledNamespaces() applyEnabledNamespaces()
} }
const loggerControls: LoggerControls = {
listLoggerNamespaces,
enableLogger,
disableLogger,
enableAllLoggers,
disableAllLoggers,
}
function exposeLoggerControls(): void {
if (typeof window === "undefined") return
window.codenomadLogger = loggerControls
}
exposeLoggerControls()
export { export {
getLogger, getLogger,
listLoggerNamespaces, listLoggerNamespaces,

View File

@@ -1,5 +1,7 @@
export {} export {}
import type { LoggerControls } from "../lib/logger"
declare global { declare global {
interface ElectronDialogFilter { interface ElectronDialogFilter {
name?: string name?: string
@@ -37,10 +39,12 @@ declare global {
} }
interface Window { interface Window {
__CODENOMAD_API_BASE__?: string __CODENOMAD_API_BASE__?: string
__CODENOMAD_EVENTS_URL__?: string __CODENOMAD_EVENTS_URL__?: string
electronAPI?: ElectronAPI electronAPI?: ElectronAPI
__TAURI__?: TauriBridge __TAURI__?: TauriBridge
} codenomadLogger?: LoggerControls
} }
}