import { Collapsible } from "@kobalte/core/collapsible" import { type ComponentProps, type JSX, For, Show, createMemo, splitProps } from "solid-js" import { DiffChanges } from "@opencode-ai/ui/v2/diff-changes-v2" import { TextShimmerV2 } from "@opencode-ai/ui/v2/text-shimmer-v2" import "./basic-tool-v2.css" function ChevronIcon() { return ( ) } export interface BasicToolV2TriggerTitle { title: string subtitle?: string args?: string[] changes?: { additions: number; deletions: number } | { additions: number; deletions: number }[] action?: JSX.Element } const isTriggerTitle = (val: unknown): val is BasicToolV2TriggerTitle => typeof val === "object" && val !== null && "title" in val && (typeof Node === "undefined" || !(val instanceof Node)) export interface BasicToolV2Props extends Omit, "children" | "title"> { trigger: BasicToolV2TriggerTitle | JSX.Element children?: JSX.Element status?: string open?: boolean defaultOpen?: boolean onOpenChange?: (open: boolean) => void onSubtitleClick?: () => void } export function BasicToolV2(props: BasicToolV2Props) { const [local, rest] = splitProps(props, [ "trigger", "children", "status", "open", "defaultOpen", "onOpenChange", "onSubtitleClick", "class", "classList", ]) const pending = createMemo(() => local.status === "pending" || local.status === "running") const hasChildren = createMemo(() => { const c = local.children if (c == null) return false return true }) const canExpand = createMemo(() => hasChildren() && !pending()) const handleOpenChange = (value: boolean) => { if (pending()) return local.onOpenChange?.(value) } return (
{(title) => ( <> { if (local.onSubtitleClick) { e.stopPropagation() local.onSubtitleClick() } }} > {title().subtitle} {(arg) => {arg}} {(action) => action()} )}
{local.children}
) }