import { useCallback, useEffect, useRef, useState } from "preact/hooks"; import type { LogLine } from "../types"; interface Props { lines: LogLine[]; disabled: boolean; onSendMessage(text: string): Promise; onExpandChange?(expanded: boolean): void; } interface LogViewProps { lines: LogLine[]; scrollRef: { current: HTMLElement | null }; } function SendIcon() { return ( ); } function CloseIcon() { return ( ); } function formatLine(line: LogLine): string { const time = line.timestamp ? new Date(line.timestamp).toLocaleTimeString() : ""; const role = line.role.trim().toLowerCase(); if (role === "nanobot") { return `[${time}] ${line.text.replace(/^(?:nanobot|napbot)\b\s*[:>-]?\s*/i, "")}`; } if (role === "tool") { return `[${time}] tool: ${line.text}`; } return `[${time}] ${line.role}: ${line.text}`; } function LogCompose({ disabled, sending, text, setText, onClose, onSend, }: { disabled: boolean; sending: boolean; text: string; setText(value: string): void; onClose(): void; onSend(): void; }) { const onKeyDown = useCallback( (e: KeyboardEvent) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); onSend(); } if (e.key === "Escape") { e.preventDefault(); onClose(); } }, [onClose, onSend], ); return (