import { TextAttributes } from "@opentui/core" import { useKeyboard, useTerminalDimensions } from "@opentui/solid" import { createSignal } from "solid-js" import { getScrollAcceleration } from "../util/scroll" import { useClipboard } from "../context/clipboard" import { InstallationVersion } from "@opencode-ai/core/installation/version" import { useExit } from "../context/exit" export function ErrorComponent(props: { error: Error; reset: () => void; mode?: "dark" | "light" }) { const term = useTerminalDimensions() const exit = useExit() const clipboard = useClipboard() useKeyboard((evt) => { if (evt.ctrl && evt.name === "c") { void exit() } }) const [copied, setCopied] = createSignal(false) const issueURL = new URL("https://github.com/anomalyco/opencode/issues/new?template=bug-report.yml") // Choose safe fallback colors per mode since theme context may not be available const isLight = props.mode === "light" const colors = { bg: isLight ? "#ffffff" : "#0a0a0a", text: isLight ? "#1a1a1a" : "#eeeeee", muted: isLight ? "#8a8a8a" : "#808080", primary: isLight ? "#3b7dd8" : "#fab283", } if (props.error.message) { issueURL.searchParams.set("title", `opentui: fatal: ${props.error.message}`) } if (props.error.stack) { issueURL.searchParams.set( "description", "```\n" + props.error.stack.substring(0, 6000 - issueURL.toString().length) + "...\n```", ) } issueURL.searchParams.set("opencode-version", InstallationVersion) const copyIssueURL = () => { void clipboard.write?.(issueURL.toString()).then(() => { setCopied(true) }) } return ( Please report an issue. Copy issue URL (exception info pre-filled) {copied() && Successfully copied} A fatal error occurred! Reset TUI void exit()} backgroundColor={colors.primary} padding={1}> Exit {props.error.stack} {props.error.message} ) }