{"version":3,"file":"ToolCall-BXicKrtH.cjs","names":["autoExpanded","ChevronUp","ChevronDown","SquareCode","ChevronDown"],"sources":["../src/components/ToolCall/BehindTheScenes.tsx","../src/components/ToolCall/ToolCall.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport interface BehindTheScenesProps {\n  /** True while the overall message is still streaming */\n  isStreaming?: boolean;\n  /** True once all tool calls have received their arguments back */\n  toolCallsComplete?: boolean;\n  children: React.ReactNode;\n}\n\nexport const BehindTheScenes = ({\n  isStreaming,\n  toolCallsComplete,\n  children,\n}: BehindTheScenesProps) => {\n  // null = auto-managed, boolean = user override\n  const [userOverride, setUserOverride] = useState<boolean | null>(null);\n  // Once tools complete, latch closed — never auto-open again for this message\n  const hasCompletedOnce = useRef(false);\n  const prevStreaming = useRef(isStreaming);\n\n  // Reset everything when a new streaming session starts\n  useEffect(() => {\n    if (isStreaming && !prevStreaming.current) {\n      setUserOverride(null);\n      hasCompletedOnce.current = false;\n    }\n    prevStreaming.current = isStreaming;\n  }, [isStreaming]);\n\n  // Latch: once tool calls complete, remember it forever for this session\n  if (toolCallsComplete && !hasCompletedOnce.current) {\n    hasCompletedOnce.current = true;\n  }\n\n  const toolsActive = !!isStreaming && !hasCompletedOnce.current;\n  const autoExpanded = toolsActive;\n  const isExpanded = userOverride !== null ? userOverride : autoExpanded;\n\n  const toggle = () => {\n    setUserOverride((prev) => (prev !== null ? !prev : !isExpanded));\n  };\n\n  return (\n    <div className=\"openui-behind-the-scenes\">\n      <button className=\"openui-behind-the-scenes__toggle\" onClick={toggle} type=\"button\">\n        {isExpanded ? (\n          <ChevronUp size={14} className=\"openui-behind-the-scenes__toggle-icon\" />\n        ) : (\n          <ChevronDown size={14} className=\"openui-behind-the-scenes__toggle-icon\" />\n        )}\n        {toolsActive ? \"Working...\" : \"Behind the scenes\"}\n      </button>\n      {isExpanded && <div className=\"openui-behind-the-scenes__items\">{children}</div>}\n    </div>\n  );\n};\n","import type { ToolCall } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { ChevronDown, SquareCode } from \"lucide-react\";\nimport { useState } from \"react\";\n\nexport interface ToolCallProps {\n  toolCall: ToolCall;\n  isStreaming?: boolean;\n  /** True once tool work is done (e.g. text content has started rendering) */\n  toolsDone?: boolean;\n  isLast?: boolean;\n  className?: string;\n}\n\nexport const ToolCallComponent = ({\n  toolCall,\n  isStreaming,\n  toolsDone,\n  isLast = false,\n  className,\n}: ToolCallProps) => {\n  const isRunning = !!isStreaming && !toolsDone;\n  const actionLabel = isRunning\n    ? `Calling the ${toolCall.function.name} tool`\n    : `Called the ${toolCall.function.name} tool`;\n\n  let parsedArgs: { _request?: unknown; _response?: unknown } | null = null;\n  try {\n    parsedArgs = JSON.parse(toolCall.function.arguments);\n  } catch {\n    // not parseable yet\n  }\n\n  const hasRequest = parsedArgs && parsedArgs._request != null;\n  const hasResponse = parsedArgs && parsedArgs._response != null;\n  const requestStr = hasRequest ? JSON.stringify(parsedArgs!._request, null, 2) : null;\n  const responseStr = hasResponse ? JSON.stringify(parsedArgs!._response, null, 2) : null;\n\n  const plainArgs =\n    !hasRequest && !hasResponse && toolCall.function.arguments\n      ? (() => {\n          try {\n            return JSON.stringify(JSON.parse(toolCall.function.arguments), null, 2);\n          } catch {\n            return toolCall.function.arguments;\n          }\n        })()\n      : null;\n\n  return (\n    <div className={clsx(\"openui-tool-call\", className)}>\n      <div className=\"openui-tool-call__title-row\">\n        <span\n          className={clsx(\"openui-tool-call__icon-wrapper\", {\n            \"openui-tool-call__icon--blinking\": isRunning && isLast,\n          })}\n        >\n          <SquareCode size={14} className=\"openui-tool-call__icon\" />\n        </span>\n        <span\n          className={clsx(\"openui-tool-call__name\", {\n            \"openui-tool-call__name--shimmer\": isRunning && isLast,\n          })}\n        >\n          {actionLabel}\n        </span>\n      </div>\n      <div\n        className={clsx(\"openui-tool-call__connector\", {\n          \"openui-tool-call__connector--last\": isLast,\n        })}\n      >\n        <div className=\"openui-tool-call__args-block\">\n          {requestStr && (\n            <ToolCodeBlock\n              type=\"request\"\n              code={requestStr}\n              isRunning={isRunning && !hasResponse}\n              toolName={toolCall.function.name}\n            />\n          )}\n          {responseStr && (\n            <ToolCodeBlock\n              type=\"response\"\n              code={responseStr}\n              isRunning={isRunning && isLast}\n              toolName={toolCall.function.name}\n            />\n          )}\n          {plainArgs && (\n            <ToolCodeBlock\n              type=\"request\"\n              code={plainArgs}\n              isRunning={isRunning}\n              toolName={toolCall.function.name}\n            />\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n\n// ── Expandable code block (request / response) ──\n\ninterface ToolCodeBlockProps {\n  type: \"request\" | \"response\";\n  code: string;\n  isRunning?: boolean;\n  toolName: string;\n}\n\nconst ToolCodeBlock = ({ type, code, isRunning = false, toolName }: ToolCodeBlockProps) => {\n  const [isExpanded, setIsExpanded] = useState(false);\n\n  const label = type === \"request\" ? \"Tool Request\" : \"Tool Response\";\n  const runningLabel =\n    type === \"request\"\n      ? `Sending request to ${toolName}...`\n      : `Awaiting response from ${toolName}...`;\n\n  return (\n    <div className=\"openui-tool-code-block\">\n      <button\n        className=\"openui-tool-code-block__header\"\n        onClick={() => setIsExpanded((v) => !v)}\n        type=\"button\"\n      >\n        <span\n          className={clsx(\"openui-tool-code-block__label\", {\n            \"openui-tool-code-block__label--loading\": isRunning,\n          })}\n        >\n          {isRunning ? runningLabel : label}\n        </span>\n        <ChevronDown\n          size={14}\n          className={clsx(\"openui-tool-code-block__chevron\", {\n            \"openui-tool-code-block__chevron--expanded\": isExpanded,\n          })}\n        />\n      </button>\n      {isExpanded && (\n        <div className=\"openui-tool-code-block__content\">\n          <pre className=\"openui-tool-code-block__code\">{code}</pre>\n        </div>\n      )}\n    </div>\n  );\n};\n"],"mappings":"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"}