{"version":3,"sources":["../src/use-chat.ts","../src/use-completion.ts","../src/use-assistant.ts"],"sourcesContent":["import type {\n  ChatRequestOptions,\n  CreateMessage,\n  JSONValue,\n  Message,\n  UIMessage,\n  UseChatOptions,\n} from '@ai-sdk/ui-utils';\nimport {\n  callChatApi,\n  extractMaxToolInvocationStep,\n  fillMessageParts,\n  generateId as generateIdFunc,\n  getMessageParts,\n  isAssistantMessageWithCompletedToolCalls,\n  prepareAttachmentsForRequest,\n  shouldResubmitMessages,\n  updateToolCallResult,\n} from '@ai-sdk/ui-utils';\nimport swrv from 'swrv';\nimport type { Ref } from 'vue';\nimport { computed, ref, unref } from 'vue';\n\nexport type { CreateMessage, Message, UIMessage, UseChatOptions };\n\nexport type UseChatHelpers = {\n  /** Current messages in the chat */\n  messages: Ref<UIMessage[]>;\n  /** The error object of the API request */\n  error: Ref<undefined | Error>;\n  /**\n   * Append a user message to the chat list. This triggers the API call to fetch\n   * the assistant's response.\n   */\n  append: (\n    message: Message | CreateMessage,\n    chatRequestOptions?: ChatRequestOptions,\n  ) => Promise<string | null | undefined>;\n  /**\n   * Reload the last AI chat response for the given chat history. If the last\n   * message isn't from the assistant, it will request the API to generate a\n   * new response.\n   */\n  reload: (\n    chatRequestOptions?: ChatRequestOptions,\n  ) => Promise<string | null | undefined>;\n  /**\n   * Abort the current request immediately, keep the generated tokens if any.\n   */\n  stop: () => void;\n  /**\n   * Update the `messages` state locally. This is useful when you want to\n   * edit the messages on the client, and then trigger the `reload` method\n   * manually to regenerate the AI response.\n   */\n  setMessages: (\n    messages: Message[] | ((messages: Message[]) => Message[]),\n  ) => void;\n  /** The current value of the input */\n  input: Ref<string>;\n  /** Form submission handler to automatically reset input and append a user message  */\n  handleSubmit: (\n    event?: { preventDefault?: () => void },\n    chatRequestOptions?: ChatRequestOptions,\n  ) => void;\n\n  /**\n   * Whether the API request is in progress\n   *\n   * @deprecated use `status` instead\n   */\n  isLoading: Ref<boolean>;\n\n  /**\n   * Hook status:\n   *\n   * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n   * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n   * - `ready`: The full response has been received and processed; a new user message can be submitted.\n   * - `error`: An error occurred during the API request, preventing successful completion.\n   */\n  status: Ref<'submitted' | 'streaming' | 'ready' | 'error'>;\n\n  /** Additional data added on the server via StreamData. */\n  data: Ref<JSONValue[] | undefined>;\n  /** Set the data of the chat. You can use this to transform or clear the chat data. */\n  setData: (\n    data:\n      | JSONValue[]\n      | undefined\n      | ((data: JSONValue[] | undefined) => JSONValue[] | undefined),\n  ) => void;\n\n  addToolResult: ({\n    toolCallId,\n    result,\n  }: {\n    toolCallId: string;\n    result: any;\n  }) => void;\n\n  /** The id of the chat */\n  id: string;\n};\n\n// @ts-expect-error - some issues with the default export of useSWRV\nconst useSWRV = (swrv.default as (typeof import('swrv'))['default']) || swrv;\nconst store: Record<string, UIMessage[] | undefined> = {};\nconst statusStore: Record<\n  string,\n  Ref<'submitted' | 'streaming' | 'ready' | 'error'>\n> = {};\n\nexport function useChat(\n  {\n    api = '/api/chat',\n    id,\n    initialMessages = [],\n    initialInput = '',\n    sendExtraMessageFields,\n    streamProtocol = 'data',\n    onResponse,\n    onFinish,\n    onError,\n    credentials,\n    headers: metadataHeaders,\n    body: metadataBody,\n    generateId = generateIdFunc,\n    onToolCall,\n    fetch,\n    keepLastMessageOnError = true,\n    maxSteps = 1,\n    experimental_prepareRequestBody,\n  }: UseChatOptions & {\n    /**\n     * Maximum number of sequential LLM calls (steps), e.g. when you use tool calls. Must be at least 1.\n     * A maximum number is required to prevent infinite loops in the case of misconfigured tools.\n     * By default, it's set to 1, which means that only a single LLM call is made.\n     */\n    maxSteps?: number;\n\n    /**\n     * Experimental (Vue only). When a function is provided, it will be used\n     * to prepare the request body for the chat API. This can be useful for\n     * customizing the request body based on the messages and data in the chat.\n     *\n     * @param id The chat ID\n     * @param messages The current messages in the chat\n     * @param requestData The data object passed in the chat request\n     * @param requestBody The request body object passed in the chat request\n     */\n    experimental_prepareRequestBody?: (options: {\n      id: string;\n      messages: UIMessage[];\n      requestData?: JSONValue;\n      requestBody?: object;\n    }) => unknown;\n  } = {\n    maxSteps: 1,\n  },\n): UseChatHelpers {\n  // Generate a unique ID for the chat if not provided.\n  const chatId = id ?? generateId();\n\n  const key = `${api}|${chatId}`;\n  const { data: messagesData, mutate: originalMutate } = useSWRV<UIMessage[]>(\n    key,\n    () => store[key] ?? fillMessageParts(initialMessages),\n  );\n\n  const status =\n    statusStore[chatId] ??\n    (statusStore[chatId] = ref<'submitted' | 'streaming' | 'ready' | 'error'>(\n      'ready',\n    ));\n\n  // Force the `data` to be `initialMessages` if it's `undefined`.\n  messagesData.value ??= fillMessageParts(initialMessages);\n\n  const mutate = (data?: UIMessage[]) => {\n    store[key] = data;\n    return originalMutate();\n  };\n\n  // Because of the `initialData` option, the `data` will never be `undefined`.\n  const messages = messagesData as Ref<UIMessage[]>;\n\n  const error = ref<undefined | Error>(undefined);\n  // cannot use JSONValue[] in ref because of infinite Typescript recursion:\n  const streamData = ref<undefined | unknown[]>(undefined);\n\n  let abortController: AbortController | null = null;\n\n  async function triggerRequest(\n    messagesSnapshot: Message[],\n    { data, headers, body }: ChatRequestOptions = {},\n  ) {\n    error.value = undefined;\n    status.value = 'submitted';\n\n    const messageCount = messages.value.length;\n    const maxStep = extractMaxToolInvocationStep(\n      messages.value[messages.value.length - 1]?.toolInvocations,\n    );\n\n    try {\n      abortController = new AbortController();\n\n      // Do an optimistic update to the chat state to show the updated messages\n      // immediately.\n      const previousMessages = fillMessageParts(messagesSnapshot);\n      const chatMessages = previousMessages;\n      mutate(chatMessages);\n\n      const existingData = (streamData.value ?? []) as JSONValue[];\n\n      const constructedMessagesPayload = sendExtraMessageFields\n        ? chatMessages\n        : chatMessages.map(\n            ({\n              role,\n              content,\n              experimental_attachments,\n              data,\n              annotations,\n              toolInvocations,\n              parts,\n            }) => ({\n              role,\n              content,\n              ...(experimental_attachments !== undefined && {\n                experimental_attachments,\n              }),\n              ...(data !== undefined && { data }),\n              ...(annotations !== undefined && { annotations }),\n              ...(toolInvocations !== undefined && { toolInvocations }),\n              ...(parts !== undefined && { parts }),\n            }),\n          );\n\n      await callChatApi({\n        api,\n        body: experimental_prepareRequestBody?.({\n          id: chatId,\n          messages: chatMessages,\n          requestData: data,\n          requestBody: body,\n        }) ?? {\n          id: chatId,\n          messages: constructedMessagesPayload,\n          data,\n          ...unref(metadataBody), // Use unref to unwrap the ref value\n          ...body,\n        },\n        streamProtocol,\n        headers: {\n          ...metadataHeaders,\n          ...headers,\n        },\n        abortController: () => abortController,\n        credentials,\n        onResponse,\n        onUpdate({ message, data, replaceLastMessage }) {\n          status.value = 'streaming';\n\n          mutate([\n            ...(replaceLastMessage\n              ? chatMessages.slice(0, chatMessages.length - 1)\n              : chatMessages),\n            message,\n          ]);\n          if (data?.length) {\n            streamData.value = [...existingData, ...data];\n          }\n        },\n        onFinish,\n        restoreMessagesOnFailure() {\n          // Restore the previous messages if the request fails.\n          if (!keepLastMessageOnError) {\n            mutate(previousMessages);\n          }\n        },\n        generateId,\n        onToolCall,\n        fetch,\n        // enabled use of structured clone in processChatResponse:\n        lastMessage: recursiveToRaw(chatMessages[chatMessages.length - 1]),\n      });\n\n      status.value = 'ready';\n    } catch (err) {\n      // Ignore abort errors as they are expected.\n      if ((err as any).name === 'AbortError') {\n        abortController = null;\n        status.value = 'ready';\n        return null;\n      }\n\n      if (onError && err instanceof Error) {\n        onError(err);\n      }\n\n      error.value = err as Error;\n      status.value = 'error';\n    } finally {\n      abortController = null;\n    }\n\n    // auto-submit when all tool calls in the last assistant message have results:\n    if (\n      shouldResubmitMessages({\n        originalMaxToolInvocationStep: maxStep,\n        originalMessageCount: messageCount,\n        maxSteps,\n        messages: messages.value,\n      })\n    ) {\n      await triggerRequest(messages.value);\n    }\n  }\n\n  const append: UseChatHelpers['append'] = async (message, options) => {\n    const attachmentsForRequest = await prepareAttachmentsForRequest(\n      options?.experimental_attachments ?? message.experimental_attachments,\n    );\n\n    return triggerRequest(\n      messages.value.concat({\n        ...message,\n        id: message.id ?? generateId(),\n        createdAt: message.createdAt ?? new Date(),\n        experimental_attachments:\n          attachmentsForRequest.length > 0 ? attachmentsForRequest : undefined,\n        parts: getMessageParts(message),\n      }),\n      options,\n    );\n  };\n\n  const reload: UseChatHelpers['reload'] = async options => {\n    const messagesSnapshot = messages.value;\n    if (messagesSnapshot.length === 0) return null;\n\n    const lastMessage = messagesSnapshot[messagesSnapshot.length - 1];\n    if (lastMessage.role === 'assistant') {\n      return triggerRequest(messagesSnapshot.slice(0, -1), options);\n    }\n\n    return triggerRequest(messagesSnapshot, options);\n  };\n\n  const stop = () => {\n    if (abortController) {\n      abortController.abort();\n      abortController = null;\n    }\n  };\n\n  const setMessages = (\n    messagesArg: Message[] | ((messages: Message[]) => Message[]),\n  ) => {\n    if (typeof messagesArg === 'function') {\n      messagesArg = messagesArg(messages.value);\n    }\n\n    mutate(fillMessageParts(messagesArg));\n  };\n\n  const setData = (\n    dataArg:\n      | JSONValue[]\n      | undefined\n      | ((data: JSONValue[] | undefined) => JSONValue[] | undefined),\n  ) => {\n    if (typeof dataArg === 'function') {\n      dataArg = dataArg(streamData.value as JSONValue[] | undefined);\n    }\n\n    streamData.value = dataArg;\n  };\n\n  const input = ref(initialInput);\n\n  const handleSubmit = async (\n    event?: { preventDefault?: () => void },\n    options: ChatRequestOptions = {},\n  ) => {\n    event?.preventDefault?.();\n\n    const inputValue = input.value;\n\n    if (!inputValue && !options.allowEmptySubmit) return;\n\n    const attachmentsForRequest = await prepareAttachmentsForRequest(\n      options.experimental_attachments,\n    );\n\n    triggerRequest(\n      messages.value.concat({\n        id: generateId(),\n        createdAt: new Date(),\n        content: inputValue,\n        role: 'user',\n        experimental_attachments:\n          attachmentsForRequest.length > 0 ? attachmentsForRequest : undefined,\n        parts: [{ type: 'text', text: inputValue }],\n      }),\n      options,\n    );\n\n    input.value = '';\n  };\n\n  const addToolResult = ({\n    toolCallId,\n    result,\n  }: {\n    toolCallId: string;\n    result: unknown;\n  }) => {\n    const currentMessages = messages.value;\n\n    updateToolCallResult({\n      messages: currentMessages,\n      toolCallId,\n      toolResult: result,\n    });\n\n    mutate(currentMessages);\n\n    // when the request is ongoing, the auto-submit will be triggered after the request is finished\n    if (status.value === 'submitted' || status.value === 'streaming') {\n      return;\n    }\n\n    // auto-submit when all tool calls in the last assistant message have results:\n    const lastMessage = currentMessages[currentMessages.length - 1];\n    if (isAssistantMessageWithCompletedToolCalls(lastMessage)) {\n      triggerRequest(currentMessages);\n    }\n  };\n\n  return {\n    id: chatId,\n    messages,\n    append,\n    error,\n    reload,\n    stop,\n    setMessages,\n    input,\n    handleSubmit,\n    isLoading: computed(\n      () => status.value === 'submitted' || status.value === 'streaming',\n    ),\n    status: status as Ref<'submitted' | 'streaming' | 'ready' | 'error'>,\n    data: streamData as Ref<undefined | JSONValue[]>,\n    setData,\n    addToolResult,\n  };\n}\n\n// required for use of structured clone\nfunction recursiveToRaw<T>(inputValue: T): T {\n  if (Array.isArray(inputValue)) {\n    return [...inputValue.map(recursiveToRaw)] as T;\n  } else if (typeof inputValue === 'object' && inputValue !== null) {\n    const clone: any = {};\n    for (const [key, value] of Object.entries(inputValue)) {\n      clone[key] = recursiveToRaw(value);\n    }\n    return clone;\n  } else {\n    return inputValue;\n  }\n}\n","import type {\n  JSONValue,\n  RequestOptions,\n  UseCompletionOptions,\n} from '@ai-sdk/ui-utils';\nimport { callCompletionApi } from '@ai-sdk/ui-utils';\nimport swrv from 'swrv';\nimport type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers = {\n  /** The current completion result */\n  completion: Ref<string>;\n  /** The error object of the API request */\n  error: Ref<undefined | Error>;\n  /**\n   * Send a new prompt to the API endpoint and update the completion state.\n   */\n  complete: (\n    prompt: string,\n    options?: RequestOptions,\n  ) => Promise<string | null | undefined>;\n  /**\n   * Abort the current API request but keep the generated tokens.\n   */\n  stop: () => void;\n  /**\n   * Update the `completion` state locally.\n   */\n  setCompletion: (completion: string) => void;\n  /** The current value of the input */\n  input: Ref<string>;\n  /**\n   * Form submission handler to automatically reset input and append a user message\n   * @example\n   * ```jsx\n   * <form @submit=\"handleSubmit\">\n   *  <input @change=\"handleInputChange\" v-model=\"input\" />\n   * </form>\n   * ```\n   */\n  handleSubmit: (event?: { preventDefault?: () => void }) => void;\n  /** Whether the API request is in progress */\n  isLoading: Ref<boolean | undefined>;\n\n  /** Additional data added on the server via StreamData */\n  data: Ref<JSONValue[] | undefined>;\n};\n\nlet uniqueId = 0;\n\n// @ts-expect-error - some issues with the default export of useSWRV\nconst useSWRV = (swrv.default as (typeof import('swrv'))['default']) || swrv;\nconst store: Record<string, any> = {};\n\nexport function useCompletion({\n  api = '/api/completion',\n  id,\n  initialCompletion = '',\n  initialInput = '',\n  credentials,\n  headers,\n  body,\n  streamProtocol,\n  onResponse,\n  onFinish,\n  onError,\n  fetch,\n}: UseCompletionOptions = {}): UseCompletionHelpers {\n  // Generate an unique id for the completion if not provided.\n  const completionId = id || `completion-${uniqueId++}`;\n\n  const key = `${api}|${completionId}`;\n  const { data, mutate: originalMutate } = useSWRV<string>(\n    key,\n    () => store[key] || initialCompletion,\n  );\n\n  const { data: isLoading, mutate: mutateLoading } = useSWRV<boolean>(\n    `${completionId}-loading`,\n    null,\n  );\n\n  isLoading.value ??= false;\n\n  const { data: streamData, mutate: mutateStreamData } = useSWRV<\n    JSONValue[] | undefined\n  >(`${completionId}-data`, null);\n\n  // Force the `data` to be `initialCompletion` if it's `undefined`.\n  data.value ||= initialCompletion;\n\n  const mutate = (data: string) => {\n    store[key] = data;\n    return originalMutate();\n  };\n\n  // Because of the `initialData` option, the `data` will never be `undefined`.\n  const completion = data as Ref<string>;\n\n  const error = ref<undefined | Error>(undefined);\n\n  let abortController: AbortController | null = null;\n\n  async function triggerRequest(prompt: string, options?: RequestOptions) {\n    const existingData = (streamData.value ?? []) as JSONValue[];\n    return callCompletionApi({\n      api,\n      prompt,\n      credentials,\n      headers: {\n        ...headers,\n        ...options?.headers,\n      },\n      body: {\n        ...unref(body),\n        ...options?.body,\n      },\n      streamProtocol,\n      setCompletion: mutate,\n      setLoading: loading => mutateLoading(() => loading),\n      setError: err => {\n        error.value = err;\n      },\n      setAbortController: controller => {\n        abortController = controller;\n      },\n      onResponse,\n      onFinish,\n      onError,\n      onData: data => {\n        mutateStreamData(() => [...existingData, ...(data ?? [])]);\n      },\n      fetch,\n    });\n  }\n\n  const complete: UseCompletionHelpers['complete'] = async (\n    prompt,\n    options,\n  ) => {\n    return triggerRequest(prompt, options);\n  };\n\n  const stop = () => {\n    if (abortController) {\n      abortController.abort();\n      abortController = null;\n    }\n  };\n\n  const setCompletion = (completion: string) => {\n    mutate(completion);\n  };\n\n  const input = ref(initialInput);\n\n  const handleSubmit = (event?: { preventDefault?: () => void }) => {\n    event?.preventDefault?.();\n    const inputValue = input.value;\n    return inputValue ? complete(inputValue) : undefined;\n  };\n\n  return {\n    completion,\n    complete,\n    error,\n    stop,\n    setCompletion,\n    input,\n    handleSubmit,\n    isLoading,\n    data: streamData,\n  };\n}\n","/**\n * A vue.js composable function to interact with the assistant API.\n */\n\nimport { isAbortError } from '@ai-sdk/provider-utils';\nimport type {\n  AssistantStatus,\n  CreateMessage,\n  Message,\n  UseAssistantOptions,\n} from '@ai-sdk/ui-utils';\nimport { generateId, processAssistantStream } from '@ai-sdk/ui-utils';\nimport type { ComputedRef, Ref } from 'vue';\nimport { computed, readonly, ref } from 'vue';\n\nexport type UseAssistantHelpers = {\n  /**\n   * The current array of chat messages.\n   */\n  messages: Ref<Message[]>;\n\n  /**\n   * Update the message store with a new array of messages.\n   */\n  setMessages: (messagesProcessor: (messages: Message[]) => Message[]) => void;\n\n  /**\n   * The current thread ID.\n   */\n  threadId: Ref<string | undefined>;\n\n  /**\n   * Set the current thread ID. Specifying a thread ID will switch to that thread, if it exists. If set to 'undefined', a new thread will be created. For both cases, `threadId` will be updated with the new value and `messages` will be cleared.\n   */\n  setThreadId: (threadId: string | undefined) => void;\n  /**\n   * The current value of the input field.\n   */\n  input: Ref<string>;\n\n  /**\n   * Append a user message to the chat list. This triggers the API call to fetch\n   * the assistant's response.\n   * @param message The message to append\n   * @param requestOptions Additional options to pass to the API call\n   */\n  append: (\n    message: Message | CreateMessage,\n    requestOptions?: {\n      data?: Record<string, string>;\n    },\n  ) => Promise<void>;\n\n  /**\n   * Abort the current request immediately, keep the generated tokens if any.\n   */\n  stop: ComputedRef<() => void>;\n\n  /**\n   * Handler for the `onChange` event of the input field to control the input's value.\n   */\n  handleInputChange: (e: Event & { target: HTMLInputElement }) => void;\n\n  /**\n   * Handler for the `onSubmit` event of the form to append a user message and reset the input.\n   */\n  handleSubmit: (e: Event & { target: HTMLFormElement }) => void;\n\n  /**\n   * Whether the assistant is currently sending a message.\n   */\n  isSending: ComputedRef<boolean>;\n\n  /**\n   * The current status of the assistant.\n   */\n  status: Ref<AssistantStatus>;\n\n  /**\n   * The current error, if any.\n   */\n  error: Ref<Error | undefined>;\n};\n\nexport function useAssistant({\n  api,\n  threadId: threadIdParam,\n  credentials,\n  headers,\n  body,\n  onError,\n}: UseAssistantOptions): UseAssistantHelpers {\n  const messages: Ref<Message[]> = ref([]);\n  const input: Ref<string> = ref('');\n  const currentThreadId: Ref<string | undefined> = ref(undefined);\n  const status: Ref<AssistantStatus> = ref('awaiting_message');\n  const error: Ref<undefined | Error> = ref(undefined);\n\n  const setMessages = (messageFactory: (messages: Message[]) => Message[]) => {\n    messages.value = messageFactory(messages.value);\n  };\n\n  const setCurrentThreadId = (newThreadId: string | undefined) => {\n    currentThreadId.value = newThreadId;\n    messages.value = [];\n  };\n\n  const handleInputChange = (event: Event & { target: HTMLInputElement }) => {\n    input.value = event?.target?.value;\n  };\n\n  const isSending = computed(() => status.value === 'in_progress');\n\n  // Abort controller to cancel the current API call when required\n  const abortController = ref<AbortController | null>(null);\n\n  // memoized function to stop the current request when required\n  const stop = computed(() => {\n    return () => {\n      if (abortController.value) {\n        abortController.value.abort();\n        abortController.value = null;\n      }\n    };\n  });\n\n  const append = async (\n    message: Message | CreateMessage,\n    requestOptions?: {\n      data?: Record<string, string>;\n    },\n  ) => {\n    status.value = 'in_progress';\n\n    // Append the new message to the current list of messages\n    const newMessage: Message = {\n      ...message,\n      id: message.id ?? generateId(),\n    };\n\n    // Update the messages list with the new message\n    setMessages(messages => [...messages, newMessage]);\n\n    input.value = '';\n\n    const controller = new AbortController();\n\n    try {\n      // Assign the new controller to the abortController ref\n      abortController.value = controller;\n\n      const response = await fetch(api, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...headers,\n        },\n        body: JSON.stringify({\n          ...body,\n          // Message Content\n          message: message.content,\n\n          // Always Use User Provided Thread ID When Available\n          threadId: threadIdParam ?? currentThreadId.value ?? null,\n\n          // Optional Request Data\n          ...(requestOptions?.data && { data: requestOptions?.data }),\n        }),\n        signal: controller.signal,\n        credentials,\n      });\n\n      if (!response.ok) {\n        throw new Error(\n          response.statusText ?? 'An error occurred while sending the message',\n        );\n      }\n\n      if (!response.body) {\n        throw new Error('The response body is empty');\n      }\n\n      await processAssistantStream({\n        stream: response.body,\n        onAssistantMessagePart(value) {\n          messages.value = [\n            ...messages.value,\n            {\n              id: value.id,\n              content: value.content[0].text.value,\n              role: value.role,\n              parts: [],\n            },\n          ];\n        },\n        onTextPart(value) {\n          setMessages(messages => {\n            const lastMessage = messages[messages.length - 1];\n            lastMessage.content += value;\n\n            return [...messages.slice(0, -1), lastMessage];\n          });\n        },\n        onAssistantControlDataPart(value) {\n          if (value.threadId) {\n            currentThreadId.value = value.threadId;\n          }\n\n          setMessages(messages => {\n            const lastMessage = messages[messages.length - 1];\n            lastMessage.id = value.messageId;\n\n            return [...messages.slice(0, -1), lastMessage];\n          });\n        },\n        onDataMessagePart(value) {\n          setMessages(messages => [\n            ...messages,\n            {\n              id: value.id ?? generateId(),\n              role: 'data',\n              content: '',\n              data: value.data,\n              parts: [],\n            },\n          ]);\n        },\n        onErrorPart(value) {\n          error.value = new Error(value);\n        },\n      });\n    } catch (err) {\n      // If the error is an AbortError and the signal is aborted, reset the abortController and do nothing.\n      if (isAbortError(err) && abortController.value?.signal.aborted) {\n        abortController.value = null;\n        return;\n      }\n\n      // If an error handler is provided, call it with the error\n      if (onError && err instanceof Error) {\n        onError(err);\n      }\n\n      error.value = err as Error;\n    } finally {\n      // Reset the status to 'awaiting_message' after the request is complete\n      abortController.value = null;\n      status.value = 'awaiting_message';\n    }\n  };\n\n  const submitMessage = async (\n    event: Event & { target: HTMLFormElement },\n    requestOptions?: {\n      data?: Record<string, string>;\n    },\n  ) => {\n    event?.preventDefault?.();\n\n    if (!input.value) return;\n\n    append(\n      {\n        role: 'user',\n        content: input.value,\n        parts: [],\n      },\n      requestOptions,\n    );\n  };\n\n  return {\n    append,\n    messages,\n    setMessages,\n    threadId: readonly(currentThreadId),\n    setThreadId: setCurrentThreadId,\n    input,\n    handleInputChange,\n    handleSubmit: submitMessage,\n    isSending,\n    status,\n    error,\n    stop,\n  };\n}\n"],"mappings":"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","names":["generateId","fetch","_a","_b","data","swrv","ref","unref","useSWRV","store","fetch","data","_a","completion","computed","ref","messages","_a"]}