veryfront 0.0.70 → 0.0.71

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.
@@ -293,7 +293,7 @@ function formatStatus(status) {
293
293
  // src/ai/react/primitives/tool-primitives.tsx
294
294
  import * as React5 from "react";
295
295
  import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
296
- var ToolInvocation = React5.forwardRef(({ className, name, args, status, children, ...props }, ref) => {
296
+ var ToolInvocation = React5.forwardRef(({ className, name, input, output: _output, state, errorText, dynamic, children, ...props }, ref) => {
297
297
  return /* @__PURE__ */ jsxs2(
298
298
  "div",
299
299
  {
@@ -301,18 +301,21 @@ var ToolInvocation = React5.forwardRef(({ className, name, args, status, childre
301
301
  className,
302
302
  "data-tool-invocation": "",
303
303
  "data-tool-name": name,
304
- "data-status": status,
304
+ "data-state": state,
305
+ "data-dynamic": dynamic || void 0,
305
306
  ...props,
306
307
  children: [
307
308
  /* @__PURE__ */ jsxs2("div", { "data-tool-header": "", children: [
308
309
  /* @__PURE__ */ jsx5("span", { "data-tool-name": "", children: name }),
309
- status && /* @__PURE__ */ jsxs2("span", { "data-tool-status": "", children: [
310
+ state && /* @__PURE__ */ jsxs2("span", { "data-tool-state": "", children: [
310
311
  "(",
311
- status,
312
+ state,
312
313
  ")"
313
- ] })
314
+ ] }),
315
+ dynamic && /* @__PURE__ */ jsx5("span", { "data-tool-dynamic": "", children: "[dynamic]" })
314
316
  ] }),
315
- args && /* @__PURE__ */ jsx5("div", { "data-tool-args": "", children: /* @__PURE__ */ jsx5("pre", { children: JSON.stringify(args, null, 2) }) }),
317
+ input && /* @__PURE__ */ jsx5("div", { "data-tool-input": "", children: /* @__PURE__ */ jsx5("pre", { children: JSON.stringify(input, null, 2) }) }),
318
+ errorText && /* @__PURE__ */ jsx5("div", { "data-tool-error": "", children: errorText }),
316
319
  children
317
320
  ]
318
321
  }
@@ -320,8 +323,8 @@ var ToolInvocation = React5.forwardRef(({ className, name, args, status, childre
320
323
  });
321
324
  ToolInvocation.displayName = "ToolInvocation";
322
325
  var ToolResult = React5.forwardRef(
323
- ({ className, result, renderResult, ...props }, ref) => {
324
- const content = renderResult ? renderResult(result) : JSON.stringify(result, null, 2);
326
+ ({ className, output, renderOutput, ...props }, ref) => {
327
+ const content = renderOutput ? renderOutput(output) : JSON.stringify(output, null, 2);
325
328
  return /* @__PURE__ */ jsx5(
326
329
  "div",
327
330
  {
@@ -336,7 +339,7 @@ var ToolResult = React5.forwardRef(
336
339
  );
337
340
  ToolResult.displayName = "ToolResult";
338
341
  var ToolList = React5.forwardRef(
339
- ({ className, toolCalls, renderTool, ...props }, ref) => {
342
+ ({ className, tools, renderTool, ...props }, ref) => {
340
343
  return /* @__PURE__ */ jsx5(
341
344
  "div",
342
345
  {
@@ -344,16 +347,18 @@ var ToolList = React5.forwardRef(
344
347
  className,
345
348
  "data-tool-list": "",
346
349
  ...props,
347
- children: toolCalls.map(
348
- (tool) => renderTool ? /* @__PURE__ */ jsx5(React5.Fragment, { children: renderTool(tool) }, tool.id) : /* @__PURE__ */ jsx5(
350
+ children: tools.map(
351
+ (tool) => renderTool ? /* @__PURE__ */ jsx5(React5.Fragment, { children: renderTool(tool) }, tool.toolCallId) : /* @__PURE__ */ jsx5(
349
352
  ToolInvocation,
350
353
  {
351
- name: tool.name,
352
- args: tool.args,
353
- status: tool.status,
354
- children: tool.result !== void 0 && /* @__PURE__ */ jsx5(ToolResult, { result: tool.result })
354
+ name: tool.toolName,
355
+ input: tool.input,
356
+ state: tool.state,
357
+ errorText: tool.errorText,
358
+ dynamic: tool.type === "dynamic-tool",
359
+ children: tool.output !== void 0 && /* @__PURE__ */ jsx5(ToolResult, { output: tool.output })
355
360
  },
356
- tool.id
361
+ tool.toolCallId
357
362
  )
358
363
  )
359
364
  }
@@ -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 { Message } from \"../../types/agent.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: Message[\"role\"];\n\n /** Message content (can be children or prop) */\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 * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { ToolCall } from \"../../types/agent.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool arguments */\n args?: Record<string, unknown>;\n\n /** Tool status */\n status?: ToolCall[\"status\"];\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={tool.name}\n * args={tool.args}\n * status={tool.status}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>(({ className, name, args, status, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-status={status}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {status && <span data-tool-status=\"\">({status})</span>}\n </div>\n\n {args && (\n <div data-tool-args=\"\">\n <pre>{JSON.stringify(args, null, 2)}</pre>\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool result data */\n result: unknown;\n\n /** Custom renderer */\n renderResult?: (result: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display\n *\n * @example\n * ```tsx\n * <ToolResult\n * result={tool.result}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, result, renderResult, ...props }, ref) => {\n const content = renderResult ? renderResult(result) : JSON.stringify(result, 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\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool calls to display */\n toolCalls: ToolCall[];\n\n /** Render each tool */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * ToolList - Display list of tool calls\n *\n * @example\n * ```tsx\n * <ToolList\n * toolCalls={agent.toolCalls}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation {...tool}>\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, toolCalls, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {toolCalls.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.id}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.id}\n name={tool.name}\n args={tool.args}\n status={tool.status}\n >\n {tool.result !== undefined && <ToolResult result={tool.result} />}\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 && (\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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",
6
6
  "names": ["React", "jsx", "React", "jsx", "React", "jsx", "React", "jsx", "jsxs"]
7
7
  }
package/dist/ai/react.js CHANGED
@@ -103,11 +103,12 @@ function useChat(options) {
103
103
  if (response.body) {
104
104
  const streamingMessageId = generateClientId("msg");
105
105
  let hasAddedStreamingMessage = false;
106
+ let currentMessageId = streamingMessageId;
106
107
  await handleStreamingResponse(response.body, {
107
108
  onMessage: (assistantMessage) => {
108
109
  setMessages((prev) => {
109
110
  if (hasAddedStreamingMessage) {
110
- return prev.map((m) => m.id === streamingMessageId ? assistantMessage : m);
111
+ return prev.map((m) => m.id === currentMessageId ? assistantMessage : m);
111
112
  }
112
113
  return [...prev, assistantMessage];
113
114
  });
@@ -116,6 +117,14 @@ function useChat(options) {
116
117
  onData: setData,
117
118
  onUpdate: (parts, messageId) => {
118
119
  const id = messageId || streamingMessageId;
120
+ if (messageId && messageId !== currentMessageId) {
121
+ const oldId = currentMessageId;
122
+ currentMessageId = messageId;
123
+ if (hasAddedStreamingMessage) {
124
+ setMessages((prev) => prev.map((m) => m.id === oldId ? { ...m, id, parts } : m));
125
+ return;
126
+ }
127
+ }
119
128
  if (!hasAddedStreamingMessage) {
120
129
  hasAddedStreamingMessage = true;
121
130
  setMessages((prev) => [...prev, {
@@ -124,7 +133,9 @@ function useChat(options) {
124
133
  parts
125
134
  }]);
126
135
  } else {
127
- setMessages((prev) => prev.map((m) => m.id === id ? { ...m, parts } : m));
136
+ setMessages(
137
+ (prev) => prev.map((m) => m.id === currentMessageId ? { ...m, parts } : m)
138
+ );
128
139
  }
129
140
  },
130
141
  onToolCall: options.onToolCall
@@ -223,14 +234,27 @@ async function handleStreamingResponse(body, callbacks) {
223
234
  });
224
235
  }
225
236
  for (const [, tool] of toolCalls) {
226
- parts.push({
227
- type: "tool-call",
228
- toolCallId: tool.toolCallId,
229
- toolName: tool.toolName,
230
- state: tool.state,
231
- input: tool.input,
232
- output: tool.output
233
- });
237
+ 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
+ });
247
+ } 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
256
+ });
257
+ }
234
258
  }
235
259
  return parts;
236
260
  };
@@ -291,7 +315,8 @@ async function handleStreamingResponse(body, callbacks) {
291
315
  toolCallId,
292
316
  toolName: parsed.toolName || "unknown",
293
317
  inputText: "",
294
- state: "input-streaming"
318
+ state: "input-streaming",
319
+ dynamic: parsed.dynamic === true
295
320
  };
296
321
  toolCalls.set(toolCallId, toolCall);
297
322
  onUpdate?.(buildCurrentParts(), messageId);
@@ -313,15 +338,19 @@ async function handleStreamingResponse(body, callbacks) {
313
338
  toolCall.input = parsed.input;
314
339
  toolCall.toolName = parsed.toolName || toolCall.toolName;
315
340
  toolCall.state = "input-available";
341
+ if (parsed.dynamic === true) {
342
+ toolCall.dynamic = true;
343
+ }
316
344
  onToolCall?.({
317
345
  toolCall: {
318
346
  toolCallId,
319
347
  toolName: toolCall.toolName,
320
- input: toolCall.input
348
+ input: toolCall.input,
349
+ dynamic: toolCall.dynamic
321
350
  }
322
351
  });
323
352
  messageParts.push({
324
- type: "tool-call",
353
+ type: toolCall.dynamic ? "dynamic-tool" : "tool-call",
325
354
  toolCallId,
326
355
  toolName: toolCall.toolName,
327
356
  state: "input-available",
@@ -347,6 +376,32 @@ async function handleStreamingResponse(body, callbacks) {
347
376
  }
348
377
  break;
349
378
  }
379
+ case "tool-input-error": {
380
+ const toolCallId = parsed.toolCallId;
381
+ const toolCall = toolCalls.get(toolCallId);
382
+ if (toolCall) {
383
+ toolCall.state = "output-error";
384
+ toolCall.error = parsed.errorText;
385
+ if (parsed.dynamic === true) {
386
+ toolCall.dynamic = true;
387
+ }
388
+ onUpdate?.(buildCurrentParts(), messageId);
389
+ }
390
+ break;
391
+ }
392
+ case "tool-output-error": {
393
+ const toolCallId = parsed.toolCallId;
394
+ const toolCall = toolCalls.get(toolCallId);
395
+ if (toolCall) {
396
+ toolCall.state = "output-error";
397
+ toolCall.error = parsed.errorText;
398
+ if (parsed.dynamic === true) {
399
+ toolCall.dynamic = true;
400
+ }
401
+ onUpdate?.(buildCurrentParts(), messageId);
402
+ }
403
+ break;
404
+ }
350
405
  case "reasoning-start": {
351
406
  const reasoningId = parsed.id || generateClientId("reasoning");
352
407
  const reasoning = {