Files
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

74 lines
2.3 KiB
TypeScript

import { useState, type JSX } from "react";
import type { AgentToolCallVM } from "../contracts/agentToolCallVM";
import { AgentToolCallHeader } from "./AgentToolCallHeader";
import { CollapsibleReveal } from "./CollapsibleReveal";
import { AgentExpandedToolContent } from "./tool-renderers/AgentExpandedToolContent";
import { hasAgentToolContent } from "./tool-renderers/agentToolContentShared";
export interface AgentToolCallCardProps {
call: AgentToolCallVM;
onLinkClick?: (href: string) => void;
defaultExpanded?: boolean;
nonCollapsible?: boolean;
variantClassName?: string;
}
export function AgentToolCallCard({
call,
onLinkClick,
defaultExpanded = false,
nonCollapsible = false,
variantClassName
}: AgentToolCallCardProps): JSX.Element {
"use memo";
const [expanded, setExpanded] = useState(defaultExpanded);
const hasDetail = hasAgentToolContent(call);
const canCollapse = hasDetail && !nonCollapsible;
const ariaLabel = toolCallAriaLabel(call);
return (
<div
className={[
"workspace-agents-status-panel__detail-tool-row",
variantClassName ?? ""
]
.filter(Boolean)
.join(" ")}
>
{canCollapse ? (
<button
type="button"
className="workspace-agents-status-panel__detail-tool-row-head workspace-agents-status-panel__detail-tool-row-head--button"
aria-expanded={expanded}
aria-label={ariaLabel}
onClick={() => setExpanded((value) => !value)}
>
<AgentToolCallHeader call={call} expanded={expanded} hasDetail />
</button>
) : (
<div className="workspace-agents-status-panel__detail-tool-row-head">
<AgentToolCallHeader call={call} expanded={false} hasDetail={false} />
</div>
)}
{hasDetail && nonCollapsible ? (
<AgentExpandedToolContent call={call} onLinkClick={onLinkClick} />
) : null}
{hasDetail && !nonCollapsible ? (
<CollapsibleReveal expanded={expanded}>
<AgentExpandedToolContent call={call} onLinkClick={onLinkClick} />
</CollapsibleReveal>
) : null}
</div>
);
}
function toolCallAriaLabel(call: AgentToolCallVM): string {
return [
call.name,
call.status,
call.compactSummary?.trim() || call.summary.trim()
]
.filter(Boolean)
.join(" ");
}