mirror of
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
synced 2025-10-17 23:43:41 +08:00
Compare commits
14 Commits
0b30c0a919
...
JI4JUN-fea
Author | SHA1 | Date | |
---|---|---|---|
|
3ea6f21338 | ||
|
4d43fac12a | ||
|
d3e164f23e | ||
|
673f907ea4 | ||
|
fb3af2a08f | ||
|
eb193ac0ff | ||
|
c30ddfbb07 | ||
|
a2f0149786 | ||
|
03d36f96ed | ||
|
705dffc664 | ||
|
02f7e6de98 | ||
|
843dc52efa | ||
|
c261ebc82c | ||
|
f7c747c65f |
@@ -81,3 +81,9 @@ SILICONFLOW_API_KEY=
|
|||||||
|
|
||||||
### siliconflow Api url (optional)
|
### siliconflow Api url (optional)
|
||||||
SILICONFLOW_URL=
|
SILICONFLOW_URL=
|
||||||
|
|
||||||
|
### 302.AI Api key (optional)
|
||||||
|
AI302_API_KEY=
|
||||||
|
|
||||||
|
### 302.AI Api url (optional)
|
||||||
|
AI302_URL=
|
||||||
|
@@ -4,7 +4,11 @@
|
|||||||
<img src="https://github.com/user-attachments/assets/83bdcc07-ae5e-4954-a53a-ac151ba6ccf3" width="1000" alt="icon"/>
|
<img src="https://github.com/user-attachments/assets/83bdcc07-ae5e-4954-a53a-ac151ba6ccf3" width="1000" alt="icon"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<a href='https://302.ai/'>
|
||||||
|
<img src="./docs/images/302AI-banner-en.jpg" width=400 alt="icon"/>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
[302.AI](https://302.ai/) is a pay-as-you-go AI application platform that offers the most comprehensive AI APIs and online applications available.
|
||||||
|
|
||||||
|
|
||||||
<h1 align="center">NextChat</h1>
|
<h1 align="center">NextChat</h1>
|
||||||
@@ -22,12 +26,12 @@ English / [简体中文](./README_CN.md)
|
|||||||
[![MacOS][MacOS-image]][download-url]
|
[![MacOS][MacOS-image]][download-url]
|
||||||
[![Linux][Linux-image]][download-url]
|
[![Linux][Linux-image]][download-url]
|
||||||
|
|
||||||
[NextChatAI](https://nextchat.club?utm_source=readme) / [iOS APP](https://apps.apple.com/us/app/nextchat-ai/id6743085599) / [Web App Demo](https://app.nextchat.dev) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Enterprise Edition](#enterprise-edition)
|
[NextChatAI](https://nextchat.club?utm_source=readme) / [iOS APP](https://apps.apple.com/us/app/nextchat-ai/id6743085599) / [Web App Demo](https://app.nextchat.club) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Enterprise Edition](#enterprise-edition)
|
||||||
|
|
||||||
|
|
||||||
[saas-url]: https://nextchat.club?utm_source=readme
|
[saas-url]: https://nextchat.club?utm_source=readme
|
||||||
[saas-image]: https://img.shields.io/badge/NextChat-Saas-green?logo=microsoftedge
|
[saas-image]: https://img.shields.io/badge/NextChat-Saas-green?logo=microsoftedge
|
||||||
[web-url]: https://app.nextchat.dev/
|
[web-url]: https://app.nextchat.club/
|
||||||
[download-url]: https://github.com/Yidadaa/ChatGPT-Next-Web/releases
|
[download-url]: https://github.com/Yidadaa/ChatGPT-Next-Web/releases
|
||||||
[Web-image]: https://img.shields.io/badge/Web-PWA-orange?logo=microsoftedge
|
[Web-image]: https://img.shields.io/badge/Web-PWA-orange?logo=microsoftedge
|
||||||
[Windows-image]: https://img.shields.io/badge/-Windows-blue?logo=windows
|
[Windows-image]: https://img.shields.io/badge/-Windows-blue?logo=windows
|
||||||
|
@@ -4,6 +4,12 @@
|
|||||||
<img src="./docs/images/ent.svg" alt="icon"/>
|
<img src="./docs/images/ent.svg" alt="icon"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<a href='https://302.ai/'>
|
||||||
|
<img src="./docs/images/302AI-banner-zh.jpg" width=400 alt="icon"/>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
[302.AI](https://302.ai/) 是一个按需付费的AI应用平台,提供市面上最全的AI API和AI在线应用。
|
||||||
|
|
||||||
<h1 align="center">NextChat</h1>
|
<h1 align="center">NextChat</h1>
|
||||||
|
|
||||||
一键免费部署你的私人 ChatGPT 网页应用,支持 Claude, GPT4 & Gemini Pro 模型。
|
一键免费部署你的私人 ChatGPT 网页应用,支持 Claude, GPT4 & Gemini Pro 模型。
|
||||||
|
@@ -1,6 +1,12 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="./docs/images/ent.svg" alt="プレビュー"/>
|
<img src="./docs/images/ent.svg" alt="プレビュー"/>
|
||||||
|
|
||||||
|
<a href='https://302.ai/'>
|
||||||
|
<img src="./docs/images/302AI-banner-jp.jpg" width=400 alt="icon"/>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
[302.AI](https://302.ai/) は、オンデマンドで支払うAIアプリケーションプラットフォームで、最も安全なAI APIとAIオンラインアプリケーションを提供します。
|
||||||
|
|
||||||
<h1 align="center">NextChat</h1>
|
<h1 align="center">NextChat</h1>
|
||||||
|
|
||||||
ワンクリックで無料であなた専用の ChatGPT ウェブアプリをデプロイ。GPT3、GPT4 & Gemini Pro モデルをサポート。
|
ワンクリックで無料であなた専用の ChatGPT ウェブアプリをデプロイ。GPT3、GPT4 & Gemini Pro モデルをサポート。
|
||||||
|
128
app/api/302ai.ts
Normal file
128
app/api/302ai.ts
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
import { getServerSideConfig } from "@/app/config/server";
|
||||||
|
import {
|
||||||
|
AI302_BASE_URL,
|
||||||
|
ApiPath,
|
||||||
|
ModelProvider,
|
||||||
|
ServiceProvider,
|
||||||
|
} from "@/app/constant";
|
||||||
|
import { prettyObject } from "@/app/utils/format";
|
||||||
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
import { auth } from "@/app/api/auth";
|
||||||
|
import { isModelNotavailableInServer } from "@/app/utils/model";
|
||||||
|
|
||||||
|
const serverConfig = getServerSideConfig();
|
||||||
|
|
||||||
|
export async function handle(
|
||||||
|
req: NextRequest,
|
||||||
|
{ params }: { params: { path: string[] } },
|
||||||
|
) {
|
||||||
|
console.log("[302.AI Route] params ", params);
|
||||||
|
|
||||||
|
if (req.method === "OPTIONS") {
|
||||||
|
return NextResponse.json({ body: "OK" }, { status: 200 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const authResult = auth(req, ModelProvider["302.AI"]);
|
||||||
|
if (authResult.error) {
|
||||||
|
return NextResponse.json(authResult, {
|
||||||
|
status: 401,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await request(req);
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
console.error("[302.AI] ", e);
|
||||||
|
return NextResponse.json(prettyObject(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function request(req: NextRequest) {
|
||||||
|
const controller = new AbortController();
|
||||||
|
|
||||||
|
// alibaba use base url or just remove the path
|
||||||
|
let path = `${req.nextUrl.pathname}`.replaceAll(ApiPath["302.AI"], "");
|
||||||
|
|
||||||
|
let baseUrl = serverConfig.ai302Url || AI302_BASE_URL;
|
||||||
|
|
||||||
|
if (!baseUrl.startsWith("http")) {
|
||||||
|
baseUrl = `https://${baseUrl}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (baseUrl.endsWith("/")) {
|
||||||
|
baseUrl = baseUrl.slice(0, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("[Proxy] ", path);
|
||||||
|
console.log("[Base Url]", baseUrl);
|
||||||
|
|
||||||
|
const timeoutId = setTimeout(
|
||||||
|
() => {
|
||||||
|
controller.abort();
|
||||||
|
},
|
||||||
|
10 * 60 * 1000,
|
||||||
|
);
|
||||||
|
|
||||||
|
const fetchUrl = `${baseUrl}${path}`;
|
||||||
|
const fetchOptions: RequestInit = {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: req.headers.get("Authorization") ?? "",
|
||||||
|
},
|
||||||
|
method: req.method,
|
||||||
|
body: req.body,
|
||||||
|
redirect: "manual",
|
||||||
|
// @ts-ignore
|
||||||
|
duplex: "half",
|
||||||
|
signal: controller.signal,
|
||||||
|
};
|
||||||
|
|
||||||
|
// #1815 try to refuse some request to some models
|
||||||
|
if (serverConfig.customModels && req.body) {
|
||||||
|
try {
|
||||||
|
const clonedBody = await req.text();
|
||||||
|
fetchOptions.body = clonedBody;
|
||||||
|
|
||||||
|
const jsonBody = JSON.parse(clonedBody) as { model?: string };
|
||||||
|
|
||||||
|
// not undefined and is false
|
||||||
|
if (
|
||||||
|
isModelNotavailableInServer(
|
||||||
|
serverConfig.customModels,
|
||||||
|
jsonBody?.model as string,
|
||||||
|
ServiceProvider["302.AI"] as string,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
error: true,
|
||||||
|
message: `you are not allowed to use ${jsonBody?.model} model`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
status: 403,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(`[302.AI] filter`, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const res = await fetch(fetchUrl, fetchOptions);
|
||||||
|
|
||||||
|
// to prevent browser prompt for credentials
|
||||||
|
const newHeaders = new Headers(res.headers);
|
||||||
|
newHeaders.delete("www-authenticate");
|
||||||
|
// to disable nginx buffering
|
||||||
|
newHeaders.set("X-Accel-Buffering", "no");
|
||||||
|
|
||||||
|
return new Response(res.body, {
|
||||||
|
status: res.status,
|
||||||
|
statusText: res.statusText,
|
||||||
|
headers: newHeaders,
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
}
|
||||||
|
}
|
@@ -15,6 +15,7 @@ import { handle as siliconflowHandler } from "../../siliconflow";
|
|||||||
import { handle as xaiHandler } from "../../xai";
|
import { handle as xaiHandler } from "../../xai";
|
||||||
import { handle as chatglmHandler } from "../../glm";
|
import { handle as chatglmHandler } from "../../glm";
|
||||||
import { handle as proxyHandler } from "../../proxy";
|
import { handle as proxyHandler } from "../../proxy";
|
||||||
|
import { handle as ai302Handler } from "../../302ai";
|
||||||
|
|
||||||
async function handle(
|
async function handle(
|
||||||
req: NextRequest,
|
req: NextRequest,
|
||||||
@@ -52,6 +53,8 @@ async function handle(
|
|||||||
return siliconflowHandler(req, { params });
|
return siliconflowHandler(req, { params });
|
||||||
case ApiPath.OpenAI:
|
case ApiPath.OpenAI:
|
||||||
return openaiHandler(req, { params });
|
return openaiHandler(req, { params });
|
||||||
|
case ApiPath["302.AI"]:
|
||||||
|
return ai302Handler(req, { params });
|
||||||
default:
|
default:
|
||||||
return proxyHandler(req, { params });
|
return proxyHandler(req, { params });
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,7 @@ import { DeepSeekApi } from "./platforms/deepseek";
|
|||||||
import { XAIApi } from "./platforms/xai";
|
import { XAIApi } from "./platforms/xai";
|
||||||
import { ChatGLMApi } from "./platforms/glm";
|
import { ChatGLMApi } from "./platforms/glm";
|
||||||
import { SiliconflowApi } from "./platforms/siliconflow";
|
import { SiliconflowApi } from "./platforms/siliconflow";
|
||||||
|
import { Ai302Api } from "./platforms/ai302";
|
||||||
|
|
||||||
export const ROLES = ["system", "user", "assistant"] as const;
|
export const ROLES = ["system", "user", "assistant"] as const;
|
||||||
export type MessageRole = (typeof ROLES)[number];
|
export type MessageRole = (typeof ROLES)[number];
|
||||||
@@ -173,6 +174,9 @@ export class ClientApi {
|
|||||||
case ModelProvider.SiliconFlow:
|
case ModelProvider.SiliconFlow:
|
||||||
this.llm = new SiliconflowApi();
|
this.llm = new SiliconflowApi();
|
||||||
break;
|
break;
|
||||||
|
case ModelProvider["302.AI"]:
|
||||||
|
this.llm = new Ai302Api();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
this.llm = new ChatGPTApi();
|
this.llm = new ChatGPTApi();
|
||||||
}
|
}
|
||||||
@@ -265,6 +269,7 @@ export function getHeaders(ignoreHeaders: boolean = false) {
|
|||||||
const isChatGLM = modelConfig.providerName === ServiceProvider.ChatGLM;
|
const isChatGLM = modelConfig.providerName === ServiceProvider.ChatGLM;
|
||||||
const isSiliconFlow =
|
const isSiliconFlow =
|
||||||
modelConfig.providerName === ServiceProvider.SiliconFlow;
|
modelConfig.providerName === ServiceProvider.SiliconFlow;
|
||||||
|
const isAI302 = modelConfig.providerName === ServiceProvider["302.AI"];
|
||||||
const isEnabledAccessControl = accessStore.enabledAccessControl();
|
const isEnabledAccessControl = accessStore.enabledAccessControl();
|
||||||
const apiKey = isGoogle
|
const apiKey = isGoogle
|
||||||
? accessStore.googleApiKey
|
? accessStore.googleApiKey
|
||||||
@@ -290,6 +295,8 @@ export function getHeaders(ignoreHeaders: boolean = false) {
|
|||||||
? accessStore.iflytekApiKey && accessStore.iflytekApiSecret
|
? accessStore.iflytekApiKey && accessStore.iflytekApiSecret
|
||||||
? accessStore.iflytekApiKey + ":" + accessStore.iflytekApiSecret
|
? accessStore.iflytekApiKey + ":" + accessStore.iflytekApiSecret
|
||||||
: ""
|
: ""
|
||||||
|
: isAI302
|
||||||
|
? accessStore.ai302ApiKey
|
||||||
: accessStore.openaiApiKey;
|
: accessStore.openaiApiKey;
|
||||||
return {
|
return {
|
||||||
isGoogle,
|
isGoogle,
|
||||||
@@ -304,6 +311,7 @@ export function getHeaders(ignoreHeaders: boolean = false) {
|
|||||||
isXAI,
|
isXAI,
|
||||||
isChatGLM,
|
isChatGLM,
|
||||||
isSiliconFlow,
|
isSiliconFlow,
|
||||||
|
isAI302,
|
||||||
apiKey,
|
apiKey,
|
||||||
isEnabledAccessControl,
|
isEnabledAccessControl,
|
||||||
};
|
};
|
||||||
@@ -332,6 +340,7 @@ export function getHeaders(ignoreHeaders: boolean = false) {
|
|||||||
isXAI,
|
isXAI,
|
||||||
isChatGLM,
|
isChatGLM,
|
||||||
isSiliconFlow,
|
isSiliconFlow,
|
||||||
|
isAI302,
|
||||||
apiKey,
|
apiKey,
|
||||||
isEnabledAccessControl,
|
isEnabledAccessControl,
|
||||||
} = getConfig();
|
} = getConfig();
|
||||||
@@ -382,6 +391,8 @@ export function getClientApi(provider: ServiceProvider): ClientApi {
|
|||||||
return new ClientApi(ModelProvider.ChatGLM);
|
return new ClientApi(ModelProvider.ChatGLM);
|
||||||
case ServiceProvider.SiliconFlow:
|
case ServiceProvider.SiliconFlow:
|
||||||
return new ClientApi(ModelProvider.SiliconFlow);
|
return new ClientApi(ModelProvider.SiliconFlow);
|
||||||
|
case ServiceProvider["302.AI"]:
|
||||||
|
return new ClientApi(ModelProvider["302.AI"]);
|
||||||
default:
|
default:
|
||||||
return new ClientApi(ModelProvider.GPT);
|
return new ClientApi(ModelProvider.GPT);
|
||||||
}
|
}
|
||||||
|
287
app/client/platforms/ai302.ts
Normal file
287
app/client/platforms/ai302.ts
Normal file
@@ -0,0 +1,287 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import {
|
||||||
|
ApiPath,
|
||||||
|
AI302_BASE_URL,
|
||||||
|
DEFAULT_MODELS,
|
||||||
|
AI302,
|
||||||
|
} from "@/app/constant";
|
||||||
|
import {
|
||||||
|
useAccessStore,
|
||||||
|
useAppConfig,
|
||||||
|
useChatStore,
|
||||||
|
ChatMessageTool,
|
||||||
|
usePluginStore,
|
||||||
|
} from "@/app/store";
|
||||||
|
import { preProcessImageContent, streamWithThink } from "@/app/utils/chat";
|
||||||
|
import {
|
||||||
|
ChatOptions,
|
||||||
|
getHeaders,
|
||||||
|
LLMApi,
|
||||||
|
LLMModel,
|
||||||
|
SpeechOptions,
|
||||||
|
} from "../api";
|
||||||
|
import { getClientConfig } from "@/app/config/client";
|
||||||
|
import {
|
||||||
|
getMessageTextContent,
|
||||||
|
getMessageTextContentWithoutThinking,
|
||||||
|
isVisionModel,
|
||||||
|
getTimeoutMSByModel,
|
||||||
|
} from "@/app/utils";
|
||||||
|
import { RequestPayload } from "./openai";
|
||||||
|
|
||||||
|
import { fetch } from "@/app/utils/stream";
|
||||||
|
export interface Ai302ListModelResponse {
|
||||||
|
object: string;
|
||||||
|
data: Array<{
|
||||||
|
id: string;
|
||||||
|
object: string;
|
||||||
|
root: string;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Ai302Api implements LLMApi {
|
||||||
|
private disableListModels = false;
|
||||||
|
|
||||||
|
path(path: string): string {
|
||||||
|
const accessStore = useAccessStore.getState();
|
||||||
|
|
||||||
|
let baseUrl = "";
|
||||||
|
|
||||||
|
if (accessStore.useCustomConfig) {
|
||||||
|
baseUrl = accessStore.ai302Url;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (baseUrl.length === 0) {
|
||||||
|
const isApp = !!getClientConfig()?.isApp;
|
||||||
|
const apiPath = ApiPath["302.AI"];
|
||||||
|
baseUrl = isApp ? AI302_BASE_URL : apiPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (baseUrl.endsWith("/")) {
|
||||||
|
baseUrl = baseUrl.slice(0, baseUrl.length - 1);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!baseUrl.startsWith("http") &&
|
||||||
|
!baseUrl.startsWith(ApiPath["302.AI"])
|
||||||
|
) {
|
||||||
|
baseUrl = "https://" + baseUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("[Proxy Endpoint] ", baseUrl, path);
|
||||||
|
|
||||||
|
return [baseUrl, path].join("/");
|
||||||
|
}
|
||||||
|
|
||||||
|
extractMessage(res: any) {
|
||||||
|
return res.choices?.at(0)?.message?.content ?? "";
|
||||||
|
}
|
||||||
|
|
||||||
|
speech(options: SpeechOptions): Promise<ArrayBuffer> {
|
||||||
|
throw new Error("Method not implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
async chat(options: ChatOptions) {
|
||||||
|
const visionModel = isVisionModel(options.config.model);
|
||||||
|
const messages: ChatOptions["messages"] = [];
|
||||||
|
for (const v of options.messages) {
|
||||||
|
if (v.role === "assistant") {
|
||||||
|
const content = getMessageTextContentWithoutThinking(v);
|
||||||
|
messages.push({ role: v.role, content });
|
||||||
|
} else {
|
||||||
|
const content = visionModel
|
||||||
|
? await preProcessImageContent(v.content)
|
||||||
|
: getMessageTextContent(v);
|
||||||
|
messages.push({ role: v.role, content });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const modelConfig = {
|
||||||
|
...useAppConfig.getState().modelConfig,
|
||||||
|
...useChatStore.getState().currentSession().mask.modelConfig,
|
||||||
|
...{
|
||||||
|
model: options.config.model,
|
||||||
|
providerName: options.config.providerName,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const requestPayload: RequestPayload = {
|
||||||
|
messages,
|
||||||
|
stream: options.config.stream,
|
||||||
|
model: modelConfig.model,
|
||||||
|
temperature: modelConfig.temperature,
|
||||||
|
presence_penalty: modelConfig.presence_penalty,
|
||||||
|
frequency_penalty: modelConfig.frequency_penalty,
|
||||||
|
top_p: modelConfig.top_p,
|
||||||
|
// max_tokens: Math.max(modelConfig.max_tokens, 1024),
|
||||||
|
// Please do not ask me why not send max_tokens, no reason, this param is just shit, I dont want to explain anymore.
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log("[Request] openai payload: ", requestPayload);
|
||||||
|
|
||||||
|
const shouldStream = !!options.config.stream;
|
||||||
|
const controller = new AbortController();
|
||||||
|
options.onController?.(controller);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const chatPath = this.path(AI302.ChatPath);
|
||||||
|
const chatPayload = {
|
||||||
|
method: "POST",
|
||||||
|
body: JSON.stringify(requestPayload),
|
||||||
|
signal: controller.signal,
|
||||||
|
headers: getHeaders(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// console.log(chatPayload);
|
||||||
|
|
||||||
|
// Use extended timeout for thinking models as they typically require more processing time
|
||||||
|
const requestTimeoutId = setTimeout(
|
||||||
|
() => controller.abort(),
|
||||||
|
getTimeoutMSByModel(options.config.model),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (shouldStream) {
|
||||||
|
const [tools, funcs] = usePluginStore
|
||||||
|
.getState()
|
||||||
|
.getAsTools(
|
||||||
|
useChatStore.getState().currentSession().mask?.plugin || [],
|
||||||
|
);
|
||||||
|
return streamWithThink(
|
||||||
|
chatPath,
|
||||||
|
requestPayload,
|
||||||
|
getHeaders(),
|
||||||
|
tools as any,
|
||||||
|
funcs,
|
||||||
|
controller,
|
||||||
|
// parseSSE
|
||||||
|
(text: string, runTools: ChatMessageTool[]) => {
|
||||||
|
// console.log("parseSSE", text, runTools);
|
||||||
|
const json = JSON.parse(text);
|
||||||
|
const choices = json.choices as Array<{
|
||||||
|
delta: {
|
||||||
|
content: string | null;
|
||||||
|
tool_calls: ChatMessageTool[];
|
||||||
|
reasoning_content: string | null;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
const tool_calls = choices[0]?.delta?.tool_calls;
|
||||||
|
if (tool_calls?.length > 0) {
|
||||||
|
const index = tool_calls[0]?.index;
|
||||||
|
const id = tool_calls[0]?.id;
|
||||||
|
const args = tool_calls[0]?.function?.arguments;
|
||||||
|
if (id) {
|
||||||
|
runTools.push({
|
||||||
|
id,
|
||||||
|
type: tool_calls[0]?.type,
|
||||||
|
function: {
|
||||||
|
name: tool_calls[0]?.function?.name as string,
|
||||||
|
arguments: args,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// @ts-ignore
|
||||||
|
runTools[index]["function"]["arguments"] += args;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const reasoning = choices[0]?.delta?.reasoning_content;
|
||||||
|
const content = choices[0]?.delta?.content;
|
||||||
|
|
||||||
|
// Skip if both content and reasoning_content are empty or null
|
||||||
|
if (
|
||||||
|
(!reasoning || reasoning.length === 0) &&
|
||||||
|
(!content || content.length === 0)
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
isThinking: false,
|
||||||
|
content: "",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reasoning && reasoning.length > 0) {
|
||||||
|
return {
|
||||||
|
isThinking: true,
|
||||||
|
content: reasoning,
|
||||||
|
};
|
||||||
|
} else if (content && content.length > 0) {
|
||||||
|
return {
|
||||||
|
isThinking: false,
|
||||||
|
content: content,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
isThinking: false,
|
||||||
|
content: "",
|
||||||
|
};
|
||||||
|
},
|
||||||
|
// processToolMessage, include tool_calls message and tool call results
|
||||||
|
(
|
||||||
|
requestPayload: RequestPayload,
|
||||||
|
toolCallMessage: any,
|
||||||
|
toolCallResult: any[],
|
||||||
|
) => {
|
||||||
|
// @ts-ignore
|
||||||
|
requestPayload?.messages?.splice(
|
||||||
|
// @ts-ignore
|
||||||
|
requestPayload?.messages?.length,
|
||||||
|
0,
|
||||||
|
toolCallMessage,
|
||||||
|
...toolCallResult,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
const res = await fetch(chatPath, chatPayload);
|
||||||
|
clearTimeout(requestTimeoutId);
|
||||||
|
|
||||||
|
const resJson = await res.json();
|
||||||
|
const message = this.extractMessage(resJson);
|
||||||
|
options.onFinish(message, res);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log("[Request] failed to make a chat request", e);
|
||||||
|
options.onError?.(e as Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async usage() {
|
||||||
|
return {
|
||||||
|
used: 0,
|
||||||
|
total: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async models(): Promise<LLMModel[]> {
|
||||||
|
if (this.disableListModels) {
|
||||||
|
return DEFAULT_MODELS.slice();
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await fetch(this.path(AI302.ListModelPath), {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
...getHeaders(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const resJson = (await res.json()) as Ai302ListModelResponse;
|
||||||
|
const chatModels = resJson.data;
|
||||||
|
console.log("[Models]", chatModels);
|
||||||
|
|
||||||
|
if (!chatModels) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
let seq = 1000; //同 Constant.ts 中的排序保持一致
|
||||||
|
return chatModels.map((m) => ({
|
||||||
|
name: m.id,
|
||||||
|
available: true,
|
||||||
|
sorted: seq++,
|
||||||
|
provider: {
|
||||||
|
id: "ai302",
|
||||||
|
providerName: "302.AI",
|
||||||
|
providerType: "ai302",
|
||||||
|
sorted: 15,
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
@@ -56,7 +56,7 @@ export interface OpenAIListModelResponse {
|
|||||||
|
|
||||||
export interface RequestPayload {
|
export interface RequestPayload {
|
||||||
messages: {
|
messages: {
|
||||||
role: "system" | "user" | "assistant";
|
role: "developer" | "system" | "user" | "assistant";
|
||||||
content: string | MultimodalContent[];
|
content: string | MultimodalContent[];
|
||||||
}[];
|
}[];
|
||||||
stream?: boolean;
|
stream?: boolean;
|
||||||
@@ -238,8 +238,16 @@ export class ChatGPTApi implements LLMApi {
|
|||||||
// Please do not ask me why not send max_tokens, no reason, this param is just shit, I dont want to explain anymore.
|
// Please do not ask me why not send max_tokens, no reason, this param is just shit, I dont want to explain anymore.
|
||||||
};
|
};
|
||||||
|
|
||||||
// O1 使用 max_completion_tokens 控制token数 (https://platform.openai.com/docs/guides/reasoning#controlling-costs)
|
|
||||||
if (isO1OrO3) {
|
if (isO1OrO3) {
|
||||||
|
// by default the o1/o3 models will not attempt to produce output that includes markdown formatting
|
||||||
|
// manually add "Formatting re-enabled" developer message to encourage markdown inclusion in model responses
|
||||||
|
// (https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/reasoning?tabs=python-secure#markdown-output)
|
||||||
|
requestPayload["messages"].unshift({
|
||||||
|
role: "developer",
|
||||||
|
content: "Formatting re-enabled",
|
||||||
|
});
|
||||||
|
|
||||||
|
// o1/o3 uses max_completion_tokens to control the number of tokens (https://platform.openai.com/docs/guides/reasoning#controlling-costs)
|
||||||
requestPayload["max_completion_tokens"] = modelConfig.max_tokens;
|
requestPayload["max_completion_tokens"] = modelConfig.max_tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,12 +22,11 @@ import {
|
|||||||
resumeMcpServer,
|
resumeMcpServer,
|
||||||
} from "../mcp/actions";
|
} from "../mcp/actions";
|
||||||
import {
|
import {
|
||||||
ToolSchema,
|
ListToolsResponse,
|
||||||
McpConfigData,
|
McpConfigData,
|
||||||
PresetServer,
|
PresetServer,
|
||||||
ServerConfig,
|
ServerConfig,
|
||||||
ServerStatusResponse,
|
ServerStatusResponse,
|
||||||
isServerStdioConfig,
|
|
||||||
} from "../mcp/types";
|
} from "../mcp/types";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
import PlayIcon from "../icons/play.svg";
|
import PlayIcon from "../icons/play.svg";
|
||||||
@@ -47,7 +46,7 @@ export function McpMarketPage() {
|
|||||||
const [searchText, setSearchText] = useState("");
|
const [searchText, setSearchText] = useState("");
|
||||||
const [userConfig, setUserConfig] = useState<Record<string, any>>({});
|
const [userConfig, setUserConfig] = useState<Record<string, any>>({});
|
||||||
const [editingServerId, setEditingServerId] = useState<string | undefined>();
|
const [editingServerId, setEditingServerId] = useState<string | undefined>();
|
||||||
const [tools, setTools] = useState<ToolSchema[] | null>(null);
|
const [tools, setTools] = useState<ListToolsResponse["tools"] | null>(null);
|
||||||
const [viewingServerId, setViewingServerId] = useState<string | undefined>();
|
const [viewingServerId, setViewingServerId] = useState<string | undefined>();
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
const [config, setConfig] = useState<McpConfigData>();
|
const [config, setConfig] = useState<McpConfigData>();
|
||||||
@@ -137,7 +136,7 @@ export function McpMarketPage() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!editingServerId || !config) return;
|
if (!editingServerId || !config) return;
|
||||||
const currentConfig = config.mcpServers[editingServerId];
|
const currentConfig = config.mcpServers[editingServerId];
|
||||||
if (isServerStdioConfig(currentConfig)) {
|
if (currentConfig) {
|
||||||
// 从当前配置中提取用户配置
|
// 从当前配置中提取用户配置
|
||||||
const preset = presetServers.find((s) => s.id === editingServerId);
|
const preset = presetServers.find((s) => s.id === editingServerId);
|
||||||
if (preset?.configSchema) {
|
if (preset?.configSchema) {
|
||||||
@@ -231,7 +230,7 @@ export function McpMarketPage() {
|
|||||||
try {
|
try {
|
||||||
const result = await getClientTools(id);
|
const result = await getClientTools(id);
|
||||||
if (result) {
|
if (result) {
|
||||||
setTools(result?.tools);
|
setTools(result);
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Failed to load tools");
|
throw new Error("Failed to load tools");
|
||||||
}
|
}
|
||||||
@@ -732,15 +731,17 @@ export function McpMarketPage() {
|
|||||||
<div className={styles["tools-list"]}>
|
<div className={styles["tools-list"]}>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<div>Loading...</div>
|
<div>Loading...</div>
|
||||||
) : tools ? (
|
) : tools?.tools ? (
|
||||||
tools.map((tool: ToolSchema, index: number) => (
|
tools.tools.map(
|
||||||
<div key={index} className={styles["tool-item"]}>
|
(tool: ListToolsResponse["tools"], index: number) => (
|
||||||
<div className={styles["tool-name"]}>{tool.name}</div>
|
<div key={index} className={styles["tool-item"]}>
|
||||||
<div className={styles["tool-description"]}>
|
<div className={styles["tool-name"]}>{tool.name}</div>
|
||||||
{tool.description}
|
<div className={styles["tool-description"]}>
|
||||||
|
{tool.description}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
),
|
||||||
))
|
)
|
||||||
) : (
|
) : (
|
||||||
<div>No tools available</div>
|
<div>No tools available</div>
|
||||||
)}
|
)}
|
||||||
|
@@ -75,6 +75,7 @@ import {
|
|||||||
ChatGLM,
|
ChatGLM,
|
||||||
DeepSeek,
|
DeepSeek,
|
||||||
SiliconFlow,
|
SiliconFlow,
|
||||||
|
AI302,
|
||||||
} from "../constant";
|
} from "../constant";
|
||||||
import { Prompt, SearchService, usePromptStore } from "../store/prompt";
|
import { Prompt, SearchService, usePromptStore } from "../store/prompt";
|
||||||
import { ErrorBoundary } from "./error";
|
import { ErrorBoundary } from "./error";
|
||||||
@@ -1458,6 +1459,46 @@ export function Settings() {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const ai302ConfigComponent = accessStore.provider === ServiceProvider["302.AI"] && (
|
||||||
|
<>
|
||||||
|
<ListItem
|
||||||
|
title={Locale.Settings.Access.AI302.Endpoint.Title}
|
||||||
|
subTitle={
|
||||||
|
Locale.Settings.Access.AI302.Endpoint.SubTitle +
|
||||||
|
AI302.ExampleEndpoint
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-label={Locale.Settings.Access.AI302.Endpoint.Title}
|
||||||
|
type="text"
|
||||||
|
value={accessStore.ai302Url}
|
||||||
|
placeholder={AI302.ExampleEndpoint}
|
||||||
|
onChange={(e) =>
|
||||||
|
accessStore.update(
|
||||||
|
(access) => (access.ai302Url = e.currentTarget.value),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
></input>
|
||||||
|
</ListItem>
|
||||||
|
<ListItem
|
||||||
|
title={Locale.Settings.Access.AI302.ApiKey.Title}
|
||||||
|
subTitle={Locale.Settings.Access.AI302.ApiKey.SubTitle}
|
||||||
|
>
|
||||||
|
<PasswordInput
|
||||||
|
aria-label={Locale.Settings.Access.AI302.ApiKey.Title}
|
||||||
|
value={accessStore.ai302ApiKey}
|
||||||
|
type="text"
|
||||||
|
placeholder={Locale.Settings.Access.AI302.ApiKey.Placeholder}
|
||||||
|
onChange={(e) => {
|
||||||
|
accessStore.update(
|
||||||
|
(access) => (access.ai302ApiKey = e.currentTarget.value),
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary>
|
<ErrorBoundary>
|
||||||
<div className="window-header" data-tauri-drag-region>
|
<div className="window-header" data-tauri-drag-region>
|
||||||
@@ -1822,6 +1863,7 @@ export function Settings() {
|
|||||||
{XAIConfigComponent}
|
{XAIConfigComponent}
|
||||||
{chatglmConfigComponent}
|
{chatglmConfigComponent}
|
||||||
{siliconflowConfigComponent}
|
{siliconflowConfigComponent}
|
||||||
|
{ai302ConfigComponent}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
@@ -40,17 +40,6 @@ export const getBuildConfig = () => {
|
|||||||
buildMode,
|
buildMode,
|
||||||
isApp,
|
isApp,
|
||||||
template: process.env.DEFAULT_INPUT_TEMPLATE ?? DEFAULT_INPUT_TEMPLATE,
|
template: process.env.DEFAULT_INPUT_TEMPLATE ?? DEFAULT_INPUT_TEMPLATE,
|
||||||
|
|
||||||
needCode: !!process.env.CODE,
|
|
||||||
hideUserApiKey: !!process.env.HIDE_USER_API_KEY,
|
|
||||||
baseUrl: process.env.BASE_URL,
|
|
||||||
openaiUrl: process.env.OPENAI_BASE_URL ?? process.env.BASE_URL,
|
|
||||||
disableGPT4: !!process.env.DISABLE_GPT4,
|
|
||||||
useCustomConfig: !!process.env.USE_CUSTOM_CONFIG,
|
|
||||||
hideBalanceQuery: !process.env.ENABLE_BALANCE_QUERY,
|
|
||||||
disableFastLink: !!process.env.DISABLE_FAST_LINK,
|
|
||||||
defaultModel: process.env.DEFAULT_MODEL ?? "",
|
|
||||||
enableMcp: process.env.ENABLE_MCP === "true",
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -88,6 +88,10 @@ declare global {
|
|||||||
SILICONFLOW_URL?: string;
|
SILICONFLOW_URL?: string;
|
||||||
SILICONFLOW_API_KEY?: string;
|
SILICONFLOW_API_KEY?: string;
|
||||||
|
|
||||||
|
// 302.AI only
|
||||||
|
AI302_URL?: string;
|
||||||
|
AI302_API_KEY?: string;
|
||||||
|
|
||||||
// custom template for preprocessing user input
|
// custom template for preprocessing user input
|
||||||
DEFAULT_INPUT_TEMPLATE?: string;
|
DEFAULT_INPUT_TEMPLATE?: string;
|
||||||
|
|
||||||
@@ -163,6 +167,7 @@ export const getServerSideConfig = () => {
|
|||||||
const isXAI = !!process.env.XAI_API_KEY;
|
const isXAI = !!process.env.XAI_API_KEY;
|
||||||
const isChatGLM = !!process.env.CHATGLM_API_KEY;
|
const isChatGLM = !!process.env.CHATGLM_API_KEY;
|
||||||
const isSiliconFlow = !!process.env.SILICONFLOW_API_KEY;
|
const isSiliconFlow = !!process.env.SILICONFLOW_API_KEY;
|
||||||
|
const isAI302 = !!process.env.AI302_API_KEY;
|
||||||
// const apiKeyEnvVar = process.env.OPENAI_API_KEY ?? "";
|
// const apiKeyEnvVar = process.env.OPENAI_API_KEY ?? "";
|
||||||
// const apiKeys = apiKeyEnvVar.split(",").map((v) => v.trim());
|
// const apiKeys = apiKeyEnvVar.split(",").map((v) => v.trim());
|
||||||
// const randomIndex = Math.floor(Math.random() * apiKeys.length);
|
// const randomIndex = Math.floor(Math.random() * apiKeys.length);
|
||||||
@@ -246,6 +251,10 @@ export const getServerSideConfig = () => {
|
|||||||
siliconFlowUrl: process.env.SILICONFLOW_URL,
|
siliconFlowUrl: process.env.SILICONFLOW_URL,
|
||||||
siliconFlowApiKey: getApiKey(process.env.SILICONFLOW_API_KEY),
|
siliconFlowApiKey: getApiKey(process.env.SILICONFLOW_API_KEY),
|
||||||
|
|
||||||
|
isAI302,
|
||||||
|
ai302Url: process.env.AI302_URL,
|
||||||
|
ai302ApiKey: getApiKey(process.env.AI302_API_KEY),
|
||||||
|
|
||||||
gtmId: process.env.GTM_ID,
|
gtmId: process.env.GTM_ID,
|
||||||
gaId: process.env.GA_ID || DEFAULT_GA_ID,
|
gaId: process.env.GA_ID || DEFAULT_GA_ID,
|
||||||
|
|
||||||
|
@@ -36,6 +36,8 @@ export const CHATGLM_BASE_URL = "https://open.bigmodel.cn";
|
|||||||
|
|
||||||
export const SILICONFLOW_BASE_URL = "https://api.siliconflow.cn";
|
export const SILICONFLOW_BASE_URL = "https://api.siliconflow.cn";
|
||||||
|
|
||||||
|
export const AI302_BASE_URL = "https://api.302.ai";
|
||||||
|
|
||||||
export const CACHE_URL_PREFIX = "/api/cache";
|
export const CACHE_URL_PREFIX = "/api/cache";
|
||||||
export const UPLOAD_URL = `${CACHE_URL_PREFIX}/upload`;
|
export const UPLOAD_URL = `${CACHE_URL_PREFIX}/upload`;
|
||||||
|
|
||||||
@@ -72,6 +74,7 @@ export enum ApiPath {
|
|||||||
ChatGLM = "/api/chatglm",
|
ChatGLM = "/api/chatglm",
|
||||||
DeepSeek = "/api/deepseek",
|
DeepSeek = "/api/deepseek",
|
||||||
SiliconFlow = "/api/siliconflow",
|
SiliconFlow = "/api/siliconflow",
|
||||||
|
"302.AI" = "/api/302ai",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SlotID {
|
export enum SlotID {
|
||||||
@@ -130,6 +133,7 @@ export enum ServiceProvider {
|
|||||||
ChatGLM = "ChatGLM",
|
ChatGLM = "ChatGLM",
|
||||||
DeepSeek = "DeepSeek",
|
DeepSeek = "DeepSeek",
|
||||||
SiliconFlow = "SiliconFlow",
|
SiliconFlow = "SiliconFlow",
|
||||||
|
"302.AI" = "302.AI",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Google API safety settings, see https://ai.google.dev/gemini-api/docs/safety-settings
|
// Google API safety settings, see https://ai.google.dev/gemini-api/docs/safety-settings
|
||||||
@@ -156,6 +160,7 @@ export enum ModelProvider {
|
|||||||
ChatGLM = "ChatGLM",
|
ChatGLM = "ChatGLM",
|
||||||
DeepSeek = "DeepSeek",
|
DeepSeek = "DeepSeek",
|
||||||
SiliconFlow = "SiliconFlow",
|
SiliconFlow = "SiliconFlow",
|
||||||
|
"302.AI" = "302.AI",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Stability = {
|
export const Stability = {
|
||||||
@@ -266,6 +271,13 @@ export const SiliconFlow = {
|
|||||||
ListModelPath: "v1/models?&sub_type=chat",
|
ListModelPath: "v1/models?&sub_type=chat",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const AI302 = {
|
||||||
|
ExampleEndpoint: AI302_BASE_URL,
|
||||||
|
ChatPath: "v1/chat/completions",
|
||||||
|
EmbeddingsPath: "jina/v1/embeddings",
|
||||||
|
ListModelPath: "v1/models?llm=1",
|
||||||
|
};
|
||||||
|
|
||||||
export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang
|
export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang
|
||||||
// export const DEFAULT_SYSTEM_TEMPLATE = `
|
// export const DEFAULT_SYSTEM_TEMPLATE = `
|
||||||
// You are ChatGPT, a large language model trained by {{ServiceProvider}}.
|
// You are ChatGPT, a large language model trained by {{ServiceProvider}}.
|
||||||
@@ -523,20 +535,15 @@ const openaiModels = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const googleModels = [
|
const googleModels = [
|
||||||
"gemini-1.0-pro", // Deprecated on 2/15/2025
|
|
||||||
"gemini-1.5-pro-latest",
|
"gemini-1.5-pro-latest",
|
||||||
"gemini-1.5-pro",
|
"gemini-1.5-pro",
|
||||||
"gemini-1.5-pro-002",
|
"gemini-1.5-pro-002",
|
||||||
"gemini-1.5-pro-exp-0827",
|
|
||||||
"gemini-1.5-flash-latest",
|
"gemini-1.5-flash-latest",
|
||||||
"gemini-1.5-flash-8b-latest",
|
"gemini-1.5-flash-8b-latest",
|
||||||
"gemini-1.5-flash",
|
"gemini-1.5-flash",
|
||||||
"gemini-1.5-flash-8b",
|
"gemini-1.5-flash-8b",
|
||||||
"gemini-1.5-flash-002",
|
"gemini-1.5-flash-002",
|
||||||
"gemini-1.5-flash-exp-0827",
|
|
||||||
"learnlm-1.5-pro-experimental",
|
"learnlm-1.5-pro-experimental",
|
||||||
"gemini-exp-1114",
|
|
||||||
"gemini-exp-1121",
|
|
||||||
"gemini-exp-1206",
|
"gemini-exp-1206",
|
||||||
"gemini-2.0-flash",
|
"gemini-2.0-flash",
|
||||||
"gemini-2.0-flash-exp",
|
"gemini-2.0-flash-exp",
|
||||||
@@ -546,6 +553,7 @@ const googleModels = [
|
|||||||
"gemini-2.0-flash-thinking-exp-01-21",
|
"gemini-2.0-flash-thinking-exp-01-21",
|
||||||
"gemini-2.0-pro-exp",
|
"gemini-2.0-pro-exp",
|
||||||
"gemini-2.0-pro-exp-02-05",
|
"gemini-2.0-pro-exp-02-05",
|
||||||
|
"gemini-2.5-pro-preview-06-05",
|
||||||
];
|
];
|
||||||
|
|
||||||
const anthropicModels = [
|
const anthropicModels = [
|
||||||
@@ -632,6 +640,18 @@ const xAIModes = [
|
|||||||
"grok-2-vision-1212",
|
"grok-2-vision-1212",
|
||||||
"grok-2-vision",
|
"grok-2-vision",
|
||||||
"grok-2-vision-latest",
|
"grok-2-vision-latest",
|
||||||
|
"grok-3-mini-fast-beta",
|
||||||
|
"grok-3-mini-fast",
|
||||||
|
"grok-3-mini-fast-latest",
|
||||||
|
"grok-3-mini-beta",
|
||||||
|
"grok-3-mini",
|
||||||
|
"grok-3-mini-latest",
|
||||||
|
"grok-3-fast-beta",
|
||||||
|
"grok-3-fast",
|
||||||
|
"grok-3-fast-latest",
|
||||||
|
"grok-3-beta",
|
||||||
|
"grok-3",
|
||||||
|
"grok-3-latest",
|
||||||
];
|
];
|
||||||
|
|
||||||
const chatglmModels = [
|
const chatglmModels = [
|
||||||
@@ -671,6 +691,31 @@ const siliconflowModels = [
|
|||||||
"Pro/deepseek-ai/DeepSeek-V3",
|
"Pro/deepseek-ai/DeepSeek-V3",
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const ai302Models = [
|
||||||
|
"deepseek-chat",
|
||||||
|
"gpt-4o",
|
||||||
|
"chatgpt-4o-latest",
|
||||||
|
"llama3.3-70b",
|
||||||
|
"deepseek-reasoner",
|
||||||
|
"gemini-2.0-flash",
|
||||||
|
"claude-3-7-sonnet-20250219",
|
||||||
|
"claude-3-7-sonnet-latest",
|
||||||
|
"grok-3-beta",
|
||||||
|
"grok-3-mini-beta",
|
||||||
|
"gpt-4.1",
|
||||||
|
"gpt-4.1-mini",
|
||||||
|
"o3",
|
||||||
|
"o4-mini",
|
||||||
|
"qwen3-235b-a22b",
|
||||||
|
"qwen3-32b",
|
||||||
|
"gemini-2.5-pro-preview-05-06",
|
||||||
|
"llama-4-maverick",
|
||||||
|
"gemini-2.5-flash",
|
||||||
|
"claude-sonnet-4-20250514",
|
||||||
|
"claude-opus-4-20250514",
|
||||||
|
"gemini-2.5-pro",
|
||||||
|
];
|
||||||
|
|
||||||
let seq = 1000; // 内置的模型序号生成器从1000开始
|
let seq = 1000; // 内置的模型序号生成器从1000开始
|
||||||
export const DEFAULT_MODELS = [
|
export const DEFAULT_MODELS = [
|
||||||
...openaiModels.map((name) => ({
|
...openaiModels.map((name) => ({
|
||||||
@@ -827,6 +872,17 @@ export const DEFAULT_MODELS = [
|
|||||||
sorted: 14,
|
sorted: 14,
|
||||||
},
|
},
|
||||||
})),
|
})),
|
||||||
|
...ai302Models.map((name) => ({
|
||||||
|
name,
|
||||||
|
available: true,
|
||||||
|
sorted: seq++,
|
||||||
|
provider: {
|
||||||
|
id: "ai302",
|
||||||
|
providerName: "302.AI",
|
||||||
|
providerType: "ai302",
|
||||||
|
sorted: 15,
|
||||||
|
},
|
||||||
|
})),
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export const CHAT_PAGE_SIZE = 15;
|
export const CHAT_PAGE_SIZE = 15;
|
||||||
|
@@ -416,6 +416,17 @@ const ar: PartialLocaleType = {
|
|||||||
SubTitle: "مثال:",
|
SubTitle: "مثال:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "مفتاح 302.AI API",
|
||||||
|
SubTitle: "استخدم مفتاح 302.AI API مخصص",
|
||||||
|
Placeholder: "مفتاح 302.AI API",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "عنوان الواجهة",
|
||||||
|
SubTitle: "مثال:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "اسم النموذج المخصص",
|
Title: "اسم النموذج المخصص",
|
||||||
SubTitle: "أضف خيارات نموذج مخصص، مفصولة بفواصل إنجليزية",
|
SubTitle: "أضف خيارات نموذج مخصص، مفصولة بفواصل إنجليزية",
|
||||||
|
@@ -423,6 +423,17 @@ const bn: PartialLocaleType = {
|
|||||||
SubTitle: "উদাহরণ:",
|
SubTitle: "উদাহরণ:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "ইন্টারফেস কী",
|
||||||
|
SubTitle: "স্বনির্ধারিত 302.AI API কী ব্যবহার করুন",
|
||||||
|
Placeholder: "302.AI API কী",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "ইন্টারফেস ঠিকানা",
|
||||||
|
SubTitle: "উদাহরণ:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "স্বনির্ধারিত মডেল নাম",
|
Title: "স্বনির্ধারিত মডেল নাম",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -538,6 +538,17 @@ const cn = {
|
|||||||
Title: "自定义模型名",
|
Title: "自定义模型名",
|
||||||
SubTitle: "增加自定义模型可选项,使用英文逗号隔开",
|
SubTitle: "增加自定义模型可选项,使用英文逗号隔开",
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "接口密钥",
|
||||||
|
SubTitle: "使用自定义302.AI API Key",
|
||||||
|
Placeholder: "302.AI API Key",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "接口地址",
|
||||||
|
SubTitle: "样例:",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
Model: "模型 (model)",
|
Model: "模型 (model)",
|
||||||
|
@@ -423,6 +423,17 @@ const cs: PartialLocaleType = {
|
|||||||
SubTitle: "Příklad:",
|
SubTitle: "Příklad:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Rozhraní klíč",
|
||||||
|
SubTitle: "Použijte vlastní 302.AI API Key",
|
||||||
|
Placeholder: "302.AI API Key",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Adresa rozhraní",
|
||||||
|
SubTitle: "Příklad:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Vlastní názvy modelů",
|
Title: "Vlastní názvy modelů",
|
||||||
SubTitle: "Přidejte možnosti vlastních modelů, oddělené čárkami",
|
SubTitle: "Přidejte možnosti vlastních modelů, oddělené čárkami",
|
||||||
|
@@ -517,6 +517,17 @@ const da: PartialLocaleType = {
|
|||||||
SubTitle: "Vælg et niveau for indholdskontrol",
|
SubTitle: "Vælg et niveau for indholdskontrol",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "302.AI API Key",
|
||||||
|
SubTitle: "Brug en custom 302.AI API Key",
|
||||||
|
Placeholder: "302.AI API Key",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Endpoint-adresse",
|
||||||
|
SubTitle: "Eksempel: ",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Model: "Model",
|
Model: "Model",
|
||||||
CompressModel: {
|
CompressModel: {
|
||||||
|
@@ -434,6 +434,17 @@ const de: PartialLocaleType = {
|
|||||||
SubTitle: "Beispiel:",
|
SubTitle: "Beispiel:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Schnittstellenschlüssel",
|
||||||
|
SubTitle: "Verwenden Sie einen benutzerdefinierten 302.AI API-Schlüssel",
|
||||||
|
Placeholder: "302.AI API-Schlüssel",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Endpunktadresse",
|
||||||
|
SubTitle: "Beispiel:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Benutzerdefinierter Modellname",
|
Title: "Benutzerdefinierter Modellname",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -543,6 +543,17 @@ const en: LocaleType = {
|
|||||||
SubTitle: "Select a safety filtering level",
|
SubTitle: "Select a safety filtering level",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "302.AI API Key",
|
||||||
|
SubTitle: "Use a custom 302.AI API Key",
|
||||||
|
Placeholder: "302.AI API Key",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Endpoint Address",
|
||||||
|
SubTitle: "Example: ",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
Model: "Model",
|
Model: "Model",
|
||||||
|
@@ -436,6 +436,17 @@ const es: PartialLocaleType = {
|
|||||||
SubTitle: "Ejemplo:",
|
SubTitle: "Ejemplo:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Clave de interfaz",
|
||||||
|
SubTitle: "Usa una clave API de 302.AI personalizada",
|
||||||
|
Placeholder: "Clave API de 302.AI",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Dirección del endpoint",
|
||||||
|
SubTitle: "Ejemplo:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Nombre del modelo personalizado",
|
Title: "Nombre del modelo personalizado",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -435,6 +435,17 @@ const fr: PartialLocaleType = {
|
|||||||
SubTitle: "Exemple :",
|
SubTitle: "Exemple :",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Clé d'interface",
|
||||||
|
SubTitle: "Utiliser une clé API 302.AI personnalisée",
|
||||||
|
Placeholder: "Clé API 302.AI",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Adresse de l'endpoint",
|
||||||
|
SubTitle: "Exemple :",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Nom du modèle personnalisé",
|
Title: "Nom du modèle personnalisé",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -424,6 +424,17 @@ const id: PartialLocaleType = {
|
|||||||
SubTitle: "Contoh:",
|
SubTitle: "Contoh:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Kunci Antarmuka",
|
||||||
|
SubTitle: "Gunakan 302.AI API Key kustom",
|
||||||
|
Placeholder: "302.AI API Key",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Alamat Antarmuka",
|
||||||
|
SubTitle: "Contoh:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Nama Model Kustom",
|
Title: "Nama Model Kustom",
|
||||||
SubTitle: "Tambahkan opsi model kustom, pisahkan dengan koma",
|
SubTitle: "Tambahkan opsi model kustom, pisahkan dengan koma",
|
||||||
|
@@ -436,6 +436,17 @@ const it: PartialLocaleType = {
|
|||||||
SubTitle: "Esempio:",
|
SubTitle: "Esempio:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Chiave dell'interfaccia",
|
||||||
|
SubTitle: "Utilizza una chiave API 302.AI personalizzata",
|
||||||
|
Placeholder: "Chiave API 302.AI",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Indirizzo dell'interfaccia",
|
||||||
|
SubTitle: "Esempio:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Nome del modello personalizzato",
|
Title: "Nome del modello personalizzato",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -420,6 +420,17 @@ const jp: PartialLocaleType = {
|
|||||||
SubTitle: "例:",
|
SubTitle: "例:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "APIキー",
|
||||||
|
SubTitle: "カスタム302.AI APIキーを使用",
|
||||||
|
Placeholder: "302.AI APIキー",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "エンドポイント",
|
||||||
|
SubTitle: "例:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "カスタムモデル名",
|
Title: "カスタムモデル名",
|
||||||
SubTitle: "カスタムモデルの選択肢を追加、英語のカンマで区切る",
|
SubTitle: "カスタムモデルの選択肢を追加、英語のカンマで区切る",
|
||||||
|
@@ -421,6 +421,17 @@ const ko: PartialLocaleType = {
|
|||||||
Title: "커스텀 모델 이름",
|
Title: "커스텀 모델 이름",
|
||||||
SubTitle: "커스텀 모델 옵션 추가, 영어 쉼표로 구분",
|
SubTitle: "커스텀 모델 옵션 추가, 영어 쉼표로 구분",
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "엔드포인트 키",
|
||||||
|
SubTitle: "커스텀 302.AI API 키 사용",
|
||||||
|
Placeholder: "302.AI API 키",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "엔드포인트 주소",
|
||||||
|
SubTitle: "예: ",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
Model: "모델 (model)",
|
Model: "모델 (model)",
|
||||||
|
@@ -433,6 +433,17 @@ const no: PartialLocaleType = {
|
|||||||
Title: "Egendefinert modellnavn",
|
Title: "Egendefinert modellnavn",
|
||||||
SubTitle: "Legg til egendefinerte modellalternativer, skill med komma",
|
SubTitle: "Legg til egendefinerte modellalternativer, skill med komma",
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "API-nøkkel",
|
||||||
|
SubTitle: "Bruk egendefinert 302.AI API-nøkkel",
|
||||||
|
Placeholder: "302.AI API-nøkkel",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "API-adresse",
|
||||||
|
SubTitle: "Eksempel:",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
Model: "Modell",
|
Model: "Modell",
|
||||||
|
@@ -359,6 +359,17 @@ const pt: PartialLocaleType = {
|
|||||||
SubTitle: "Verifique sua versão API do console Anthropic",
|
SubTitle: "Verifique sua versão API do console Anthropic",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Chave API 302.AI",
|
||||||
|
SubTitle: "Use uma chave API 302.AI personalizada",
|
||||||
|
Placeholder: "302.AI API Key",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Endpoint Address",
|
||||||
|
SubTitle: "Exemplo: ",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Modelos Personalizados",
|
Title: "Modelos Personalizados",
|
||||||
SubTitle: "Opções de modelo personalizado, separados por vírgula",
|
SubTitle: "Opções de modelo personalizado, separados por vírgula",
|
||||||
|
@@ -426,6 +426,17 @@ const ru: PartialLocaleType = {
|
|||||||
SubTitle: "Пример:",
|
SubTitle: "Пример:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Ключ интерфейса",
|
||||||
|
SubTitle: "Использовать пользовательский 302.AI API-ключ",
|
||||||
|
Placeholder: "302.AI API-ключ",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Адрес интерфейса",
|
||||||
|
SubTitle: "Пример:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Название пользовательской модели",
|
Title: "Название пользовательской модели",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -381,6 +381,17 @@ const sk: PartialLocaleType = {
|
|||||||
SubTitle: "Vyberte špecifickú verziu časti",
|
SubTitle: "Vyberte špecifickú verziu časti",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "API kľúč",
|
||||||
|
SubTitle: "Použiť vlastný API kľúč 302.AI",
|
||||||
|
Placeholder: "302.AI API kľúč",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Adresa koncového bodu",
|
||||||
|
SubTitle: "Príklad:",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
Model: "Model",
|
Model: "Model",
|
||||||
|
@@ -426,6 +426,17 @@ const tr: PartialLocaleType = {
|
|||||||
SubTitle: "Örnek:",
|
SubTitle: "Örnek:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "API Anahtarı",
|
||||||
|
SubTitle: "Özelleştirilmiş 302.AI API Anahtarı kullanın",
|
||||||
|
Placeholder: "302.AI API Anahtarı",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "API Adresi",
|
||||||
|
SubTitle: "Örnek:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Özelleştirilmiş Model Adı",
|
Title: "Özelleştirilmiş Model Adı",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -382,6 +382,17 @@ const tw = {
|
|||||||
SubTitle: "選擇一個特定的 API 版本",
|
SubTitle: "選擇一個特定的 API 版本",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "API 金鑰",
|
||||||
|
SubTitle: "使用自訂 302.AI API 金鑰",
|
||||||
|
Placeholder: "302.AI API 金鑰",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "端點位址",
|
||||||
|
SubTitle: "範例:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "自訂模型名稱",
|
Title: "自訂模型名稱",
|
||||||
SubTitle: "增加自訂模型可選擇項目,使用英文逗號隔開",
|
SubTitle: "增加自訂模型可選擇項目,使用英文逗號隔開",
|
||||||
|
@@ -422,6 +422,17 @@ const vi: PartialLocaleType = {
|
|||||||
SubTitle: "Ví dụ:",
|
SubTitle: "Ví dụ:",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AI302: {
|
||||||
|
ApiKey: {
|
||||||
|
Title: "Khóa API 302.AI",
|
||||||
|
SubTitle: "Sử dụng khóa API 302.AI tùy chỉnh",
|
||||||
|
Placeholder: "302.AI API Key",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "Địa chỉ giao diện",
|
||||||
|
SubTitle: "Ví dụ:",
|
||||||
|
},
|
||||||
|
},
|
||||||
CustomModel: {
|
CustomModel: {
|
||||||
Title: "Tên mô hình tùy chỉnh",
|
Title: "Tên mô hình tùy chỉnh",
|
||||||
SubTitle:
|
SubTitle:
|
||||||
|
@@ -1,491 +0,0 @@
|
|||||||
import {
|
|
||||||
createClient,
|
|
||||||
executeRequest,
|
|
||||||
listTools,
|
|
||||||
removeClient,
|
|
||||||
} from "./client";
|
|
||||||
import { MCPClientLogger } from "./logger";
|
|
||||||
import {
|
|
||||||
DEFAULT_MCP_CONFIG,
|
|
||||||
McpClientData,
|
|
||||||
McpConfigData,
|
|
||||||
McpRequestMessage,
|
|
||||||
ServerConfig,
|
|
||||||
ServerStatusResponse,
|
|
||||||
} from "./types";
|
|
||||||
|
|
||||||
const JSON_INDENT = 2;
|
|
||||||
|
|
||||||
const logger = new MCPClientLogger("MCP Actions");
|
|
||||||
|
|
||||||
const getConfigPath = async () => {
|
|
||||||
if (EXPORT_MODE) {
|
|
||||||
return "/mcp/config.json";
|
|
||||||
} else {
|
|
||||||
const path = await import("path");
|
|
||||||
return path.join(process.cwd(), "app/mcp/mcp_config.json");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class ClientsMap extends Map<string, McpClientData> {
|
|
||||||
toolToClientMap: Map<string, string>;
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this.toolToClientMap = new Map<string, string>();
|
|
||||||
}
|
|
||||||
|
|
||||||
set(clientId: string, data: McpClientData): this {
|
|
||||||
super.set(clientId, data);
|
|
||||||
|
|
||||||
if (data?.tools?.tools) {
|
|
||||||
for (const tool of data.tools.tools) {
|
|
||||||
if (tool.name) {
|
|
||||||
this.toolToClientMap.set(tool.name, clientId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.purgeToolMappings(clientId);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete(clientId: string): boolean {
|
|
||||||
const ret = clientsMap.delete(clientId);
|
|
||||||
this.purgeToolMappings(clientId);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
clear(): void {
|
|
||||||
super.clear();
|
|
||||||
this.toolToClientMap.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
getByToolName(toolName: string) {
|
|
||||||
const toolClientId = clientsMap.toolToClientMap.get(toolName);
|
|
||||||
if (toolClientId) {
|
|
||||||
return clientsMap.get(toolClientId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private purgeToolMappings(clientId: string) {
|
|
||||||
for (const [tool, mappedId] of this.toolToClientMap.entries()) {
|
|
||||||
if (mappedId === clientId) {
|
|
||||||
this.toolToClientMap.delete(tool);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const clientsMap = new ClientsMap();
|
|
||||||
|
|
||||||
// 获取客户端状态
|
|
||||||
export async function getClientsStatus(): Promise<
|
|
||||||
Record<string, ServerStatusResponse>
|
|
||||||
> {
|
|
||||||
const config = await getMcpConfigFromFile();
|
|
||||||
const result: Record<string, ServerStatusResponse> = {};
|
|
||||||
|
|
||||||
for (const clientId of Object.keys(config.mcpServers)) {
|
|
||||||
const status = clientsMap.get(clientId);
|
|
||||||
const serverConfig = config.mcpServers[clientId];
|
|
||||||
|
|
||||||
if (!serverConfig) {
|
|
||||||
result[clientId] = { status: "undefined", errorMsg: null };
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (serverConfig.status === "paused") {
|
|
||||||
result[clientId] = { status: "paused", errorMsg: null };
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!status) {
|
|
||||||
result[clientId] = { status: "undefined", errorMsg: null };
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
status.client === null &&
|
|
||||||
status.tools === null &&
|
|
||||||
status.errorMsg === null
|
|
||||||
) {
|
|
||||||
result[clientId] = { status: "initializing", errorMsg: null };
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status.errorMsg) {
|
|
||||||
result[clientId] = { status: "error", errorMsg: status.errorMsg };
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status.client) {
|
|
||||||
result[clientId] = { status: "active", errorMsg: null };
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
result[clientId] = { status: "error", errorMsg: "Client not found" };
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取客户端工具
|
|
||||||
export async function getClientTools(clientId: string) {
|
|
||||||
return clientsMap.get(clientId)?.tools ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取可用客户端数量
|
|
||||||
export async function getAvailableClientsCount() {
|
|
||||||
let count = 0;
|
|
||||||
clientsMap.forEach((map) => !map.errorMsg && count++);
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取所有客户端工具
|
|
||||||
export async function getAllTools() {
|
|
||||||
const result = [];
|
|
||||||
for (const [clientId, status] of clientsMap.entries()) {
|
|
||||||
result.push({
|
|
||||||
clientId,
|
|
||||||
tools: status.tools,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 初始化单个客户端
|
|
||||||
async function initializeSingleClient(
|
|
||||||
clientId: string,
|
|
||||||
serverConfig: ServerConfig,
|
|
||||||
) {
|
|
||||||
// 如果服务器状态是暂停,则不初始化
|
|
||||||
if (serverConfig.status === "paused") {
|
|
||||||
logger.info(`Skipping initialization for paused client [${clientId}]`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`Initializing client [${clientId}]...`);
|
|
||||||
|
|
||||||
// 先设置初始化状态
|
|
||||||
clientsMap.set(clientId, {
|
|
||||||
client: null,
|
|
||||||
tools: null,
|
|
||||||
errorMsg: null, // null 表示正在初始化
|
|
||||||
});
|
|
||||||
|
|
||||||
// 异步初始化
|
|
||||||
createClient(clientId, serverConfig)
|
|
||||||
.then(async (client) => {
|
|
||||||
const tools = await listTools(client);
|
|
||||||
logger.info(
|
|
||||||
`Supported tools for [${clientId}]: ${JSON.stringify(tools, null, 2)}`,
|
|
||||||
);
|
|
||||||
clientsMap.set(clientId, { client, tools, errorMsg: null });
|
|
||||||
logger.success(`Client [${clientId}] initialized successfully`);
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
clientsMap.set(clientId, {
|
|
||||||
client: null,
|
|
||||||
tools: null,
|
|
||||||
errorMsg: error instanceof Error ? error.message : String(error),
|
|
||||||
});
|
|
||||||
logger.error(`Failed to initialize client [${clientId}]: ${error}`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 初始化系统
|
|
||||||
export async function initializeMcpSystem() {
|
|
||||||
logger.info("MCP Actions starting...");
|
|
||||||
try {
|
|
||||||
// 检查是否已有活跃的客户端
|
|
||||||
if (clientsMap.size > 0) {
|
|
||||||
logger.info("MCP system already initialized, skipping...");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const config = await getMcpConfigFromFile();
|
|
||||||
// 初始化所有客户端
|
|
||||||
for (const [clientId, serverConfig] of Object.entries(config.mcpServers)) {
|
|
||||||
await initializeSingleClient(clientId, serverConfig);
|
|
||||||
}
|
|
||||||
return config;
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to initialize MCP system: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加服务器
|
|
||||||
export async function addMcpServer(clientId: string, config: ServerConfig) {
|
|
||||||
try {
|
|
||||||
const currentConfig = await getMcpConfigFromFile();
|
|
||||||
const isNewServer = !(clientId in currentConfig.mcpServers);
|
|
||||||
|
|
||||||
// 如果是新服务器,设置默认状态为 active
|
|
||||||
if (isNewServer && !config.status) {
|
|
||||||
config.status = "active";
|
|
||||||
}
|
|
||||||
|
|
||||||
const newConfig = {
|
|
||||||
...currentConfig,
|
|
||||||
mcpServers: {
|
|
||||||
...currentConfig.mcpServers,
|
|
||||||
[clientId]: config,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
await updateMcpConfig(newConfig);
|
|
||||||
|
|
||||||
// 只有新服务器或状态为 active 的服务器才初始化
|
|
||||||
if (isNewServer || config.status === "active") {
|
|
||||||
await initializeSingleClient(clientId, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
return newConfig;
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to add server [${clientId}]: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 暂停服务器
|
|
||||||
export async function pauseMcpServer(clientId: string) {
|
|
||||||
try {
|
|
||||||
const currentConfig = await getMcpConfigFromFile();
|
|
||||||
const serverConfig = currentConfig.mcpServers[clientId];
|
|
||||||
if (!serverConfig) {
|
|
||||||
throw new Error(`Server ${clientId} not found`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 先更新配置
|
|
||||||
const newConfig: McpConfigData = {
|
|
||||||
...currentConfig,
|
|
||||||
mcpServers: {
|
|
||||||
...currentConfig.mcpServers,
|
|
||||||
[clientId]: {
|
|
||||||
...serverConfig,
|
|
||||||
status: "paused",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
await updateMcpConfig(newConfig);
|
|
||||||
|
|
||||||
// 然后关闭客户端
|
|
||||||
const client = clientsMap.get(clientId);
|
|
||||||
if (client?.client) {
|
|
||||||
await removeClient(client.client);
|
|
||||||
}
|
|
||||||
clientsMap.delete(clientId);
|
|
||||||
|
|
||||||
return newConfig;
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to pause server [${clientId}]: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 恢复服务器
|
|
||||||
export async function resumeMcpServer(clientId: string): Promise<void> {
|
|
||||||
try {
|
|
||||||
const currentConfig = await getMcpConfigFromFile();
|
|
||||||
const serverConfig = currentConfig.mcpServers[clientId];
|
|
||||||
if (!serverConfig) {
|
|
||||||
throw new Error(`Server ${clientId} not found`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 先尝试初始化客户端
|
|
||||||
logger.info(`Trying to initialize client [${clientId}]...`);
|
|
||||||
try {
|
|
||||||
const client = await createClient(clientId, serverConfig);
|
|
||||||
const tools = await listTools(client);
|
|
||||||
clientsMap.set(clientId, { client, tools, errorMsg: null });
|
|
||||||
logger.success(`Client [${clientId}] initialized successfully`);
|
|
||||||
|
|
||||||
// 初始化成功后更新配置
|
|
||||||
const newConfig: McpConfigData = {
|
|
||||||
...currentConfig,
|
|
||||||
mcpServers: {
|
|
||||||
...currentConfig.mcpServers,
|
|
||||||
[clientId]: {
|
|
||||||
...serverConfig,
|
|
||||||
status: "active" as const,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
await updateMcpConfig(newConfig);
|
|
||||||
} catch (error) {
|
|
||||||
const currentConfig = await getMcpConfigFromFile();
|
|
||||||
const serverConfig = currentConfig.mcpServers[clientId];
|
|
||||||
|
|
||||||
// 如果配置中存在该服务器,则更新其状态为 error
|
|
||||||
if (serverConfig) {
|
|
||||||
serverConfig.status = "error";
|
|
||||||
await updateMcpConfig(currentConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 初始化失败
|
|
||||||
clientsMap.set(clientId, {
|
|
||||||
client: null,
|
|
||||||
tools: null,
|
|
||||||
errorMsg: error instanceof Error ? error.message : String(error),
|
|
||||||
});
|
|
||||||
logger.error(`Failed to initialize client [${clientId}]: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to resume server [${clientId}]: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 移除服务器
|
|
||||||
export async function removeMcpServer(clientId: string) {
|
|
||||||
try {
|
|
||||||
const currentConfig = await getMcpConfigFromFile();
|
|
||||||
const { [clientId]: _, ...rest } = currentConfig.mcpServers;
|
|
||||||
const newConfig = {
|
|
||||||
...currentConfig,
|
|
||||||
mcpServers: rest,
|
|
||||||
};
|
|
||||||
await updateMcpConfig(newConfig);
|
|
||||||
|
|
||||||
// 关闭并移除客户端
|
|
||||||
const client = clientsMap.get(clientId);
|
|
||||||
if (client?.client) {
|
|
||||||
await removeClient(client.client);
|
|
||||||
}
|
|
||||||
clientsMap.delete(clientId);
|
|
||||||
|
|
||||||
return newConfig;
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to remove server [${clientId}]: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 重启所有客户端
|
|
||||||
export async function restartAllClients() {
|
|
||||||
logger.info("Restarting all clients...");
|
|
||||||
try {
|
|
||||||
// 关闭所有客户端
|
|
||||||
for (const client of clientsMap.values()) {
|
|
||||||
if (client.client) {
|
|
||||||
await removeClient(client.client);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清空状态
|
|
||||||
clientsMap.clear();
|
|
||||||
|
|
||||||
// 重新初始化
|
|
||||||
const config = await getMcpConfigFromFile();
|
|
||||||
for (const [clientId, serverConfig] of Object.entries(config.mcpServers)) {
|
|
||||||
await initializeSingleClient(clientId, serverConfig);
|
|
||||||
}
|
|
||||||
return config;
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to restart clients: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 执行 MCP 请求
|
|
||||||
export async function executeMcpAction(
|
|
||||||
clientId: string,
|
|
||||||
request: McpRequestMessage,
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
let client = clientsMap.get(clientId);
|
|
||||||
if (
|
|
||||||
!client &&
|
|
||||||
request.params?.name &&
|
|
||||||
typeof request.params.name === "string"
|
|
||||||
) {
|
|
||||||
client = clientsMap.getByToolName(request.params.name);
|
|
||||||
}
|
|
||||||
if (!client?.client) {
|
|
||||||
throw new Error(`Client ${clientId} not found`);
|
|
||||||
}
|
|
||||||
logger.info(`Executing request for [${clientId}]`);
|
|
||||||
return await executeRequest(client.client, request);
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to execute request for [${clientId}]: ${error}`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取 MCP 配置文件
|
|
||||||
export async function getMcpConfigFromFile(): Promise<McpConfigData> {
|
|
||||||
try {
|
|
||||||
if (EXPORT_MODE) {
|
|
||||||
const res = await fetch(await getConfigPath());
|
|
||||||
const config: McpConfigData = await res.json();
|
|
||||||
const storage = localStorage;
|
|
||||||
const storedConfig_str = storage.getItem("McpConfig");
|
|
||||||
if (storedConfig_str) {
|
|
||||||
const storedConfig: McpConfigData = JSON.parse(storedConfig_str);
|
|
||||||
// Create a merged configuration that combines both sources
|
|
||||||
const merged = { ...config.mcpServers };
|
|
||||||
if (storedConfig.mcpServers) {
|
|
||||||
// Ensure we process all servers from stored config
|
|
||||||
for (const id in storedConfig.mcpServers) {
|
|
||||||
merged[id] = { ...merged[id], ...storedConfig.mcpServers[id] };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config.mcpServers = merged;
|
|
||||||
}
|
|
||||||
return config;
|
|
||||||
} else {
|
|
||||||
const fs = await import("fs/promises");
|
|
||||||
const configStr = await fs.readFile(await getConfigPath(), "utf-8");
|
|
||||||
return JSON.parse(configStr);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to load MCP config, using default config: ${error}`);
|
|
||||||
return DEFAULT_MCP_CONFIG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新 MCP 配置文件
|
|
||||||
async function updateMcpConfig(config: McpConfigData): Promise<void> {
|
|
||||||
if (EXPORT_MODE) {
|
|
||||||
try {
|
|
||||||
const storage = localStorage;
|
|
||||||
storage.setItem("McpConfig", JSON.stringify(config));
|
|
||||||
} catch (storageError) {
|
|
||||||
logger.warn(`Failed to save MCP config to localStorage: ${storageError}`);
|
|
||||||
// Continue execution without storage
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const fs = await import("fs/promises");
|
|
||||||
const path = await import("path");
|
|
||||||
// 确保目录存在
|
|
||||||
await fs.mkdir(path.dirname(await getConfigPath()), { recursive: true });
|
|
||||||
await fs.writeFile(
|
|
||||||
await getConfigPath(),
|
|
||||||
JSON.stringify(config, null, JSON_INDENT),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查 MCP 是否启用
|
|
||||||
export async function isMcpEnabled() {
|
|
||||||
try {
|
|
||||||
const config = await getMcpConfigFromFile();
|
|
||||||
if (typeof config.enableMcp === "boolean") {
|
|
||||||
return config.enableMcp;
|
|
||||||
}
|
|
||||||
if (EXPORT_MODE) {
|
|
||||||
const { getClientConfig } = await import("../config/client");
|
|
||||||
const clientConfig = getClientConfig();
|
|
||||||
return clientConfig?.enableMcp === true;
|
|
||||||
} else {
|
|
||||||
const { getServerSideConfig } = await import("../config/server");
|
|
||||||
const serverConfig = getServerSideConfig();
|
|
||||||
return serverConfig.enableMcp;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to check MCP status: ${error}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1 +0,0 @@
|
|||||||
export * from "./actions.base";
|
|
@@ -1,2 +0,0 @@
|
|||||||
"use server";
|
|
||||||
export * from "./actions.base";
|
|
@@ -1,56 +1,385 @@
|
|||||||
import { McpRequestMessage, ServerConfig } from "./types";
|
"use server";
|
||||||
|
import {
|
||||||
|
createClient,
|
||||||
|
executeRequest,
|
||||||
|
listTools,
|
||||||
|
removeClient,
|
||||||
|
} from "./client";
|
||||||
|
import { MCPClientLogger } from "./logger";
|
||||||
|
import {
|
||||||
|
DEFAULT_MCP_CONFIG,
|
||||||
|
McpClientData,
|
||||||
|
McpConfigData,
|
||||||
|
McpRequestMessage,
|
||||||
|
ServerConfig,
|
||||||
|
ServerStatusResponse,
|
||||||
|
} from "./types";
|
||||||
|
import fs from "fs/promises";
|
||||||
|
import path from "path";
|
||||||
|
import { getServerSideConfig } from "../config/server";
|
||||||
|
|
||||||
let actionsHost: typeof import("./actions.base") | undefined;
|
const logger = new MCPClientLogger("MCP Actions");
|
||||||
|
const CONFIG_PATH = path.join(process.cwd(), "app/mcp/mcp_config.json");
|
||||||
|
|
||||||
const actions = async () => {
|
const clientsMap = new Map<string, McpClientData>();
|
||||||
if (!actionsHost) {
|
|
||||||
if (EXPORT_MODE) {
|
// 获取客户端状态
|
||||||
actionsHost = await import("./actions.client");
|
export async function getClientsStatus(): Promise<
|
||||||
} else {
|
Record<string, ServerStatusResponse>
|
||||||
actionsHost = await import("./actions.server");
|
> {
|
||||||
|
const config = await getMcpConfigFromFile();
|
||||||
|
const result: Record<string, ServerStatusResponse> = {};
|
||||||
|
|
||||||
|
for (const clientId of Object.keys(config.mcpServers)) {
|
||||||
|
const status = clientsMap.get(clientId);
|
||||||
|
const serverConfig = config.mcpServers[clientId];
|
||||||
|
|
||||||
|
if (!serverConfig) {
|
||||||
|
result[clientId] = { status: "undefined", errorMsg: null };
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (serverConfig.status === "paused") {
|
||||||
|
result[clientId] = { status: "paused", errorMsg: null };
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!status) {
|
||||||
|
result[clientId] = { status: "undefined", errorMsg: null };
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
status.client === null &&
|
||||||
|
status.tools === null &&
|
||||||
|
status.errorMsg === null
|
||||||
|
) {
|
||||||
|
result[clientId] = { status: "initializing", errorMsg: null };
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status.errorMsg) {
|
||||||
|
result[clientId] = { status: "error", errorMsg: status.errorMsg };
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status.client) {
|
||||||
|
result[clientId] = { status: "active", errorMsg: null };
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
result[clientId] = { status: "error", errorMsg: "Client not found" };
|
||||||
}
|
}
|
||||||
|
|
||||||
return actionsHost;
|
return result;
|
||||||
};
|
}
|
||||||
|
|
||||||
export const getAvailableClientsCount = async () => {
|
// 获取客户端工具
|
||||||
return (await actions()).getAvailableClientsCount();
|
export async function getClientTools(clientId: string) {
|
||||||
};
|
return clientsMap.get(clientId)?.tools ?? null;
|
||||||
export const isMcpEnabled = async () => {
|
}
|
||||||
return (await actions()).isMcpEnabled();
|
|
||||||
};
|
|
||||||
export const initializeMcpSystem = async () => {
|
|
||||||
return (await actions()).initializeMcpSystem();
|
|
||||||
};
|
|
||||||
export const addMcpServer = async (clientId: string, config: ServerConfig) => {
|
|
||||||
return (await actions()).addMcpServer(clientId, config);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getClientsStatus = async () => {
|
// 获取可用客户端数量
|
||||||
return (await actions()).getClientsStatus();
|
export async function getAvailableClientsCount() {
|
||||||
};
|
let count = 0;
|
||||||
export const getClientTools = async (clientId: string) => {
|
clientsMap.forEach((map) => !map.errorMsg && count++);
|
||||||
return (await actions()).getClientTools(clientId);
|
return count;
|
||||||
};
|
}
|
||||||
export const getMcpConfigFromFile = async () => {
|
|
||||||
return (await actions()).getMcpConfigFromFile();
|
// 获取所有客户端工具
|
||||||
};
|
export async function getAllTools() {
|
||||||
export const pauseMcpServer = async (clientId: string) => {
|
const result = [];
|
||||||
return (await actions()).pauseMcpServer(clientId);
|
for (const [clientId, status] of clientsMap.entries()) {
|
||||||
};
|
result.push({
|
||||||
export const restartAllClients = async () => {
|
clientId,
|
||||||
return (await actions()).restartAllClients();
|
tools: status.tools,
|
||||||
};
|
});
|
||||||
export const resumeMcpServer = async (clientId: string) => {
|
}
|
||||||
return (await actions()).resumeMcpServer(clientId);
|
return result;
|
||||||
};
|
}
|
||||||
export const executeMcpAction = async (
|
|
||||||
|
// 初始化单个客户端
|
||||||
|
async function initializeSingleClient(
|
||||||
|
clientId: string,
|
||||||
|
serverConfig: ServerConfig,
|
||||||
|
) {
|
||||||
|
// 如果服务器状态是暂停,则不初始化
|
||||||
|
if (serverConfig.status === "paused") {
|
||||||
|
logger.info(`Skipping initialization for paused client [${clientId}]`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(`Initializing client [${clientId}]...`);
|
||||||
|
|
||||||
|
// 先设置初始化状态
|
||||||
|
clientsMap.set(clientId, {
|
||||||
|
client: null,
|
||||||
|
tools: null,
|
||||||
|
errorMsg: null, // null 表示正在初始化
|
||||||
|
});
|
||||||
|
|
||||||
|
// 异步初始化
|
||||||
|
createClient(clientId, serverConfig)
|
||||||
|
.then(async (client) => {
|
||||||
|
const tools = await listTools(client);
|
||||||
|
logger.info(
|
||||||
|
`Supported tools for [${clientId}]: ${JSON.stringify(tools, null, 2)}`,
|
||||||
|
);
|
||||||
|
clientsMap.set(clientId, { client, tools, errorMsg: null });
|
||||||
|
logger.success(`Client [${clientId}] initialized successfully`);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
clientsMap.set(clientId, {
|
||||||
|
client: null,
|
||||||
|
tools: null,
|
||||||
|
errorMsg: error instanceof Error ? error.message : String(error),
|
||||||
|
});
|
||||||
|
logger.error(`Failed to initialize client [${clientId}]: ${error}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化系统
|
||||||
|
export async function initializeMcpSystem() {
|
||||||
|
logger.info("MCP Actions starting...");
|
||||||
|
try {
|
||||||
|
// 检查是否已有活跃的客户端
|
||||||
|
if (clientsMap.size > 0) {
|
||||||
|
logger.info("MCP system already initialized, skipping...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const config = await getMcpConfigFromFile();
|
||||||
|
// 初始化所有客户端
|
||||||
|
for (const [clientId, serverConfig] of Object.entries(config.mcpServers)) {
|
||||||
|
await initializeSingleClient(clientId, serverConfig);
|
||||||
|
}
|
||||||
|
return config;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to initialize MCP system: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加服务器
|
||||||
|
export async function addMcpServer(clientId: string, config: ServerConfig) {
|
||||||
|
try {
|
||||||
|
const currentConfig = await getMcpConfigFromFile();
|
||||||
|
const isNewServer = !(clientId in currentConfig.mcpServers);
|
||||||
|
|
||||||
|
// 如果是新服务器,设置默认状态为 active
|
||||||
|
if (isNewServer && !config.status) {
|
||||||
|
config.status = "active";
|
||||||
|
}
|
||||||
|
|
||||||
|
const newConfig = {
|
||||||
|
...currentConfig,
|
||||||
|
mcpServers: {
|
||||||
|
...currentConfig.mcpServers,
|
||||||
|
[clientId]: config,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
await updateMcpConfig(newConfig);
|
||||||
|
|
||||||
|
// 只有新服务器或状态为 active 的服务器才初始化
|
||||||
|
if (isNewServer || config.status === "active") {
|
||||||
|
await initializeSingleClient(clientId, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newConfig;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to add server [${clientId}]: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 暂停服务器
|
||||||
|
export async function pauseMcpServer(clientId: string) {
|
||||||
|
try {
|
||||||
|
const currentConfig = await getMcpConfigFromFile();
|
||||||
|
const serverConfig = currentConfig.mcpServers[clientId];
|
||||||
|
if (!serverConfig) {
|
||||||
|
throw new Error(`Server ${clientId} not found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先更新配置
|
||||||
|
const newConfig: McpConfigData = {
|
||||||
|
...currentConfig,
|
||||||
|
mcpServers: {
|
||||||
|
...currentConfig.mcpServers,
|
||||||
|
[clientId]: {
|
||||||
|
...serverConfig,
|
||||||
|
status: "paused",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
await updateMcpConfig(newConfig);
|
||||||
|
|
||||||
|
// 然后关闭客户端
|
||||||
|
const client = clientsMap.get(clientId);
|
||||||
|
if (client?.client) {
|
||||||
|
await removeClient(client.client);
|
||||||
|
}
|
||||||
|
clientsMap.delete(clientId);
|
||||||
|
|
||||||
|
return newConfig;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to pause server [${clientId}]: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 恢复服务器
|
||||||
|
export async function resumeMcpServer(clientId: string): Promise<void> {
|
||||||
|
try {
|
||||||
|
const currentConfig = await getMcpConfigFromFile();
|
||||||
|
const serverConfig = currentConfig.mcpServers[clientId];
|
||||||
|
if (!serverConfig) {
|
||||||
|
throw new Error(`Server ${clientId} not found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先尝试初始化客户端
|
||||||
|
logger.info(`Trying to initialize client [${clientId}]...`);
|
||||||
|
try {
|
||||||
|
const client = await createClient(clientId, serverConfig);
|
||||||
|
const tools = await listTools(client);
|
||||||
|
clientsMap.set(clientId, { client, tools, errorMsg: null });
|
||||||
|
logger.success(`Client [${clientId}] initialized successfully`);
|
||||||
|
|
||||||
|
// 初始化成功后更新配置
|
||||||
|
const newConfig: McpConfigData = {
|
||||||
|
...currentConfig,
|
||||||
|
mcpServers: {
|
||||||
|
...currentConfig.mcpServers,
|
||||||
|
[clientId]: {
|
||||||
|
...serverConfig,
|
||||||
|
status: "active" as const,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
await updateMcpConfig(newConfig);
|
||||||
|
} catch (error) {
|
||||||
|
const currentConfig = await getMcpConfigFromFile();
|
||||||
|
const serverConfig = currentConfig.mcpServers[clientId];
|
||||||
|
|
||||||
|
// 如果配置中存在该服务器,则更新其状态为 error
|
||||||
|
if (serverConfig) {
|
||||||
|
serverConfig.status = "error";
|
||||||
|
await updateMcpConfig(currentConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化失败
|
||||||
|
clientsMap.set(clientId, {
|
||||||
|
client: null,
|
||||||
|
tools: null,
|
||||||
|
errorMsg: error instanceof Error ? error.message : String(error),
|
||||||
|
});
|
||||||
|
logger.error(`Failed to initialize client [${clientId}]: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to resume server [${clientId}]: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 移除服务器
|
||||||
|
export async function removeMcpServer(clientId: string) {
|
||||||
|
try {
|
||||||
|
const currentConfig = await getMcpConfigFromFile();
|
||||||
|
const { [clientId]: _, ...rest } = currentConfig.mcpServers;
|
||||||
|
const newConfig = {
|
||||||
|
...currentConfig,
|
||||||
|
mcpServers: rest,
|
||||||
|
};
|
||||||
|
await updateMcpConfig(newConfig);
|
||||||
|
|
||||||
|
// 关闭并移除客户端
|
||||||
|
const client = clientsMap.get(clientId);
|
||||||
|
if (client?.client) {
|
||||||
|
await removeClient(client.client);
|
||||||
|
}
|
||||||
|
clientsMap.delete(clientId);
|
||||||
|
|
||||||
|
return newConfig;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to remove server [${clientId}]: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重启所有客户端
|
||||||
|
export async function restartAllClients() {
|
||||||
|
logger.info("Restarting all clients...");
|
||||||
|
try {
|
||||||
|
// 关闭所有客户端
|
||||||
|
for (const client of clientsMap.values()) {
|
||||||
|
if (client.client) {
|
||||||
|
await removeClient(client.client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清空状态
|
||||||
|
clientsMap.clear();
|
||||||
|
|
||||||
|
// 重新初始化
|
||||||
|
const config = await getMcpConfigFromFile();
|
||||||
|
for (const [clientId, serverConfig] of Object.entries(config.mcpServers)) {
|
||||||
|
await initializeSingleClient(clientId, serverConfig);
|
||||||
|
}
|
||||||
|
return config;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to restart clients: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行 MCP 请求
|
||||||
|
export async function executeMcpAction(
|
||||||
clientId: string,
|
clientId: string,
|
||||||
request: McpRequestMessage,
|
request: McpRequestMessage,
|
||||||
) => {
|
) {
|
||||||
return (await actions()).executeMcpAction(clientId, request);
|
try {
|
||||||
};
|
const client = clientsMap.get(clientId);
|
||||||
export const getAllTools = async () => {
|
if (!client?.client) {
|
||||||
return (await actions()).getAllTools();
|
throw new Error(`Client ${clientId} not found`);
|
||||||
};
|
}
|
||||||
|
logger.info(`Executing request for [${clientId}]`);
|
||||||
|
return await executeRequest(client.client, request);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to execute request for [${clientId}]: ${error}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取 MCP 配置文件
|
||||||
|
export async function getMcpConfigFromFile(): Promise<McpConfigData> {
|
||||||
|
try {
|
||||||
|
const configStr = await fs.readFile(CONFIG_PATH, "utf-8");
|
||||||
|
return JSON.parse(configStr);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to load MCP config, using default config: ${error}`);
|
||||||
|
return DEFAULT_MCP_CONFIG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新 MCP 配置文件
|
||||||
|
async function updateMcpConfig(config: McpConfigData): Promise<void> {
|
||||||
|
try {
|
||||||
|
// 确保目录存在
|
||||||
|
await fs.mkdir(path.dirname(CONFIG_PATH), { recursive: true });
|
||||||
|
await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));
|
||||||
|
} catch (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查 MCP 是否启用
|
||||||
|
export async function isMcpEnabled() {
|
||||||
|
try {
|
||||||
|
const serverConfig = getServerSideConfig();
|
||||||
|
return serverConfig.enableMcp;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to check MCP status: ${error}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
||||||
|
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
||||||
import { MCPClientLogger } from "./logger";
|
import { MCPClientLogger } from "./logger";
|
||||||
import { ListToolsResponse, McpRequestMessage, ServerConfig } from "./types";
|
import { ListToolsResponse, McpRequestMessage, ServerConfig } from "./types";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
@@ -11,41 +12,18 @@ export async function createClient(
|
|||||||
): Promise<Client> {
|
): Promise<Client> {
|
||||||
logger.info(`Creating client for ${id}...`);
|
logger.info(`Creating client for ${id}...`);
|
||||||
|
|
||||||
let transport;
|
const transport = new StdioClientTransport({
|
||||||
|
command: config.command,
|
||||||
if (config.type === "sse") {
|
args: config.args,
|
||||||
const { SSEClientTransport } = await import(
|
env: {
|
||||||
"@modelcontextprotocol/sdk/client/sse.js"
|
...Object.fromEntries(
|
||||||
);
|
Object.entries(process.env)
|
||||||
transport = new SSEClientTransport(new URL(config.url));
|
.filter(([_, v]) => v !== undefined)
|
||||||
} else if (config.type === "streamable") {
|
.map(([k, v]) => [k, v as string]),
|
||||||
const { StreamableHTTPClientTransport } = await import(
|
),
|
||||||
"@modelcontextprotocol/sdk/client/streamableHttp.js"
|
...(config.env || {}),
|
||||||
);
|
},
|
||||||
transport = new StreamableHTTPClientTransport(new URL(config.url));
|
});
|
||||||
} else {
|
|
||||||
if (EXPORT_MODE) {
|
|
||||||
throw new Error(
|
|
||||||
"Cannot use stdio transport in export mode. Please use SSE transport configuration instead.",
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
const { StdioClientTransport } = await import(
|
|
||||||
"@modelcontextprotocol/sdk/client/stdio.js"
|
|
||||||
);
|
|
||||||
transport = new StdioClientTransport({
|
|
||||||
command: config.command,
|
|
||||||
args: config.args,
|
|
||||||
env: {
|
|
||||||
...Object.fromEntries(
|
|
||||||
Object.entries(process.env)
|
|
||||||
.filter(([_, v]) => v !== undefined)
|
|
||||||
.map(([k, v]) => [k, v as string]),
|
|
||||||
),
|
|
||||||
...(config.env || {}),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const client = new Client(
|
const client = new Client(
|
||||||
{
|
{
|
||||||
|
@@ -8,7 +8,6 @@ export interface McpRequestMessage {
|
|||||||
id?: string | number;
|
id?: string | number;
|
||||||
method: "tools/call" | string;
|
method: "tools/call" | string;
|
||||||
params?: {
|
params?: {
|
||||||
name?: string;
|
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -66,14 +65,12 @@ export const McpNotificationsSchema: z.ZodType<McpNotifications> = z.object({
|
|||||||
// Next Chat
|
// Next Chat
|
||||||
////////////
|
////////////
|
||||||
export interface ListToolsResponse {
|
export interface ListToolsResponse {
|
||||||
tools: ToolSchema[];
|
tools: {
|
||||||
}
|
name?: string;
|
||||||
|
description?: string;
|
||||||
export interface ToolSchema {
|
inputSchema?: object;
|
||||||
name?: string;
|
[key: string]: any;
|
||||||
description?: string;
|
};
|
||||||
inputSchema?: object;
|
|
||||||
[key: string]: any;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type McpClientData =
|
export type McpClientData =
|
||||||
@@ -113,43 +110,14 @@ export interface ServerStatusResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MCP 服务器配置相关类型
|
// MCP 服务器配置相关类型
|
||||||
|
export interface ServerConfig {
|
||||||
export const isServerSseConfig = (c?: ServerConfig): c is ServerSseConfig =>
|
|
||||||
c !== null && typeof c === "object" && c.type === "sse";
|
|
||||||
export const isStreamableSseConfig = (c?: ServerConfig): c is ServerSseConfig =>
|
|
||||||
c !== null && typeof c === "object" && c.type === "streamable";
|
|
||||||
export const isServerStdioConfig = (c?: ServerConfig): c is ServerStdioConfig =>
|
|
||||||
c !== null && typeof c === "object" && (!c.type || c.type === "stdio");
|
|
||||||
|
|
||||||
export type ServerConfig =
|
|
||||||
| ServerStdioConfig
|
|
||||||
| ServerSseConfig
|
|
||||||
| ServerSteamableConfig;
|
|
||||||
|
|
||||||
export interface ServerStdioConfig {
|
|
||||||
type?: "stdio";
|
|
||||||
command: string;
|
command: string;
|
||||||
args: string[];
|
args: string[];
|
||||||
env?: Record<string, string>;
|
env?: Record<string, string>;
|
||||||
status?: "active" | "paused" | "error";
|
status?: "active" | "paused" | "error";
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServerSseConfig {
|
|
||||||
type: "sse";
|
|
||||||
url: string;
|
|
||||||
headers?: Record<string, string>;
|
|
||||||
status?: "active" | "paused" | "error";
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ServerSteamableConfig {
|
|
||||||
type: "streamable";
|
|
||||||
url: string;
|
|
||||||
headers?: Record<string, string>;
|
|
||||||
status?: "active" | "paused" | "error";
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface McpConfigData {
|
export interface McpConfigData {
|
||||||
enableMcp?: boolean;
|
|
||||||
// MCP Server 的配置
|
// MCP Server 的配置
|
||||||
mcpServers: Record<string, ServerConfig>;
|
mcpServers: Record<string, ServerConfig>;
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ import {
|
|||||||
XAI_BASE_URL,
|
XAI_BASE_URL,
|
||||||
CHATGLM_BASE_URL,
|
CHATGLM_BASE_URL,
|
||||||
SILICONFLOW_BASE_URL,
|
SILICONFLOW_BASE_URL,
|
||||||
|
AI302_BASE_URL,
|
||||||
} from "../constant";
|
} from "../constant";
|
||||||
import { getHeaders } from "../client/api";
|
import { getHeaders } from "../client/api";
|
||||||
import { getClientConfig } from "../config/client";
|
import { getClientConfig } from "../config/client";
|
||||||
@@ -59,6 +60,8 @@ const DEFAULT_SILICONFLOW_URL = isApp
|
|||||||
? SILICONFLOW_BASE_URL
|
? SILICONFLOW_BASE_URL
|
||||||
: ApiPath.SiliconFlow;
|
: ApiPath.SiliconFlow;
|
||||||
|
|
||||||
|
const DEFAULT_AI302_URL = isApp ? AI302_BASE_URL : ApiPath["302.AI"];
|
||||||
|
|
||||||
const DEFAULT_ACCESS_STATE = {
|
const DEFAULT_ACCESS_STATE = {
|
||||||
accessCode: "",
|
accessCode: "",
|
||||||
useCustomConfig: false,
|
useCustomConfig: false,
|
||||||
@@ -132,6 +135,10 @@ const DEFAULT_ACCESS_STATE = {
|
|||||||
siliconflowUrl: DEFAULT_SILICONFLOW_URL,
|
siliconflowUrl: DEFAULT_SILICONFLOW_URL,
|
||||||
siliconflowApiKey: "",
|
siliconflowApiKey: "",
|
||||||
|
|
||||||
|
// 302.AI
|
||||||
|
ai302Url: DEFAULT_AI302_URL,
|
||||||
|
ai302ApiKey: "",
|
||||||
|
|
||||||
// server config
|
// server config
|
||||||
needCode: true,
|
needCode: true,
|
||||||
hideUserApiKey: false,
|
hideUserApiKey: false,
|
||||||
@@ -243,12 +250,7 @@ export const useAccessStore = createPersistStore(
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
fetch() {
|
fetch() {
|
||||||
const clientConfig = getClientConfig();
|
if (fetchState > 0 || getClientConfig()?.buildMode === "export") return;
|
||||||
if (!(fetchState > 0) && clientConfig?.buildMode === "export") {
|
|
||||||
set(clientConfig);
|
|
||||||
fetchState = 2;
|
|
||||||
}
|
|
||||||
if (fetchState > 0 || clientConfig?.buildMode === "export") return;
|
|
||||||
fetchState = 1;
|
fetchState = 1;
|
||||||
fetch("/api/config", {
|
fetch("/api/config", {
|
||||||
method: "post",
|
method: "post",
|
||||||
|
@@ -1,7 +1,3 @@
|
|||||||
declare global {
|
|
||||||
const EXPORT_MODE: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type Updater<T> = (updater: (value: T) => void) => void;
|
export type Updater<T> = (updater: (value: T) => void) => void;
|
||||||
|
|
||||||
export const ROLES = ["system", "user", "assistant"] as const;
|
export const ROLES = ["system", "user", "assistant"] as const;
|
||||||
|
BIN
docs/images/302AI-banner-en.jpg
Normal file
BIN
docs/images/302AI-banner-en.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 82 KiB |
BIN
docs/images/302AI-banner-jp.jpg
Normal file
BIN
docs/images/302AI-banner-jp.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 84 KiB |
BIN
docs/images/302AI-banner-zh.jpg
Normal file
BIN
docs/images/302AI-banner-zh.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 76 KiB |
@@ -6,15 +6,9 @@ console.log("[Next] build mode", mode);
|
|||||||
const disableChunk = !!process.env.DISABLE_CHUNK || mode === "export";
|
const disableChunk = !!process.env.DISABLE_CHUNK || mode === "export";
|
||||||
console.log("[Next] build with chunk: ", !disableChunk);
|
console.log("[Next] build with chunk: ", !disableChunk);
|
||||||
|
|
||||||
const EXPORT_MODE = mode === "export";
|
|
||||||
|
|
||||||
|
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
webpack(config) {
|
webpack(config) {
|
||||||
config.plugins.push(new webpack.DefinePlugin({
|
|
||||||
EXPORT_MODE: EXPORT_MODE
|
|
||||||
}));
|
|
||||||
config.module.rules.push({
|
config.module.rules.push({
|
||||||
test: /\.svg$/,
|
test: /\.svg$/,
|
||||||
use: ["@svgr/webpack"],
|
use: ["@svgr/webpack"],
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortaine/fetch-event-source": "^3.0.6",
|
"@fortaine/fetch-event-source": "^3.0.6",
|
||||||
"@hello-pangea/dnd": "^16.5.0",
|
"@hello-pangea/dnd": "^16.5.0",
|
||||||
"@modelcontextprotocol/sdk": "^1.11.4",
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
||||||
"@next/third-parties": "^14.1.0",
|
"@next/third-parties": "^14.1.0",
|
||||||
"@svgr/webpack": "^6.5.1",
|
"@svgr/webpack": "^6.5.1",
|
||||||
"@vercel/analytics": "^0.1.11",
|
"@vercel/analytics": "^0.1.11",
|
||||||
|
489
yarn.lock
489
yarn.lock
@@ -1797,22 +1797,14 @@
|
|||||||
"@jridgewell/resolve-uri" "3.1.0"
|
"@jridgewell/resolve-uri" "3.1.0"
|
||||||
"@jridgewell/sourcemap-codec" "1.4.14"
|
"@jridgewell/sourcemap-codec" "1.4.14"
|
||||||
|
|
||||||
"@modelcontextprotocol/sdk@^1.11.4":
|
"@modelcontextprotocol/sdk@^1.0.4":
|
||||||
version "1.11.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.11.4.tgz#2021c76e208874e1b8551ee24609d921c3372bde"
|
resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.0.4.tgz#34ad1edd3db7dd7154e782312dfb29d2d0c11d21"
|
||||||
integrity sha512-OTbhe5slIjiOtLxXhKalkKGhIQrwvhgCDs/C2r8kcBTy5HR/g43aDQU0l7r8O0VGbJPTNJvDc7ZdQMdQDJXmbw==
|
integrity sha512-C+jw1lF6HSGzs7EZpzHbXfzz9rj9him4BaoumlTciW/IDDgIpweF/qiCWKlP02QKg5PPcgY6xY2WCt5y2tpYow==
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv "^8.17.1"
|
|
||||||
content-type "^1.0.5"
|
content-type "^1.0.5"
|
||||||
cors "^2.8.5"
|
|
||||||
cross-spawn "^7.0.5"
|
|
||||||
eventsource "^3.0.2"
|
|
||||||
express "^5.0.1"
|
|
||||||
express-rate-limit "^7.5.0"
|
|
||||||
pkce-challenge "^5.0.0"
|
|
||||||
raw-body "^3.0.0"
|
raw-body "^3.0.0"
|
||||||
zod "^3.23.8"
|
zod "^3.23.8"
|
||||||
zod-to-json-schema "^3.24.1"
|
|
||||||
|
|
||||||
"@next/env@14.1.1":
|
"@next/env@14.1.1":
|
||||||
version "14.1.1"
|
version "14.1.1"
|
||||||
@@ -2644,14 +2636,6 @@ abab@^2.0.6:
|
|||||||
resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
|
resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
|
||||||
integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
|
integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
|
||||||
|
|
||||||
accepts@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895"
|
|
||||||
integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==
|
|
||||||
dependencies:
|
|
||||||
mime-types "^3.0.0"
|
|
||||||
negotiator "^1.0.0"
|
|
||||||
|
|
||||||
acorn-globals@^7.0.0:
|
acorn-globals@^7.0.0:
|
||||||
version "7.0.1"
|
version "7.0.1"
|
||||||
resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3"
|
resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3"
|
||||||
@@ -2722,16 +2706,6 @@ ajv@^6.12.4, ajv@^6.12.5:
|
|||||||
json-schema-traverse "^0.4.1"
|
json-schema-traverse "^0.4.1"
|
||||||
uri-js "^4.2.2"
|
uri-js "^4.2.2"
|
||||||
|
|
||||||
ajv@^8.17.1:
|
|
||||||
version "8.17.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
|
|
||||||
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
|
|
||||||
dependencies:
|
|
||||||
fast-deep-equal "^3.1.3"
|
|
||||||
fast-uri "^3.0.1"
|
|
||||||
json-schema-traverse "^1.0.0"
|
|
||||||
require-from-string "^2.0.2"
|
|
||||||
|
|
||||||
ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
|
ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
|
||||||
version "4.3.2"
|
version "4.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
|
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
|
||||||
@@ -3005,21 +2979,6 @@ binary-extensions@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
|
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
|
||||||
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
|
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
|
||||||
|
|
||||||
body-parser@^2.2.0:
|
|
||||||
version "2.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa"
|
|
||||||
integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==
|
|
||||||
dependencies:
|
|
||||||
bytes "^3.1.2"
|
|
||||||
content-type "^1.0.5"
|
|
||||||
debug "^4.4.0"
|
|
||||||
http-errors "^2.0.0"
|
|
||||||
iconv-lite "^0.6.3"
|
|
||||||
on-finished "^2.4.1"
|
|
||||||
qs "^6.14.0"
|
|
||||||
raw-body "^3.0.0"
|
|
||||||
type-is "^2.0.0"
|
|
||||||
|
|
||||||
boolbase@^1.0.0:
|
boolbase@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
|
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
|
||||||
@@ -3089,19 +3048,11 @@ busboy@1.6.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
streamsearch "^1.1.0"
|
streamsearch "^1.1.0"
|
||||||
|
|
||||||
bytes@3.1.2, bytes@^3.1.2:
|
bytes@3.1.2:
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
|
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
|
||||||
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
|
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
|
||||||
|
|
||||||
call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
|
|
||||||
integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
|
|
||||||
dependencies:
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
function-bind "^1.1.2"
|
|
||||||
|
|
||||||
call-bind@^1.0.0, call-bind@^1.0.2:
|
call-bind@^1.0.0, call-bind@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
||||||
@@ -3110,14 +3061,6 @@ call-bind@^1.0.0, call-bind@^1.0.2:
|
|||||||
function-bind "^1.1.1"
|
function-bind "^1.1.1"
|
||||||
get-intrinsic "^1.0.2"
|
get-intrinsic "^1.0.2"
|
||||||
|
|
||||||
call-bound@^1.0.2:
|
|
||||||
version "1.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
|
|
||||||
integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
|
|
||||||
dependencies:
|
|
||||||
call-bind-apply-helpers "^1.0.2"
|
|
||||||
get-intrinsic "^1.3.0"
|
|
||||||
|
|
||||||
callsites@^3.0.0:
|
callsites@^3.0.0:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
|
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
|
||||||
@@ -3134,9 +3077,9 @@ camelcase@^6.2.0:
|
|||||||
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
|
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
|
||||||
|
|
||||||
caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001503, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646:
|
caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001503, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646:
|
||||||
version "1.0.30001692"
|
version "1.0.30001724"
|
||||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz"
|
resolved "https://mirrors.huaweicloud.com/repository/npm/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz"
|
||||||
integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==
|
integrity sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==
|
||||||
|
|
||||||
ccount@^2.0.0:
|
ccount@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@@ -3351,13 +3294,6 @@ concurrently@^8.2.2:
|
|||||||
tree-kill "^1.2.2"
|
tree-kill "^1.2.2"
|
||||||
yargs "^17.7.2"
|
yargs "^17.7.2"
|
||||||
|
|
||||||
content-disposition@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2"
|
|
||||||
integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==
|
|
||||||
dependencies:
|
|
||||||
safe-buffer "5.2.1"
|
|
||||||
|
|
||||||
content-type@^1.0.5:
|
content-type@^1.0.5:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
|
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
|
||||||
@@ -3373,16 +3309,6 @@ convert-source-map@^2.0.0:
|
|||||||
resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
|
resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
|
||||||
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
|
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
|
||||||
|
|
||||||
cookie-signature@^1.2.1:
|
|
||||||
version "1.2.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793"
|
|
||||||
integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==
|
|
||||||
|
|
||||||
cookie@^0.7.1:
|
|
||||||
version "0.7.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
|
|
||||||
integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==
|
|
||||||
|
|
||||||
core-js-compat@^3.25.1:
|
core-js-compat@^3.25.1:
|
||||||
version "3.29.1"
|
version "3.29.1"
|
||||||
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.1.tgz#15c0fb812ea27c973c18d425099afa50b934b41b"
|
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.1.tgz#15c0fb812ea27c973c18d425099afa50b934b41b"
|
||||||
@@ -3390,14 +3316,6 @@ core-js-compat@^3.25.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
browserslist "^4.21.5"
|
browserslist "^4.21.5"
|
||||||
|
|
||||||
cors@^2.8.5:
|
|
||||||
version "2.8.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
|
|
||||||
integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
|
|
||||||
dependencies:
|
|
||||||
object-assign "^4"
|
|
||||||
vary "^1"
|
|
||||||
|
|
||||||
cose-base@^1.0.0:
|
cose-base@^1.0.0:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a"
|
resolved "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a"
|
||||||
@@ -3457,15 +3375,6 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
|||||||
shebang-command "^2.0.0"
|
shebang-command "^2.0.0"
|
||||||
which "^2.0.1"
|
which "^2.0.1"
|
||||||
|
|
||||||
cross-spawn@^7.0.5:
|
|
||||||
version "7.0.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
|
|
||||||
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
|
|
||||||
dependencies:
|
|
||||||
path-key "^3.1.0"
|
|
||||||
shebang-command "^2.0.0"
|
|
||||||
which "^2.0.1"
|
|
||||||
|
|
||||||
css-box-model@^1.2.1:
|
css-box-model@^1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.npmmirror.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1"
|
resolved "https://registry.npmmirror.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1"
|
||||||
@@ -3884,13 +3793,6 @@ debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "2.1.2"
|
ms "2.1.2"
|
||||||
|
|
||||||
debug@^4.3.5, debug@^4.4.0:
|
|
||||||
version "4.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
|
|
||||||
integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
|
|
||||||
dependencies:
|
|
||||||
ms "^2.1.3"
|
|
||||||
|
|
||||||
decimal.js@^10.4.2:
|
decimal.js@^10.4.2:
|
||||||
version "10.4.3"
|
version "10.4.3"
|
||||||
resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
|
resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
|
||||||
@@ -3961,7 +3863,7 @@ delayed-stream@~1.0.0:
|
|||||||
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||||
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
|
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
|
||||||
|
|
||||||
depd@2.0.0, depd@^2.0.0:
|
depd@2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
|
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
|
||||||
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
|
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
|
||||||
@@ -4069,25 +3971,11 @@ domutils@^2.8.0:
|
|||||||
domelementtype "^2.2.0"
|
domelementtype "^2.2.0"
|
||||||
domhandler "^4.2.0"
|
domhandler "^4.2.0"
|
||||||
|
|
||||||
dunder-proto@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
|
|
||||||
integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
|
|
||||||
dependencies:
|
|
||||||
call-bind-apply-helpers "^1.0.1"
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
gopd "^1.2.0"
|
|
||||||
|
|
||||||
eastasianwidth@^0.2.0:
|
eastasianwidth@^0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
|
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
|
||||||
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
|
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
|
||||||
|
|
||||||
ee-first@1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
|
||||||
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
|
||||||
|
|
||||||
electron-to-chromium@^1.4.284:
|
electron-to-chromium@^1.4.284:
|
||||||
version "1.4.345"
|
version "1.4.345"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.345.tgz#c90b7183b39245cddf0e990337469063bfced6f0"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.345.tgz#c90b7183b39245cddf0e990337469063bfced6f0"
|
||||||
@@ -4130,11 +4018,6 @@ emoji-regex@^9.2.2:
|
|||||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
||||||
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
||||||
|
|
||||||
encodeurl@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
|
|
||||||
integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
|
|
||||||
|
|
||||||
enhanced-resolve@^5.12.0:
|
enhanced-resolve@^5.12.0:
|
||||||
version "5.12.0"
|
version "5.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
|
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
|
||||||
@@ -4208,16 +4091,6 @@ es-abstract@^1.19.0, es-abstract@^1.20.4:
|
|||||||
unbox-primitive "^1.0.2"
|
unbox-primitive "^1.0.2"
|
||||||
which-typed-array "^1.1.9"
|
which-typed-array "^1.1.9"
|
||||||
|
|
||||||
es-define-property@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
|
|
||||||
integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
|
|
||||||
|
|
||||||
es-errors@^1.3.0:
|
|
||||||
version "1.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
|
|
||||||
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
|
|
||||||
|
|
||||||
es-get-iterator@^1.1.2:
|
es-get-iterator@^1.1.2:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
|
resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
|
||||||
@@ -4238,13 +4111,6 @@ es-module-lexer@^1.2.1:
|
|||||||
resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
|
resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
|
||||||
integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
|
integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
|
||||||
|
|
||||||
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
|
|
||||||
integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
|
|
||||||
dependencies:
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
|
|
||||||
es-set-tostringtag@^2.0.1:
|
es-set-tostringtag@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
|
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
|
||||||
@@ -4309,11 +4175,6 @@ escalade@^3.1.2:
|
|||||||
resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
|
resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
|
||||||
integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
|
integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
|
||||||
|
|
||||||
escape-html@^1.0.3:
|
|
||||||
version "1.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
|
||||||
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
|
|
||||||
|
|
||||||
escape-string-regexp@^1.0.5:
|
escape-string-regexp@^1.0.5:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||||
@@ -4473,14 +4334,14 @@ eslint-plugin-react@^7.31.7:
|
|||||||
|
|
||||||
eslint-plugin-unused-imports@^3.2.0:
|
eslint-plugin-unused-imports@^3.2.0:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz#63a98c9ad5f622cd9f830f70bc77739f25ccfe0d"
|
resolved "https://mirrors.huaweicloud.com/repository/npm/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz#63a98c9ad5f622cd9f830f70bc77739f25ccfe0d"
|
||||||
integrity sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==
|
integrity sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint-rule-composer "^0.3.0"
|
eslint-rule-composer "^0.3.0"
|
||||||
|
|
||||||
eslint-rule-composer@^0.3.0:
|
eslint-rule-composer@^0.3.0:
|
||||||
version "0.3.0"
|
version "0.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
|
resolved "https://mirrors.huaweicloud.com/repository/npm/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
|
||||||
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
|
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
|
||||||
|
|
||||||
eslint-scope@5.1.1:
|
eslint-scope@5.1.1:
|
||||||
@@ -4590,28 +4451,11 @@ esutils@^2.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
||||||
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
||||||
|
|
||||||
etag@^1.8.1:
|
|
||||||
version "1.8.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
|
|
||||||
integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
|
|
||||||
|
|
||||||
events@^3.2.0:
|
events@^3.2.0:
|
||||||
version "3.3.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
|
resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
|
||||||
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
|
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
|
||||||
|
|
||||||
eventsource-parser@^3.0.1:
|
|
||||||
version "3.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.2.tgz#0fea1abd26eca8201099ff5212f6c4e7ca2fd5d3"
|
|
||||||
integrity sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==
|
|
||||||
|
|
||||||
eventsource@^3.0.2:
|
|
||||||
version "3.0.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.7.tgz#1157622e2f5377bb6aef2114372728ba0c156989"
|
|
||||||
integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==
|
|
||||||
dependencies:
|
|
||||||
eventsource-parser "^3.0.1"
|
|
||||||
|
|
||||||
exec-sh@^0.2.0:
|
exec-sh@^0.2.0:
|
||||||
version "0.2.2"
|
version "0.2.2"
|
||||||
resolved "https://registry.npmmirror.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
|
resolved "https://registry.npmmirror.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
|
||||||
@@ -4665,44 +4509,6 @@ expect@^29.0.0, expect@^29.7.0:
|
|||||||
jest-message-util "^29.7.0"
|
jest-message-util "^29.7.0"
|
||||||
jest-util "^29.7.0"
|
jest-util "^29.7.0"
|
||||||
|
|
||||||
express-rate-limit@^7.5.0:
|
|
||||||
version "7.5.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz#6a67990a724b4fbbc69119419feef50c51e8b28f"
|
|
||||||
integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==
|
|
||||||
|
|
||||||
express@^5.0.1:
|
|
||||||
version "5.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9"
|
|
||||||
integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==
|
|
||||||
dependencies:
|
|
||||||
accepts "^2.0.0"
|
|
||||||
body-parser "^2.2.0"
|
|
||||||
content-disposition "^1.0.0"
|
|
||||||
content-type "^1.0.5"
|
|
||||||
cookie "^0.7.1"
|
|
||||||
cookie-signature "^1.2.1"
|
|
||||||
debug "^4.4.0"
|
|
||||||
encodeurl "^2.0.0"
|
|
||||||
escape-html "^1.0.3"
|
|
||||||
etag "^1.8.1"
|
|
||||||
finalhandler "^2.1.0"
|
|
||||||
fresh "^2.0.0"
|
|
||||||
http-errors "^2.0.0"
|
|
||||||
merge-descriptors "^2.0.0"
|
|
||||||
mime-types "^3.0.0"
|
|
||||||
on-finished "^2.4.1"
|
|
||||||
once "^1.4.0"
|
|
||||||
parseurl "^1.3.3"
|
|
||||||
proxy-addr "^2.0.7"
|
|
||||||
qs "^6.14.0"
|
|
||||||
range-parser "^1.2.1"
|
|
||||||
router "^2.2.0"
|
|
||||||
send "^1.1.0"
|
|
||||||
serve-static "^2.2.0"
|
|
||||||
statuses "^2.0.1"
|
|
||||||
type-is "^2.0.1"
|
|
||||||
vary "^1.1.2"
|
|
||||||
|
|
||||||
extend@^3.0.0:
|
extend@^3.0.0:
|
||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
||||||
@@ -4739,11 +4545,6 @@ fast-levenshtein@^2.0.6:
|
|||||||
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
||||||
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
|
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
|
||||||
|
|
||||||
fast-uri@^3.0.1:
|
|
||||||
version "3.0.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748"
|
|
||||||
integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==
|
|
||||||
|
|
||||||
fastq@^1.6.0:
|
fastq@^1.6.0:
|
||||||
version "1.15.0"
|
version "1.15.0"
|
||||||
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
|
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
|
||||||
@@ -4787,18 +4588,6 @@ fill-range@^7.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
to-regex-range "^5.0.1"
|
to-regex-range "^5.0.1"
|
||||||
|
|
||||||
finalhandler@^2.1.0:
|
|
||||||
version "2.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f"
|
|
||||||
integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==
|
|
||||||
dependencies:
|
|
||||||
debug "^4.4.0"
|
|
||||||
encodeurl "^2.0.0"
|
|
||||||
escape-html "^1.0.3"
|
|
||||||
on-finished "^2.4.1"
|
|
||||||
parseurl "^1.3.3"
|
|
||||||
statuses "^2.0.1"
|
|
||||||
|
|
||||||
find-up@^4.0.0, find-up@^4.1.0:
|
find-up@^4.0.0, find-up@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
|
resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
|
||||||
@@ -4866,16 +4655,6 @@ formdata-polyfill@^4.0.10:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fetch-blob "^3.1.2"
|
fetch-blob "^3.1.2"
|
||||||
|
|
||||||
forwarded@0.2.0:
|
|
||||||
version "0.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
|
|
||||||
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
|
|
||||||
|
|
||||||
fresh@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4"
|
|
||||||
integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==
|
|
||||||
|
|
||||||
fs.realpath@^1.0.0:
|
fs.realpath@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||||
@@ -4940,35 +4719,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@
|
|||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
has-symbols "^1.0.3"
|
has-symbols "^1.0.3"
|
||||||
|
|
||||||
get-intrinsic@^1.2.5, get-intrinsic@^1.3.0:
|
|
||||||
version "1.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
|
|
||||||
integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
|
|
||||||
dependencies:
|
|
||||||
call-bind-apply-helpers "^1.0.2"
|
|
||||||
es-define-property "^1.0.1"
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
es-object-atoms "^1.1.1"
|
|
||||||
function-bind "^1.1.2"
|
|
||||||
get-proto "^1.0.1"
|
|
||||||
gopd "^1.2.0"
|
|
||||||
has-symbols "^1.1.0"
|
|
||||||
hasown "^2.0.2"
|
|
||||||
math-intrinsics "^1.1.0"
|
|
||||||
|
|
||||||
get-package-type@^0.1.0:
|
get-package-type@^0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
|
resolved "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
|
||||||
integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
|
integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
|
||||||
|
|
||||||
get-proto@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
|
|
||||||
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
|
|
||||||
dependencies:
|
|
||||||
dunder-proto "^1.0.1"
|
|
||||||
es-object-atoms "^1.0.0"
|
|
||||||
|
|
||||||
get-stream@^6.0.0, get-stream@^6.0.1:
|
get-stream@^6.0.0, get-stream@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
|
||||||
@@ -5086,11 +4841,6 @@ gopd@^1.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
get-intrinsic "^1.1.3"
|
get-intrinsic "^1.1.3"
|
||||||
|
|
||||||
gopd@^1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
|
|
||||||
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
|
|
||||||
|
|
||||||
graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
|
graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
|
||||||
version "4.2.11"
|
version "4.2.11"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
|
||||||
@@ -5133,11 +4883,6 @@ has-symbols@^1.0.2, has-symbols@^1.0.3:
|
|||||||
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
|
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
|
||||||
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
|
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
|
||||||
|
|
||||||
has-symbols@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
|
|
||||||
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
|
|
||||||
|
|
||||||
has-tostringtag@^1.0.0:
|
has-tostringtag@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
|
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
|
||||||
@@ -5281,7 +5026,7 @@ html-to-image@^1.11.11:
|
|||||||
resolved "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.11.tgz#c0f8a34dc9e4b97b93ff7ea286eb8562642ebbea"
|
resolved "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.11.tgz#c0f8a34dc9e4b97b93ff7ea286eb8562642ebbea"
|
||||||
integrity sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==
|
integrity sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==
|
||||||
|
|
||||||
http-errors@2.0.0, http-errors@^2.0.0:
|
http-errors@2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
|
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
|
||||||
integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
|
integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
|
||||||
@@ -5324,7 +5069,7 @@ husky@^8.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
|
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
|
||||||
integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
|
integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
|
||||||
|
|
||||||
iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.3:
|
iconv-lite@0.6, iconv-lite@0.6.3:
|
||||||
version "0.6.3"
|
version "0.6.3"
|
||||||
resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
||||||
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
||||||
@@ -5409,11 +5154,6 @@ internmap@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95"
|
resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95"
|
||||||
integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
|
integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
|
||||||
version "1.9.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
|
|
||||||
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
|
|
||||||
|
|
||||||
is-arguments@^1.1.1:
|
is-arguments@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
|
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
|
||||||
@@ -5553,11 +5293,6 @@ is-potential-custom-element-name@^1.0.1:
|
|||||||
resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
|
resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
|
||||||
integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
|
integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
|
||||||
|
|
||||||
is-promise@^4.0.0:
|
|
||||||
version "4.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3"
|
|
||||||
integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
|
|
||||||
|
|
||||||
is-regex@^1.1.4:
|
is-regex@^1.1.4:
|
||||||
version "1.1.4"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
|
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
|
||||||
@@ -6149,11 +5884,6 @@ json-schema-traverse@^0.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
||||||
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
||||||
|
|
||||||
json-schema-traverse@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
|
|
||||||
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
|
|
||||||
|
|
||||||
json-stable-stringify-without-jsonify@^1.0.1:
|
json-stable-stringify-without-jsonify@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
||||||
@@ -6423,11 +6153,6 @@ marked@^4.0.14:
|
|||||||
resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
|
resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
|
||||||
integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
|
integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
|
||||||
|
|
||||||
math-intrinsics@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
|
|
||||||
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
|
|
||||||
|
|
||||||
mdast-util-definitions@^5.0.0:
|
mdast-util-definitions@^5.0.0:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7"
|
resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7"
|
||||||
@@ -6580,21 +6305,11 @@ mdn-data@2.0.14:
|
|||||||
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
|
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
|
||||||
integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
|
integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
|
||||||
|
|
||||||
media-typer@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561"
|
|
||||||
integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==
|
|
||||||
|
|
||||||
memoize-one@^6.0.0:
|
memoize-one@^6.0.0:
|
||||||
version "6.0.0"
|
version "6.0.0"
|
||||||
resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
|
resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
|
||||||
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
|
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
|
||||||
|
|
||||||
merge-descriptors@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808"
|
|
||||||
integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==
|
|
||||||
|
|
||||||
merge-stream@^2.0.0:
|
merge-stream@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
||||||
@@ -6937,11 +6652,6 @@ mime-db@1.52.0:
|
|||||||
resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
||||||
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
||||||
|
|
||||||
mime-db@^1.54.0:
|
|
||||||
version "1.54.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
|
|
||||||
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
|
|
||||||
|
|
||||||
mime-types@^2.1.12, mime-types@^2.1.27:
|
mime-types@^2.1.12, mime-types@^2.1.27:
|
||||||
version "2.1.35"
|
version "2.1.35"
|
||||||
resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
||||||
@@ -6949,13 +6659,6 @@ mime-types@^2.1.12, mime-types@^2.1.27:
|
|||||||
dependencies:
|
dependencies:
|
||||||
mime-db "1.52.0"
|
mime-db "1.52.0"
|
||||||
|
|
||||||
mime-types@^3.0.0, mime-types@^3.0.1:
|
|
||||||
version "3.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce"
|
|
||||||
integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==
|
|
||||||
dependencies:
|
|
||||||
mime-db "^1.54.0"
|
|
||||||
|
|
||||||
mimic-fn@^2.1.0:
|
mimic-fn@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
|
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
|
||||||
@@ -6993,7 +6696,7 @@ ms@2.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||||
|
|
||||||
ms@^2.1.1, ms@^2.1.3:
|
ms@^2.1.1:
|
||||||
version "2.1.3"
|
version "2.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
||||||
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||||
@@ -7013,11 +6716,6 @@ natural-compare@^1.4.0:
|
|||||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||||
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
|
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
|
||||||
|
|
||||||
negotiator@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a"
|
|
||||||
integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==
|
|
||||||
|
|
||||||
neo-async@^2.6.2:
|
neo-async@^2.6.2:
|
||||||
version "2.6.2"
|
version "2.6.2"
|
||||||
resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
|
resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
|
||||||
@@ -7116,7 +6814,7 @@ nwsapi@^2.2.2:
|
|||||||
resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8"
|
resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8"
|
||||||
integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==
|
integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==
|
||||||
|
|
||||||
object-assign@^4, object-assign@^4.1.1:
|
object-assign@^4.1.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
|
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
|
||||||
@@ -7126,11 +6824,6 @@ object-inspect@^1.12.3, object-inspect@^1.9.0:
|
|||||||
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
|
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
|
||||||
integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
|
integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
|
||||||
|
|
||||||
object-inspect@^1.13.3:
|
|
||||||
version "1.13.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
|
|
||||||
integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
|
|
||||||
|
|
||||||
object-is@^1.1.5:
|
object-is@^1.1.5:
|
||||||
version "1.1.5"
|
version "1.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
|
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
|
||||||
@@ -7189,14 +6882,7 @@ object.values@^1.1.6:
|
|||||||
define-properties "^1.1.4"
|
define-properties "^1.1.4"
|
||||||
es-abstract "^1.20.4"
|
es-abstract "^1.20.4"
|
||||||
|
|
||||||
on-finished@^2.4.1:
|
once@^1.3.0:
|
||||||
version "2.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
|
|
||||||
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
|
|
||||||
dependencies:
|
|
||||||
ee-first "1.1.1"
|
|
||||||
|
|
||||||
once@^1.3.0, once@^1.4.0:
|
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
||||||
@@ -7307,11 +6993,6 @@ parse5@^7.0.0, parse5@^7.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
entities "^4.4.0"
|
entities "^4.4.0"
|
||||||
|
|
||||||
parseurl@^1.3.3:
|
|
||||||
version "1.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
|
|
||||||
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
|
|
||||||
|
|
||||||
path-exists@^4.0.0:
|
path-exists@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
|
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
|
||||||
@@ -7337,11 +7018,6 @@ path-parse@^1.0.7:
|
|||||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
||||||
|
|
||||||
path-to-regexp@^8.0.0:
|
|
||||||
version "8.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4"
|
|
||||||
integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==
|
|
||||||
|
|
||||||
path-type@^4.0.0:
|
path-type@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
||||||
@@ -7372,11 +7048,6 @@ pirates@^4.0.4:
|
|||||||
resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
|
resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
|
||||||
integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
|
integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
|
||||||
|
|
||||||
pkce-challenge@^5.0.0:
|
|
||||||
version "5.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.0.tgz#c3a405cb49e272094a38e890a2b51da0228c4d97"
|
|
||||||
integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==
|
|
||||||
|
|
||||||
pkg-dir@^4.2.0:
|
pkg-dir@^4.2.0:
|
||||||
version "4.2.0"
|
version "4.2.0"
|
||||||
resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
|
resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
|
||||||
@@ -7450,14 +7121,6 @@ property-information@^6.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d"
|
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d"
|
||||||
integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==
|
integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==
|
||||||
|
|
||||||
proxy-addr@^2.0.7:
|
|
||||||
version "2.0.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
|
|
||||||
integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
|
|
||||||
dependencies:
|
|
||||||
forwarded "0.2.0"
|
|
||||||
ipaddr.js "1.9.1"
|
|
||||||
|
|
||||||
proxy-from-env@^1.1.0:
|
proxy-from-env@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
|
resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
|
||||||
@@ -7483,13 +7146,6 @@ pure-rand@^6.0.0:
|
|||||||
resolved "https://registry.npmmirror.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2"
|
resolved "https://registry.npmmirror.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2"
|
||||||
integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==
|
integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==
|
||||||
|
|
||||||
qs@^6.14.0:
|
|
||||||
version "6.14.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930"
|
|
||||||
integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==
|
|
||||||
dependencies:
|
|
||||||
side-channel "^1.1.0"
|
|
||||||
|
|
||||||
querystringify@^2.1.1:
|
querystringify@^2.1.1:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
|
resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
|
||||||
@@ -7512,11 +7168,6 @@ randombytes@^2.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "^5.1.0"
|
safe-buffer "^5.1.0"
|
||||||
|
|
||||||
range-parser@^1.2.1:
|
|
||||||
version "1.2.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
|
||||||
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
|
|
||||||
|
|
||||||
raw-body@^3.0.0:
|
raw-body@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f"
|
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f"
|
||||||
@@ -7755,11 +7406,6 @@ require-directory@^2.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
||||||
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
|
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
|
||||||
|
|
||||||
require-from-string@^2.0.2:
|
|
||||||
version "2.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
|
|
||||||
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
|
|
||||||
|
|
||||||
requires-port@^1.0.0:
|
requires-port@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
||||||
@@ -7849,17 +7495,6 @@ robust-predicates@^3.0.0:
|
|||||||
resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a"
|
resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a"
|
||||||
integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==
|
integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==
|
||||||
|
|
||||||
router@^2.2.0:
|
|
||||||
version "2.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef"
|
|
||||||
integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==
|
|
||||||
dependencies:
|
|
||||||
debug "^4.4.0"
|
|
||||||
depd "^2.0.0"
|
|
||||||
is-promise "^4.0.0"
|
|
||||||
parseurl "^1.3.3"
|
|
||||||
path-to-regexp "^8.0.0"
|
|
||||||
|
|
||||||
"rt-client@https://github.com/Azure-Samples/aoai-realtime-audio-sdk/releases/download/js/v0.5.0/rt-client-0.5.0.tgz":
|
"rt-client@https://github.com/Azure-Samples/aoai-realtime-audio-sdk/releases/download/js/v0.5.0/rt-client-0.5.0.tgz":
|
||||||
version "0.5.0"
|
version "0.5.0"
|
||||||
resolved "https://github.com/Azure-Samples/aoai-realtime-audio-sdk/releases/download/js/v0.5.0/rt-client-0.5.0.tgz#abf2e9a850201e3571b8d36830f77bc52af3de9b"
|
resolved "https://github.com/Azure-Samples/aoai-realtime-audio-sdk/releases/download/js/v0.5.0/rt-client-0.5.0.tgz#abf2e9a850201e3571b8d36830f77bc52af3de9b"
|
||||||
@@ -7899,7 +7534,7 @@ sade@^1.7.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
mri "^1.1.0"
|
mri "^1.1.0"
|
||||||
|
|
||||||
safe-buffer@5.2.1, safe-buffer@^5.1.0:
|
safe-buffer@^5.1.0:
|
||||||
version "5.2.1"
|
version "5.2.1"
|
||||||
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||||
@@ -7967,23 +7602,6 @@ semver@^7.5.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lru-cache "^6.0.0"
|
lru-cache "^6.0.0"
|
||||||
|
|
||||||
send@^1.1.0, send@^1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212"
|
|
||||||
integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==
|
|
||||||
dependencies:
|
|
||||||
debug "^4.3.5"
|
|
||||||
encodeurl "^2.0.0"
|
|
||||||
escape-html "^1.0.3"
|
|
||||||
etag "^1.8.1"
|
|
||||||
fresh "^2.0.0"
|
|
||||||
http-errors "^2.0.0"
|
|
||||||
mime-types "^3.0.1"
|
|
||||||
ms "^2.1.3"
|
|
||||||
on-finished "^2.4.1"
|
|
||||||
range-parser "^1.2.1"
|
|
||||||
statuses "^2.0.1"
|
|
||||||
|
|
||||||
serialize-javascript@^6.0.1:
|
serialize-javascript@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c"
|
resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c"
|
||||||
@@ -7991,16 +7609,6 @@ serialize-javascript@^6.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
randombytes "^2.1.0"
|
randombytes "^2.1.0"
|
||||||
|
|
||||||
serve-static@^2.2.0:
|
|
||||||
version "2.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9"
|
|
||||||
integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==
|
|
||||||
dependencies:
|
|
||||||
encodeurl "^2.0.0"
|
|
||||||
escape-html "^1.0.3"
|
|
||||||
parseurl "^1.3.3"
|
|
||||||
send "^1.2.0"
|
|
||||||
|
|
||||||
setprototypeof@1.2.0:
|
setprototypeof@1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
|
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
|
||||||
@@ -8023,35 +7631,6 @@ shell-quote@^1.8.1:
|
|||||||
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
|
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
|
||||||
integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
|
integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
|
||||||
|
|
||||||
side-channel-list@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
|
|
||||||
integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
|
|
||||||
dependencies:
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
object-inspect "^1.13.3"
|
|
||||||
|
|
||||||
side-channel-map@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
|
|
||||||
integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
|
|
||||||
dependencies:
|
|
||||||
call-bound "^1.0.2"
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
get-intrinsic "^1.2.5"
|
|
||||||
object-inspect "^1.13.3"
|
|
||||||
|
|
||||||
side-channel-weakmap@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
|
|
||||||
integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
|
|
||||||
dependencies:
|
|
||||||
call-bound "^1.0.2"
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
get-intrinsic "^1.2.5"
|
|
||||||
object-inspect "^1.13.3"
|
|
||||||
side-channel-map "^1.0.1"
|
|
||||||
|
|
||||||
side-channel@^1.0.4:
|
side-channel@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
|
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
|
||||||
@@ -8061,17 +7640,6 @@ side-channel@^1.0.4:
|
|||||||
get-intrinsic "^1.0.2"
|
get-intrinsic "^1.0.2"
|
||||||
object-inspect "^1.9.0"
|
object-inspect "^1.9.0"
|
||||||
|
|
||||||
side-channel@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
|
|
||||||
integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
|
|
||||||
dependencies:
|
|
||||||
es-errors "^1.3.0"
|
|
||||||
object-inspect "^1.13.3"
|
|
||||||
side-channel-list "^1.0.0"
|
|
||||||
side-channel-map "^1.0.1"
|
|
||||||
side-channel-weakmap "^1.0.2"
|
|
||||||
|
|
||||||
signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
|
signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
|
||||||
version "3.0.7"
|
version "3.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
||||||
@@ -8176,7 +7744,7 @@ stack-utils@^2.0.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
escape-string-regexp "^2.0.0"
|
escape-string-regexp "^2.0.0"
|
||||||
|
|
||||||
statuses@2.0.1, statuses@^2.0.1:
|
statuses@2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
|
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
|
||||||
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
|
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
|
||||||
@@ -8577,15 +8145,6 @@ type-fest@^0.21.3:
|
|||||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
|
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
|
||||||
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
|
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
|
||||||
|
|
||||||
type-is@^2.0.0, type-is@^2.0.1:
|
|
||||||
version "2.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97"
|
|
||||||
integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==
|
|
||||||
dependencies:
|
|
||||||
content-type "^1.0.5"
|
|
||||||
media-typer "^1.1.0"
|
|
||||||
mime-types "^3.0.0"
|
|
||||||
|
|
||||||
typed-array-length@^1.0.4:
|
typed-array-length@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
|
resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
|
||||||
@@ -8597,7 +8156,7 @@ typed-array-length@^1.0.4:
|
|||||||
|
|
||||||
typescript@5.2.2:
|
typescript@5.2.2:
|
||||||
version "5.2.2"
|
version "5.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
|
resolved "https://mirrors.huaweicloud.com/repository/npm/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
|
||||||
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
|
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
|
||||||
|
|
||||||
unbox-primitive@^1.0.2:
|
unbox-primitive@^1.0.2:
|
||||||
@@ -8803,11 +8362,6 @@ v8-to-istanbul@^9.0.1:
|
|||||||
"@types/istanbul-lib-coverage" "^2.0.1"
|
"@types/istanbul-lib-coverage" "^2.0.1"
|
||||||
convert-source-map "^2.0.0"
|
convert-source-map "^2.0.0"
|
||||||
|
|
||||||
vary@^1, vary@^1.1.2:
|
|
||||||
version "1.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
|
||||||
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
|
|
||||||
|
|
||||||
vfile-location@^4.0.0:
|
vfile-location@^4.0.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0"
|
resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0"
|
||||||
@@ -9078,11 +8632,6 @@ yocto-queue@^0.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
||||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||||
|
|
||||||
zod-to-json-schema@^3.24.1:
|
|
||||||
version "3.24.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3"
|
|
||||||
integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==
|
|
||||||
|
|
||||||
zod@^3.23.8, zod@^3.24.1:
|
zod@^3.23.8, zod@^3.24.1:
|
||||||
version "3.24.1"
|
version "3.24.1"
|
||||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee"
|
resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee"
|
||||||
|
Reference in New Issue
Block a user