diff --git a/packages/ui/README.md b/packages/ui/README.md index 2991780b..d59a42d7 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -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 - `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 -import { listLoggerNamespaces, enableLogger, disableLogger } from "./src/lib/logger" - -listLoggerNamespaces() // => [{ name: "sse", enabled: false }, ...] -enableLogger("sse") // turn on SSE logs -disableLogger("sse") // turn them off again +```js +window.codenomadLogger?.listLoggerNamespaces() // => [{ name: "sse", enabled: false }, ...] +window.codenomadLogger?.enableLogger("sse") // turn on SSE logs +window.codenomadLogger?.disableLogger("sse") // turn them off again +window.codenomadLogger?.enableAllLoggers() // optional helper ``` Enabled namespaces are persisted in `localStorage` under `opencode:logger:namespaces`, so your preference survives reloads. diff --git a/packages/ui/src/lib/logger.ts b/packages/ui/src/lib/logger.ts index 3865833e..dd3617ee 100644 --- a/packages/ui/src/lib/logger.ts +++ b/packages/ui/src/lib/logger.ts @@ -9,11 +9,19 @@ interface Logger { error: (...args: unknown[]) => void } -interface NamespaceState { +export interface NamespaceState { name: LoggerNamespace 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 STORAGE_KEY = "opencode:logger:namespaces" @@ -118,6 +126,21 @@ function enableAllLoggers(): void { applyEnabledNamespaces() } +const loggerControls: LoggerControls = { + listLoggerNamespaces, + enableLogger, + disableLogger, + enableAllLoggers, + disableAllLoggers, +} + +function exposeLoggerControls(): void { + if (typeof window === "undefined") return + window.codenomadLogger = loggerControls +} + +exposeLoggerControls() + export { getLogger, listLoggerNamespaces, diff --git a/packages/ui/src/types/global.d.ts b/packages/ui/src/types/global.d.ts index fd7907cf..1bea0793 100644 --- a/packages/ui/src/types/global.d.ts +++ b/packages/ui/src/types/global.d.ts @@ -1,5 +1,7 @@ export {} +import type { LoggerControls } from "../lib/logger" + declare global { interface ElectronDialogFilter { name?: string @@ -37,10 +39,12 @@ declare global { } interface Window { - __CODENOMAD_API_BASE__?: string - __CODENOMAD_EVENTS_URL__?: string - electronAPI?: ElectronAPI - __TAURI__?: TauriBridge - } -} + __CODENOMAD_API_BASE__?: string + __CODENOMAD_EVENTS_URL__?: string + electronAPI?: ElectronAPI + __TAURI__?: TauriBridge + codenomadLogger?: LoggerControls + } + } +