veryfront 0.0.71 → 0.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -314,7 +314,7 @@ var ToolInvocation = React5.forwardRef(({ className, name, input, output: _outpu
314
314
  ] }),
315
315
  dynamic && /* @__PURE__ */ jsx5("span", { "data-tool-dynamic": "", children: "[dynamic]" })
316
316
  ] }),
317
- input && /* @__PURE__ */ jsx5("div", { "data-tool-input": "", children: /* @__PURE__ */ jsx5("pre", { children: JSON.stringify(input, null, 2) }) }),
317
+ input !== void 0 && /* @__PURE__ */ jsx5("div", { "data-tool-input": "", children: /* @__PURE__ */ jsx5("pre", { children: JSON.stringify(input, null, 2) }) }),
318
318
  errorText && /* @__PURE__ */ jsx5("div", { "data-tool-error": "", children: errorText }),
319
319
  children
320
320
  ]
@@ -338,6 +338,9 @@ var ToolResult = React5.forwardRef(
338
338
  }
339
339
  );
340
340
  ToolResult.displayName = "ToolResult";
341
+ function isDynamicTool(tool) {
342
+ return tool.type === "dynamic-tool";
343
+ }
341
344
  var ToolList = React5.forwardRef(
342
345
  ({ className, tools, renderTool, ...props }, ref) => {
343
346
  return /* @__PURE__ */ jsx5(
@@ -355,7 +358,7 @@ var ToolList = React5.forwardRef(
355
358
  input: tool.input,
356
359
  state: tool.state,
357
360
  errorText: tool.errorText,
358
- dynamic: tool.type === "dynamic-tool",
361
+ dynamic: isDynamicTool(tool),
359
362
  children: tool.output !== void 0 && /* @__PURE__ */ jsx5(ToolResult, { output: tool.output })
360
363
  },
361
364
  tool.toolCallId
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/react/primitives/chat-container.tsx", "../../../src/ai/react/primitives/message-list.tsx", "../../../src/ai/react/primitives/input-box.tsx", "../../../src/ai/react/primitives/agent-primitives.tsx", "../../../src/ai/react/primitives/tool-primitives.tsx"],
4
- "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { UIMessage } from \"../hooks/index.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: UIMessage[\"role\"];\n\n /** Message content (can be children or prop) - deprecated, use children with parts */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading/streaming state - shows stop button */\n isLoading?: boolean;\n\n /** Whether input has text - determines voice vs submit icon */\n hasInput?: boolean;\n\n /** Handler for stop action */\n onStop?: () => void;\n\n /** Handler for voice input */\n onVoice?: () => void;\n\n /** Custom icons */\n icons?: {\n submit?: React.ReactNode;\n stop?: React.ReactNode;\n voice?: React.ReactNode;\n };\n\n children?: React.ReactNode;\n}\n\n/** Default submit icon (paper plane) */\nconst SubmitIcon = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n);\n\n/** Default stop icon (square) */\nconst StopIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n\n/** Default voice icon (microphone) */\nconst VoiceIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n);\n\n/**\n * SubmitButton - Smart submit button with three states\n *\n * States:\n * 1. **Voice** (no input): Shows microphone icon, triggers onVoice\n * 2. **Submit** (has input): Shows arrow icon, submits form\n * 3. **Stop** (loading): Shows stop icon, triggers onStop\n *\n * @example\n * ```tsx\n * <SubmitButton\n * hasInput={!!input.trim()}\n * isLoading={isLoading}\n * onStop={stop}\n * onVoice={() => console.log('Voice input')}\n * className=\"w-9 h-9 bg-blue-500 text-white rounded-full\"\n * />\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>((\n { className, isLoading, hasInput, onStop, onVoice, icons, disabled, children, ...props },\n ref,\n) => {\n // Determine button state and behavior\n const showStop = isLoading;\n const showVoice = !isLoading && !hasInput && onVoice;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (showStop && onStop) {\n e.preventDefault();\n onStop();\n } else if (showVoice && onVoice) {\n e.preventDefault();\n onVoice();\n }\n // For submit, let form handle it naturally\n };\n\n // Determine icon to show\n let icon: React.ReactNode;\n let ariaLabel: string;\n\n if (showStop) {\n icon = icons?.stop || <StopIcon />;\n ariaLabel = \"Stop generating\";\n } else if (showVoice) {\n icon = icons?.voice || <VoiceIcon />;\n ariaLabel = \"Voice input\";\n } else {\n icon = icons?.submit || <SubmitIcon />;\n ariaLabel = \"Send message\";\n }\n\n return (\n <button\n ref={ref}\n type={showStop || showVoice ? \"button\" : \"submit\"}\n className={className}\n disabled={disabled && !showStop}\n onClick={handleClick}\n data-submit-button=\"\"\n data-state={showStop ? \"stop\" : showVoice ? \"voice\" : \"submit\"}\n data-loading={isLoading}\n aria-label={ariaLabel}\n {...props}\n >\n {children || icon}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Supports both regular tools and dynamic tools (MCP, user-defined).\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { DynamicToolUIPart, ToolState, ToolUIPart } from \"../hooks/index.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool input */\n input?: unknown;\n\n /** Tool output */\n output?: unknown;\n\n /** Tool state (v5 format) */\n state?: ToolState;\n\n /** Error text if tool failed */\n errorText?: string;\n\n /** Whether this is a dynamic tool (MCP, user-defined) */\n dynamic?: boolean;\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={part.toolName}\n * input={part.input}\n * state={part.state}\n * dynamic={part.type === 'dynamic-tool'}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult output={part.output} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>((\n { className, name, input, output: _output, state, errorText, dynamic, children, ...props },\n ref,\n) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-state={state}\n data-dynamic={dynamic || undefined}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {state && <span data-tool-state=\"\">({state})</span>}\n {dynamic && <span data-tool-dynamic=\"\">[dynamic]</span>}\n </div>\n\n {input && (\n <div data-tool-input=\"\">\n <pre>{JSON.stringify(input, null, 2)}</pre>\n </div>\n )}\n\n {errorText && (\n <div data-tool-error=\"\">\n {errorText}\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool output data */\n output: unknown;\n\n /** Custom renderer */\n renderOutput?: (output: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolResult\n * output={part.output}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, output, renderOutput, ...props }, ref) => {\n const content = renderOutput ? renderOutput(output) : JSON.stringify(output, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\n/** Union type for both tool types from v5 parts */\ntype ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool parts to display (v5 format) */\n tools: ToolPart[];\n\n /** Render each tool */\n renderTool?: (tool: ToolPart) => React.ReactNode;\n}\n\n/**\n * ToolList - Display list of tool calls (v5 compatible)\n *\n * @example\n * ```tsx\n * const toolParts = message.parts.filter(\n * p => p.type === 'tool-call' || p.type === 'dynamic-tool'\n * );\n *\n * <ToolList\n * tools={toolParts}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation\n * name={tool.toolName}\n * state={tool.state}\n * dynamic={tool.type === 'dynamic-tool'}\n * >\n * {tool.output && <ToolResult output={tool.output} />}\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, tools, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {tools.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.toolCallId}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.toolCallId}\n name={tool.toolName}\n input={tool.input}\n state={tool.state}\n errorText={tool.errorText}\n dynamic={tool.type === \"dynamic-tool\"}\n >\n {tool.output !== undefined && <ToolResult output={tool.output} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { UIMessage } from \"../hooks/index.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: UIMessage[\"role\"];\n\n /** Message content (can be children or prop) - deprecated, use children with parts */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading/streaming state - shows stop button */\n isLoading?: boolean;\n\n /** Whether input has text - determines voice vs submit icon */\n hasInput?: boolean;\n\n /** Handler for stop action */\n onStop?: () => void;\n\n /** Handler for voice input */\n onVoice?: () => void;\n\n /** Custom icons */\n icons?: {\n submit?: React.ReactNode;\n stop?: React.ReactNode;\n voice?: React.ReactNode;\n };\n\n children?: React.ReactNode;\n}\n\n/** Default submit icon (paper plane) */\nconst SubmitIcon = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n);\n\n/** Default stop icon (square) */\nconst StopIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n\n/** Default voice icon (microphone) */\nconst VoiceIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n);\n\n/**\n * SubmitButton - Smart submit button with three states\n *\n * States:\n * 1. **Voice** (no input): Shows microphone icon, triggers onVoice\n * 2. **Submit** (has input): Shows arrow icon, submits form\n * 3. **Stop** (loading): Shows stop icon, triggers onStop\n *\n * @example\n * ```tsx\n * <SubmitButton\n * hasInput={!!input.trim()}\n * isLoading={isLoading}\n * onStop={stop}\n * onVoice={() => console.log('Voice input')}\n * className=\"w-9 h-9 bg-blue-500 text-white rounded-full\"\n * />\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>((\n { className, isLoading, hasInput, onStop, onVoice, icons, disabled, children, ...props },\n ref,\n) => {\n // Determine button state and behavior\n const showStop = isLoading;\n const showVoice = !isLoading && !hasInput && onVoice;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (showStop && onStop) {\n e.preventDefault();\n onStop();\n } else if (showVoice && onVoice) {\n e.preventDefault();\n onVoice();\n }\n // For submit, let form handle it naturally\n };\n\n // Determine icon to show\n let icon: React.ReactNode;\n let ariaLabel: string;\n\n if (showStop) {\n icon = icons?.stop || <StopIcon />;\n ariaLabel = \"Stop generating\";\n } else if (showVoice) {\n icon = icons?.voice || <VoiceIcon />;\n ariaLabel = \"Voice input\";\n } else {\n icon = icons?.submit || <SubmitIcon />;\n ariaLabel = \"Send message\";\n }\n\n return (\n <button\n ref={ref}\n type={showStop || showVoice ? \"button\" : \"submit\"}\n className={className}\n disabled={disabled && !showStop}\n onClick={handleClick}\n data-submit-button=\"\"\n data-state={showStop ? \"stop\" : showVoice ? \"voice\" : \"submit\"}\n data-loading={isLoading}\n aria-label={ariaLabel}\n {...props}\n >\n {children || icon}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Supports both regular tools and dynamic tools (MCP, user-defined).\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { DynamicToolUIPart, ToolState, ToolUIPart } from \"../hooks/index.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool input */\n input?: unknown;\n\n /** Tool output */\n output?: unknown;\n\n /** Tool state (v5 format) */\n state?: ToolState;\n\n /** Error text if tool failed */\n errorText?: string;\n\n /** Whether this is a dynamic tool (MCP, user-defined) */\n dynamic?: boolean;\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={part.toolName}\n * input={part.input}\n * state={part.state}\n * dynamic={part.type === 'dynamic-tool'}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult output={part.output} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>((\n { className, name, input, output: _output, state, errorText, dynamic, children, ...props },\n ref,\n) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-state={state}\n data-dynamic={dynamic || undefined}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {state && <span data-tool-state=\"\">({state})</span>}\n {dynamic && <span data-tool-dynamic=\"\">[dynamic]</span>}\n </div>\n\n {input !== undefined && (\n <div data-tool-input=\"\">\n <pre>{JSON.stringify(input, null, 2)}</pre>\n </div>\n )}\n\n {errorText && (\n <div data-tool-error=\"\">\n {errorText}\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool output data */\n output: unknown;\n\n /** Custom renderer */\n renderOutput?: (output: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolResult\n * output={part.output}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, output, renderOutput, ...props }, ref) => {\n const content = renderOutput ? renderOutput(output) : JSON.stringify(output, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\n/** Union type for both tool types from v5 parts */\ntype ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool parts to display (v5 format) */\n tools: ToolPart[];\n\n /** Render each tool */\n renderTool?: (tool: ToolPart) => React.ReactNode;\n}\n\n/**\n * Check if a part is a dynamic tool\n */\nfunction isDynamicTool(tool: ToolPart): tool is DynamicToolUIPart {\n return tool.type === \"dynamic-tool\";\n}\n\n/**\n * ToolList - Display list of tool calls (v5 compatible)\n *\n * @example\n * ```tsx\n * // Filter tool parts - matches tool-${toolName} pattern (AI SDK v5) and dynamic-tool\n * const toolParts = message.parts.filter(\n * p => p.type.startsWith('tool-') || p.type === 'dynamic-tool'\n * );\n *\n * <ToolList\n * tools={toolParts}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation\n * name={tool.toolName}\n * state={tool.state}\n * dynamic={tool.type === 'dynamic-tool'}\n * >\n * {tool.output && <ToolResult output={tool.output} />}\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, tools, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {tools.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.toolCallId}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.toolCallId}\n name={tool.toolName}\n input={tool.input}\n state={tool.state}\n errorText={tool.errorText}\n dynamic={isDynamicTool(tool)}\n >\n {tool.output !== undefined && <ToolResult output={tool.output} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "jsx", "React", "jsx", "React", "jsx", "React", "jsx", "jsxs"]
7
7
  }
package/dist/ai/react.js CHANGED
@@ -54,7 +54,8 @@ function useChat(options) {
54
54
  (prev) => prev.map((msg) => ({
55
55
  ...msg,
56
56
  parts: msg.parts.map((part) => {
57
- if (part.type === "tool-call" && part.toolCallId === output.toolCallId) {
57
+ const isToolPart = part.type.startsWith("tool-") || part.type === "dynamic-tool";
58
+ if (isToolPart && "toolCallId" in part && part.toolCallId === output.toolCallId) {
58
59
  return {
59
60
  ...part,
60
61
  state: output.state || "output-available",
@@ -219,44 +220,57 @@ async function handleStreamingResponse(body, callbacks) {
219
220
  const toolCalls = /* @__PURE__ */ new Map();
220
221
  const reasoningBlocks = /* @__PURE__ */ new Map();
221
222
  const messageParts = [];
223
+ let partOrderCounter = 0;
222
224
  const buildCurrentParts = () => {
223
- const parts = [];
225
+ const orderedParts = [];
224
226
  for (const [, block] of textBlocks) {
225
- if (block.text) {
226
- parts.push({ type: "text", text: block.text, state: block.state });
227
+ if (block.text && block.order !== null) {
228
+ orderedParts.push({
229
+ order: block.order,
230
+ part: { type: "text", text: block.text, state: block.state }
231
+ });
227
232
  }
228
233
  }
229
234
  for (const [, reasoning] of reasoningBlocks) {
230
- parts.push({
231
- type: "reasoning",
232
- text: reasoning.text,
233
- state: reasoning.isComplete ? "done" : "streaming"
235
+ orderedParts.push({
236
+ order: reasoning.order,
237
+ part: {
238
+ type: "reasoning",
239
+ text: reasoning.text,
240
+ state: reasoning.isComplete ? "done" : "streaming"
241
+ }
234
242
  });
235
243
  }
236
244
  for (const [, tool] of toolCalls) {
237
245
  if (tool.dynamic) {
238
- parts.push({
239
- type: "dynamic-tool",
240
- toolCallId: tool.toolCallId,
241
- toolName: tool.toolName,
242
- state: tool.state,
243
- input: tool.input,
244
- output: tool.output,
245
- errorText: tool.error
246
+ orderedParts.push({
247
+ order: tool.order,
248
+ part: {
249
+ type: "dynamic-tool",
250
+ toolCallId: tool.toolCallId,
251
+ toolName: tool.toolName,
252
+ state: tool.state,
253
+ input: tool.input,
254
+ output: tool.output,
255
+ errorText: tool.error
256
+ }
246
257
  });
247
258
  } else {
248
- parts.push({
249
- type: "tool-call",
250
- toolCallId: tool.toolCallId,
251
- toolName: tool.toolName,
252
- state: tool.state,
253
- input: tool.input,
254
- output: tool.output,
255
- errorText: tool.error
259
+ orderedParts.push({
260
+ order: tool.order,
261
+ part: {
262
+ type: `tool-${tool.toolName}`,
263
+ toolCallId: tool.toolCallId,
264
+ toolName: tool.toolName,
265
+ state: tool.state,
266
+ input: tool.input,
267
+ output: tool.output,
268
+ errorText: tool.error
269
+ }
256
270
  });
257
271
  }
258
272
  }
259
- return parts;
273
+ return orderedParts.sort((a, b) => a.order - b.order).map((p) => p.part);
260
274
  };
261
275
  while (true) {
262
276
  const { done, value } = await reader.read();
@@ -284,17 +298,20 @@ async function handleStreamingResponse(body, callbacks) {
284
298
  break;
285
299
  case "text-start":
286
300
  currentTextId = parsed.id || generateClientId("text");
287
- textBlocks.set(currentTextId, { text: "", state: "streaming" });
301
+ textBlocks.set(currentTextId, { text: "", state: "streaming", order: null });
288
302
  break;
289
303
  case "text-delta": {
290
304
  const textId = parsed.id || currentTextId || "default";
291
- const delta = parsed.delta || "";
305
+ const delta = parsed.textDelta || parsed.delta || "";
292
306
  if (!textBlocks.has(textId)) {
293
- textBlocks.set(textId, { text: "", state: "streaming" });
307
+ textBlocks.set(textId, { text: "", state: "streaming", order: null });
294
308
  currentTextId = textId;
295
309
  }
296
310
  const block = textBlocks.get(textId);
297
311
  block.text += delta;
312
+ if (block.order === null) {
313
+ block.order = partOrderCounter++;
314
+ }
298
315
  onUpdate?.(buildCurrentParts(), messageId);
299
316
  break;
300
317
  }
@@ -316,7 +333,8 @@ async function handleStreamingResponse(body, callbacks) {
316
333
  toolName: parsed.toolName || "unknown",
317
334
  inputText: "",
318
335
  state: "input-streaming",
319
- dynamic: parsed.dynamic === true
336
+ dynamic: parsed.dynamic === true,
337
+ order: partOrderCounter++
320
338
  };
321
339
  toolCalls.set(toolCallId, toolCall);
322
340
  onUpdate?.(buildCurrentParts(), messageId);
@@ -349,13 +367,21 @@ async function handleStreamingResponse(body, callbacks) {
349
367
  dynamic: toolCall.dynamic
350
368
  }
351
369
  });
352
- messageParts.push({
353
- type: toolCall.dynamic ? "dynamic-tool" : "tool-call",
354
- toolCallId,
355
- toolName: toolCall.toolName,
356
- state: "input-available",
357
- input: toolCall.input
358
- });
370
+ messageParts.push(
371
+ toolCall.dynamic ? {
372
+ type: "dynamic-tool",
373
+ toolCallId,
374
+ toolName: toolCall.toolName,
375
+ state: "input-available",
376
+ input: toolCall.input
377
+ } : {
378
+ type: `tool-${toolCall.toolName}`,
379
+ toolCallId,
380
+ toolName: toolCall.toolName,
381
+ state: "input-available",
382
+ input: toolCall.input
383
+ }
384
+ );
359
385
  onUpdate?.(buildCurrentParts(), messageId);
360
386
  }
361
387
  break;
@@ -407,7 +433,8 @@ async function handleStreamingResponse(body, callbacks) {
407
433
  const reasoning = {
408
434
  id: reasoningId,
409
435
  text: "",
410
- isComplete: false
436
+ isComplete: false,
437
+ order: partOrderCounter++
411
438
  };
412
439
  reasoningBlocks.set(reasoningId, reasoning);
413
440
  onUpdate?.(buildCurrentParts(), messageId);
@@ -437,8 +464,9 @@ async function handleStreamingResponse(body, callbacks) {
437
464
  break;
438
465
  }
439
466
  case "finish": {
440
- if (messageParts.length > 0 || textBlocks.size > 0) {
441
- onMessage(createAssistantMessage(messageId, messageParts));
467
+ const finalParts = buildCurrentParts();
468
+ if (finalParts.length > 0) {
469
+ onMessage(createAssistantMessage(messageId, finalParts));
442
470
  }
443
471
  break;
444
472
  }