@leeoohoo/aichat 1.0.0
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.
- package/README.md +274 -0
- package/dist/index.cjs.js +70 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.css +10 -0
- package/dist/index.d.ts +746 -0
- package/dist/index.esm.js +15617 -0
- package/dist/index.esm.js.map +1 -0
- package/package.json +190 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../node_modules/zustand/esm/vanilla.mjs","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../node_modules/use-sync-external-store/shim/index.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../node_modules/use-sync-external-store/shim/with-selector.js","../node_modules/zustand/esm/index.mjs","../node_modules/zustand/esm/middleware.mjs","../node_modules/immer/dist/immer.mjs","../node_modules/zustand/esm/middleware/immer.mjs","../src/lib/api/client.ts","../src/lib/database/index.ts","../src/lib/services/messageManager.ts","../src/lib/store/index.ts","../src/lib/store/createChatStore.ts","../node_modules/clsx/dist/clsx.mjs","../node_modules/tailwind-merge/dist/bundle-mjs.mjs","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/native.js","../node_modules/uuid/dist/esm-browser/v4.js","../node_modules/date-fns/constants.js","../node_modules/date-fns/constructFrom.js","../node_modules/date-fns/toDate.js","../node_modules/date-fns/_lib/defaultOptions.js","../node_modules/date-fns/startOfWeek.js","../node_modules/date-fns/startOfISOWeek.js","../node_modules/date-fns/getISOWeekYear.js","../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../node_modules/date-fns/_lib/normalizeDates.js","../node_modules/date-fns/startOfDay.js","../node_modules/date-fns/differenceInCalendarDays.js","../node_modules/date-fns/startOfISOWeekYear.js","../node_modules/date-fns/compareAsc.js","../node_modules/date-fns/constructNow.js","../node_modules/date-fns/isDate.js","../node_modules/date-fns/isValid.js","../node_modules/date-fns/differenceInCalendarMonths.js","../node_modules/date-fns/_lib/getRoundingMethod.js","../node_modules/date-fns/differenceInMilliseconds.js","../node_modules/date-fns/endOfDay.js","../node_modules/date-fns/endOfMonth.js","../node_modules/date-fns/isLastDayOfMonth.js","../node_modules/date-fns/differenceInMonths.js","../node_modules/date-fns/differenceInSeconds.js","../node_modules/date-fns/startOfYear.js","../node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../node_modules/date-fns/locale/en-US/_lib/formatLong.js","../node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../node_modules/date-fns/locale/en-US/_lib/localize.js","../node_modules/date-fns/locale/_lib/buildMatchFn.js","../node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../node_modules/date-fns/locale/en-US/_lib/match.js","../node_modules/date-fns/locale/en-US.js","../node_modules/date-fns/getDayOfYear.js","../node_modules/date-fns/getISOWeek.js","../node_modules/date-fns/getWeekYear.js","../node_modules/date-fns/startOfWeekYear.js","../node_modules/date-fns/getWeek.js","../node_modules/date-fns/_lib/addLeadingZeros.js","../node_modules/date-fns/_lib/format/lightFormatters.js","../node_modules/date-fns/_lib/format/formatters.js","../node_modules/date-fns/_lib/format/longFormatters.js","../node_modules/date-fns/_lib/protectedTokens.js","../node_modules/date-fns/format.js","../node_modules/date-fns/formatDistance.js","../node_modules/date-fns/formatDistanceToNow.js","../src/lib/utils/index.ts","../src/components/MarkdownRenderer.tsx","../src/components/AttachmentRenderer.tsx","../src/components/ToolCallRenderer.tsx","../src/components/MessageItem.tsx","../src/components/LoadingSpinner.tsx","../src/components/MessageList.tsx","../src/components/InputArea.tsx","../src/components/ui/icons.tsx","../src/components/SessionList.tsx","../src/hooks/useTheme.ts","../src/components/ThemeToggle.tsx","../src/components/McpManager.tsx","../src/components/AiModelManager.tsx","../src/components/SystemContextEditor.tsx","../src/components/StandaloneChatInterface.tsx","../src/components/ChatInterface.tsx","../src/components/ErrorBoundary.tsx","../src/lib/api/index.ts","../node_modules/openai/internal/qs/formats.mjs","../node_modules/openai/internal/qs/utils.mjs","../node_modules/openai/internal/qs/stringify.mjs","../node_modules/openai/version.mjs","../node_modules/openai/_shims/registry.mjs","../node_modules/openai/_shims/MultipartBody.mjs","../node_modules/openai/_shims/web-runtime.mjs","../node_modules/openai/_shims/index.mjs","../node_modules/openai/error.mjs","../node_modules/openai/internal/decoders/line.mjs","../node_modules/openai/internal/stream-utils.mjs","../node_modules/openai/streaming.mjs","../node_modules/openai/uploads.mjs","../node_modules/openai/core.mjs","../node_modules/openai/pagination.mjs","../node_modules/openai/resource.mjs","../node_modules/openai/resources/chat/completions/messages.mjs","../node_modules/openai/resources/chat/completions/completions.mjs","../node_modules/openai/resources/chat/chat.mjs","../node_modules/openai/resources/audio/speech.mjs","../node_modules/openai/resources/audio/transcriptions.mjs","../node_modules/openai/resources/audio/translations.mjs","../node_modules/openai/resources/audio/audio.mjs","../node_modules/openai/resources/batches.mjs","../node_modules/openai/lib/EventStream.mjs","../node_modules/openai/lib/AssistantStream.mjs","../node_modules/openai/resources/beta/assistants.mjs","../node_modules/openai/lib/RunnableFunction.mjs","../node_modules/openai/lib/chatCompletionUtils.mjs","../node_modules/openai/lib/parser.mjs","../node_modules/openai/lib/AbstractChatCompletionRunner.mjs","../node_modules/openai/lib/ChatCompletionRunner.mjs","../node_modules/openai/_vendor/partial-json-parser/parser.mjs","../node_modules/openai/lib/ChatCompletionStream.mjs","../node_modules/openai/lib/ChatCompletionStreamingRunner.mjs","../node_modules/openai/resources/beta/chat/completions.mjs","../node_modules/openai/resources/beta/chat/chat.mjs","../node_modules/openai/resources/beta/realtime/sessions.mjs","../node_modules/openai/resources/beta/realtime/transcription-sessions.mjs","../node_modules/openai/resources/beta/realtime/realtime.mjs","../node_modules/openai/resources/beta/threads/messages.mjs","../node_modules/openai/resources/beta/threads/runs/steps.mjs","../node_modules/openai/resources/beta/threads/runs/runs.mjs","../node_modules/openai/resources/beta/threads/threads.mjs","../node_modules/openai/resources/beta/beta.mjs","../node_modules/openai/resources/completions.mjs","../node_modules/openai/resources/containers/files/content.mjs","../node_modules/openai/resources/containers/files/files.mjs","../node_modules/openai/resources/containers/containers.mjs","../node_modules/openai/resources/embeddings.mjs","../node_modules/openai/resources/evals/runs/output-items.mjs","../node_modules/openai/resources/evals/runs/runs.mjs","../node_modules/openai/resources/evals/evals.mjs","../node_modules/openai/resources/files.mjs","../node_modules/openai/resources/fine-tuning/methods.mjs","../node_modules/openai/resources/fine-tuning/alpha/graders.mjs","../node_modules/openai/resources/fine-tuning/alpha/alpha.mjs","../node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs","../node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs","../node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs","../node_modules/openai/resources/fine-tuning/jobs/jobs.mjs","../node_modules/openai/resources/fine-tuning/fine-tuning.mjs","../node_modules/openai/resources/graders/grader-models.mjs","../node_modules/openai/resources/graders/graders.mjs","../node_modules/openai/resources/images.mjs","../node_modules/openai/resources/models.mjs","../node_modules/openai/resources/moderations.mjs","../node_modules/openai/lib/ResponsesParser.mjs","../node_modules/openai/resources/responses/input-items.mjs","../node_modules/openai/lib/responses/ResponseStream.mjs","../node_modules/openai/resources/responses/responses.mjs","../node_modules/openai/resources/uploads/parts.mjs","../node_modules/openai/resources/uploads/uploads.mjs","../node_modules/openai/lib/Util.mjs","../node_modules/openai/resources/vector-stores/files.mjs","../node_modules/openai/resources/vector-stores/file-batches.mjs","../node_modules/openai/resources/vector-stores/vector-stores.mjs","../node_modules/openai/index.mjs","../src/lib/services/aiRequestHandler.ts","../src/lib/services/toolResultProcessor.ts","../src/lib/services/aiClient.ts","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/core/AxiosError.js","../node_modules/axios/lib/helpers/null.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../node_modules/axios/lib/platform/browser/classes/FormData.js","../node_modules/axios/lib/platform/browser/classes/Blob.js","../node_modules/axios/lib/platform/browser/index.js","../node_modules/axios/lib/platform/common/utils.js","../node_modules/axios/lib/platform/index.js","../node_modules/axios/lib/helpers/toURLEncodedForm.js","../node_modules/axios/lib/helpers/formDataToJSON.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/core/AxiosHeaders.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/axios/lib/helpers/speedometer.js","../node_modules/axios/lib/helpers/throttle.js","../node_modules/axios/lib/helpers/progressEventReducer.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/helpers/resolveConfig.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/helpers/composeSignals.js","../node_modules/axios/lib/helpers/trackStream.js","../node_modules/axios/lib/adapters/fetch.js","../node_modules/axios/lib/adapters/adapters.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/lib/helpers/HttpStatusCode.js","../node_modules/axios/lib/axios.js","../node_modules/axios/index.js","../src/lib/services/mcpToolExecute.ts","../src/lib/services/aiServer.ts","../src/lib/services/index.ts","../src/index.ts"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\n exports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n ) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot))\n return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport ReactExports from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useDebugValue } = ReactExports;\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nlet didWarnAboutEqualityFn = false;\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity, equalityFn) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && equalityFn && !didWarnAboutEqualityFn) {\n console.warn(\n \"[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937\"\n );\n didWarnAboutEqualityFn = true;\n }\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getInitialState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...a) => api.dispatch(...a), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api) return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (_e) {\n }\n if (!extensionConnector) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && enabled) {\n console.warn(\n \"[zustand devtools middleware] Please install/enable Redux devtools extension\"\n );\n }\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = (state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording) return r;\n const action = nameOrAction === void 0 ? { type: anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...a) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...a);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format. \n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (!api.dispatchFromDevtools) return;\n if (typeof api.dispatch !== \"function\") return;\n api.dispatch(action);\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState) return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, f) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0) f(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nconst combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));\n\nfunction createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (_e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, options == null ? void 0 : options.reviver);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(\n name,\n JSON.stringify(newValue, options == null ? void 0 : options.replacer)\n ),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst oldImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n getStorage: () => localStorage,\n serialize: JSON.stringify,\n deserialize: JSON.parse,\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage;\n try {\n storage = options.getStorage();\n } catch (_e) {\n }\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const thenableSerialize = toThenable(options.serialize);\n const setItem = () => {\n const state = options.partialize({ ...get() });\n let errorInSync;\n const thenable = thenableSerialize({ state, version: options.version }).then(\n (serializedValue) => storage.setItem(options.name, serializedValue)\n ).catch((e) => {\n errorInSync = e;\n });\n if (errorInSync) {\n throw errorInSync;\n }\n return thenable;\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n let stateFromStorage;\n const hydrate = () => {\n var _a;\n if (!storage) return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => cb(get()));\n const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {\n if (storageValue) {\n return options.deserialize(storageValue);\n }\n }).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n return options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return deserializedStorageValue.state;\n }\n }\n }).then((migratedState) => {\n var _a2;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n return setItem();\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.getStorage) {\n storage = newOptions.getStorage();\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n hydrate();\n return stateFromStorage || configResult;\n};\nconst newImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n return [\n true,\n options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n )\n ];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persistImpl = (config, baseOptions) => {\n if (\"getStorage\" in baseOptions || \"serialize\" in baseOptions || \"deserialize\" in baseOptions) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead.\"\n );\n }\n return oldImpl(config, baseOptions);\n }\n return newImpl(config, baseOptions);\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","// src/utils/env.ts\nvar NOTHING = Symbol.for(\"immer-nothing\");\nvar DRAFTABLE = Symbol.for(\"immer-draftable\");\nvar DRAFT_STATE = Symbol.for(\"immer-state\");\n\n// src/utils/errors.ts\nvar errors = process.env.NODE_ENV !== \"production\" ? [\n // All error codes, starting by 0:\n function(plugin) {\n return `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`;\n },\n function(thing) {\n return `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`;\n },\n \"This object has been frozen and should not be mutated\",\n function(data) {\n return \"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" + data;\n },\n \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n \"Immer forbids circular references\",\n \"The first or second argument to `produce` must be a function\",\n \"The third argument to `produce` must be a function or undefined\",\n \"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n \"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n function(thing) {\n return `'current' expects a draft, got: ${thing}`;\n },\n \"Object.defineProperty() cannot be used on an Immer draft\",\n \"Object.setPrototypeOf() cannot be used on an Immer draft\",\n \"Immer only supports deleting array indices\",\n \"Immer only supports setting array indices and the 'length' property\",\n function(thing) {\n return `'original' expects a draft, got: ${thing}`;\n }\n // Note: if more errors are added, the errorOffset in Patches.ts should be increased\n // See Patches.ts for additional errors\n] : [];\nfunction die(error, ...args) {\n if (process.env.NODE_ENV !== \"production\") {\n const e = errors[error];\n const msg = typeof e === \"function\" ? e.apply(null, args) : e;\n throw new Error(`[Immer] ${msg}`);\n }\n throw new Error(\n `[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n );\n}\n\n// src/utils/common.ts\nvar getPrototypeOf = Object.getPrototypeOf;\nfunction isDraft(value) {\n return !!value && !!value[DRAFT_STATE];\n}\nfunction isDraftable(value) {\n if (!value)\n return false;\n return isPlainObject(value) || Array.isArray(value) || !!value[DRAFTABLE] || !!value.constructor?.[DRAFTABLE] || isMap(value) || isSet(value);\n}\nvar objectCtorString = Object.prototype.constructor.toString();\nfunction isPlainObject(value) {\n if (!value || typeof value !== \"object\")\n return false;\n const proto = getPrototypeOf(value);\n if (proto === null) {\n return true;\n }\n const Ctor = Object.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n if (Ctor === Object)\n return true;\n return typeof Ctor == \"function\" && Function.toString.call(Ctor) === objectCtorString;\n}\nfunction original(value) {\n if (!isDraft(value))\n die(15, value);\n return value[DRAFT_STATE].base_;\n}\nfunction each(obj, iter) {\n if (getArchtype(obj) === 0 /* Object */) {\n Reflect.ownKeys(obj).forEach((key) => {\n iter(key, obj[key], obj);\n });\n } else {\n obj.forEach((entry, index) => iter(index, entry, obj));\n }\n}\nfunction getArchtype(thing) {\n const state = thing[DRAFT_STATE];\n return state ? state.type_ : Array.isArray(thing) ? 1 /* Array */ : isMap(thing) ? 2 /* Map */ : isSet(thing) ? 3 /* Set */ : 0 /* Object */;\n}\nfunction has(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.has(prop) : Object.prototype.hasOwnProperty.call(thing, prop);\n}\nfunction get(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.get(prop) : thing[prop];\n}\nfunction set(thing, propOrOldValue, value) {\n const t = getArchtype(thing);\n if (t === 2 /* Map */)\n thing.set(propOrOldValue, value);\n else if (t === 3 /* Set */) {\n thing.add(value);\n } else\n thing[propOrOldValue] = value;\n}\nfunction is(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\nfunction isMap(target) {\n return target instanceof Map;\n}\nfunction isSet(target) {\n return target instanceof Set;\n}\nfunction latest(state) {\n return state.copy_ || state.base_;\n}\nfunction shallowCopy(base, strict) {\n if (isMap(base)) {\n return new Map(base);\n }\n if (isSet(base)) {\n return new Set(base);\n }\n if (Array.isArray(base))\n return Array.prototype.slice.call(base);\n const isPlain = isPlainObject(base);\n if (strict === true || strict === \"class_only\" && !isPlain) {\n const descriptors = Object.getOwnPropertyDescriptors(base);\n delete descriptors[DRAFT_STATE];\n let keys = Reflect.ownKeys(descriptors);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const desc = descriptors[key];\n if (desc.writable === false) {\n desc.writable = true;\n desc.configurable = true;\n }\n if (desc.get || desc.set)\n descriptors[key] = {\n configurable: true,\n writable: true,\n // could live with !!desc.set as well here...\n enumerable: desc.enumerable,\n value: base[key]\n };\n }\n return Object.create(getPrototypeOf(base), descriptors);\n } else {\n const proto = getPrototypeOf(base);\n if (proto !== null && isPlain) {\n return { ...base };\n }\n const obj = Object.create(proto);\n return Object.assign(obj, base);\n }\n}\nfunction freeze(obj, deep = false) {\n if (isFrozen(obj) || isDraft(obj) || !isDraftable(obj))\n return obj;\n if (getArchtype(obj) > 1) {\n Object.defineProperties(obj, {\n set: { value: dontMutateFrozenCollections },\n add: { value: dontMutateFrozenCollections },\n clear: { value: dontMutateFrozenCollections },\n delete: { value: dontMutateFrozenCollections }\n });\n }\n Object.freeze(obj);\n if (deep)\n Object.values(obj).forEach((value) => freeze(value, true));\n return obj;\n}\nfunction dontMutateFrozenCollections() {\n die(2);\n}\nfunction isFrozen(obj) {\n return Object.isFrozen(obj);\n}\n\n// src/utils/plugins.ts\nvar plugins = {};\nfunction getPlugin(pluginKey) {\n const plugin = plugins[pluginKey];\n if (!plugin) {\n die(0, pluginKey);\n }\n return plugin;\n}\nfunction loadPlugin(pluginKey, implementation) {\n if (!plugins[pluginKey])\n plugins[pluginKey] = implementation;\n}\n\n// src/core/scope.ts\nvar currentScope;\nfunction getCurrentScope() {\n return currentScope;\n}\nfunction createScope(parent_, immer_) {\n return {\n drafts_: [],\n parent_,\n immer_,\n // Whenever the modified draft contains a draft from another scope, we\n // need to prevent auto-freezing so the unowned draft can be finalized.\n canAutoFreeze_: true,\n unfinalizedDrafts_: 0\n };\n}\nfunction usePatchesInScope(scope, patchListener) {\n if (patchListener) {\n getPlugin(\"Patches\");\n scope.patches_ = [];\n scope.inversePatches_ = [];\n scope.patchListener_ = patchListener;\n }\n}\nfunction revokeScope(scope) {\n leaveScope(scope);\n scope.drafts_.forEach(revokeDraft);\n scope.drafts_ = null;\n}\nfunction leaveScope(scope) {\n if (scope === currentScope) {\n currentScope = scope.parent_;\n }\n}\nfunction enterScope(immer2) {\n return currentScope = createScope(currentScope, immer2);\n}\nfunction revokeDraft(draft) {\n const state = draft[DRAFT_STATE];\n if (state.type_ === 0 /* Object */ || state.type_ === 1 /* Array */)\n state.revoke_();\n else\n state.revoked_ = true;\n}\n\n// src/core/finalize.ts\nfunction processResult(result, scope) {\n scope.unfinalizedDrafts_ = scope.drafts_.length;\n const baseDraft = scope.drafts_[0];\n const isReplaced = result !== void 0 && result !== baseDraft;\n if (isReplaced) {\n if (baseDraft[DRAFT_STATE].modified_) {\n revokeScope(scope);\n die(4);\n }\n if (isDraftable(result)) {\n result = finalize(scope, result);\n if (!scope.parent_)\n maybeFreeze(scope, result);\n }\n if (scope.patches_) {\n getPlugin(\"Patches\").generateReplacementPatches_(\n baseDraft[DRAFT_STATE].base_,\n result,\n scope.patches_,\n scope.inversePatches_\n );\n }\n } else {\n result = finalize(scope, baseDraft, []);\n }\n revokeScope(scope);\n if (scope.patches_) {\n scope.patchListener_(scope.patches_, scope.inversePatches_);\n }\n return result !== NOTHING ? result : void 0;\n}\nfunction finalize(rootScope, value, path) {\n if (isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n if (!state) {\n each(\n value,\n (key, childValue) => finalizeProperty(rootScope, state, value, key, childValue, path)\n );\n return value;\n }\n if (state.scope_ !== rootScope)\n return value;\n if (!state.modified_) {\n maybeFreeze(rootScope, state.base_, true);\n return state.base_;\n }\n if (!state.finalized_) {\n state.finalized_ = true;\n state.scope_.unfinalizedDrafts_--;\n const result = state.copy_;\n let resultEach = result;\n let isSet2 = false;\n if (state.type_ === 3 /* Set */) {\n resultEach = new Set(result);\n result.clear();\n isSet2 = true;\n }\n each(\n resultEach,\n (key, childValue) => finalizeProperty(rootScope, state, result, key, childValue, path, isSet2)\n );\n maybeFreeze(rootScope, result, false);\n if (path && rootScope.patches_) {\n getPlugin(\"Patches\").generatePatches_(\n state,\n path,\n rootScope.patches_,\n rootScope.inversePatches_\n );\n }\n }\n return state.copy_;\n}\nfunction finalizeProperty(rootScope, parentState, targetObject, prop, childValue, rootPath, targetIsSet) {\n if (process.env.NODE_ENV !== \"production\" && childValue === targetObject)\n die(5);\n if (isDraft(childValue)) {\n const path = rootPath && parentState && parentState.type_ !== 3 /* Set */ && // Set objects are atomic since they have no keys.\n !has(parentState.assigned_, prop) ? rootPath.concat(prop) : void 0;\n const res = finalize(rootScope, childValue, path);\n set(targetObject, prop, res);\n if (isDraft(res)) {\n rootScope.canAutoFreeze_ = false;\n } else\n return;\n } else if (targetIsSet) {\n targetObject.add(childValue);\n }\n if (isDraftable(childValue) && !isFrozen(childValue)) {\n if (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n return;\n }\n finalize(rootScope, childValue);\n if ((!parentState || !parentState.scope_.parent_) && typeof prop !== \"symbol\" && (isMap(targetObject) ? targetObject.has(prop) : Object.prototype.propertyIsEnumerable.call(targetObject, prop)))\n maybeFreeze(rootScope, childValue);\n }\n}\nfunction maybeFreeze(scope, value, deep = false) {\n if (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n freeze(value, deep);\n }\n}\n\n// src/core/proxy.ts\nfunction createProxyProxy(base, parent) {\n const isArray = Array.isArray(base);\n const state = {\n type_: isArray ? 1 /* Array */ : 0 /* Object */,\n // Track which produce call this is associated with.\n scope_: parent ? parent.scope_ : getCurrentScope(),\n // True for both shallow and deep changes.\n modified_: false,\n // Used during finalization.\n finalized_: false,\n // Track which properties have been assigned (true) or deleted (false).\n assigned_: {},\n // The parent draft state.\n parent_: parent,\n // The base state.\n base_: base,\n // The base proxy.\n draft_: null,\n // set below\n // The base copy with any updated values.\n copy_: null,\n // Called by the `produce` function.\n revoke_: null,\n isManual_: false\n };\n let target = state;\n let traps = objectTraps;\n if (isArray) {\n target = [state];\n traps = arrayTraps;\n }\n const { revoke, proxy } = Proxy.revocable(target, traps);\n state.draft_ = proxy;\n state.revoke_ = revoke;\n return proxy;\n}\nvar objectTraps = {\n get(state, prop) {\n if (prop === DRAFT_STATE)\n return state;\n const source = latest(state);\n if (!has(source, prop)) {\n return readPropFromProto(state, source, prop);\n }\n const value = source[prop];\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value === peek(state.base_, prop)) {\n prepareCopy(state);\n return state.copy_[prop] = createProxy(value, state);\n }\n return value;\n },\n has(state, prop) {\n return prop in latest(state);\n },\n ownKeys(state) {\n return Reflect.ownKeys(latest(state));\n },\n set(state, prop, value) {\n const desc = getDescriptorFromProto(latest(state), prop);\n if (desc?.set) {\n desc.set.call(state.draft_, value);\n return true;\n }\n if (!state.modified_) {\n const current2 = peek(latest(state), prop);\n const currentState = current2?.[DRAFT_STATE];\n if (currentState && currentState.base_ === value) {\n state.copy_[prop] = value;\n state.assigned_[prop] = false;\n return true;\n }\n if (is(value, current2) && (value !== void 0 || has(state.base_, prop)))\n return true;\n prepareCopy(state);\n markChanged(state);\n }\n if (state.copy_[prop] === value && // special case: handle new props with value 'undefined'\n (value !== void 0 || prop in state.copy_) || // special case: NaN\n Number.isNaN(value) && Number.isNaN(state.copy_[prop]))\n return true;\n state.copy_[prop] = value;\n state.assigned_[prop] = true;\n return true;\n },\n deleteProperty(state, prop) {\n if (peek(state.base_, prop) !== void 0 || prop in state.base_) {\n state.assigned_[prop] = false;\n prepareCopy(state);\n markChanged(state);\n } else {\n delete state.assigned_[prop];\n }\n if (state.copy_) {\n delete state.copy_[prop];\n }\n return true;\n },\n // Note: We never coerce `desc.value` into an Immer draft, because we can't make\n // the same guarantee in ES5 mode.\n getOwnPropertyDescriptor(state, prop) {\n const owner = latest(state);\n const desc = Reflect.getOwnPropertyDescriptor(owner, prop);\n if (!desc)\n return desc;\n return {\n writable: true,\n configurable: state.type_ !== 1 /* Array */ || prop !== \"length\",\n enumerable: desc.enumerable,\n value: owner[prop]\n };\n },\n defineProperty() {\n die(11);\n },\n getPrototypeOf(state) {\n return getPrototypeOf(state.base_);\n },\n setPrototypeOf() {\n die(12);\n }\n};\nvar arrayTraps = {};\neach(objectTraps, (key, fn) => {\n arrayTraps[key] = function() {\n arguments[0] = arguments[0][0];\n return fn.apply(this, arguments);\n };\n});\narrayTraps.deleteProperty = function(state, prop) {\n if (process.env.NODE_ENV !== \"production\" && isNaN(parseInt(prop)))\n die(13);\n return arrayTraps.set.call(this, state, prop, void 0);\n};\narrayTraps.set = function(state, prop, value) {\n if (process.env.NODE_ENV !== \"production\" && prop !== \"length\" && isNaN(parseInt(prop)))\n die(14);\n return objectTraps.set.call(this, state[0], prop, value, state[0]);\n};\nfunction peek(draft, prop) {\n const state = draft[DRAFT_STATE];\n const source = state ? latest(state) : draft;\n return source[prop];\n}\nfunction readPropFromProto(state, source, prop) {\n const desc = getDescriptorFromProto(source, prop);\n return desc ? `value` in desc ? desc.value : (\n // This is a very special case, if the prop is a getter defined by the\n // prototype, we should invoke it with the draft as context!\n desc.get?.call(state.draft_)\n ) : void 0;\n}\nfunction getDescriptorFromProto(source, prop) {\n if (!(prop in source))\n return void 0;\n let proto = getPrototypeOf(source);\n while (proto) {\n const desc = Object.getOwnPropertyDescriptor(proto, prop);\n if (desc)\n return desc;\n proto = getPrototypeOf(proto);\n }\n return void 0;\n}\nfunction markChanged(state) {\n if (!state.modified_) {\n state.modified_ = true;\n if (state.parent_) {\n markChanged(state.parent_);\n }\n }\n}\nfunction prepareCopy(state) {\n if (!state.copy_) {\n state.copy_ = shallowCopy(\n state.base_,\n state.scope_.immer_.useStrictShallowCopy_\n );\n }\n}\n\n// src/core/immerClass.ts\nvar Immer2 = class {\n constructor(config) {\n this.autoFreeze_ = true;\n this.useStrictShallowCopy_ = false;\n /**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\n this.produce = (base, recipe, patchListener) => {\n if (typeof base === \"function\" && typeof recipe !== \"function\") {\n const defaultBase = recipe;\n recipe = base;\n const self = this;\n return function curriedProduce(base2 = defaultBase, ...args) {\n return self.produce(base2, (draft) => recipe.call(this, draft, ...args));\n };\n }\n if (typeof recipe !== \"function\")\n die(6);\n if (patchListener !== void 0 && typeof patchListener !== \"function\")\n die(7);\n let result;\n if (isDraftable(base)) {\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n let hasError = true;\n try {\n result = recipe(proxy);\n hasError = false;\n } finally {\n if (hasError)\n revokeScope(scope);\n else\n leaveScope(scope);\n }\n usePatchesInScope(scope, patchListener);\n return processResult(result, scope);\n } else if (!base || typeof base !== \"object\") {\n result = recipe(base);\n if (result === void 0)\n result = base;\n if (result === NOTHING)\n result = void 0;\n if (this.autoFreeze_)\n freeze(result, true);\n if (patchListener) {\n const p = [];\n const ip = [];\n getPlugin(\"Patches\").generateReplacementPatches_(base, result, p, ip);\n patchListener(p, ip);\n }\n return result;\n } else\n die(1, base);\n };\n this.produceWithPatches = (base, recipe) => {\n if (typeof base === \"function\") {\n return (state, ...args) => this.produceWithPatches(state, (draft) => base(draft, ...args));\n }\n let patches, inversePatches;\n const result = this.produce(base, recipe, (p, ip) => {\n patches = p;\n inversePatches = ip;\n });\n return [result, patches, inversePatches];\n };\n if (typeof config?.autoFreeze === \"boolean\")\n this.setAutoFreeze(config.autoFreeze);\n if (typeof config?.useStrictShallowCopy === \"boolean\")\n this.setUseStrictShallowCopy(config.useStrictShallowCopy);\n }\n createDraft(base) {\n if (!isDraftable(base))\n die(8);\n if (isDraft(base))\n base = current(base);\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n proxy[DRAFT_STATE].isManual_ = true;\n leaveScope(scope);\n return proxy;\n }\n finishDraft(draft, patchListener) {\n const state = draft && draft[DRAFT_STATE];\n if (!state || !state.isManual_)\n die(9);\n const { scope_: scope } = state;\n usePatchesInScope(scope, patchListener);\n return processResult(void 0, scope);\n }\n /**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * By default, auto-freezing is enabled.\n */\n setAutoFreeze(value) {\n this.autoFreeze_ = value;\n }\n /**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\n setUseStrictShallowCopy(value) {\n this.useStrictShallowCopy_ = value;\n }\n applyPatches(base, patches) {\n let i;\n for (i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (patch.path.length === 0 && patch.op === \"replace\") {\n base = patch.value;\n break;\n }\n }\n if (i > -1) {\n patches = patches.slice(i + 1);\n }\n const applyPatchesImpl = getPlugin(\"Patches\").applyPatches_;\n if (isDraft(base)) {\n return applyPatchesImpl(base, patches);\n }\n return this.produce(\n base,\n (draft) => applyPatchesImpl(draft, patches)\n );\n }\n};\nfunction createProxy(value, parent) {\n const draft = isMap(value) ? getPlugin(\"MapSet\").proxyMap_(value, parent) : isSet(value) ? getPlugin(\"MapSet\").proxySet_(value, parent) : createProxyProxy(value, parent);\n const scope = parent ? parent.scope_ : getCurrentScope();\n scope.drafts_.push(draft);\n return draft;\n}\n\n// src/core/current.ts\nfunction current(value) {\n if (!isDraft(value))\n die(10, value);\n return currentImpl(value);\n}\nfunction currentImpl(value) {\n if (!isDraftable(value) || isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n let copy;\n if (state) {\n if (!state.modified_)\n return state.base_;\n state.finalized_ = true;\n copy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_);\n } else {\n copy = shallowCopy(value, true);\n }\n each(copy, (key, childValue) => {\n set(copy, key, currentImpl(childValue));\n });\n if (state) {\n state.finalized_ = false;\n }\n return copy;\n}\n\n// src/plugins/patches.ts\nfunction enablePatches() {\n const errorOffset = 16;\n if (process.env.NODE_ENV !== \"production\") {\n errors.push(\n 'Sets cannot have \"replace\" patches.',\n function(op) {\n return \"Unsupported patch operation: \" + op;\n },\n function(path) {\n return \"Cannot apply patch, path doesn't resolve: \" + path;\n },\n \"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n );\n }\n const REPLACE = \"replace\";\n const ADD = \"add\";\n const REMOVE = \"remove\";\n function generatePatches_(state, basePath, patches, inversePatches) {\n switch (state.type_) {\n case 0 /* Object */:\n case 2 /* Map */:\n return generatePatchesFromAssigned(\n state,\n basePath,\n patches,\n inversePatches\n );\n case 1 /* Array */:\n return generateArrayPatches(state, basePath, patches, inversePatches);\n case 3 /* Set */:\n return generateSetPatches(\n state,\n basePath,\n patches,\n inversePatches\n );\n }\n }\n function generateArrayPatches(state, basePath, patches, inversePatches) {\n let { base_, assigned_ } = state;\n let copy_ = state.copy_;\n if (copy_.length < base_.length) {\n ;\n [base_, copy_] = [copy_, base_];\n [patches, inversePatches] = [inversePatches, patches];\n }\n for (let i = 0; i < base_.length; i++) {\n if (assigned_[i] && copy_[i] !== base_[i]) {\n const path = basePath.concat([i]);\n patches.push({\n op: REPLACE,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n inversePatches.push({\n op: REPLACE,\n path,\n value: clonePatchValueIfNeeded(base_[i])\n });\n }\n }\n for (let i = base_.length; i < copy_.length; i++) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n }\n for (let i = copy_.length - 1; base_.length <= i; --i) {\n const path = basePath.concat([i]);\n inversePatches.push({\n op: REMOVE,\n path\n });\n }\n }\n function generatePatchesFromAssigned(state, basePath, patches, inversePatches) {\n const { base_, copy_ } = state;\n each(state.assigned_, (key, assignedValue) => {\n const origValue = get(base_, key);\n const value = get(copy_, key);\n const op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD;\n if (origValue === value && op === REPLACE)\n return;\n const path = basePath.concat(key);\n patches.push(op === REMOVE ? { op, path } : { op, path, value });\n inversePatches.push(\n op === ADD ? { op: REMOVE, path } : op === REMOVE ? { op: ADD, path, value: clonePatchValueIfNeeded(origValue) } : { op: REPLACE, path, value: clonePatchValueIfNeeded(origValue) }\n );\n });\n }\n function generateSetPatches(state, basePath, patches, inversePatches) {\n let { base_, copy_ } = state;\n let i = 0;\n base_.forEach((value) => {\n if (!copy_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: REMOVE,\n path,\n value\n });\n inversePatches.unshift({\n op: ADD,\n path,\n value\n });\n }\n i++;\n });\n i = 0;\n copy_.forEach((value) => {\n if (!base_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n value\n });\n inversePatches.unshift({\n op: REMOVE,\n path,\n value\n });\n }\n i++;\n });\n }\n function generateReplacementPatches_(baseValue, replacement, patches, inversePatches) {\n patches.push({\n op: REPLACE,\n path: [],\n value: replacement === NOTHING ? void 0 : replacement\n });\n inversePatches.push({\n op: REPLACE,\n path: [],\n value: baseValue\n });\n }\n function applyPatches_(draft, patches) {\n patches.forEach((patch) => {\n const { path, op } = patch;\n let base = draft;\n for (let i = 0; i < path.length - 1; i++) {\n const parentType = getArchtype(base);\n let p = path[i];\n if (typeof p !== \"string\" && typeof p !== \"number\") {\n p = \"\" + p;\n }\n if ((parentType === 0 /* Object */ || parentType === 1 /* Array */) && (p === \"__proto__\" || p === \"constructor\"))\n die(errorOffset + 3);\n if (typeof base === \"function\" && p === \"prototype\")\n die(errorOffset + 3);\n base = get(base, p);\n if (typeof base !== \"object\")\n die(errorOffset + 2, path.join(\"/\"));\n }\n const type = getArchtype(base);\n const value = deepClonePatchValue(patch.value);\n const key = path[path.length - 1];\n switch (op) {\n case REPLACE:\n switch (type) {\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n die(errorOffset);\n default:\n return base[key] = value;\n }\n case ADD:\n switch (type) {\n case 1 /* Array */:\n return key === \"-\" ? base.push(value) : base.splice(key, 0, value);\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n return base.add(value);\n default:\n return base[key] = value;\n }\n case REMOVE:\n switch (type) {\n case 1 /* Array */:\n return base.splice(key, 1);\n case 2 /* Map */:\n return base.delete(key);\n case 3 /* Set */:\n return base.delete(patch.value);\n default:\n return delete base[key];\n }\n default:\n die(errorOffset + 1, op);\n }\n });\n return draft;\n }\n function deepClonePatchValue(obj) {\n if (!isDraftable(obj))\n return obj;\n if (Array.isArray(obj))\n return obj.map(deepClonePatchValue);\n if (isMap(obj))\n return new Map(\n Array.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n );\n if (isSet(obj))\n return new Set(Array.from(obj).map(deepClonePatchValue));\n const cloned = Object.create(getPrototypeOf(obj));\n for (const key in obj)\n cloned[key] = deepClonePatchValue(obj[key]);\n if (has(obj, DRAFTABLE))\n cloned[DRAFTABLE] = obj[DRAFTABLE];\n return cloned;\n }\n function clonePatchValueIfNeeded(obj) {\n if (isDraft(obj)) {\n return deepClonePatchValue(obj);\n } else\n return obj;\n }\n loadPlugin(\"Patches\", {\n applyPatches_,\n generatePatches_,\n generateReplacementPatches_\n });\n}\n\n// src/plugins/mapset.ts\nfunction enableMapSet() {\n class DraftMap extends Map {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 2 /* Map */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n assigned_: void 0,\n base_: target,\n draft_: this,\n isManual_: false,\n revoked_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(key) {\n return latest(this[DRAFT_STATE]).has(key);\n }\n set(key, value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!latest(state).has(key) || latest(state).get(key) !== value) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_.set(key, true);\n state.copy_.set(key, value);\n state.assigned_.set(key, true);\n }\n return this;\n }\n delete(key) {\n if (!this.has(key)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareMapCopy(state);\n markChanged(state);\n if (state.base_.has(key)) {\n state.assigned_.set(key, false);\n } else {\n state.assigned_.delete(key);\n }\n state.copy_.delete(key);\n return true;\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_ = /* @__PURE__ */ new Map();\n each(state.base_, (key) => {\n state.assigned_.set(key, false);\n });\n state.copy_.clear();\n }\n }\n forEach(cb, thisArg) {\n const state = this[DRAFT_STATE];\n latest(state).forEach((_value, key, _map) => {\n cb.call(thisArg, this.get(key), key, this);\n });\n }\n get(key) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n const value = latest(state).get(key);\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value !== state.base_.get(key)) {\n return value;\n }\n const draft = createProxy(value, state);\n prepareMapCopy(state);\n state.copy_.set(key, draft);\n return draft;\n }\n keys() {\n return latest(this[DRAFT_STATE]).keys();\n }\n values() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.values(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value\n };\n }\n };\n }\n entries() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.entries(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value: [r.value, value]\n };\n }\n };\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.entries();\n }\n }\n function proxyMap_(target, parent) {\n return new DraftMap(target, parent);\n }\n function prepareMapCopy(state) {\n if (!state.copy_) {\n state.assigned_ = /* @__PURE__ */ new Map();\n state.copy_ = new Map(state.base_);\n }\n }\n class DraftSet extends Set {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 3 /* Set */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n base_: target,\n draft_: this,\n drafts_: /* @__PURE__ */ new Map(),\n revoked_: false,\n isManual_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!state.copy_) {\n return state.base_.has(value);\n }\n if (state.copy_.has(value))\n return true;\n if (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n return true;\n return false;\n }\n add(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!this.has(value)) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.add(value);\n }\n return this;\n }\n delete(value) {\n if (!this.has(value)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n markChanged(state);\n return state.copy_.delete(value) || (state.drafts_.has(value) ? state.copy_.delete(state.drafts_.get(value)) : (\n /* istanbul ignore next */\n false\n ));\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.clear();\n }\n }\n values() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.values();\n }\n entries() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.entries();\n }\n keys() {\n return this.values();\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.values();\n }\n forEach(cb, thisArg) {\n const iterator = this.values();\n let result = iterator.next();\n while (!result.done) {\n cb.call(thisArg, result.value, result.value, this);\n result = iterator.next();\n }\n }\n }\n function proxySet_(target, parent) {\n return new DraftSet(target, parent);\n }\n function prepareSetCopy(state) {\n if (!state.copy_) {\n state.copy_ = /* @__PURE__ */ new Set();\n state.base_.forEach((value) => {\n if (isDraftable(value)) {\n const draft = createProxy(value, state);\n state.drafts_.set(value, draft);\n state.copy_.add(draft);\n } else {\n state.copy_.add(value);\n }\n });\n }\n }\n function assertUnrevoked(state) {\n if (state.revoked_)\n die(3, JSON.stringify(latest(state)));\n }\n loadPlugin(\"MapSet\", { proxyMap_, proxySet_ });\n}\n\n// src/immer.ts\nvar immer = new Immer2();\nvar produce = immer.produce;\nvar produceWithPatches = /* @__PURE__ */ immer.produceWithPatches.bind(\n immer\n);\nvar setAutoFreeze = /* @__PURE__ */ immer.setAutoFreeze.bind(immer);\nvar setUseStrictShallowCopy = /* @__PURE__ */ immer.setUseStrictShallowCopy.bind(\n immer\n);\nvar applyPatches = /* @__PURE__ */ immer.applyPatches.bind(immer);\nvar createDraft = /* @__PURE__ */ immer.createDraft.bind(immer);\nvar finishDraft = /* @__PURE__ */ immer.finishDraft.bind(immer);\nfunction castDraft(value) {\n return value;\n}\nfunction castImmutable(value) {\n return value;\n}\nexport {\n Immer2 as Immer,\n applyPatches,\n castDraft,\n castImmutable,\n createDraft,\n current,\n enableMapSet,\n enablePatches,\n finishDraft,\n freeze,\n DRAFTABLE as immerable,\n isDraft,\n isDraftable,\n NOTHING as nothing,\n original,\n produce,\n produceWithPatches,\n setAutoFreeze,\n setUseStrictShallowCopy\n};\n//# sourceMappingURL=immer.mjs.map","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...a) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...a);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","// API客户端,用于连接后端服务\n// 使用相对路径,让浏览器自动处理协议和域名\nconst API_BASE_URL = '/api';\n\nclass ApiClient {\n private baseUrl: string;\n\n constructor(baseUrl: string = API_BASE_URL) {\n this.baseUrl = baseUrl;\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const config: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n ...options,\n };\n\n try {\n const response = await fetch(url, config);\n \n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n \n return await response.json();\n } catch (error) {\n console.error(`API request failed: ${endpoint}`, error);\n throw error;\n }\n }\n\n // 会话相关API\n async getSessions(): Promise<any[]> {\n return this.request<any[]>('/sessions');\n }\n\n async createSession(data: { id: string; title: string }): Promise<any> {\n return this.request<any>('/sessions', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getSession(id: string): Promise<any> {\n return this.request<any>(`/sessions/${id}`);\n }\n\n async deleteSession(id: string): Promise<any> {\n return this.request<any>(`/sessions/${id}`, {\n method: 'DELETE',\n });\n }\n\n async getSessionMessages(sessionId: string): Promise<any[]> {\n return this.request<any[]>(`/sessions/${sessionId}/messages`);\n }\n\n // 消息相关API\n async createMessage(data: {\n id: string;\n sessionId: string;\n role: string;\n content: string;\n metadata?: any;\n toolCalls?: any[];\n createdAt?: Date;\n status?: string;\n }): Promise<any> {\n const requestData = {\n ...data,\n createdAt: data.createdAt ? data.createdAt.toISOString() : undefined\n };\n return this.request<any>('/messages', {\n method: 'POST',\n body: JSON.stringify(requestData),\n });\n }\n\n // MCP配置相关API\n async getMcpConfigs() {\n return this.request('/mcp-configs');\n }\n\n async createMcpConfig(data: {\n id: string;\n name: string;\n command: string;\n args?: any;\n env?: any;\n enabled: boolean;\n }) {\n return this.request('/mcp-configs', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateMcpConfig(id: string, data: any) {\n return this.request(`/mcp-configs/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteMcpConfig(id: string) {\n return this.request(`/mcp-configs/${id}`, {\n method: 'DELETE',\n });\n }\n\n // 系统上下文相关API\n async getSystemContext(): Promise<{ content: string }> {\n return this.request<{ content: string }>('/system-context');\n }\n\n async updateSystemContext(content: string): Promise<void> {\n return this.request<void>('/system-context', {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n }\n}\n\n// 导出单例实例\nexport const apiClient = new ApiClient();\nexport default ApiClient;","import { apiClient } from '../api/client';\nimport type { Session, Message } from './mock';\n\n// 数据库初始化\nexport function initDatabase(): Promise<void> {\n console.log('API client initialized');\n return Promise.resolve();\n}\n\n\n\n// 关闭数据库连接\nexport function closeDatabase(): Promise<void> {\n console.log('Mock database closed');\n return Promise.resolve();\n}\n\n// 数据库服务类\nexport class DatabaseService {\n constructor() {}\n\n // 会话相关操作\n async createSession(data: Omit<Session, 'id'>): Promise<Session> {\n const sessionData = { id: crypto.randomUUID(), title: data.title };\n const session = await apiClient.createSession(sessionData);\n return {\n id: session.id,\n title: session.title,\n createdAt: new Date(session.created_at),\n updatedAt: new Date(session.updated_at),\n messageCount: 0,\n tokenUsage: 0,\n pinned: false,\n archived: false,\n tags: null,\n metadata: null\n };\n }\n\n async getSession(id: string): Promise<Session | null> {\n try {\n const session = await apiClient.getSession(id);\n if (!session) return null;\n return {\n id: session.id,\n title: session.title,\n createdAt: new Date(session.created_at),\n updatedAt: new Date(session.updated_at),\n messageCount: 0,\n tokenUsage: 0,\n pinned: false,\n archived: false,\n tags: null,\n metadata: null\n };\n } catch (error) {\n return null;\n }\n }\n\n async getAllSessions(): Promise<Session[]> {\n const sessions = await apiClient.getSessions();\n // 转换字段名:数据库使用下划线命名,前端使用驼峰命名\n return sessions.map((session: any) => ({\n id: session.id,\n title: session.title,\n createdAt: new Date(session.created_at),\n updatedAt: new Date(session.updated_at),\n messageCount: 0, // 默认值,可以后续优化\n tokenUsage: 0, // 默认值,可以后续优化\n pinned: false, // 默认值\n archived: false, // 默认值\n tags: null,\n metadata: null\n }));\n }\n\n async updateSession(_id: string, _updates: Partial<Session>): Promise<Session | null> {\n // TODO: 实现更新会话API\n console.warn('updateSession not implemented yet');\n return null;\n }\n\n async deleteSession(id: string): Promise<boolean> {\n try {\n await apiClient.deleteSession(id);\n return true;\n } catch (error) {\n return false;\n }\n }\n\n // 消息相关操作\n async createMessage(data: Omit<Message, 'id'>): Promise<Message> {\n const messageData = {\n id: crypto.randomUUID(),\n session_id: data.sessionId,\n role: data.role,\n content: data.content,\n summary: data.rawContent,\n tool_calls: data.metadata?.toolCalls ? JSON.stringify(data.metadata.toolCalls) : undefined,\n tool_call_id: data.toolCallId,\n reasoning: undefined,\n metadata: data.metadata ? JSON.stringify(data.metadata) : undefined\n };\n const messageRequestData = {\n id: messageData.id,\n sessionId: messageData.session_id,\n role: messageData.role,\n content: messageData.content,\n metadata: messageData.metadata ? JSON.parse(messageData.metadata) : undefined,\n toolCalls: messageData.tool_calls ? JSON.parse(messageData.tool_calls) : undefined\n };\n const result = await apiClient.createMessage(messageRequestData);\n return {\n id: result.id,\n sessionId: result.session_id,\n role: result.role as any,\n content: result.content,\n rawContent: result.summary,\n tokensUsed: data.tokensUsed,\n status: data.status || 'completed',\n createdAt: new Date(result.created_at),\n updatedAt: data.updatedAt,\n toolCallId: result.tool_call_id,\n metadata: result.metadata ? JSON.parse(result.metadata) : data.metadata\n };\n }\n\n async getSessionMessages(sessionId: string): Promise<Message[]> {\n const messages = await apiClient.getSessionMessages(sessionId);\n return messages.map(message => ({\n id: message.id,\n sessionId: message.session_id,\n role: message.role as any,\n content: message.content,\n rawContent: message.summary,\n tokensUsed: undefined,\n status: 'completed' as const,\n createdAt: new Date(message.created_at),\n updatedAt: undefined,\n toolCallId: message.tool_call_id,\n metadata: message.metadata ? JSON.parse(message.metadata) : undefined\n }));\n }\n\n async updateMessage(_id: string, _updates: Partial<Message>): Promise<Message | null> {\n // TODO: 实现更新消息API\n console.warn('updateMessage not implemented yet');\n return null;\n }\n\n async deleteMessage(_id: string): Promise<boolean> {\n // TODO: 实现删除消息API\n console.warn('deleteMessage not implemented yet');\n return false;\n }\n\n // 私有方法:更新会话统计\n // private async updateSessionStats(_sessionId: string): Promise<void> {\n // const messages = await this.getSessionMessages(_sessionId);\n // const messageCount = messages.length;\n // \n // await this.updateSession(_sessionId, {\n // messageCount,\n // updatedAt: new Date()\n // });\n // }\n}\n\n// 导出默认实例\nexport const databaseService = new DatabaseService();\n\n// 导出类型\nexport type { Session, Message };","import { databaseService } from '../database';\nimport type { Message } from '../../types';\n\n/**\n * 统一的消息保存管理器\n * 负责管理所有消息的保存逻辑,避免重复保存\n */\nexport class MessageManager {\n private static instance: MessageManager;\n private pendingSaves = new Set<string>(); // 跟踪正在保存的消息ID\n private savedMessages = new Map<string, Message>(); // 缓存已保存的消息\n\n private constructor() {}\n\n static getInstance(): MessageManager {\n if (!MessageManager.instance) {\n MessageManager.instance = new MessageManager();\n }\n return MessageManager.instance;\n }\n\n /**\n * 保存用户消息\n */\n async saveUserMessage(data: Omit<Message, 'id'>): Promise<Message> {\n const messageKey = `${data.sessionId}-${data.role}-${data.content}-${data.createdAt?.getTime()}`;\n \n // 检查是否正在保存或已保存\n if (this.pendingSaves.has(messageKey)) {\n // 等待正在进行的保存完成\n while (this.pendingSaves.has(messageKey)) {\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n const saved = this.savedMessages.get(messageKey);\n if (saved) return saved;\n }\n\n this.pendingSaves.add(messageKey);\n \n try {\n const savedMessage = await databaseService.createMessage(data);\n this.savedMessages.set(messageKey, savedMessage);\n return savedMessage;\n } finally {\n this.pendingSaves.delete(messageKey);\n }\n }\n\n /**\n * 保存助手消息\n */\n async saveAssistantMessage(data: Omit<Message, 'id'>): Promise<Message> {\n const messageKey = `${data.sessionId}-${data.role}-${JSON.stringify(data.metadata?.toolCalls || [])}-${data.createdAt?.getTime()}`;\n \n // 检查是否正在保存或已保存\n if (this.pendingSaves.has(messageKey)) {\n // 等待正在进行的保存完成\n while (this.pendingSaves.has(messageKey)) {\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n const saved = this.savedMessages.get(messageKey);\n if (saved) return saved;\n }\n\n this.pendingSaves.add(messageKey);\n \n try {\n const savedMessage = await databaseService.createMessage(data);\n this.savedMessages.set(messageKey, savedMessage);\n return savedMessage;\n } finally {\n this.pendingSaves.delete(messageKey);\n }\n }\n\n /**\n * 保存工具调用结果消息\n */\n async saveToolMessage(data: Omit<Message, 'id'>): Promise<Message> {\n const messageKey = `${data.sessionId}-${data.role}-${data.content}-${data.createdAt?.getTime()}`;\n \n // 检查是否正在保存或已保存\n if (this.pendingSaves.has(messageKey)) {\n // 等待正在进行的保存完成\n while (this.pendingSaves.has(messageKey)) {\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n const saved = this.savedMessages.get(messageKey);\n if (saved) return saved;\n }\n\n this.pendingSaves.add(messageKey);\n \n try {\n const savedMessage = await databaseService.createMessage(data);\n this.savedMessages.set(messageKey, savedMessage);\n return savedMessage;\n } finally {\n this.pendingSaves.delete(messageKey);\n }\n }\n\n /**\n * 通用保存消息方法\n */\n async saveMessage(data: Omit<Message, 'id'>): Promise<Message> {\n switch (data.role) {\n case 'user':\n return this.saveUserMessage(data);\n case 'assistant':\n return this.saveAssistantMessage(data);\n case 'tool':\n return this.saveToolMessage(data);\n default:\n // 对于其他角色,直接保存\n return databaseService.createMessage(data);\n }\n }\n\n /**\n * 清理缓存(可选,用于内存管理)\n */\n clearCache(): void {\n this.savedMessages.clear();\n }\n\n /**\n * 获取缓存统计信息\n */\n getCacheStats(): { pendingCount: number; cachedCount: number } {\n return {\n pendingCount: this.pendingSaves.size,\n cachedCount: this.savedMessages.size\n };\n }\n}\n\n// 导出单例实例\nexport const messageManager = MessageManager.getInstance();","import {create} from 'zustand';\nimport {subscribeWithSelector} from 'zustand/middleware';\nimport {immer} from 'zustand/middleware/immer';\nimport {persist} from 'zustand/middleware';\nimport type {Message, Session, ChatConfig, Theme, McpConfig, AiModelConfig} from '../../types';\nimport {databaseService} from '../database';\n\nimport {apiClient} from '../api/client';\nimport {messageManager} from '../services/messageManager';\n// import { generateId } from '../utils';\n\n// 聊天状态接口\ninterface ChatState {\n // 会话相关\n sessions: Session[];\n currentSessionId: string | null;\n currentSession: Session | null;\n\n // 消息相关\n messages: Message[];\n isLoading: boolean;\n isStreaming: boolean;\n streamingMessageId: string | null;\n\n // UI状态\n sidebarOpen: boolean;\n theme: Theme;\n\n // 配置\n chatConfig: ChatConfig;\n mcpConfigs: McpConfig[];\n aiModelConfigs: AiModelConfig[];\n selectedModelId: string | null;\n systemContext: string | null;\n\n // 错误处理\n error: string | null;\n}\n\n// 聊天操作接口\ninterface ChatActions {\n // 会话操作\n loadSessions: () => Promise<void>;\n createSession: (title?: string) => Promise<string>;\n selectSession: (sessionId: string) => Promise<void>;\n updateSession: (sessionId: string, updates: Partial<Session>) => Promise<void>;\n deleteSession: (sessionId: string) => Promise<void>;\n\n // 消息操作\n loadMessages: (sessionId: string) => Promise<void>;\n sendMessage: (content: string, attachments?: any[]) => Promise<void>;\n updateMessage: (messageId: string, updates: Partial<Message>) => Promise<void>;\n deleteMessage: (messageId: string) => Promise<void>;\n\n // 流式消息处理\n startStreaming: (messageId: string) => void;\n updateStreamingMessage: (content: string) => void;\n stopStreaming: () => void;\n\n // UI操作\n toggleSidebar: () => void;\n setTheme: (theme: Theme) => void;\n\n // 配置操作\n updateChatConfig: (config: Partial<ChatConfig>) => Promise<void>;\n loadMcpConfigs: () => Promise<void>;\n updateMcpConfig: (config: McpConfig) => Promise<void>;\n deleteMcpConfig: (id: string) => Promise<void>;\n loadAiModelConfigs: () => Promise<void>;\n updateAiModelConfig: (config: AiModelConfig) => Promise<void>;\n deleteAiModelConfig: (id: string) => Promise<void>;\n setSelectedModel: (modelId: string | null) => void;\n loadSystemContext: () => Promise<void>;\n updateSystemContext: (content: string) => Promise<void>;\n\n // 错误处理\n setError: (error: string | null) => void;\n clearError: () => void;\n}\n\n// 创建聊天store\nexport const useChatStore = create<ChatState & ChatActions>()\n(subscribeWithSelector(\n immer(\n persist(\n (set, get) => ({\n // 初始状态\n sessions: [],\n currentSessionId: null,\n currentSession: null,\n messages: [],\n isLoading: false,\n isStreaming: false,\n streamingMessageId: null,\n sidebarOpen: true,\n theme: 'light',\n chatConfig: {\n model: 'gpt-4',\n temperature: 0.7,\n maxTokens: 2048,\n systemPrompt: '',\n enableMcp: true,\n },\n mcpConfigs: [],\n aiModelConfigs: [],\n systemContext: null,\n selectedModelId: null,\n error: null,\n\n // 会话操作\n loadSessions: async () => {\n try {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n const sessions = await databaseService.getAllSessions();\n\n set((state) => {\n state.sessions = sessions;\n state.isLoading = false;\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load sessions';\n state.isLoading = false;\n });\n }\n },\n\n createSession: async (title = 'New Chat') => {\n try {\n const session = await databaseService.createSession({\n title,\n createdAt: new Date(),\n updatedAt: new Date(),\n messageCount: 0,\n tokenUsage: 0,\n pinned: false,\n archived: false,\n });\n\n set((state) => {\n state.sessions.unshift(session);\n state.currentSessionId = session.id;\n state.currentSession = session;\n state.messages = [];\n });\n\n return session.id;\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to create session';\n });\n throw error;\n }\n },\n\n selectSession: async (sessionId: string) => {\n try {\n console.log('🔍 selectSession 被调用,sessionId:', sessionId);\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n console.log('✅ isLoading 已设置为 true');\n\n const {conversationsApi} = await import('../api');\n const sessionResponse = await conversationsApi.getDetails(sessionId);\n const messagesResponse = await conversationsApi.getMessages(sessionId);\n console.log('✅ API 调用完成,获取到会话和消息数据');\n console.log('📊 原始消息数据结构:', messagesResponse);\n const messages = messagesResponse.data?.messages || [];\n console.log('📊 解析后的消息数组:', messages.length, '条消息');\n messages.forEach((msg: any, index: number) => {\n console.log(`📝 消息 ${index + 1}:`, {\n id: msg.id,\n role: msg.role,\n content: msg.content ? msg.content.substring(0, 100) + '...' : '(空内容)',\n metadata: msg.metadata,\n hasToolCalls: !!(msg.metadata && msg.metadata.toolCalls),\n toolCallsCount: msg.metadata?.toolCalls ? msg.metadata.toolCalls.length : 0,\n toolCallsPreview: msg.metadata?.toolCalls ? msg.metadata.toolCalls.map((tc: any) => tc.name || tc.type) : []\n });\n });\n\n set((state) => {\n state.currentSessionId = sessionId;\n const conversation = sessionResponse.data.conversation;\n state.currentSession = {\n id: conversation.id,\n title: conversation.title,\n createdAt: new Date(conversation.created_at),\n updatedAt: new Date(conversation.updated_at),\n messageCount: (conversation as any).messageCount || 0,\n tokenUsage: (conversation as any).tokenUsage || 0,\n tags: (conversation as any).tags || null,\n pinned: (conversation as any).pinned || false,\n archived: (conversation as any).archived || false,\n metadata: (conversation as any).metadata || null\n };\n // 转换消息格式并确保正确排序\n const messages = messagesResponse.data.messages.map((msg: any, index: number) => {\n const processed = {\n ...msg,\n createdAt: new Date(msg.created_at || msg.createdAt),\n updatedAt: msg.updated_at ? new Date(msg.updated_at) : undefined,\n status: msg.status || 'completed'\n };\n console.log(`🔄 处理消息 ${index + 1} (${msg.id}):`, {\n 原始content: msg.content,\n 原始metadata: msg.metadata,\n 处理后content: processed.content,\n 处理后metadata: processed.metadata\n });\n return processed;\n });\n\n // 按创建时间排序,确保最早的消息在前面,最新的在后面\n state.messages = messages.sort((a: any, b: any) => {\n const timeA = a.createdAt.getTime();\n const timeB = b.createdAt.getTime();\n return timeA - timeB;\n });\n console.log('✅ 最终存储的messages数量:', messages.length);\n state.isLoading = false;\n });\n console.log('✅ selectSession 完成,currentSessionId 已设置为:', sessionId);\n } catch (error) {\n console.error('❌ selectSession 失败:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load session';\n state.isLoading = false;\n });\n }\n },\n\n updateSession: async (sessionId: string, updates: Partial<Session>) => {\n try {\n await databaseService.updateSession(sessionId, updates);\n\n set((state) => {\n const sessionIndex = state.sessions.findIndex(s => s.id === sessionId);\n if (sessionIndex !== -1) {\n state.sessions[sessionIndex] = {...state.sessions[sessionIndex], ...updates};\n }\n\n if (state.currentSessionId === sessionId && state.currentSession) {\n state.currentSession = {...state.currentSession, ...updates};\n }\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update session';\n });\n }\n },\n\n deleteSession: async (sessionId: string) => {\n try {\n await databaseService.deleteSession(sessionId);\n\n set((state) => {\n state.sessions = state.sessions.filter(s => s.id !== sessionId);\n\n if (state.currentSessionId === sessionId) {\n state.currentSessionId = null;\n state.currentSession = null;\n state.messages = [];\n }\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete session';\n });\n }\n },\n\n // 消息操作\n loadMessages: async (sessionId: string) => {\n try {\n const {conversationsApi} = await import('../api');\n const messagesResponse = await conversationsApi.getMessages(sessionId);\n\n console.log('=== loadMessages Debug ===');\n console.log('Session ID:', sessionId);\n console.log('Raw messages from API:', messagesResponse.data.messages.length);\n \n messagesResponse.data.messages.forEach((msg: any, index: number) => {\n console.log(`Message ${index + 1}:`, {\n id: msg.id,\n role: msg.role,\n content: msg.content ? msg.content.substring(0, 100) + '...' : '[EMPTY]',\n hasToolCalls: !!(msg.toolCalls || msg.metadata?.toolCalls),\n tool_calls: msg.tool_calls ? 'YES' : 'NO'\n });\n });\n\n set((state) => {\n // 转换消息格式并确保正确排序\n const messages = messagesResponse.data.messages.map((msg: any) => {\n // 构建metadata对象,确保工具调用正确映射\n const metadata = {\n ...msg.metadata,\n // 将服务器返回的toolCalls字段映射到metadata.toolCalls\n toolCalls: msg.toolCalls || msg.metadata?.toolCalls || [],\n };\n\n return {\n ...msg,\n createdAt: new Date(msg.created_at || msg.createdAt),\n status: msg.status || 'completed',\n metadata\n };\n });\n\n // 按创建时间排序,确保最早的消息在前面,最新的在后面\n state.messages = messages.sort((a: any, b: any) => {\n const timeA = a.createdAt.getTime();\n const timeB = b.createdAt.getTime();\n return timeA - timeB;\n });\n \n console.log('Final processed messages:', state.messages.length);\n state.messages.forEach((msg: any, index: number) => {\n console.log(`Processed ${index + 1}:`, {\n id: msg.id,\n role: msg.role,\n content: msg.content ? msg.content.substring(0, 50) + '...' : '[EMPTY]',\n hasMetadataToolCalls: !!(msg.metadata?.toolCalls?.length),\n toolCallsCount: msg.metadata?.toolCalls?.length || 0\n });\n });\n });\n } catch (error) {\n console.error('loadMessages error:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load messages';\n });\n }\n },\n\n sendMessage: async (content: string, attachments = []) => {\n const {currentSessionId, selectedModelId, aiModelConfigs} = get();\n\n if (!currentSessionId) {\n throw new Error('No active session');\n }\n\n if (!selectedModelId) {\n throw new Error('请先选择一个AI模型');\n }\n\n const selectedModel = aiModelConfigs.find(model => model.id === selectedModelId);\n if (!selectedModel || !selectedModel.enabled) {\n throw new Error('选择的模型不可用');\n }\n\n try {\n // 创建用户消息\n const userMessageTime = new Date();\n const userMessage = await messageManager.saveUserMessage({\n sessionId: currentSessionId,\n role: 'user',\n content,\n status: 'completed',\n createdAt: userMessageTime,\n metadata: {\n ...(attachments.length > 0 ? {attachments} : {}),\n model: selectedModel.model_name,\n modelConfig: {\n id: selectedModel.id,\n name: selectedModel.name,\n base_url: selectedModel.base_url,\n model_name: selectedModel.model_name,\n }\n },\n });\n\n set((state) => {\n state.messages.push(userMessage);\n state.isLoading = true;\n });\n\n // 创建临时的助手消息用于UI显示,但不保存到数据库\n const assistantMessageTime = new Date(userMessageTime.getTime() + 1);\n const tempAssistantMessage = {\n id: `temp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n sessionId: currentSessionId,\n role: 'assistant' as const,\n content: '',\n status: 'streaming' as const,\n createdAt: assistantMessageTime,\n metadata: {\n model: selectedModel.model_name,\n modelConfig: {\n id: selectedModel.id,\n name: selectedModel.name,\n base_url: selectedModel.base_url,\n model_name: selectedModel.model_name,\n },\n toolCalls: [], // 初始化工具调用数组\n contentSegments: [{ content: '', type: 'text' as const }], // 初始化内容分段\n currentSegmentIndex: 0 // 当前正在写入的分段索引\n },\n };\n\n set((state) => {\n state.messages.push(tempAssistantMessage);\n state.isStreaming = true;\n state.streamingMessageId = tempAssistantMessage.id;\n });\n\n // 使用ChatService发送消息\n const {chatService} = await import('../services');\n\n // 构建模型配置\n const {chatConfig} = get();\n const modelConfig = selectedModel ? {\n model_name: selectedModel.model_name,\n temperature: chatConfig.temperature,\n max_tokens: 16000,\n api_key: selectedModel.api_key,\n base_url: selectedModel.base_url\n } : undefined;\n // 设置回调函数处理AI响应\n await chatService.sendMessage(currentSessionId, content, attachments, {\n onChunk: (data: any) => {\n // 更新流式消息内容\n set((state) => {\n const message = state.messages.find(m => m.id === tempAssistantMessage.id);\n if (message && message.metadata) {\n // 确保data.content是字符串,如果是对象则提取content字段\n const content = typeof data.content === 'string' ? data.content :\n (typeof data === 'string' ? data :\n (data.content || ''));\n \n // 获取当前分段索引\n const currentIndex = message.metadata.currentSegmentIndex || 0;\n const segments = message.metadata.contentSegments || [];\n \n // 确保当前分段存在且为文本类型\n if (segments[currentIndex] && segments[currentIndex].type === 'text') {\n segments[currentIndex].content += content;\n } else {\n // 如果当前分段不存在或不是文本类型,创建新的文本分段\n segments.push({ content, type: 'text' as const });\n message.metadata.currentSegmentIndex = segments.length - 1;\n }\n \n // 更新完整内容用于向后兼容\n message.content = segments.filter((s: any) => s.type === 'text').map((s: any) => s.content).join('');\n }\n });\n },\n onToolCall: (toolCalls: any) => {\n // 处理工具调用\n console.log('Tool calls:', toolCalls);\n set((state) => {\n const message = state.messages.find(m => m.id === tempAssistantMessage.id);\n if (message && message.metadata) {\n // 将工具调用添加到消息的metadata中\n if (!message.metadata.toolCalls) {\n message.metadata.toolCalls = [];\n }\n \n const segments = message.metadata.contentSegments || [];\n \n // 添加新的工具调用\n if (Array.isArray(toolCalls)) {\n toolCalls.forEach((tc: any) => {\n const toolCall = {\n id: tc.id,\n messageId: message.id,\n name: tc.function?.name || tc.name,\n arguments: tc.function?.arguments || tc.arguments,\n result: '',\n createdAt: new Date()\n };\n message.metadata!.toolCalls!.push(toolCall);\n \n // 添加工具调用分段\n segments.push({\n content: '',\n type: 'tool_call' as const,\n toolCallId: toolCall.id\n });\n });\n } else {\n const toolCall = {\n id: toolCalls.id,\n messageId: message.id,\n name: toolCalls.function?.name || toolCalls.name,\n arguments: toolCalls.function?.arguments || toolCalls.arguments,\n result: '',\n createdAt: new Date()\n };\n message.metadata!.toolCalls!.push(toolCall);\n \n // 添加工具调用分段\n segments.push({ \n content: '',\n type: 'tool_call' as const,\n toolCallId: toolCalls.id\n });\n }\n \n // 为工具调用后的内容创建新的文本分段\n segments.push({ content: '', type: 'text' as const });\n message.metadata!.currentSegmentIndex = segments.length - 1;\n }\n });\n },\n onToolResult: (results: any) => {\n // 处理工具结果\n console.log('Tool results:', results);\n set((state) => {\n const message = state.messages.find(m => m.id === tempAssistantMessage.id);\n if (message && message.metadata && message.metadata.toolCalls) {\n // 更新对应工具调用的结果\n if (Array.isArray(results)) {\n results.forEach((result: any) => {\n const toolCall = message.metadata!.toolCalls!.find((tc: any) => tc.id === result.toolCallId);\n if (toolCall) {\n toolCall.result = result.result;\n }\n });\n } else if (results.toolCallId) {\n const toolCall = message.metadata!.toolCalls!.find((tc: any) => tc.id === results.toolCallId);\n if (toolCall) {\n toolCall.result = results.result;\n }\n }\n }\n });\n },\n onToolStreamChunk: (data: any) => {\n // 更新工具调用的流式返回内容\n set((state) => {\n const message = state.messages.find(m => m.id === tempAssistantMessage.id);\n if (message && message.metadata && message.metadata.toolCalls) {\n const toolCall = message.metadata.toolCalls.find((tc: any) => tc.id === data.toolCallId);\n if (toolCall) {\n toolCall.result = (toolCall.result || '') + data.chunk;\n }\n }\n });\n },\n onComplete: async () => {\n // 完成流式响应,将临时消息转换为真实消息并保存\n try {\n const tempMessage = get().messages.find(m => m.id === tempAssistantMessage.id);\n if (tempMessage) {\n // 准备保存数据,包含工具调用信息\n const messageData: any = {\n sessionId: currentSessionId,\n role: 'assistant',\n content: tempMessage.content,\n status: 'completed',\n createdAt: tempMessage.createdAt,\n metadata: tempMessage.metadata\n };\n \n // 如果有工具调用,添加toolCalls字段\n if (tempMessage.metadata?.toolCalls && tempMessage.metadata.toolCalls.length > 0) {\n messageData.toolCalls = tempMessage.metadata.toolCalls.map((tc: any) => ({\n id: tc.id,\n function: {\n name: tc.name,\n arguments: typeof tc.arguments === 'string' ? tc.arguments : JSON.stringify(tc.arguments)\n }\n }));\n }\n \n // 保存助手消息到数据库\n const savedMessage = await messageManager.saveAssistantMessage(messageData);\n \n // 工具调用结果的保存由toolResultProcessor统一处理,避免重复保存\n // 这里只保存assistant消息,tool消息由ToolResultProcessor处理\n \n // 更新状态,用真实消息替换临时消息\n set((state) => {\n const tempIndex = state.messages.findIndex(m => m.id === tempAssistantMessage.id);\n if (tempIndex !== -1) {\n state.messages[tempIndex] = savedMessage;\n }\n state.isLoading = false;\n state.isStreaming = false;\n state.streamingMessageId = null;\n });\n \n // 重新选择当前会话以确保工具调用正确显示\n if (currentSessionId) {\n await get().selectSession(currentSessionId);\n }\n }\n } catch (error) {\n console.error('Failed to save assistant message:', error);\n // 如果保存失败,仍然更新状态\n set((state) => {\n state.isLoading = false;\n state.isStreaming = false;\n state.streamingMessageId = null;\n });\n }\n },\n onError: (error: any) => {\n // 处理错误\n set((state) => {\n state.error = error.message || 'AI response failed';\n state.isLoading = false;\n state.isStreaming = false;\n state.streamingMessageId = null;\n });\n }\n }, modelConfig);\n\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to send message';\n state.isLoading = false;\n state.isStreaming = false;\n state.streamingMessageId = null;\n });\n }\n },\n\n updateMessage: async (messageId: string, updates: Partial<Message>) => {\n try {\n // 过滤掉数据库不支持的字段,特别是'tool'角色\n const dbUpdates = {\n ...updates,\n // 如果role是'tool',则不更新role字段\n ...(updates.role === 'tool' ? { role: undefined } : {})\n };\n \n // 移除undefined的role字段\n if (dbUpdates.role === undefined) {\n delete (dbUpdates as any).role;\n }\n \n await databaseService.updateMessage(messageId, dbUpdates as any);\n\n set((state) => {\n const messageIndex = state.messages.findIndex(m => m.id === messageId);\n if (messageIndex !== -1) {\n state.messages[messageIndex] = {...state.messages[messageIndex], ...updates};\n }\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update message';\n });\n }\n },\n\n deleteMessage: async (messageId: string) => {\n try {\n await databaseService.deleteMessage(messageId);\n\n set((state) => {\n state.messages = state.messages.filter(m => m.id !== messageId);\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete message';\n });\n }\n },\n\n // 流式消息处理\n startStreaming: (messageId: string) => {\n set((state) => {\n state.isStreaming = true;\n state.streamingMessageId = messageId;\n });\n },\n\n updateStreamingMessage: (content: string) => {\n const {streamingMessageId} = get();\n if (!streamingMessageId) return;\n\n set((state) => {\n const messageIndex = state.messages.findIndex(m => m.id === streamingMessageId);\n if (messageIndex !== -1) {\n state.messages[messageIndex].content = content;\n }\n });\n },\n\n stopStreaming: () => {\n const {streamingMessageId} = get();\n\n set((state) => {\n state.isStreaming = false;\n state.isLoading = false;\n state.streamingMessageId = null;\n });\n\n // 保存最终消息到数据库\n if (streamingMessageId) {\n const message = get().messages.find(m => m.id === streamingMessageId);\n if (message) {\n databaseService.updateMessage(streamingMessageId, {\n content: message.content,\n updatedAt: new Date(),\n });\n }\n }\n },\n\n // UI操作\n toggleSidebar: () => {\n set((state) => {\n state.sidebarOpen = !state.sidebarOpen;\n });\n },\n\n setTheme: (theme: Theme) => {\n set((state) => {\n state.theme = theme;\n });\n },\n\n // 配置操作\n updateChatConfig: async (config: Partial<ChatConfig>) => {\n try {\n const newConfig = {...get().chatConfig, ...config};\n\n set((state) => {\n state.chatConfig = newConfig;\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update config';\n });\n }\n },\n\n loadMcpConfigs: async () => {\n try {\n const configs = await apiClient.getMcpConfigs() as any[];\n set((state) => {\n state.mcpConfigs = configs.map((config: any) => ({\n id: config.id,\n name: config.name,\n serverUrl: config.command, // 后端使用command字段存储serverUrl\n enabled: config.enabled,\n createdAt: new Date(config.created_at),\n updatedAt: new Date(config.created_at) // 使用created_at作为updatedAt\n }));\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load MCP configs';\n });\n }\n },\n\n updateMcpConfig: async (config: McpConfig) => {\n try {\n const configIndex = get().mcpConfigs.findIndex(c => c.id === config.id);\n\n if (configIndex !== -1) {\n // 更新现有配置\n await apiClient.updateMcpConfig(config.id, {\n name: config.name,\n command: config.serverUrl, // 后端使用command字段存储serverUrl\n enabled: config.enabled,\n args: '[]',\n env: '{}'\n });\n } else {\n // 创建新配置\n await apiClient.createMcpConfig({\n id: config.id,\n name: config.name,\n command: config.serverUrl, // 后端使用command字段存储serverUrl\n enabled: config.enabled,\n args: '[]',\n env: '{}'\n });\n }\n\n // 更新本地状态\n set((state) => {\n const configIndex = state.mcpConfigs.findIndex(c => c.id === config.id);\n if (configIndex !== -1) {\n state.mcpConfigs[configIndex] = config;\n } else {\n state.mcpConfigs.push(config);\n }\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update MCP config';\n });\n }\n },\n\n deleteMcpConfig: async (id: string) => {\n try {\n await apiClient.deleteMcpConfig(id);\n set((state) => {\n state.mcpConfigs = state.mcpConfigs.filter(config => config.id !== id);\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete MCP config';\n });\n }\n },\n\n // AI模型配置操作\n loadAiModelConfigs: async () => {\n try {\n const response = await fetch('/api/ai-model-configs');\n if (!response.ok) {\n throw new Error('Failed to load AI model configs');\n }\n const apiConfigs = await response.json();\n\n // 转换后端数据格式为前端格式\n const configs = apiConfigs.map((config: any) => ({\n id: config.id,\n name: config.name,\n base_url: config.base_url,\n api_key: config.api_key,\n model_name: config.model,\n enabled: config.enabled,\n createdAt: new Date(config.created_at),\n updatedAt: new Date(config.created_at) // 使用created_at作为默认值\n }));\n\n set((state) => {\n state.aiModelConfigs = configs;\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load AI model configs';\n });\n }\n },\n\n updateAiModelConfig: async (config: AiModelConfig) => {\n try {\n const existingConfig = get().aiModelConfigs.find(c => c.id === config.id);\n const method = existingConfig ? 'PUT' : 'POST';\n const url = existingConfig ? `/api/ai-model-configs/${config.id}` : '/api/ai-model-configs';\n\n // 转换字段名以匹配后端API\n const apiData = {\n id: config.id,\n name: config.name,\n provider: 'openai', // 默认provider\n model: config.model_name,\n apiKey: config.api_key,\n baseUrl: config.base_url,\n enabled: config.enabled\n };\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(apiData),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to save AI model config: ${errorText}`);\n }\n\n // 更新本地状态\n set((state) => {\n const configIndex = state.aiModelConfigs.findIndex(c => c.id === config.id);\n if (configIndex !== -1) {\n state.aiModelConfigs[configIndex] = config;\n } else {\n state.aiModelConfigs.push(config);\n }\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update AI model config';\n });\n }\n },\n\n deleteAiModelConfig: async (id: string) => {\n try {\n const response = await fetch(`/api/ai-model-configs/${id}`, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete AI model config');\n }\n\n // 更新本地状态\n set((state) => {\n state.aiModelConfigs = state.aiModelConfigs.filter(config => config.id !== id);\n // 如果删除的是当前选中的模型,清除选择\n if (state.selectedModelId === id) {\n state.selectedModelId = null;\n }\n });\n } catch (error) {\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete AI model config';\n });\n }\n },\n\n // 错误处理\n setError: (error: string | null) => {\n set((state) => {\n state.error = error;\n });\n },\n\n clearError: () => {\n set((state) => {\n state.error = null;\n });\n },\n\n setSelectedModel: (modelId: string | null) => {\n set((state) => {\n state.selectedModelId = modelId;\n });\n },\n\n // 系统上下文操作\n loadSystemContext: async () => {\n try {\n console.log('Store: Loading system context from API');\n const response = await apiClient.getSystemContext();\n console.log('Store: API response:', response);\n set((state) => {\n state.systemContext = response.content || null;\n });\n console.log('Store: System context set to:', response.content || null);\n } catch (error) {\n console.error('Store: Failed to load system context:', error);\n set((state) => {\n state.systemContext = null;\n });\n }\n },\n\n updateSystemContext: async (content: string) => {\n try {\n await apiClient.updateSystemContext(content);\n set((state) => {\n state.systemContext = content;\n });\n } catch (error) {\n console.error('Failed to update system context:', error);\n throw error;\n }\n },\n }),\n {\n name: 'chat-store',\n partialize: (state) => ({\n theme: state.theme,\n sidebarOpen: state.sidebarOpen,\n chatConfig: state.chatConfig,\n selectedModelId: state.selectedModelId,\n }),\n }\n )\n )\n));\n\n// 选择器hooks\nexport const useCurrentSession = () => useChatStore((state) => state.currentSession);\nexport const useMessages = () => useChatStore((state) => state.messages);\nexport const useSessions = () => useChatStore((state) => state.sessions);\nexport const useIsLoading = () => useChatStore((state) => state.isLoading);\nexport const useIsStreaming = () => useChatStore((state) => state.isStreaming);\nexport const useTheme = () => useChatStore((state) => state.theme);\nexport const useSidebarOpen = () => useChatStore((state) => state.sidebarOpen);\nexport const useError = () => useChatStore((state) => state.error);\nexport const useAiModelConfigs = () => useChatStore((state) => state.aiModelConfigs);\nexport const useSelectedModelId = () => useChatStore((state) => state.selectedModelId);","import {create} from 'zustand';\nimport {subscribeWithSelector} from 'zustand/middleware';\nimport {immer} from 'zustand/middleware/immer';\nimport {persist} from 'zustand/middleware';\nimport type {Message, Session, ChatConfig, Theme, McpConfig, AiModelConfig} from '../../types';\nimport {databaseService} from '../database';\nimport {apiClient} from '../api/client';\n// import {messageManager} from '../services/messageManager'; // Not used in this implementation\nimport type ApiClient from '../api/client';\n\n// 聊天状态接口\ninterface ChatState {\n // 会话相关\n sessions: Session[];\n currentSessionId: string | null;\n currentSession: Session | null;\n\n // 消息相关\n messages: Message[];\n isLoading: boolean;\n isStreaming: boolean;\n streamingMessageId: string | null;\n\n // UI状态\n sidebarOpen: boolean;\n theme: Theme;\n\n // 配置\n chatConfig: ChatConfig;\n mcpConfigs: McpConfig[];\n aiModelConfigs: AiModelConfig[];\n selectedModelId: string | null;\n systemContext: string | null;\n\n // 错误处理\n error: string | null;\n}\n\n// 聊天操作接口\ninterface ChatActions {\n // 会话操作\n loadSessions: () => Promise<void>;\n createSession: (title?: string) => Promise<string>;\n selectSession: (sessionId: string) => Promise<void>;\n updateSession: (sessionId: string, updates: Partial<Session>) => Promise<void>;\n deleteSession: (sessionId: string) => Promise<void>;\n\n // 消息操作\n loadMessages: (sessionId: string) => Promise<void>;\n sendMessage: (content: string, attachments?: any[]) => Promise<void>;\n updateMessage: (messageId: string, updates: Partial<Message>) => Promise<void>;\n deleteMessage: (messageId: string) => Promise<void>;\n\n // 流式消息处理\n startStreaming: (messageId: string) => void;\n updateStreamingMessage: (content: string) => void;\n stopStreaming: () => void;\n\n // UI操作\n toggleSidebar: () => void;\n setTheme: (theme: Theme) => void;\n\n // 配置操作\n updateChatConfig: (config: Partial<ChatConfig>) => Promise<void>;\n loadMcpConfigs: () => Promise<void>;\n updateMcpConfig: (config: McpConfig) => Promise<void>;\n deleteMcpConfig: (id: string) => Promise<void>;\n loadAiModelConfigs: () => Promise<void>;\n updateAiModelConfig: (config: AiModelConfig) => Promise<void>;\n deleteAiModelConfig: (id: string) => Promise<void>;\n setSelectedModel: (modelId: string | null) => void;\n loadSystemContext: () => Promise<void>;\n updateSystemContext: (content: string) => Promise<void>;\n\n // 错误处理\n setError: (error: string | null) => void;\n clearError: () => void;\n}\n\n/**\n * 创建聊天store的工厂函数\n * @param customApiClient 自定义的API客户端实例,如果不提供则使用默认的apiClient\n * @returns 聊天store hook\n */\nexport function createChatStore(customApiClient?: ApiClient) {\n const client = customApiClient || apiClient;\n \n return create<ChatState & ChatActions>()\n (subscribeWithSelector(\n immer(\n persist(\n (set, get) => ({\n // 初始状态\n sessions: [],\n currentSessionId: null,\n currentSession: null,\n messages: [],\n isLoading: false,\n isStreaming: false,\n streamingMessageId: null,\n sidebarOpen: true,\n theme: 'light',\n chatConfig: {\n model: 'gpt-4',\n temperature: 0.7,\n maxTokens: 2048,\n systemPrompt: '',\n enableMcp: true,\n },\n mcpConfigs: [],\n aiModelConfigs: [],\n systemContext: null,\n selectedModelId: null,\n error: null,\n\n // 会话操作\n loadSessions: async () => {\n try {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n const sessions = await databaseService.getAllSessions();\n\n set((state) => {\n state.sessions = sessions;\n state.isLoading = false;\n });\n } catch (error) {\n console.error('Failed to load sessions:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load sessions';\n state.isLoading = false;\n });\n }\n },\n\n createSession: async (title = 'New Chat') => {\n try {\n const session = await databaseService.createSession({\n title,\n messageCount: 0,\n tokenUsage: 0,\n pinned: false,\n archived: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n\n set((state) => {\n state.sessions.unshift(session);\n state.currentSessionId = session.id;\n state.currentSession = session;\n state.messages = [];\n state.error = null;\n });\n\n return session.id;\n } catch (error) {\n console.error('Failed to create session:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to create session';\n });\n throw error;\n }\n },\n\n selectSession: async (sessionId: string) => {\n try {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n const session = await databaseService.getSession(sessionId);\n const messages = await databaseService.getSessionMessages(sessionId);\n \n set((state) => {\n state.currentSessionId = sessionId;\n (state as any).currentSession = session; // Type assertion to handle immer WritableDraft issue\n state.messages = messages;\n state.isLoading = false;\n if (!session) {\n state.error = 'Session not found';\n }\n });\n } catch (error) {\n console.error('Failed to select session:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to select session';\n state.isLoading = false;\n });\n }\n },\n\n updateSession: async (sessionId: string, updates: Partial<Session>) => {\n try {\n const updatedSession = await databaseService.updateSession(sessionId, updates);\n \n set((state) => {\n const index = state.sessions.findIndex(s => s.id === sessionId);\n if (index !== -1 && updatedSession) {\n state.sessions[index] = updatedSession;\n }\n if (state.currentSessionId === sessionId) {\n state.currentSession = updatedSession;\n }\n });\n } catch (error) {\n console.error('Failed to update session:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update session';\n });\n }\n },\n\n deleteSession: async (sessionId: string) => {\n try {\n await databaseService.deleteSession(sessionId);\n \n set((state) => {\n state.sessions = state.sessions.filter(s => s.id !== sessionId);\n if (state.currentSessionId === sessionId) {\n state.currentSessionId = null;\n state.currentSession = null;\n state.messages = [];\n }\n });\n } catch (error) {\n console.error('Failed to delete session:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete session';\n });\n }\n },\n\n // 消息操作\n loadMessages: async (sessionId: string) => {\n try {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n const messages = await databaseService.getSessionMessages(sessionId);\n \n set((state) => {\n state.messages = messages;\n state.isLoading = false;\n });\n } catch (error) {\n console.error('Failed to load messages:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load messages';\n state.isLoading = false;\n });\n }\n },\n\n sendMessage: async (content: string, attachments = []) => {\n const { currentSession } = get();\n if (!currentSession) {\n throw new Error('No active session');\n }\n\n try {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n // 创建用户消息\n const userMessage = await databaseService.createMessage({\n sessionId: currentSession.id,\n role: 'user',\n content,\n status: 'completed',\n createdAt: new Date(),\n metadata: {\n attachments,\n },\n });\n\n // 添加用户消息到状态\n set((state) => {\n state.messages.push(userMessage);\n });\n\n // 创建助手消息占位符\n const assistantMessage = await databaseService.createMessage({\n sessionId: currentSession.id,\n role: 'assistant',\n content: '',\n status: 'streaming',\n createdAt: new Date(),\n });\n\n // 添加助手消息到状态\n set((state) => {\n state.messages.push(assistantMessage);\n state.streamingMessageId = assistantMessage.id;\n state.isStreaming = true;\n });\n\n // 这里应该调用AI服务来处理消息\n // 由于messageManager没有sendMessage方法,我们暂时跳过AI调用\n // 实际使用时需要集成AI服务\n \n set((state) => {\n state.isStreaming = false;\n state.streamingMessageId = null;\n state.isLoading = false;\n });\n } catch (error) {\n console.error('Failed to send message:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to send message';\n state.isLoading = false;\n state.isStreaming = false;\n state.streamingMessageId = null;\n });\n }\n },\n\n updateMessage: async (messageId: string, updates: Partial<Message>) => {\n try {\n const updatedMessage = await databaseService.updateMessage(messageId, updates);\n \n set((state) => {\n const index = state.messages.findIndex(m => m.id === messageId);\n if (index !== -1 && updatedMessage) {\n state.messages[index] = updatedMessage;\n }\n });\n } catch (error) {\n console.error('Failed to update message:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update message';\n });\n }\n },\n\n deleteMessage: async (messageId: string) => {\n try {\n await databaseService.deleteMessage(messageId);\n \n set((state) => {\n state.messages = state.messages.filter(m => m.id !== messageId);\n });\n } catch (error) {\n console.error('Failed to delete message:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete message';\n });\n }\n },\n\n // 流式消息处理\n startStreaming: (messageId: string) => {\n set((state) => {\n state.isStreaming = true;\n state.streamingMessageId = messageId;\n });\n },\n\n updateStreamingMessage: (content: string) => {\n set((state) => {\n if (state.streamingMessageId) {\n const messageIndex = state.messages.findIndex(\n m => m.id === state.streamingMessageId\n );\n if (messageIndex !== -1) {\n state.messages[messageIndex].content = content;\n }\n }\n });\n },\n\n stopStreaming: () => {\n set((state) => {\n state.isStreaming = false;\n state.streamingMessageId = null;\n });\n },\n\n // UI操作\n toggleSidebar: () => {\n set((state) => {\n state.sidebarOpen = !state.sidebarOpen;\n });\n },\n\n setTheme: (theme: Theme) => {\n set((state) => {\n state.theme = theme;\n });\n },\n\n // 配置操作\n updateChatConfig: async (config: Partial<ChatConfig>) => {\n try {\n set((state) => {\n state.chatConfig = { ...state.chatConfig, ...config };\n });\n } catch (error) {\n console.error('Failed to update chat config:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update chat config';\n });\n }\n },\n\n loadMcpConfigs: async () => {\n try {\n const configs = await client.getMcpConfigs();\n set((state) => {\n state.mcpConfigs = configs as McpConfig[];\n });\n } catch (error) {\n console.error('Failed to load MCP configs:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load MCP configs';\n });\n }\n },\n\n updateMcpConfig: async (config: McpConfig) => {\n try {\n if (config.id) {\n await client.updateMcpConfig(config.id, {\n id: config.id,\n name: config.name,\n command: config.serverUrl, // 使用serverUrl作为command\n enabled: config.enabled,\n });\n } else {\n await client.createMcpConfig({\n id: crypto.randomUUID(),\n name: config.name,\n command: config.serverUrl,\n enabled: config.enabled,\n });\n }\n \n // 重新加载配置\n const configs = await client.getMcpConfigs();\n set((state) => {\n state.mcpConfigs = configs as McpConfig[];\n });\n } catch (error) {\n console.error('Failed to update MCP config:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update MCP config';\n });\n }\n },\n\n deleteMcpConfig: async (id: string) => {\n try {\n await client.deleteMcpConfig(id);\n set((state) => {\n state.mcpConfigs = state.mcpConfigs.filter(config => config.id !== id);\n });\n } catch (error) {\n console.error('Failed to delete MCP config:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete MCP config';\n });\n }\n },\n\n loadAiModelConfigs: async () => {\n try {\n // ApiClient doesn't have getAiModelConfigs method, using empty array for now\n const configs: AiModelConfig[] = [];\n set((state) => {\n state.aiModelConfigs = configs;\n });\n } catch (error) {\n console.error('Failed to load AI model configs:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to load AI model configs';\n });\n }\n },\n\n updateAiModelConfig: async (config: AiModelConfig) => {\n try {\n // ApiClient doesn't have updateAiModelConfig/createAiModelConfig methods\n // For now, just update the local state\n set((state) => {\n if (config.id) {\n const index = state.aiModelConfigs.findIndex(c => c.id === config.id);\n if (index !== -1) {\n state.aiModelConfigs[index] = config;\n }\n } else {\n const newConfig = { ...config, id: crypto.randomUUID() };\n state.aiModelConfigs.push(newConfig);\n }\n });\n } catch (error) {\n console.error('Failed to update AI model config:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to update AI model config';\n });\n }\n },\n\n deleteAiModelConfig: async (id: string) => {\n try {\n // ApiClient doesn't have deleteAiModelConfig method\n // For now, just update the local state\n set((state) => {\n state.aiModelConfigs = state.aiModelConfigs.filter(config => config.id !== id);\n });\n } catch (error) {\n console.error('Failed to delete AI model config:', error);\n set((state) => {\n state.error = error instanceof Error ? error.message : 'Failed to delete AI model config';\n });\n }\n },\n\n setSelectedModel: (modelId: string | null) => {\n set((state) => {\n state.selectedModelId = modelId;\n });\n },\n\n loadSystemContext: async () => {\n try {\n const response = await client.getSystemContext();\n set((state) => {\n state.systemContext = response.content || null;\n });\n } catch (error) {\n console.error('Failed to load system context:', error);\n set((state) => {\n state.systemContext = null;\n });\n }\n },\n\n updateSystemContext: async (content: string) => {\n try {\n await client.updateSystemContext(content);\n set((state) => {\n state.systemContext = content;\n });\n } catch (error) {\n console.error('Failed to update system context:', error);\n throw error;\n }\n },\n\n // 错误处理\n setError: (error: string | null) => {\n set((state) => {\n state.error = error;\n });\n },\n\n clearError: () => {\n set((state) => {\n state.error = null;\n });\n },\n }),\n {\n name: 'chat-store',\n partialize: (state) => ({\n theme: state.theme,\n sidebarOpen: state.sidebarOpen,\n chatConfig: state.chatConfig,\n selectedModelId: state.selectedModelId,\n }),\n }\n )\n )\n ));\n}","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","const CLASS_PART_SEPARATOR = '-';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift();\n }\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n const conflicts = conflictingClassGroups[classGroupId] || [];\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];\n }\n return conflicts;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, classPartObject) => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[0];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart;\n }\n if (classPartObject.validators.length === 0) {\n return undefined;\n }\n const classRest = classParts.join(CLASS_PART_SEPARATOR);\n return classPartObject.validators.find(({\n validator\n }) => validator(classRest))?.classGroupId;\n};\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/;\nconst getGroupIdForArbitraryProperty = className => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];\n const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property;\n }\n }\n};\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n prefix\n } = config;\n const classMap = {\n nextPart: new Map(),\n validators: []\n };\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme);\n });\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n classGroup.forEach(classDefinition => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n return;\n }\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId\n });\n return;\n }\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);\n });\n });\n};\nconst getPart = (classPartObject, path) => {\n let currentClassPartObject = classPartObject;\n path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: []\n });\n }\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);\n });\n return currentClassPartObject;\n};\nconst isThemeGetter = func => func.isThemeGetter;\nconst getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {\n if (!prefix) {\n return classGroupEntries;\n }\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map(classDefinition => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition;\n }\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));\n }\n return classDefinition;\n });\n return [classGroupId, prefixedClassGroup];\n });\n};\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = new Map();\n let previousCache = new Map();\n const update = (key, value) => {\n cache.set(key, value);\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = new Map();\n }\n };\n return {\n get(key) {\n let value = cache.get(key);\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value);\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst createParseClassName = config => {\n const {\n separator,\n experimentalParseClassName\n } = config;\n const isSeparatorSingleCharacter = separator.length === 1;\n const firstSeparatorCharacter = separator[0];\n const separatorLength = separator.length;\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = className => {\n const modifiers = [];\n let bracketDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index];\n if (bracketDepth === 0) {\n if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + separatorLength;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') {\n bracketDepth++;\n } else if (currentCharacter === ']') {\n bracketDepth--;\n }\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);\n const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);\n const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n };\n };\n if (experimentalParseClassName) {\n return className => experimentalParseClassName({\n className,\n parseClassName\n });\n }\n return parseClassName;\n};\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst sortModifiers = modifiers => {\n if (modifiers.length <= 1) {\n return modifiers;\n }\n const sortedModifiers = [];\n let unsortedModifiers = [];\n modifiers.forEach(modifier => {\n const isArbitraryVariant = modifier[0] === '[';\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier);\n unsortedModifiers = [];\n } else {\n unsortedModifiers.push(modifier);\n }\n });\n sortedModifiers.push(...unsortedModifiers.sort());\n return sortedModifiers;\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition);\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n const variantModifier = sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nfunction twJoin() {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < arguments.length) {\n if (argument = arguments[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n}\nconst toValue = mix => {\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nfunction createTailwindMerge(createConfigFirst, ...createConfigRest) {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall = initTailwindMerge;\n function initTailwindMerge(classList) {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n }\n function tailwindMerge(classList) {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n }\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments));\n };\n}\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || [];\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst stringLengths = /*#__PURE__*/new Set(['px', 'full', 'screen']);\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isLength = value => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, 'length', isLengthOnly);\nconst isNumber = value => Boolean(value) && !Number.isNaN(Number(value));\nconst isArbitraryNumber = value => getIsArbitraryValue(value, 'number', isNumber);\nconst isInteger = value => Boolean(value) && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst sizeLabels = /*#__PURE__*/new Set(['length', 'size', 'percentage']);\nconst isArbitrarySize = value => getIsArbitraryValue(value, sizeLabels, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, 'position', isNever);\nconst imageLabels = /*#__PURE__*/new Set(['image', 'url']);\nconst isArbitraryImage = value => getIsArbitraryValue(value, imageLabels, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, '', isShadow);\nconst isAny = () => true;\nconst getIsArbitraryValue = (value, label, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n const colors = fromTheme('colors');\n const spacing = fromTheme('spacing');\n const blur = fromTheme('blur');\n const brightness = fromTheme('brightness');\n const borderColor = fromTheme('borderColor');\n const borderRadius = fromTheme('borderRadius');\n const borderSpacing = fromTheme('borderSpacing');\n const borderWidth = fromTheme('borderWidth');\n const contrast = fromTheme('contrast');\n const grayscale = fromTheme('grayscale');\n const hueRotate = fromTheme('hueRotate');\n const invert = fromTheme('invert');\n const gap = fromTheme('gap');\n const gradientColorStops = fromTheme('gradientColorStops');\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions');\n const inset = fromTheme('inset');\n const margin = fromTheme('margin');\n const opacity = fromTheme('opacity');\n const padding = fromTheme('padding');\n const saturate = fromTheme('saturate');\n const scale = fromTheme('scale');\n const sepia = fromTheme('sepia');\n const skew = fromTheme('skew');\n const space = fromTheme('space');\n const translate = fromTheme('translate');\n const getOverscroll = () => ['auto', 'contain', 'none'];\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing];\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength];\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue];\n const getPositions = () => ['bottom', 'center', 'left', 'left-bottom', 'left-top', 'right', 'right-bottom', 'right-top', 'top'];\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'];\n const getBlendModes = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const getAlign = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'];\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue];\n const getBreaks = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary()\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', 'video', isArbitraryValue]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isTshirtSize]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': getBreaks()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': getBreaks()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: [...getPositions(), isArbitraryValue]\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: getOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': getOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': getOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: getOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': getOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': getOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: [inset]\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': [inset]\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': [inset]\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: [inset]\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: [inset]\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: [inset]\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: [inset]\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: [inset]\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: [inset]\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: ['auto', isInteger, isArbitraryValue]\n }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: getSpacingWithAutoAndArbitrary()\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['wrap', 'wrap-reverse', 'nowrap']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: ['1', 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: getZeroAndEmpty()\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: getZeroAndEmpty()\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: ['first', 'last', 'none', isInteger, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': [isAny]\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: ['auto', {\n span: ['full', isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': [isAny]\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: ['auto', {\n span: [isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: [gap]\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': [gap]\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': [gap]\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: ['normal', ...getAlign()]\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': ['start', 'end', 'center', 'stretch']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...getAlign(), 'baseline']\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline']\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': [...getAlign(), 'baseline']\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: [padding]\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: [padding]\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: [padding]\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: [padding]\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: [padding]\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: [padding]\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: [padding]\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: [padding]\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: [padding]\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: [margin]\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: [margin]\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: [margin]\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: [margin]\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: [margin]\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: [margin]\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: [margin]\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: [margin]\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: [margin]\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{\n 'space-x': [space]\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{\n 'space-y': [space]\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: ['auto', 'min', 'max', 'fit', 'svw', 'lvw', 'dvw', isArbitraryValue, spacing]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit']\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [isArbitraryValue, spacing, 'none', 'full', 'min', 'max', 'fit', 'prose', {\n screen: [isTshirtSize]\n }, isTshirtSize]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{\n size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit']\n }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', isTshirtSize, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black', isArbitraryNumber]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isAny]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest', isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': ['none', isNumber, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose', isLength, isArbitraryValue]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryValue]\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['none', 'disc', 'decimal', isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: [colors]\n }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{\n 'placeholder-opacity': [opacity]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: [colors]\n }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{\n 'text-opacity': [opacity]\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...getLineStyles(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: ['auto', 'from-font', isLength, isArbitraryLength]\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': ['auto', isLength, isArbitraryValue]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: [colors]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: getSpacingWithArbitrary()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryValue]\n }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{\n 'bg-opacity': [opacity]\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: [...getPositions(), isArbitraryPosition]\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: ['no-repeat', {\n repeat: ['', 'x', 'y', 'round', 'space']\n }]\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: ['auto', 'cover', 'contain', isArbitrarySize]\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: [colors]\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: [gradientColorStops]\n }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: [borderRadius]\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': [borderRadius]\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': [borderRadius]\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': [borderRadius]\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': [borderRadius]\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': [borderRadius]\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': [borderRadius]\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': [borderRadius]\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': [borderRadius]\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': [borderRadius]\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': [borderRadius]\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': [borderRadius]\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': [borderRadius]\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': [borderRadius]\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': [borderRadius]\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: [borderWidth]\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': [borderWidth]\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': [borderWidth]\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': [borderWidth]\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': [borderWidth]\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': [borderWidth]\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': [borderWidth]\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': [borderWidth]\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': [borderWidth]\n }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{\n 'border-opacity': [opacity]\n }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...getLineStyles(), 'hidden']\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{\n 'divide-x': [borderWidth]\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{\n 'divide-y': [borderWidth]\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{\n 'divide-opacity': [opacity]\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{\n divide: getLineStyles()\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: [borderColor]\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': [borderColor]\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': [borderColor]\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': [borderColor]\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': [borderColor]\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': [borderColor]\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': [borderColor]\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': [borderColor]\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': [borderColor]\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: [borderColor]\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: ['', ...getLineStyles()]\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isLength, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: [isLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: [colors]\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{\n ring: getLengthWithEmptyAndArbitrary()\n }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{\n ring: [colors]\n }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{\n 'ring-opacity': [opacity]\n }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{\n 'ring-offset': [isLength, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{\n 'ring-offset': [colors]\n }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{\n shadow: [isAny]\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [opacity]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': getBlendModes()\n }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: ['', 'none']\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: [blur]\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [brightness]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [contrast]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue]\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: [grayscale]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [hueRotate]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: [invert]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [saturate]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: [sepia]\n }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': ['', 'none']\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': [blur]\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [brightness]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [contrast]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': [grayscale]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [hueRotate]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': [invert]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [opacity]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [saturate]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': [sepia]\n }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': [borderSpacing]\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': [borderSpacing]\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': [borderSpacing]\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['none', 'all', '', 'colors', 'opacity', 'shadow', 'transform', isArbitraryValue]\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: getNumberAndArbitrary()\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: getNumberAndArbitrary()\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue]\n }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: ['', 'gpu', 'none']\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: [scale]\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': [scale]\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': [scale]\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: [isInteger, isArbitraryValue]\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': [translate]\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': [translate]\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': [skew]\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': [skew]\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: ['center', 'top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', isArbitraryValue]\n }],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: ['auto', colors]\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryValue]\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: [colors]\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['none', 'auto']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', 'y', 'x', '']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue]\n }],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: [colors, 'none']\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: [colors, 'none']\n }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n }\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n separator,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'separator', separator);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n for (const configKey in override) {\n overrideConfigProperties(baseConfig[configKey], override[configKey]);\n }\n for (const key in extend) {\n mergeConfigProperties(baseConfig[key], extend[key]);\n }\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = (baseObject[key] || []).concat(mergeValue);\n }\n }\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\nexport function compareAsc(dateLeft, dateRight) {\n const diff = +toDate(dateLeft) - +toDate(dateRight);\n\n if (diff < 0) return -1;\n else if (diff > 0) return 1;\n\n // Return 0 if diff is 0; return NaN if diff is NaN\n return diff;\n}\n\n// Fallback for modularized imports:\nexport default compareAsc;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name constructNow\n * @category Generic Helpers\n * @summary Constructs a new current date using the passed value constructor.\n * @pure false\n *\n * @description\n * The function constructs a new current date using the constructor from\n * the reference date. It helps to build generic functions that accept date\n * extensions and use the current date.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * @param date - The reference date to take constructor from\n *\n * @returns Current date initialized using the given date constructor\n *\n * @example\n * import { constructNow, isSameDay } from 'date-fns'\n *\n * function isToday<DateType extends Date>(\n * date: DateArg<DateType>,\n * ): boolean {\n * // If we were to use `new Date()` directly, the function would behave\n * // differently in different timezones and return false for the same date.\n * return isSameDay(date, constructNow(date));\n * }\n */\nexport function constructNow(date) {\n return constructFrom(date, Date.now());\n}\n\n// Fallback for modularized imports:\nexport default constructNow;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarMonths} function options.\n */\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const yearsDiff = laterDate_.getFullYear() - earlierDate_.getFullYear();\n const monthsDiff = laterDate_.getMonth() - earlierDate_.getMonth();\n\n return yearsDiff * 12 + monthsDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","export function getRoundingMethod(method) {\n return (number) => {\n const round = method ? Math[method] : Math.trunc;\n const result = round(number);\n // Prevent negative zero\n return result === 0 ? 0 : result;\n };\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n *\n * @returns The number of milliseconds\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * const result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\nexport function differenceInMilliseconds(laterDate, earlierDate) {\n return +toDate(laterDate) - +toDate(earlierDate);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMilliseconds;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfDay} function options.\n */\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfMonth} function options.\n */\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { endOfDay } from \"./endOfDay.js\";\nimport { endOfMonth } from \"./endOfMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isLastDayOfMonth\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * @param date - The date to check\n * @param options - An object with options\n *\n * @returns The date is the last day of a month\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * const result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\nexport function isLastDayOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n return +endOfDay(_date, options) === +endOfMonth(_date, options);\n}\n\n// Fallback for modularized imports:\nexport default isLastDayOfMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { differenceInCalendarMonths } from \"./differenceInCalendarMonths.js\";\nimport { isLastDayOfMonth } from \"./isLastDayOfMonth.js\";\n\n/**\n * The {@link differenceInMonths} function options.\n */\n\n/**\n * @name differenceInMonths\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full months\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31))\n * //=> 7\n */\nexport function differenceInMonths(laterDate, earlierDate, options) {\n const [laterDate_, workingLaterDate, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n laterDate,\n earlierDate,\n );\n\n const sign = compareAsc(workingLaterDate, earlierDate_);\n const difference = Math.abs(\n differenceInCalendarMonths(workingLaterDate, earlierDate_),\n );\n\n if (difference < 1) return 0;\n\n if (workingLaterDate.getMonth() === 1 && workingLaterDate.getDate() > 27)\n workingLaterDate.setDate(30);\n\n workingLaterDate.setMonth(workingLaterDate.getMonth() - sign * difference);\n\n let isLastMonthNotFull = compareAsc(workingLaterDate, earlierDate_) === -sign;\n\n if (\n isLastDayOfMonth(laterDate_) &&\n difference === 1 &&\n compareAsc(laterDate_, earlierDate_) === 1\n ) {\n isLastMonthNotFull = false;\n }\n\n const result = sign * (difference - +isLastMonthNotFull);\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInMonths;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.js\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.js\";\n\n/**\n * The {@link differenceInSeconds} function options.\n */\n\n/**\n * @name differenceInSeconds\n * @category Second Helpers\n * @summary Get the number of seconds between the given dates.\n *\n * @description\n * Get the number of seconds between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of seconds\n *\n * @example\n * // How many seconds are between\n * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000?\n * const result = differenceInSeconds(\n * new Date(2014, 6, 2, 12, 30, 20, 0),\n * new Date(2014, 6, 2, 12, 30, 7, 999)\n * )\n * //=> 12\n */\nexport function differenceInSeconds(laterDate, earlierDate, options) {\n const diff = differenceInMilliseconds(laterDate, earlierDate) / 1000;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInSeconds;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { minutesInDay, minutesInMonth } from \"./constants.js\";\nimport { differenceInMonths } from \"./differenceInMonths.js\";\nimport { differenceInSeconds } from \"./differenceInSeconds.js\";\n\n/**\n * The {@link formatDistance} function options.\n */\n\n/**\n * @name formatDistance\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words.\n *\n * | Distance between dates | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance between dates | Result |\n * |------------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @param laterDate - The date\n * @param earlierDate - The date to compare with\n * @param options - An object with options\n *\n * @returns The distance in words\n *\n * @throws `date` must not be Invalid Date\n * @throws `baseDate` must not be Invalid Date\n * @throws `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistance(new Date(2014, 6, 2), new Date(2015, 0, 1))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00, including seconds?\n * const result = formatDistance(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0),\n * { includeSeconds: true }\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistance(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> 'about 1 year ago'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistance(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> 'pli ol 1 jaro'\n */\nexport function formatDistance(laterDate, earlierDate, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n const minutesInAlmostTwoDays = 2520;\n\n const comparison = compareAsc(laterDate, earlierDate);\n\n if (isNaN(comparison)) throw new RangeError(\"Invalid time value\");\n\n const localizeOptions = Object.assign({}, options, {\n addSuffix: options?.addSuffix,\n comparison: comparison,\n });\n\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n ...(comparison > 0 ? [earlierDate, laterDate] : [laterDate, earlierDate]),\n );\n\n const seconds = differenceInSeconds(earlierDate_, laterDate_);\n const offsetInSeconds =\n (getTimezoneOffsetInMilliseconds(earlierDate_) -\n getTimezoneOffsetInMilliseconds(laterDate_)) /\n 1000;\n const minutes = Math.round((seconds - offsetInSeconds) / 60);\n let months;\n\n // 0 up to 2 mins\n if (minutes < 2) {\n if (options?.includeSeconds) {\n if (seconds < 5) {\n return locale.formatDistance(\"lessThanXSeconds\", 5, localizeOptions);\n } else if (seconds < 10) {\n return locale.formatDistance(\"lessThanXSeconds\", 10, localizeOptions);\n } else if (seconds < 20) {\n return locale.formatDistance(\"lessThanXSeconds\", 20, localizeOptions);\n } else if (seconds < 40) {\n return locale.formatDistance(\"halfAMinute\", 0, localizeOptions);\n } else if (seconds < 60) {\n return locale.formatDistance(\"lessThanXMinutes\", 1, localizeOptions);\n } else {\n return locale.formatDistance(\"xMinutes\", 1, localizeOptions);\n }\n } else {\n if (minutes === 0) {\n return locale.formatDistance(\"lessThanXMinutes\", 1, localizeOptions);\n } else {\n return locale.formatDistance(\"xMinutes\", minutes, localizeOptions);\n }\n }\n\n // 2 mins up to 0.75 hrs\n } else if (minutes < 45) {\n return locale.formatDistance(\"xMinutes\", minutes, localizeOptions);\n\n // 0.75 hrs up to 1.5 hrs\n } else if (minutes < 90) {\n return locale.formatDistance(\"aboutXHours\", 1, localizeOptions);\n\n // 1.5 hrs up to 24 hrs\n } else if (minutes < minutesInDay) {\n const hours = Math.round(minutes / 60);\n return locale.formatDistance(\"aboutXHours\", hours, localizeOptions);\n\n // 1 day up to 1.75 days\n } else if (minutes < minutesInAlmostTwoDays) {\n return locale.formatDistance(\"xDays\", 1, localizeOptions);\n\n // 1.75 days up to 30 days\n } else if (minutes < minutesInMonth) {\n const days = Math.round(minutes / minutesInDay);\n return locale.formatDistance(\"xDays\", days, localizeOptions);\n\n // 1 month up to 2 months\n } else if (minutes < minutesInMonth * 2) {\n months = Math.round(minutes / minutesInMonth);\n return locale.formatDistance(\"aboutXMonths\", months, localizeOptions);\n }\n\n months = differenceInMonths(earlierDate_, laterDate_);\n\n // 2 months up to 12 months\n if (months < 12) {\n const nearestMonth = Math.round(minutes / minutesInMonth);\n return locale.formatDistance(\"xMonths\", nearestMonth, localizeOptions);\n\n // 1 year up to max Date\n } else {\n const monthsSinceStartOfYear = months % 12;\n const years = Math.trunc(months / 12);\n\n // N years up to 1 years 3 months\n if (monthsSinceStartOfYear < 3) {\n return locale.formatDistance(\"aboutXYears\", years, localizeOptions);\n\n // N years 3 months up to N years 9 months\n } else if (monthsSinceStartOfYear < 9) {\n return locale.formatDistance(\"overXYears\", years, localizeOptions);\n\n // N years 9 months up to N year 12 months\n } else {\n return locale.formatDistance(\"almostXYears\", years + 1, localizeOptions);\n }\n }\n}\n\n// Fallback for modularized imports:\nexport default formatDistance;\n","import { constructNow } from \"./constructNow.js\";\n\nimport { formatDistance } from \"./formatDistance.js\";\n\n/**\n * The {@link formatDistanceToNow} function options.\n */\n\n/**\n * @name formatDistanceToNow\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given date and now in words.\n *\n * | Distance to now | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance to now | Result |\n * |---------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @param date - The given date\n * @param options - The object with options\n *\n * @returns The distance in words\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * const result = formatDistanceToNow(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * const result = formatDistanceToNow(\n * new Date(2015, 0, 1, 0, 0, 15),\n * {includeSeconds: true}\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * const result = formatDistanceToNow(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in about 1 year'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * const eoLocale = require('date-fns/locale/eo')\n * const result = formatDistanceToNow(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> 'pli ol 1 jaro'\n */\nexport function formatDistanceToNow(date, options) {\n return formatDistance(date, constructNow(date), options);\n}\n\n// Fallback for modularized imports:\nexport default formatDistanceToNow;\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { v4 as uuidv4 } from 'uuid';\nimport { format, formatDistanceToNow } from 'date-fns';\n\n/**\n * 合并 Tailwind CSS 类名\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateId(): string {\n return uuidv4();\n}\n\n/**\n * 格式化时间\n */\nexport function formatTime(date: Date | string | undefined): string {\n if (!date) return '--:--';\n \n const validDate = typeof date === 'string' ? new Date(date) : date;\n if (!(validDate instanceof Date) || isNaN(validDate.getTime())) {\n return '--:--';\n }\n \n return format(validDate, 'HH:mm');\n}\n\n/**\n * 格式化相对时间\n */\nexport function formatRelativeTime(date: Date | string | undefined): string {\n if (!date) return '时间未知';\n \n const validDate = typeof date === 'string' ? new Date(date) : date;\n if (!(validDate instanceof Date) || isNaN(validDate.getTime())) {\n return '时间未知';\n }\n \n return formatDistanceToNow(validDate, { addSuffix: true });\n}\n\n/**\n * 格式化日期\n */\nexport function formatDate(date: Date | string | undefined): string {\n if (!date) return '----/--/--';\n \n const validDate = typeof date === 'string' ? new Date(date) : date;\n if (!(validDate instanceof Date) || isNaN(validDate.getTime())) {\n return '----/--/--';\n }\n \n return format(validDate, 'yyyy-MM-dd');\n}\n\n/**\n * 格式化日期时间\n */\nexport function formatDateTime(date: Date | string | undefined): string {\n if (!date) return '----/--/-- --:--:--';\n \n const validDate = typeof date === 'string' ? new Date(date) : date;\n if (!(validDate instanceof Date) || isNaN(validDate.getTime())) {\n return '----/--/-- --:--:--';\n }\n \n return format(validDate, 'yyyy-MM-dd HH:mm:ss');\n}\n\n/**\n * 截断文本\n */\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength) + '...';\n}\n\n/**\n * 清理HTML内容\n */\nexport function cleanHtmlContent(content: string): string {\n return content\n .replace(/<[^>]*>/g, '') // 移除HTML标签\n .replace(/ /g, ' ') // 替换 \n .replace(/&/g, '&') // 替换&\n .replace(/</g, '<') // 替换<\n .replace(/>/g, '>') // 替换>\n .replace(/"/g, '\"') // 替换"\n .trim();\n}\n\n/**\n * 验证邮箱格式\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * 验证URL格式\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (obj instanceof Date) {\n // 检查Date对象是否有效\n if (isNaN(obj.getTime())) {\n return new Date() as T; // 返回当前时间作为默认值\n }\n return new Date(obj.getTime()) as T;\n }\n if (obj instanceof Array) return obj.map(item => deepClone(item)) as T;\n if (typeof obj === 'object') {\n const clonedObj = {} as T;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n clonedObj[key] = deepClone(obj[key]);\n }\n }\n return clonedObj;\n }\n return obj;\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle: boolean;\n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n\n/**\n * 计算文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * 获取文件扩展名\n */\nexport function getFileExtension(filename: string): string {\n return filename.slice(((filename.lastIndexOf('.') - 1) >>> 0) + 2);\n}\n\n/**\n * 检查是否为图片文件\n */\nexport function isImageFile(filename: string): boolean {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];\n const extension = getFileExtension(filename).toLowerCase();\n return imageExtensions.includes(extension);\n}\n\n/**\n * 生成随机颜色\n */\nexport function generateRandomColor(): string {\n const colors = [\n '#3b82f6', // blue\n '#10b981', // emerald\n '#f59e0b', // amber\n '#ef4444', // red\n '#8b5cf6', // violet\n '#06b6d4', // cyan\n '#84cc16', // lime\n '#f97316', // orange\n '#ec4899', // pink\n '#6366f1', // indigo\n ];\n return colors[Math.floor(Math.random() * colors.length)];\n}\n\n/**\n * 复制文本到剪贴板\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch (error) {\n console.error('Failed to copy text to clipboard:', error);\n return false;\n }\n}\n\n/**\n * 下载文件\n */\nexport function downloadFile(content: string, filename: string, mimeType: string = 'text/plain'): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * 检查是否为移动设备\n */\nexport function isMobile(): boolean {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n );\n}\n\n/**\n * 获取操作系统\n */\nexport function getOS(): string {\n const userAgent = navigator.userAgent;\n if (userAgent.indexOf('Win') !== -1) return 'Windows';\n if (userAgent.indexOf('Mac') !== -1) return 'macOS';\n if (userAgent.indexOf('Linux') !== -1) return 'Linux';\n if (userAgent.indexOf('Android') !== -1) return 'Android';\n if (userAgent.indexOf('iOS') !== -1) return 'iOS';\n return 'Unknown';\n}\n\n/**\n * 错误处理工具\n */\nexport class AppError extends Error {\n public readonly code: string;\n public readonly statusCode: number;\n\n constructor(message: string, code: string = 'UNKNOWN_ERROR', statusCode: number = 500) {\n super(message);\n this.name = 'AppError';\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * 重试函数\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n maxAttempts: number = 3,\n delay: number = 1000\n): Promise<T> {\n let lastError: Error;\n \n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (attempt === maxAttempts) break;\n await new Promise(resolve => setTimeout(resolve, delay * attempt));\n }\n }\n \n throw lastError!;\n}\n\n/**\n * 本地存储工具\n */\nexport const storage = {\n get: <T>(key: string, defaultValue?: T): T | null => {\n try {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : defaultValue || null;\n } catch {\n return defaultValue || null;\n }\n },\n \n set: (key: string, value: any): void => {\n try {\n localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n console.error('Failed to save to localStorage:', error);\n }\n },\n \n remove: (key: string): void => {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('Failed to remove from localStorage:', error);\n }\n },\n \n clear: (): void => {\n try {\n localStorage.clear();\n } catch (error) {\n console.error('Failed to clear localStorage:', error);\n }\n }\n};","import React, { useMemo } from 'react';\nimport { cn } from '../lib/utils';\n\ninterface MarkdownRendererProps {\n content: string;\n isStreaming?: boolean;\n className?: string;\n}\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({\n content,\n isStreaming = false,\n className,\n}) => {\n // 增强的Markdown渲染,支持代码高亮和数学公式\n const renderContent = useMemo(() => {\n return (text: string) => {\n let processedText = text;\n \n // 处理数学公式块 ($$...$$)\n const mathBlockRegex = /\\$\\$([\\s\\S]*?)\\$\\$/g;\n processedText = processedText.replace(mathBlockRegex, (_match, formula) => {\n return `<div class=\"math-block bg-muted/50 p-3 rounded-md my-2 text-center font-mono text-sm border\">${formula.trim()}</div>`;\n });\n \n // 处理内联数学公式 ($...$)\n const mathInlineRegex = /\\$([^$]+)\\$/g;\n processedText = processedText.replace(mathInlineRegex, (_match, formula) => {\n return `<span class=\"math-inline bg-muted/30 px-1 py-0.5 rounded font-mono text-sm\">${formula}</span>`;\n });\n \n // 处理代码块,支持语言标识\n const codeBlockRegex = /```(\\w+)?\\n?([\\s\\S]*?)```/g;\n processedText = processedText.replace(codeBlockRegex, (_match, language, code) => {\n const lang = language || 'text';\n const highlightedCode = highlightCode(code.trim(), lang);\n return `<div class=\"code-block my-3\"><div class=\"code-header bg-muted/50 px-3 py-1 text-xs text-muted-foreground border-b\">${lang}</div><pre class=\"bg-muted p-3 overflow-x-auto\"><code class=\"text-sm\">${highlightedCode}</code></pre></div>`;\n });\n \n // 处理内联代码\n const inlineCodeRegex = /`([^`]+)`/g;\n processedText = processedText.replace(inlineCodeRegex, (_match, code) => {\n return `<code class=\"bg-muted px-1.5 py-0.5 rounded text-sm font-mono\">${code}</code>`;\n });\n \n // 处理标题\n processedText = processedText.replace(/^### (.*$)/gm, '<h3 class=\"text-lg font-semibold mt-4 mb-2\">$1</h3>');\n processedText = processedText.replace(/^## (.*$)/gm, '<h2 class=\"text-xl font-semibold mt-4 mb-2\">$1</h2>');\n processedText = processedText.replace(/^# (.*$)/gm, '<h1 class=\"text-2xl font-bold mt-4 mb-2\">$1</h1>');\n \n // 处理列表\n processedText = processedText.replace(/^\\* (.*$)/gm, '<li class=\"ml-4\">• $1</li>');\n processedText = processedText.replace(/^\\d+\\. (.*$)/gm, '<li class=\"ml-4 list-decimal\">$1</li>');\n \n // 处理粗体和斜体\n processedText = processedText.replace(/\\*\\*(.*?)\\*\\*/g, '<strong class=\"font-semibold\">$1</strong>');\n processedText = processedText.replace(/\\*(.*?)\\*/g, '<em class=\"italic\">$1</em>');\n \n // 处理链接\n processedText = processedText.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" class=\"text-primary hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>');\n \n // 处理引用\n processedText = processedText.replace(/^> (.*$)/gm, '<blockquote class=\"border-l-4 border-primary/30 pl-4 italic text-muted-foreground\">$1</blockquote>');\n \n // 处理换行\n processedText = processedText.replace(/\\n\\n/g, '</p><p class=\"mb-2\">');\n processedText = processedText.replace(/\\n/g, '<br>');\n \n // 包装段落\n if (processedText && !processedText.startsWith('<')) {\n processedText = `<p class=\"mb-2\">${processedText}</p>`;\n }\n \n return processedText;\n };\n }, []);\n \n // 简单的代码高亮函数\n const highlightCode = (code: string, language: string): string => {\n // 基础的语法高亮,可以后续集成 Prism.js 或其他库\n let highlighted = code;\n \n if (language === 'javascript' || language === 'js' || language === 'typescript' || language === 'ts') {\n // 高亮关键字\n highlighted = highlighted.replace(/\\b(const|let|var|function|return|if|else|for|while|class|import|export|from|async|await)\\b/g, '<span class=\"text-blue-600 dark:text-blue-400 font-semibold\">$1</span>');\n // 高亮字符串\n highlighted = highlighted.replace(/(['\"`])([^'\"\\`]*?)\\1/g, '<span class=\"text-green-600 dark:text-green-400\">$1$2$1</span>');\n // 高亮注释\n highlighted = highlighted.replace(/(\\/\\/.*$)/gm, '<span class=\"text-gray-500 italic\">$1</span>');\n } else if (language === 'python' || language === 'py') {\n // Python 关键字\n highlighted = highlighted.replace(/\\b(def|class|import|from|return|if|else|elif|for|while|try|except|with|as|pass|break|continue)\\b/g, '<span class=\"text-blue-600 dark:text-blue-400 font-semibold\">$1</span>');\n // 字符串\n highlighted = highlighted.replace(/(['\"`])([^'\"\\`]*?)\\1/g, '<span class=\"text-green-600 dark:text-green-400\">$1$2$1</span>');\n // 注释\n highlighted = highlighted.replace(/(#.*$)/gm, '<span class=\"text-gray-500 italic\">$1</span>');\n }\n \n return highlighted;\n };\n\n return (\n <div\n className={cn(\n 'prose prose-sm max-w-none',\n 'prose-headings:text-foreground prose-p:text-foreground',\n 'prose-strong:text-foreground prose-em:text-foreground',\n 'prose-code:text-foreground prose-pre:bg-muted',\n 'prose-a:text-primary prose-a:no-underline hover:prose-a:underline',\n className\n )}\n >\n <div\n dangerouslySetInnerHTML={{\n __html: renderContent(content)\n }}\n />\n {isStreaming && (\n <span className=\"inline-block w-2 h-4 bg-primary animate-pulse ml-1\" />\n )}\n </div>\n );\n};\n\nexport default MarkdownRenderer;","import React from 'react';\nimport { cn, formatFileSize } from '../lib/utils';\nimport type { Attachment } from '../types';\n\ninterface AttachmentRendererProps {\n attachment: Attachment;\n customRenderer?: (attachment: Attachment) => React.ReactNode;\n className?: string;\n}\n\nexport const AttachmentRenderer: React.FC<AttachmentRendererProps> = ({\n attachment,\n customRenderer,\n className,\n}) => {\n // 使用自定义渲染器\n if (customRenderer) {\n return <div>{customRenderer(attachment)}</div>;\n }\n\n const isImage = attachment.type === 'image';\n const isAudio = attachment.type === 'audio';\n // const isFile = attachment.type === 'file';\n\n const getFileIcon = () => {\n if (isImage) {\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n }\n \n if (isAudio) {\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3\" />\n </svg>\n );\n }\n \n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n );\n };\n\n return (\n <div className={cn(\n 'inline-flex items-center gap-2 p-2 bg-muted rounded-lg border max-w-sm',\n className\n )}>\n {/* 文件图标 */}\n <div className=\"flex-shrink-0 text-muted-foreground\">\n {getFileIcon()}\n </div>\n \n {/* 文件信息 */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium truncate\">\n {attachment.name}\n </span>\n <span className=\"text-xs text-muted-foreground flex-shrink-0\">\n {formatFileSize(attachment.size)}\n </span>\n </div>\n \n {attachment.mimeType && (\n <div className=\"text-xs text-muted-foreground mt-0.5\">\n {attachment.mimeType}\n </div>\n )}\n </div>\n \n {/* 预览/下载按钮 */}\n <div className=\"flex-shrink-0\">\n {isImage ? (\n <button\n onClick={() => window.open(attachment.url, '_blank')}\n className=\"p-1 hover:bg-background rounded transition-colors\"\n title=\"View image\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </button>\n ) : (\n <a\n href={attachment.url}\n download={attachment.name}\n className=\"p-1 hover:bg-background rounded transition-colors inline-block\"\n title=\"Download file\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </a>\n )}\n </div>\n \n {/* 图片预览 */}\n {isImage && (\n <div className=\"w-full mt-2\">\n <img\n src={attachment.url}\n alt={attachment.name}\n className=\"max-w-full h-auto rounded border\"\n style={{ maxHeight: '200px' }}\n loading=\"lazy\"\n />\n </div>\n )}\n \n {/* 音频播放器 */}\n {isAudio && (\n <div className=\"w-full mt-2\">\n <audio\n controls\n className=\"w-full\"\n preload=\"metadata\"\n >\n <source src={attachment.url} type={attachment.mimeType} />\n Your browser does not support the audio element.\n </audio>\n </div>\n )}\n </div>\n );\n};\n\nexport default AttachmentRenderer;","import React, { useState } from 'react';\nimport { cn } from '../lib/utils';\nimport type { ToolCall, Message } from '../types';\n\ninterface ToolCallRendererProps {\n toolCall: ToolCall;\n allMessages?: Message[];\n className?: string;\n}\n\nexport const ToolCallRenderer: React.FC<ToolCallRendererProps> = ({\n toolCall,\n allMessages = [],\n className,\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const [showArguments, setShowArguments] = useState(false);\n const [showResult, setShowResult] = useState(false);\n\n // 查找对应的tool角色消息作为结果\n const toolResultMessage = allMessages.find(msg => \n msg.role === 'tool' && \n ((msg as any).toolCallId === toolCall.id || (msg as any).tool_call_id === toolCall.id)\n );\n \n // 优先使用tool消息的内容,其次使用toolCall.result\n const resultContent = toolResultMessage?.content || toolCall.result;\n \n // 获取AI生成的总结\n const resultSummary = toolResultMessage?.summary || toolResultMessage?.metadata?.summary;\n \n const hasError = !!toolCall.error;\n const hasResult = !!resultContent;\n const hasArguments = toolCall.arguments && Object.keys(toolCall.arguments).length > 0;\n\n const formatJson = (obj: any) => {\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return String(obj);\n }\n };\n\n return (\n <div className={cn(\n 'border rounded-lg p-3 bg-muted/50',\n hasError && 'border-destructive bg-destructive/5',\n className\n )}>\n {/* 工具调用头部 */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <svg className=\"w-4 h-4 text-muted-foreground\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <span className=\"text-sm font-medium\">\n Tool: {toolCall.name}\n </span>\n </div>\n \n {hasError && (\n <span className=\"inline-flex items-center gap-1 text-xs text-destructive bg-destructive/10 px-2 py-0.5 rounded\">\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n Error\n </span>\n )}\n \n {hasResult && !hasError && (\n <span className=\"inline-flex items-center gap-1 text-xs text-green-600 bg-green-50 px-2 py-0.5 rounded\">\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n Success\n </span>\n )}\n </div>\n \n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"p-1 hover:bg-muted rounded transition-colors\"\n title={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg \n className={cn('w-4 h-4 transition-transform', isExpanded && 'rotate-180')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* 展开的详细信息 */}\n {isExpanded && (\n <div className=\"mt-3 space-y-3\">\n {/* 参数 */}\n {hasArguments && (\n <div>\n <button\n onClick={() => setShowArguments(!showArguments)}\n className=\"flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg \n className={cn('w-3 h-3 transition-transform', showArguments && 'rotate-90')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n Arguments\n </button>\n \n {showArguments && (\n <pre className=\"mt-2 p-2 bg-background border rounded text-xs overflow-x-auto\">\n <code>{formatJson(toolCall.arguments)}</code>\n </pre>\n )}\n </div>\n )}\n\n {/* 结果 */}\n {hasResult && (\n <div>\n {/* 如果有AI总结,优先显示总结 */}\n {resultSummary ? (\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium text-muted-foreground\">AI Summary</div>\n <div className=\"p-3 bg-blue-50 border border-blue-200 rounded-lg text-sm text-blue-800\">\n {resultSummary}\n </div>\n \n {/* 查看完整结果的按钮 */}\n <button\n onClick={() => setShowResult(!showResult)}\n className=\"flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg \n className={cn('w-3 h-3 transition-transform', showResult && 'rotate-90')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n {showResult ? 'Hide Full Result' : 'Show Full Result'}\n </button>\n \n {showResult && (\n <pre className=\"mt-2 p-2 bg-background border rounded text-xs overflow-x-auto\">\n <code>{resultContent}</code>\n </pre>\n )}\n </div>\n ) : (\n /* 没有总结时的原始显示方式 */\n <div>\n <button\n onClick={() => setShowResult(!showResult)}\n className=\"flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg \n className={cn('w-3 h-3 transition-transform', showResult && 'rotate-90')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n Result\n </button>\n \n {showResult && (\n <pre className=\"mt-2 p-2 bg-background border rounded text-xs overflow-x-auto\">\n <code>{resultContent}</code>\n </pre>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* 错误信息 */}\n {hasError && (\n <div>\n <div className=\"text-sm font-medium text-destructive mb-2\">Error</div>\n <div className=\"p-2 bg-destructive/5 border border-destructive/20 rounded text-sm text-destructive\">\n {toolCall.error}\n </div>\n </div>\n )}\n\n {/* 时间戳 */}\n <div className=\"text-xs text-muted-foreground\">\n Executed at: {(() => {\n const date = new Date(toolCall.createdAt);\n return isNaN(date.getTime()) ? '时间未知' : date.toLocaleString();\n })()}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ToolCallRenderer;","import React, { useState } from 'react';\nimport { MarkdownRenderer } from './MarkdownRenderer';\nimport { AttachmentRenderer } from './AttachmentRenderer';\nimport { ToolCallRenderer } from './ToolCallRenderer';\nimport { cn, formatTime } from '../lib/utils';\nimport type { Message, Attachment } from '../types';\n\ninterface MessageItemProps {\n message: Message;\n isLast?: boolean;\n isStreaming?: boolean;\n onEdit?: (messageId: string, content: string) => void;\n onDelete?: (messageId: string) => void;\n allMessages?: Message[]; // 添加所有消息的引用\n customRenderer?: {\n renderMessage?: (message: Message) => React.ReactNode;\n renderAttachment?: (attachment: Attachment) => React.ReactNode;\n };\n}\n\nexport const MessageItem: React.FC<MessageItemProps> = ({\n message,\n isLast = false,\n isStreaming = false,\n onEdit,\n onDelete,\n allMessages = [],\n customRenderer,\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editContent, setEditContent] = useState(message.content);\n const [showActions, setShowActions] = useState(false);\n\n const isUser = message.role === 'user';\n const isAssistant = message.role === 'assistant';\n const isSystem = message.role === 'system';\n const isTool = message.role === 'tool';\n\n // 隐藏tool角色的消息,因为它们应该作为工具调用的结果显示\n if (isTool) {\n return null;\n }\n\n // 使用自定义渲染器\n if (customRenderer?.renderMessage) {\n return <div>{customRenderer.renderMessage(message)}</div>;\n }\n\n const handleEdit = () => {\n if (onEdit && editContent.trim() !== message.content) {\n onEdit(message.id, editContent.trim());\n }\n setIsEditing(false);\n };\n\n const handleCancelEdit = () => {\n setEditContent(message.content);\n setIsEditing(false);\n };\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(message.content);\n } catch (error) {\n console.error('Failed to copy message:', error);\n }\n };\n\n const attachments = message.metadata?.attachments || [];\n // 处理工具调用:优先使用metadata中的toolCalls,如果没有则从message.tool_calls转换\n let toolCalls = message.metadata?.toolCalls || [];\n \n // 如果metadata中没有toolCalls但message中有toolCalls或tool_calls,则转换格式\n if (toolCalls.length === 0 && ((message as any).toolCalls || (message as any).tool_calls)) {\n const rawToolCalls = (message as any).toolCalls || (message as any).tool_calls;\n // 确保rawToolCalls是数组类型\n if (Array.isArray(rawToolCalls)) {\n toolCalls = rawToolCalls.map((tc: any) => ({\n id: tc.id,\n messageId: message.id,\n name: tc.function?.name || tc.name,\n arguments: tc.function?.arguments || tc.arguments,\n result: '', // 历史消息的结果会从tool角色消息中获取\n createdAt: message.createdAt\n }));\n }\n }\n\n return (\n <div\n className={cn(\n 'group relative flex gap-3 px-4 py-4 rounded-lg transition-colors',\n isUser && 'bg-user-message ml-12',\n isAssistant && 'bg-assistant-message mr-12',\n isSystem && 'bg-muted mx-12 border-l-4 border-primary',\n isTool && 'bg-blue-50 dark:bg-blue-950/20 mx-12 border-l-4 border-blue-500',\n 'hover:bg-opacity-80'\n )}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n >\n {/* 头像 */}\n <div className=\"flex-shrink-0\">\n <div className={cn(\n 'w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium',\n isUser && 'bg-primary text-primary-foreground',\n isAssistant && 'bg-secondary text-secondary-foreground',\n isSystem && 'bg-muted text-muted-foreground',\n isTool && 'bg-blue-500 text-white'\n )}>\n {isUser ? 'U' : isAssistant ? 'AI' : isTool ? 'T' : 'S'}\n </div>\n </div>\n\n {/* 消息内容 */}\n <div className=\"flex-1 min-w-0\">\n {/* 消息头部 */}\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-sm font-medium\">\n {isUser ? 'You' : isAssistant ? 'Assistant' : isTool ? 'Tool Result' : 'System'}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.createdAt)}\n </span>\n {message.metadata?.model && (\n <span className=\"text-xs text-muted-foreground bg-muted px-1.5 py-0.5 rounded\">\n {message.metadata.model}\n </span>\n )}\n </div>\n\n {/* 附件 */}\n {attachments.length > 0 && (\n <div className=\"mb-3 space-y-2\">\n {attachments.map((attachment) => (\n <AttachmentRenderer\n key={attachment.id}\n attachment={attachment}\n customRenderer={customRenderer?.renderAttachment}\n />\n ))}\n </div>\n )}\n\n {/* 动态渲染消息内容和工具调用 */}\n {isEditing ? (\n <div className=\"space-y-2\">\n <textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n className=\"w-full p-2 border rounded-md resize-none focus:outline-none focus:ring-2 focus:ring-primary\"\n rows={3}\n autoFocus\n />\n <div className=\"flex gap-2\">\n <button\n onClick={handleEdit}\n className=\"px-3 py-1 text-sm bg-primary text-primary-foreground rounded hover:bg-primary/90\"\n >\n Save\n </button>\n <button\n onClick={handleCancelEdit}\n className=\"px-3 py-1 text-sm bg-muted text-muted-foreground rounded hover:bg-muted/80\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {/* 使用新的内容分段渲染机制 */}\n {(() => {\n const contentSegments = message.metadata?.contentSegments || [];\n const hasContent = message.content && message.content.trim().length > 0;\n const isCurrentlyStreaming = isStreaming && isLast;\n \n // 如果有内容分段,使用分段渲染\n if (contentSegments.length > 0) {\n return (\n <div className=\"space-y-3\">\n {contentSegments.map((segment, index) => {\n if (segment.type === 'text') {\n return (\n <div key={`segment-${index}`} className=\"prose prose-sm max-w-none\">\n <MarkdownRenderer\n content={segment.content as string}\n isStreaming={isCurrentlyStreaming && index === contentSegments.length - 1}\n />\n </div>\n );\n } else if (segment.type === 'tool_call') {\n // 根据toolCallId查找对应的工具调用\n const toolCall = toolCalls.find(tc => tc.id === segment.toolCallId);\n if (toolCall) {\n return (\n <div key={`tool-${toolCall.id}`}>\n <ToolCallRenderer\n toolCall={toolCall}\n allMessages={allMessages}\n />\n </div>\n );\n }\n }\n return null;\n })}\n </div>\n );\n }\n \n // 回退到传统渲染方式(向后兼容)\n return (\n <div className=\"space-y-3\">\n {/* 渲染文本内容 */}\n {hasContent && (\n <div className=\"prose prose-sm max-w-none\">\n <MarkdownRenderer\n content={message.content}\n isStreaming={isCurrentlyStreaming}\n />\n </div>\n )}\n \n {/* 渲染工具调用(历史消息兼容) */}\n {toolCalls.length > 0 && (\n <div className=\"space-y-2\">\n {toolCalls.map((toolCall) => (\n <div key={`tool-${toolCall.id}`}>\n <ToolCallRenderer\n toolCall={toolCall}\n allMessages={allMessages}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })()}\n </div>\n )}\n\n {/* Token使用信息 */}\n {message.tokensUsed && (\n <div className=\"mt-2 text-xs text-muted-foreground\">\n Tokens used: {message.tokensUsed}\n </div>\n )}\n </div>\n\n {/* 操作按钮 */}\n {showActions && !isEditing && (\n <div className=\"absolute top-2 right-2 flex gap-1 bg-background border rounded-md shadow-sm opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={handleCopy}\n className=\"p-1.5 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors\"\n title=\"Copy message\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n </button>\n \n {isUser && onEdit && (\n <button\n onClick={() => setIsEditing(true)}\n className=\"p-1.5 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors\"\n title=\"Edit message\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n </button>\n )}\n \n {onDelete && (\n <button\n onClick={() => onDelete(message.id)}\n className=\"p-1.5 hover:bg-destructive/10 rounded text-muted-foreground hover:text-destructive transition-colors\"\n title=\"Delete message\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default MessageItem;","import React from 'react';\nimport { cn } from '../lib/utils';\n\ninterface LoadingSpinnerProps {\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nexport const LoadingSpinner: React.FC<LoadingSpinnerProps> = ({\n size = 'md',\n className,\n}) => {\n const sizeClasses = {\n sm: 'w-4 h-4',\n md: 'w-6 h-6',\n lg: 'w-8 h-8',\n };\n\n return (\n <div\n className={cn(\n 'animate-spin rounded-full border-2 border-current border-t-transparent',\n sizeClasses[size],\n className\n )}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n};\n\nexport default LoadingSpinner;","import React from 'react';\nimport { MessageItem } from './MessageItem';\nimport { LoadingSpinner } from './LoadingSpinner';\n// import { cn } from '../lib/utils';\nimport type { MessageListProps } from '../types';\n\nexport const MessageList: React.FC<MessageListProps> = ({\n messages,\n isLoading = false,\n isStreaming = false,\n onMessageEdit,\n onMessageDelete,\n customRenderer,\n}) => {\n if (messages.length === 0 && !isLoading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center space-y-4\">\n <div className=\"w-16 h-16 mx-auto bg-muted rounded-full flex items-center justify-center\">\n <svg className=\"w-8 h-8 text-muted-foreground\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n </div>\n <div>\n <h3 className=\"text-lg font-semibold text-foreground\">Start a conversation</h3>\n <p className=\"text-sm text-muted-foreground mt-1\">\n Send a message to begin your chat with AI\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex-1 overflow-y-auto px-4 py-6 space-y-6\">\n {messages.map((message, index) => (\n <MessageItem\n key={message.id}\n message={message}\n isLast={index === messages.length - 1}\n isStreaming={isStreaming && index === messages.length - 1}\n onEdit={onMessageEdit}\n onDelete={onMessageDelete}\n allMessages={messages}\n customRenderer={customRenderer}\n />\n ))}\n \n {isLoading && (\n <div className=\"flex justify-start\">\n <div className=\"flex items-center space-x-2 bg-muted px-4 py-3 rounded-lg max-w-xs\">\n <LoadingSpinner size=\"sm\" />\n <span className=\"text-sm text-muted-foreground\">AI is thinking...</span>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default MessageList;","import React, { useState, useRef, useCallback } from 'react';\nimport { cn } from '../lib/utils';\nimport type { InputAreaProps } from '../types';\n\nexport const InputArea: React.FC<InputAreaProps> = ({\n onSend,\n disabled = false,\n placeholder = 'Type your message...',\n maxLength = 4000,\n allowAttachments = false,\n supportedFileTypes = ['image/*', 'text/*', 'application/pdf'],\n showModelSelector = false,\n selectedModelId = null,\n availableModels = [],\n onModelChange,\n}) => {\n const [message, setMessage] = useState('');\n const [attachments, setAttachments] = useState<File[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 自动调整文本框高度\n const adjustTextareaHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n const maxHeight = 200; // 最大高度\n textarea.style.height = `${Math.min(scrollHeight, maxHeight)}px`;\n }\n }, []);\n\n // 处理输入变化\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n if (value.length <= maxLength) {\n setMessage(value);\n adjustTextareaHeight();\n }\n };\n\n // 处理键盘事件\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n // 发送消息\n const handleSend = () => {\n const trimmedMessage = message.trim();\n if (!trimmedMessage && attachments.length === 0) return;\n if (disabled) return;\n\n // 检查是否选择了模型\n if (showModelSelector && !selectedModelId) {\n alert('请先选择一个AI模型');\n return;\n }\n\n onSend(trimmedMessage, attachments);\n setMessage('');\n setAttachments([]);\n \n // 重置文本框高度\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n };\n\n // 处理文件选择\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n setAttachments(prev => [...prev, ...files]);\n \n // 清空input以允许重复选择同一文件\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n // 移除附件\n const removeAttachment = (index: number) => {\n setAttachments(prev => prev.filter((_, i) => i !== index));\n };\n\n // 拖拽处理\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n if (allowAttachments && !disabled) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n \n if (!allowAttachments || disabled) return;\n \n const files = Array.from(e.dataTransfer.files);\n setAttachments(prev => [...prev, ...files]);\n };\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n return (\n <div className=\"border-t bg-background p-4\">\n {/* 模型选择器 */}\n {showModelSelector && (\n <div className=\"mb-3\">\n \n {availableModels.length > 0 ? (\n <select\n value={selectedModelId || ''}\n onChange={(e) => onModelChange?.(e.target.value || null)}\n disabled={disabled}\n className={cn(\n 'w-80 max-w-full px-3 py-2 border border-input bg-background rounded-md',\n 'text-sm text-foreground placeholder:text-muted-foreground',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n <option value=\"\">请选择模型...</option>\n {availableModels\n .filter(model => model.enabled)\n .map((model) => (\n <option key={model.id} value={model.id}>\n {model.name} ({model.model_name})\n </option>\n ))\n }\n </select>\n ) : (\n <div className=\"w-80 max-w-full px-3 py-2 border border-input bg-muted rounded-md text-sm text-muted-foreground\">\n 暂无可用模型,请先在右上角配置AI模型\n </div>\n )}\n </div>\n )}\n {/* 附件预览 */}\n {attachments.length > 0 && (\n <div className=\"mb-3 flex flex-wrap gap-2\">\n {attachments.map((file, index) => (\n <div\n key={index}\n className=\"flex items-center gap-2 bg-muted px-3 py-2 rounded-lg text-sm\"\n >\n <svg className=\"w-4 h-4 text-muted-foreground\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\" />\n </svg>\n <span className=\"truncate max-w-32\">{file.name}</span>\n <span className=\"text-xs text-muted-foreground\">({formatFileSize(file.size)})</span>\n <button\n onClick={() => removeAttachment(index)}\n className=\"text-muted-foreground hover:text-destructive transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* 输入区域 */}\n <div\n className={cn(\n 'relative flex items-end gap-2 p-3 border rounded-lg transition-colors',\n 'focus-within:border-primary',\n isDragging && 'border-primary bg-primary/5',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* 附件按钮 */}\n {allowAttachments && (\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled}\n className=\"flex-shrink-0 p-2 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Attach files\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\" />\n </svg>\n </button>\n )}\n\n {/* 文本输入 */}\n <textarea\n ref={textareaRef}\n value={message}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n 'flex-1 resize-none bg-transparent border-none outline-none',\n 'placeholder:text-muted-foreground',\n 'disabled:cursor-not-allowed'\n )}\n rows={1}\n style={{ minHeight: '24px', maxHeight: '200px' }}\n />\n\n {/* 字符计数 */}\n <div className=\"flex-shrink-0 text-xs text-muted-foreground\">\n {message.length}/{maxLength}\n </div>\n\n {/* 发送按钮 */}\n <button\n onClick={handleSend}\n disabled={disabled || (!message.trim() && attachments.length === 0)}\n className={cn(\n 'flex-shrink-0 p-2 rounded-md transition-colors',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n (message.trim() || attachments.length > 0) && !disabled\n ? 'bg-primary text-primary-foreground hover:bg-primary/90'\n : 'text-muted-foreground'\n )}\n title={showModelSelector && !selectedModelId ? \"请先选择AI模型\" : \"Send message\"}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\" />\n </svg>\n </button>\n\n {/* 隐藏的文件输入 */}\n {allowAttachments && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={supportedFileTypes.join(',')}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n )}\n </div>\n\n {/* 拖拽提示 */}\n {isDragging && allowAttachments && (\n <div className=\"absolute inset-0 bg-primary/10 border-2 border-dashed border-primary rounded-lg flex items-center justify-center\">\n <div className=\"text-center\">\n <svg className=\"w-8 h-8 mx-auto text-primary mb-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n <p className=\"text-sm font-medium text-primary\">Drop files here to attach</p>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default InputArea;","import React from 'react';\n\nexport const PlusIcon: React.FC<{ className?: string }> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n);\n\nexport const DotsVerticalIcon: React.FC<{ className?: string }> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\" />\n </svg>\n);\n\nexport const PencilIcon: React.FC<{ className?: string }> = ({ className = \"w-4 h-4\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n);\n\nexport const TrashIcon: React.FC<{ className?: string }> = ({ className = \"w-4 h-4\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n);\n\nexport const CheckIcon: React.FC<{ className?: string }> = ({ className = \"w-4 h-4\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n);\n\nexport const XIcon: React.FC<{ className?: string }> = ({ className = \"w-4 h-4\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\nexport const ChatIcon: React.FC<{ className?: string }> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n);","import React, { useState } from 'react';\nimport { useChatStore, useSessions, useCurrentSession } from '../lib/store';\nimport type { Session } from '../types';\nimport { PlusIcon, DotsVerticalIcon, PencilIcon, TrashIcon, ChatIcon } from './ui/icons';\n\n// 简化的时间格式化函数\nconst formatTimeAgo = (date: string | Date | undefined | null) => {\n const now = new Date();\n let past: Date;\n \n // 处理不同的日期格式\n if (!date) {\n return '时间未知';\n }\n \n if (typeof date === 'string') {\n // 处理数据库返回的时间格式 \"YYYY-MM-DD HH:mm:ss\"\n // 将其转换为ISO格式以便正确解析\n const isoString = date.replace(' ', 'T') + 'Z';\n past = new Date(isoString);\n \n // 如果ISO格式解析失败,尝试直接解析原字符串\n if (isNaN(past.getTime())) {\n past = new Date(date);\n }\n } else {\n past = date;\n }\n \n // 检查日期是否有效\n if (!past || isNaN(past.getTime())) {\n return '时间未知';\n }\n \n const diffInSeconds = Math.floor((now.getTime() - past.getTime()) / 1000);\n \n if (diffInSeconds < 60) return '刚刚';\n if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)}分钟前`;\n if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)}小时前`;\n if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / 86400)}天前`;\n return past.toLocaleDateString('zh-CN');\n};\n\ninterface SessionListProps {\n onClose?: () => void;\n}\n\nexport const SessionList: React.FC<SessionListProps> = ({ onClose }) => {\n const sessions = useSessions();\n const currentSession = useCurrentSession();\n const store = useChatStore();\n const { createSession, selectSession, deleteSession, updateSession } = store;\n const [editingSessionId, setEditingSessionId] = useState<string | null>(null);\n const [editingTitle, setEditingTitle] = useState('');\n\n const handleCreateSession = async () => {\n try {\n await createSession();\n onClose?.();\n } catch (error) {\n console.error('Failed to create session:', error);\n }\n };\n\n const handleSelectSession = async (sessionId: string) => {\n try {\n await selectSession(sessionId);\n onClose?.();\n } catch (error) {\n console.error('Failed to select session:', error);\n }\n };\n\n const handleDeleteSession = async (sessionId: string) => {\n if (window.confirm('确定要删除这个会话吗?此操作无法撤销。')) {\n try {\n await deleteSession(sessionId);\n } catch (error) {\n console.error('Failed to delete session:', error);\n }\n }\n };\n\n const handleStartEdit = (sessionId: string, currentTitle: string) => {\n setEditingSessionId(sessionId);\n setEditingTitle(currentTitle);\n };\n\n const handleSaveEdit = async () => {\n if (editingSessionId && editingTitle.trim()) {\n try {\n await updateSession(editingSessionId, { title: editingTitle.trim() });\n setEditingSessionId(null);\n setEditingTitle('');\n } catch (error) {\n console.error('Failed to update session:', error);\n }\n }\n };\n\n const handleCancelEdit = () => {\n setEditingSessionId(null);\n setEditingTitle('');\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSaveEdit();\n } else if (e.key === 'Escape') {\n handleCancelEdit();\n }\n };\n\n return (\n <div className=\"flex flex-col h-full bg-white dark:bg-gray-900 border-r border-gray-200 dark:border-gray-700\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n 会话列表\n </h2>\n <button\n onClick={handleCreateSession}\n className=\"p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors\"\n title=\"新建会话\"\n >\n <PlusIcon className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* 会话列表 */}\n <div className=\"flex-1 overflow-y-auto\">\n {sessions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-gray-500 dark:text-gray-400\">\n <ChatIcon className=\"w-12 h-12 mb-4 opacity-50\" />\n <p className=\"text-sm\">还没有会话</p>\n <button\n onClick={handleCreateSession}\n className=\"mt-2 px-4 py-2 text-sm bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors\"\n >\n 创建第一个会话\n </button>\n </div>\n ) : (\n <div className=\"p-2 space-y-1\">\n {sessions.map((session: Session) => (\n <div\n key={session.id}\n className={`group relative flex items-center p-3 rounded-lg cursor-pointer transition-colors ${\n currentSession?.id === session.id\n ? 'bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n onClick={() => handleSelectSession(session.id)}\n >\n <div className=\"flex-1 min-w-0\">\n {editingSessionId === session.id ? (\n <input\n type=\"text\"\n value={editingTitle}\n onChange={(e) => setEditingTitle(e.target.value)}\n onBlur={handleSaveEdit}\n onKeyDown={handleKeyPress}\n className=\"w-full px-2 py-1 text-sm bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-blue-500\"\n autoFocus\n onClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <h3 className=\"text-sm font-medium text-gray-900 dark:text-white truncate\">\n {session.title}\n </h3>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {formatTimeAgo(session.updatedAt)}\n </p>\n </>\n )}\n </div>\n\n {/* 操作菜单 */}\n {editingSessionId !== session.id && (\n <div className=\"relative\">\n <button\n className=\"p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n const menu = e.currentTarget.nextElementSibling as HTMLElement;\n if (menu) {\n menu.classList.toggle('hidden');\n }\n }}\n >\n <DotsVerticalIcon className=\"w-4 h-4\" />\n </button>\n <div className=\"hidden absolute right-0 z-10 mt-1 w-32 bg-white dark:bg-gray-800 rounded-md shadow-lg ring-1 ring-black ring-opacity-5\">\n <div className=\"py-1\">\n <button\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n handleStartEdit(session.id, session.title);\n const menu = e.currentTarget.closest('.absolute') as HTMLElement;\n if (menu) menu.classList.add('hidden');\n }}\n className=\"flex items-center w-full px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700\"\n >\n <PencilIcon className=\"w-4 h-4 mr-2\" />\n 重命名\n </button>\n <button\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n handleDeleteSession(session.id);\n const menu = e.currentTarget.closest('.absolute') as HTMLElement;\n if (menu) menu.classList.add('hidden');\n }}\n className=\"flex items-center w-full px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n <TrashIcon className=\"w-4 h-4 mr-2\" />\n 删除\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};","import { useState, useEffect } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'system';\n\n// 获取系统主题\nconst getSystemTheme = (): 'light' | 'dark' => {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n};\n\n// 计算实际主题\nconst getActualTheme = (theme: Theme): 'light' | 'dark' => {\n return theme === 'system' ? getSystemTheme() : theme;\n};\n\n// 应用主题到DOM\nconst applyTheme = (actualTheme: 'light' | 'dark') => {\n if (typeof window === 'undefined') return;\n \n const root = window.document.documentElement;\n root.classList.remove('light', 'dark');\n root.classList.add(actualTheme);\n \n // 更新meta标签\n const metaThemeColor = document.querySelector('meta[name=\"theme-color\"]');\n if (metaThemeColor) {\n metaThemeColor.setAttribute('content', actualTheme === 'dark' ? '#0f172a' : '#ffffff');\n }\n};\n\n// 从localStorage获取保存的主题\nconst getSavedTheme = (): Theme => {\n if (typeof window === 'undefined') return 'system';\n const saved = localStorage.getItem('theme');\n return (saved as Theme) || 'system';\n};\n\n// 保存主题到localStorage\nconst saveTheme = (theme: Theme) => {\n if (typeof window === 'undefined') return;\n localStorage.setItem('theme', theme);\n};\n\nexport const useTheme = () => {\n const [theme, setThemeState] = useState<Theme>(() => getSavedTheme());\n const [actualTheme, setActualTheme] = useState<'light' | 'dark'>(() => getActualTheme(getSavedTheme()));\n\n // 设置主题\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n saveTheme(newTheme);\n const newActualTheme = getActualTheme(newTheme);\n setActualTheme(newActualTheme);\n applyTheme(newActualTheme);\n };\n\n // 切换主题\n const toggleTheme = () => {\n let newTheme: Theme;\n \n switch (theme) {\n case 'light':\n newTheme = 'dark';\n break;\n case 'dark':\n newTheme = 'system';\n break;\n case 'system':\n newTheme = 'light';\n break;\n default:\n newTheme = 'system';\n }\n \n setTheme(newTheme);\n };\n\n // 监听系统主题变化\n useEffect(() => {\n if (theme !== 'system') return;\n \n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => {\n const newActualTheme = getSystemTheme();\n setActualTheme(newActualTheme);\n applyTheme(newActualTheme);\n };\n \n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [theme]);\n\n // 初始化时应用主题\n useEffect(() => {\n applyTheme(actualTheme);\n }, [actualTheme]);\n\n return {\n theme,\n actualTheme,\n setTheme,\n toggleTheme,\n };\n};","import React from 'react';\nimport { useTheme } from '../hooks/useTheme';\n\ninterface ThemeToggleProps {\n className?: string;\n}\n\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ className = \"\" }) => {\n const { theme, toggleTheme } = useTheme();\n\n const getThemeIcon = () => {\n switch (theme) {\n case 'light':\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\" />\n </svg>\n );\n case 'dark':\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\" />\n </svg>\n );\n case 'system':\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n const getThemeLabel = () => {\n switch (theme) {\n case 'light':\n return 'Light mode';\n case 'dark':\n return 'Dark mode';\n case 'system':\n return 'System theme';\n default:\n return 'Toggle theme';\n }\n };\n\n return (\n <button\n onClick={toggleTheme}\n className={`p-2 hover:bg-muted rounded-lg transition-colors ${className}`}\n title={getThemeLabel()}\n aria-label={getThemeLabel()}\n >\n {getThemeIcon()}\n </button>\n );\n};\n\nexport default ThemeToggle;","import React, { useState } from 'react';\nimport { useChatStore } from '../lib/store';\nimport { McpConfig } from '../types';\n\n// 服务器图标组件\nconst ServerIcon = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01\" />\n </svg>\n);\n\n// 关闭图标组件\nconst XMarkIcon = () => (\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\n// 加号图标组件\nconst PlusIcon = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n);\n\n// 删除图标组件\nconst TrashIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n);\n\n// 编辑图标组件\nconst EditIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n);\n\ninterface McpManagerProps {\n onClose?: () => void;\n}\n\ninterface McpFormData {\n name: string;\n serverUrl: string;\n enabled: boolean;\n}\n\nconst McpManager: React.FC<McpManagerProps> = ({ onClose }) => {\n const { mcpConfigs, updateMcpConfig, deleteMcpConfig, loadMcpConfigs } = useChatStore();\n const [showAddForm, setShowAddForm] = useState(false);\n const [editingConfig, setEditingConfig] = useState<McpConfig | null>(null);\n const [formData, setFormData] = useState<McpFormData>({\n name: '',\n serverUrl: '',\n enabled: true\n });\n\n // 组件初始化时加载MCP配置\n React.useEffect(() => {\n loadMcpConfigs();\n }, [loadMcpConfigs]);\n\n // 重置表单\n const resetForm = () => {\n setFormData({\n name: '',\n serverUrl: '',\n enabled: true\n });\n setEditingConfig(null);\n setShowAddForm(false);\n };\n\n // 处理添加服务器\n const handleAddServer = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!formData.name.trim() || !formData.serverUrl.trim()) {\n return;\n }\n\n const newConfig: McpConfig = {\n id: Date.now().toString(),\n name: formData.name.trim(),\n serverUrl: formData.serverUrl.trim(),\n enabled: formData.enabled,\n createdAt: new Date(),\n updatedAt: new Date()\n };\n\n await updateMcpConfig(newConfig);\n resetForm();\n };\n\n // 处理编辑服务器\n const handleEditServer = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!editingConfig || !formData.name.trim() || !formData.serverUrl.trim()) {\n return;\n }\n\n const updatedConfig: McpConfig = {\n ...editingConfig,\n name: formData.name.trim(),\n serverUrl: formData.serverUrl.trim(),\n enabled: formData.enabled,\n updatedAt: new Date()\n };\n\n await updateMcpConfig(updatedConfig);\n resetForm();\n };\n\n // 开始编辑\n const startEdit = (config: McpConfig) => {\n setEditingConfig(config);\n setFormData({\n name: config.name,\n serverUrl: config.serverUrl,\n enabled: config.enabled\n });\n setShowAddForm(true);\n };\n\n // 删除服务器\n const handleDeleteServer = async (id: string) => {\n if (confirm('确定要删除这个MCP服务器配置吗?')) {\n await deleteMcpConfig(id);\n }\n };\n\n // 切换服务器启用状态\n const toggleServerEnabled = async (config: McpConfig) => {\n const updatedConfig: McpConfig = {\n ...config,\n enabled: !config.enabled,\n updatedAt: new Date()\n };\n await updateMcpConfig(updatedConfig);\n };\n\n return (\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-2xl max-h-[80vh] overflow-hidden\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center space-x-3\">\n <ServerIcon />\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white\">\n MCP 服务器管理\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n >\n <XMarkIcon />\n </button>\n </div>\n\n {/* 内容区域 */}\n <div className=\"p-6 overflow-y-auto max-h-[calc(80vh-120px)]\">\n {/* 添加按钮 */}\n {!showAddForm && (\n <button\n onClick={() => setShowAddForm(true)}\n className=\"w-full mb-6 p-4 border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-lg hover:border-blue-500 dark:hover:border-blue-400 transition-colors flex items-center justify-center space-x-2 text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400\"\n >\n <PlusIcon />\n <span>添加 MCP 服务器</span>\n </button>\n )}\n\n {/* 添加/编辑表单 */}\n {showAddForm && (\n <form onSubmit={editingConfig ? handleEditServer : handleAddServer} className=\"mb-6 p-4 bg-gray-50 dark:bg-gray-700 rounded-lg\">\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-white mb-4\">\n {editingConfig ? '编辑服务器' : '添加新服务器'}\n </h3>\n \n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 服务器名称\n </label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: File System\"\n required\n />\n </div>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 服务器URL\n </label>\n <input\n type=\"url\"\n value={formData.serverUrl}\n onChange={(e) => setFormData({ ...formData, serverUrl: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: http://localhost:3001\"\n required\n />\n </div>\n \n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"enabled\"\n checked={formData.enabled}\n onChange={(e) => setFormData({ ...formData, enabled: e.target.checked })}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"enabled\" className=\"ml-2 block text-sm text-gray-700 dark:text-gray-300\">\n 启用此服务器\n </label>\n </div>\n </div>\n \n <div className=\"flex space-x-3 mt-6\">\n <button\n type=\"submit\"\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {editingConfig ? '更新' : '添加'}\n </button>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"px-4 py-2 bg-gray-300 dark:bg-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-400 dark:hover:bg-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-500\"\n >\n 取消\n </button>\n </div>\n </form>\n )}\n\n {/* 服务器列表 */}\n <div className=\"space-y-3\">\n {mcpConfigs.length === 0 ? (\n <div className=\"text-center py-8 text-gray-500 dark:text-gray-400\">\n <ServerIcon />\n <p className=\"mt-2\">暂无 MCP 服务器配置</p>\n <p className=\"text-sm\">点击上方按钮添加第一个服务器</p>\n </div>\n ) : (\n mcpConfigs.map((config) => (\n <div\n key={config.id}\n className=\"flex items-center justify-between p-4 bg-white dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-lg\"\n >\n <div className=\"flex items-center space-x-3\">\n <div className={`w-3 h-3 rounded-full ${\n config.enabled ? 'bg-green-500' : 'bg-gray-400'\n }`} />\n <div>\n <h4 className=\"font-medium text-gray-900 dark:text-white\">\n {config.name}\n </h4>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {config.serverUrl}\n </p>\n </div>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => toggleServerEnabled(config)}\n className={`px-3 py-1 text-xs rounded-full ${\n config.enabled\n ? 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200'\n : 'bg-gray-100 text-gray-800 dark:bg-gray-600 dark:text-gray-200'\n }`}\n >\n {config.enabled ? '已启用' : '已禁用'}\n </button>\n \n <button\n onClick={() => startEdit(config)}\n className=\"p-2 text-gray-500 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400 transition-colors\"\n title=\"编辑\"\n >\n <EditIcon />\n </button>\n \n <button\n onClick={() => handleDeleteServer(config.id)}\n className=\"p-2 text-gray-500 hover:text-red-600 dark:text-gray-400 dark:hover:text-red-400 transition-colors\"\n title=\"删除\"\n >\n <TrashIcon />\n </button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default McpManager;","import React, { useState, useEffect } from 'react';\nimport { useChatStore } from '../lib/store';\nimport type { AiModelConfig } from '../types';\n\n// 图标组件\nconst BrainIcon = () => (\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n);\n\nconst XMarkIcon = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\nconst PlusIcon = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n);\n\nconst PencilIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n);\n\nconst TrashIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n);\n\ninterface AiModelManagerProps {\n onClose: () => void;\n}\n\ninterface AiModelFormData {\n name: string;\n base_url: string;\n api_key: string;\n model_name: string;\n enabled: boolean;\n}\n\nconst AiModelManager: React.FC<AiModelManagerProps> = ({ onClose }) => {\n const { aiModelConfigs, loadAiModelConfigs, updateAiModelConfig, deleteAiModelConfig } = useChatStore();\n const [showAddForm, setShowAddForm] = useState(false);\n const [editingConfig, setEditingConfig] = useState<AiModelConfig | null>(null);\n const [formData, setFormData] = useState<AiModelFormData>({\n name: '',\n base_url: '',\n api_key: '',\n model_name: '',\n enabled: true\n });\n\n // 加载AI模型配置\n useEffect(() => {\n loadAiModelConfigs();\n }, [loadAiModelConfigs]);\n\n // 重置表单\n const resetForm = () => {\n setFormData({\n name: '',\n base_url: '',\n api_key: '',\n model_name: '',\n enabled: true\n });\n setEditingConfig(null);\n setShowAddForm(false);\n };\n\n // 处理添加服务器\n const handleAddServer = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!formData.name.trim() || !formData.base_url.trim() || !formData.api_key.trim() || !formData.model_name.trim()) {\n return;\n }\n\n const newConfig: AiModelConfig = {\n id: Math.random().toString(36).substr(2, 9),\n name: formData.name.trim(),\n base_url: formData.base_url.trim(),\n api_key: formData.api_key.trim(),\n model_name: formData.model_name.trim(),\n enabled: formData.enabled,\n createdAt: new Date(),\n updatedAt: new Date()\n };\n\n await updateAiModelConfig(newConfig);\n resetForm();\n };\n\n // 处理编辑服务器\n const handleEditServer = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!editingConfig || !formData.name.trim() || !formData.base_url.trim() || !formData.api_key.trim() || !formData.model_name.trim()) {\n return;\n }\n\n const updatedConfig: AiModelConfig = {\n ...editingConfig,\n name: formData.name.trim(),\n base_url: formData.base_url.trim(),\n api_key: formData.api_key.trim(),\n model_name: formData.model_name.trim(),\n enabled: formData.enabled,\n updatedAt: new Date()\n };\n\n await updateAiModelConfig(updatedConfig);\n resetForm();\n };\n\n // 开始编辑\n const startEdit = (config: AiModelConfig) => {\n setEditingConfig(config);\n setFormData({\n name: config.name,\n base_url: config.base_url,\n api_key: config.api_key,\n model_name: config.model_name,\n enabled: config.enabled\n });\n setShowAddForm(true);\n };\n\n // 删除服务器\n const handleDeleteServer = async (id: string) => {\n if (confirm('确定要删除这个AI模型配置吗?')) {\n await deleteAiModelConfig(id);\n }\n };\n\n // 切换服务器启用状态\n const toggleServerEnabled = async (config: AiModelConfig) => {\n const updatedConfig: AiModelConfig = {\n ...config,\n enabled: !config.enabled,\n updatedAt: new Date()\n };\n await updateAiModelConfig(updatedConfig);\n };\n\n return (\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-2xl max-h-[80vh] overflow-hidden\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center space-x-3\">\n <BrainIcon />\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white\">\n AI 模型管理\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n >\n <XMarkIcon />\n </button>\n </div>\n\n {/* 内容区域 */}\n <div className=\"p-6 overflow-y-auto max-h-[calc(80vh-120px)]\">\n {/* 添加按钮 */}\n {!showAddForm && (\n <button\n onClick={() => setShowAddForm(true)}\n className=\"w-full mb-6 p-4 border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-lg hover:border-blue-500 dark:hover:border-blue-400 transition-colors flex items-center justify-center space-x-2 text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400\"\n >\n <PlusIcon />\n <span>添加 AI 模型</span>\n </button>\n )}\n\n {/* 添加/编辑表单 */}\n {showAddForm && (\n <form onSubmit={editingConfig ? handleEditServer : handleAddServer} className=\"mb-6 p-4 bg-gray-50 dark:bg-gray-700 rounded-lg\">\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-white mb-4\">\n {editingConfig ? '编辑 AI 模型' : '添加 AI 模型'}\n </h3>\n \n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 配置名称\n </label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: OpenAI GPT-4\"\n required\n />\n </div>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n Base URL\n </label>\n <input\n type=\"url\"\n value={formData.base_url}\n onChange={(e) => setFormData({ ...formData, base_url: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: https://api.openai.com/v1\"\n required\n />\n </div>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n API Key\n </label>\n <input\n type=\"password\"\n value={formData.api_key}\n onChange={(e) => setFormData({ ...formData, api_key: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"输入API密钥\"\n required\n />\n </div>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 模型名称\n </label>\n <input\n type=\"text\"\n value={formData.model_name}\n onChange={(e) => setFormData({ ...formData, model_name: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: gpt-4\"\n required\n />\n </div>\n \n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"enabled\"\n checked={formData.enabled}\n onChange={(e) => setFormData({ ...formData, enabled: e.target.checked })}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"enabled\" className=\"ml-2 block text-sm text-gray-700 dark:text-gray-300\">\n 启用此模型\n </label>\n </div>\n </div>\n \n <div className=\"flex space-x-3 mt-6\">\n <button\n type=\"submit\"\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {editingConfig ? '更新' : '添加'}\n </button>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"px-4 py-2 bg-gray-300 dark:bg-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-400 dark:hover:bg-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-500\"\n >\n 取消\n </button>\n </div>\n </form>\n )}\n\n {/* 服务器列表 */}\n <div className=\"space-y-3\">\n {aiModelConfigs.length === 0 ? (\n <div className=\"text-center py-8 text-gray-500 dark:text-gray-400\">\n <BrainIcon />\n <p className=\"mt-2\">暂无 AI 模型配置</p>\n <p className=\"text-sm\">点击上方按钮添加第一个模型</p>\n </div>\n ) : (\n aiModelConfigs.map((config: AiModelConfig) => (\n <div\n key={config.id}\n className=\"flex items-center justify-between p-4 bg-white dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-lg hover:shadow-md transition-shadow\"\n >\n <div className=\"flex items-center space-x-3\">\n <div className={`w-3 h-3 rounded-full ${\n config.enabled ? 'bg-green-500' : 'bg-gray-400'\n }`} />\n <div>\n <h4 className=\"font-medium text-gray-900 dark:text-white\">\n {config.name}\n </h4>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {config.base_url} - {config.model_name}\n </p>\n </div>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => toggleServerEnabled(config)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n config.enabled\n ? 'bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-200'\n : 'bg-gray-100 text-gray-800 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-200'\n }`}\n >\n {config.enabled ? '已启用' : '已禁用'}\n </button>\n \n <button\n onClick={() => startEdit(config)}\n className=\"p-2 text-gray-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900 rounded transition-colors\"\n title=\"编辑\"\n >\n <PencilIcon />\n </button>\n \n <button\n onClick={() => handleDeleteServer(config.id)}\n className=\"p-2 text-gray-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-900 rounded transition-colors\"\n title=\"删除\"\n >\n <TrashIcon />\n </button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default AiModelManager;","import React, { useState, useEffect } from 'react';\nimport { useChatStore } from '../lib/store';\n\n// 文档图标组件\nconst DocumentIcon = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n);\n\n// 关闭图标组件\nconst XMarkIcon = () => (\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\n// 保存图标组件\nconst SaveIcon = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\" />\n </svg>\n);\n\ninterface SystemContextEditorProps {\n onClose?: () => void;\n}\n\nconst SystemContextEditor: React.FC<SystemContextEditorProps> = ({ onClose }) => {\n const { systemContext, updateSystemContext, loadSystemContext } = useChatStore();\n const [content, setContent] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n\n // 组件初始化时加载系统上下文\n useEffect(() => {\n const loadContent = async () => {\n console.log('SystemContextEditor: Starting to load system context');\n setIsLoading(true);\n try {\n await loadSystemContext();\n console.log('SystemContextEditor: System context loaded successfully');\n } catch (error) {\n console.error('SystemContextEditor: Failed to load system context:', error);\n } finally {\n setIsLoading(false);\n }\n };\n loadContent();\n }, []); // 移除loadSystemContext依赖,避免无限循环\n\n // 当 systemContext 更新时同步到本地状态\n useEffect(() => {\n setContent(systemContext || '');\n }, [systemContext]);\n\n // 保存系统上下文\n const handleSave = async () => {\n setIsSaving(true);\n try {\n await updateSystemContext(content);\n onClose?.();\n } catch (error) {\n console.error('Failed to save system context:', error);\n alert('保存失败,请重试');\n } finally {\n setIsSaving(false);\n }\n };\n\n // 处理键盘快捷键\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.ctrlKey && e.key === 's') {\n e.preventDefault();\n handleSave();\n }\n };\n\n return (\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-4xl max-h-[90vh] overflow-hidden\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center space-x-3\">\n <DocumentIcon />\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white\">\n 系统上下文设置\n </h2>\n </div>\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={handleSave}\n disabled={isSaving}\n className=\"flex items-center space-x-2 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <SaveIcon />\n <span>{isSaving ? '保存中...' : '保存'}</span>\n </button>\n <button\n onClick={onClose}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n >\n <XMarkIcon />\n </button>\n </div>\n </div>\n\n {/* 内容区域 */}\n <div className=\"p-6 overflow-hidden flex flex-col\" style={{ height: 'calc(90vh - 120px)' }}>\n {/* 说明文字 */}\n <div className=\"mb-4 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg\">\n <p className=\"text-sm text-blue-800 dark:text-blue-200\">\n <strong>系统上下文</strong>将作为每次对话的系统提示词,支持 Markdown 格式。\n 您可以在这里设置 AI 的角色、行为规范、回答风格等。\n </p>\n <p className=\"text-xs text-blue-600 dark:text-blue-300 mt-2\">\n 提示:使用 Ctrl+S 快速保存\n </p>\n </div>\n\n {/* 编辑器 */}\n <div className=\"flex-1 flex flex-col\">\n <div className=\"mb-2 flex items-center justify-between\">\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n Markdown 内容\n </label>\n <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n {content.length} 字符\n </div>\n </div>\n \n {isLoading ? (\n <div className=\"flex-1 flex items-center justify-center bg-gray-50 dark:bg-gray-700 rounded-lg border border-gray-300 dark:border-gray-600\">\n <div className=\"text-gray-500 dark:text-gray-400\">加载中...</div>\n </div>\n ) : (\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n className=\"flex-1 w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white resize-none font-mono text-sm\"\n placeholder=\"请输入系统上下文内容,支持 Markdown 格式...\\n\\n例如:\\n# AI 助手角色设定\\n\\n你是一个专业的编程助手,具有以下特点:\\n- 提供准确、简洁的代码解决方案\\n- 遵循最佳实践和代码规范\\n- 耐心解答技术问题\\n\\n## 回答风格\\n- 使用中文回答\\n- 代码示例要完整可运行\\n- 提供必要的解释说明\"\n spellCheck={false}\n />\n )}\n </div>\n\n {/* 底部提示 */}\n <div className=\"mt-4 text-xs text-gray-500 dark:text-gray-400\">\n <p>• 支持标准 Markdown 语法:标题、列表、代码块、链接等</p>\n <p>• 内容将在每次对话开始时自动发送给 AI</p>\n <p>• 留空则使用默认系统提示词</p>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default SystemContextEditor;","import React, { useEffect, useRef, useState } from 'react';\nimport { useChatStore } from '../lib/store';\nimport { createChatStore } from '../lib/store/createChatStore';\nimport { MessageList } from './MessageList';\nimport { InputArea } from './InputArea';\nimport { SessionList } from './SessionList';\nimport { ThemeToggle } from './ThemeToggle';\nimport McpManager from './McpManager';\nimport AiModelManager from './AiModelManager';\nimport SystemContextEditor from './SystemContextEditor';\nimport { cn } from '../lib/utils';\nimport ApiClient from '../lib/api/client';\n\nexport interface StandaloneChatInterfaceProps {\n className?: string;\n apiBaseUrl?: string;\n port?: number;\n}\n\n/**\n * 完全独立的聊天界面组件\n * 支持自定义API端口和基础URL\n */\nexport const StandaloneChatInterface: React.FC<StandaloneChatInterfaceProps> = ({\n className,\n apiBaseUrl,\n port,\n}) => {\n // 根据传入的port或apiBaseUrl创建自定义的API基础URL\n const customApiBaseUrl = React.useMemo(() => {\n if (apiBaseUrl) {\n return apiBaseUrl;\n }\n if (port) {\n return `http://localhost:${port}/api`;\n }\n return undefined;\n }, [apiBaseUrl, port]);\n\n // 创建自定义的ApiClient实例\n const customApiClient = React.useMemo(() => {\n if (customApiBaseUrl) {\n return new ApiClient(customApiBaseUrl);\n }\n return undefined;\n }, [customApiBaseUrl]);\n\n // Create custom store if we have a custom API client\n const customStore = React.useMemo(() => {\n if (customApiClient) {\n return createChatStore(customApiClient);\n }\n return null;\n }, [customApiClient]);\n // Use custom store if available, otherwise use default store\n const store = customStore || useChatStore;\n \n const {\n currentSession,\n messages,\n isLoading,\n isStreaming,\n error,\n loadSessions,\n sendMessage,\n clearError,\n aiModelConfigs,\n selectedModelId,\n setSelectedModel,\n loadAiModelConfigs,\n } = store();\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const [isSessionModalOpen, setIsSessionModalOpen] = useState(false);\n const [showMcpManager, setShowMcpManager] = useState(false);\n const [showAiModelManager, setShowAiModelManager] = useState(false);\n const [showSystemContextEditor, setShowSystemContextEditor] = useState(false);\n\n // 初始化加载会话和AI模型配置\n useEffect(() => {\n loadSessions();\n loadAiModelConfigs();\n }, [loadSessions, loadAiModelConfigs]);\n\n // 自动滚动到底部\n useEffect(() => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: 'smooth' });\n }\n }, [messages, isStreaming]);\n\n // 处理消息发送 - 完全内部处理,不需要外部回调\n const handleMessageSend = async (content: string, attachments?: File[]) => {\n try {\n await sendMessage(content, attachments);\n } catch (error) {\n console.error('Failed to send message:', error);\n }\n };\n\n return (\n <div className={cn(\n 'flex flex-col h-screen bg-background text-foreground',\n className\n )}>\n {/* 头部 - 包含会话按钮和主题切换 */}\n <div className=\"flex items-center justify-between p-4 bg-card border-b border-border\">\n <div className=\"flex items-center space-x-3\">\n <button\n onClick={() => setIsSessionModalOpen(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"打开会话列表\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n \n {currentSession && (\n <div className=\"flex-1 min-w-0\">\n <h1 className=\"text-lg font-semibold text-foreground truncate\">\n {currentSession.title}\n </h1>\n </div>\n )}\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => setShowMcpManager(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"MCP 服务器管理\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01\" />\n </svg>\n </button>\n <button\n onClick={() => setShowAiModelManager(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"AI 模型管理\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </button>\n <button\n onClick={() => setShowSystemContextEditor(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"系统上下文设置\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n <ThemeToggle />\n </div>\n </div>\n\n {/* 错误提示 */}\n {error && (\n <div className=\"mx-4 mt-4 p-3 bg-destructive/10 border border-destructive/20 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <button\n onClick={clearError}\n className=\"text-destructive hover:text-destructive/80 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {/* 消息列表 */}\n <div className=\"flex-1 overflow-hidden\">\n {currentSession ? (\n <MessageList\n messages={messages}\n isLoading={isLoading}\n isStreaming={isStreaming}\n />\n ) : (\n <div className=\"flex items-center justify-center h-full text-muted-foreground\">\n <div className=\"text-center\">\n <svg className=\"w-16 h-16 mx-auto mb-4 opacity-50\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n <p className=\"text-lg mb-2\">欢迎使用AI聊天助手</p>\n <p className=\"text-sm\">点击左上角按钮创建新会话开始对话</p>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* 输入区域 */}\n {currentSession && (\n <InputArea\n onSend={handleMessageSend}\n disabled={isLoading || isStreaming}\n selectedModelId={selectedModelId}\n availableModels={aiModelConfigs}\n onModelChange={setSelectedModel}\n showModelSelector={true}\n />\n )}\n\n {/* 会话列表模态框 */}\n {isSessionModalOpen && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-card border border-border rounded-lg w-full max-w-md mx-4 max-h-[80vh] overflow-hidden\">\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h2 className=\"text-lg font-semibold\">会话列表</h2>\n <button\n onClick={() => setIsSessionModalOpen(false)}\n className=\"p-1 text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div className=\"overflow-y-auto max-h-[60vh]\">\n <SessionList onClose={() => setIsSessionModalOpen(false)} />\n </div>\n </div>\n </div>\n )}\n\n {/* MCP管理器模态框 */}\n {showMcpManager && (\n <McpManager onClose={() => setShowMcpManager(false)} />\n )}\n\n {/* AI模型管理器模态框 */}\n {showAiModelManager && (\n <AiModelManager onClose={() => setShowAiModelManager(false)} />\n )}\n\n {/* 系统上下文编辑器模态框 */}\n {showSystemContextEditor && (\n <SystemContextEditor onClose={() => setShowSystemContextEditor(false)} />\n )}\n </div>\n );\n};\n\nexport default StandaloneChatInterface;","import React, { useEffect, useRef, useState } from 'react';\nimport { useChatStore } from '../lib/store';\nimport { MessageList } from './MessageList';\nimport { InputArea } from './InputArea';\nimport { SessionList } from './SessionList';\nimport { ThemeToggle } from './ThemeToggle';\nimport McpManager from './McpManager';\nimport AiModelManager from './AiModelManager';\nimport SystemContextEditor from './SystemContextEditor';\nimport { cn } from '../lib/utils';\nimport type { ChatInterfaceProps } from '../types';\n\nexport const ChatInterface: React.FC<ChatInterfaceProps> = ({\n className,\n onMessageSend,\n customRenderer,\n}) => {\n const {\n currentSession,\n messages,\n isLoading,\n isStreaming,\n error,\n loadSessions,\n // selectSession,\n sendMessage,\n clearError,\n aiModelConfigs,\n selectedModelId,\n setSelectedModel,\n loadAiModelConfigs,\n } = useChatStore();\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const [isSessionModalOpen, setIsSessionModalOpen] = useState(false);\n const [showMcpManager, setShowMcpManager] = useState(false);\n const [showAiModelManager, setShowAiModelManager] = useState(false);\n const [showSystemContextEditor, setShowSystemContextEditor] = useState(false);\n\n // 初始化加载会话和AI模型配置\n useEffect(() => {\n loadSessions();\n loadAiModelConfigs();\n }, [loadSessions, loadAiModelConfigs]);\n\n // 自动滚动到底部\n useEffect(() => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: 'smooth' });\n }\n }, [messages, isStreaming]);\n\n // 处理会话切换\n // const handleSessionChange = async (sessionId: string) => {\n // await selectSession(sessionId);\n // onSessionChange?.(sessionId);\n // };\n\n // 处理消息发送\n const handleMessageSend = async (content: string, attachments?: File[]) => {\n try {\n await sendMessage(content, attachments);\n onMessageSend?.(content, []);\n } catch (error) {\n console.error('Failed to send message:', error);\n }\n };\n\n return (\n <div className={cn(\n 'flex flex-col h-screen bg-background text-foreground',\n className\n )}>\n {/* 头部 - 包含会话按钮和主题切换 */}\n <div className=\"flex items-center justify-between p-4 bg-card border-b border-border\">\n <div className=\"flex items-center space-x-3\">\n <button\n onClick={() => setIsSessionModalOpen(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"打开会话列表\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n \n {currentSession && (\n <div className=\"flex-1 min-w-0\">\n <h1 className=\"text-lg font-semibold text-foreground truncate\">\n {currentSession.title}\n </h1>\n </div>\n )}\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => setShowMcpManager(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"MCP 服务器管理\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01\" />\n </svg>\n </button>\n <button\n onClick={() => setShowAiModelManager(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"AI 模型管理\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </button>\n <button\n onClick={() => setShowSystemContextEditor(true)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n title=\"系统上下文设置\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n <ThemeToggle />\n </div>\n </div>\n\n {/* 错误提示 */}\n {error && (\n <div className=\"mx-4 mt-4 p-3 bg-destructive/10 border border-destructive/20 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <button\n onClick={clearError}\n className=\"text-destructive hover:text-destructive/80 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {/* 消息列表 */}\n <div className=\"flex-1 overflow-hidden\">\n {currentSession ? (\n <MessageList\n messages={messages}\n isLoading={isLoading}\n isStreaming={isStreaming}\n customRenderer={customRenderer}\n />\n ) : (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <h2 className=\"text-xl font-semibold text-muted-foreground mb-2\">\n 欢迎使用 AI 聊天\n </h2>\n <p className=\"text-muted-foreground mb-4\">\n 点击左上角按钮选择会话,或创建新的会话开始对话\n </p>\n <button\n onClick={() => setIsSessionModalOpen(true)}\n className=\"px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors\"\n >\n 打开会话列表\n </button>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* 输入区域 */}\n {currentSession && (\n <div className=\"border-t border-border\">\n <InputArea\n onSend={handleMessageSend}\n disabled={isLoading || isStreaming}\n placeholder=\"输入消息...\"\n showModelSelector={true}\n selectedModelId={selectedModelId}\n availableModels={aiModelConfigs}\n onModelChange={setSelectedModel}\n />\n </div>\n )}\n\n {/* 会话列表弹出框 */}\n {isSessionModalOpen && (\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\n {/* 背景遮罩 */}\n <div \n className=\"fixed inset-0 bg-black bg-opacity-25 transition-opacity\"\n onClick={() => setIsSessionModalOpen(false)}\n />\n \n {/* 模态框内容 */}\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-md transform overflow-hidden rounded-2xl bg-card shadow-xl transition-all\">\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h3 className=\"text-lg font-semibold text-foreground\">\n 会话管理\n </h3>\n <button\n onClick={() => setIsSessionModalOpen(false)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div className=\"h-96\">\n <SessionList onClose={() => setIsSessionModalOpen(false)} />\n </div>\n </div>\n </div>\n </div>\n )}\n \n {/* MCP管理器 */}\n {showMcpManager && (\n <McpManager onClose={() => setShowMcpManager(false)} />\n )}\n \n {/* AI模型管理器 */}\n {showAiModelManager && (\n <AiModelManager onClose={() => setShowAiModelManager(false)} />\n )}\n \n {/* 系统上下文编辑器 */}\n {showSystemContextEditor && (\n <SystemContextEditor onClose={() => setShowSystemContextEditor(false)} />\n )}\n </div>\n );\n};\n\nexport default ChatInterface;","import { Component, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error?: Error;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: any) {\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"flex items-center justify-center h-full p-8\">\n <div className=\"text-center space-y-4\">\n <div className=\"w-16 h-16 mx-auto bg-destructive/10 rounded-full flex items-center justify-center\">\n <svg className=\"w-8 h-8 text-destructive\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n </div>\n <div>\n <h3 className=\"text-lg font-semibold text-foreground\">Something went wrong</h3>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {this.state.error?.message || 'An unexpected error occurred'}\n </p>\n <button\n onClick={() => this.setState({ hasError: false, error: undefined })}\n className=\"mt-4 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors\"\n >\n Try again\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}","// API客户端,用于与后端服务器通信\n// 移除messageManager导入,避免重复保存\n\n// 注释掉未使用的导入\n// import { mcpApi } from './mcp';\n// import { systemApi } from './system';\n\nconst API_BASE_URL = 'http://localhost:3001/api';\n\n// HTTP请求工具函数\nconst request = async (url: string, options: RequestInit = {}) => {\n try {\n const response = await fetch(`${API_BASE_URL}${url}`, {\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n ...options,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP error! status: ${response.status}`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch {\n // 如果无法解析错误响应,使用默认错误消息\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n } catch (error) {\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new Error('网络连接失败,请检查网络连接或服务器状态');\n }\n throw error;\n }\n};\n\nexport const conversationsApi = {\n async getDetails(conversationId: string) {\n try {\n const session = await request(`/sessions/${conversationId}`);\n return {\n data: {\n conversation: {\n id: session.id,\n title: session.title,\n created_at: session.created_at,\n updated_at: session.updated_at\n }\n }\n };\n } catch (error) {\n console.error('Failed to get conversation details:', error);\n // 返回默认值以保持兼容性\n return {\n data: {\n conversation: {\n id: conversationId,\n title: 'Default Conversation',\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString()\n }\n }\n };\n }\n },\n\n async getAssistant(_conversationId: string) {\n try {\n // 获取AI模型配置\n const configs = await request('/ai-model-configs');\n const defaultConfig = configs.find((config: any) => config.enabled) || configs[0];\n \n if (!defaultConfig) {\n throw new Error('No AI model configuration found');\n }\n\n return {\n data: {\n assistant: {\n id: defaultConfig.id,\n name: defaultConfig.name,\n model_config: {\n model_name: defaultConfig.model_name,\n temperature: 0.7,\n max_tokens: 4000,\n api_key: defaultConfig.api_key,\n base_url: defaultConfig.base_url\n }\n }\n }\n };\n } catch (error) {\n console.error('Failed to get assistant:', error);\n // 返回默认值以保持兼容性\n return {\n data: {\n assistant: {\n id: 'default-assistant',\n name: 'AI Assistant',\n model_config: {\n model_name: 'gpt-3.5-turbo',\n temperature: 0.7,\n max_tokens: 4000,\n api_key: import.meta.env.VITE_OPENAI_API_KEY || '',\n base_url: 'https://api.openai.com/v1'\n }\n }\n }\n };\n }\n },\n\n async getMcpServers(_conversationId?: string) {\n try {\n // 直接获取全局MCP配置,而不是基于会话的配置\n const mcpConfigs = await request('/mcp-configs');\n // 只返回启用的MCP服务器,并转换数据格式\n const enabledServers = mcpConfigs\n .filter((config: any) => config.enabled)\n .map((config: any) => ({\n name: config.name,\n url: config.command // 后端使用command字段存储URL\n }));\n return {\n data: {\n mcp_servers: enabledServers\n }\n };\n } catch (error) {\n console.error('Failed to get MCP servers:', error);\n return {\n data: {\n mcp_servers: []\n }\n };\n }\n },\n\n async saveMessage(conversationId: string, message: any) {\n try {\n // 生成唯一ID\n const messageId = message.id || `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n const savedMessage = await request(`/messages`, {\n method: 'POST',\n body: JSON.stringify({\n id: messageId,\n sessionId: conversationId,\n role: message.role,\n content: message.content,\n toolCalls: message.tool_calls || null,\n toolCallId: message.tool_call_id || null,\n reasoning: message.reasoning || null,\n metadata: message.metadata || null\n })\n });\n \n return {\n data: {\n message: savedMessage\n }\n };\n } catch (error) {\n console.error('Failed to save message:', error);\n // 返回模拟数据以保持兼容性\n return {\n data: {\n message: {\n ...message,\n id: Date.now().toString(),\n created_at: new Date().toISOString()\n }\n }\n };\n }\n },\n\n async getMessages(conversationId: string, _params: any = {}) {\n try {\n const messages = await request(`/sessions/${conversationId}/messages`);\n return {\n data: {\n messages: messages\n }\n };\n } catch (error) {\n console.error('Failed to get messages:', error);\n return {\n data: {\n messages: []\n }\n };\n }\n },\n\n async addMessage(conversationId: string, message: any) {\n return this.saveMessage(conversationId, message);\n }\n};","export const default_format = 'RFC3986';\nexport const formatters = {\n RFC1738: (v) => String(v).replace(/%20/g, '+'),\n RFC3986: (v) => String(v),\n};\nexport const RFC1738 = 'RFC1738';\nexport const RFC3986 = 'RFC3986';\n//# sourceMappingURL=formats.mjs.map","import { RFC1738 } from \"./formats.mjs\";\nconst has = Object.prototype.hasOwnProperty;\nconst is_array = Array.isArray;\nconst hex_table = (() => {\n const array = [];\n for (let i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n return array;\n})();\nfunction compact_queue(queue) {\n while (queue.length > 1) {\n const item = queue.pop();\n if (!item)\n continue;\n const obj = item.obj[item.prop];\n if (is_array(obj)) {\n const compacted = [];\n for (let j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n // @ts-ignore\n item.obj[item.prop] = compacted;\n }\n }\n}\nfunction array_to_object(source, options) {\n const obj = options && options.plainObjects ? Object.create(null) : {};\n for (let i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n return obj;\n}\nexport function merge(target, source, options = {}) {\n if (!source) {\n return target;\n }\n if (typeof source !== 'object') {\n if (is_array(target)) {\n target.push(source);\n }\n else if (target && typeof target === 'object') {\n if ((options && (options.plainObjects || options.allowPrototypes)) ||\n !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n }\n else {\n return [target, source];\n }\n return target;\n }\n if (!target || typeof target !== 'object') {\n return [target].concat(source);\n }\n let mergeTarget = target;\n if (is_array(target) && !is_array(source)) {\n // @ts-ignore\n mergeTarget = array_to_object(target, options);\n }\n if (is_array(target) && is_array(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n const targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n }\n else {\n target.push(item);\n }\n }\n else {\n target[i] = item;\n }\n });\n return target;\n }\n return Object.keys(source).reduce(function (acc, key) {\n const value = source[key];\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n }\n else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n}\nexport function assign_single_source(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n}\nexport function decode(str, _, charset) {\n const strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n }\n catch (e) {\n return strWithoutPlus;\n }\n}\nconst limit = 1024;\nexport const encode = (str, _defaultEncoder, charset, _kind, format) => {\n // This code was originally written by Brian White for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n let string = str;\n if (typeof str === 'symbol') {\n string = Symbol.prototype.toString.call(str);\n }\n else if (typeof str !== 'string') {\n string = String(str);\n }\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n let out = '';\n for (let j = 0; j < string.length; j += limit) {\n const segment = string.length >= limit ? string.slice(j, j + limit) : string;\n const arr = [];\n for (let i = 0; i < segment.length; ++i) {\n let c = segment.charCodeAt(i);\n if (c === 0x2d || // -\n c === 0x2e || // .\n c === 0x5f || // _\n c === 0x7e || // ~\n (c >= 0x30 && c <= 0x39) || // 0-9\n (c >= 0x41 && c <= 0x5a) || // a-z\n (c >= 0x61 && c <= 0x7a) || // A-Z\n (format === RFC1738 && (c === 0x28 || c === 0x29)) // ( )\n ) {\n arr[arr.length] = segment.charAt(i);\n continue;\n }\n if (c < 0x80) {\n arr[arr.length] = hex_table[c];\n continue;\n }\n if (c < 0x800) {\n arr[arr.length] = hex_table[0xc0 | (c >> 6)] + hex_table[0x80 | (c & 0x3f)];\n continue;\n }\n if (c < 0xd800 || c >= 0xe000) {\n arr[arr.length] =\n hex_table[0xe0 | (c >> 12)] + hex_table[0x80 | ((c >> 6) & 0x3f)] + hex_table[0x80 | (c & 0x3f)];\n continue;\n }\n i += 1;\n c = 0x10000 + (((c & 0x3ff) << 10) | (segment.charCodeAt(i) & 0x3ff));\n arr[arr.length] =\n hex_table[0xf0 | (c >> 18)] +\n hex_table[0x80 | ((c >> 12) & 0x3f)] +\n hex_table[0x80 | ((c >> 6) & 0x3f)] +\n hex_table[0x80 | (c & 0x3f)];\n }\n out += arr.join('');\n }\n return out;\n};\nexport function compact(value) {\n const queue = [{ obj: { o: value }, prop: 'o' }];\n const refs = [];\n for (let i = 0; i < queue.length; ++i) {\n const item = queue[i];\n // @ts-ignore\n const obj = item.obj[item.prop];\n const keys = Object.keys(obj);\n for (let j = 0; j < keys.length; ++j) {\n const key = keys[j];\n const val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n compact_queue(queue);\n return value;\n}\nexport function is_regexp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n}\nexport function is_buffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n}\nexport function combine(a, b) {\n return [].concat(a, b);\n}\nexport function maybe_map(val, fn) {\n if (is_array(val)) {\n const mapped = [];\n for (let i = 0; i < val.length; i += 1) {\n mapped.push(fn(val[i]));\n }\n return mapped;\n }\n return fn(val);\n}\n//# sourceMappingURL=utils.mjs.map","import { encode, is_buffer, maybe_map } from \"./utils.mjs\";\nimport { default_format, formatters } from \"./formats.mjs\";\nconst has = Object.prototype.hasOwnProperty;\nconst array_prefix_generators = {\n brackets(prefix) {\n return String(prefix) + '[]';\n },\n comma: 'comma',\n indices(prefix, key) {\n return String(prefix) + '[' + key + ']';\n },\n repeat(prefix) {\n return String(prefix);\n },\n};\nconst is_array = Array.isArray;\nconst push = Array.prototype.push;\nconst push_to_array = function (arr, value_or_array) {\n push.apply(arr, is_array(value_or_array) ? value_or_array : [value_or_array]);\n};\nconst to_ISO = Date.prototype.toISOString;\nconst defaults = {\n addQueryPrefix: false,\n allowDots: false,\n allowEmptyArrays: false,\n arrayFormat: 'indices',\n charset: 'utf-8',\n charsetSentinel: false,\n delimiter: '&',\n encode: true,\n encodeDotInKeys: false,\n encoder: encode,\n encodeValuesOnly: false,\n format: default_format,\n formatter: formatters[default_format],\n /** @deprecated */\n indices: false,\n serializeDate(date) {\n return to_ISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false,\n};\nfunction is_non_nullish_primitive(v) {\n return (typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean' ||\n typeof v === 'symbol' ||\n typeof v === 'bigint');\n}\nconst sentinel = {};\nfunction inner_stringify(object, prefix, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, sideChannel) {\n let obj = object;\n let tmp_sc = sideChannel;\n let step = 0;\n let find_flag = false;\n while ((tmp_sc = tmp_sc.get(sentinel)) !== void undefined && !find_flag) {\n // Where object last appeared in the ref tree\n const pos = tmp_sc.get(object);\n step += 1;\n if (typeof pos !== 'undefined') {\n if (pos === step) {\n throw new RangeError('Cyclic object value');\n }\n else {\n find_flag = true; // Break while\n }\n }\n if (typeof tmp_sc.get(sentinel) === 'undefined') {\n step = 0;\n }\n }\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n }\n else if (obj instanceof Date) {\n obj = serializeDate?.(obj);\n }\n else if (generateArrayPrefix === 'comma' && is_array(obj)) {\n obj = maybe_map(obj, function (value) {\n if (value instanceof Date) {\n return serializeDate?.(value);\n }\n return value;\n });\n }\n if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ?\n // @ts-expect-error\n encoder(prefix, defaults.encoder, charset, 'key', format)\n : prefix;\n }\n obj = '';\n }\n if (is_non_nullish_primitive(obj) || is_buffer(obj)) {\n if (encoder) {\n const key_value = encodeValuesOnly ? prefix\n // @ts-expect-error\n : encoder(prefix, defaults.encoder, charset, 'key', format);\n return [\n formatter?.(key_value) +\n '=' +\n // @ts-expect-error\n formatter?.(encoder(obj, defaults.encoder, charset, 'value', format)),\n ];\n }\n return [formatter?.(prefix) + '=' + formatter?.(String(obj))];\n }\n const values = [];\n if (typeof obj === 'undefined') {\n return values;\n }\n let obj_keys;\n if (generateArrayPrefix === 'comma' && is_array(obj)) {\n // we need to join elements in\n if (encodeValuesOnly && encoder) {\n // @ts-expect-error values only\n obj = maybe_map(obj, encoder);\n }\n obj_keys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];\n }\n else if (is_array(filter)) {\n obj_keys = filter;\n }\n else {\n const keys = Object.keys(obj);\n obj_keys = sort ? keys.sort(sort) : keys;\n }\n const encoded_prefix = encodeDotInKeys ? String(prefix).replace(/\\./g, '%2E') : String(prefix);\n const adjusted_prefix = commaRoundTrip && is_array(obj) && obj.length === 1 ? encoded_prefix + '[]' : encoded_prefix;\n if (allowEmptyArrays && is_array(obj) && obj.length === 0) {\n return adjusted_prefix + '[]';\n }\n for (let j = 0; j < obj_keys.length; ++j) {\n const key = obj_keys[j];\n const value = \n // @ts-ignore\n typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];\n if (skipNulls && value === null) {\n continue;\n }\n // @ts-ignore\n const encoded_key = allowDots && encodeDotInKeys ? key.replace(/\\./g, '%2E') : key;\n const key_prefix = is_array(obj) ?\n typeof generateArrayPrefix === 'function' ?\n generateArrayPrefix(adjusted_prefix, encoded_key)\n : adjusted_prefix\n : adjusted_prefix + (allowDots ? '.' + encoded_key : '[' + encoded_key + ']');\n sideChannel.set(object, step);\n const valueSideChannel = new WeakMap();\n valueSideChannel.set(sentinel, sideChannel);\n push_to_array(values, inner_stringify(value, key_prefix, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, \n // @ts-ignore\n generateArrayPrefix === 'comma' && encodeValuesOnly && is_array(obj) ? null : encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, valueSideChannel));\n }\n return values;\n}\nfunction normalize_stringify_options(opts = defaults) {\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {\n throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n const charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n let format = default_format;\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n const formatter = formatters[format];\n let filter = defaults.filter;\n if (typeof opts.filter === 'function' || is_array(opts.filter)) {\n filter = opts.filter;\n }\n let arrayFormat;\n if (opts.arrayFormat && opts.arrayFormat in array_prefix_generators) {\n arrayFormat = opts.arrayFormat;\n }\n else if ('indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n }\n else {\n arrayFormat = defaults.arrayFormat;\n }\n if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {\n throw new TypeError('`commaRoundTrip` must be a boolean, or absent');\n }\n const allowDots = typeof opts.allowDots === 'undefined' ?\n !!opts.encodeDotInKeys === true ?\n true\n : defaults.allowDots\n : !!opts.allowDots;\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n // @ts-ignore\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n arrayFormat: arrayFormat,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n commaRoundTrip: !!opts.commaRoundTrip,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n format: format,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n // @ts-ignore\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,\n };\n}\nexport function stringify(object, opts = {}) {\n let obj = object;\n const options = normalize_stringify_options(opts);\n let obj_keys;\n let filter;\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n }\n else if (is_array(options.filter)) {\n filter = options.filter;\n obj_keys = filter;\n }\n const keys = [];\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n const generateArrayPrefix = array_prefix_generators[options.arrayFormat];\n const commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;\n if (!obj_keys) {\n obj_keys = Object.keys(obj);\n }\n if (options.sort) {\n obj_keys.sort(options.sort);\n }\n const sideChannel = new WeakMap();\n for (let i = 0; i < obj_keys.length; ++i) {\n const key = obj_keys[i];\n if (options.skipNulls && obj[key] === null) {\n continue;\n }\n push_to_array(keys, inner_stringify(obj[key], key, \n // @ts-expect-error\n generateArrayPrefix, commaRoundTrip, options.allowEmptyArrays, options.strictNullHandling, options.skipNulls, options.encodeDotInKeys, options.encode ? options.encoder : null, options.filter, options.sort, options.allowDots, options.serializeDate, options.format, options.formatter, options.encodeValuesOnly, options.charset, sideChannel));\n }\n const joined = keys.join(options.delimiter);\n let prefix = options.addQueryPrefix === true ? '?' : '';\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B&';\n }\n else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93&';\n }\n }\n return joined.length > 0 ? prefix + joined : '';\n}\n//# sourceMappingURL=stringify.mjs.map","export const VERSION = '4.104.0'; // x-release-please-version\n//# sourceMappingURL=version.mjs.map","export let auto = false;\nexport let kind = undefined;\nexport let fetch = undefined;\nexport let Request = undefined;\nexport let Response = undefined;\nexport let Headers = undefined;\nexport let FormData = undefined;\nexport let Blob = undefined;\nexport let File = undefined;\nexport let ReadableStream = undefined;\nexport let getMultipartRequestOptions = undefined;\nexport let getDefaultAgent = undefined;\nexport let fileFromPath = undefined;\nexport let isFsReadStream = undefined;\nexport function setShims(shims, options = { auto: false }) {\n if (auto) {\n throw new Error(`you must \\`import 'openai/shims/${shims.kind}'\\` before importing anything else from openai`);\n }\n if (kind) {\n throw new Error(`can't \\`import 'openai/shims/${shims.kind}'\\` after \\`import 'openai/shims/${kind}'\\``);\n }\n auto = options.auto;\n kind = shims.kind;\n fetch = shims.fetch;\n Request = shims.Request;\n Response = shims.Response;\n Headers = shims.Headers;\n FormData = shims.FormData;\n Blob = shims.Blob;\n File = shims.File;\n ReadableStream = shims.ReadableStream;\n getMultipartRequestOptions = shims.getMultipartRequestOptions;\n getDefaultAgent = shims.getDefaultAgent;\n fileFromPath = shims.fileFromPath;\n isFsReadStream = shims.isFsReadStream;\n}\n//# sourceMappingURL=registry.mjs.map","/**\n * Disclaimer: modules in _shims aren't intended to be imported by SDK users.\n */\nexport class MultipartBody {\n constructor(body) {\n this.body = body;\n }\n get [Symbol.toStringTag]() {\n return 'MultipartBody';\n }\n}\n//# sourceMappingURL=MultipartBody.mjs.map","import { MultipartBody } from \"./MultipartBody.mjs\";\nexport function getRuntime({ manuallyImported } = {}) {\n const recommendation = manuallyImported ?\n `You may need to use polyfills`\n : `Add one of these imports before your first \\`import … from 'openai'\\`:\n- \\`import 'openai/shims/node'\\` (if you're running on Node)\n- \\`import 'openai/shims/web'\\` (otherwise)\n`;\n let _fetch, _Request, _Response, _Headers;\n try {\n // @ts-ignore\n _fetch = fetch;\n // @ts-ignore\n _Request = Request;\n // @ts-ignore\n _Response = Response;\n // @ts-ignore\n _Headers = Headers;\n }\n catch (error) {\n throw new Error(`this environment is missing the following Web Fetch API type: ${error.message}. ${recommendation}`);\n }\n return {\n kind: 'web',\n fetch: _fetch,\n Request: _Request,\n Response: _Response,\n Headers: _Headers,\n FormData: \n // @ts-ignore\n typeof FormData !== 'undefined' ? FormData : (class FormData {\n // @ts-ignore\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'FormData' is undefined. ${recommendation}`);\n }\n }),\n Blob: typeof Blob !== 'undefined' ? Blob : (class Blob {\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'Blob' is undefined. ${recommendation}`);\n }\n }),\n File: \n // @ts-ignore\n typeof File !== 'undefined' ? File : (class File {\n // @ts-ignore\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'File' is undefined. ${recommendation}`);\n }\n }),\n ReadableStream: \n // @ts-ignore\n typeof ReadableStream !== 'undefined' ? ReadableStream : (class ReadableStream {\n // @ts-ignore\n constructor() {\n throw new Error(`streaming isn't supported in this environment yet as 'ReadableStream' is undefined. ${recommendation}`);\n }\n }),\n getMultipartRequestOptions: async (\n // @ts-ignore\n form, opts) => ({\n ...opts,\n body: new MultipartBody(form),\n }),\n getDefaultAgent: (url) => undefined,\n fileFromPath: () => {\n throw new Error('The `fileFromPath` function is only supported in Node. See the README for more details: https://www.github.com/openai/openai-node#file-uploads');\n },\n isFsReadStream: (value) => false,\n };\n}\n//# sourceMappingURL=web-runtime.mjs.map","/**\n * Disclaimer: modules in _shims aren't intended to be imported by SDK users.\n */\nimport * as shims from './registry.mjs';\nimport * as auto from 'openai/_shims/auto/runtime';\nexport const init = () => {\n if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true });\n};\nexport * from './registry.mjs';\n\ninit();\n","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { castToError } from \"./core.mjs\";\nexport class OpenAIError extends Error {\n}\nexport class APIError extends OpenAIError {\n constructor(status, error, message, headers) {\n super(`${APIError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n this.request_id = headers?.['x-request-id'];\n this.error = error;\n const data = error;\n this.code = data?.['code'];\n this.param = data?.['param'];\n this.type = data?.['type'];\n }\n static makeMessage(status, error, message) {\n const msg = error?.message ?\n typeof error.message === 'string' ?\n error.message\n : JSON.stringify(error.message)\n : error ? JSON.stringify(error)\n : message;\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return '(no status code or body)';\n }\n static generate(status, errorResponse, message, headers) {\n if (!status || !headers) {\n return new APIConnectionError({ message, cause: castToError(errorResponse) });\n }\n const error = errorResponse?.['error'];\n if (status === 400) {\n return new BadRequestError(status, error, message, headers);\n }\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers);\n }\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers);\n }\n if (status === 404) {\n return new NotFoundError(status, error, message, headers);\n }\n if (status === 409) {\n return new ConflictError(status, error, message, headers);\n }\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers);\n }\n if (status === 429) {\n return new RateLimitError(status, error, message, headers);\n }\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers);\n }\n return new APIError(status, error, message, headers);\n }\n}\nexport class APIUserAbortError extends APIError {\n constructor({ message } = {}) {\n super(undefined, undefined, message || 'Request was aborted.', undefined);\n }\n}\nexport class APIConnectionError extends APIError {\n constructor({ message, cause }) {\n super(undefined, undefined, message || 'Connection error.', undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause)\n this.cause = cause;\n }\n}\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor({ message } = {}) {\n super({ message: message ?? 'Request timed out.' });\n }\n}\nexport class BadRequestError extends APIError {\n}\nexport class AuthenticationError extends APIError {\n}\nexport class PermissionDeniedError extends APIError {\n}\nexport class NotFoundError extends APIError {\n}\nexport class ConflictError extends APIError {\n}\nexport class UnprocessableEntityError extends APIError {\n}\nexport class RateLimitError extends APIError {\n}\nexport class InternalServerError extends APIError {\n}\nexport class LengthFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the length limit was reached`);\n }\n}\nexport class ContentFilterFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the request was rejected by the content filter`);\n }\n}\n//# sourceMappingURL=error.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _LineDecoder_carriageReturnIndex;\nimport { OpenAIError } from \"../../error.mjs\";\n/**\n * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally\n * reading lines from text.\n *\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n constructor() {\n _LineDecoder_carriageReturnIndex.set(this, void 0);\n this.buffer = new Uint8Array();\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n }\n decode(chunk) {\n if (chunk == null) {\n return [];\n }\n const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? new TextEncoder().encode(chunk)\n : chunk;\n let newData = new Uint8Array(this.buffer.length + binaryChunk.length);\n newData.set(this.buffer);\n newData.set(binaryChunk, this.buffer.length);\n this.buffer = newData;\n const lines = [];\n let patternIndex;\n while ((patternIndex = findNewlineIndex(this.buffer, __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\"))) != null) {\n if (patternIndex.carriage && __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") == null) {\n // skip until we either get a corresponding `\\n`, a new `\\r` or nothing\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, patternIndex.index, \"f\");\n continue;\n }\n // we got double \\r or \\rtext\\n\n if (__classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") != null &&\n (patternIndex.index !== __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") + 1 || patternIndex.carriage)) {\n lines.push(this.decodeText(this.buffer.slice(0, __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") - 1)));\n this.buffer = this.buffer.slice(__classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\"));\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n continue;\n }\n const endIndex = __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") !== null ? patternIndex.preceding - 1 : patternIndex.preceding;\n const line = this.decodeText(this.buffer.slice(0, endIndex));\n lines.push(line);\n this.buffer = this.buffer.slice(patternIndex.index);\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n }\n return lines;\n }\n decodeText(bytes) {\n if (bytes == null)\n return '';\n if (typeof bytes === 'string')\n return bytes;\n // Node:\n if (typeof Buffer !== 'undefined') {\n if (bytes instanceof Buffer) {\n return bytes.toString();\n }\n if (bytes instanceof Uint8Array) {\n return Buffer.from(bytes).toString();\n }\n throw new OpenAIError(`Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global \"Buffer\" defined, which this library assumes to be Node. Please report this error.`);\n }\n // Browser\n if (typeof TextDecoder !== 'undefined') {\n if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) {\n this.textDecoder ?? (this.textDecoder = new TextDecoder('utf8'));\n return this.textDecoder.decode(bytes);\n }\n throw new OpenAIError(`Unexpected: received non-Uint8Array/ArrayBuffer (${bytes.constructor.name}) in a web platform. Please report this error.`);\n }\n throw new OpenAIError(`Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.`);\n }\n flush() {\n if (!this.buffer.length) {\n return [];\n }\n return this.decode('\\n');\n }\n}\n_LineDecoder_carriageReturnIndex = new WeakMap();\n// prettier-ignore\nLineDecoder.NEWLINE_CHARS = new Set(['\\n', '\\r']);\nLineDecoder.NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n/**\n * This function searches the buffer for the end patterns, (\\r or \\n)\n * and returns an object with the index preceding the matched newline and the\n * index after the newline char. `null` is returned if no new line is found.\n *\n * ```ts\n * findNewLineIndex('abc\\ndef') -> { preceding: 2, index: 3 }\n * ```\n */\nfunction findNewlineIndex(buffer, startIndex) {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n for (let i = startIndex ?? 0; i < buffer.length; i++) {\n if (buffer[i] === newline) {\n return { preceding: i, index: i + 1, carriage: false };\n }\n if (buffer[i] === carriage) {\n return { preceding: i, index: i + 1, carriage: true };\n }\n }\n return null;\n}\nexport function findDoubleNewlineIndex(buffer) {\n // This function searches the buffer for the end patterns (\\r\\r, \\n\\n, \\r\\n\\r\\n)\n // and returns the index right after the first occurrence of any pattern,\n // or -1 if none of the patterns are found.\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n for (let i = 0; i < buffer.length - 1; i++) {\n if (buffer[i] === newline && buffer[i + 1] === newline) {\n // \\n\\n\n return i + 2;\n }\n if (buffer[i] === carriage && buffer[i + 1] === carriage) {\n // \\r\\r\n return i + 2;\n }\n if (buffer[i] === carriage &&\n buffer[i + 1] === newline &&\n i + 3 < buffer.length &&\n buffer[i + 2] === carriage &&\n buffer[i + 3] === newline) {\n // \\r\\n\\r\\n\n return i + 4;\n }\n }\n return -1;\n}\n//# sourceMappingURL=line.mjs.map","/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function ReadableStreamToAsyncIterable(stream) {\n if (stream[Symbol.asyncIterator])\n return stream;\n const reader = stream.getReader();\n return {\n async next() {\n try {\n const result = await reader.read();\n if (result?.done)\n reader.releaseLock(); // release lock when stream becomes closed\n return result;\n }\n catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n async return() {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n//# sourceMappingURL=stream-utils.mjs.map","import { ReadableStream } from \"./_shims/index.mjs\";\nimport { OpenAIError } from \"./error.mjs\";\nimport { findDoubleNewlineIndex, LineDecoder } from \"./internal/decoders/line.mjs\";\nimport { ReadableStreamToAsyncIterable } from \"./internal/stream-utils.mjs\";\nimport { createResponseHeaders } from \"./core.mjs\";\nimport { APIError } from \"./error.mjs\";\nexport class Stream {\n constructor(iterator, controller) {\n this.iterator = iterator;\n this.controller = controller;\n }\n static fromSSEResponse(response, controller) {\n let consumed = false;\n async function* iterator() {\n if (consumed) {\n throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const sse of _iterSSEMessages(response, controller)) {\n if (done)\n continue;\n if (sse.data.startsWith('[DONE]')) {\n done = true;\n continue;\n }\n if (sse.event === null ||\n sse.event.startsWith('response.') ||\n sse.event.startsWith('transcript.')) {\n let data;\n try {\n data = JSON.parse(sse.data);\n }\n catch (e) {\n console.error(`Could not parse message into JSON:`, sse.data);\n console.error(`From chunk:`, sse.raw);\n throw e;\n }\n if (data && data.error) {\n throw new APIError(undefined, data.error, undefined, createResponseHeaders(response.headers));\n }\n yield data;\n }\n else {\n let data;\n try {\n data = JSON.parse(sse.data);\n }\n catch (e) {\n console.error(`Could not parse message into JSON:`, sse.data);\n console.error(`From chunk:`, sse.raw);\n throw e;\n }\n // TODO: Is this where the error should be thrown?\n if (sse.event == 'error') {\n throw new APIError(undefined, data.error, data.message, undefined);\n }\n yield { event: sse.event, data: data };\n }\n }\n done = true;\n }\n catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (e instanceof Error && e.name === 'AbortError')\n return;\n throw e;\n }\n finally {\n // If the user `break`s, abort the ongoing request.\n if (!done)\n controller.abort();\n }\n }\n return new Stream(iterator, controller);\n }\n /**\n * Generates a Stream from a newline-separated ReadableStream\n * where each item is a JSON value.\n */\n static fromReadableStream(readableStream, controller) {\n let consumed = false;\n async function* iterLines() {\n const lineDecoder = new LineDecoder();\n const iter = ReadableStreamToAsyncIterable(readableStream);\n for await (const chunk of iter) {\n for (const line of lineDecoder.decode(chunk)) {\n yield line;\n }\n }\n for (const line of lineDecoder.flush()) {\n yield line;\n }\n }\n async function* iterator() {\n if (consumed) {\n throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const line of iterLines()) {\n if (done)\n continue;\n if (line)\n yield JSON.parse(line);\n }\n done = true;\n }\n catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (e instanceof Error && e.name === 'AbortError')\n return;\n throw e;\n }\n finally {\n // If the user `break`s, abort the ongoing request.\n if (!done)\n controller.abort();\n }\n }\n return new Stream(iterator, controller);\n }\n [Symbol.asyncIterator]() {\n return this.iterator();\n }\n /**\n * Splits the stream into two streams which can be\n * independently read from at different speeds.\n */\n tee() {\n const left = [];\n const right = [];\n const iterator = this.iterator();\n const teeIterator = (queue) => {\n return {\n next: () => {\n if (queue.length === 0) {\n const result = iterator.next();\n left.push(result);\n right.push(result);\n }\n return queue.shift();\n },\n };\n };\n return [\n new Stream(() => teeIterator(left), this.controller),\n new Stream(() => teeIterator(right), this.controller),\n ];\n }\n /**\n * Converts this stream to a newline-separated ReadableStream of\n * JSON stringified values in the stream\n * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n */\n toReadableStream() {\n const self = this;\n let iter;\n const encoder = new TextEncoder();\n return new ReadableStream({\n async start() {\n iter = self[Symbol.asyncIterator]();\n },\n async pull(ctrl) {\n try {\n const { value, done } = await iter.next();\n if (done)\n return ctrl.close();\n const bytes = encoder.encode(JSON.stringify(value) + '\\n');\n ctrl.enqueue(bytes);\n }\n catch (err) {\n ctrl.error(err);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n }\n}\nexport async function* _iterSSEMessages(response, controller) {\n if (!response.body) {\n controller.abort();\n throw new OpenAIError(`Attempted to iterate over a response with no body`);\n }\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n const iter = ReadableStreamToAsyncIterable(response.body);\n for await (const sseChunk of iterSSEChunks(iter)) {\n for (const line of lineDecoder.decode(sseChunk)) {\n const sse = sseDecoder.decode(line);\n if (sse)\n yield sse;\n }\n }\n for (const line of lineDecoder.flush()) {\n const sse = sseDecoder.decode(line);\n if (sse)\n yield sse;\n }\n}\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n */\nasync function* iterSSEChunks(iterator) {\n let data = new Uint8Array();\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? new TextEncoder().encode(chunk)\n : chunk;\n let newData = new Uint8Array(data.length + binaryChunk.length);\n newData.set(data);\n newData.set(binaryChunk, data.length);\n data = newData;\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) {\n yield data.slice(0, patternIndex);\n data = data.slice(patternIndex);\n }\n }\n if (data.length > 0) {\n yield data;\n }\n}\nclass SSEDecoder {\n constructor() {\n this.event = null;\n this.data = [];\n this.chunks = [];\n }\n decode(line) {\n if (line.endsWith('\\r')) {\n line = line.substring(0, line.length - 1);\n }\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length)\n return null;\n const sse = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n this.event = null;\n this.data = [];\n this.chunks = [];\n return sse;\n }\n this.chunks.push(line);\n if (line.startsWith(':')) {\n return null;\n }\n let [fieldname, _, value] = partition(line, ':');\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n if (fieldname === 'event') {\n this.event = value;\n }\n else if (fieldname === 'data') {\n this.data.push(value);\n }\n return null;\n }\n}\nfunction partition(str, delimiter) {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];\n }\n return [str, '', ''];\n}\n//# sourceMappingURL=streaming.mjs.map","import { FormData, File, getMultipartRequestOptions, isFsReadStream, } from \"./_shims/index.mjs\";\nexport { fileFromPath } from \"./_shims/index.mjs\";\nexport const isResponseLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.url === 'string' &&\n typeof value.blob === 'function';\nexport const isFileLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.name === 'string' &&\n typeof value.lastModified === 'number' &&\n isBlobLike(value);\n/**\n * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check\n * adds the arrayBuffer() method type because it is available and used at runtime\n */\nexport const isBlobLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.size === 'number' &&\n typeof value.type === 'string' &&\n typeof value.text === 'function' &&\n typeof value.slice === 'function' &&\n typeof value.arrayBuffer === 'function';\nexport const isUploadable = (value) => {\n return isFileLike(value) || isResponseLike(value) || isFsReadStream(value);\n};\n/**\n * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats\n * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s\n * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible\n * @param {Object=} options additional properties\n * @param {string=} options.type the MIME type of the content\n * @param {number=} options.lastModified the last modified timestamp\n * @returns a {@link File} with the given properties\n */\nexport async function toFile(value, name, options) {\n // If it's a promise, resolve it.\n value = await value;\n // If we've been given a `File` we don't need to do anything\n if (isFileLike(value)) {\n return value;\n }\n if (isResponseLike(value)) {\n const blob = await value.blob();\n name || (name = new URL(value.url).pathname.split(/[\\\\/]/).pop() ?? 'unknown_file');\n // we need to convert the `Blob` into an array buffer because the `Blob` class\n // that `node-fetch` defines is incompatible with the web standard which results\n // in `new File` interpreting it as a string instead of binary data.\n const data = isBlobLike(blob) ? [(await blob.arrayBuffer())] : [blob];\n return new File(data, name, options);\n }\n const bits = await getBytes(value);\n name || (name = getName(value) ?? 'unknown_file');\n if (!options?.type) {\n const type = bits[0]?.type;\n if (typeof type === 'string') {\n options = { ...options, type };\n }\n }\n return new File(bits, name, options);\n}\nasync function getBytes(value) {\n let parts = [];\n if (typeof value === 'string' ||\n ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.\n value instanceof ArrayBuffer) {\n parts.push(value);\n }\n else if (isBlobLike(value)) {\n parts.push(await value.arrayBuffer());\n }\n else if (isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc.\n ) {\n for await (const chunk of value) {\n parts.push(chunk); // TODO, consider validating?\n }\n }\n else {\n throw new Error(`Unexpected data type: ${typeof value}; constructor: ${value?.constructor\n ?.name}; props: ${propsForError(value)}`);\n }\n return parts;\n}\nfunction propsForError(value) {\n const props = Object.getOwnPropertyNames(value);\n return `[${props.map((p) => `\"${p}\"`).join(', ')}]`;\n}\nfunction getName(value) {\n return (getStringFromMaybeBuffer(value.name) ||\n getStringFromMaybeBuffer(value.filename) ||\n // For fs.ReadStream\n getStringFromMaybeBuffer(value.path)?.split(/[\\\\/]/).pop());\n}\nconst getStringFromMaybeBuffer = (x) => {\n if (typeof x === 'string')\n return x;\n if (typeof Buffer !== 'undefined' && x instanceof Buffer)\n return String(x);\n return undefined;\n};\nconst isAsyncIterableIterator = (value) => value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function';\nexport const isMultipartBody = (body) => body && typeof body === 'object' && body.body && body[Symbol.toStringTag] === 'MultipartBody';\n/**\n * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value.\n * Otherwise returns the request as is.\n */\nexport const maybeMultipartFormRequestOptions = async (opts) => {\n if (!hasUploadableValue(opts.body))\n return opts;\n const form = await createForm(opts.body);\n return getMultipartRequestOptions(form, opts);\n};\nexport const multipartFormRequestOptions = async (opts) => {\n const form = await createForm(opts.body);\n return getMultipartRequestOptions(form, opts);\n};\nexport const createForm = async (body) => {\n const form = new FormData();\n await Promise.all(Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value)));\n return form;\n};\nconst hasUploadableValue = (value) => {\n if (isUploadable(value))\n return true;\n if (Array.isArray(value))\n return value.some(hasUploadableValue);\n if (value && typeof value === 'object') {\n for (const k in value) {\n if (hasUploadableValue(value[k]))\n return true;\n }\n }\n return false;\n};\nconst addFormValue = async (form, key, value) => {\n if (value === undefined)\n return;\n if (value == null) {\n throw new TypeError(`Received null for \"${key}\"; to pass null in FormData, you must use the string 'null'`);\n }\n // TODO: make nested formats configurable\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n form.append(key, String(value));\n }\n else if (isUploadable(value)) {\n const file = await toFile(value);\n form.append(key, file);\n }\n else if (Array.isArray(value)) {\n await Promise.all(value.map((entry) => addFormValue(form, key + '[]', entry)));\n }\n else if (typeof value === 'object') {\n await Promise.all(Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop)));\n }\n else {\n throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`);\n }\n};\n//# sourceMappingURL=uploads.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _AbstractPage_client;\nimport { VERSION } from \"./version.mjs\";\nimport { Stream } from \"./streaming.mjs\";\nimport { OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, } from \"./error.mjs\";\nimport { kind as shimsKind, getDefaultAgent, fetch, init, } from \"./_shims/index.mjs\";\n// try running side effects outside of _shims/index to workaround https://github.com/vercel/next.js/issues/76881\ninit();\nimport { isBlobLike, isMultipartBody } from \"./uploads.mjs\";\nexport { maybeMultipartFormRequestOptions, multipartFormRequestOptions, createForm, } from \"./uploads.mjs\";\nasync function defaultParseResponse(props) {\n const { response } = props;\n if (props.options.stream) {\n debug('response', response.status, response.url, response.headers, response.body);\n // Note: there is an invariant here that isn't represented in the type system\n // that if you set `stream: true` the response type must also be `Stream<T>`\n if (props.options.__streamClass) {\n return props.options.__streamClass.fromSSEResponse(response, props.controller);\n }\n return Stream.fromSSEResponse(response, props.controller);\n }\n // fetch refuses to read the body when the status code is 204.\n if (response.status === 204) {\n return null;\n }\n if (props.options.__binaryResponse) {\n return response;\n }\n const contentType = response.headers.get('content-type');\n const mediaType = contentType?.split(';')[0]?.trim();\n const isJSON = mediaType?.includes('application/json') || mediaType?.endsWith('+json');\n if (isJSON) {\n const json = await response.json();\n debug('response', response.status, response.url, response.headers, json);\n return _addRequestID(json, response);\n }\n const text = await response.text();\n debug('response', response.status, response.url, response.headers, text);\n // TODO handle blob, arraybuffer, other content types, etc.\n return text;\n}\nfunction _addRequestID(value, response) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n return Object.defineProperty(value, '_request_id', {\n value: response.headers.get('x-request-id'),\n enumerable: false,\n });\n}\n/**\n * A subclass of `Promise` providing additional helper methods\n * for interacting with the SDK.\n */\nexport class APIPromise extends Promise {\n constructor(responsePromise, parseResponse = defaultParseResponse) {\n super((resolve) => {\n // this is maybe a bit weird but this has to be a no-op to not implicitly\n // parse the response body; instead .then, .catch, .finally are overridden\n // to parse the response\n resolve(null);\n });\n this.responsePromise = responsePromise;\n this.parseResponse = parseResponse;\n }\n _thenUnwrap(transform) {\n return new APIPromise(this.responsePromise, async (props) => _addRequestID(transform(await this.parseResponse(props), props), props.response));\n }\n /**\n * Gets the raw `Response` instance instead of parsing the response\n * data.\n *\n * If you want to parse the response body but still get the `Response`\n * instance, you can use {@link withResponse()}.\n *\n * 👋 Getting the wrong TypeScript type for `Response`?\n * Try setting `\"moduleResolution\": \"NodeNext\"` if you can,\n * or add one of these imports before your first `import … from 'openai'`:\n * - `import 'openai/shims/node'` (if you're running on Node)\n * - `import 'openai/shims/web'` (otherwise)\n */\n asResponse() {\n return this.responsePromise.then((p) => p.response);\n }\n /**\n * Gets the parsed response data, the raw `Response` instance and the ID of the request,\n * returned via the X-Request-ID header which is useful for debugging requests and reporting\n * issues to OpenAI.\n *\n * If you just want to get the raw `Response` instance without parsing it,\n * you can use {@link asResponse()}.\n *\n *\n * 👋 Getting the wrong TypeScript type for `Response`?\n * Try setting `\"moduleResolution\": \"NodeNext\"` if you can,\n * or add one of these imports before your first `import … from 'openai'`:\n * - `import 'openai/shims/node'` (if you're running on Node)\n * - `import 'openai/shims/web'` (otherwise)\n */\n async withResponse() {\n const [data, response] = await Promise.all([this.parse(), this.asResponse()]);\n return { data, response, request_id: response.headers.get('x-request-id') };\n }\n parse() {\n if (!this.parsedPromise) {\n this.parsedPromise = this.responsePromise.then(this.parseResponse);\n }\n return this.parsedPromise;\n }\n then(onfulfilled, onrejected) {\n return this.parse().then(onfulfilled, onrejected);\n }\n catch(onrejected) {\n return this.parse().catch(onrejected);\n }\n finally(onfinally) {\n return this.parse().finally(onfinally);\n }\n}\nexport class APIClient {\n constructor({ baseURL, maxRetries = 2, timeout = 600000, // 10 minutes\n httpAgent, fetch: overriddenFetch, }) {\n this.baseURL = baseURL;\n this.maxRetries = validatePositiveInteger('maxRetries', maxRetries);\n this.timeout = validatePositiveInteger('timeout', timeout);\n this.httpAgent = httpAgent;\n this.fetch = overriddenFetch ?? fetch;\n }\n authHeaders(opts) {\n return {};\n }\n /**\n * Override this to add your own default headers, for example:\n *\n * {\n * ...super.defaultHeaders(),\n * Authorization: 'Bearer 123',\n * }\n */\n defaultHeaders(opts) {\n return {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'User-Agent': this.getUserAgent(),\n ...getPlatformHeaders(),\n ...this.authHeaders(opts),\n };\n }\n /**\n * Override this to add your own headers validation:\n */\n validateHeaders(headers, customHeaders) { }\n defaultIdempotencyKey() {\n return `stainless-node-retry-${uuid4()}`;\n }\n get(path, opts) {\n return this.methodRequest('get', path, opts);\n }\n post(path, opts) {\n return this.methodRequest('post', path, opts);\n }\n patch(path, opts) {\n return this.methodRequest('patch', path, opts);\n }\n put(path, opts) {\n return this.methodRequest('put', path, opts);\n }\n delete(path, opts) {\n return this.methodRequest('delete', path, opts);\n }\n methodRequest(method, path, opts) {\n return this.request(Promise.resolve(opts).then(async (opts) => {\n const body = opts && isBlobLike(opts?.body) ? new DataView(await opts.body.arrayBuffer())\n : opts?.body instanceof DataView ? opts.body\n : opts?.body instanceof ArrayBuffer ? new DataView(opts.body)\n : opts && ArrayBuffer.isView(opts?.body) ? new DataView(opts.body.buffer)\n : opts?.body;\n return { method, path, ...opts, body };\n }));\n }\n getAPIList(path, Page, opts) {\n return this.requestAPIList(Page, { method: 'get', path, ...opts });\n }\n calculateContentLength(body) {\n if (typeof body === 'string') {\n if (typeof Buffer !== 'undefined') {\n return Buffer.byteLength(body, 'utf8').toString();\n }\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder();\n const encoded = encoder.encode(body);\n return encoded.length.toString();\n }\n }\n else if (ArrayBuffer.isView(body)) {\n return body.byteLength.toString();\n }\n return null;\n }\n buildRequest(inputOptions, { retryCount = 0 } = {}) {\n const options = { ...inputOptions };\n const { method, path, query, headers: headers = {} } = options;\n const body = ArrayBuffer.isView(options.body) || (options.__binaryRequest && typeof options.body === 'string') ?\n options.body\n : isMultipartBody(options.body) ? options.body.body\n : options.body ? JSON.stringify(options.body, null, 2)\n : null;\n const contentLength = this.calculateContentLength(body);\n const url = this.buildURL(path, query);\n if ('timeout' in options)\n validatePositiveInteger('timeout', options.timeout);\n options.timeout = options.timeout ?? this.timeout;\n const httpAgent = options.httpAgent ?? this.httpAgent ?? getDefaultAgent(url);\n const minAgentTimeout = options.timeout + 1000;\n if (typeof httpAgent?.options?.timeout === 'number' &&\n minAgentTimeout > (httpAgent.options.timeout ?? 0)) {\n // Allow any given request to bump our agent active socket timeout.\n // This may seem strange, but leaking active sockets should be rare and not particularly problematic,\n // and without mutating agent we would need to create more of them.\n // This tradeoff optimizes for performance.\n httpAgent.options.timeout = minAgentTimeout;\n }\n if (this.idempotencyHeader && method !== 'get') {\n if (!inputOptions.idempotencyKey)\n inputOptions.idempotencyKey = this.defaultIdempotencyKey();\n headers[this.idempotencyHeader] = inputOptions.idempotencyKey;\n }\n const reqHeaders = this.buildHeaders({ options, headers, contentLength, retryCount });\n const req = {\n method,\n ...(body && { body: body }),\n headers: reqHeaders,\n ...(httpAgent && { agent: httpAgent }),\n // @ts-ignore node-fetch uses a custom AbortSignal type that is\n // not compatible with standard web types\n signal: options.signal ?? null,\n };\n return { req, url, timeout: options.timeout };\n }\n buildHeaders({ options, headers, contentLength, retryCount, }) {\n const reqHeaders = {};\n if (contentLength) {\n reqHeaders['content-length'] = contentLength;\n }\n const defaultHeaders = this.defaultHeaders(options);\n applyHeadersMut(reqHeaders, defaultHeaders);\n applyHeadersMut(reqHeaders, headers);\n // let builtin fetch set the Content-Type for multipart bodies\n if (isMultipartBody(options.body) && shimsKind !== 'node') {\n delete reqHeaders['content-type'];\n }\n // Don't set theses headers if they were already set or removed through default headers or by the caller.\n // We check `defaultHeaders` and `headers`, which can contain nulls, instead of `reqHeaders` to account\n // for the removal case.\n if (getHeader(defaultHeaders, 'x-stainless-retry-count') === undefined &&\n getHeader(headers, 'x-stainless-retry-count') === undefined) {\n reqHeaders['x-stainless-retry-count'] = String(retryCount);\n }\n if (getHeader(defaultHeaders, 'x-stainless-timeout') === undefined &&\n getHeader(headers, 'x-stainless-timeout') === undefined &&\n options.timeout) {\n reqHeaders['x-stainless-timeout'] = String(Math.trunc(options.timeout / 1000));\n }\n this.validateHeaders(reqHeaders, headers);\n return reqHeaders;\n }\n /**\n * Used as a callback for mutating the given `FinalRequestOptions` object.\n */\n async prepareOptions(options) { }\n /**\n * Used as a callback for mutating the given `RequestInit` object.\n *\n * This is useful for cases where you want to add certain headers based off of\n * the request properties, e.g. `method` or `url`.\n */\n async prepareRequest(request, { url, options }) { }\n parseHeaders(headers) {\n return (!headers ? {}\n : Symbol.iterator in headers ?\n Object.fromEntries(Array.from(headers).map((header) => [...header]))\n : { ...headers });\n }\n makeStatusError(status, error, message, headers) {\n return APIError.generate(status, error, message, headers);\n }\n request(options, remainingRetries = null) {\n return new APIPromise(this.makeRequest(options, remainingRetries));\n }\n async makeRequest(optionsInput, retriesRemaining) {\n const options = await optionsInput;\n const maxRetries = options.maxRetries ?? this.maxRetries;\n if (retriesRemaining == null) {\n retriesRemaining = maxRetries;\n }\n await this.prepareOptions(options);\n const { req, url, timeout } = this.buildRequest(options, { retryCount: maxRetries - retriesRemaining });\n await this.prepareRequest(req, { url, options });\n debug('request', url, options, req.headers);\n if (options.signal?.aborted) {\n throw new APIUserAbortError();\n }\n const controller = new AbortController();\n const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(castToError);\n if (response instanceof Error) {\n if (options.signal?.aborted) {\n throw new APIUserAbortError();\n }\n if (retriesRemaining) {\n return this.retryRequest(options, retriesRemaining);\n }\n if (response.name === 'AbortError') {\n throw new APIConnectionTimeoutError();\n }\n throw new APIConnectionError({ cause: response });\n }\n const responseHeaders = createResponseHeaders(response.headers);\n if (!response.ok) {\n if (retriesRemaining && this.shouldRetry(response)) {\n const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;\n debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders);\n return this.retryRequest(options, retriesRemaining, responseHeaders);\n }\n const errText = await response.text().catch((e) => castToError(e).message);\n const errJSON = safeJSON(errText);\n const errMessage = errJSON ? undefined : errText;\n const retryMessage = retriesRemaining ? `(error; no more retries left)` : `(error; not retryable)`;\n debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders, errMessage);\n const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders);\n throw err;\n }\n return { response, options, controller };\n }\n requestAPIList(Page, options) {\n const request = this.makeRequest(options, null);\n return new PagePromise(this, request, Page);\n }\n buildURL(path, query) {\n const url = isAbsoluteURL(path) ?\n new URL(path)\n : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path));\n const defaultQuery = this.defaultQuery();\n if (!isEmptyObj(defaultQuery)) {\n query = { ...defaultQuery, ...query };\n }\n if (typeof query === 'object' && query && !Array.isArray(query)) {\n url.search = this.stringifyQuery(query);\n }\n return url.toString();\n }\n stringifyQuery(query) {\n return Object.entries(query)\n .filter(([_, value]) => typeof value !== 'undefined')\n .map(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n }\n if (value === null) {\n return `${encodeURIComponent(key)}=`;\n }\n throw new OpenAIError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`);\n })\n .join('&');\n }\n async fetchWithTimeout(url, init, ms, controller) {\n const { signal, ...options } = init || {};\n if (signal)\n signal.addEventListener('abort', () => controller.abort());\n const timeout = setTimeout(() => controller.abort(), ms);\n const fetchOptions = {\n signal: controller.signal,\n ...options,\n };\n if (fetchOptions.method) {\n // Custom methods like 'patch' need to be uppercased\n // See https://github.com/nodejs/undici/issues/2294\n fetchOptions.method = fetchOptions.method.toUpperCase();\n }\n return (\n // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n this.fetch.call(undefined, url, fetchOptions).finally(() => {\n clearTimeout(timeout);\n }));\n }\n shouldRetry(response) {\n // Note this is not a standard header.\n const shouldRetryHeader = response.headers.get('x-should-retry');\n // If the server explicitly says whether or not to retry, obey.\n if (shouldRetryHeader === 'true')\n return true;\n if (shouldRetryHeader === 'false')\n return false;\n // Retry on request timeouts.\n if (response.status === 408)\n return true;\n // Retry on lock timeouts.\n if (response.status === 409)\n return true;\n // Retry on rate limits.\n if (response.status === 429)\n return true;\n // Retry internal errors.\n if (response.status >= 500)\n return true;\n return false;\n }\n async retryRequest(options, retriesRemaining, responseHeaders) {\n let timeoutMillis;\n // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it.\n const retryAfterMillisHeader = responseHeaders?.['retry-after-ms'];\n if (retryAfterMillisHeader) {\n const timeoutMs = parseFloat(retryAfterMillisHeader);\n if (!Number.isNaN(timeoutMs)) {\n timeoutMillis = timeoutMs;\n }\n }\n // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After\n const retryAfterHeader = responseHeaders?.['retry-after'];\n if (retryAfterHeader && !timeoutMillis) {\n const timeoutSeconds = parseFloat(retryAfterHeader);\n if (!Number.isNaN(timeoutSeconds)) {\n timeoutMillis = timeoutSeconds * 1000;\n }\n else {\n timeoutMillis = Date.parse(retryAfterHeader) - Date.now();\n }\n }\n // If the API asks us to wait a certain amount of time (and it's a reasonable amount),\n // just do what it says, but otherwise calculate a default\n if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) {\n const maxRetries = options.maxRetries ?? this.maxRetries;\n timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries);\n }\n await sleep(timeoutMillis);\n return this.makeRequest(options, retriesRemaining - 1);\n }\n calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries) {\n const initialRetryDelay = 0.5;\n const maxRetryDelay = 8.0;\n const numRetries = maxRetries - retriesRemaining;\n // Apply exponential backoff, but not more than the max.\n const sleepSeconds = Math.min(initialRetryDelay * Math.pow(2, numRetries), maxRetryDelay);\n // Apply some jitter, take up to at most 25 percent of the retry time.\n const jitter = 1 - Math.random() * 0.25;\n return sleepSeconds * jitter * 1000;\n }\n getUserAgent() {\n return `${this.constructor.name}/JS ${VERSION}`;\n }\n}\nexport class AbstractPage {\n constructor(client, response, body, options) {\n _AbstractPage_client.set(this, void 0);\n __classPrivateFieldSet(this, _AbstractPage_client, client, \"f\");\n this.options = options;\n this.response = response;\n this.body = body;\n }\n hasNextPage() {\n const items = this.getPaginatedItems();\n if (!items.length)\n return false;\n return this.nextPageInfo() != null;\n }\n async getNextPage() {\n const nextInfo = this.nextPageInfo();\n if (!nextInfo) {\n throw new OpenAIError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.');\n }\n const nextOptions = { ...this.options };\n if ('params' in nextInfo && typeof nextOptions.query === 'object') {\n nextOptions.query = { ...nextOptions.query, ...nextInfo.params };\n }\n else if ('url' in nextInfo) {\n const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()];\n for (const [key, value] of params) {\n nextInfo.url.searchParams.set(key, value);\n }\n nextOptions.query = undefined;\n nextOptions.path = nextInfo.url.toString();\n }\n return await __classPrivateFieldGet(this, _AbstractPage_client, \"f\").requestAPIList(this.constructor, nextOptions);\n }\n async *iterPages() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n async *[(_AbstractPage_client = new WeakMap(), Symbol.asyncIterator)]() {\n for await (const page of this.iterPages()) {\n for (const item of page.getPaginatedItems()) {\n yield item;\n }\n }\n }\n}\n/**\n * This subclass of Promise will resolve to an instantiated Page once the request completes.\n *\n * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\nexport class PagePromise extends APIPromise {\n constructor(client, request, Page) {\n super(request, async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options));\n }\n /**\n * Allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\n async *[Symbol.asyncIterator]() {\n const page = await this;\n for await (const item of page) {\n yield item;\n }\n }\n}\nexport const createResponseHeaders = (headers) => {\n return new Proxy(Object.fromEntries(\n // @ts-ignore\n headers.entries()), {\n get(target, name) {\n const key = name.toString();\n return target[key.toLowerCase()] || target[key];\n },\n });\n};\n// This is required so that we can determine if a given object matches the RequestOptions\n// type at runtime. While this requires duplication, it is enforced by the TypeScript\n// compiler such that any missing / extraneous keys will cause an error.\nconst requestOptionsKeys = {\n method: true,\n path: true,\n query: true,\n body: true,\n headers: true,\n maxRetries: true,\n stream: true,\n timeout: true,\n httpAgent: true,\n signal: true,\n idempotencyKey: true,\n __metadata: true,\n __binaryRequest: true,\n __binaryResponse: true,\n __streamClass: true,\n};\nexport const isRequestOptions = (obj) => {\n return (typeof obj === 'object' &&\n obj !== null &&\n !isEmptyObj(obj) &&\n Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k)));\n};\nconst getPlatformProperties = () => {\n if (typeof Deno !== 'undefined' && Deno.build != null) {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': normalizePlatform(Deno.build.os),\n 'X-Stainless-Arch': normalizeArch(Deno.build.arch),\n 'X-Stainless-Runtime': 'deno',\n 'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown',\n };\n }\n if (typeof EdgeRuntime !== 'undefined') {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': `other:${EdgeRuntime}`,\n 'X-Stainless-Runtime': 'edge',\n 'X-Stainless-Runtime-Version': process.version,\n };\n }\n // Check if Node.js\n if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': normalizePlatform(process.platform),\n 'X-Stainless-Arch': normalizeArch(process.arch),\n 'X-Stainless-Runtime': 'node',\n 'X-Stainless-Runtime-Version': process.version,\n };\n }\n const browserInfo = getBrowserInfo();\n if (browserInfo) {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': 'unknown',\n 'X-Stainless-Runtime': `browser:${browserInfo.browser}`,\n 'X-Stainless-Runtime-Version': browserInfo.version,\n };\n }\n // TODO add support for Cloudflare workers, etc.\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': 'unknown',\n 'X-Stainless-Runtime': 'unknown',\n 'X-Stainless-Runtime-Version': 'unknown',\n };\n};\n// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts\nfunction getBrowserInfo() {\n if (typeof navigator === 'undefined' || !navigator) {\n return null;\n }\n // NOTE: The order matters here!\n const browserPatterns = [\n { key: 'edge', pattern: /Edge(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'ie', pattern: /MSIE(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'ie', pattern: /Trident(?:.*rv\\:(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'chrome', pattern: /Chrome(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'firefox', pattern: /Firefox(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'safari', pattern: /(?:Version\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?(?:\\W+Mobile\\S*)?\\W+Safari/ },\n ];\n // Find the FIRST matching browser\n for (const { key, pattern } of browserPatterns) {\n const match = pattern.exec(navigator.userAgent);\n if (match) {\n const major = match[1] || 0;\n const minor = match[2] || 0;\n const patch = match[3] || 0;\n return { browser: key, version: `${major}.${minor}.${patch}` };\n }\n }\n return null;\n}\nconst normalizeArch = (arch) => {\n // Node docs:\n // - https://nodejs.org/api/process.html#processarch\n // Deno docs:\n // - https://doc.deno.land/deno/stable/~/Deno.build\n if (arch === 'x32')\n return 'x32';\n if (arch === 'x86_64' || arch === 'x64')\n return 'x64';\n if (arch === 'arm')\n return 'arm';\n if (arch === 'aarch64' || arch === 'arm64')\n return 'arm64';\n if (arch)\n return `other:${arch}`;\n return 'unknown';\n};\nconst normalizePlatform = (platform) => {\n // Node platforms:\n // - https://nodejs.org/api/process.html#processplatform\n // Deno platforms:\n // - https://doc.deno.land/deno/stable/~/Deno.build\n // - https://github.com/denoland/deno/issues/14799\n platform = platform.toLowerCase();\n // NOTE: this iOS check is untested and may not work\n // Node does not work natively on IOS, there is a fork at\n // https://github.com/nodejs-mobile/nodejs-mobile\n // however it is unknown at the time of writing how to detect if it is running\n if (platform.includes('ios'))\n return 'iOS';\n if (platform === 'android')\n return 'Android';\n if (platform === 'darwin')\n return 'MacOS';\n if (platform === 'win32')\n return 'Windows';\n if (platform === 'freebsd')\n return 'FreeBSD';\n if (platform === 'openbsd')\n return 'OpenBSD';\n if (platform === 'linux')\n return 'Linux';\n if (platform)\n return `Other:${platform}`;\n return 'Unknown';\n};\nlet _platformHeaders;\nconst getPlatformHeaders = () => {\n return (_platformHeaders ?? (_platformHeaders = getPlatformProperties()));\n};\nexport const safeJSON = (text) => {\n try {\n return JSON.parse(text);\n }\n catch (err) {\n return undefined;\n }\n};\n// https://url.spec.whatwg.org/#url-scheme-string\nconst startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;\nconst isAbsoluteURL = (url) => {\n return startsWithSchemeRegexp.test(url);\n};\nexport const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\nconst validatePositiveInteger = (name, n) => {\n if (typeof n !== 'number' || !Number.isInteger(n)) {\n throw new OpenAIError(`${name} must be an integer`);\n }\n if (n < 0) {\n throw new OpenAIError(`${name} must be a positive integer`);\n }\n return n;\n};\nexport const castToError = (err) => {\n if (err instanceof Error)\n return err;\n if (typeof err === 'object' && err !== null) {\n try {\n return new Error(JSON.stringify(err));\n }\n catch { }\n }\n return new Error(err);\n};\nexport const ensurePresent = (value) => {\n if (value == null)\n throw new OpenAIError(`Expected a value to be given but received ${value} instead.`);\n return value;\n};\n/**\n * Read an environment variable.\n *\n * Trims beginning and trailing whitespace.\n *\n * Will return undefined if the environment variable doesn't exist or cannot be accessed.\n */\nexport const readEnv = (env) => {\n if (typeof process !== 'undefined') {\n return process.env?.[env]?.trim() ?? undefined;\n }\n if (typeof Deno !== 'undefined') {\n return Deno.env?.get?.(env)?.trim();\n }\n return undefined;\n};\nexport const coerceInteger = (value) => {\n if (typeof value === 'number')\n return Math.round(value);\n if (typeof value === 'string')\n return parseInt(value, 10);\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\nexport const coerceFloat = (value) => {\n if (typeof value === 'number')\n return value;\n if (typeof value === 'string')\n return parseFloat(value);\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\nexport const coerceBoolean = (value) => {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'string')\n return value === 'true';\n return Boolean(value);\n};\nexport const maybeCoerceInteger = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceInteger(value);\n};\nexport const maybeCoerceFloat = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceFloat(value);\n};\nexport const maybeCoerceBoolean = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceBoolean(value);\n};\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(obj) {\n if (!obj)\n return true;\n for (const _k in obj)\n return false;\n return true;\n}\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n/**\n * Copies headers from \"newHeaders\" onto \"targetHeaders\",\n * using lower-case for all properties,\n * ignoring any keys with undefined values,\n * and deleting any keys with null values.\n */\nfunction applyHeadersMut(targetHeaders, newHeaders) {\n for (const k in newHeaders) {\n if (!hasOwn(newHeaders, k))\n continue;\n const lowerKey = k.toLowerCase();\n if (!lowerKey)\n continue;\n const val = newHeaders[k];\n if (val === null) {\n delete targetHeaders[lowerKey];\n }\n else if (val !== undefined) {\n targetHeaders[lowerKey] = val;\n }\n }\n}\nconst SENSITIVE_HEADERS = new Set(['authorization', 'api-key']);\nexport function debug(action, ...args) {\n if (typeof process !== 'undefined' && process?.env?.['DEBUG'] === 'true') {\n const modifiedArgs = args.map((arg) => {\n if (!arg) {\n return arg;\n }\n // Check for sensitive headers in request body 'headers' object\n if (arg['headers']) {\n // clone so we don't mutate\n const modifiedArg = { ...arg, headers: { ...arg['headers'] } };\n for (const header in arg['headers']) {\n if (SENSITIVE_HEADERS.has(header.toLowerCase())) {\n modifiedArg['headers'][header] = 'REDACTED';\n }\n }\n return modifiedArg;\n }\n let modifiedArg = null;\n // Check for sensitive headers in headers object\n for (const header in arg) {\n if (SENSITIVE_HEADERS.has(header.toLowerCase())) {\n // avoid making a copy until we need to\n modifiedArg ?? (modifiedArg = { ...arg });\n modifiedArg[header] = 'REDACTED';\n }\n }\n return modifiedArg ?? arg;\n });\n console.log(`OpenAI:DEBUG:${action}`, ...modifiedArgs);\n }\n}\n/**\n * https://stackoverflow.com/a/2117523\n */\nconst uuid4 = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\nexport const isRunningInBrowser = () => {\n return (\n // @ts-ignore\n typeof window !== 'undefined' &&\n // @ts-ignore\n typeof window.document !== 'undefined' &&\n // @ts-ignore\n typeof navigator !== 'undefined');\n};\nexport const isHeadersProtocol = (headers) => {\n return typeof headers?.get === 'function';\n};\nexport const getRequiredHeader = (headers, header) => {\n const foundHeader = getHeader(headers, header);\n if (foundHeader === undefined) {\n throw new Error(`Could not find ${header} header`);\n }\n return foundHeader;\n};\nexport const getHeader = (headers, header) => {\n const lowerCasedHeader = header.toLowerCase();\n if (isHeadersProtocol(headers)) {\n // to deal with the case where the header looks like Stainless-Event-Id\n const intercapsHeader = header[0]?.toUpperCase() +\n header.substring(1).replace(/([^\\w])(\\w)/g, (_m, g1, g2) => g1 + g2.toUpperCase());\n for (const key of [header, lowerCasedHeader, header.toUpperCase(), intercapsHeader]) {\n const value = headers.get(key);\n if (value) {\n return value;\n }\n }\n }\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === lowerCasedHeader) {\n if (Array.isArray(value)) {\n if (value.length <= 1)\n return value[0];\n console.warn(`Received ${value.length} entries for the ${header} header, using the first entry.`);\n return value[0];\n }\n return value;\n }\n }\n return undefined;\n};\n/**\n * Encodes a string to Base64 format.\n */\nexport const toBase64 = (str) => {\n if (!str)\n return '';\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(str).toString('base64');\n }\n if (typeof btoa !== 'undefined') {\n return btoa(str);\n }\n throw new OpenAIError('Cannot generate b64 string; Expected `Buffer` or `btoa` to be defined');\n};\n/**\n * Converts a Base64 encoded string to a Float32Array.\n * @param base64Str - The Base64 encoded string.\n * @returns An Array of numbers interpreted as Float32 values.\n */\nexport const toFloat32Array = (base64Str) => {\n if (typeof Buffer !== 'undefined') {\n // for Node.js environment\n const buf = Buffer.from(base64Str, 'base64');\n return Array.from(new Float32Array(buf.buffer, buf.byteOffset, buf.length / Float32Array.BYTES_PER_ELEMENT));\n }\n else {\n // for legacy web platform APIs\n const binaryStr = atob(base64Str);\n const len = binaryStr.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n return Array.from(new Float32Array(bytes.buffer));\n }\n};\nexport function isObj(obj) {\n return obj != null && typeof obj === 'object' && !Array.isArray(obj);\n}\n//# sourceMappingURL=core.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { AbstractPage } from \"./core.mjs\";\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class Page extends AbstractPage {\n constructor(client, response, body, options) {\n super(client, response, body, options);\n this.data = body.data || [];\n this.object = body.object;\n }\n getPaginatedItems() {\n return this.data ?? [];\n }\n // @deprecated Please use `nextPageInfo()` instead\n /**\n * This page represents a response that isn't actually paginated at the API level\n * so there will never be any next page params.\n */\n nextPageParams() {\n return null;\n }\n nextPageInfo() {\n return null;\n }\n}\nexport class CursorPage extends AbstractPage {\n constructor(client, response, body, options) {\n super(client, response, body, options);\n this.data = body.data || [];\n this.has_more = body.has_more || false;\n }\n getPaginatedItems() {\n return this.data ?? [];\n }\n hasNextPage() {\n if (this.has_more === false) {\n return false;\n }\n return super.hasNextPage();\n }\n // @deprecated Please use `nextPageInfo()` instead\n nextPageParams() {\n const info = this.nextPageInfo();\n if (!info)\n return null;\n if ('params' in info)\n return info.params;\n const params = Object.fromEntries(info.url.searchParams);\n if (!Object.keys(params).length)\n return null;\n return params;\n }\n nextPageInfo() {\n const data = this.getPaginatedItems();\n if (!data.length) {\n return null;\n }\n const id = data[data.length - 1]?.id;\n if (!id) {\n return null;\n }\n return { params: { after: id } };\n }\n}\n//# sourceMappingURL=pagination.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nexport class APIResource {\n constructor(client) {\n this._client = client;\n }\n}\n//# sourceMappingURL=resource.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { ChatCompletionStoreMessagesPage } from \"./completions.mjs\";\nexport class Messages extends APIResource {\n list(completionId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(completionId, {}, query);\n }\n return this._client.getAPIList(`/chat/completions/${completionId}/messages`, ChatCompletionStoreMessagesPage, { query, ...options });\n }\n}\nexport { ChatCompletionStoreMessagesPage };\n//# sourceMappingURL=messages.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as MessagesAPI from \"./messages.mjs\";\nimport { Messages } from \"./messages.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Completions extends APIResource {\n constructor() {\n super(...arguments);\n this.messages = new MessagesAPI.Messages(this._client);\n }\n create(body, options) {\n return this._client.post('/chat/completions', { body, ...options, stream: body.stream ?? false });\n }\n /**\n * Get a stored chat completion. Only Chat Completions that have been created with\n * the `store` parameter set to `true` will be returned.\n *\n * @example\n * ```ts\n * const chatCompletion =\n * await client.chat.completions.retrieve('completion_id');\n * ```\n */\n retrieve(completionId, options) {\n return this._client.get(`/chat/completions/${completionId}`, options);\n }\n /**\n * Modify a stored chat completion. Only Chat Completions that have been created\n * with the `store` parameter set to `true` can be modified. Currently, the only\n * supported modification is to update the `metadata` field.\n *\n * @example\n * ```ts\n * const chatCompletion = await client.chat.completions.update(\n * 'completion_id',\n * { metadata: { foo: 'string' } },\n * );\n * ```\n */\n update(completionId, body, options) {\n return this._client.post(`/chat/completions/${completionId}`, { body, ...options });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/chat/completions', ChatCompletionsPage, { query, ...options });\n }\n /**\n * Delete a stored chat completion. Only Chat Completions that have been created\n * with the `store` parameter set to `true` can be deleted.\n *\n * @example\n * ```ts\n * const chatCompletionDeleted =\n * await client.chat.completions.del('completion_id');\n * ```\n */\n del(completionId, options) {\n return this._client.delete(`/chat/completions/${completionId}`, options);\n }\n}\nexport class ChatCompletionsPage extends CursorPage {\n}\nexport class ChatCompletionStoreMessagesPage extends CursorPage {\n}\nCompletions.ChatCompletionsPage = ChatCompletionsPage;\nCompletions.Messages = Messages;\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as CompletionsAPI from \"./completions/completions.mjs\";\nimport { ChatCompletionsPage, Completions, } from \"./completions/completions.mjs\";\nexport class Chat extends APIResource {\n constructor() {\n super(...arguments);\n this.completions = new CompletionsAPI.Completions(this._client);\n }\n}\nChat.Completions = Completions;\nChat.ChatCompletionsPage = ChatCompletionsPage;\n//# sourceMappingURL=chat.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class Speech extends APIResource {\n /**\n * Generates audio from the input text.\n *\n * @example\n * ```ts\n * const speech = await client.audio.speech.create({\n * input: 'input',\n * model: 'string',\n * voice: 'ash',\n * });\n *\n * const content = await speech.blob();\n * console.log(content);\n * ```\n */\n create(body, options) {\n return this._client.post('/audio/speech', {\n body,\n ...options,\n headers: { Accept: 'application/octet-stream', ...options?.headers },\n __binaryResponse: true,\n });\n }\n}\n//# sourceMappingURL=speech.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Transcriptions extends APIResource {\n create(body, options) {\n return this._client.post('/audio/transcriptions', Core.multipartFormRequestOptions({\n body,\n ...options,\n stream: body.stream ?? false,\n __metadata: { model: body.model },\n }));\n }\n}\n//# sourceMappingURL=transcriptions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Translations extends APIResource {\n create(body, options) {\n return this._client.post('/audio/translations', Core.multipartFormRequestOptions({ body, ...options, __metadata: { model: body.model } }));\n }\n}\n//# sourceMappingURL=translations.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as SpeechAPI from \"./speech.mjs\";\nimport { Speech } from \"./speech.mjs\";\nimport * as TranscriptionsAPI from \"./transcriptions.mjs\";\nimport { Transcriptions, } from \"./transcriptions.mjs\";\nimport * as TranslationsAPI from \"./translations.mjs\";\nimport { Translations, } from \"./translations.mjs\";\nexport class Audio extends APIResource {\n constructor() {\n super(...arguments);\n this.transcriptions = new TranscriptionsAPI.Transcriptions(this._client);\n this.translations = new TranslationsAPI.Translations(this._client);\n this.speech = new SpeechAPI.Speech(this._client);\n }\n}\nAudio.Transcriptions = Transcriptions;\nAudio.Translations = Translations;\nAudio.Speech = Speech;\n//# sourceMappingURL=audio.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { isRequestOptions } from \"../core.mjs\";\nimport { CursorPage } from \"../pagination.mjs\";\nexport class Batches extends APIResource {\n /**\n * Creates and executes a batch from an uploaded file of requests\n */\n create(body, options) {\n return this._client.post('/batches', { body, ...options });\n }\n /**\n * Retrieves a batch.\n */\n retrieve(batchId, options) {\n return this._client.get(`/batches/${batchId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/batches', BatchesPage, { query, ...options });\n }\n /**\n * Cancels an in-progress batch. The batch will be in status `cancelling` for up to\n * 10 minutes, before changing to `cancelled`, where it will have partial results\n * (if any) available in the output file.\n */\n cancel(batchId, options) {\n return this._client.post(`/batches/${batchId}/cancel`, options);\n }\n}\nexport class BatchesPage extends CursorPage {\n}\nBatches.BatchesPage = BatchesPage;\n//# sourceMappingURL=batches.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _EventStream_instances, _EventStream_connectedPromise, _EventStream_resolveConnectedPromise, _EventStream_rejectConnectedPromise, _EventStream_endPromise, _EventStream_resolveEndPromise, _EventStream_rejectEndPromise, _EventStream_listeners, _EventStream_ended, _EventStream_errored, _EventStream_aborted, _EventStream_catchingPromiseCreated, _EventStream_handleError;\nimport { APIUserAbortError, OpenAIError } from \"../error.mjs\";\nexport class EventStream {\n constructor() {\n _EventStream_instances.add(this);\n this.controller = new AbortController();\n _EventStream_connectedPromise.set(this, void 0);\n _EventStream_resolveConnectedPromise.set(this, () => { });\n _EventStream_rejectConnectedPromise.set(this, () => { });\n _EventStream_endPromise.set(this, void 0);\n _EventStream_resolveEndPromise.set(this, () => { });\n _EventStream_rejectEndPromise.set(this, () => { });\n _EventStream_listeners.set(this, {});\n _EventStream_ended.set(this, false);\n _EventStream_errored.set(this, false);\n _EventStream_aborted.set(this, false);\n _EventStream_catchingPromiseCreated.set(this, false);\n __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve, \"f\");\n __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, \"f\");\n }), \"f\");\n __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve, \"f\");\n __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, \"f\");\n }), \"f\");\n // Don't let these promises cause unhandled rejection errors.\n // we will manually cause an unhandled rejection error later\n // if the user hasn't registered any error listener or called\n // any promise-returning method.\n __classPrivateFieldGet(this, _EventStream_connectedPromise, \"f\").catch(() => { });\n __classPrivateFieldGet(this, _EventStream_endPromise, \"f\").catch(() => { });\n }\n _run(executor) {\n // Unfortunately if we call `executor()` immediately we get runtime errors about\n // references to `this` before the `super()` constructor call returns.\n setTimeout(() => {\n executor().then(() => {\n this._emitFinal();\n this._emit('end');\n }, __classPrivateFieldGet(this, _EventStream_instances, \"m\", _EventStream_handleError).bind(this));\n }, 0);\n }\n _connected() {\n if (this.ended)\n return;\n __classPrivateFieldGet(this, _EventStream_resolveConnectedPromise, \"f\").call(this);\n this._emit('connect');\n }\n get ended() {\n return __classPrivateFieldGet(this, _EventStream_ended, \"f\");\n }\n get errored() {\n return __classPrivateFieldGet(this, _EventStream_errored, \"f\");\n }\n get aborted() {\n return __classPrivateFieldGet(this, _EventStream_aborted, \"f\");\n }\n abort() {\n this.controller.abort();\n }\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n on(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = []);\n listeners.push({ listener });\n return this;\n }\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n off(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event];\n if (!listeners)\n return this;\n const index = listeners.findIndex((l) => l.listener === listener);\n if (index >= 0)\n listeners.splice(index, 1);\n return this;\n }\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n once(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = []);\n listeners.push({ listener, once: true });\n return this;\n }\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * @returns a Promise that resolves the next time given event is triggered,\n * or rejects if an error is emitted. (If you request the 'error' event,\n * returns a promise that resolves with the error).\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted(event) {\n return new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, \"f\");\n if (event !== 'error')\n this.once('error', reject);\n this.once(event, resolve);\n });\n }\n async done() {\n __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, \"f\");\n await __classPrivateFieldGet(this, _EventStream_endPromise, \"f\");\n }\n _emit(event, ...args) {\n // make sure we don't emit any events after end\n if (__classPrivateFieldGet(this, _EventStream_ended, \"f\")) {\n return;\n }\n if (event === 'end') {\n __classPrivateFieldSet(this, _EventStream_ended, true, \"f\");\n __classPrivateFieldGet(this, _EventStream_resolveEndPromise, \"f\").call(this);\n }\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event];\n if (listeners) {\n __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = listeners.filter((l) => !l.once);\n listeners.forEach(({ listener }) => listener(...args));\n }\n if (event === 'abort') {\n const error = args[0];\n if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, \"f\") && !listeners?.length) {\n Promise.reject(error);\n }\n __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, \"f\").call(this, error);\n __classPrivateFieldGet(this, _EventStream_rejectEndPromise, \"f\").call(this, error);\n this._emit('end');\n return;\n }\n if (event === 'error') {\n // NOTE: _emit('error', error) should only be called from #handleError().\n const error = args[0];\n if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, \"f\") && !listeners?.length) {\n // Trigger an unhandled rejection if the user hasn't registered any error handlers.\n // If you are seeing stack traces here, make sure to handle errors via either:\n // - runner.on('error', () => ...)\n // - await runner.done()\n // - await runner.finalChatCompletion()\n // - etc.\n Promise.reject(error);\n }\n __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, \"f\").call(this, error);\n __classPrivateFieldGet(this, _EventStream_rejectEndPromise, \"f\").call(this, error);\n this._emit('end');\n }\n }\n _emitFinal() { }\n}\n_EventStream_connectedPromise = new WeakMap(), _EventStream_resolveConnectedPromise = new WeakMap(), _EventStream_rejectConnectedPromise = new WeakMap(), _EventStream_endPromise = new WeakMap(), _EventStream_resolveEndPromise = new WeakMap(), _EventStream_rejectEndPromise = new WeakMap(), _EventStream_listeners = new WeakMap(), _EventStream_ended = new WeakMap(), _EventStream_errored = new WeakMap(), _EventStream_aborted = new WeakMap(), _EventStream_catchingPromiseCreated = new WeakMap(), _EventStream_instances = new WeakSet(), _EventStream_handleError = function _EventStream_handleError(error) {\n __classPrivateFieldSet(this, _EventStream_errored, true, \"f\");\n if (error instanceof Error && error.name === 'AbortError') {\n error = new APIUserAbortError();\n }\n if (error instanceof APIUserAbortError) {\n __classPrivateFieldSet(this, _EventStream_aborted, true, \"f\");\n return this._emit('abort', error);\n }\n if (error instanceof OpenAIError) {\n return this._emit('error', error);\n }\n if (error instanceof Error) {\n const openAIError = new OpenAIError(error.message);\n // @ts-ignore\n openAIError.cause = error;\n return this._emit('error', openAIError);\n }\n return this._emit('error', new OpenAIError(String(error)));\n};\n//# sourceMappingURL=EventStream.mjs.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun;\nimport * as Core from \"../core.mjs\";\nimport { Stream } from \"../streaming.mjs\";\nimport { APIUserAbortError, OpenAIError } from \"../error.mjs\";\nimport { EventStream } from \"./EventStream.mjs\";\nexport class AssistantStream extends EventStream {\n constructor() {\n super(...arguments);\n _AssistantStream_instances.add(this);\n //Track all events in a single list for reference\n _AssistantStream_events.set(this, []);\n //Used to accumulate deltas\n //We are accumulating many types so the value here is not strict\n _AssistantStream_runStepSnapshots.set(this, {});\n _AssistantStream_messageSnapshots.set(this, {});\n _AssistantStream_messageSnapshot.set(this, void 0);\n _AssistantStream_finalRun.set(this, void 0);\n _AssistantStream_currentContentIndex.set(this, void 0);\n _AssistantStream_currentContent.set(this, void 0);\n _AssistantStream_currentToolCallIndex.set(this, void 0);\n _AssistantStream_currentToolCall.set(this, void 0);\n //For current snapshot methods\n _AssistantStream_currentEvent.set(this, void 0);\n _AssistantStream_currentRunSnapshot.set(this, void 0);\n _AssistantStream_currentRunStepSnapshot.set(this, void 0);\n }\n [(_AssistantStream_events = new WeakMap(), _AssistantStream_runStepSnapshots = new WeakMap(), _AssistantStream_messageSnapshots = new WeakMap(), _AssistantStream_messageSnapshot = new WeakMap(), _AssistantStream_finalRun = new WeakMap(), _AssistantStream_currentContentIndex = new WeakMap(), _AssistantStream_currentContent = new WeakMap(), _AssistantStream_currentToolCallIndex = new WeakMap(), _AssistantStream_currentToolCall = new WeakMap(), _AssistantStream_currentEvent = new WeakMap(), _AssistantStream_currentRunSnapshot = new WeakMap(), _AssistantStream_currentRunStepSnapshot = new WeakMap(), _AssistantStream_instances = new WeakSet(), Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n //Catch all for passing along all events\n this.on('event', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n }\n else {\n pushQueue.push(event);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift();\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n static fromReadableStream(stream) {\n const runner = new AssistantStream();\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n async _fromReadableStream(readableStream, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n this._connected();\n const stream = Stream.fromReadableStream(readableStream, this.controller);\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n toReadableStream() {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n static createToolAssistantStream(threadId, runId, runs, params, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n async _createToolAssistantStream(run, threadId, runId, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await run.submitToolOutputs(threadId, runId, body, {\n ...options,\n signal: this.controller.signal,\n });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n static createThreadAssistantStream(params, thread, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._threadAssistantStream(params, thread, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n static createAssistantStream(threadId, runs, params, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._runAssistantStream(threadId, runs, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n currentEvent() {\n return __classPrivateFieldGet(this, _AssistantStream_currentEvent, \"f\");\n }\n currentRun() {\n return __classPrivateFieldGet(this, _AssistantStream_currentRunSnapshot, \"f\");\n }\n currentMessageSnapshot() {\n return __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\");\n }\n currentRunStepSnapshot() {\n return __classPrivateFieldGet(this, _AssistantStream_currentRunStepSnapshot, \"f\");\n }\n async finalRunSteps() {\n await this.done();\n return Object.values(__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\"));\n }\n async finalMessages() {\n await this.done();\n return Object.values(__classPrivateFieldGet(this, _AssistantStream_messageSnapshots, \"f\"));\n }\n async finalRun() {\n await this.done();\n if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\"))\n throw Error('Final run was not received.');\n return __classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\");\n }\n async _createThreadAssistantStream(thread, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await thread.createAndRun(body, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n async _createAssistantStream(run, threadId, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await run.create(threadId, body, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n static accumulateDelta(acc, delta) {\n for (const [key, deltaValue] of Object.entries(delta)) {\n if (!acc.hasOwnProperty(key)) {\n acc[key] = deltaValue;\n continue;\n }\n let accValue = acc[key];\n if (accValue === null || accValue === undefined) {\n acc[key] = deltaValue;\n continue;\n }\n // We don't accumulate these special properties\n if (key === 'index' || key === 'type') {\n acc[key] = deltaValue;\n continue;\n }\n // Type-specific accumulation logic\n if (typeof accValue === 'string' && typeof deltaValue === 'string') {\n accValue += deltaValue;\n }\n else if (typeof accValue === 'number' && typeof deltaValue === 'number') {\n accValue += deltaValue;\n }\n else if (Core.isObj(accValue) && Core.isObj(deltaValue)) {\n accValue = this.accumulateDelta(accValue, deltaValue);\n }\n else if (Array.isArray(accValue) && Array.isArray(deltaValue)) {\n if (accValue.every((x) => typeof x === 'string' || typeof x === 'number')) {\n accValue.push(...deltaValue); // Use spread syntax for efficient addition\n continue;\n }\n for (const deltaEntry of deltaValue) {\n if (!Core.isObj(deltaEntry)) {\n throw new Error(`Expected array delta entry to be an object but got: ${deltaEntry}`);\n }\n const index = deltaEntry['index'];\n if (index == null) {\n console.error(deltaEntry);\n throw new Error('Expected array delta entry to have an `index` property');\n }\n if (typeof index !== 'number') {\n throw new Error(`Expected array delta entry \\`index\\` property to be a number but got ${index}`);\n }\n const accEntry = accValue[index];\n if (accEntry == null) {\n accValue.push(deltaEntry);\n }\n else {\n accValue[index] = this.accumulateDelta(accEntry, deltaEntry);\n }\n }\n continue;\n }\n else {\n throw Error(`Unhandled record type: ${key}, deltaValue: ${deltaValue}, accValue: ${accValue}`);\n }\n acc[key] = accValue;\n }\n return acc;\n }\n _addRun(run) {\n return run;\n }\n async _threadAssistantStream(params, thread, options) {\n return await this._createThreadAssistantStream(thread, params, options);\n }\n async _runAssistantStream(threadId, runs, params, options) {\n return await this._createAssistantStream(runs, threadId, params, options);\n }\n async _runToolAssistantStream(threadId, runId, runs, params, options) {\n return await this._createToolAssistantStream(runs, threadId, runId, params, options);\n }\n}\n_AssistantStream_addEvent = function _AssistantStream_addEvent(event) {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _AssistantStream_currentEvent, event, \"f\");\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleEvent).call(this, event);\n switch (event.event) {\n case 'thread.created':\n //No action on this event.\n break;\n case 'thread.run.created':\n case 'thread.run.queued':\n case 'thread.run.in_progress':\n case 'thread.run.requires_action':\n case 'thread.run.completed':\n case 'thread.run.incomplete':\n case 'thread.run.failed':\n case 'thread.run.cancelling':\n case 'thread.run.cancelled':\n case 'thread.run.expired':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleRun).call(this, event);\n break;\n case 'thread.run.step.created':\n case 'thread.run.step.in_progress':\n case 'thread.run.step.delta':\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleRunStep).call(this, event);\n break;\n case 'thread.message.created':\n case 'thread.message.in_progress':\n case 'thread.message.delta':\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleMessage).call(this, event);\n break;\n case 'error':\n //This is included for completeness, but errors are processed in the SSE event processing so this should not occur\n throw new Error('Encountered an error event in event processing - errors should be processed earlier');\n default:\n assertNever(event);\n }\n}, _AssistantStream_endRequest = function _AssistantStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\"))\n throw Error('Final run has not been received');\n return __classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\");\n}, _AssistantStream_handleMessage = function _AssistantStream_handleMessage(event) {\n const [accumulatedMessage, newContent] = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateMessage).call(this, event, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, accumulatedMessage, \"f\");\n __classPrivateFieldGet(this, _AssistantStream_messageSnapshots, \"f\")[accumulatedMessage.id] = accumulatedMessage;\n for (const content of newContent) {\n const snapshotContent = accumulatedMessage.content[content.index];\n if (snapshotContent?.type == 'text') {\n this._emit('textCreated', snapshotContent.text);\n }\n }\n switch (event.event) {\n case 'thread.message.created':\n this._emit('messageCreated', event.data);\n break;\n case 'thread.message.in_progress':\n break;\n case 'thread.message.delta':\n this._emit('messageDelta', event.data.delta, accumulatedMessage);\n if (event.data.delta.content) {\n for (const content of event.data.delta.content) {\n //If it is text delta, emit a text delta event\n if (content.type == 'text' && content.text) {\n let textDelta = content.text;\n let snapshot = accumulatedMessage.content[content.index];\n if (snapshot && snapshot.type == 'text') {\n this._emit('textDelta', textDelta, snapshot.text);\n }\n else {\n throw Error('The snapshot associated with this text delta is not text or missing');\n }\n }\n if (content.index != __classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\")) {\n //See if we have in progress content\n if (__classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\")) {\n switch (__classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").type) {\n case 'text':\n this._emit('textDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n case 'image_file':\n this._emit('imageFileDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n }\n }\n __classPrivateFieldSet(this, _AssistantStream_currentContentIndex, content.index, \"f\");\n }\n __classPrivateFieldSet(this, _AssistantStream_currentContent, accumulatedMessage.content[content.index], \"f\");\n }\n }\n break;\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n //We emit the latest content we were working on on completion (including incomplete)\n if (__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\") !== undefined) {\n const currentContent = event.data.content[__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\")];\n if (currentContent) {\n switch (currentContent.type) {\n case 'image_file':\n this._emit('imageFileDone', currentContent.image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n case 'text':\n this._emit('textDone', currentContent.text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n }\n }\n }\n if (__classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\")) {\n this._emit('messageDone', event.data);\n }\n __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, undefined, \"f\");\n }\n}, _AssistantStream_handleRunStep = function _AssistantStream_handleRunStep(event) {\n const accumulatedRunStep = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateRunStep).call(this, event);\n __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, accumulatedRunStep, \"f\");\n switch (event.event) {\n case 'thread.run.step.created':\n this._emit('runStepCreated', event.data);\n break;\n case 'thread.run.step.delta':\n const delta = event.data.delta;\n if (delta.step_details &&\n delta.step_details.type == 'tool_calls' &&\n delta.step_details.tool_calls &&\n accumulatedRunStep.step_details.type == 'tool_calls') {\n for (const toolCall of delta.step_details.tool_calls) {\n if (toolCall.index == __classPrivateFieldGet(this, _AssistantStream_currentToolCallIndex, \"f\")) {\n this._emit('toolCallDelta', toolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index]);\n }\n else {\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n }\n __classPrivateFieldSet(this, _AssistantStream_currentToolCallIndex, toolCall.index, \"f\");\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index], \"f\");\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"))\n this._emit('toolCallCreated', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n }\n }\n }\n this._emit('runStepDelta', event.data.delta, accumulatedRunStep);\n break;\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, undefined, \"f\");\n const details = event.data.step_details;\n if (details.type == 'tool_calls') {\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, \"f\");\n }\n }\n this._emit('runStepDone', event.data, accumulatedRunStep);\n break;\n case 'thread.run.step.in_progress':\n break;\n }\n}, _AssistantStream_handleEvent = function _AssistantStream_handleEvent(event) {\n __classPrivateFieldGet(this, _AssistantStream_events, \"f\").push(event);\n this._emit('event', event);\n}, _AssistantStream_accumulateRunStep = function _AssistantStream_accumulateRunStep(event) {\n switch (event.event) {\n case 'thread.run.step.created':\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = event.data;\n return event.data;\n case 'thread.run.step.delta':\n let snapshot = __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n if (!snapshot) {\n throw Error('Received a RunStepDelta before creation of a snapshot');\n }\n let data = event.data;\n if (data.delta) {\n const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta);\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = accumulated;\n }\n return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n case 'thread.run.step.in_progress':\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = event.data;\n break;\n }\n if (__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id])\n return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n throw new Error('No snapshot available');\n}, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage(event, snapshot) {\n let newContent = [];\n switch (event.event) {\n case 'thread.message.created':\n //On creation the snapshot is just the initial message\n return [event.data, newContent];\n case 'thread.message.delta':\n if (!snapshot) {\n throw Error('Received a delta with no existing snapshot (there should be one from message creation)');\n }\n let data = event.data;\n //If this delta does not have content, nothing to process\n if (data.delta.content) {\n for (const contentElement of data.delta.content) {\n if (contentElement.index in snapshot.content) {\n let currentContent = snapshot.content[contentElement.index];\n snapshot.content[contentElement.index] = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateContent).call(this, contentElement, currentContent);\n }\n else {\n snapshot.content[contentElement.index] = contentElement;\n // This is a new element\n newContent.push(contentElement);\n }\n }\n }\n return [snapshot, newContent];\n case 'thread.message.in_progress':\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n //No changes on other thread events\n if (snapshot) {\n return [snapshot, newContent];\n }\n else {\n throw Error('Received thread message event with no existing snapshot');\n }\n }\n throw Error('Tried to accumulate a non-message event');\n}, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) {\n return AssistantStream.accumulateDelta(currentContent, contentElement);\n}, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) {\n __classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, \"f\");\n switch (event.event) {\n case 'thread.run.created':\n break;\n case 'thread.run.queued':\n break;\n case 'thread.run.in_progress':\n break;\n case 'thread.run.requires_action':\n case 'thread.run.cancelled':\n case 'thread.run.failed':\n case 'thread.run.completed':\n case 'thread.run.expired':\n __classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, \"f\");\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, \"f\");\n }\n break;\n case 'thread.run.cancelling':\n break;\n }\n};\nfunction assertNever(_x) { }\n//# sourceMappingURL=AssistantStream.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nimport { AssistantStream } from \"../../lib/AssistantStream.mjs\";\nexport class Assistants extends APIResource {\n /**\n * Create an assistant with a model and instructions.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.create({\n * model: 'gpt-4o',\n * });\n * ```\n */\n create(body, options) {\n return this._client.post('/assistants', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves an assistant.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.retrieve(\n * 'assistant_id',\n * );\n * ```\n */\n retrieve(assistantId, options) {\n return this._client.get(`/assistants/${assistantId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies an assistant.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.update(\n * 'assistant_id',\n * );\n * ```\n */\n update(assistantId, body, options) {\n return this._client.post(`/assistants/${assistantId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/assistants', AssistantsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete an assistant.\n *\n * @example\n * ```ts\n * const assistantDeleted = await client.beta.assistants.del(\n * 'assistant_id',\n * );\n * ```\n */\n del(assistantId, options) {\n return this._client.delete(`/assistants/${assistantId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class AssistantsPage extends CursorPage {\n}\nAssistants.AssistantsPage = AssistantsPage;\n//# sourceMappingURL=assistants.mjs.map","export function isRunnableFunctionWithParse(fn) {\n return typeof fn.parse === 'function';\n}\n/**\n * This is helper class for passing a `function` and `parse` where the `function`\n * argument type matches the `parse` return type.\n *\n * @deprecated - please use ParsingToolFunction instead.\n */\nexport class ParsingFunction {\n constructor(input) {\n this.function = input.function;\n this.parse = input.parse;\n this.parameters = input.parameters;\n this.description = input.description;\n this.name = input.name;\n }\n}\n/**\n * This is helper class for passing a `function` and `parse` where the `function`\n * argument type matches the `parse` return type.\n */\nexport class ParsingToolFunction {\n constructor(input) {\n this.type = 'function';\n this.function = input;\n }\n}\n//# sourceMappingURL=RunnableFunction.mjs.map","export const isAssistantMessage = (message) => {\n return message?.role === 'assistant';\n};\nexport const isFunctionMessage = (message) => {\n return message?.role === 'function';\n};\nexport const isToolMessage = (message) => {\n return message?.role === 'tool';\n};\nexport function isPresent(obj) {\n return obj != null;\n}\n//# sourceMappingURL=chatCompletionUtils.mjs.map","import { ContentFilterFinishReasonError, LengthFinishReasonError, OpenAIError } from \"../error.mjs\";\nexport function makeParseableResponseFormat(response_format, parser) {\n const obj = { ...response_format };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function makeParseableTextFormat(response_format, parser) {\n const obj = { ...response_format };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableResponseFormat(response_format) {\n return response_format?.['$brand'] === 'auto-parseable-response-format';\n}\nexport function makeParseableTool(tool, { parser, callback, }) {\n const obj = { ...tool };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableTool(tool) {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\nexport function maybeParseChatCompletion(completion, params) {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...completion,\n choices: completion.choices.map((choice) => ({\n ...choice,\n message: {\n ...choice.message,\n parsed: null,\n ...(choice.message.tool_calls ?\n {\n tool_calls: choice.message.tool_calls,\n }\n : undefined),\n },\n })),\n };\n }\n return parseChatCompletion(completion, params);\n}\nexport function parseChatCompletion(completion, params) {\n const choices = completion.choices.map((choice) => {\n if (choice.finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n if (choice.finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n return {\n ...choice,\n message: {\n ...choice.message,\n ...(choice.message.tool_calls ?\n {\n tool_calls: choice.message.tool_calls?.map((toolCall) => parseToolCall(params, toolCall)) ?? undefined,\n }\n : undefined),\n parsed: choice.message.content && !choice.message.refusal ?\n parseResponseFormat(params, choice.message.content)\n : null,\n },\n };\n });\n return { ...completion, choices };\n}\nfunction parseResponseFormat(params, content) {\n if (params.response_format?.type !== 'json_schema') {\n return null;\n }\n if (params.response_format?.type === 'json_schema') {\n if ('$parseRaw' in params.response_format) {\n const response_format = params.response_format;\n return response_format.$parseRaw(content);\n }\n return JSON.parse(content);\n }\n return null;\n}\nfunction parseToolCall(params, toolCall) {\n const inputTool = params.tools?.find((inputTool) => inputTool.function?.name === toolCall.function.name);\n return {\n ...toolCall,\n function: {\n ...toolCall.function,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCall.function.arguments)\n : inputTool?.function.strict ? JSON.parse(toolCall.function.arguments)\n : null,\n },\n };\n}\nexport function shouldParseToolCall(params, toolCall) {\n if (!params) {\n return false;\n }\n const inputTool = params.tools?.find((inputTool) => inputTool.function?.name === toolCall.function.name);\n return isAutoParsableTool(inputTool) || inputTool?.function.strict || false;\n}\nexport function hasAutoParseableInput(params) {\n if (isAutoParsableResponseFormat(params.response_format)) {\n return true;\n }\n return (params.tools?.some((t) => isAutoParsableTool(t) || (t.type === 'function' && t.function.strict === true)) ?? false);\n}\nexport function validateInputTools(tools) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(`Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``);\n }\n if (tool.function.strict !== true) {\n throw new OpenAIError(`The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`);\n }\n }\n}\n//# sourceMappingURL=parser.mjs.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _AbstractChatCompletionRunner_instances, _AbstractChatCompletionRunner_getFinalContent, _AbstractChatCompletionRunner_getFinalMessage, _AbstractChatCompletionRunner_getFinalFunctionCall, _AbstractChatCompletionRunner_getFinalFunctionCallResult, _AbstractChatCompletionRunner_calculateTotalUsage, _AbstractChatCompletionRunner_validateParams, _AbstractChatCompletionRunner_stringifyFunctionCallResult;\nimport { OpenAIError } from \"../error.mjs\";\nimport { isRunnableFunctionWithParse, } from \"./RunnableFunction.mjs\";\nimport { isAssistantMessage, isFunctionMessage, isToolMessage } from \"./chatCompletionUtils.mjs\";\nimport { EventStream } from \"./EventStream.mjs\";\nimport { isAutoParsableTool, parseChatCompletion } from \"../lib/parser.mjs\";\nconst DEFAULT_MAX_CHAT_COMPLETIONS = 10;\nexport class AbstractChatCompletionRunner extends EventStream {\n constructor() {\n super(...arguments);\n _AbstractChatCompletionRunner_instances.add(this);\n this._chatCompletions = [];\n this.messages = [];\n }\n _addChatCompletion(chatCompletion) {\n this._chatCompletions.push(chatCompletion);\n this._emit('chatCompletion', chatCompletion);\n const message = chatCompletion.choices[0]?.message;\n if (message)\n this._addMessage(message);\n return chatCompletion;\n }\n _addMessage(message, emit = true) {\n if (!('content' in message))\n message.content = null;\n this.messages.push(message);\n if (emit) {\n this._emit('message', message);\n if ((isFunctionMessage(message) || isToolMessage(message)) && message.content) {\n // Note, this assumes that {role: 'tool', content: …} is always the result of a call of tool of type=function.\n this._emit('functionCallResult', message.content);\n }\n else if (isAssistantMessage(message) && message.function_call) {\n this._emit('functionCall', message.function_call);\n }\n else if (isAssistantMessage(message) && message.tool_calls) {\n for (const tool_call of message.tool_calls) {\n if (tool_call.type === 'function') {\n this._emit('functionCall', tool_call.function);\n }\n }\n }\n }\n }\n /**\n * @returns a promise that resolves with the final ChatCompletion, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletion.\n */\n async finalChatCompletion() {\n await this.done();\n const completion = this._chatCompletions[this._chatCompletions.length - 1];\n if (!completion)\n throw new OpenAIError('stream ended without producing a ChatCompletion');\n return completion;\n }\n /**\n * @returns a promise that resolves with the content of the final ChatCompletionMessage, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalContent() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalContent).call(this);\n }\n /**\n * @returns a promise that resolves with the the final assistant ChatCompletionMessage response,\n * or rejects if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalMessage() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this);\n }\n /**\n * @returns a promise that resolves with the content of the final FunctionCall, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalFunctionCall() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this);\n }\n async finalFunctionCallResult() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this);\n }\n async totalUsage() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_calculateTotalUsage).call(this);\n }\n allChatCompletions() {\n return [...this._chatCompletions];\n }\n _emitFinal() {\n const completion = this._chatCompletions[this._chatCompletions.length - 1];\n if (completion)\n this._emit('finalChatCompletion', completion);\n const finalMessage = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this);\n if (finalMessage)\n this._emit('finalMessage', finalMessage);\n const finalContent = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalContent).call(this);\n if (finalContent)\n this._emit('finalContent', finalContent);\n const finalFunctionCall = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this);\n if (finalFunctionCall)\n this._emit('finalFunctionCall', finalFunctionCall);\n const finalFunctionCallResult = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this);\n if (finalFunctionCallResult != null)\n this._emit('finalFunctionCallResult', finalFunctionCallResult);\n if (this._chatCompletions.some((c) => c.usage)) {\n this._emit('totalUsage', __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_calculateTotalUsage).call(this));\n }\n }\n async _createChatCompletion(client, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_validateParams).call(this, params);\n const chatCompletion = await client.chat.completions.create({ ...params, stream: false }, { ...options, signal: this.controller.signal });\n this._connected();\n return this._addChatCompletion(parseChatCompletion(chatCompletion, params));\n }\n async _runChatCompletion(client, params, options) {\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n return await this._createChatCompletion(client, params, options);\n }\n async _runFunctions(client, params, options) {\n const role = 'function';\n const { function_call = 'auto', stream, ...restParams } = params;\n const singleFunctionToCall = typeof function_call !== 'string' && function_call?.name;\n const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {};\n const functionsByName = {};\n for (const f of params.functions) {\n functionsByName[f.name || f.function.name] = f;\n }\n const functions = params.functions.map((f) => ({\n name: f.name || f.function.name,\n parameters: f.parameters,\n description: f.description,\n }));\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n for (let i = 0; i < maxChatCompletions; ++i) {\n const chatCompletion = await this._createChatCompletion(client, {\n ...restParams,\n function_call,\n functions,\n messages: [...this.messages],\n }, options);\n const message = chatCompletion.choices[0]?.message;\n if (!message) {\n throw new OpenAIError(`missing message in ChatCompletion response`);\n }\n if (!message.function_call)\n return;\n const { name, arguments: args } = message.function_call;\n const fn = functionsByName[name];\n if (!fn) {\n const content = `Invalid function_call: ${JSON.stringify(name)}. Available options are: ${functions\n .map((f) => JSON.stringify(f.name))\n .join(', ')}. Please try again`;\n this._addMessage({ role, name, content });\n continue;\n }\n else if (singleFunctionToCall && singleFunctionToCall !== name) {\n const content = `Invalid function_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`;\n this._addMessage({ role, name, content });\n continue;\n }\n let parsed;\n try {\n parsed = isRunnableFunctionWithParse(fn) ? await fn.parse(args) : args;\n }\n catch (error) {\n this._addMessage({\n role,\n name,\n content: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n // @ts-expect-error it can't rule out `never` type.\n const rawContent = await fn.function(parsed, this);\n const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent);\n this._addMessage({ role, name, content });\n if (singleFunctionToCall)\n return;\n }\n }\n async _runTools(client, params, options) {\n const role = 'tool';\n const { tool_choice = 'auto', stream, ...restParams } = params;\n const singleFunctionToCall = typeof tool_choice !== 'string' && tool_choice?.function?.name;\n const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {};\n // TODO(someday): clean this logic up\n const inputTools = params.tools.map((tool) => {\n if (isAutoParsableTool(tool)) {\n if (!tool.$callback) {\n throw new OpenAIError('Tool given to `.runTools()` that does not have an associated function');\n }\n return {\n type: 'function',\n function: {\n function: tool.$callback,\n name: tool.function.name,\n description: tool.function.description || '',\n parameters: tool.function.parameters,\n parse: tool.$parseRaw,\n strict: true,\n },\n };\n }\n return tool;\n });\n const functionsByName = {};\n for (const f of inputTools) {\n if (f.type === 'function') {\n functionsByName[f.function.name || f.function.function.name] = f.function;\n }\n }\n const tools = 'tools' in params ?\n inputTools.map((t) => t.type === 'function' ?\n {\n type: 'function',\n function: {\n name: t.function.name || t.function.function.name,\n parameters: t.function.parameters,\n description: t.function.description,\n strict: t.function.strict,\n },\n }\n : t)\n : undefined;\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n for (let i = 0; i < maxChatCompletions; ++i) {\n const chatCompletion = await this._createChatCompletion(client, {\n ...restParams,\n tool_choice,\n tools,\n messages: [...this.messages],\n }, options);\n const message = chatCompletion.choices[0]?.message;\n if (!message) {\n throw new OpenAIError(`missing message in ChatCompletion response`);\n }\n if (!message.tool_calls?.length) {\n return;\n }\n for (const tool_call of message.tool_calls) {\n if (tool_call.type !== 'function')\n continue;\n const tool_call_id = tool_call.id;\n const { name, arguments: args } = tool_call.function;\n const fn = functionsByName[name];\n if (!fn) {\n const content = `Invalid tool_call: ${JSON.stringify(name)}. Available options are: ${Object.keys(functionsByName)\n .map((name) => JSON.stringify(name))\n .join(', ')}. Please try again`;\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n else if (singleFunctionToCall && singleFunctionToCall !== name) {\n const content = `Invalid tool_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`;\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n let parsed;\n try {\n parsed = isRunnableFunctionWithParse(fn) ? await fn.parse(args) : args;\n }\n catch (error) {\n const content = error instanceof Error ? error.message : String(error);\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n // @ts-expect-error it can't rule out `never` type.\n const rawContent = await fn.function(parsed, this);\n const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent);\n this._addMessage({ role, tool_call_id, content });\n if (singleFunctionToCall) {\n return;\n }\n }\n }\n return;\n }\n}\n_AbstractChatCompletionRunner_instances = new WeakSet(), _AbstractChatCompletionRunner_getFinalContent = function _AbstractChatCompletionRunner_getFinalContent() {\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this).content ?? null;\n}, _AbstractChatCompletionRunner_getFinalMessage = function _AbstractChatCompletionRunner_getFinalMessage() {\n let i = this.messages.length;\n while (i-- > 0) {\n const message = this.messages[i];\n if (isAssistantMessage(message)) {\n const { function_call, ...rest } = message;\n // TODO: support audio here\n const ret = {\n ...rest,\n content: message.content ?? null,\n refusal: message.refusal ?? null,\n };\n if (function_call) {\n ret.function_call = function_call;\n }\n return ret;\n }\n }\n throw new OpenAIError('stream ended without producing a ChatCompletionMessage with role=assistant');\n}, _AbstractChatCompletionRunner_getFinalFunctionCall = function _AbstractChatCompletionRunner_getFinalFunctionCall() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const message = this.messages[i];\n if (isAssistantMessage(message) && message?.function_call) {\n return message.function_call;\n }\n if (isAssistantMessage(message) && message?.tool_calls?.length) {\n return message.tool_calls.at(-1)?.function;\n }\n }\n return;\n}, _AbstractChatCompletionRunner_getFinalFunctionCallResult = function _AbstractChatCompletionRunner_getFinalFunctionCallResult() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const message = this.messages[i];\n if (isFunctionMessage(message) && message.content != null) {\n return message.content;\n }\n if (isToolMessage(message) &&\n message.content != null &&\n typeof message.content === 'string' &&\n this.messages.some((x) => x.role === 'assistant' &&\n x.tool_calls?.some((y) => y.type === 'function' && y.id === message.tool_call_id))) {\n return message.content;\n }\n }\n return;\n}, _AbstractChatCompletionRunner_calculateTotalUsage = function _AbstractChatCompletionRunner_calculateTotalUsage() {\n const total = {\n completion_tokens: 0,\n prompt_tokens: 0,\n total_tokens: 0,\n };\n for (const { usage } of this._chatCompletions) {\n if (usage) {\n total.completion_tokens += usage.completion_tokens;\n total.prompt_tokens += usage.prompt_tokens;\n total.total_tokens += usage.total_tokens;\n }\n }\n return total;\n}, _AbstractChatCompletionRunner_validateParams = function _AbstractChatCompletionRunner_validateParams(params) {\n if (params.n != null && params.n > 1) {\n throw new OpenAIError('ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.');\n }\n}, _AbstractChatCompletionRunner_stringifyFunctionCallResult = function _AbstractChatCompletionRunner_stringifyFunctionCallResult(rawContent) {\n return (typeof rawContent === 'string' ? rawContent\n : rawContent === undefined ? 'undefined'\n : JSON.stringify(rawContent));\n};\n//# sourceMappingURL=AbstractChatCompletionRunner.mjs.map","import { AbstractChatCompletionRunner, } from \"./AbstractChatCompletionRunner.mjs\";\nimport { isAssistantMessage } from \"./chatCompletionUtils.mjs\";\nexport class ChatCompletionRunner extends AbstractChatCompletionRunner {\n /** @deprecated - please use `runTools` instead. */\n static runFunctions(client, params, options) {\n const runner = new ChatCompletionRunner();\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' },\n };\n runner._run(() => runner._runFunctions(client, params, opts));\n return runner;\n }\n static runTools(client, params, options) {\n const runner = new ChatCompletionRunner();\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' },\n };\n runner._run(() => runner._runTools(client, params, opts));\n return runner;\n }\n _addMessage(message, emit = true) {\n super._addMessage(message, emit);\n if (isAssistantMessage(message) && message.content) {\n this._emit('content', message.content);\n }\n }\n}\n//# sourceMappingURL=ChatCompletionRunner.mjs.map","const STR = 0b000000001;\nconst NUM = 0b000000010;\nconst ARR = 0b000000100;\nconst OBJ = 0b000001000;\nconst NULL = 0b000010000;\nconst BOOL = 0b000100000;\nconst NAN = 0b001000000;\nconst INFINITY = 0b010000000;\nconst MINUS_INFINITY = 0b100000000;\nconst INF = INFINITY | MINUS_INFINITY;\nconst SPECIAL = NULL | BOOL | INF | NAN;\nconst ATOM = STR | NUM | SPECIAL;\nconst COLLECTION = ARR | OBJ;\nconst ALL = ATOM | COLLECTION;\nconst Allow = {\n STR,\n NUM,\n ARR,\n OBJ,\n NULL,\n BOOL,\n NAN,\n INFINITY,\n MINUS_INFINITY,\n INF,\n SPECIAL,\n ATOM,\n COLLECTION,\n ALL,\n};\n// The JSON string segment was unable to be parsed completely\nclass PartialJSON extends Error {\n}\nclass MalformedJSON extends Error {\n}\n/**\n * Parse incomplete JSON\n * @param {string} jsonString Partial JSON to be parsed\n * @param {number} allowPartial Specify what types are allowed to be partial, see {@link Allow} for details\n * @returns The parsed JSON\n * @throws {PartialJSON} If the JSON is incomplete (related to the `allow` parameter)\n * @throws {MalformedJSON} If the JSON is malformed\n */\nfunction parseJSON(jsonString, allowPartial = Allow.ALL) {\n if (typeof jsonString !== 'string') {\n throw new TypeError(`expecting str, got ${typeof jsonString}`);\n }\n if (!jsonString.trim()) {\n throw new Error(`${jsonString} is empty`);\n }\n return _parseJSON(jsonString.trim(), allowPartial);\n}\nconst _parseJSON = (jsonString, allow) => {\n const length = jsonString.length;\n let index = 0;\n const markPartialJSON = (msg) => {\n throw new PartialJSON(`${msg} at position ${index}`);\n };\n const throwMalformedError = (msg) => {\n throw new MalformedJSON(`${msg} at position ${index}`);\n };\n const parseAny = () => {\n skipBlank();\n if (index >= length)\n markPartialJSON('Unexpected end of input');\n if (jsonString[index] === '\"')\n return parseStr();\n if (jsonString[index] === '{')\n return parseObj();\n if (jsonString[index] === '[')\n return parseArr();\n if (jsonString.substring(index, index + 4) === 'null' ||\n (Allow.NULL & allow && length - index < 4 && 'null'.startsWith(jsonString.substring(index)))) {\n index += 4;\n return null;\n }\n if (jsonString.substring(index, index + 4) === 'true' ||\n (Allow.BOOL & allow && length - index < 4 && 'true'.startsWith(jsonString.substring(index)))) {\n index += 4;\n return true;\n }\n if (jsonString.substring(index, index + 5) === 'false' ||\n (Allow.BOOL & allow && length - index < 5 && 'false'.startsWith(jsonString.substring(index)))) {\n index += 5;\n return false;\n }\n if (jsonString.substring(index, index + 8) === 'Infinity' ||\n (Allow.INFINITY & allow && length - index < 8 && 'Infinity'.startsWith(jsonString.substring(index)))) {\n index += 8;\n return Infinity;\n }\n if (jsonString.substring(index, index + 9) === '-Infinity' ||\n (Allow.MINUS_INFINITY & allow &&\n 1 < length - index &&\n length - index < 9 &&\n '-Infinity'.startsWith(jsonString.substring(index)))) {\n index += 9;\n return -Infinity;\n }\n if (jsonString.substring(index, index + 3) === 'NaN' ||\n (Allow.NAN & allow && length - index < 3 && 'NaN'.startsWith(jsonString.substring(index)))) {\n index += 3;\n return NaN;\n }\n return parseNum();\n };\n const parseStr = () => {\n const start = index;\n let escape = false;\n index++; // skip initial quote\n while (index < length && (jsonString[index] !== '\"' || (escape && jsonString[index - 1] === '\\\\'))) {\n escape = jsonString[index] === '\\\\' ? !escape : false;\n index++;\n }\n if (jsonString.charAt(index) == '\"') {\n try {\n return JSON.parse(jsonString.substring(start, ++index - Number(escape)));\n }\n catch (e) {\n throwMalformedError(String(e));\n }\n }\n else if (Allow.STR & allow) {\n try {\n return JSON.parse(jsonString.substring(start, index - Number(escape)) + '\"');\n }\n catch (e) {\n // SyntaxError: Invalid escape sequence\n return JSON.parse(jsonString.substring(start, jsonString.lastIndexOf('\\\\')) + '\"');\n }\n }\n markPartialJSON('Unterminated string literal');\n };\n const parseObj = () => {\n index++; // skip initial brace\n skipBlank();\n const obj = {};\n try {\n while (jsonString[index] !== '}') {\n skipBlank();\n if (index >= length && Allow.OBJ & allow)\n return obj;\n const key = parseStr();\n skipBlank();\n index++; // skip colon\n try {\n const value = parseAny();\n Object.defineProperty(obj, key, { value, writable: true, enumerable: true, configurable: true });\n }\n catch (e) {\n if (Allow.OBJ & allow)\n return obj;\n else\n throw e;\n }\n skipBlank();\n if (jsonString[index] === ',')\n index++; // skip comma\n }\n }\n catch (e) {\n if (Allow.OBJ & allow)\n return obj;\n else\n markPartialJSON(\"Expected '}' at end of object\");\n }\n index++; // skip final brace\n return obj;\n };\n const parseArr = () => {\n index++; // skip initial bracket\n const arr = [];\n try {\n while (jsonString[index] !== ']') {\n arr.push(parseAny());\n skipBlank();\n if (jsonString[index] === ',') {\n index++; // skip comma\n }\n }\n }\n catch (e) {\n if (Allow.ARR & allow) {\n return arr;\n }\n markPartialJSON(\"Expected ']' at end of array\");\n }\n index++; // skip final bracket\n return arr;\n };\n const parseNum = () => {\n if (index === 0) {\n if (jsonString === '-' && Allow.NUM & allow)\n markPartialJSON(\"Not sure what '-' is\");\n try {\n return JSON.parse(jsonString);\n }\n catch (e) {\n if (Allow.NUM & allow) {\n try {\n if ('.' === jsonString[jsonString.length - 1])\n return JSON.parse(jsonString.substring(0, jsonString.lastIndexOf('.')));\n return JSON.parse(jsonString.substring(0, jsonString.lastIndexOf('e')));\n }\n catch (e) { }\n }\n throwMalformedError(String(e));\n }\n }\n const start = index;\n if (jsonString[index] === '-')\n index++;\n while (jsonString[index] && !',]}'.includes(jsonString[index]))\n index++;\n if (index == length && !(Allow.NUM & allow))\n markPartialJSON('Unterminated number literal');\n try {\n return JSON.parse(jsonString.substring(start, index));\n }\n catch (e) {\n if (jsonString.substring(start, index) === '-' && Allow.NUM & allow)\n markPartialJSON(\"Not sure what '-' is\");\n try {\n return JSON.parse(jsonString.substring(start, jsonString.lastIndexOf('e')));\n }\n catch (e) {\n throwMalformedError(String(e));\n }\n }\n };\n const skipBlank = () => {\n while (index < length && ' \\n\\r\\t'.includes(jsonString[index])) {\n index++;\n }\n };\n return parseAny();\n};\n// using this function with malformed JSON is undefined behavior\nconst partialParse = (input) => parseJSON(input, Allow.ALL ^ Allow.NUM);\nexport { partialParse, PartialJSON, MalformedJSON };\n//# sourceMappingURL=parser.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _ChatCompletionStream_instances, _ChatCompletionStream_params, _ChatCompletionStream_choiceEventStates, _ChatCompletionStream_currentChatCompletionSnapshot, _ChatCompletionStream_beginRequest, _ChatCompletionStream_getChoiceEventState, _ChatCompletionStream_addChunk, _ChatCompletionStream_emitToolCallDoneEvent, _ChatCompletionStream_emitContentDoneEvents, _ChatCompletionStream_endRequest, _ChatCompletionStream_getAutoParseableResponseFormat, _ChatCompletionStream_accumulateChatCompletion;\nimport { OpenAIError, APIUserAbortError, LengthFinishReasonError, ContentFilterFinishReasonError, } from \"../error.mjs\";\nimport { AbstractChatCompletionRunner, } from \"./AbstractChatCompletionRunner.mjs\";\nimport { Stream } from \"../streaming.mjs\";\nimport { hasAutoParseableInput, isAutoParsableResponseFormat, isAutoParsableTool, maybeParseChatCompletion, shouldParseToolCall, } from \"../lib/parser.mjs\";\nimport { partialParse } from \"../_vendor/partial-json-parser/parser.mjs\";\nexport class ChatCompletionStream extends AbstractChatCompletionRunner {\n constructor(params) {\n super();\n _ChatCompletionStream_instances.add(this);\n _ChatCompletionStream_params.set(this, void 0);\n _ChatCompletionStream_choiceEventStates.set(this, void 0);\n _ChatCompletionStream_currentChatCompletionSnapshot.set(this, void 0);\n __classPrivateFieldSet(this, _ChatCompletionStream_params, params, \"f\");\n __classPrivateFieldSet(this, _ChatCompletionStream_choiceEventStates, [], \"f\");\n }\n get currentChatCompletionSnapshot() {\n return __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n }\n /**\n * Intended for use on the frontend, consuming a stream produced with\n * `.toReadableStream()` on the backend.\n *\n * Note that messages sent to the model do not appear in `.on('message')`\n * in this context.\n */\n static fromReadableStream(stream) {\n const runner = new ChatCompletionStream(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n static createChatCompletion(client, params, options) {\n const runner = new ChatCompletionStream(params);\n runner._run(() => runner._runChatCompletion(client, { ...params, stream: true }, { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } }));\n return runner;\n }\n async _createChatCompletion(client, params, options) {\n super._createChatCompletion;\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_beginRequest).call(this);\n const stream = await client.chat.completions.create({ ...params, stream: true }, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const chunk of stream) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_addChunk).call(this, chunk);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n async _fromReadableStream(readableStream, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_beginRequest).call(this);\n this._connected();\n const stream = Stream.fromReadableStream(readableStream, this.controller);\n let chatId;\n for await (const chunk of stream) {\n if (chatId && chatId !== chunk.id) {\n // A new request has been made.\n this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_addChunk).call(this, chunk);\n chatId = chunk.id;\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n [(_ChatCompletionStream_params = new WeakMap(), _ChatCompletionStream_choiceEventStates = new WeakMap(), _ChatCompletionStream_currentChatCompletionSnapshot = new WeakMap(), _ChatCompletionStream_instances = new WeakSet(), _ChatCompletionStream_beginRequest = function _ChatCompletionStream_beginRequest() {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, \"f\");\n }, _ChatCompletionStream_getChoiceEventState = function _ChatCompletionStream_getChoiceEventState(choice) {\n let state = __classPrivateFieldGet(this, _ChatCompletionStream_choiceEventStates, \"f\")[choice.index];\n if (state) {\n return state;\n }\n state = {\n content_done: false,\n refusal_done: false,\n logprobs_content_done: false,\n logprobs_refusal_done: false,\n done_tool_calls: new Set(),\n current_tool_call_index: null,\n };\n __classPrivateFieldGet(this, _ChatCompletionStream_choiceEventStates, \"f\")[choice.index] = state;\n return state;\n }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk(chunk) {\n if (this.ended)\n return;\n const completion = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_accumulateChatCompletion).call(this, chunk);\n this._emit('chunk', chunk, completion);\n for (const choice of chunk.choices) {\n const choiceSnapshot = completion.choices[choice.index];\n if (choice.delta.content != null &&\n choiceSnapshot.message?.role === 'assistant' &&\n choiceSnapshot.message?.content) {\n this._emit('content', choice.delta.content, choiceSnapshot.message.content);\n this._emit('content.delta', {\n delta: choice.delta.content,\n snapshot: choiceSnapshot.message.content,\n parsed: choiceSnapshot.message.parsed,\n });\n }\n if (choice.delta.refusal != null &&\n choiceSnapshot.message?.role === 'assistant' &&\n choiceSnapshot.message?.refusal) {\n this._emit('refusal.delta', {\n delta: choice.delta.refusal,\n snapshot: choiceSnapshot.message.refusal,\n });\n }\n if (choice.logprobs?.content != null && choiceSnapshot.message?.role === 'assistant') {\n this._emit('logprobs.content.delta', {\n content: choice.logprobs?.content,\n snapshot: choiceSnapshot.logprobs?.content ?? [],\n });\n }\n if (choice.logprobs?.refusal != null && choiceSnapshot.message?.role === 'assistant') {\n this._emit('logprobs.refusal.delta', {\n refusal: choice.logprobs?.refusal,\n snapshot: choiceSnapshot.logprobs?.refusal ?? [],\n });\n }\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (choiceSnapshot.finish_reason) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot);\n if (state.current_tool_call_index != null) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index);\n }\n }\n for (const toolCall of choice.delta.tool_calls ?? []) {\n if (state.current_tool_call_index !== toolCall.index) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot);\n // new tool call started, the previous one is done\n if (state.current_tool_call_index != null) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index);\n }\n }\n state.current_tool_call_index = toolCall.index;\n }\n for (const toolCallDelta of choice.delta.tool_calls ?? []) {\n const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallDelta.index];\n if (!toolCallSnapshot?.type) {\n continue;\n }\n if (toolCallSnapshot?.type === 'function') {\n this._emit('tool_calls.function.arguments.delta', {\n name: toolCallSnapshot.function?.name,\n index: toolCallDelta.index,\n arguments: toolCallSnapshot.function.arguments,\n parsed_arguments: toolCallSnapshot.function.parsed_arguments,\n arguments_delta: toolCallDelta.function?.arguments ?? '',\n });\n }\n else {\n assertNever(toolCallSnapshot?.type);\n }\n }\n }\n }, _ChatCompletionStream_emitToolCallDoneEvent = function _ChatCompletionStream_emitToolCallDoneEvent(choiceSnapshot, toolCallIndex) {\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (state.done_tool_calls.has(toolCallIndex)) {\n // we've already fired the done event\n return;\n }\n const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallIndex];\n if (!toolCallSnapshot) {\n throw new Error('no tool call snapshot');\n }\n if (!toolCallSnapshot.type) {\n throw new Error('tool call snapshot missing `type`');\n }\n if (toolCallSnapshot.type === 'function') {\n const inputTool = __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\")?.tools?.find((tool) => tool.type === 'function' && tool.function.name === toolCallSnapshot.function.name);\n this._emit('tool_calls.function.arguments.done', {\n name: toolCallSnapshot.function.name,\n index: toolCallIndex,\n arguments: toolCallSnapshot.function.arguments,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCallSnapshot.function.arguments)\n : inputTool?.function.strict ? JSON.parse(toolCallSnapshot.function.arguments)\n : null,\n });\n }\n else {\n assertNever(toolCallSnapshot.type);\n }\n }, _ChatCompletionStream_emitContentDoneEvents = function _ChatCompletionStream_emitContentDoneEvents(choiceSnapshot) {\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (choiceSnapshot.message.content && !state.content_done) {\n state.content_done = true;\n const responseFormat = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getAutoParseableResponseFormat).call(this);\n this._emit('content.done', {\n content: choiceSnapshot.message.content,\n parsed: responseFormat ? responseFormat.$parseRaw(choiceSnapshot.message.content) : null,\n });\n }\n if (choiceSnapshot.message.refusal && !state.refusal_done) {\n state.refusal_done = true;\n this._emit('refusal.done', { refusal: choiceSnapshot.message.refusal });\n }\n if (choiceSnapshot.logprobs?.content && !state.logprobs_content_done) {\n state.logprobs_content_done = true;\n this._emit('logprobs.content.done', { content: choiceSnapshot.logprobs.content });\n }\n if (choiceSnapshot.logprobs?.refusal && !state.logprobs_refusal_done) {\n state.logprobs_refusal_done = true;\n this._emit('logprobs.refusal.done', { refusal: choiceSnapshot.logprobs.refusal });\n }\n }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any chunks`);\n }\n __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, \"f\");\n __classPrivateFieldSet(this, _ChatCompletionStream_choiceEventStates, [], \"f\");\n return finalizeChatCompletion(snapshot, __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"));\n }, _ChatCompletionStream_getAutoParseableResponseFormat = function _ChatCompletionStream_getAutoParseableResponseFormat() {\n const responseFormat = __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\")?.response_format;\n if (isAutoParsableResponseFormat(responseFormat)) {\n return responseFormat;\n }\n return null;\n }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion(chunk) {\n var _a, _b, _c, _d;\n let snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n const { choices, ...rest } = chunk;\n if (!snapshot) {\n snapshot = __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, {\n ...rest,\n choices: [],\n }, \"f\");\n }\n else {\n Object.assign(snapshot, rest);\n }\n for (const { delta, finish_reason, index, logprobs = null, ...other } of chunk.choices) {\n let choice = snapshot.choices[index];\n if (!choice) {\n choice = snapshot.choices[index] = { finish_reason, index, message: {}, logprobs, ...other };\n }\n if (logprobs) {\n if (!choice.logprobs) {\n choice.logprobs = Object.assign({}, logprobs);\n }\n else {\n const { content, refusal, ...rest } = logprobs;\n assertIsEmpty(rest);\n Object.assign(choice.logprobs, rest);\n if (content) {\n (_a = choice.logprobs).content ?? (_a.content = []);\n choice.logprobs.content.push(...content);\n }\n if (refusal) {\n (_b = choice.logprobs).refusal ?? (_b.refusal = []);\n choice.logprobs.refusal.push(...refusal);\n }\n }\n }\n if (finish_reason) {\n choice.finish_reason = finish_reason;\n if (__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\") && hasAutoParseableInput(__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"))) {\n if (finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n if (finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n }\n }\n Object.assign(choice, other);\n if (!delta)\n continue; // Shouldn't happen; just in case.\n const { content, refusal, function_call, role, tool_calls, ...rest } = delta;\n assertIsEmpty(rest);\n Object.assign(choice.message, rest);\n if (refusal) {\n choice.message.refusal = (choice.message.refusal || '') + refusal;\n }\n if (role)\n choice.message.role = role;\n if (function_call) {\n if (!choice.message.function_call) {\n choice.message.function_call = function_call;\n }\n else {\n if (function_call.name)\n choice.message.function_call.name = function_call.name;\n if (function_call.arguments) {\n (_c = choice.message.function_call).arguments ?? (_c.arguments = '');\n choice.message.function_call.arguments += function_call.arguments;\n }\n }\n }\n if (content) {\n choice.message.content = (choice.message.content || '') + content;\n if (!choice.message.refusal && __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getAutoParseableResponseFormat).call(this)) {\n choice.message.parsed = partialParse(choice.message.content);\n }\n }\n if (tool_calls) {\n if (!choice.message.tool_calls)\n choice.message.tool_calls = [];\n for (const { index, id, type, function: fn, ...rest } of tool_calls) {\n const tool_call = ((_d = choice.message.tool_calls)[index] ?? (_d[index] = {}));\n Object.assign(tool_call, rest);\n if (id)\n tool_call.id = id;\n if (type)\n tool_call.type = type;\n if (fn)\n tool_call.function ?? (tool_call.function = { name: fn.name ?? '', arguments: '' });\n if (fn?.name)\n tool_call.function.name = fn.name;\n if (fn?.arguments) {\n tool_call.function.arguments += fn.arguments;\n if (shouldParseToolCall(__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"), tool_call)) {\n tool_call.function.parsed_arguments = partialParse(tool_call.function.arguments);\n }\n }\n }\n }\n }\n return snapshot;\n }, Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n this.on('chunk', (chunk) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(chunk);\n }\n else {\n pushQueue.push(chunk);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift();\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n toReadableStream() {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n}\nfunction finalizeChatCompletion(snapshot, params) {\n const { id, choices, created, model, system_fingerprint, ...rest } = snapshot;\n const completion = {\n ...rest,\n id,\n choices: choices.map(({ message, finish_reason, index, logprobs, ...choiceRest }) => {\n if (!finish_reason) {\n throw new OpenAIError(`missing finish_reason for choice ${index}`);\n }\n const { content = null, function_call, tool_calls, ...messageRest } = message;\n const role = message.role; // this is what we expect; in theory it could be different which would make our types a slight lie but would be fine.\n if (!role) {\n throw new OpenAIError(`missing role for choice ${index}`);\n }\n if (function_call) {\n const { arguments: args, name } = function_call;\n if (args == null) {\n throw new OpenAIError(`missing function_call.arguments for choice ${index}`);\n }\n if (!name) {\n throw new OpenAIError(`missing function_call.name for choice ${index}`);\n }\n return {\n ...choiceRest,\n message: {\n content,\n function_call: { arguments: args, name },\n role,\n refusal: message.refusal ?? null,\n },\n finish_reason,\n index,\n logprobs,\n };\n }\n if (tool_calls) {\n return {\n ...choiceRest,\n index,\n finish_reason,\n logprobs,\n message: {\n ...messageRest,\n role,\n content,\n refusal: message.refusal ?? null,\n tool_calls: tool_calls.map((tool_call, i) => {\n const { function: fn, type, id, ...toolRest } = tool_call;\n const { arguments: args, name, ...fnRest } = fn || {};\n if (id == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].id\\n${str(snapshot)}`);\n }\n if (type == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].type\\n${str(snapshot)}`);\n }\n if (name == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].function.name\\n${str(snapshot)}`);\n }\n if (args == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].function.arguments\\n${str(snapshot)}`);\n }\n return { ...toolRest, id, type, function: { ...fnRest, name, arguments: args } };\n }),\n },\n };\n }\n return {\n ...choiceRest,\n message: { ...messageRest, content, role, refusal: message.refusal ?? null },\n finish_reason,\n index,\n logprobs,\n };\n }),\n created,\n model,\n object: 'chat.completion',\n ...(system_fingerprint ? { system_fingerprint } : {}),\n };\n return maybeParseChatCompletion(completion, params);\n}\nfunction str(x) {\n return JSON.stringify(x);\n}\n/**\n * Ensures the given argument is an empty object, useful for\n * asserting that all known properties on an object have been\n * destructured.\n */\nfunction assertIsEmpty(obj) {\n return;\n}\nfunction assertNever(_x) { }\n//# sourceMappingURL=ChatCompletionStream.mjs.map","import { ChatCompletionStream } from \"./ChatCompletionStream.mjs\";\nexport class ChatCompletionStreamingRunner extends ChatCompletionStream {\n static fromReadableStream(stream) {\n const runner = new ChatCompletionStreamingRunner(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n /** @deprecated - please use `runTools` instead. */\n static runFunctions(client, params, options) {\n const runner = new ChatCompletionStreamingRunner(null);\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' },\n };\n runner._run(() => runner._runFunctions(client, params, opts));\n return runner;\n }\n static runTools(client, params, options) {\n const runner = new ChatCompletionStreamingRunner(\n // @ts-expect-error TODO these types are incompatible\n params);\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' },\n };\n runner._run(() => runner._runTools(client, params, opts));\n return runner;\n }\n}\n//# sourceMappingURL=ChatCompletionStreamingRunner.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { ChatCompletionRunner } from \"../../../lib/ChatCompletionRunner.mjs\";\nimport { ChatCompletionStreamingRunner, } from \"../../../lib/ChatCompletionStreamingRunner.mjs\";\nimport { ChatCompletionStream } from \"../../../lib/ChatCompletionStream.mjs\";\nimport { parseChatCompletion, validateInputTools } from \"../../../lib/parser.mjs\";\nexport { ChatCompletionStreamingRunner, } from \"../../../lib/ChatCompletionStreamingRunner.mjs\";\nexport { ParsingFunction, ParsingToolFunction, } from \"../../../lib/RunnableFunction.mjs\";\nexport { ChatCompletionStream } from \"../../../lib/ChatCompletionStream.mjs\";\nexport { ChatCompletionRunner, } from \"../../../lib/ChatCompletionRunner.mjs\";\nexport class Completions extends APIResource {\n parse(body, options) {\n validateInputTools(body.tools);\n return this._client.chat.completions\n .create(body, {\n ...options,\n headers: {\n ...options?.headers,\n 'X-Stainless-Helper-Method': 'beta.chat.completions.parse',\n },\n })\n ._thenUnwrap((completion) => parseChatCompletion(completion, body));\n }\n runFunctions(body, options) {\n if (body.stream) {\n return ChatCompletionStreamingRunner.runFunctions(this._client, body, options);\n }\n return ChatCompletionRunner.runFunctions(this._client, body, options);\n }\n runTools(body, options) {\n if (body.stream) {\n return ChatCompletionStreamingRunner.runTools(this._client, body, options);\n }\n return ChatCompletionRunner.runTools(this._client, body, options);\n }\n /**\n * Creates a chat completion stream\n */\n stream(body, options) {\n return ChatCompletionStream.createChatCompletion(this._client, body, options);\n }\n}\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as CompletionsAPI from \"./completions.mjs\";\nexport class Chat extends APIResource {\n constructor() {\n super(...arguments);\n this.completions = new CompletionsAPI.Completions(this._client);\n }\n}\n(function (Chat) {\n Chat.Completions = CompletionsAPI.Completions;\n})(Chat || (Chat = {}));\n//# sourceMappingURL=chat.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Sessions extends APIResource {\n /**\n * Create an ephemeral API token for use in client-side applications with the\n * Realtime API. Can be configured with the same session parameters as the\n * `session.update` client event.\n *\n * It responds with a session object, plus a `client_secret` key which contains a\n * usable ephemeral API token that can be used to authenticate browser clients for\n * the Realtime API.\n *\n * @example\n * ```ts\n * const session =\n * await client.beta.realtime.sessions.create();\n * ```\n */\n create(body, options) {\n return this._client.post('/realtime/sessions', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\n//# sourceMappingURL=sessions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class TranscriptionSessions extends APIResource {\n /**\n * Create an ephemeral API token for use in client-side applications with the\n * Realtime API specifically for realtime transcriptions. Can be configured with\n * the same session parameters as the `transcription_session.update` client event.\n *\n * It responds with a session object, plus a `client_secret` key which contains a\n * usable ephemeral API token that can be used to authenticate browser clients for\n * the Realtime API.\n *\n * @example\n * ```ts\n * const transcriptionSession =\n * await client.beta.realtime.transcriptionSessions.create();\n * ```\n */\n create(body, options) {\n return this._client.post('/realtime/transcription_sessions', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\n//# sourceMappingURL=transcription-sessions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as SessionsAPI from \"./sessions.mjs\";\nimport { Sessions, } from \"./sessions.mjs\";\nimport * as TranscriptionSessionsAPI from \"./transcription-sessions.mjs\";\nimport { TranscriptionSessions, } from \"./transcription-sessions.mjs\";\nexport class Realtime extends APIResource {\n constructor() {\n super(...arguments);\n this.sessions = new SessionsAPI.Sessions(this._client);\n this.transcriptionSessions = new TranscriptionSessionsAPI.TranscriptionSessions(this._client);\n }\n}\nRealtime.Sessions = Sessions;\nRealtime.TranscriptionSessions = TranscriptionSessions;\n//# sourceMappingURL=realtime.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Messages extends APIResource {\n /**\n * Create a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n create(threadId, body, options) {\n return this._client.post(`/threads/${threadId}/messages`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieve a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, messageId, options) {\n return this._client.get(`/threads/${threadId}/messages/${messageId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, messageId, body, options) {\n return this._client.post(`/threads/${threadId}/messages/${messageId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/messages`, MessagesPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Deletes a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n del(threadId, messageId, options) {\n return this._client.delete(`/threads/${threadId}/messages/${messageId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class MessagesPage extends CursorPage {\n}\nMessages.MessagesPage = MessagesPage;\n//# sourceMappingURL=messages.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../../core.mjs\";\nimport { CursorPage } from \"../../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Steps extends APIResource {\n retrieve(threadId, runId, stepId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.retrieve(threadId, runId, stepId, {}, query);\n }\n return this._client.get(`/threads/${threadId}/runs/${runId}/steps/${stepId}`, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, runId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, runId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/runs/${runId}/steps`, RunStepsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class RunStepsPage extends CursorPage {\n}\nSteps.RunStepsPage = RunStepsPage;\n//# sourceMappingURL=steps.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../../core.mjs\";\nimport { AssistantStream } from \"../../../../lib/AssistantStream.mjs\";\nimport { sleep } from \"../../../../core.mjs\";\nimport * as StepsAPI from \"./steps.mjs\";\nimport { RunStepsPage, Steps, } from \"./steps.mjs\";\nimport { CursorPage } from \"../../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Runs extends APIResource {\n constructor() {\n super(...arguments);\n this.steps = new StepsAPI.Steps(this._client);\n }\n create(threadId, params, options) {\n const { include, ...body } = params;\n return this._client.post(`/threads/${threadId}/runs`, {\n query: { include },\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: params.stream ?? false,\n });\n }\n /**\n * Retrieves a run.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, runId, options) {\n return this._client.get(`/threads/${threadId}/runs/${runId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a run.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, runId, body, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/runs`, RunsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Cancels a run that is `in_progress`.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n cancel(threadId, runId, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}/cancel`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * A helper to create a run an poll for a terminal state. More information on Run\n * lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async createAndPoll(threadId, body, options) {\n const run = await this.create(threadId, body, options);\n return await this.poll(threadId, run.id, options);\n }\n /**\n * Create a Run stream\n *\n * @deprecated use `stream` instead\n */\n createAndStream(threadId, body, options) {\n return AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options);\n }\n /**\n * A helper to poll a run status until it reaches a terminal state. More\n * information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async poll(threadId, runId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const { data: run, response } = await this.retrieve(threadId, runId, {\n ...options,\n headers: { ...options?.headers, ...headers },\n }).withResponse();\n switch (run.status) {\n //If we are in any sort of intermediate state we poll\n case 'queued':\n case 'in_progress':\n case 'cancelling':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n //We return the run in any terminal state.\n case 'requires_action':\n case 'incomplete':\n case 'cancelled':\n case 'completed':\n case 'failed':\n case 'expired':\n return run;\n }\n }\n }\n /**\n * Create a Run stream\n */\n stream(threadId, body, options) {\n return AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options);\n }\n submitToolOutputs(threadId, runId, body, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}/submit_tool_outputs`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: body.stream ?? false,\n });\n }\n /**\n * A helper to submit a tool output to a run and poll for a terminal run state.\n * More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async submitToolOutputsAndPoll(threadId, runId, body, options) {\n const run = await this.submitToolOutputs(threadId, runId, body, options);\n return await this.poll(threadId, run.id, options);\n }\n /**\n * Submit the tool outputs from a previous run and stream the run to a terminal\n * state. More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n submitToolOutputsStream(threadId, runId, body, options) {\n return AssistantStream.createToolAssistantStream(threadId, runId, this._client.beta.threads.runs, body, options);\n }\n}\nexport class RunsPage extends CursorPage {\n}\nRuns.RunsPage = RunsPage;\nRuns.Steps = Steps;\nRuns.RunStepsPage = RunStepsPage;\n//# sourceMappingURL=runs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { AssistantStream } from \"../../../lib/AssistantStream.mjs\";\nimport * as MessagesAPI from \"./messages.mjs\";\nimport { Messages, MessagesPage, } from \"./messages.mjs\";\nimport * as RunsAPI from \"./runs/runs.mjs\";\nimport { Runs, RunsPage, } from \"./runs/runs.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Threads extends APIResource {\n constructor() {\n super(...arguments);\n this.runs = new RunsAPI.Runs(this._client);\n this.messages = new MessagesAPI.Messages(this._client);\n }\n create(body = {}, options) {\n if (isRequestOptions(body)) {\n return this.create({}, body);\n }\n return this._client.post('/threads', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, options) {\n return this._client.get(`/threads/${threadId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, body, options) {\n return this._client.post(`/threads/${threadId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n del(threadId, options) {\n return this._client.delete(`/threads/${threadId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n createAndRun(body, options) {\n return this._client.post('/threads/runs', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: body.stream ?? false,\n });\n }\n /**\n * A helper to create a thread, start a run and then poll for a terminal state.\n * More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async createAndRunPoll(body, options) {\n const run = await this.createAndRun(body, options);\n return await this.runs.poll(run.thread_id, run.id, options);\n }\n /**\n * Create a thread and stream the run back\n */\n createAndRunStream(body, options) {\n return AssistantStream.createThreadAssistantStream(body, this._client.beta.threads, options);\n }\n}\nThreads.Runs = Runs;\nThreads.RunsPage = RunsPage;\nThreads.Messages = Messages;\nThreads.MessagesPage = MessagesPage;\n//# sourceMappingURL=threads.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as AssistantsAPI from \"./assistants.mjs\";\nimport * as ChatAPI from \"./chat/chat.mjs\";\nimport { Assistants, AssistantsPage, } from \"./assistants.mjs\";\nimport * as RealtimeAPI from \"./realtime/realtime.mjs\";\nimport { Realtime, } from \"./realtime/realtime.mjs\";\nimport * as ThreadsAPI from \"./threads/threads.mjs\";\nimport { Threads, } from \"./threads/threads.mjs\";\nimport { Chat } from \"./chat/chat.mjs\";\nexport class Beta extends APIResource {\n constructor() {\n super(...arguments);\n this.realtime = new RealtimeAPI.Realtime(this._client);\n this.chat = new ChatAPI.Chat(this._client);\n this.assistants = new AssistantsAPI.Assistants(this._client);\n this.threads = new ThreadsAPI.Threads(this._client);\n }\n}\nBeta.Realtime = Realtime;\nBeta.Assistants = Assistants;\nBeta.AssistantsPage = AssistantsPage;\nBeta.Threads = Threads;\n//# sourceMappingURL=beta.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nexport class Completions extends APIResource {\n create(body, options) {\n return this._client.post('/completions', { body, ...options, stream: body.stream ?? false });\n }\n}\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Content extends APIResource {\n /**\n * Retrieve Container File Content\n */\n retrieve(containerId, fileId, options) {\n return this._client.get(`/containers/${containerId}/files/${fileId}/content`, {\n ...options,\n headers: { Accept: 'application/binary', ...options?.headers },\n __binaryResponse: true,\n });\n }\n}\n//# sourceMappingURL=content.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as Core from \"../../../core.mjs\";\nimport * as ContentAPI from \"./content.mjs\";\nimport { Content } from \"./content.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Files extends APIResource {\n constructor() {\n super(...arguments);\n this.content = new ContentAPI.Content(this._client);\n }\n /**\n * Create a Container File\n *\n * You can send either a multipart/form-data request with the raw file content, or\n * a JSON request with a file ID.\n */\n create(containerId, body, options) {\n return this._client.post(`/containers/${containerId}/files`, Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Retrieve Container File\n */\n retrieve(containerId, fileId, options) {\n return this._client.get(`/containers/${containerId}/files/${fileId}`, options);\n }\n list(containerId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(containerId, {}, query);\n }\n return this._client.getAPIList(`/containers/${containerId}/files`, FileListResponsesPage, {\n query,\n ...options,\n });\n }\n /**\n * Delete Container File\n */\n del(containerId, fileId, options) {\n return this._client.delete(`/containers/${containerId}/files/${fileId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class FileListResponsesPage extends CursorPage {\n}\nFiles.FileListResponsesPage = FileListResponsesPage;\nFiles.Content = Content;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as FilesAPI from \"./files/files.mjs\";\nimport { FileListResponsesPage, Files, } from \"./files/files.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Containers extends APIResource {\n constructor() {\n super(...arguments);\n this.files = new FilesAPI.Files(this._client);\n }\n /**\n * Create Container\n */\n create(body, options) {\n return this._client.post('/containers', { body, ...options });\n }\n /**\n * Retrieve Container\n */\n retrieve(containerId, options) {\n return this._client.get(`/containers/${containerId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/containers', ContainerListResponsesPage, { query, ...options });\n }\n /**\n * Delete Container\n */\n del(containerId, options) {\n return this._client.delete(`/containers/${containerId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class ContainerListResponsesPage extends CursorPage {\n}\nContainers.ContainerListResponsesPage = ContainerListResponsesPage;\nContainers.Files = Files;\nContainers.FileListResponsesPage = FileListResponsesPage;\n//# sourceMappingURL=containers.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport * as Core from \"../core.mjs\";\nexport class Embeddings extends APIResource {\n /**\n * Creates an embedding vector representing the input text.\n *\n * @example\n * ```ts\n * const createEmbeddingResponse =\n * await client.embeddings.create({\n * input: 'The quick brown fox jumped over the lazy dog',\n * model: 'text-embedding-3-small',\n * });\n * ```\n */\n create(body, options) {\n const hasUserProvidedEncodingFormat = !!body.encoding_format;\n // No encoding_format specified, defaulting to base64 for performance reasons\n // See https://github.com/openai/openai-node/pull/1312\n let encoding_format = hasUserProvidedEncodingFormat ? body.encoding_format : 'base64';\n if (hasUserProvidedEncodingFormat) {\n Core.debug('Request', 'User defined encoding_format:', body.encoding_format);\n }\n const response = this._client.post('/embeddings', {\n body: {\n ...body,\n encoding_format: encoding_format,\n },\n ...options,\n });\n // if the user specified an encoding_format, return the response as-is\n if (hasUserProvidedEncodingFormat) {\n return response;\n }\n // in this stage, we are sure the user did not specify an encoding_format\n // and we defaulted to base64 for performance reasons\n // we are sure then that the response is base64 encoded, let's decode it\n // the returned result will be a float32 array since this is OpenAI API's default encoding\n Core.debug('response', 'Decoding base64 embeddings to float32 array');\n return response._thenUnwrap((response) => {\n if (response && response.data) {\n response.data.forEach((embeddingBase64Obj) => {\n const embeddingBase64Str = embeddingBase64Obj.embedding;\n embeddingBase64Obj.embedding = Core.toFloat32Array(embeddingBase64Str);\n });\n }\n return response;\n });\n }\n}\n//# sourceMappingURL=embeddings.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class OutputItems extends APIResource {\n /**\n * Get an evaluation run output item by ID.\n */\n retrieve(evalId, runId, outputItemId, options) {\n return this._client.get(`/evals/${evalId}/runs/${runId}/output_items/${outputItemId}`, options);\n }\n list(evalId, runId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(evalId, runId, {}, query);\n }\n return this._client.getAPIList(`/evals/${evalId}/runs/${runId}/output_items`, OutputItemListResponsesPage, { query, ...options });\n }\n}\nexport class OutputItemListResponsesPage extends CursorPage {\n}\nOutputItems.OutputItemListResponsesPage = OutputItemListResponsesPage;\n//# sourceMappingURL=output-items.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as OutputItemsAPI from \"./output-items.mjs\";\nimport { OutputItemListResponsesPage, OutputItems, } from \"./output-items.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Runs extends APIResource {\n constructor() {\n super(...arguments);\n this.outputItems = new OutputItemsAPI.OutputItems(this._client);\n }\n /**\n * Kicks off a new run for a given evaluation, specifying the data source, and what\n * model configuration to use to test. The datasource will be validated against the\n * schema specified in the config of the evaluation.\n */\n create(evalId, body, options) {\n return this._client.post(`/evals/${evalId}/runs`, { body, ...options });\n }\n /**\n * Get an evaluation run by ID.\n */\n retrieve(evalId, runId, options) {\n return this._client.get(`/evals/${evalId}/runs/${runId}`, options);\n }\n list(evalId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(evalId, {}, query);\n }\n return this._client.getAPIList(`/evals/${evalId}/runs`, RunListResponsesPage, { query, ...options });\n }\n /**\n * Delete an eval run.\n */\n del(evalId, runId, options) {\n return this._client.delete(`/evals/${evalId}/runs/${runId}`, options);\n }\n /**\n * Cancel an ongoing evaluation run.\n */\n cancel(evalId, runId, options) {\n return this._client.post(`/evals/${evalId}/runs/${runId}`, options);\n }\n}\nexport class RunListResponsesPage extends CursorPage {\n}\nRuns.RunListResponsesPage = RunListResponsesPage;\nRuns.OutputItems = OutputItems;\nRuns.OutputItemListResponsesPage = OutputItemListResponsesPage;\n//# sourceMappingURL=runs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as RunsAPI from \"./runs/runs.mjs\";\nimport { RunListResponsesPage, Runs, } from \"./runs/runs.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Evals extends APIResource {\n constructor() {\n super(...arguments);\n this.runs = new RunsAPI.Runs(this._client);\n }\n /**\n * Create the structure of an evaluation that can be used to test a model's\n * performance. An evaluation is a set of testing criteria and the config for a\n * data source, which dictates the schema of the data used in the evaluation. After\n * creating an evaluation, you can run it on different models and model parameters.\n * We support several types of graders and datasources. For more information, see\n * the [Evals guide](https://platform.openai.com/docs/guides/evals).\n */\n create(body, options) {\n return this._client.post('/evals', { body, ...options });\n }\n /**\n * Get an evaluation by ID.\n */\n retrieve(evalId, options) {\n return this._client.get(`/evals/${evalId}`, options);\n }\n /**\n * Update certain properties of an evaluation.\n */\n update(evalId, body, options) {\n return this._client.post(`/evals/${evalId}`, { body, ...options });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/evals', EvalListResponsesPage, { query, ...options });\n }\n /**\n * Delete an evaluation.\n */\n del(evalId, options) {\n return this._client.delete(`/evals/${evalId}`, options);\n }\n}\nexport class EvalListResponsesPage extends CursorPage {\n}\nEvals.EvalListResponsesPage = EvalListResponsesPage;\nEvals.Runs = Runs;\nEvals.RunListResponsesPage = RunListResponsesPage;\n//# sourceMappingURL=evals.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { isRequestOptions } from \"../core.mjs\";\nimport { sleep } from \"../core.mjs\";\nimport { APIConnectionTimeoutError } from \"../error.mjs\";\nimport * as Core from \"../core.mjs\";\nimport { CursorPage } from \"../pagination.mjs\";\nexport class Files extends APIResource {\n /**\n * Upload a file that can be used across various endpoints. Individual files can be\n * up to 512 MB, and the size of all files uploaded by one organization can be up\n * to 100 GB.\n *\n * The Assistants API supports files up to 2 million tokens and of specific file\n * types. See the\n * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) for\n * details.\n *\n * The Fine-tuning API only supports `.jsonl` files. The input also has certain\n * required formats for fine-tuning\n * [chat](https://platform.openai.com/docs/api-reference/fine-tuning/chat-input) or\n * [completions](https://platform.openai.com/docs/api-reference/fine-tuning/completions-input)\n * models.\n *\n * The Batch API only supports `.jsonl` files up to 200 MB in size. The input also\n * has a specific required\n * [format](https://platform.openai.com/docs/api-reference/batch/request-input).\n *\n * Please [contact us](https://help.openai.com/) if you need to increase these\n * storage limits.\n */\n create(body, options) {\n return this._client.post('/files', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Returns information about a specific file.\n */\n retrieve(fileId, options) {\n return this._client.get(`/files/${fileId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/files', FileObjectsPage, { query, ...options });\n }\n /**\n * Delete a file.\n */\n del(fileId, options) {\n return this._client.delete(`/files/${fileId}`, options);\n }\n /**\n * Returns the contents of the specified file.\n */\n content(fileId, options) {\n return this._client.get(`/files/${fileId}/content`, {\n ...options,\n headers: { Accept: 'application/binary', ...options?.headers },\n __binaryResponse: true,\n });\n }\n /**\n * Returns the contents of the specified file.\n *\n * @deprecated The `.content()` method should be used instead\n */\n retrieveContent(fileId, options) {\n return this._client.get(`/files/${fileId}/content`, options);\n }\n /**\n * Waits for the given file to be processed, default timeout is 30 mins.\n */\n async waitForProcessing(id, { pollInterval = 5000, maxWait = 30 * 60 * 1000 } = {}) {\n const TERMINAL_STATES = new Set(['processed', 'error', 'deleted']);\n const start = Date.now();\n let file = await this.retrieve(id);\n while (!file.status || !TERMINAL_STATES.has(file.status)) {\n await sleep(pollInterval);\n file = await this.retrieve(id);\n if (Date.now() - start > maxWait) {\n throw new APIConnectionTimeoutError({\n message: `Giving up on waiting for file ${id} to finish processing after ${maxWait} milliseconds.`,\n });\n }\n }\n return file;\n }\n}\nexport class FileObjectsPage extends CursorPage {\n}\nFiles.FileObjectsPage = FileObjectsPage;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class Methods extends APIResource {\n}\n//# sourceMappingURL=methods.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Graders extends APIResource {\n /**\n * Run a grader.\n *\n * @example\n * ```ts\n * const response = await client.fineTuning.alpha.graders.run({\n * grader: {\n * input: 'input',\n * name: 'name',\n * operation: 'eq',\n * reference: 'reference',\n * type: 'string_check',\n * },\n * model_sample: 'model_sample',\n * reference_answer: 'string',\n * });\n * ```\n */\n run(body, options) {\n return this._client.post('/fine_tuning/alpha/graders/run', { body, ...options });\n }\n /**\n * Validate a grader.\n *\n * @example\n * ```ts\n * const response =\n * await client.fineTuning.alpha.graders.validate({\n * grader: {\n * input: 'input',\n * name: 'name',\n * operation: 'eq',\n * reference: 'reference',\n * type: 'string_check',\n * },\n * });\n * ```\n */\n validate(body, options) {\n return this._client.post('/fine_tuning/alpha/graders/validate', { body, ...options });\n }\n}\n//# sourceMappingURL=graders.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as GradersAPI from \"./graders.mjs\";\nimport { Graders, } from \"./graders.mjs\";\nexport class Alpha extends APIResource {\n constructor() {\n super(...arguments);\n this.graders = new GradersAPI.Graders(this._client);\n }\n}\nAlpha.Graders = Graders;\n//# sourceMappingURL=alpha.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { Page } from \"../../../pagination.mjs\";\nexport class Permissions extends APIResource {\n /**\n * **NOTE:** Calling this endpoint requires an [admin API key](../admin-api-keys).\n *\n * This enables organization owners to share fine-tuned models with other projects\n * in their organization.\n *\n * @example\n * ```ts\n * // Automatically fetches more pages as needed.\n * for await (const permissionCreateResponse of client.fineTuning.checkpoints.permissions.create(\n * 'ft:gpt-4o-mini-2024-07-18:org:weather:B7R9VjQd',\n * { project_ids: ['string'] },\n * )) {\n * // ...\n * }\n * ```\n */\n create(fineTunedModelCheckpoint, body, options) {\n return this._client.getAPIList(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, PermissionCreateResponsesPage, { body, method: 'post', ...options });\n }\n retrieve(fineTunedModelCheckpoint, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.retrieve(fineTunedModelCheckpoint, {}, query);\n }\n return this._client.get(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, {\n query,\n ...options,\n });\n }\n /**\n * **NOTE:** This endpoint requires an [admin API key](../admin-api-keys).\n *\n * Organization owners can use this endpoint to delete a permission for a\n * fine-tuned model checkpoint.\n *\n * @example\n * ```ts\n * const permission =\n * await client.fineTuning.checkpoints.permissions.del(\n * 'ft:gpt-4o-mini-2024-07-18:org:weather:B7R9VjQd',\n * 'cp_zc4Q7MP6XxulcVzj4MZdwsAB',\n * );\n * ```\n */\n del(fineTunedModelCheckpoint, permissionId, options) {\n return this._client.delete(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions/${permissionId}`, options);\n }\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class PermissionCreateResponsesPage extends Page {\n}\nPermissions.PermissionCreateResponsesPage = PermissionCreateResponsesPage;\n//# sourceMappingURL=permissions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as PermissionsAPI from \"./permissions.mjs\";\nimport { PermissionCreateResponsesPage, Permissions, } from \"./permissions.mjs\";\nexport class Checkpoints extends APIResource {\n constructor() {\n super(...arguments);\n this.permissions = new PermissionsAPI.Permissions(this._client);\n }\n}\nCheckpoints.Permissions = Permissions;\nCheckpoints.PermissionCreateResponsesPage = PermissionCreateResponsesPage;\n//# sourceMappingURL=checkpoints.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Checkpoints extends APIResource {\n list(fineTuningJobId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(fineTuningJobId, {}, query);\n }\n return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/checkpoints`, FineTuningJobCheckpointsPage, { query, ...options });\n }\n}\nexport class FineTuningJobCheckpointsPage extends CursorPage {\n}\nCheckpoints.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage;\n//# sourceMappingURL=checkpoints.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as CheckpointsAPI from \"./checkpoints.mjs\";\nimport { Checkpoints, FineTuningJobCheckpointsPage, } from \"./checkpoints.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Jobs extends APIResource {\n constructor() {\n super(...arguments);\n this.checkpoints = new CheckpointsAPI.Checkpoints(this._client);\n }\n /**\n * Creates a fine-tuning job which begins the process of creating a new model from\n * a given dataset.\n *\n * Response includes details of the enqueued job including job status and the name\n * of the fine-tuned models once complete.\n *\n * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning)\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.create({\n * model: 'gpt-4o-mini',\n * training_file: 'file-abc123',\n * });\n * ```\n */\n create(body, options) {\n return this._client.post('/fine_tuning/jobs', { body, ...options });\n }\n /**\n * Get info about a fine-tuning job.\n *\n * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning)\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.retrieve(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n retrieve(fineTuningJobId, options) {\n return this._client.get(`/fine_tuning/jobs/${fineTuningJobId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/fine_tuning/jobs', FineTuningJobsPage, { query, ...options });\n }\n /**\n * Immediately cancel a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.cancel(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n cancel(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/cancel`, options);\n }\n listEvents(fineTuningJobId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.listEvents(fineTuningJobId, {}, query);\n }\n return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/events`, FineTuningJobEventsPage, {\n query,\n ...options,\n });\n }\n /**\n * Pause a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.pause(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n pause(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/pause`, options);\n }\n /**\n * Resume a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.resume(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n resume(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/resume`, options);\n }\n}\nexport class FineTuningJobsPage extends CursorPage {\n}\nexport class FineTuningJobEventsPage extends CursorPage {\n}\nJobs.FineTuningJobsPage = FineTuningJobsPage;\nJobs.FineTuningJobEventsPage = FineTuningJobEventsPage;\nJobs.Checkpoints = Checkpoints;\nJobs.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage;\n//# sourceMappingURL=jobs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as MethodsAPI from \"./methods.mjs\";\nimport { Methods, } from \"./methods.mjs\";\nimport * as AlphaAPI from \"./alpha/alpha.mjs\";\nimport { Alpha } from \"./alpha/alpha.mjs\";\nimport * as CheckpointsAPI from \"./checkpoints/checkpoints.mjs\";\nimport { Checkpoints } from \"./checkpoints/checkpoints.mjs\";\nimport * as JobsAPI from \"./jobs/jobs.mjs\";\nimport { FineTuningJobEventsPage, FineTuningJobsPage, Jobs, } from \"./jobs/jobs.mjs\";\nexport class FineTuning extends APIResource {\n constructor() {\n super(...arguments);\n this.methods = new MethodsAPI.Methods(this._client);\n this.jobs = new JobsAPI.Jobs(this._client);\n this.checkpoints = new CheckpointsAPI.Checkpoints(this._client);\n this.alpha = new AlphaAPI.Alpha(this._client);\n }\n}\nFineTuning.Methods = Methods;\nFineTuning.Jobs = Jobs;\nFineTuning.FineTuningJobsPage = FineTuningJobsPage;\nFineTuning.FineTuningJobEventsPage = FineTuningJobEventsPage;\nFineTuning.Checkpoints = Checkpoints;\nFineTuning.Alpha = Alpha;\n//# sourceMappingURL=fine-tuning.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class GraderModels extends APIResource {\n}\n//# sourceMappingURL=grader-models.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as GraderModelsAPI from \"./grader-models.mjs\";\nimport { GraderModels, } from \"./grader-models.mjs\";\nexport class Graders extends APIResource {\n constructor() {\n super(...arguments);\n this.graderModels = new GraderModelsAPI.GraderModels(this._client);\n }\n}\nGraders.GraderModels = GraderModels;\n//# sourceMappingURL=graders.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport * as Core from \"../core.mjs\";\nexport class Images extends APIResource {\n /**\n * Creates a variation of a given image. This endpoint only supports `dall-e-2`.\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.createVariation({\n * image: fs.createReadStream('otter.png'),\n * });\n * ```\n */\n createVariation(body, options) {\n return this._client.post('/images/variations', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Creates an edited or extended image given one or more source images and a\n * prompt. This endpoint only supports `gpt-image-1` and `dall-e-2`.\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.edit({\n * image: fs.createReadStream('path/to/file'),\n * prompt: 'A cute baby sea otter wearing a beret',\n * });\n * ```\n */\n edit(body, options) {\n return this._client.post('/images/edits', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Creates an image given a prompt.\n * [Learn more](https://platform.openai.com/docs/guides/images).\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.generate({\n * prompt: 'A cute baby sea otter',\n * });\n * ```\n */\n generate(body, options) {\n return this._client.post('/images/generations', { body, ...options });\n }\n}\n//# sourceMappingURL=images.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { Page } from \"../pagination.mjs\";\nexport class Models extends APIResource {\n /**\n * Retrieves a model instance, providing basic information about the model such as\n * the owner and permissioning.\n */\n retrieve(model, options) {\n return this._client.get(`/models/${model}`, options);\n }\n /**\n * Lists the currently available models, and provides basic information about each\n * one such as the owner and availability.\n */\n list(options) {\n return this._client.getAPIList('/models', ModelsPage, options);\n }\n /**\n * Delete a fine-tuned model. You must have the Owner role in your organization to\n * delete a model.\n */\n del(model, options) {\n return this._client.delete(`/models/${model}`, options);\n }\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class ModelsPage extends Page {\n}\nModels.ModelsPage = ModelsPage;\n//# sourceMappingURL=models.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nexport class Moderations extends APIResource {\n /**\n * Classifies if text and/or image inputs are potentially harmful. Learn more in\n * the [moderation guide](https://platform.openai.com/docs/guides/moderation).\n */\n create(body, options) {\n return this._client.post('/moderations', { body, ...options });\n }\n}\n//# sourceMappingURL=moderations.mjs.map","import { OpenAIError } from \"../error.mjs\";\nimport { isAutoParsableResponseFormat } from \"../lib/parser.mjs\";\nexport function maybeParseResponse(response, params) {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...response,\n output_parsed: null,\n output: response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: null,\n };\n }\n if (item.type === 'message') {\n return {\n ...item,\n content: item.content.map((content) => ({\n ...content,\n parsed: null,\n })),\n };\n }\n else {\n return item;\n }\n }),\n };\n }\n return parseResponse(response, params);\n}\nexport function parseResponse(response, params) {\n const output = response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: parseToolCall(params, item),\n };\n }\n if (item.type === 'message') {\n const content = item.content.map((content) => {\n if (content.type === 'output_text') {\n return {\n ...content,\n parsed: parseTextFormat(params, content.text),\n };\n }\n return content;\n });\n return {\n ...item,\n content,\n };\n }\n return item;\n });\n const parsed = Object.assign({}, response, { output });\n if (!Object.getOwnPropertyDescriptor(response, 'output_text')) {\n addOutputText(parsed);\n }\n Object.defineProperty(parsed, 'output_parsed', {\n enumerable: true,\n get() {\n for (const output of parsed.output) {\n if (output.type !== 'message') {\n continue;\n }\n for (const content of output.content) {\n if (content.type === 'output_text' && content.parsed !== null) {\n return content.parsed;\n }\n }\n }\n return null;\n },\n });\n return parsed;\n}\nfunction parseTextFormat(params, content) {\n if (params.text?.format?.type !== 'json_schema') {\n return null;\n }\n if ('$parseRaw' in params.text?.format) {\n const text_format = params.text?.format;\n return text_format.$parseRaw(content);\n }\n return JSON.parse(content);\n}\nexport function hasAutoParseableInput(params) {\n if (isAutoParsableResponseFormat(params.text?.format)) {\n return true;\n }\n return false;\n}\nexport function makeParseableResponseTool(tool, { parser, callback, }) {\n const obj = { ...tool };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableTool(tool) {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\nfunction getInputToolByName(input_tools, name) {\n return input_tools.find((tool) => tool.type === 'function' && tool.name === name);\n}\nfunction parseToolCall(params, toolCall) {\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);\n return {\n ...toolCall,\n ...toolCall,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCall.arguments)\n : inputTool?.strict ? JSON.parse(toolCall.arguments)\n : null,\n };\n}\nexport function shouldParseToolCall(params, toolCall) {\n if (!params) {\n return false;\n }\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);\n return isAutoParsableTool(inputTool) || inputTool?.strict || false;\n}\nexport function validateInputTools(tools) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(`Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``);\n }\n if (tool.function.strict !== true) {\n throw new OpenAIError(`The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`);\n }\n }\n}\nexport function addOutputText(rsp) {\n const texts = [];\n for (const output of rsp.output) {\n if (output.type !== 'message') {\n continue;\n }\n for (const content of output.content) {\n if (content.type === 'output_text') {\n texts.push(content.text);\n }\n }\n }\n rsp.output_text = texts.join('');\n}\n//# sourceMappingURL=ResponsesParser.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { ResponseItemsPage } from \"./responses.mjs\";\nexport class InputItems extends APIResource {\n list(responseId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(responseId, {}, query);\n }\n return this._client.getAPIList(`/responses/${responseId}/input_items`, ResponseItemsPage, {\n query,\n ...options,\n });\n }\n}\nexport { ResponseItemsPage };\n//# sourceMappingURL=input-items.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _ResponseStream_instances, _ResponseStream_params, _ResponseStream_currentResponseSnapshot, _ResponseStream_finalResponse, _ResponseStream_beginRequest, _ResponseStream_addEvent, _ResponseStream_endRequest, _ResponseStream_accumulateResponse;\nimport { APIUserAbortError, OpenAIError } from \"../../error.mjs\";\nimport { EventStream } from \"../EventStream.mjs\";\nimport { maybeParseResponse } from \"../ResponsesParser.mjs\";\nexport class ResponseStream extends EventStream {\n constructor(params) {\n super();\n _ResponseStream_instances.add(this);\n _ResponseStream_params.set(this, void 0);\n _ResponseStream_currentResponseSnapshot.set(this, void 0);\n _ResponseStream_finalResponse.set(this, void 0);\n __classPrivateFieldSet(this, _ResponseStream_params, params, \"f\");\n }\n static createResponse(client, params, options) {\n const runner = new ResponseStream(params);\n runner._run(() => runner._createOrRetrieveResponse(client, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n async _createOrRetrieveResponse(client, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_beginRequest).call(this);\n let stream;\n let starting_after = null;\n if ('response_id' in params) {\n stream = await client.responses.retrieve(params.response_id, { stream: true }, { ...options, signal: this.controller.signal, stream: true });\n starting_after = params.starting_after ?? null;\n }\n else {\n stream = await client.responses.create({ ...params, stream: true }, { ...options, signal: this.controller.signal });\n }\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_addEvent).call(this, event, starting_after);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_endRequest).call(this);\n }\n [(_ResponseStream_params = new WeakMap(), _ResponseStream_currentResponseSnapshot = new WeakMap(), _ResponseStream_finalResponse = new WeakMap(), _ResponseStream_instances = new WeakSet(), _ResponseStream_beginRequest = function _ResponseStream_beginRequest() {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, undefined, \"f\");\n }, _ResponseStream_addEvent = function _ResponseStream_addEvent(event, starting_after) {\n if (this.ended)\n return;\n const maybeEmit = (name, event) => {\n if (starting_after == null || event.sequence_number > starting_after) {\n this._emit(name, event);\n }\n };\n const response = __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_accumulateResponse).call(this, event);\n maybeEmit('event', event);\n switch (event.type) {\n case 'response.output_text.delta': {\n const output = response.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[event.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n maybeEmit('response.output_text.delta', {\n ...event,\n snapshot: content.text,\n });\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = response.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'function_call') {\n maybeEmit('response.function_call_arguments.delta', {\n ...event,\n snapshot: output.arguments,\n });\n }\n break;\n }\n default:\n maybeEmit(event.type, event);\n break;\n }\n }, _ResponseStream_endRequest = function _ResponseStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = __classPrivateFieldGet(this, _ResponseStream_currentResponseSnapshot, \"f\");\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any events`);\n }\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, undefined, \"f\");\n const parsedResponse = finalizeResponse(snapshot, __classPrivateFieldGet(this, _ResponseStream_params, \"f\"));\n __classPrivateFieldSet(this, _ResponseStream_finalResponse, parsedResponse, \"f\");\n return parsedResponse;\n }, _ResponseStream_accumulateResponse = function _ResponseStream_accumulateResponse(event) {\n let snapshot = __classPrivateFieldGet(this, _ResponseStream_currentResponseSnapshot, \"f\");\n if (!snapshot) {\n if (event.type !== 'response.created') {\n throw new OpenAIError(`When snapshot hasn't been set yet, expected 'response.created' event, got ${event.type}`);\n }\n snapshot = __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, event.response, \"f\");\n return snapshot;\n }\n switch (event.type) {\n case 'response.output_item.added': {\n snapshot.output.push(event.item);\n break;\n }\n case 'response.content_part.added': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n output.content.push(event.part);\n }\n break;\n }\n case 'response.output_text.delta': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[event.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n content.text += event.delta;\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'function_call') {\n output.arguments += event.delta;\n }\n break;\n }\n case 'response.completed': {\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, event.response, \"f\");\n break;\n }\n }\n return snapshot;\n }, Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n this.on('event', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n }\n else {\n pushQueue.push(event);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((event) => (event ? { value: event, done: false } : { value: undefined, done: true }));\n }\n const event = pushQueue.shift();\n return { value: event, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n /**\n * @returns a promise that resolves with the final Response, or rejects\n * if an error occurred or the stream ended prematurely without producing a REsponse.\n */\n async finalResponse() {\n await this.done();\n const response = __classPrivateFieldGet(this, _ResponseStream_finalResponse, \"f\");\n if (!response)\n throw new OpenAIError('stream ended without producing a ChatCompletion');\n return response;\n }\n}\nfunction finalizeResponse(snapshot, params) {\n return maybeParseResponse(snapshot, params);\n}\n//# sourceMappingURL=ResponseStream.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { parseResponse, addOutputText, } from \"../../lib/ResponsesParser.mjs\";\nimport { APIResource } from \"../../resource.mjs\";\nimport * as InputItemsAPI from \"./input-items.mjs\";\nimport { InputItems } from \"./input-items.mjs\";\nimport { ResponseStream } from \"../../lib/responses/ResponseStream.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Responses extends APIResource {\n constructor() {\n super(...arguments);\n this.inputItems = new InputItemsAPI.InputItems(this._client);\n }\n create(body, options) {\n return this._client.post('/responses', { body, ...options, stream: body.stream ?? false })._thenUnwrap((rsp) => {\n if ('object' in rsp && rsp.object === 'response') {\n addOutputText(rsp);\n }\n return rsp;\n });\n }\n retrieve(responseId, query = {}, options) {\n return this._client.get(`/responses/${responseId}`, {\n query,\n ...options,\n stream: query?.stream ?? false,\n });\n }\n /**\n * Deletes a model response with the given ID.\n *\n * @example\n * ```ts\n * await client.responses.del(\n * 'resp_677efb5139a88190b512bc3fef8e535d',\n * );\n * ```\n */\n del(responseId, options) {\n return this._client.delete(`/responses/${responseId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n parse(body, options) {\n return this._client.responses\n .create(body, options)\n ._thenUnwrap((response) => parseResponse(response, body));\n }\n /**\n * Creates a model response stream\n */\n stream(body, options) {\n return ResponseStream.createResponse(this._client, body, options);\n }\n /**\n * Cancels a model response with the given ID. Only responses created with the\n * `background` parameter set to `true` can be cancelled.\n * [Learn more](https://platform.openai.com/docs/guides/background).\n *\n * @example\n * ```ts\n * await client.responses.cancel(\n * 'resp_677efb5139a88190b512bc3fef8e535d',\n * );\n * ```\n */\n cancel(responseId, options) {\n return this._client.post(`/responses/${responseId}/cancel`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class ResponseItemsPage extends CursorPage {\n}\nResponses.InputItems = InputItems;\n//# sourceMappingURL=responses.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Parts extends APIResource {\n /**\n * Adds a\n * [Part](https://platform.openai.com/docs/api-reference/uploads/part-object) to an\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object) object.\n * A Part represents a chunk of bytes from the file you are trying to upload.\n *\n * Each Part can be at most 64 MB, and you can add Parts until you hit the Upload\n * maximum of 8 GB.\n *\n * It is possible to add multiple Parts in parallel. You can decide the intended\n * order of the Parts when you\n * [complete the Upload](https://platform.openai.com/docs/api-reference/uploads/complete).\n */\n create(uploadId, body, options) {\n return this._client.post(`/uploads/${uploadId}/parts`, Core.multipartFormRequestOptions({ body, ...options }));\n }\n}\n//# sourceMappingURL=parts.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as PartsAPI from \"./parts.mjs\";\nimport { Parts } from \"./parts.mjs\";\nexport class Uploads extends APIResource {\n constructor() {\n super(...arguments);\n this.parts = new PartsAPI.Parts(this._client);\n }\n /**\n * Creates an intermediate\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object) object\n * that you can add\n * [Parts](https://platform.openai.com/docs/api-reference/uploads/part-object) to.\n * Currently, an Upload can accept at most 8 GB in total and expires after an hour\n * after you create it.\n *\n * Once you complete the Upload, we will create a\n * [File](https://platform.openai.com/docs/api-reference/files/object) object that\n * contains all the parts you uploaded. This File is usable in the rest of our\n * platform as a regular File object.\n *\n * For certain `purpose` values, the correct `mime_type` must be specified. Please\n * refer to documentation for the\n * [supported MIME types for your use case](https://platform.openai.com/docs/assistants/tools/file-search#supported-files).\n *\n * For guidance on the proper filename extensions for each purpose, please follow\n * the documentation on\n * [creating a File](https://platform.openai.com/docs/api-reference/files/create).\n */\n create(body, options) {\n return this._client.post('/uploads', { body, ...options });\n }\n /**\n * Cancels the Upload. No Parts may be added after an Upload is cancelled.\n */\n cancel(uploadId, options) {\n return this._client.post(`/uploads/${uploadId}/cancel`, options);\n }\n /**\n * Completes the\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object).\n *\n * Within the returned Upload object, there is a nested\n * [File](https://platform.openai.com/docs/api-reference/files/object) object that\n * is ready to use in the rest of the platform.\n *\n * You can specify the order of the Parts by passing in an ordered list of the Part\n * IDs.\n *\n * The number of bytes uploaded upon completion must match the number of bytes\n * initially specified when creating the Upload object. No Parts may be added after\n * an Upload is completed.\n */\n complete(uploadId, body, options) {\n return this._client.post(`/uploads/${uploadId}/complete`, { body, ...options });\n }\n}\nUploads.Parts = Parts;\n//# sourceMappingURL=uploads.mjs.map","/**\n * Like `Promise.allSettled()` but throws an error if any promises are rejected.\n */\nexport const allSettledWithThrow = async (promises) => {\n const results = await Promise.allSettled(promises);\n const rejected = results.filter((result) => result.status === 'rejected');\n if (rejected.length) {\n for (const result of rejected) {\n console.error(result.reason);\n }\n throw new Error(`${rejected.length} promise(s) failed - see the above errors`);\n }\n // Note: TS was complaining about using `.filter().map()` here for some reason\n const values = [];\n for (const result of results) {\n if (result.status === 'fulfilled') {\n values.push(result.value);\n }\n }\n return values;\n};\n//# sourceMappingURL=Util.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { sleep, isRequestOptions } from \"../../core.mjs\";\nimport { CursorPage, Page } from \"../../pagination.mjs\";\nexport class Files extends APIResource {\n /**\n * Create a vector store file by attaching a\n * [File](https://platform.openai.com/docs/api-reference/files) to a\n * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object).\n */\n create(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/files`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store file.\n */\n retrieve(vectorStoreId, fileId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Update attributes on a vector store file.\n */\n update(vectorStoreId, fileId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(vectorStoreId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(vectorStoreId, {}, query);\n }\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files`, VectorStoreFilesPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a vector store file. This will remove the file from the vector store but\n * the file itself will not be deleted. To delete the file, use the\n * [delete file](https://platform.openai.com/docs/api-reference/files/delete)\n * endpoint.\n */\n del(vectorStoreId, fileId, options) {\n return this._client.delete(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Attach a file to the given vector store and wait for it to be processed.\n */\n async createAndPoll(vectorStoreId, body, options) {\n const file = await this.create(vectorStoreId, body, options);\n return await this.poll(vectorStoreId, file.id, options);\n }\n /**\n * Wait for the vector store file to finish processing.\n *\n * Note: this will return even if the file failed to process, you need to check\n * file.last_error and file.status to handle these cases\n */\n async poll(vectorStoreId, fileId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const fileResponse = await this.retrieve(vectorStoreId, fileId, {\n ...options,\n headers,\n }).withResponse();\n const file = fileResponse.data;\n switch (file.status) {\n case 'in_progress':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = fileResponse.response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n case 'failed':\n case 'completed':\n return file;\n }\n }\n }\n /**\n * Upload a file to the `files` API and then attach it to the given vector store.\n *\n * Note the file will be asynchronously processed (you can use the alternative\n * polling helper method to wait for processing to complete).\n */\n async upload(vectorStoreId, file, options) {\n const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options);\n return this.create(vectorStoreId, { file_id: fileInfo.id }, options);\n }\n /**\n * Add a file to a vector store and poll until processing is complete.\n */\n async uploadAndPoll(vectorStoreId, file, options) {\n const fileInfo = await this.upload(vectorStoreId, file, options);\n return await this.poll(vectorStoreId, fileInfo.id, options);\n }\n /**\n * Retrieve the parsed contents of a vector store file.\n */\n content(vectorStoreId, fileId, options) {\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files/${fileId}/content`, FileContentResponsesPage, { ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } });\n }\n}\nexport class VectorStoreFilesPage extends CursorPage {\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class FileContentResponsesPage extends Page {\n}\nFiles.VectorStoreFilesPage = VectorStoreFilesPage;\nFiles.FileContentResponsesPage = FileContentResponsesPage;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { sleep } from \"../../core.mjs\";\nimport { allSettledWithThrow } from \"../../lib/Util.mjs\";\nimport { VectorStoreFilesPage } from \"./files.mjs\";\nexport class FileBatches extends APIResource {\n /**\n * Create a vector store file batch.\n */\n create(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/file_batches`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store file batch.\n */\n retrieve(vectorStoreId, batchId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}/file_batches/${batchId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Cancel a vector store file batch. This attempts to cancel the processing of\n * files in this batch as soon as possible.\n */\n cancel(vectorStoreId, batchId, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/cancel`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Create a vector store batch and poll until all files have been processed.\n */\n async createAndPoll(vectorStoreId, body, options) {\n const batch = await this.create(vectorStoreId, body);\n return await this.poll(vectorStoreId, batch.id, options);\n }\n listFiles(vectorStoreId, batchId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.listFiles(vectorStoreId, batchId, {}, query);\n }\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/files`, VectorStoreFilesPage, { query, ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } });\n }\n /**\n * Wait for the given file batch to be processed.\n *\n * Note: this will return even if one of the files failed to process, you need to\n * check batch.file_counts.failed_count to handle this case.\n */\n async poll(vectorStoreId, batchId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const { data: batch, response } = await this.retrieve(vectorStoreId, batchId, {\n ...options,\n headers,\n }).withResponse();\n switch (batch.status) {\n case 'in_progress':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n case 'failed':\n case 'cancelled':\n case 'completed':\n return batch;\n }\n }\n }\n /**\n * Uploads the given files concurrently and then creates a vector store file batch.\n *\n * The concurrency limit is configurable using the `maxConcurrency` parameter.\n */\n async uploadAndPoll(vectorStoreId, { files, fileIds = [] }, options) {\n if (files == null || files.length == 0) {\n throw new Error(`No \\`files\\` provided to process. If you've already uploaded files you should use \\`.createAndPoll()\\` instead`);\n }\n const configuredConcurrency = options?.maxConcurrency ?? 5;\n // We cap the number of workers at the number of files (so we don't start any unnecessary workers)\n const concurrencyLimit = Math.min(configuredConcurrency, files.length);\n const client = this._client;\n const fileIterator = files.values();\n const allFileIds = [...fileIds];\n // This code is based on this design. The libraries don't accommodate our environment limits.\n // https://stackoverflow.com/questions/40639432/what-is-the-best-way-to-limit-concurrency-when-using-es6s-promise-all\n async function processFiles(iterator) {\n for (let item of iterator) {\n const fileObj = await client.files.create({ file: item, purpose: 'assistants' }, options);\n allFileIds.push(fileObj.id);\n }\n }\n // Start workers to process results\n const workers = Array(concurrencyLimit).fill(fileIterator).map(processFiles);\n // Wait for all processing to complete.\n await allSettledWithThrow(workers);\n return await this.createAndPoll(vectorStoreId, {\n file_ids: allFileIds,\n });\n }\n}\nexport { VectorStoreFilesPage };\n//# sourceMappingURL=file-batches.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as FileBatchesAPI from \"./file-batches.mjs\";\nimport { FileBatches, } from \"./file-batches.mjs\";\nimport * as FilesAPI from \"./files.mjs\";\nimport { FileContentResponsesPage, Files, VectorStoreFilesPage, } from \"./files.mjs\";\nimport { CursorPage, Page } from \"../../pagination.mjs\";\nexport class VectorStores extends APIResource {\n constructor() {\n super(...arguments);\n this.files = new FilesAPI.Files(this._client);\n this.fileBatches = new FileBatchesAPI.FileBatches(this._client);\n }\n /**\n * Create a vector store.\n */\n create(body, options) {\n return this._client.post('/vector_stores', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store.\n */\n retrieve(vectorStoreId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a vector store.\n */\n update(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/vector_stores', VectorStoresPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a vector store.\n */\n del(vectorStoreId, options) {\n return this._client.delete(`/vector_stores/${vectorStoreId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Search a vector store for relevant chunks based on a query and file attributes\n * filter.\n */\n search(vectorStoreId, body, options) {\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/search`, VectorStoreSearchResponsesPage, {\n body,\n method: 'post',\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class VectorStoresPage extends CursorPage {\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class VectorStoreSearchResponsesPage extends Page {\n}\nVectorStores.VectorStoresPage = VectorStoresPage;\nVectorStores.VectorStoreSearchResponsesPage = VectorStoreSearchResponsesPage;\nVectorStores.Files = Files;\nVectorStores.VectorStoreFilesPage = VectorStoreFilesPage;\nVectorStores.FileContentResponsesPage = FileContentResponsesPage;\nVectorStores.FileBatches = FileBatches;\n//# sourceMappingURL=vector-stores.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nvar _a;\nimport * as qs from \"./internal/qs/index.mjs\";\nimport * as Core from \"./core.mjs\";\nimport * as Errors from \"./error.mjs\";\nimport * as Pagination from \"./pagination.mjs\";\nimport * as Uploads from \"./uploads.mjs\";\nimport * as API from \"./resources/index.mjs\";\nimport { Batches, BatchesPage, } from \"./resources/batches.mjs\";\nimport { Completions, } from \"./resources/completions.mjs\";\nimport { Embeddings, } from \"./resources/embeddings.mjs\";\nimport { FileObjectsPage, Files, } from \"./resources/files.mjs\";\nimport { Images, } from \"./resources/images.mjs\";\nimport { Models, ModelsPage } from \"./resources/models.mjs\";\nimport { Moderations, } from \"./resources/moderations.mjs\";\nimport { Audio } from \"./resources/audio/audio.mjs\";\nimport { Beta } from \"./resources/beta/beta.mjs\";\nimport { Chat } from \"./resources/chat/chat.mjs\";\nimport { ContainerListResponsesPage, Containers, } from \"./resources/containers/containers.mjs\";\nimport { EvalListResponsesPage, Evals, } from \"./resources/evals/evals.mjs\";\nimport { FineTuning } from \"./resources/fine-tuning/fine-tuning.mjs\";\nimport { Graders } from \"./resources/graders/graders.mjs\";\nimport { Responses } from \"./resources/responses/responses.mjs\";\nimport { Uploads as UploadsAPIUploads, } from \"./resources/uploads/uploads.mjs\";\nimport { VectorStoreSearchResponsesPage, VectorStores, VectorStoresPage, } from \"./resources/vector-stores/vector-stores.mjs\";\nimport { ChatCompletionsPage, } from \"./resources/chat/completions/completions.mjs\";\n/**\n * API Client for interfacing with the OpenAI API.\n */\nexport class OpenAI extends Core.APIClient {\n /**\n * API Client for interfacing with the OpenAI API.\n *\n * @param {string | undefined} [opts.apiKey=process.env['OPENAI_API_KEY'] ?? undefined]\n * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null]\n * @param {string | null | undefined} [opts.project=process.env['OPENAI_PROJECT_ID'] ?? null]\n * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL'] ?? https://api.openai.com/v1] - Override the default base URL for the API.\n * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.\n * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections.\n * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.\n * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.\n * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API.\n * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API.\n * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers.\n */\n constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('OPENAI_API_KEY'), organization = Core.readEnv('OPENAI_ORG_ID') ?? null, project = Core.readEnv('OPENAI_PROJECT_ID') ?? null, ...opts } = {}) {\n if (apiKey === undefined) {\n throw new Errors.OpenAIError(\"The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'My API Key' }).\");\n }\n const options = {\n apiKey,\n organization,\n project,\n ...opts,\n baseURL: baseURL || `https://api.openai.com/v1`,\n };\n if (!options.dangerouslyAllowBrowser && Core.isRunningInBrowser()) {\n throw new Errors.OpenAIError(\"It looks like you're running in a browser-like environment.\\n\\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\\nIf you understand the risks and have appropriate mitigations in place,\\nyou can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\\n\\nnew OpenAI({ apiKey, dangerouslyAllowBrowser: true });\\n\\nhttps://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety\\n\");\n }\n super({\n baseURL: options.baseURL,\n timeout: options.timeout ?? 600000 /* 10 minutes */,\n httpAgent: options.httpAgent,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n });\n this.completions = new API.Completions(this);\n this.chat = new API.Chat(this);\n this.embeddings = new API.Embeddings(this);\n this.files = new API.Files(this);\n this.images = new API.Images(this);\n this.audio = new API.Audio(this);\n this.moderations = new API.Moderations(this);\n this.models = new API.Models(this);\n this.fineTuning = new API.FineTuning(this);\n this.graders = new API.Graders(this);\n this.vectorStores = new API.VectorStores(this);\n this.beta = new API.Beta(this);\n this.batches = new API.Batches(this);\n this.uploads = new API.Uploads(this);\n this.responses = new API.Responses(this);\n this.evals = new API.Evals(this);\n this.containers = new API.Containers(this);\n this._options = options;\n this.apiKey = apiKey;\n this.organization = organization;\n this.project = project;\n }\n defaultQuery() {\n return this._options.defaultQuery;\n }\n defaultHeaders(opts) {\n return {\n ...super.defaultHeaders(opts),\n 'OpenAI-Organization': this.organization,\n 'OpenAI-Project': this.project,\n ...this._options.defaultHeaders,\n };\n }\n authHeaders(opts) {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n stringifyQuery(query) {\n return qs.stringify(query, { arrayFormat: 'brackets' });\n }\n}\n_a = OpenAI;\nOpenAI.OpenAI = _a;\nOpenAI.DEFAULT_TIMEOUT = 600000; // 10 minutes\nOpenAI.OpenAIError = Errors.OpenAIError;\nOpenAI.APIError = Errors.APIError;\nOpenAI.APIConnectionError = Errors.APIConnectionError;\nOpenAI.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError;\nOpenAI.APIUserAbortError = Errors.APIUserAbortError;\nOpenAI.NotFoundError = Errors.NotFoundError;\nOpenAI.ConflictError = Errors.ConflictError;\nOpenAI.RateLimitError = Errors.RateLimitError;\nOpenAI.BadRequestError = Errors.BadRequestError;\nOpenAI.AuthenticationError = Errors.AuthenticationError;\nOpenAI.InternalServerError = Errors.InternalServerError;\nOpenAI.PermissionDeniedError = Errors.PermissionDeniedError;\nOpenAI.UnprocessableEntityError = Errors.UnprocessableEntityError;\nOpenAI.toFile = Uploads.toFile;\nOpenAI.fileFromPath = Uploads.fileFromPath;\nOpenAI.Completions = Completions;\nOpenAI.Chat = Chat;\nOpenAI.ChatCompletionsPage = ChatCompletionsPage;\nOpenAI.Embeddings = Embeddings;\nOpenAI.Files = Files;\nOpenAI.FileObjectsPage = FileObjectsPage;\nOpenAI.Images = Images;\nOpenAI.Audio = Audio;\nOpenAI.Moderations = Moderations;\nOpenAI.Models = Models;\nOpenAI.ModelsPage = ModelsPage;\nOpenAI.FineTuning = FineTuning;\nOpenAI.Graders = Graders;\nOpenAI.VectorStores = VectorStores;\nOpenAI.VectorStoresPage = VectorStoresPage;\nOpenAI.VectorStoreSearchResponsesPage = VectorStoreSearchResponsesPage;\nOpenAI.Beta = Beta;\nOpenAI.Batches = Batches;\nOpenAI.BatchesPage = BatchesPage;\nOpenAI.Uploads = UploadsAPIUploads;\nOpenAI.Responses = Responses;\nOpenAI.Evals = Evals;\nOpenAI.EvalListResponsesPage = EvalListResponsesPage;\nOpenAI.Containers = Containers;\nOpenAI.ContainerListResponsesPage = ContainerListResponsesPage;\n/** API Client for interfacing with the Azure OpenAI API. */\nexport class AzureOpenAI extends OpenAI {\n /**\n * API Client for interfacing with the Azure OpenAI API.\n *\n * @param {string | undefined} [opts.apiVersion=process.env['OPENAI_API_VERSION'] ?? undefined]\n * @param {string | undefined} [opts.endpoint=process.env['AZURE_OPENAI_ENDPOINT'] ?? undefined] - Your Azure endpoint, including the resource, e.g. `https://example-resource.azure.openai.com/`\n * @param {string | undefined} [opts.apiKey=process.env['AZURE_OPENAI_API_KEY'] ?? undefined]\n * @param {string | undefined} opts.deployment - A model deployment, if given, sets the base client URL to include `/deployments/{deployment}`.\n * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null]\n * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL']] - Sets the base URL for the API, e.g. `https://example-resource.azure.openai.com/openai/`.\n * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.\n * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections.\n * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.\n * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.\n * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API.\n * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API.\n * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers.\n */\n constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('AZURE_OPENAI_API_KEY'), apiVersion = Core.readEnv('OPENAI_API_VERSION'), endpoint, deployment, azureADTokenProvider, dangerouslyAllowBrowser, ...opts } = {}) {\n if (!apiVersion) {\n throw new Errors.OpenAIError(\"The OPENAI_API_VERSION environment variable is missing or empty; either provide it, or instantiate the AzureOpenAI client with an apiVersion option, like new AzureOpenAI({ apiVersion: 'My API Version' }).\");\n }\n if (typeof azureADTokenProvider === 'function') {\n dangerouslyAllowBrowser = true;\n }\n if (!azureADTokenProvider && !apiKey) {\n throw new Errors.OpenAIError('Missing credentials. Please pass one of `apiKey` and `azureADTokenProvider`, or set the `AZURE_OPENAI_API_KEY` environment variable.');\n }\n if (azureADTokenProvider && apiKey) {\n throw new Errors.OpenAIError('The `apiKey` and `azureADTokenProvider` arguments are mutually exclusive; only one can be passed at a time.');\n }\n // define a sentinel value to avoid any typing issues\n apiKey ?? (apiKey = API_KEY_SENTINEL);\n opts.defaultQuery = { ...opts.defaultQuery, 'api-version': apiVersion };\n if (!baseURL) {\n if (!endpoint) {\n endpoint = process.env['AZURE_OPENAI_ENDPOINT'];\n }\n if (!endpoint) {\n throw new Errors.OpenAIError('Must provide one of the `baseURL` or `endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variable');\n }\n baseURL = `${endpoint}/openai`;\n }\n else {\n if (endpoint) {\n throw new Errors.OpenAIError('baseURL and endpoint are mutually exclusive');\n }\n }\n super({\n apiKey,\n baseURL,\n ...opts,\n ...(dangerouslyAllowBrowser !== undefined ? { dangerouslyAllowBrowser } : {}),\n });\n this.apiVersion = '';\n this._azureADTokenProvider = azureADTokenProvider;\n this.apiVersion = apiVersion;\n this.deploymentName = deployment;\n }\n buildRequest(options, props = {}) {\n if (_deployments_endpoints.has(options.path) && options.method === 'post' && options.body !== undefined) {\n if (!Core.isObj(options.body)) {\n throw new Error('Expected request body to be an object');\n }\n const model = this.deploymentName || options.body['model'] || options.__metadata?.['model'];\n if (model !== undefined && !this.baseURL.includes('/deployments')) {\n options.path = `/deployments/${model}${options.path}`;\n }\n }\n return super.buildRequest(options, props);\n }\n async _getAzureADToken() {\n if (typeof this._azureADTokenProvider === 'function') {\n const token = await this._azureADTokenProvider();\n if (!token || typeof token !== 'string') {\n throw new Errors.OpenAIError(`Expected 'azureADTokenProvider' argument to return a string but it returned ${token}`);\n }\n return token;\n }\n return undefined;\n }\n authHeaders(opts) {\n return {};\n }\n async prepareOptions(opts) {\n /**\n * The user should provide a bearer token provider if they want\n * to use Azure AD authentication. The user shouldn't set the\n * Authorization header manually because the header is overwritten\n * with the Azure AD token if a bearer token provider is provided.\n */\n if (opts.headers?.['api-key']) {\n return super.prepareOptions(opts);\n }\n const token = await this._getAzureADToken();\n opts.headers ?? (opts.headers = {});\n if (token) {\n opts.headers['Authorization'] = `Bearer ${token}`;\n }\n else if (this.apiKey !== API_KEY_SENTINEL) {\n opts.headers['api-key'] = this.apiKey;\n }\n else {\n throw new Errors.OpenAIError('Unable to handle auth');\n }\n return super.prepareOptions(opts);\n }\n}\nconst _deployments_endpoints = new Set([\n '/completions',\n '/chat/completions',\n '/embeddings',\n '/audio/transcriptions',\n '/audio/translations',\n '/audio/speech',\n '/images/generations',\n '/images/edits',\n]);\nconst API_KEY_SENTINEL = '<Missing Key>';\nexport { toFile, fileFromPath } from \"./uploads.mjs\";\nexport { OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, NotFoundError, ConflictError, RateLimitError, BadRequestError, AuthenticationError, InternalServerError, PermissionDeniedError, UnprocessableEntityError, } from \"./error.mjs\";\nexport default OpenAI;\n//# sourceMappingURL=index.mjs.map","\nimport OpenAI from 'openai';\n// import { conversationsApi } from '../api/index';\nimport type { Message, AiModelConfig } from '../../types';\n\ntype CallbackType = 'chunk' | 'error' | 'complete';\n\n// interface CallbackData {\n// type?: string;\n// content?: string;\n// accumulated?: string;\n// }\n\nclass AiRequestHandler {\n private messages: Message[];\n private tools: any[];\n // private _conversationId: string;\n private callback: (type: CallbackType, data?: any) => void;\n private modelConfig: AiModelConfig;\n // private _stream: boolean;\n // private _useOpenAIPackage: boolean;\n private abortController: AbortController;\n private isAborted: boolean;\n\n constructor(messages: Message[], tools: any[], _conversationId: string, callback: (type: CallbackType, data?: any) => void, modelConfig: AiModelConfig) {\n this.messages = messages;\n this.tools = tools;\n // this._conversationId = conversationId;\n this.callback = callback;\n this.modelConfig = modelConfig;\n // this._stream = true;\n // 添加一个标志来控制是否使用 OpenAI 包\n // this._useOpenAIPackage = true; // 默认使用 OpenAI 包\n // 添加中止控制器\n this.abortController = new AbortController();\n this.isAborted = false;\n\n }\n\n /**\n * 发送聊天完成请求\n * @returns {Promise<Message[]>} 更新后的消息列表\n */\n async chatCompletion(): Promise<Message[]> {\n try {\n // 检查是否已被中止\n if (this.isAborted) {\n throw new Error('Request was aborted');\n }\n\n // 检查模型配置\n console.log('Using OpenAI package with base URL:', this.modelConfig.base_url);\n console.log('API Key:', this.modelConfig.api_key ? 'Present' : 'Missing');\n\n // 创建 OpenAI 客户端\n const openai = new OpenAI({\n apiKey: this.modelConfig.api_key,\n baseURL: this.modelConfig.base_url,\n dangerouslyAllowBrowser: true // 允许在浏览器中使用\n });\n\n // 构建请求参数\n const payload = this.buildPayLoad();\n\n // 使用 OpenAI 客户端发送流式请求\n const stream = await openai.chat.completions.create({\n ...payload,\n stream: true\n });\n\n // 处理流式响应\n await this.handleOpenAIStreamResponse(stream, this.callback);\n\n return this.messages;\n } catch (error: any) {\n console.error('Chat completion failed:', error);\n console.error('Error type:', error.constructor.name);\n console.error('Error message:', error.message);\n console.error('Error stack:', error.stack);\n\n // 检查是否是网络相关错误\n if (error.message.includes('CORS') || error.message.includes('fetch')) {\n console.error('This appears to be a CORS or network error. Check your base_url and API configuration.');\n }\n\n // 通过callback通知错误\n if (this.callback) {\n this.callback('error', error);\n }\n throw error;\n }\n }\n\n /**\n * 处理 OpenAI 包的流式响应\n * @param {AsyncIterable} stream - OpenAI 流式响应\n * @param {Function} callback - 回调函数\n */\n async handleOpenAIStreamResponse(stream: any, callback: (type: CallbackType, data?: any) => void): Promise<void> {\n // 初始化消息对象\n const message: any = {\n role: 'assistant',\n content: '',\n reasoning_content: '',\n tool_calls: [],\n model_info: {\n model: this.modelConfig.model_name,\n temperature: (this.modelConfig as any).temperature,\n max_tokens: (this.modelConfig as any).max_tokens\n },\n function_calls: [] // 兼容后端格式\n };\n\n try {\n console.log('Starting to process OpenAI stream...');\n let chunkCount = 0;\n let existingCall = null\n\n for await (const chunk of stream) {\n // 检查是否已被中止\n if (this.isAborted) {\n console.log('Stream processing aborted');\n break;\n }\n\n chunkCount++;\n if (chunk.choices && chunk.choices.length > 0) {\n const choice = chunk.choices[0];\n const delta = choice.delta;\n\n if (delta) {\n // 处理普通文本内容\n if (delta.content) {\n message.content += delta.content;\n if (callback) {\n callback('chunk', {\n type: 'text',\n content: delta.content,\n });\n }\n }\n\n // 处理推理内容(如果模型支持)\n if (delta.reasoning_content) {\n message.reasoning_content += delta.reasoning_content;\n if (callback) {\n callback('chunk', {\n type: 'reasoning_content',\n content: delta.reasoning_content,\n accumulated: message.reasoning_content\n });\n }\n }\n\n // 处理工具调用\n if (delta.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // 检查 toolCall 是否有效,处理不同模型的兼容性\n if (!toolCall) {\n console.warn('Invalid tool call:', toolCall);\n continue;\n }\n\n // 处理 index 为 null 或 undefined 的情况(如 Gemini)\n let index = toolCall.index;\n if (index === null || index === undefined || typeof index !== 'number') {\n // 如果没有有效的 index,使用当前数组长度作为 index\n index = message.tool_calls.length;\n console.log(`Tool call index was ${toolCall.index}, using ${index} instead`);\n }\n\n // 确保tool_calls数组有足够的元素\n while (message.tool_calls.length <= index) {\n message.tool_calls.push({\n id: '',\n type: 'function',\n function: {\n name: '',\n arguments: ''\n }\n });\n }\n\n existingCall = message.tool_calls[index];\n\n // 确保 existingCall.function 存在\n if (!existingCall.function) {\n existingCall.function = {\n name: '',\n arguments: ''\n };\n }\n\n // 处理 ID,如果为空字符串则生成一个\n if (toolCall.id && toolCall.id !== '') {\n existingCall.id = toolCall.id;\n } else if (!existingCall.id || existingCall.id === '') {\n // 为 Gemini 等模型生成一个临时 ID\n existingCall.id = `call_${Date.now()}_${index}`;\n }\n\n if (toolCall.function) {\n if (toolCall.function.name) {\n existingCall.function.name = toolCall.function.name;\n }\n if (toolCall.function.arguments) {\n existingCall.function.arguments += toolCall.function.arguments;\n }\n }\n\n\n }\n }\n }\n }\n }\n\n console.log(`OpenAI stream completed. Processed ${chunkCount} chunks.`);\n\n // 处理工具调用的function_calls格式(兼容后端)\n if (message.tool_calls.length > 0) {\n message.function_calls = message.tool_calls.map((toolCall: any) => ({\n id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments\n }));\n }\n\n // 最后把完整的消息添加到messages列表\n this.messages.push(message);\n\n // AI响应处理完成,消息将由store的onComplete回调保存\n\n } catch (error) {\n console.error('Stream processing error:', error);\n if (callback) {\n callback('error', error);\n }\n throw error;\n }\n }\n\n\n\n /**\n * 构建请求体\n * @returns {Object} 符合OpenAI格式的请求体\n */\n buildPayLoad() {\n // 转换消息格式为 OpenAI 标准格式\n const openaiMessages = this.convertToOpenAIFormat(this.messages);\n\n\n // 完全不传递temperature和top_p,让API使用默认值\n const requestData = {\n model: this.modelConfig.model_name || 'gpt-3.5-turbo',\n messages: openaiMessages,\n max_tokens: (this.modelConfig as any).max_tokens || 4000\n };\n\n // 如果有工具,添加工具配置\n if (this.tools && this.tools.length > 0) {\n (requestData as any).tools = this.tools;\n }\n\n return requestData;\n }\n\n /**\n * 清理HTML标签和多余的空白字符\n * @param {string} content - 原始内容\n * @returns {string} 清理后的纯文本内容\n */\n cleanHtmlContent(content: any): string {\n if (!content || typeof content !== 'string') {\n return '';\n }\n \n // 移除HTML标签,但保留换行符\n let cleanContent = content.replace(/<[^>]*>/g, '');\n \n // 解码HTML实体\n cleanContent = cleanContent\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/ /g, ' ');\n \n // 清理多余的空白字符,但保留有意义的换行\n cleanContent = cleanContent\n .replace(/[ \\t]+/g, ' ') // 多个空格和制表符替换为单个空格\n .replace(/\\n[ \\t]*/g, '\\n') // 移除换行后的空格和制表符\n .replace(/\\n{3,}/g, '\\n\\n') // 三个或更多连续换行替换为双换行\n .trim(); // 去除首尾空白\n \n return cleanContent;\n }\n\n /**\n * 将项目内部消息格式转换为 OpenAI 标准格式\n * @param {Array} messages - 项目内部消息格式\n * @returns {Array} OpenAI 标准格式的消息\n */\n convertToOpenAIFormat(messages: any[]): any[] {\n return messages.map(msg => {\n // 获取原始内容\n let content = msg.content || msg.message || '';\n \n // 如果是助手消息,清理HTML标签\n if (msg.role === 'assistant') {\n content = this.cleanHtmlContent(content);\n }\n \n // 基础消息格式\n const openaiMsg = {\n role: msg.role,\n content: content\n };\n\n // 如果是 assistant 消息且包含工具调用\n if (msg.role === 'assistant' && (msg.tool_calls || msg.function_calls)) {\n const toolCalls = msg.tool_calls || msg.function_calls || [];\n if (toolCalls.length > 0) {\n console.log('Converting tool calls for assistant message:', toolCalls);\n (openaiMsg as any).tool_calls = toolCalls.map((call: any) => {\n // 获取函数名和参数,兼容不同格式\n const functionName = call.function?.name || call.name;\n const functionArgs = call.function?.arguments || call.arguments;\n\n // 确保函数名存在\n if (!functionName) {\n console.warn('Tool call missing function name:', call);\n return null; // 跳过无效的工具调用\n }\n\n // 确保参数格式正确\n let argsString;\n if (typeof functionArgs === 'string') {\n argsString = functionArgs;\n } else if (functionArgs && typeof functionArgs === 'object') {\n argsString = JSON.stringify(functionArgs);\n } else {\n argsString = '{}'; // 默认空对象\n }\n\n // 验证 JSON 格式\n try {\n JSON.parse(argsString);\n } catch (e: any) {\n console.warn('Invalid JSON in tool call arguments, using empty object:', argsString, e);\n argsString = '{}';\n }\n\n const result = {\n id: call.id || `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n type: call.type || 'function',\n function: {\n name: functionName,\n arguments: argsString\n }\n };\n\n console.log('Converted tool call:', result);\n return result;\n }).filter((call: any) => call !== null); // 过滤掉无效的工具调用\n }\n }\n\n // 如果是工具调用结果消息\n if (msg.role === 'tool') {\n (openaiMsg as any).tool_call_id = msg.tool_call_id;\n }\n\n return openaiMsg;\n }).filter((msg: any) => \n // 过滤掉无效消息\n msg.role && (msg.content || (msg as any).tool_calls)\n );\n }\n\n /**\n * 中止当前请求\n */\n abort() {\n console.log('AiRequestHandler: Aborting request');\n this.isAborted = true;\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /**\n * 检查是否已被中止\n * @returns {boolean}\n */\n isRequestAborted() {\n return this.isAborted;\n }\n}\nexport default AiRequestHandler;","import { MessageManager } from './messageManager';\nimport AiRequestHandler from './aiRequestHandler';\nimport type { AiModelConfig, Message, MessageRole } from '../../types';\n\n// 使用与aiClient相同的CallbackType\ntype CallbackType = 'chunk' | 'tool_call' | 'error' | 'complete' | 'tool_stream_chunk' | 'tool_result' | 'conversation_complete' | 'summary_chunk';\n\n/**\n * 工具结果处理器\n * 负责处理单次工具执行结果,生成总结并替换内容\n */\nexport class ToolResultProcessor {\n private messageManager: MessageManager;\n private modelConfig: AiModelConfig;\n private conversationId: string;\n private callback: (type: CallbackType, data?: any) => void;\n\n constructor(messageManager: MessageManager, modelConfig: AiModelConfig, conversationId: string, callback: (type: CallbackType, data?: any) => void) {\n this.messageManager = messageManager;\n this.modelConfig = modelConfig;\n this.conversationId = conversationId;\n this.callback = callback;\n }\n\n /**\n * 处理单次工具执行结果\n * @param executeResult 工具执行结果\n * @param sessionId 会话ID\n * @returns 处理后的工具消息\n */\n async processToolResult(executeResult: any, sessionId: string): Promise<any> {\n // 直接使用累积的工具结果,executeResult 就是单个工具消息对象\n const result = executeResult;\n debugger\n \n // 检查是否需要生成总结\n const contentLength = (result.content || '').length;\n const shouldSummarize = contentLength > 1000; // 超过1000字符时生成总结\n \n let finalContent = result.content || '';\n \n if (shouldSummarize) {\n try {\n const summary = await this.generateContentSummary(result.content, result.tool_name);\n finalContent = summary;\n console.log(`[Tool Result Summary] 为工具 ${result.tool_name} 生成总结,原长度: ${contentLength}, 总结长度: ${summary.length}`);\n } catch (error) {\n console.error(`[Tool Result Summary] 生成总结失败:`, error);\n // 使用原内容\n }\n }\n\n // 总结完成后,保存最终的工具消息到数据库\n await this.messageManager.saveToolMessage({\n sessionId: sessionId,\n role: 'tool',\n content: result.content || '', // 保存原始内容\n summary: shouldSummarize ? finalContent : undefined, // 保存总结内容\n status: 'completed',\n createdAt: new Date(),\n metadata: {\n tool_call_id: result.tool_call_id,\n tool_name: result.tool_name,\n is_summarized: shouldSummarize,\n original_length: contentLength\n }\n });\n\n // 返回用于添加到消息列表的工具消息\n return {\n role: 'tool',\n tool_call_id: result.tool_call_id,\n content: finalContent,\n metadata: {\n tool_name: result.tool_name,\n timestamp: new Date().toISOString(),\n content_length: contentLength,\n is_summarized: shouldSummarize\n }\n };\n }\n\n /**\n * 生成内容总结\n * @param content 原始内容\n * @param toolName 工具名称\n * @returns 总结内容\n */\n private async generateContentSummary(content: string, toolName: string): Promise<string> {\n try {\n // 创建总结请求的消息\n const summaryMessages: Message[] = [\n {\n id: Date.now().toString() + '_system',\n sessionId: this.conversationId,\n role: 'system' as MessageRole,\n content: '请帮我总结一下这个内容,对其内容进行精简,将主要信息提取出来。请用简洁明了的语言概括核心要点。',\n rawContent: '请帮我总结一下这个内容,对其内容进行精简,将主要信息提取出来。请用简洁明了的语言概括核心要点。',\n status: 'completed',\n createdAt: new Date()\n },\n {\n id: Date.now().toString() + '_user',\n sessionId: this.conversationId,\n role: 'user' as MessageRole, \n content: `请帮我对以下内容进行总结:\\n\\n${content}`,\n rawContent: `请帮我对以下内容进行总结:\\n\\n${content}`,\n status: 'completed',\n createdAt: new Date()\n }\n ];\n\n let summaryContent = '';\n \n // 创建AI请求处理器\n const aiRequestHandler = new AiRequestHandler(\n summaryMessages,\n [], // 空工具列表\n this.conversationId,\n (type: string, data: any) => {\n if (type === 'chunk' && data?.content) {\n summaryContent += data.content;\n // 流式展示总结生成过程\n this.callback('summary_chunk', {\n content: data.content,\n accumulated: summaryContent\n });\n }\n },\n this.modelConfig\n );\n\n // 发送总结请求\n await aiRequestHandler.chatCompletion();\n\n return summaryContent.trim() || `工具 ${toolName} 执行完成,内容长度: ${content.length} 字符`;\n } catch (error) {\n console.error('生成总结时出错:', error);\n // 返回简单的默认总结\n return `工具 ${toolName} 执行完成,内容长度: ${content.length} 字符`;\n }\n }\n\n\n}","import AiRequestHandler from './aiRequestHandler';\n// import { conversationsApi } from '../api/index';\nimport { ToolResultProcessor } from './toolResultProcessor';\nimport { messageManager } from './messageManager';\nimport type { Message, ToolCall, AiModelConfig } from '../../types';\n\ninterface McpToolExecute {\n executeStream(toolCall: ToolCall, onChunk: (chunk: string) => void, onComplete: () => void, onError: (error: Error) => void): Promise<void>;\n execute(toolCalls: ToolCall[]): Promise<any[]>;\n toolSupportsStreaming(toolName: string): boolean;\n}\n\ntype CallbackType = 'chunk' | 'tool_call' | 'error' | 'complete' | 'tool_stream_chunk' | 'tool_result' | 'conversation_complete' | 'summary_chunk';\n\n// interface CallbackData {\n// type?: string;\n// content?: string;\n// accumulated?: string;\n// toolCallId?: string;\n// chunk?: string;\n// }\nclass AiClient {\n private messages: Message[];\n private conversationId: string;\n private tools: any[];\n private modelConfig: AiModelConfig;\n private callBack: (type: CallbackType, data?: any) => void;\n private mcpToolExecute: McpToolExecute | null;\n // private payLoad: any;\n private isAborted: boolean;\n private currentAiRequestHandler: AiRequestHandler | null;\n private toolResultProcessor: ToolResultProcessor;\n\n constructor(messages: Message[], conversationId: string, tools: any[], modelConfig: AiModelConfig, callBack: (type: CallbackType, data?: any) => void, mcpToolExecute: McpToolExecute | null) {\n this.messages = messages;\n this.conversationId = conversationId;\n this.tools = tools;\n this.modelConfig = modelConfig;\n this.callBack = callBack;\n this.mcpToolExecute = mcpToolExecute;\n // this.payLoad = {}\n // 添加中止控制\n this.isAborted = false;\n this.currentAiRequestHandler = null;\n // 初始化工具结果处理器\n this.toolResultProcessor = new ToolResultProcessor(messageManager, this.modelConfig, this.conversationId, this.callBack);\n }\n\n\n\n async start() {\n await this.handleToolCallRecursively(25, 0)\n }\n\n async handleToolCallRecursively(maxRounds: number, currentRound: number): Promise<void> {\n //1. 判断是否已经到达最大轮次\n if(currentRound >= maxRounds) {\n this.callBack(\"error\", \"Maximum rounds reached\");\n return;\n }\n\n // 检查是否已被中止\n if (this.isAborted) {\n console.log('AiClient: Request aborted');\n return;\n }\n\n //2. 判断最新的消息 的role 是否是assistant\n let message = this.messages[this.messages.length - 1]; // 修复: 使用数组索引获取最后一个消息\n\n if(message && message.role === \"assistant\") {\n //如果是助手的消息,要判断是否需要调用工具\n if((message as any).tool_calls && (message as any).tool_calls.length > 0) {\n // 检查是否已被中止\n if (this.isAborted) {\n console.log('AiClient: Tool call execution aborted');\n return;\n }\n\n this.callBack(\"tool_call\", (message as any).tool_calls);\n\n // 处理工具调用 - 支持流式和普通调用\n let executeResult = [];\n \n for (const toolCall of (message as any).tool_calls) {\n // 检查是否在工具执行过程中被中止\n if (this.isAborted) {\n console.log('AiClient: Aborted during tool execution');\n return;\n }\n \n const toolName = toolCall.function?.name || toolCall.name;\n const supportsStreaming = this.mcpToolExecute!.toolSupportsStreaming(toolName);\n \n if (supportsStreaming) {\n // 使用流式调用\n console.log(`Using streaming execution for tool: ${toolName}`);\n \n const toolResult = {\n tool_call_id: toolCall.id || `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'tool',\n name: toolName,\n content: ''\n };\n \n try {\n await this.mcpToolExecute!.executeStream(\n toolCall,\n // onChunk: 接收流式数据\n (chunk) => {\n if (this.isAborted) return;\n console.log(\"chunk\", chunk)\n // 处理chunk数据,提取实际文本内容\n const processedChunk = this.processChunk(chunk);\n toolResult.content += processedChunk;\n \n // 通知界面更新工具执行进度,使用处理后的内容\n this.callBack(\"tool_stream_chunk\", {\n toolCallId: toolCall.id,\n chunk: processedChunk,\n });\n \n },\n // onComplete: 流式调用完成\n () => {\n if (this.isAborted) return;\n console.log(`Stream completed for tool: ${toolName}`);\n },\n // onError: 错误处理\n (error) => {\n if (this.isAborted) return;\n console.error(`Stream error for tool ${toolName}:`, error);\n toolResult.content = JSON.stringify({\n error: error.message || 'Tool execution failed'\n });\n }\n );\n \n // 如果没有内容,设置默认结果\n if (!toolResult.content) {\n toolResult.content = JSON.stringify({ result: 'Tool execution completed' });\n }\n \n } catch (error: any) {\n console.error(`Failed to execute stream tool ${toolName}:`, error);\n toolResult.content = JSON.stringify({\n error: error.message || 'Tool execution failed'\n });\n }\n \n executeResult.push(toolResult);\n \n } else {\n // 使用普通调用(单个工具)\n console.log(`Using regular execution for tool: ${toolName}`);\n const singleToolResult = await this.mcpToolExecute!.execute([toolCall]);\n executeResult.push(...singleToolResult);\n }\n }\n\n // 检查是否在工具执行过程中被中止\n if (this.isAborted) {\n console.log('AiClient: Aborted after tool execution');\n return;\n }\n // 使用简化的工具结果处理器\n const toolMessage = await this.toolResultProcessor.processToolResult(executeResult[0], this.conversationId);\n debugger\n // 将处理后的结果添加到消息列表(已经是总结版本或原版本)\n this.messages.push(toolMessage);\n\n // 通过callback通知展示层工具执行结果\n this.callBack(\"tool_result\", executeResult);\n\n // 工具调用完成后,需要继续调用AI获取响应,而不是立即递归检查\n // 检查是否已被中止\n if (this.isAborted) {\n console.log('AiClient: Aborted before chatCompletion after tool execution');\n return;\n }\n \n await this.chatCompletion();\n \n // 检查是否在AI调用后被中止\n if (this.isAborted) {\n console.log('AiClient: Aborted after chatCompletion after tool execution');\n return;\n }\n \n // 继续递归调用\n await this.handleToolCallRecursively(maxRounds, currentRound + 1);\n } else {\n // 没有工具调用,对话完成\n this.callBack(\"conversation_complete\", message);\n return;\n }\n } else {\n // 如果不是助手,那就是用户或者工具调用结果,这时候就继续调用ai\n // 检查是否已被中止\n if (this.isAborted) {\n console.log('AiClient: Aborted before chatCompletion');\n return;\n }\n \n await this.chatCompletion();\n \n // 检查是否在AI调用后被中止\n if (this.isAborted) {\n console.log('AiClient: Aborted after chatCompletion');\n return;\n }\n \n await this.handleToolCallRecursively(maxRounds, currentRound + 1);\n }\n }\n\n async chatCompletion(): Promise<void> {\n // 检查是否已被中止\n if (this.isAborted) {\n console.log('AiClient: chatCompletion aborted');\n return;\n }\n const aiRequestHandler = new AiRequestHandler(this.messages, this.tools, this.conversationId, this.callBack, this.modelConfig);\n this.currentAiRequestHandler = aiRequestHandler;\n\n try {\n this.messages = await aiRequestHandler.chatCompletion();\n } catch (error) {\n if (this.isAborted) {\n console.log('AiClient: chatCompletion was aborted');\n return;\n }\n throw error;\n } finally {\n this.currentAiRequestHandler = null;\n }\n }\n\n /**\n * 中止当前请求\n */\n abort() {\n console.log('AiClient: Aborting request');\n this.isAborted = true;\n if (this.currentAiRequestHandler) {\n this.currentAiRequestHandler.abort();\n }\n }\n\n /**\n * 检查是否已被中止\n * @returns {boolean}\n */\n isRequestAborted() {\n return this.isAborted;\n }\n\n /**\n * 处理单个chunk数据,提取实际文本内容\n * @param {string} chunk - 单个chunk数据\n * @returns {string} 处理后的文本内容\n */\n processChunk(chunk: any, has_data: boolean = false): string {\n if (!chunk || typeof chunk !== 'string') {\n return chunk || '';\n }\n\n try {\n // 去除可能的 'data: ' 前缀\n let cleanChunk = chunk;\n if (cleanChunk.startsWith('data: ')) {\n cleanChunk = cleanChunk.substring(6);\n }\n \n // 尝试解析JSON\n const parsedChunk = JSON.parse(cleanChunk);\n if (parsedChunk && typeof parsedChunk === 'object') {\n // 优先提取content字段\n if (parsedChunk.content) {\n // 如果content是字符串且以'data: '开头,递归处理\n if (typeof parsedChunk.content === 'string' && parsedChunk.content.startsWith('data: ')) {\n return this.processChunk(parsedChunk.content,false);\n } else {\n return has_data? \"\\n\" + parsedChunk.content + \"\": parsedChunk.content;\n }\n } else if (parsedChunk.data) {\n // 如果data是字符串且以'data: '开头,递归处理\n if (typeof parsedChunk.data === 'string' && parsedChunk.data.startsWith('data: ')) {\n return this.processChunk(parsedChunk.data,true);\n } else {\n return parsedChunk.data;\n }\n } else if (parsedChunk.ai_stream_chunk) {\n // 如果ai_stream_chunk是字符串且以'data: '开头,递归处理\n if (typeof parsedChunk.ai_stream_chunk === 'string' && parsedChunk.ai_stream_chunk.startsWith('data: ')) {\n return this.processChunk(parsedChunk.ai_stream_chunk,false);\n } else {\n return parsedChunk.ai_stream_chunk;\n }\n }\n }\n } catch {\n // 如果不是JSON格式,直接返回原始内容\n return chunk;\n }\n \n return '';\n }\n\n /**\n * 处理工具调用结果,提取实际文本内容而不是JSON格式\n * @param {Object} result - 工具调用结果\n * @returns {Object} 处理后的结果\n */\n\n\n\n\n\n\n\n}\nexport default AiClient;","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n Request, Response\n}))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, env);\n\n const {fetch: envFetch, Request, Response} = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = config ? config.env : {};\n const {fetch, Request, Response} = env;\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters, config) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.12.2\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n","import axios from 'axios';\n\ninterface McpServer {\n name: string;\n url: string;\n}\n\ninterface ToolCall {\n id?: string;\n name?: string;\n function?: {\n name: string;\n arguments: any;\n };\n arguments?: any;\n}\n\ninterface ToolInfo {\n originalName: string;\n serverName: string;\n serverUrl: string;\n supportsStreaming?: boolean;\n}\n\ninterface Tool {\n type: string;\n function: {\n name: string;\n description?: string;\n parameters: any;\n };\n}\n\n// 创建专用于 MCP 的 HTTP 客户端,不包含认证头\nconst mcpHttp = axios.create({\n timeout: 30000,\n headers: {\n 'Content-Type': 'application/json'\n }\n});\n\nclass McpToolExecute {\n private mcpServers: McpServer[];\n private tools: Tool[];\n private toolMetadata: Map<string, ToolInfo>;\n\n constructor(mcpServers: McpServer[]) {\n this.mcpServers = mcpServers\n this.tools = []\n this.toolMetadata = new Map() // 存储工具元数据,不发送给后端\n }\n\n async init(): Promise<void> {\n await this.buildTools();\n }\n\n\n /**\n * 执行流式工具调用\n * @param {Object} toolCall - 工具调用对象\n * @param {Function} onChunk - 接收流式数据的回调函数\n * @param {Function} onComplete - 完成时的回调函数\n * @param {Function} onError - 错误时的回调函数\n * @returns {Promise<void>}\n */\n async executeStream(toolCall: ToolCall, onChunk: (chunk: string) => void, onComplete: () => void, onError: (error: Error) => void): Promise<void> {\n return new Promise(async (resolve, reject) => {\n try {\n const toolName = toolCall.function?.name || toolCall.name!;\n const toolArgs = toolCall.function?.arguments || toolCall.arguments || {};\n\n // 解析参数\n let parsedArgs = toolArgs;\n if (typeof toolArgs === 'string') {\n try {\n parsedArgs = JSON.parse(toolArgs);\n } catch (error) {\n console.warn('Failed to parse tool arguments:', error);\n parsedArgs = {};\n }\n }\n\n // 查找工具信息\n const toolInfo = this.findToolInfo(toolName!);\n if (!toolInfo) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n \n // 检查工具是否支持流式输出\n const supportsStreaming = this.toolSupportsStreaming(toolName);\n console.log(\"开始调用工具:\", supportsStreaming)\n\n if (supportsStreaming) {\n // 使用 SSE 进行流式调用\n await this.callMcpToolStream(\n toolInfo.serverUrl,\n toolInfo.originalName,\n parsedArgs,\n onChunk,\n // 包装onComplete回调,在完成时resolve Promise\n () => {\n onComplete();\n resolve();\n },\n // 包装onError回调,在错误时reject Promise\n (error: any) => {\n onError(new Error(error.message || 'Tool execution failed'));\n reject(error);\n }\n );\n } else {\n // 回退到普通调用\n const result = await this.callMcpTool(\n toolInfo.serverUrl,\n toolInfo.originalName,\n parsedArgs\n );\n onChunk(JSON.stringify(result));\n onComplete();\n resolve();\n }\n\n } catch (error: any) {\n console.error(`Failed to execute stream tool ${toolCall.function?.name || toolCall.name}:`, error);\n onError(new Error(error.message || 'Tool execution failed'));\n reject(error);\n }\n });\n }\n\n async execute(tool_calls: ToolCall[]): Promise<any[]> {\n // 1. 根据tool_calls 中的name 来定位mcpServer 和 tool\n // 需要注意 之前 我们是把 mcpServer 的name 和 tool 的那么拼在一起的 看一下 buildTools\n //2. 定位到 mcp 的 tool 后调用 并返回结果\n console.log(\"开始调用工具,但是没有用流式的方式\")\n\n const results = [];\n\n for (const toolCall of tool_calls) {\n try {\n // 解析工具调用\n const toolName = toolCall.function?.name || toolCall.name;\n const toolArgs = toolCall.function?.arguments || toolCall.arguments || {};\n\n // 检查工具名称是否存在\n if (!toolName) {\n throw new Error('Tool name is required');\n }\n\n // 解析参数(如果是字符串格式)\n let parsedArgs = toolArgs;\n if (typeof toolArgs === 'string') {\n try {\n parsedArgs = JSON.parse(toolArgs);\n } catch (error) {\n console.warn('Failed to parse tool arguments:', error);\n parsedArgs = {};\n }\n }\n\n // 从工具名称中提取服务器名称和原始工具名称\n // 格式: serverName_toolName\n const toolInfo = this.findToolInfo(toolName);\n if (!toolInfo) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n // 调用 MCP 服务器的工具\n const result = await this.callMcpTool(\n toolInfo.serverUrl,\n toolInfo.originalName,\n parsedArgs || {}\n );\n\n results.push({\n tool_call_id: toolCall.id || `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'tool',\n name: toolName,\n content: JSON.stringify(result),\n createdAt: new Date() // 确保工具调用结果有正确的时间戳\n });\n\n } catch (error) {\n console.error(`Failed to execute tool ${toolCall.function?.name || toolCall.name}:`, error);\n\n results.push({\n tool_call_id: toolCall.id || `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'tool',\n name: toolCall.function?.name || toolCall.name,\n content: JSON.stringify({\n error: (error as any).message || 'Tool execution failed'\n })\n });\n }\n }\n\n return results;\n }\n\n /**\n * 根据工具名称查找工具信息\n * @param {string} toolName - 工具名称(包含服务器前缀)\n * @returns {Object|null} 工具信息\n */\n findToolInfo(toolName: string): ToolInfo | null {\n // 从元数据映射中获取工具信息\n if (this.toolMetadata && this.toolMetadata.has(toolName)) {\n return this.toolMetadata.get(toolName) ?? null;\n }\n\n // 如果元数据映射中没有,尝试从工具列表中查找(向后兼容)\n const tool = this.tools.find(t => t.function?.name === toolName);\n if (tool && (tool as any).originalName) {\n return {\n originalName: (tool as any).originalName,\n serverName: (tool as any).serverName,\n serverUrl: (tool as any).serverUrl\n };\n }\n\n return null;\n }\n\n /**\n * 检查工具是否支持流式输出\n * @param {string} toolName - 工具名称\n * @returns {boolean}\n */\n toolSupportsStreaming(_toolName: string): boolean {\n // 新框架中所有工具都支持流式输出\n return true;\n }\n\n /**\n * 使用 SSE 调用 MCP 工具的流式方法\n * @param {string} serverUrl - MCP 服务器 URL\n * @param {string} toolName - 原始工具名称\n * @param {Object} arguments_ - 工具参数\n * @param {Function} onChunk - 接收流式数据的回调\n * @param {Function} onComplete - 完成回调\n * @param {Function} onError - 错误回调\n */\n async callMcpToolStream(serverUrl: string, toolName: string, arguments_: any, onChunk: (chunk: string) => void, onComplete: () => void, onError: (error: Error) => void): Promise<void> {\n try {\n // 构建 SSE URL - 使用OpenAI格式的端点\n const sseUrl = `${serverUrl}/sse/openai/tool/call`;\n\n console.log('MCP Stream Tool Call URL:', sseUrl);\n\n // 创建 AbortController 用于超时控制\n const controller = new AbortController();\n // 不设置总体超时,让流式调用可以持续进行\n // 只在读取层面设置超时检查\n\n // 创建 fetch 的流式响应\n const response = await fetch(sseUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n 'Cache-Control': 'no-cache'\n },\n body: JSON.stringify({\n tool_name: toolName,\n arguments: arguments_\n }),\n signal: controller.signal\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let lastActivityTime = Date.now();\n\n // 设置读取超时检查 - 更宽松的超时设置\n const readTimeoutId = setInterval(() => {\n const now = Date.now();\n if (now - lastActivityTime > 120000) { // 2分钟无数据则超时\n clearInterval(readTimeoutId);\n reader.cancel();\n onError(new Error('Stream read timeout: no data received for 2 minutes'));\n return;\n }\n }, 10000); // 每10秒检查一次\n\n try {\n while (true) {\n const {done, value} = await reader.read();\n\n if (done) {\n break;\n }\n\n lastActivityTime = Date.now(); // 更新活动时间\n buffer += decoder.decode(value, {stream: true});\n\n // 处理 SSE 事件\n const events = this.parseSSEEvents(buffer);\n buffer = events.remaining;\n\n for (const event of events.parsed) {\n const shouldEnd = await this.handleSSEEvent(event, onChunk, onComplete, onError);\n if (shouldEnd) {\n // 收到end事件或error事件,主动结束流式读取\n clearInterval(readTimeoutId);\n reader.cancel(); // 取消reader\n return;\n }\n }\n }\n } finally {\n clearInterval(readTimeoutId);\n reader.releaseLock();\n }\n\n } catch (error: any) {\n console.error(`Failed to call MCP stream tool ${toolName}:`, error);\n\n // 处理不同类型的错误\n if (error.name === 'AbortError') {\n onError(new Error('Stream request was aborted'));\n } else if (error.message && error.message.includes('Stream read timeout')) {\n onError(error);\n } else if (error.message && error.message.includes('fetch')) {\n onError(new Error(`Network error during stream request: ${error.message}`));\n } else {\n onError(new Error(error.message || 'Stream error'));\n }\n }\n }\n\n /**\n * 解析 SSE 事件\n * @param {string} buffer - 缓冲区数据\n * @returns {Object} 解析结果\n */\n parseSSEEvents(buffer: string): { parsed: any[], remaining: string } {\n const events = [];\n const lines = buffer.split('\\n');\n let currentEvent = {};\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i].trim();\n\n if (line === '') {\n // 空行表示事件结束\n if ((currentEvent as any).data) {\n // 对于OpenAI格式,可能没有event字段,只有data字段\n if (!(currentEvent as any).event) {\n (currentEvent as any).event = 'data'; // 默认为data事件\n }\n events.push(currentEvent);\n }\n currentEvent = {};\n } else if (line.startsWith('event:')) {\n (currentEvent as any).event = line.substring(6).trim();\n } else if (line.startsWith('data:')) {\n const dataContent = line.substring(5).trim();\n if (dataContent === '[DONE]') {\n // OpenAI格式的结束标记\n events.push({ event: 'end', data: '{}' });\n } else {\n (currentEvent as any).data = dataContent;\n }\n }\n\n i++;\n }\n\n // 返回未完成的缓冲区部分\n const lastCompleteEventIndex = buffer.lastIndexOf('\\n\\n');\n const remaining = lastCompleteEventIndex >= 0 ?\n buffer.substring(lastCompleteEventIndex + 2) : buffer;\n\n return {parsed: events, remaining};\n }\n\n /**\n * 处理 SSE 事件\n * @param {Object} event - SSE 事件\n * @param {Function} onChunk - 数据回调\n * @param {Function} onComplete - 完成回调\n * @param {Function} onError - 错误回调\n * @returns {boolean} 是否应该结束流式读取\n */\n async handleSSEEvent(event: any, onChunk: (chunk: string) => void, onComplete: () => void, onError: (error: Error) => void): Promise<boolean> {\n try {\n const data = JSON.parse((event as any).data);\n switch ((event as any).event) {\n\n case 'start':\n console.log('Stream started:', data);\n return false;\n\n case 'data':\n console.log('Stream data:', data);\n // 检查是否是OpenAI格式的响应\n if (data.choices && data.choices.length > 0) {\n // OpenAI 格式\n const choice = data.choices[0];\n if (choice.delta) {\n const delta = choice.delta;\n if (delta.content && delta.content) {\n onChunk(delta.content);\n } else if (delta.function_call && delta.function_call.arguments) {\n // 处理函数调用\n onChunk(delta.function_call.arguments);\n }\n }\n }\n // 兼容旧格式:查找 chunk 字段\n else if (data.chunk) {\n onChunk(data.chunk);\n }\n return false;\n\n case 'end':\n console.log('Stream completed:', data);\n onComplete();\n return true; // 返回true表示应该结束流式读取\n\n case 'error':\n console.error('Stream error:', data);\n onError(new Error(data.error || 'Stream error'));\n return true; // 返回true表示应该结束流式读取\n\n default:\n console.warn('Unknown SSE event:', (event as any).event, data);\n return false;\n }\n } catch (error: any) {\n console.error('Failed to parse SSE event:', error);\n onError(new Error(error.message || 'SSE parse error'));\n return true; // 解析错误时也应该结束流式读取\n }\n }\n\n /**\n * 调用 MCP 服务器的工具\n * @param {string} serverUrl - MCP 服务器 URL\n * @param {string} toolName - 原始工具名称\n * @param {Object} arguments_ - 工具参数\n * @returns {Promise<Object>} 工具执行结果\n */\n async callMcpTool(serverUrl: string, toolName: string, arguments_: any): Promise<any> {\n try {\n // 构建 JSON-RPC 请求\n const request = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: arguments_ || {}\n }\n };\n\n // 在开发环境使用代理,生产环境使用直接地址\n const mcpUrl = `${serverUrl}`\n\n console.log('MCP Tool Call URL:', mcpUrl);\n // 发送请求到 MCP 服务器\n const response = await mcpHttp.post(mcpUrl, request);\n\n if (response.data.error) {\n throw new Error(`MCP tool call failed: ${response.data.error.message}`);\n }\n\n return response.data.result;\n\n } catch (error: any) {\n console.error(`Failed to call MCP tool ${toolName}:`, error);\n throw error;\n }\n }\n\n\n async buildTools(): Promise<void> {\n try {\n this.tools = [];\n\n // 1. 首先循环调用mcp 服务获取每个服务的tools\n for (const mcpServer of this.mcpServers) {\n try {\n // 调用MCP服务获取tools - 使用标准的 MCP 协议\n const request = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n method: 'tools/list',\n params: {}\n };\n\n // 在开发环境使用代理,生产环境使用直接地址\n const mcpUrl = `${mcpServer.url}`\n\n console.log('MCP Tools List URL:', mcpUrl);\n const toolsResponse = await mcpHttp.post(mcpUrl, request);\n\n if (toolsResponse.data.error) {\n throw new Error(`MCP tools/list failed: ${toolsResponse.data.error.message}`);\n }\n\n const serverTools = toolsResponse.data.result?.tools || [];\n\n // 2. 拼接成一个列表,但是有一个注意的点,因为每个mcpServer 中的 tools 的名称可能重复,\n // 所以在拼接成我们自己的 tools 列表的时候,需要用 mcpServer的名称 + mcpServer 中tool 的名称\n const prefixedTools = serverTools.map((tool: any) => {\n // 转换为 OpenAI 工具格式(只包含标准字段)\n const openaiTool = {\n type: \"function\",\n function: {\n name: `${mcpServer.name}_${tool.name}`,\n description: tool.description,\n parameters: tool.input_schema || tool.inputSchema || tool.parameters || {}\n }\n };\n\n // 将元数据存储在单独的映射中,不发送给后端\n this.toolMetadata = this.toolMetadata || new Map();\n this.toolMetadata.set(`${mcpServer.name}_${tool.name}`, {\n originalName: tool.name,\n serverName: mcpServer.name,\n serverUrl: mcpServer.url,\n supportsStreaming: true // 新框架中所有工具都支持流式输出\n });\n\n return openaiTool;\n });\n\n this.tools.push(...prefixedTools);\n } catch (error: any) {\n console.error(`Failed to get tools from MCP server ${mcpServer.name}:`, error);\n // 继续处理其他服务器,不因为一个服务器失败而中断\n }\n }\n } catch (error: any) {\n console.error('buildTools failed:', error);\n throw error;\n }\n }\n\n getTools(): Tool[] {\n return this.tools;\n }\n}\n\nexport default McpToolExecute;","\n\nimport { conversationsApi } from '../api';\n// import http from '../utils/http';\nimport AiClient from \"./aiClient\";\nimport McpToolsExecute from \"./mcpToolExecute\";\nimport { messageManager } from './messageManager';\nimport type { Message, AiModelConfig } from '../../types';\n\ntype CallbackType = 'chunk' | 'tool_call' | 'tool_result' | 'tool_stream_chunk' | 'conversation_complete' | 'error' | 'complete';\n\ninterface Conversation {\n id: string;\n global_prompt?: string;\n}\n\n// interface Assistant {\n// id: string;\n// system_prompt?: string;\n// model_config: any;\n// }\n\ninterface McpServer {\n id: string;\n name: string;\n url: string;\n config: any;\n}\n\nclass AiServer {\n private conversationId: string;\n private conversation: Conversation | null;\n private mcpServers: McpServer[];\n private messages: Message[];\n private tools: any[];\n private mcpToolsExecute: McpToolsExecute | null;\n private modelConfig: AiModelConfig | null;\n private currentAiClient: AiClient | null;\n private isAborted: boolean;\n\n constructor(conversation_id: string, customModelConfig: AiModelConfig | null = null){\n this.conversationId = conversation_id\n this.conversation = null;\n this.mcpServers = []\n this.messages = []\n this.tools = []\n this.mcpToolsExecute= null\n this.modelConfig = customModelConfig;\n // 添加中止控制\n this.currentAiClient = null;\n this.isAborted = false;\n }\n\n async init(): Promise<void> {\n try {\n // 1. 根据conversationId 获取会话详细信息(包括全局提示词)\n const conversationResponse = await conversationsApi.getDetails(this.conversationId);\n this.conversation = conversationResponse.data.conversation;\n \n\n console.log('AiServer - Conversation:', this.conversation);\n console.log('AiServer - API Key:', this.modelConfig?.api_key ? 'Present' : 'Missing');\n\n // 4. 获取全局MCP配置\n const mcpResponse = await conversationsApi.getMcpServers();\n console.log(\"mcpResponse\", mcpResponse)\n\n this.mcpServers = mcpResponse.data.mcp_servers || [];\n // 5. 根据mcpServices 获取tools 列表\n this.mcpToolsExecute = new McpToolsExecute(this.mcpServers!);\n await this.mcpToolsExecute.init();\n this.tools = this.mcpToolsExecute.getTools();\n // messages 在发送消息的时候 动态获取 所以不在init 中\n } catch (error) {\n console.error('AiServer init failed:', error);\n throw error;\n }\n }\n\n\n\n /**\n * 回调函数,用于处理AI响应过程中的各种事件\n * @param {string} type - 事件类型 ('chunk', 'tool_call', 'error', 'complete')\n * @param {any} data - 事件数据\n */\n callback(type: CallbackType, data?: any): void {\n switch (type) {\n case 'chunk':\n // 处理流式响应的文本块\n console.log('Received chunk:', data);\n break;\n case 'tool_call':\n // 处理工具调用\n console.log('Tool call:', data);\n break;\n case 'error':\n // 处理错误\n console.error('AI Client error:', data);\n break;\n case 'complete':\n // 处理完成事件\n console.log('AI response complete:', data);\n break;\n default:\n console.log('Unknown callback type:', type, data);\n }\n }\n\n async sendMessage(userMessage: string): Promise<void> {\n try {\n console.log('AiServer sendMessage called with:', userMessage);\n console.log('Message type:', typeof userMessage);\n console.log('Message length:', userMessage?.length);\n\n // 如果没有初始化,跳过后端API调用,直接使用前端消息\n if (!this.conversation) {\n return this.sendMessageDirect(userMessage);\n }\n\n // 用户消息已经在store中保存了,这里不需要重复保存\n console.log('Processing user message:', userMessage);\n\n //2. 获取历史消息\n const messagesResponse = await conversationsApi.getMessages(this.conversationId);\n const rawMessages = messagesResponse.data.messages || [];\n\n // 确保消息按时间顺序排列(最早的在前面,最新的在后面)\n const sortedMessages = rawMessages.sort((a: any, b: any) => {\n const timeA = new Date(a.created_at || a.timestamp || 0);\n const timeB = new Date(b.created_at || b.timestamp || 0);\n \n // 处理无效日期\n const validTimeA = isNaN(timeA.getTime()) ? 0 : timeA.getTime();\n const validTimeB = isNaN(timeB.getTime()) ? 0 : timeB.getTime();\n \n return validTimeA - validTimeB;\n });\n\n // 构建完整的消息历史,包含系统提示词\n this.messages = [];\n \n // 获取系统提示词 - 从 system_context 获取\n let systemPrompt = '';\n try {\n const response = await fetch('/api/system-context');\n if (response.ok) {\n const data = await response.json();\n systemPrompt = data.content || '';\n }\n } catch (error) {\n console.log('Failed to load system context:', error);\n }\n\n // 如果会话有全局提示词,拼接到系统提示词中\n if (this.conversation && this.conversation.global_prompt) {\n if (systemPrompt) {\n systemPrompt = this.conversation.global_prompt + '\\n\\n' + systemPrompt;\n } else {\n systemPrompt = this.conversation.global_prompt;\n }\n console.log('Added global prompt to system prompt:', this.conversation.global_prompt.substring(0, 100) + '...');\n }\n \n // 如果有系统提示词,添加到消息历史开头\n\n if (systemPrompt) {\n this.messages.push({\n role: 'system',\n content: systemPrompt\n } as any);\n console.log('Final system prompt added to messages:', systemPrompt.substring(0, 100) + '...');\n }\n \n // 添加历史消息(限制为最近2条:1条用户消息 + 1条助手回复)\n const recentMessages = sortedMessages.slice(-2); // 取最后2条消息\n this.messages.push(...recentMessages);\n\n console.log('Messages prepared for AI:', this.messages.map(m => ({\n role: m.role,\n content: (m.content || (m as any).message || '').substring(0, 50) + '...',\n created_at: (m as any).created_at\n })));\n //3. 调用AI\n const aiClient = new AiClient(this.messages, this.conversationId, this.tools, this.modelConfig!, (type: any, data?: any) => this.callback(type, data), this.mcpToolsExecute);\n this.currentAiClient = aiClient;\n\n try {\n await aiClient.start();\n } catch (error) {\n if (this.isAborted) {\n console.log('AiServer: Request was aborted');\n return;\n }\n throw error;\n } finally {\n this.currentAiClient = null;\n }\n } catch (error: any) {\n console.error('sendMessage failed:', error);\n console.error('Error details:', error.response?.data);\n this.callback('error', error);\n throw error;\n }\n }\n\n\n\n\n\n /**\n * 获取会话消息\n * @param {Object} params - 分页参数 {page, limit}\n * @returns {Promise}\n */\n\n // 直接发送消息,不依赖后端API\n async sendMessageDirect(userMessage: string): Promise<void> {\n try {\n console.log('AiServer sendMessageDirect called with:', userMessage);\n \n // 构建简单的消息历史\n this.messages = [\n {\n role: 'user',\n content: userMessage\n } as any\n ];\n \n console.log('Messages prepared for AI:', this.messages);\n \n // 调用AI(不使用工具)\n const aiClient = new AiClient(this.messages, this.conversationId, [], this.modelConfig!, (type: any, data?: any) => this.callback(type, data), null);\n this.currentAiClient = aiClient;\n \n try {\n await aiClient.start();\n } catch (error) {\n if (this.isAborted) {\n console.log('AiServer: Request was aborted');\n return;\n }\n throw error;\n } finally {\n this.currentAiClient = null;\n }\n } catch (error: any) {\n console.error('sendMessageDirect failed:', error);\n this.callback('error', error);\n throw error;\n }\n }\n\n async getMessages(params: any = {}): Promise<any> {\n try {\n const response = await conversationsApi.getMessages(this.conversationId, params);\n this.messages = response.data.messages || [];\n return response.data;\n } catch (error: any) {\n console.error('getMessages failed:', error);\n throw error;\n }\n }\n\n /**\n * 添加消息到会话\n * @param {string} message - 消息内容\n * @param {string} role - 消息角色 ('user' | 'assistant')\n * @returns {Promise}\n */\n async addMessage(message: string, role: string = 'user'): Promise<any> {\n try {\n // 使用统一的消息管理器保存消息\n const savedMessage = await messageManager.saveMessage({\n content: message,\n role,\n sessionId: this.conversationId,\n createdAt: new Date()\n } as Message);\n return { message: savedMessage };\n } catch (error: any) {\n console.error('addMessage failed:', error);\n throw error;\n }\n }\n\n\n\n\n\n /**\n * 中止当前请求\n */\n abort(): void {\n console.log('AiServer: Aborting request');\n this.isAborted = true;\n if (this.currentAiClient) {\n this.currentAiClient.abort();\n }\n }\n\n /**\n * 检查是否已被中止\n * @returns {boolean}\n */\n isRequestAborted(): boolean {\n return this.isAborted;\n }\n\n /**\n * 重置中止状态\n */\n resetAbortState(): void {\n this.isAborted = false;\n this.currentAiClient = null;\n }\n}\n\nexport default AiServer;","import { DatabaseService } from '../database';\nimport type { McpConfig } from '../database/schema';\n\n// import McpToolExecute from './mcpToolExecute';\nimport AiServer from './aiServer';\n\n// 扩展DatabaseService以包含MCP相关方法\nclass ExtendedDatabaseService extends DatabaseService {\n async getAllMcpConfigs(): Promise<McpConfig[]> {\n // 实现获取所有MCP配置的逻辑\n return [];\n }\n\n async createMcpConfig(config: Omit<McpConfig, 'id' | 'createdAt' | 'updatedAt'>): Promise<McpConfig> {\n // 实现创建MCP配置的逻辑\n const newConfig: McpConfig = {\n ...config,\n id: Math.random().toString(36).substr(2, 9),\n createdAt: new Date(),\n updatedAt: new Date()\n };\n return newConfig;\n }\n\n\n\n async getUserConfig<T>(_key: string): Promise<T | null> {\n // 实现获取用户配置的逻辑\n return null;\n }\n}\n\n/**\n * 聊天配置接口\n */\nexport interface ChatConfig {\n model: string;\n temperature: number;\n maxTokens: number;\n apiKey: string;\n baseUrl: string;\n}\n\n/**\n * 聊天服务回调类型\n */\nexport interface ChatServiceCallbacks {\n onChunk?: (data: { type: string; content: string; accumulated?: string }) => void;\n onToolCall?: (toolCalls: any[]) => void;\n onToolResult?: (results: any[]) => void;\n onToolStreamChunk?: (data: { toolCallId: string; chunk: string }) => void;\n onComplete?: (message: any) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * 聊天服务管理器\n */\nexport class ChatService {\n // private mcpToolExecute: any = null;\n private currentAiClient: any = null;\n private dbService: ExtendedDatabaseService;\n\n constructor() {\n this.dbService = new ExtendedDatabaseService();\n }\n\n\n\n /**\n * 发送消息并处理AI响应\n */\n async sendMessage(\n sessionId: string,\n content: string,\n _attachments: any[] = [],\n callbacks: ChatServiceCallbacks = {},\n modelConfig?: {\n model_name: string;\n temperature: number;\n max_tokens: number;\n api_key: string;\n base_url: string;\n }\n ): Promise<void> {\n try {\n // 获取会话信息\n const session = await this.dbService.getSession(sessionId);\n if (!session) {\n throw new Error('Session not found');\n }\n\n\n let finalModelConfig;\n if (modelConfig) {\n finalModelConfig = modelConfig;\n } else {\n const chatConfig = await this.getChatConfig();\n finalModelConfig = {\n model_name: chatConfig.model,\n temperature: chatConfig.temperature,\n max_tokens: 16000,\n api_key: chatConfig.apiKey,\n base_url: chatConfig.baseUrl\n };\n }\n\n\n // 使用AiServer进行AI调用\n const aiServer = new AiServer(sessionId, finalModelConfig as any);\n \n // 添加初始化重试机制\n let initRetries = 3;\n while (initRetries > 0) {\n try {\n await aiServer.init();\n // 初始化完成后设置外部获取的工具\n break;\n } catch (error) {\n initRetries--;\n if (initRetries === 0) {\n throw new Error(`AI服务初始化失败: ${error instanceof Error ? error.message : '未知错误'}`);\n }\n // 等待1秒后重试\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n }\n \n // 设置回调函数处理AI响应\n aiServer.callback = (type: string, data: any) => {\n try {\n switch (type) {\n case 'chunk':\n // 处理chunk数据,确保提取正确的内容\n const chunkContent = typeof data === 'string' ? data : \n (data.content || data.accumulated || '');\n callbacks.onChunk?.({\n type: 'text',\n content: chunkContent,\n accumulated: chunkContent\n });\n break;\n case 'summary_chunk':\n const summaryChunkContent = typeof data === 'string' ? data : \n (data.content || data.accumulated || '');\n callbacks.onChunk?.({\n type: 'text',\n content: summaryChunkContent,\n accumulated: summaryChunkContent\n });\n break\n case 'tool_call':\n callbacks.onToolCall?.(data);\n break;\n case 'tool_result':\n callbacks.onToolResult?.(data);\n break;\n case 'tool_stream_chunk':\n callbacks.onToolStreamChunk?.(data);\n break;\n case 'complete':\n debugger\n\n break;\n case 'conversation_complete':\n \n // 不在这里保存助手消息,因为aiRequestHandler.js已经保存了\n // 直接调用完成回调\n callbacks.onComplete?.(data);\n break;\n case 'error':\n const errorMessage = data instanceof Error ? data.message : (typeof data === 'string' ? data : 'AI响应出错');\n callbacks.onError?.(new Error(errorMessage));\n break;\n default:\n console.warn('Unknown AI response type:', type);\n }\n } catch (callbackError) {\n console.error('Callback error:', callbackError);\n callbacks.onError?.(new Error(`处理AI响应时出错: ${callbackError instanceof Error ? callbackError.message : '未知错误'}`));\n }\n };\n \n // 发送消息给AI\n await aiServer.sendMessage(content);\n \n // 设置当前AI客户端引用\n this.currentAiClient = aiServer;\n\n } catch (error) {\n console.error('Failed to send message:', error);\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * 中止当前对话\n */\n abortCurrentConversation(): void {\n if (this.currentAiClient) {\n this.currentAiClient.abort();\n this.currentAiClient = null;\n }\n }\n\n\n\n\n\n\n\n /**\n * 获取聊天配置\n */\n async getChatConfig(): Promise<ChatConfig> {\n const config = await this.dbService.getUserConfig<ChatConfig>('chatConfig');\n return config || {\n model: 'gpt-3.5-turbo',\n temperature: 0.7,\n maxTokens: 4000,\n apiKey: '',\n baseUrl: 'https://api.openai.com/v1'\n };\n }\n\n\n\n}\n\n// 导出单例实例\nexport const chatService = new ChatService();","// 主要组件 - 独立聊天界面(推荐使用)\nexport { default as StandaloneChatInterface } from './components/StandaloneChatInterface';\n\n// 其他组件(高级用法)\nexport { ChatInterface } from './components/ChatInterface';\nexport { MessageList } from './components/MessageList';\nexport { MessageItem } from './components/MessageItem';\nexport { InputArea } from './components/InputArea';\nexport { SessionList } from './components/SessionList';\nexport { ThemeToggle } from './components/ThemeToggle';\nexport { default as McpManager } from './components/McpManager';\nexport { default as AiModelManager } from './components/AiModelManager';\nexport { default as SystemContextEditor } from './components/SystemContextEditor';\nexport { AttachmentRenderer } from './components/AttachmentRenderer';\nexport { ToolCallRenderer } from './components/ToolCallRenderer';\nexport { MarkdownRenderer } from './components/MarkdownRenderer';\nexport { LoadingSpinner } from './components/LoadingSpinner';\nexport { ErrorBoundary } from './components/ErrorBoundary';\n\n// UI组件导出\nexport * from './components/ui/icons';\n\n// Hooks导出\nexport { useTheme } from './hooks/useTheme';\n\n// Store导出\nexport { useChatStore } from './lib/store';\n\n// 服务导出\nexport * from './lib/services';\nexport * from './lib/api';\n// export { default as ChatService } from './lib/services';\n\n// 数据库导出(避免类型冲突)\nexport { databaseService } from './lib/database';\n// export { getDatabase } from './lib/database'; // 已移除\n\n// 工具函数导出\nexport * from './lib/utils';\n\n// 类型导出\nexport type * from './types';\n\n// 样式导出\nimport './styles/index.css';\n\n// 默认导出 - 独立聊天界面组件(推荐使用)\nexport { default } from './components/StandaloneChatInterface';\n\n// Provider组件导出(如果存在)\n// export * from './components/providers';\n\n// 版本信息\nexport const version = '1.0.0';\n\n// 配置类型\nexport type {\n ChatConfig,\n AiModelConfig,\n McpConfig,\n Theme,\n ChatInterfaceProps,\n MessageListProps,\n InputAreaProps,\n SessionListProps\n} from './types';\n\nexport type { StandaloneChatInterfaceProps } from './components/StandaloneChatInterface';"],"names":["createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","__vite_import_meta_env__","createStore","React","require$$0","is","x","y","objectIs","useState","useEffect","useLayoutEffect","useDebugValue","useSyncExternalStore$2","subscribe","getSnapshot","value","_useState","inst","forceUpdate","checkIfSnapshotChanged","latestGetSnapshot","nextValue","useSyncExternalStore$1","shim","useSyncExternalStoreShim_production","didWarnOld18Alpha","didWarnUncachedGetSnapshot","cachedValue","useSyncExternalStoreShim_development","shimModule","require$$1","useSyncExternalStore","useRef","useMemo","withSelector_production","getServerSnapshot","selector","isEqual","instRef","memoizedSelector","nextSnapshot","hasMemo","memoizedSnapshot","currentSelection","memoizedSelection","nextSelection","maybeGetServerSnapshot","withSelector_development","withSelectorModule","ReactExports","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","didWarnAboutEqualityFn","identity","arg","useStore","equalityFn","slice","createImpl","useBoundStore","create","subscribeWithSelectorImpl","fn","set","get","origSubscribe","optListener","options","currentSlice","nextSlice","previousSlice","subscribeWithSelector","createJSONStorage","getStorage","storage","name","_a","parse","str2","str","newValue","toThenable","input","result","onFulfilled","_onRejected","e","_onFulfilled","onRejected","oldImpl","config","baseOptions","persistedState","currentState","hasHydrated","hydrationListeners","finishHydrationListeners","args","thenableSerialize","setItem","errorInSync","thenable","serializedValue","savedSetState","configResult","stateFromStorage","hydrate","cb","postRehydrationCallback","storageValue","deserializedStorageValue","migratedState","_a2","newOptions","newImpl","_b","migrationResult","migrated","persistImpl","persist","NOTHING","DRAFTABLE","DRAFT_STATE","errors","plugin","thing","data","die","error","msg","getPrototypeOf","isDraft","isDraftable","isPlainObject","isMap","isSet","objectCtorString","proto","Ctor","each","obj","iter","getArchtype","key","entry","index","has","prop","propOrOldValue","t","target","latest","shallowCopy","base","strict","isPlain","descriptors","keys","i","desc","freeze","deep","isFrozen","dontMutateFrozenCollections","plugins","getPlugin","pluginKey","currentScope","getCurrentScope","createScope","parent_","immer_","usePatchesInScope","scope","patchListener","revokeScope","leaveScope","revokeDraft","enterScope","immer2","draft","processResult","baseDraft","finalize","maybeFreeze","rootScope","path","childValue","finalizeProperty","resultEach","isSet2","parentState","targetObject","rootPath","targetIsSet","res","createProxyProxy","parent","isArray","traps","objectTraps","arrayTraps","revoke","proxy","source","readPropFromProto","peek","prepareCopy","createProxy","getDescriptorFromProto","current2","markChanged","owner","Immer2","recipe","defaultBase","self","base2","hasError","p","ip","patches","inversePatches","current","patch","applyPatchesImpl","currentImpl","copy","immer","produce","immerImpl","initializer","store","updater","API_BASE_URL","ApiClient","baseUrl","__publicField","endpoint","url","response","id","sessionId","requestData","content","apiClient","DatabaseService","sessionData","session","_id","_updates","messageData","messageRequestData","message","databaseService","_MessageManager","messageKey","resolve","saved","savedMessage","MessageManager","messageManager","useChatStore","sessions","title","conversationsApi","index$1","sessionResponse","messagesResponse","messages","tc","conversation","processed","a","b","timeA","timeB","updates","sessionIndex","s","metadata","_d","_c","attachments","currentSessionId","selectedModelId","aiModelConfigs","selectedModel","model","userMessageTime","userMessage","assistantMessageTime","tempAssistantMessage","chatService","chatConfig","modelConfig","m","currentIndex","segments","toolCalls","toolCall","results","tempMessage","tempIndex","messageId","dbUpdates","messageIndex","streamingMessageId","theme","newConfig","configs","c","configIndex","existingConfig","method","apiData","errorText","modelId","useCurrentSession","useSessions","createChatStore","customApiClient","client","updatedSession","currentSession","assistantMessage","updatedMessage","r","f","o","clsx","CLASS_PART_SEPARATOR","createClassGroupUtils","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","className","classParts","getGroupRecursive","getGroupIdForArbitraryProperty","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","classGroupFromNextClassPart","classRest","validator","arbitraryPropertyRegex","arbitraryPropertyClassName","property","prefix","getPrefixedClassGroupEntries","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","currentClassPartObject","pathPart","func","classGroupEntries","prefixedClassGroup","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","classGroupsInConflict","classNames","originalClassName","variantModifier","modifierId","classId","conflictGroups","group","twJoin","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","isArbitraryNumber","isInteger","isPercent","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","getNumberWithAutoAndArbitrary","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","twMerge","getRandomValues","rnds8","rng","byteToHex","unsafeStringify","arr","offset","randomUUID","native","v4","buf","rnds","millisecondsInWeek","millisecondsInDay","minutesInMonth","minutesInDay","constructFromSymbol","constructFrom","date","toDate","context","defaultOptions","getDefaultOptions","startOfWeek","weekStartsOn","_date","day","diff","startOfISOWeek","getISOWeekYear","year","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","getTimezoneOffsetInMilliseconds","utcDate","normalizeDates","dates","normalize","startOfDay","differenceInCalendarDays","laterDate","earlierDate","laterDate_","earlierDate_","laterStartOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","startOfISOWeekYear","fourthOfJanuary","compareAsc","dateLeft","dateRight","constructNow","isDate","isValid","differenceInCalendarMonths","yearsDiff","monthsDiff","getRoundingMethod","number","differenceInMilliseconds","endOfDay","endOfMonth","month","isLastDayOfMonth","differenceInMonths","workingLaterDate","sign","difference","isLastMonthNotFull","differenceInSeconds","startOfYear","date_","formatDistanceLocale","formatDistance","token","count","tokenValue","buildFormatLongFn","width","dateFormats","timeFormats","dateTimeFormats","formatLong","formatRelativeLocale","formatRelative","_baseDate","_options","buildLocalizeFn","valuesArray","defaultWidth","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","rem100","localize","quarter","buildMatchFn","matchPattern","matchResult","matchedString","parsePatterns","findIndex","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","enUS","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","output","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","hours","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","timestamp","delimiter","absOffset","minutes","dateLongFormatter","timeLongFormatter","dateTimeLongFormatter","datePattern","timePattern","dateTimeFormat","longFormatters","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","format","_message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","locale","defaultLocale","originalDate","parts","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","part","formatter","matched","minutesInAlmostTwoDays","comparison","localizeOptions","seconds","offsetInSeconds","months","days","nearestMonth","monthsSinceStartOfYear","years","formatDistanceToNow","cn","inputs","generateId","uuidv4","formatTime","validDate","formatRelativeTime","formatDate","formatDateTime","truncateText","text","maxLength","cleanHtmlContent","isValidEmail","email","isValidUrl","deepClone","item","clonedObj","debounce","wait","timeout","throttle","limit","inThrottle","formatFileSize","bytes","sizes","getFileExtension","filename","isImageFile","imageExtensions","extension","generateRandomColor","copyToClipboard","downloadFile","mimeType","blob","link","isMobile","getOS","userAgent","AppError","code","statusCode","retry","maxAttempts","delay","lastError","attempt","defaultValue","MarkdownRenderer","isStreaming","renderContent","processedText","mathBlockRegex","_match","formula","mathInlineRegex","codeBlockRegex","language","lang","highlightedCode","highlightCode","inlineCodeRegex","highlighted","jsxs","jsx","AttachmentRenderer","attachment","customRenderer","isAudio","getFileIcon","ToolCallRenderer","allMessages","isExpanded","setIsExpanded","showArguments","setShowArguments","showResult","setShowResult","toolResultMessage","resultContent","resultSummary","hasResult","hasArguments","formatJson","MessageItem","isLast","onEdit","onDelete","isEditing","setIsEditing","editContent","setEditContent","showActions","setShowActions","isUser","isAssistant","isSystem","isTool","handleEdit","handleCancelEdit","handleCopy","rawToolCalls","contentSegments","hasContent","isCurrentlyStreaming","segment","LoadingSpinner","size","sizeClasses","MessageList","isLoading","onMessageEdit","onMessageDelete","InputArea","onSend","disabled","placeholder","allowAttachments","supportedFileTypes","showModelSelector","availableModels","onModelChange","setMessage","setAttachments","isDragging","setIsDragging","textareaRef","fileInputRef","adjustTextareaHeight","useCallback","textarea","scrollHeight","maxHeight","handleInputChange","handleKeyDown","handleSend","trimmedMessage","handleFileSelect","files","prev","removeAttachment","_","handleDragOver","handleDragLeave","handleDrop","file","PlusIcon","DotsVerticalIcon","PencilIcon","TrashIcon","CheckIcon","XIcon","ChatIcon","formatTimeAgo","now","past","isoString","diffInSeconds","SessionList","onClose","createSession","selectSession","deleteSession","updateSession","editingSessionId","setEditingSessionId","editingTitle","setEditingTitle","handleCreateSession","handleSelectSession","handleDeleteSession","handleStartEdit","currentTitle","handleSaveEdit","handleKeyPress","Fragment","menu","getSystemTheme","getActualTheme","applyTheme","actualTheme","root","metaThemeColor","getSavedTheme","saveTheme","useTheme","setThemeState","setActualTheme","setTheme","newTheme","newActualTheme","toggleTheme","mediaQuery","handleChange","ThemeToggle","getThemeIcon","getThemeLabel","ServerIcon","XMarkIcon","EditIcon","McpManager","mcpConfigs","updateMcpConfig","deleteMcpConfig","loadMcpConfigs","showAddForm","setShowAddForm","editingConfig","setEditingConfig","formData","setFormData","resetForm","handleAddServer","handleEditServer","updatedConfig","startEdit","handleDeleteServer","toggleServerEnabled","BrainIcon","AiModelManager","loadAiModelConfigs","updateAiModelConfig","deleteAiModelConfig","DocumentIcon","SaveIcon","SystemContextEditor","systemContext","updateSystemContext","loadSystemContext","setContent","setIsLoading","isSaving","setIsSaving","handleSave","StandaloneChatInterface","apiBaseUrl","port","customApiBaseUrl","loadSessions","sendMessage","clearError","setSelectedModel","messagesEndRef","isSessionModalOpen","setIsSessionModalOpen","showMcpManager","setShowMcpManager","showAiModelManager","setShowAiModelManager","showSystemContextEditor","setShowSystemContextEditor","handleMessageSend","ChatInterface","onMessageSend","ErrorBoundary","Component","props","errorInfo","request","errorMessage","errorData","conversationId","_conversationId","defaultConfig","_params","default_format","v","RFC1738","is_array","hex_table","encode","_defaultEncoder","charset","_kind","$0","out","j","is_buffer","maybe_map","val","mapped","array_prefix_generators","push","push_to_array","value_or_array","to_ISO","defaults","is_non_nullish_primitive","sentinel","inner_stringify","generateArrayPrefix","commaRoundTrip","allowEmptyArrays","strictNullHandling","skipNulls","encodeDotInKeys","encoder","filter","sort","allowDots","serializeDate","encodeValuesOnly","sideChannel","tmp_sc","step","find_flag","pos","key_value","values","obj_keys","encoded_prefix","adjusted_prefix","encoded_key","key_prefix","valueSideChannel","normalize_stringify_options","opts","arrayFormat","stringify","joined","VERSION","auto","kind","fetch","FormData","File","ReadableStream","getMultipartRequestOptions","getDefaultAgent","fileFromPath","isFsReadStream","setShims","shims","MultipartBody","body","getRuntime","manuallyImported","recommendation","_fetch","_Request","_Response","_Headers","form","init","shims.kind","shims.setShims","auto.getRuntime","OpenAIError","APIError","status","headers","errorResponse","APIConnectionError","castToError","BadRequestError","AuthenticationError","PermissionDeniedError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","APIUserAbortError","cause","APIConnectionTimeoutError","LengthFinishReasonError","ContentFilterFinishReasonError","__classPrivateFieldSet","receiver","__classPrivateFieldGet","_LineDecoder_carriageReturnIndex","LineDecoder","chunk","binaryChunk","newData","lines","patternIndex","findNewlineIndex","endIndex","line","buffer","startIndex","findDoubleNewlineIndex","ReadableStreamToAsyncIterable","stream","reader","cancelPromise","Stream","iterator","controller","consumed","done","sse","_iterSSEMessages","createResponseHeaders","readableStream","iterLines","lineDecoder","left","right","teeIterator","queue","ctrl","err","sseDecoder","SSEDecoder","sseChunk","iterSSEChunks","fieldname","partition","isResponseLike","isFileLike","isBlobLike","isUploadable","toFile","bits","getBytes","getName","type","isAsyncIterableIterator","propsForError","getStringFromMaybeBuffer","isMultipartBody","multipartFormRequestOptions","createForm","addFormValue","_AbstractPage_client","defaultParseResponse","debug","contentType","mediaType","json","_addRequestID","APIPromise","responsePromise","parseResponse","transform","onfulfilled","onrejected","onfinally","APIClient","baseURL","maxRetries","httpAgent","overriddenFetch","validatePositiveInteger","getPlatformHeaders","customHeaders","uuid4","Page","inputOptions","retryCount","query","contentLength","minAgentTimeout","reqHeaders","defaultHeaders","applyHeadersMut","shimsKind","getHeader","header","remainingRetries","optionsInput","retriesRemaining","req","responseHeaders","retryMessage","errText","errJSON","safeJSON","errMessage","PagePromise","isAbsoluteURL","defaultQuery","isEmptyObj","ms","signal","fetchOptions","shouldRetryHeader","timeoutMillis","retryAfterMillisHeader","timeoutMs","retryAfterHeader","timeoutSeconds","sleep","numRetries","sleepSeconds","jitter","AbstractPage","nextInfo","nextOptions","params","page","requestOptionsKeys","isRequestOptions","hasOwn","getPlatformProperties","normalizePlatform","normalizeArch","browserInfo","getBrowserInfo","browserPatterns","major","minor","arch","platform","_platformHeaders","startsWithSchemeRegexp","n","readEnv","env","_e","_k","targetHeaders","newHeaders","lowerKey","SENSITIVE_HEADERS","action","modifiedArgs","modifiedArg","isRunningInBrowser","isHeadersProtocol","lowerCasedHeader","intercapsHeader","_m","g1","g2","toFloat32Array","base64Str","binaryStr","len","isObj","CursorPage","info","APIResource","completionId","ChatCompletionStoreMessagesPage","MessagesAPI.Messages","ChatCompletionsPage","Completions","Messages","CompletionsAPI.Completions","Chat","Speech","Transcriptions","Core.multipartFormRequestOptions","Translations","Audio","TranscriptionsAPI.Transcriptions","TranslationsAPI.Translations","SpeechAPI.Speech","Batches","batchId","BatchesPage","_EventStream_instances","_EventStream_connectedPromise","_EventStream_resolveConnectedPromise","_EventStream_rejectConnectedPromise","_EventStream_endPromise","_EventStream_resolveEndPromise","_EventStream_rejectEndPromise","_EventStream_listeners","_EventStream_ended","_EventStream_errored","_EventStream_aborted","_EventStream_catchingPromiseCreated","_EventStream_handleError","EventStream","reject","executor","event","l","openAIError","_AssistantStream_instances","_AssistantStream_events","_AssistantStream_runStepSnapshots","_AssistantStream_messageSnapshots","_AssistantStream_messageSnapshot","_AssistantStream_finalRun","_AssistantStream_currentContentIndex","_AssistantStream_currentContent","_AssistantStream_currentToolCallIndex","_AssistantStream_currentToolCall","_AssistantStream_currentEvent","_AssistantStream_currentRunSnapshot","_AssistantStream_currentRunStepSnapshot","_AssistantStream_addEvent","_AssistantStream_endRequest","_AssistantStream_handleMessage","_AssistantStream_handleRunStep","_AssistantStream_handleEvent","_AssistantStream_accumulateRunStep","_AssistantStream_accumulateMessage","_AssistantStream_accumulateContent","_AssistantStream_handleRun","AssistantStream","pushQueue","readQueue","runner","threadId","runId","runs","run","thread","acc","delta","deltaValue","accValue","Core.isObj","deltaEntry","accEntry","accumulatedMessage","newContent","snapshotContent","textDelta","snapshot","currentContent","accumulatedRunStep","accumulated","contentElement","Assistants","assistantId","AssistantsPage","isRunnableFunctionWithParse","isAssistantMessage","isFunctionMessage","isToolMessage","isAutoParsableResponseFormat","response_format","isAutoParsableTool","tool","maybeParseChatCompletion","completion","hasAutoParseableInput","choice","parseChatCompletion","choices","parseToolCall","parseResponseFormat","inputTool","shouldParseToolCall","validateInputTools","tools","_AbstractChatCompletionRunner_instances","_AbstractChatCompletionRunner_getFinalContent","_AbstractChatCompletionRunner_getFinalMessage","_AbstractChatCompletionRunner_getFinalFunctionCall","_AbstractChatCompletionRunner_getFinalFunctionCallResult","_AbstractChatCompletionRunner_calculateTotalUsage","_AbstractChatCompletionRunner_validateParams","_AbstractChatCompletionRunner_stringifyFunctionCallResult","DEFAULT_MAX_CHAT_COMPLETIONS","AbstractChatCompletionRunner","chatCompletion","emit","tool_call","finalMessage","finalContent","finalFunctionCall","finalFunctionCallResult","role","function_call","restParams","singleFunctionToCall","maxChatCompletions","functionsByName","functions","parsed","rawContent","tool_choice","inputTools","tool_call_id","ret","total","usage","ChatCompletionRunner","STR","NUM","ARR","OBJ","NULL","BOOL","NAN","INFINITY","MINUS_INFINITY","INF","SPECIAL","ATOM","COLLECTION","ALL","Allow","PartialJSON","MalformedJSON","parseJSON","jsonString","allowPartial","_parseJSON","allow","length","markPartialJSON","throwMalformedError","parseAny","skipBlank","parseStr","parseObj","parseArr","parseNum","start","escape","partialParse","_ChatCompletionStream_instances","_ChatCompletionStream_params","_ChatCompletionStream_choiceEventStates","_ChatCompletionStream_currentChatCompletionSnapshot","_ChatCompletionStream_beginRequest","_ChatCompletionStream_getChoiceEventState","_ChatCompletionStream_addChunk","_ChatCompletionStream_emitToolCallDoneEvent","_ChatCompletionStream_emitContentDoneEvents","_ChatCompletionStream_endRequest","_ChatCompletionStream_getAutoParseableResponseFormat","_ChatCompletionStream_accumulateChatCompletion","ChatCompletionStream","chatId","choiceSnapshot","_f","_g","_h","_i","_j","_l","toolCallDelta","toolCallSnapshot","_n","_o","toolCallIndex","responseFormat","finalizeChatCompletion","finish_reason","logprobs","other","refusal","tool_calls","created","system_fingerprint","choiceRest","messageRest","toolRest","fnRest","ChatCompletionStreamingRunner","Sessions","TranscriptionSessions","Realtime","SessionsAPI.Sessions","TranscriptionSessionsAPI.TranscriptionSessions","MessagesPage","Steps","stepId","RunStepsPage","StepsAPI.Steps","include","RunsPage","sleepInterval","headerInterval","headerIntervalMs","Runs","Threads","RunsAPI.Runs","Beta","RealtimeAPI.Realtime","ChatAPI.Chat","AssistantsAPI.Assistants","ThreadsAPI.Threads","Content","containerId","fileId","ContentAPI.Content","FileListResponsesPage","Files","Containers","FilesAPI.Files","ContainerListResponsesPage","Embeddings","hasUserProvidedEncodingFormat","encoding_format","Core.debug","embeddingBase64Obj","embeddingBase64Str","Core.toFloat32Array","OutputItems","evalId","outputItemId","OutputItemListResponsesPage","OutputItemsAPI.OutputItems","RunListResponsesPage","Evals","EvalListResponsesPage","FileObjectsPage","pollInterval","maxWait","TERMINAL_STATES","Methods","Alpha","GradersAPI.Graders","Graders","Permissions","fineTunedModelCheckpoint","PermissionCreateResponsesPage","permissionId","PermissionsAPI.Permissions","Checkpoints","fineTuningJobId","FineTuningJobCheckpointsPage","Jobs","CheckpointsAPI.Checkpoints","FineTuningJobsPage","FineTuningJobEventsPage","FineTuning","MethodsAPI.Methods","JobsAPI.Jobs","AlphaAPI.Alpha","GraderModels","GraderModelsAPI.GraderModels","Images","Models","ModelsPage","Moderations","maybeParseResponse","parseTextFormat","addOutputText","getInputToolByName","input_tools","rsp","texts","InputItems","responseId","ResponseItemsPage","_ResponseStream_instances","_ResponseStream_params","_ResponseStream_currentResponseSnapshot","_ResponseStream_finalResponse","_ResponseStream_beginRequest","_ResponseStream_addEvent","_ResponseStream_endRequest","_ResponseStream_accumulateResponse","ResponseStream","starting_after","maybeEmit","parsedResponse","finalizeResponse","Responses","InputItemsAPI.InputItems","Parts","uploadId","Uploads","PartsAPI.Parts","allSettledWithThrow","promises","rejected","vectorStoreId","VectorStoreFilesPage","fileResponse","fileInfo","FileContentResponsesPage","FileBatches","batch","fileIds","configuredConcurrency","concurrencyLimit","fileIterator","allFileIds","processFiles","fileObj","workers","VectorStores","FileBatchesAPI.FileBatches","VectorStoresPage","VectorStoreSearchResponsesPage","OpenAI","Core.APIClient","Core.readEnv","apiKey","organization","project","Errors.OpenAIError","Core.isRunningInBrowser","API.Completions","API.Chat","API.Embeddings","API.Files","API.Images","API.Audio","API.Moderations","API.Models","API.FineTuning","API.Graders","API.VectorStores","API.Beta","API.Batches","API.Uploads","API.Responses","API.Evals","API.Containers","qs.stringify","Errors.APIError","Errors.APIConnectionError","Errors.APIConnectionTimeoutError","Errors.APIUserAbortError","Errors.NotFoundError","Errors.ConflictError","Errors.RateLimitError","Errors.BadRequestError","Errors.AuthenticationError","Errors.InternalServerError","Errors.PermissionDeniedError","Errors.UnprocessableEntityError","Uploads.toFile","Uploads.fileFromPath","UploadsAPIUploads","AiRequestHandler","callback","openai","payload","chunkCount","existingCall","openaiMessages","cleanContent","openaiMsg","call","functionName","functionArgs","argsString","ToolResultProcessor","executeResult","shouldSummarize","summary","toolName","summaryMessages","summaryContent","AiClient","callBack","mcpToolExecute","maxRounds","currentRound","toolResult","processedChunk","singleToolResult","toolMessage","aiRequestHandler","has_data","cleanChunk","parsedChunk","bind","thisArg","toString","toStringTag","kindOf","kindOfTest","typeOfTest","isUndefined","isBuffer","isFunction","isArrayBuffer","isArrayBufferView","isString","isObject","isBoolean","prototype","isEmptyObject","isFile","isBlob","isFileList","isStream","isFormData","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","trim","forEach","allOwnKeys","_key","_global","isContextDefined","merge","caseless","skipUndefined","assignValue","targetKey","extend","stripBOM","inherits","constructor","superConstructor","toFlatObject","sourceObj","destObj","propFilter","merged","endsWith","searchString","position","lastIndex","toArray","isTypedArray","TypedArray","forEachEntry","_iterator","pair","matchAll","regExp","matches","isHTMLForm","toCamelCase","p1","p2","hasOwnProperty","isRegExp","reduceDescriptors","reducer","reducedDescriptors","descriptor","freezeMethods","toObjectSet","arrayOrString","define","noop","toFiniteNumber","isSpecCompliantForm","toJSONObject","stack","visit","reducedValue","isAsyncFn","isThenable","_setImmediate","setImmediateSupported","postMessageSupported","callbacks","asap","isIterable","utils$1","AxiosError","utils","customProps","axiosError","errCode","httpAdapter","isVisitable","removeBrackets","renderKey","dots","isFlatArray","predicates","toFormData","option","metaTokens","visitor","defaultVisitor","indexes","useBlob","convertValue","el","exposedHelpers","build","charMap","AxiosURLSearchParams","_encode","buildURL","serializeFn","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","h","transitionalDefaults","URLSearchParams$1","FormData$1","Blob$1","platform$1","URLSearchParams","Blob","hasBrowserEnv","_navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","origin","toURLEncodedForm","helpers","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","stringifySafely","rawValue","parser","hasJSONContentType","isObjectPayload","_FormData","transitional","forcedJSONParsing","JSONRequested","strictJSONParsing","ignoreDuplicateOf","parseHeaders","rawHeaders","$internals","normalizeHeader","normalizeValue","parseTokens","tokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","w","char","buildAccessors","accessorName","methodName","arg1","arg2","arg3","AxiosHeaders$1","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","dest","matcher","deleted","deleteHeader","normalized","targets","asStrings","first","computed","accessors","defineAccessor","AxiosHeaders","headerValue","transformData","fns","isCancel","CanceledError","settle","validateStatus","parseProtocol","speedometer","samplesCount","min","timestamps","head","tail","firstSampleTS","chunkLength","startedAt","bytesCount","passed","freq","threshold","lastArgs","timer","invoke","progressEventReducer","isDownloadStream","bytesNotified","_speedometer","loaded","progressBytes","rate","inRange","progressEventDecorator","throttled","lengthComputable","asyncDecorator","isURLSameOrigin","isMSIE","cookies","expires","domain","secure","cookie","combineURLs","relativeURL","buildFullPath","requestedURL","allowAbsoluteUrls","isRelativeUrl","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","resolveConfig","withXSRFToken","xsrfHeaderName","xsrfCookieName","auth","formHeaders","allowedHeaders","xsrfValue","isXHRAdapterSupported","xhrAdapter","_config","requestHeaders","responseType","onUploadProgress","onDownloadProgress","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","onloadend","timeoutErrorMessage","cancel","protocol","composeSignals","signals","aborted","onabort","reason","unsubscribe","streamChunk","chunkSize","end","readBytes","iterable","readStream","trackStream","onProgress","onFinish","_onFinish","loadedBytes","DEFAULT_CHUNK_SIZE","globalFetchAPI","Request","Response","TextEncoder","test","factory","envFetch","isFetchSupported","isRequestSupported","isResponseSupported","isReadableStreamSupported","encodeText","supportsRequestStream","duplexAccessed","hasContentType","supportsResponseStream","resolvers","getBodyLength","resolveBodyLength","cancelToken","withCredentials","composedSignal","requestContentLength","_request","contentTypeHeader","flush","isCredentialsSupported","resolvedOptions","isStreamResponse","responseContentLength","responseData","seedCache","getFetch","seeds","seed","map","knownAdapters","fetchAdapter.getFetch","renderReason","isResolvedHandle","adapter","adapters","nameOrAdapter","rejectedReasons","reasons","throwIfCancellationRequested","dispatchRequest","validators","deprecatedWarnings","version","formatMessage","opt","correctSpelling","assertOptions","schema","allowUnknown","Axios$1","instanceConfig","configOrUrl","dummy","paramsSerializer","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","promise","chain","fullPath","Axios","generateHTTPMethod","isForm","CancelToken$1","CancelToken","resolvePromise","_resolve","abort","spread","isAxiosError","HttpStatusCode","createInstance","instance","axios","all","Cancel","formToJSON","getAdapter","mcpHttp","McpToolExecute","mcpServers","onChunk","onComplete","onError","toolArgs","parsedArgs","toolInfo","supportsStreaming","_toolName","serverUrl","arguments_","sseUrl","decoder","lastActivityTime","readTimeoutId","events","currentEvent","dataContent","lastCompleteEventIndex","remaining","mcpUrl","mcpServer","toolsResponse","prefixedTools","openaiTool","AiServer","conversation_id","customModelConfig","conversationResponse","mcpResponse","McpToolsExecute","sortedMessages","validTimeA","validTimeB","systemPrompt","recentMessages","aiClient","ExtendedDatabaseService","ChatService","_attachments","finalModelConfig","aiServer","initRetries","chunkContent","summaryChunkContent","callbackError"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219]}
|