diff --git a/dev.md b/dev.md index 1601af25ca95..8b778428d68d 100644 --- a/dev.md +++ b/dev.md @@ -33,6 +33,28 @@ NODE_OPTIONS=--no-node-snapshot pnpm i https://fael3z0zfze.feishu.cn/docx/ZOI1dABpxoGhS7xzhkXcKPxZnDL +## API + +### Create an API + +1. declare a contract at `packages/global/tsRest/fastgpt/contracts` + +2. implement handler for the contract at `projects/app/src/pages/apiRouters` + +By the way, you can use `restapi` snippet to quickly create a template of the handler implementation + +3. import the handler to the relative api router object structure + +4. create API, like `const getChatSetting = RestAPI(client.chat.setting.detail);`, at the relative `api` folder or `api.ts` + +### If you need to forward a Pro API to fastgpt-pro + +the steps of [Create an API](#create-an-api) should also be followed, and then: + +1. declare the handler as `proApi` in the fastgpt's api router + +2. implement handler at fastgpt-pro + ## I18N ### Install i18n-ally Plugin diff --git a/document/content/docs/upgrading/4-13/4132.mdx b/document/content/docs/upgrading/4-13/4132.mdx index d2c78071c531..bd6e0a7aa8f9 100644 --- a/document/content/docs/upgrading/4-13/4132.mdx +++ b/document/content/docs/upgrading/4-13/4132.mdx @@ -6,6 +6,7 @@ description: 'FastGPT V4.13.1 更新说明' ## 🚀 新增内容 +1. HTTP 工具集支持手动创建模式。 ## ⚙️ 优化 @@ -16,4 +17,8 @@ description: 'FastGPT V4.13.1 更新说明' ## 🔨 插件更新 -1. Perplexity search 工具。 \ No newline at end of file +1. Perplexity search 工具。 +2. Base64转文件工具。 +3. MiniMax TTS 文件生成工具。 +4. Openrouter nano banana 绘图工具。 +5. 系统工具支持配置是否需要在 Worker 中运行。 \ No newline at end of file diff --git a/document/data/doc-last-modified.json b/document/data/doc-last-modified.json index b29bee1cae6f..261ebf5030f7 100644 --- a/document/data/doc-last-modified.json +++ b/document/data/doc-last-modified.json @@ -101,7 +101,7 @@ "document/content/docs/protocol/terms.en.mdx": "2025-08-03T22:37:45+08:00", "document/content/docs/protocol/terms.mdx": "2025-08-03T22:37:45+08:00", "document/content/docs/toc.en.mdx": "2025-08-04T13:42:36+08:00", - "document/content/docs/toc.mdx": "2025-09-29T11:34:11+08:00", + "document/content/docs/toc.mdx": "2025-10-09T15:10:19+08:00", "document/content/docs/upgrading/4-10/4100.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-10/4101.mdx": "2025-09-08T20:07:20+08:00", "document/content/docs/upgrading/4-11/4110.mdx": "2025-08-05T23:20:39+08:00", @@ -113,6 +113,7 @@ "document/content/docs/upgrading/4-12/4124.mdx": "2025-09-17T22:29:56+08:00", "document/content/docs/upgrading/4-13/4130.mdx": "2025-09-30T16:00:10+08:00", "document/content/docs/upgrading/4-13/4131.mdx": "2025-09-30T15:47:06+08:00", + "document/content/docs/upgrading/4-13/4132.mdx": "2025-10-12T00:04:51+08:00", "document/content/docs/upgrading/4-8/40.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-8/41.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-8/42.mdx": "2025-08-02T19:38:37+08:00", diff --git a/packages/global/common/tsRest/fastgpt/client.ts b/packages/global/common/tsRest/fastgpt/client.ts new file mode 100644 index 000000000000..05e85738b68a --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/client.ts @@ -0,0 +1,13 @@ +import { initClient } from '@ts-rest/core'; +import { fastgptContract } from './contracts'; + +export function createFastGPTClient(options: { + baseUrl: string; + baseHeaders?: Record; + api?: any; + credentials?: RequestCredentials; + throwOnUnknownStatus?: boolean; + validateResponse?: boolean; +}) { + return initClient(fastgptContract, options); +} diff --git a/packages/global/common/tsRest/fastgpt/contracts/core/chat/index.ts b/packages/global/common/tsRest/fastgpt/contracts/core/chat/index.ts new file mode 100644 index 000000000000..60dfb87b463b --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/contracts/core/chat/index.ts @@ -0,0 +1,7 @@ +import { settingContract } from './setting'; +import { initContract } from '@ts-rest/core'; +const c = initContract(); + +export const chatContract = c.router({ + setting: settingContract +}); diff --git a/packages/global/common/tsRest/fastgpt/contracts/core/chat/setting.ts b/packages/global/common/tsRest/fastgpt/contracts/core/chat/setting.ts new file mode 100644 index 000000000000..a63f21c9a509 --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/contracts/core/chat/setting.ts @@ -0,0 +1,127 @@ +import z from 'zod'; +import { + ChatSettingResponseSchema, + ChatSettingSchema +} from '../../../../../../core/chat/setting/type'; +import { ChatFavouriteAppResponseItemSchema } from '../../../../../../core/chat/favouriteApp/type'; +import { ObjectIdSchema } from '../../../../../type'; +import { initContract } from '@ts-rest/core'; + +const c = initContract(); +const favouriteContract = c.router({ + list: { + path: '/proApi/core/chat/setting/favourite/list', + method: 'GET', + query: z.object({ + name: z.string().optional().openapi({ example: 'FastGPT' }), + tag: z.string().optional().openapi({ example: 'i7Ege2W2' }) + }), + responses: { + 200: z.array(ChatFavouriteAppResponseItemSchema) + }, + metadata: { + tags: ['chat'] + }, + description: '获取精选应用列表', + summary: '获取精选应用列表' + }, + update: { + path: '/proApi/core/chat/setting/favourite/update', + method: 'PUT', + body: z.array( + z.object({ + appId: z.string(), + order: z.number() + }) + ), + responses: { + 200: z.void() + }, + metadata: { + tags: ['chat'] + }, + description: '更新精选应用', + summary: '更新精选应用' + }, + delete: { + path: '/proApi/core/chat/setting/favourite/delete', + method: 'DELETE', + query: z.object({ + id: ObjectIdSchema + }), + responses: { + 200: z.void() + }, + metadata: { + tags: ['chat'] + }, + description: '删除精选应用', + summary: '删除精选应用' + }, + order: { + path: '/proApi/core/chat/setting/favourite/order', + method: 'PUT', + body: z.array( + z.object({ + id: ObjectIdSchema, + order: z.number() + }) + ), + responses: { + 200: z.void() + }, + metadata: { + tags: ['chat'] + }, + description: '更新精选应用顺序', + summary: '更新精选应用顺序' + }, + tags: { + path: '/proApi/core/chat/setting/favourite/tags', + method: 'PUT', + body: z.array( + z.object({ + id: z.string(), + tags: z.array(z.string()) + }) + ), + responses: { + 200: z.void() + }, + metadata: { + tags: ['chat'] + }, + description: '更新精选应用标签', + summary: '更新精选应用标签' + } +}); + +export const settingContract = c.router({ + favourite: favouriteContract, + + detail: { + path: '/proApi/core/chat/setting/detail', + method: 'GET', + responses: { + 200: ChatSettingResponseSchema + }, + metadata: { + tags: ['chat'] + }, + description: '获取聊天设置', + summary: '获取聊天设置' + }, + update: { + path: '/proApi/core/chat/setting/update', + method: 'PUT', + body: ChatSettingSchema.partial(), + responses: { + 200: z.void() + }, + metadata: { + tags: ['chat'] + }, + description: '更新聊天设置', + summary: '更新聊天设置' + } +}); diff --git a/packages/global/common/tsRest/fastgpt/contracts/core/index.ts b/packages/global/common/tsRest/fastgpt/contracts/core/index.ts new file mode 100644 index 000000000000..c114ec7d8fa7 --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/contracts/core/index.ts @@ -0,0 +1,7 @@ +import { initContract } from '@ts-rest/core'; +import { chatContract } from './chat'; +const c = initContract(); + +export const coreContract = c.router({ + chat: chatContract +}); diff --git a/packages/global/common/tsRest/fastgpt/contracts/index.ts b/packages/global/common/tsRest/fastgpt/contracts/index.ts new file mode 100644 index 000000000000..89ca30cb12ee --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/contracts/index.ts @@ -0,0 +1,12 @@ +import { initContract } from '@ts-rest/core'; +import { coreContract } from './core'; +import { supportContract } from './support'; + +const c = initContract(); + +export const fastgptContract = c.router({ + core: coreContract, + support: supportContract +}); + +export type FadtGPTContractType = typeof fastgptContract; diff --git a/packages/global/common/tsRest/fastgpt/contracts/support/index.ts b/packages/global/common/tsRest/fastgpt/contracts/support/index.ts new file mode 100644 index 000000000000..f71e6620cfd3 --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/contracts/support/index.ts @@ -0,0 +1,7 @@ +import { userContract } from './user'; +import { initContract } from '@ts-rest/core'; +const c = initContract(); + +export const supportContract = c.router({ + user: userContract +}); diff --git a/packages/global/common/tsRest/fastgpt/contracts/support/user/account.ts b/packages/global/common/tsRest/fastgpt/contracts/support/user/account.ts new file mode 100644 index 000000000000..1e8890445c63 --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/contracts/support/user/account.ts @@ -0,0 +1,18 @@ +import { initContract } from '@ts-rest/core'; +import z from 'zod'; +const c = initContract(); + +export const accountContract = c.router({ + loginout: { + path: '/support/user/account/loginout', + method: 'GET', + responses: { + 200: z.void() + }, + metadata: { + tags: ['support'] + }, + description: '退出登录', + summary: '退出登录' + } +}); diff --git a/packages/global/common/tsRest/fastgpt/contracts/support/user/index.ts b/packages/global/common/tsRest/fastgpt/contracts/support/user/index.ts new file mode 100644 index 000000000000..135e525231b7 --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/contracts/support/user/index.ts @@ -0,0 +1,7 @@ +import { accountContract } from './account'; +import { initContract } from '@ts-rest/core'; +const c = initContract(); + +export const userContract = c.router({ + account: accountContract +}); diff --git a/packages/global/common/tsRest/fastgpt/openapi.ts b/packages/global/common/tsRest/fastgpt/openapi.ts new file mode 100644 index 000000000000..217f9313b568 --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/openapi.ts @@ -0,0 +1,36 @@ +import { fastgptContract, type FadtGPTContractType } from './contracts'; +import { generateOpenApi } from '@ts-rest/open-api'; + +const hasCustomTags = (metadata: unknown): metadata is { tags: string[] } => { + return !!metadata && typeof metadata === 'object' && 'tags' in metadata; +}; + +type OpenAPIObject = ReturnType; +function generateOpenApiDocument(c: FadtGPTContractType): OpenAPIObject { + return generateOpenApi( + c, + { + info: { + title: 'FastGPT OpenAPI', + version: '4.13.2', + description: 'FastGPT OpenAPI' + }, + servers: [{ url: '/api' }] + }, + { + operationMapper(operation, appRoute) { + return { + ...operation, + ...(hasCustomTags(appRoute.metadata) + ? { + tags: appRoute.metadata.tags + } + : {}) + }; + }, + setOperationId: false + } + ); +} + +export const fastgptOpenApiDocument = generateOpenApiDocument(fastgptContract); diff --git a/packages/global/common/tsRest/fastgpt/router.ts b/packages/global/common/tsRest/fastgpt/router.ts new file mode 100644 index 000000000000..bb57ce374152 --- /dev/null +++ b/packages/global/common/tsRest/fastgpt/router.ts @@ -0,0 +1,20 @@ +import { fastgptContract } from './contracts'; +import { createNextRoute, createNextRouter } from '@ts-rest/next'; + +/** + * 创建 FastGPT 单个路由 + */ +export function createServerRoute( + implementation: Parameters>[1] +) { + return createNextRoute(fastgptContract, implementation); +} + +/** + * 创建 FastGPT 路由器([...ts-rest]) + */ +export function createServerRouter( + router: Parameters>[1] +) { + return createNextRouter(fastgptContract, router); +} diff --git a/packages/global/common/tsRest/fastgptpro/contracts/index.ts b/packages/global/common/tsRest/fastgptpro/contracts/index.ts new file mode 100644 index 000000000000..282686c74223 --- /dev/null +++ b/packages/global/common/tsRest/fastgptpro/contracts/index.ts @@ -0,0 +1,56 @@ +import { chatContract } from '../../fastgpt/contracts/core/chat'; +import { initContract } from '@ts-rest/core'; +const c = initContract(); + +/** + * 转换路径前缀 + * 将 /proApi 替换为空字符串,用于 Pro 后端 + */ +function transformPaths>( + router: T, + removePrefix: string = '/proApi', + replaceWith: string = '' +): T { + const transform = (obj: any): any => { + if (typeof obj !== 'object' || obj === null) return obj; + + // 如果是路由定义(有 path 属性) + if ('path' in obj && typeof obj.path === 'string') { + return { + ...obj, + path: obj.path.replace(removePrefix, replaceWith), + metadata: { + ...obj.metadata, + originalPath: obj.path + } + }; + } + + // 递归处理嵌套的路由 + const result: any = {}; + for (const key in obj) { + result[key] = transform(obj[key]); + } + return result; + }; + + return transform(router) as T; +} + +// 通过 FastGPT 后端转发到 Pro 后端使用的合约 +const transformedProContract = c.router({ + chat: transformPaths(chatContract) +}); + +// Pro 后端独有的接口 +const proOnlyContract = c.router({ + // TODO + // admin: adminContract, +}); + +// 最终的 Pro 合约 = 转换后的 Pro 接口 + Pro 后端独有的接口 +// Pro 后端使用的合约 +export const proContract = c.router({ + ...transformedProContract, + ...proOnlyContract +}); diff --git a/packages/global/common/tsRest/fastgptpro/server.ts b/packages/global/common/tsRest/fastgptpro/server.ts new file mode 100644 index 000000000000..d555a0758218 --- /dev/null +++ b/packages/global/common/tsRest/fastgptpro/server.ts @@ -0,0 +1,21 @@ +import { proContract } from './contracts'; +import { createNextRoute, createNextRouter } from '@ts-rest/next'; + +/** + * 创建 Pro 单个路由 + */ +export function createProServerRoute( + implementation: Parameters>[1] +) { + return createNextRoute(proContract, implementation); +} + +/** + * 创建 Pro 路由器 + * 只需实现 Pro 接口(路径已自动转换 /proApi → 空) + */ +export function createProServerRouter( + router: Parameters>[1] +) { + return createNextRouter(proContract, router); +} diff --git a/packages/global/common/tsRest/type.ts b/packages/global/common/tsRest/type.ts new file mode 100644 index 000000000000..9503ab7dfe67 --- /dev/null +++ b/packages/global/common/tsRest/type.ts @@ -0,0 +1,35 @@ +import type { AppRoute } from '@ts-rest/core'; +import type { createSingleRouteHandler } from '@ts-rest/next'; +import z from 'zod'; + +export type { AppRoute } from '@ts-rest/core'; + +export type Endpoint = Parameters>[1]; +export type Args = Parameters>[0]; +type Result = Awaited>>; + +type Ok = Extract, { status: 200 }>; +type Response = + Ok extends { body: infer B } ? (B extends { data: infer D } ? D : B) : never; + +export type Handler = (args: Args) => Promise>; + +export const createCommonResponseSchema = (schema: T) => + z + .object({ + code: z.number().describe('状态码'), + message: z.string().describe('消息'), + data: schema.describe('数据'), + statusText: z.string().describe('状态文本') + }) + .describe('通用响应') + .openapi({ + example: { + code: 200, + data: null, + message: 'Success', + statusText: 'Success' + } + }); +// 任意类型数据的响应 +export const AnyResponseSchema = createCommonResponseSchema(z.any()); diff --git a/packages/global/common/type/index.ts b/packages/global/common/type/index.ts new file mode 100644 index 000000000000..cf2fb672ab8d --- /dev/null +++ b/packages/global/common/type/index.ts @@ -0,0 +1,24 @@ +import { extendZodWithOpenApi } from '@anatine/zod-openapi'; +import { z } from 'zod'; + +extendZodWithOpenApi(z); + +export const ObjectIdSchema = z + .string() + .length(24) + .describe('MongoDB ObjectId 格式的字符串') + .openapi({ example: '6894728240dc458ece573294' }); +export type ObjectIdType = z.infer; + +export const ParentIdSchema = ObjectIdSchema.nullish() + .openapi({ example: null }) + .describe('父级ID, 可以是 ObjectId、null 或 undefined(表示根级)'); +export type ParentIdType = z.infer; + +export const DateTimeSchema = z.date().describe('ISO 8601 格式的时间字符串'); +export type DateTimeType = z.infer; + +export const OptionalDateTimeSchema = DateTimeSchema.nullish() + .openapi({ example: null }) + .describe('ISO 8601 格式的时间字符串, 可以是 null 或 undefined'); +export type OptionalDateTimeType = z.infer; diff --git a/packages/global/core/app/httpTools/utils.ts b/packages/global/core/app/httpTools/utils.ts index 329e5ce7b925..eac7f4cc1b87 100644 --- a/packages/global/core/app/httpTools/utils.ts +++ b/packages/global/core/app/httpTools/utils.ts @@ -13,9 +13,9 @@ import { i18nT } from '../../../../web/i18n/utils'; export const getHTTPToolSetRuntimeNode = ({ name, avatar, - baseUrl = '', - customHeaders = '', - apiSchemaStr = '', + baseUrl, + customHeaders, + apiSchemaStr, toolList = [], headerSecret }: { @@ -34,12 +34,11 @@ export const getHTTPToolSetRuntimeNode = ({ intro: 'HTTP Tools', toolConfig: { httpToolSet: { - baseUrl, toolList, - headerSecret, - customHeaders, - apiSchemaStr, - toolId: '' + ...(baseUrl !== undefined && { baseUrl }), + ...(apiSchemaStr !== undefined && { apiSchemaStr }), + ...(customHeaders !== undefined && { customHeaders }), + ...(headerSecret !== undefined && { headerSecret }) } }, inputs: [], diff --git a/packages/global/core/app/jsonschema.ts b/packages/global/core/app/jsonschema.ts index 18836a3f85e7..ecb01b4bfb2c 100644 --- a/packages/global/core/app/jsonschema.ts +++ b/packages/global/core/app/jsonschema.ts @@ -5,6 +5,7 @@ import SwaggerParser from '@apidevtools/swagger-parser'; import yaml from 'js-yaml'; import type { OpenAPIV3 } from 'openapi-types'; import type { OpenApiJsonSchema } from './httpTools/type'; +import { i18nT } from '../../../web/i18n/utils'; type SchemaInputValueType = 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object'; export type JsonSchemaPropertiesItemType = { @@ -180,7 +181,7 @@ export const str2OpenApiSchema = async (yamlStr = ''): Promise { diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index 017dff7d78e6..40ff44c8b433 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -2,6 +2,7 @@ import type { FlowNodeTemplateType, StoreNodeItemType } from '../workflow/type/n import type { AppTypeEnum } from './constants'; import { PermissionTypeEnum } from '../../support/permission/constant'; import type { + ContentTypes, NodeInputKeyEnum, VariableInputEnum, WorkflowIOValueTypeEnum @@ -127,6 +128,16 @@ export type HttpToolConfigType = { outputSchema: JSONSchemaOutputType; path: string; method: string; + + // manual + staticParams?: Array<{ key: string; value: string }>; + staticHeaders?: Array<{ key: string; value: string }>; + staticBody?: { + type: ContentTypes; + content?: string; + formData?: Array<{ key: string; value: string }>; + }; + headerSecret?: StoreSecretValueType; }; /* app chat config type */ diff --git a/packages/global/core/chat/favouriteApp/type.d.ts b/packages/global/core/chat/favouriteApp/type.d.ts deleted file mode 100644 index 9fc8dce43b90..000000000000 --- a/packages/global/core/chat/favouriteApp/type.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -export type ChatFavouriteAppSchema = { - _id: string; - teamId: string; - appId: string; - favouriteTags: string[]; // tag id list - order: number; -}; - -export type ChatFavouriteAppUpdateParams = { - appId: string; - order: number; -}; - -export type ChatFavouriteApp = ChatFavouriteAppSchema & { - name: string; - avatar: string; - intro: string; -}; diff --git a/packages/global/core/chat/favouriteApp/type.ts b/packages/global/core/chat/favouriteApp/type.ts new file mode 100644 index 000000000000..989ba033f94f --- /dev/null +++ b/packages/global/core/chat/favouriteApp/type.ts @@ -0,0 +1,29 @@ +import { z } from 'zod'; +import { extendZodWithOpenApi } from '@anatine/zod-openapi'; +import { ObjectIdSchema } from '../../../common/type'; + +extendZodWithOpenApi(z); + +export const ChatFavouriteTagSchema = z.object({ + id: z.string().openapi({ example: 'i7Ege2W2' }), + name: z.string().openapi({ example: '游戏' }) +}); +export type ChatFavouriteTagType = z.infer; + +export const ChatFavouriteAppSchema = z.object({ + _id: ObjectIdSchema, + teamId: ObjectIdSchema, + appId: ObjectIdSchema, + favouriteTags: z.array(z.string()).openapi({ example: ['i7Ege2W2', 'i7Ege2W3'] }), + order: z.number().openapi({ example: 1 }) +}); +export type ChatFavouriteAppType = z.infer; + +export const ChatFavouriteAppResponseItemSchema = z.object({ + ...ChatFavouriteAppSchema.shape, + name: z.string().openapi({ example: 'FastGPT' }), + intro: z.string().openapi({ example: 'FastGPT' }), + avatar: z.string().openapi({ example: 'https://fastgpt.com/avatar.png' }) +}); + +export type ChatFavouriteAppResponseItemType = z.infer; diff --git a/packages/global/core/chat/setting/type.d.ts b/packages/global/core/chat/setting/type.d.ts deleted file mode 100644 index 47dfdb1fce24..000000000000 --- a/packages/global/core/chat/setting/type.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -export type ChatSettingSchema = { - _id: string; - appId: string; - teamId: string; - slogan: string; - dialogTips: string; - enableHome: boolean; - homeTabTitle: string; - wideLogoUrl?: string; - squareLogoUrl?: string; - - selectedTools: { - pluginId: string; - inputs?: Record<`${NodeInputKeyEnum}` | string, any>; - }[]; - quickAppIds: string[]; - favouriteTags: { - id: string; - name: string; - }[]; -}; - -export type ChatSettingUpdateParams = Partial>; - -export type QuickAppType = { _id: string; name: string; avatar: string }; -export type ChatFavouriteTagType = ChatSettingSchema['favouriteTags'][number]; -export type SelectedToolType = ChatSettingSchema['selectedTools'][number] & { - name: string; - avatar: string; -}; - -export type ChatSettingReturnType = - | (Omit & { - quickAppList: QuickAppType[]; - selectedTools: SelectedToolType[]; - }) - | undefined; diff --git a/packages/global/core/chat/setting/type.ts b/packages/global/core/chat/setting/type.ts new file mode 100644 index 000000000000..c8e196da21cc --- /dev/null +++ b/packages/global/core/chat/setting/type.ts @@ -0,0 +1,58 @@ +import { z } from 'zod'; +import { extendZodWithOpenApi } from '@anatine/zod-openapi'; +import { ObjectIdSchema } from '../../../common/type'; +import { ChatFavouriteTagSchema } from '../favouriteApp/type'; + +extendZodWithOpenApi(z); + +export const ChatQuickAppSchema = z.object({ + _id: ObjectIdSchema, + name: z.string().openapi({ example: 'FastGPT' }), + avatar: z.string().openapi({ example: 'https://fastgpt.com/avatar.png' }) +}); +export type ChatQuickAppType = z.infer; + +export const ChatSelectedToolSchema = z.object({ + pluginId: z.string().openapi({ example: 'systemTool-getTime' }), + inputs: z.record(z.string(), z.any()).optional(), + name: z.string().openapi({ example: 'FastGPT' }), + avatar: z.string().openapi({ example: 'https://fastgpt.com/avatar.png' }) +}); +export type ChatSelectedToolType = z.infer; + +export const ChatSettingSchema = z.object({ + _id: ObjectIdSchema, + appId: ObjectIdSchema, + teamId: ObjectIdSchema, + slogan: z.string().openapi({ example: '你好👋,我是 FastGPT ! 请问有什么可以帮你?' }), + dialogTips: z.string().openapi({ example: '你可以问我任何问题' }), + enableHome: z.boolean().openapi({ example: true }), + homeTabTitle: z.string().openapi({ example: '首页' }), + wideLogoUrl: z.string().optional().openapi({ + example: + '/api/system/img/avatar/686f319cbb6eea8840884338/2025_09_30/9f77bd74be89c71cd3b97bd2fb8b2c05_DeviconMysql.png' + }), + squareLogoUrl: z.string().optional().openapi({ + example: + '/api/system/img/avatar/686f319cbb6eea8840884338/2025_09_30/9f77bd74be89c71cd3b97bd2fb8b2c05_DeviconMysql.png' + }), + selectedTools: z + .array(ChatSelectedToolSchema.pick({ pluginId: true, inputs: true })) + .openapi({ example: [{ pluginId: 'systemTool-getTime', inputs: {} }] }), + quickAppIds: z + .array(ObjectIdSchema) + .openapi({ example: ['68ac3dc6a717b3bcacc749bb', '68ac2da6a717b3bcacc73032'] }), + favouriteTags: z + .array(ChatFavouriteTagSchema) + .openapi({ example: [{ id: 'i7Ege2W2', name: '游戏' }] }) +}); +export type ChatSettingType = z.infer; + +export const ChatSettingResponseSchema = z.object({ + ...ChatSettingSchema.omit({ quickAppIds: true, selectedTools: true }).shape, + quickAppList: z.array(ChatQuickAppSchema), + selectedTools: z.array(ChatSelectedToolSchema) +}); +export type ChatSettingResponseType = z.infer; + +export type ChatSettingUpdateType = Partial>; diff --git a/packages/global/core/workflow/constants.ts b/packages/global/core/workflow/constants.ts index a8eccad719a9..166d6dd74457 100644 --- a/packages/global/core/workflow/constants.ts +++ b/packages/global/core/workflow/constants.ts @@ -477,6 +477,19 @@ export enum ContentTypes { raw = 'raw-text' } +export const contentTypeMap = { + [ContentTypes.none]: '', + [ContentTypes.formData]: '', + [ContentTypes.xWwwFormUrlencoded]: 'application/x-www-form-urlencoded', + [ContentTypes.json]: 'application/json', + [ContentTypes.xml]: 'application/xml', + [ContentTypes.raw]: 'text/plain' +}; + +// http request methods +export const HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'] as const; +export type HttpMethod = (typeof HTTP_METHODS)[number]; + export const ArrayTypeMap: Record = { [WorkflowIOValueTypeEnum.string]: WorkflowIOValueTypeEnum.arrayString, [WorkflowIOValueTypeEnum.number]: WorkflowIOValueTypeEnum.arrayNumber, diff --git a/packages/global/core/workflow/type/node.d.ts b/packages/global/core/workflow/type/node.d.ts index 33656022dc97..efc24aa418fe 100644 --- a/packages/global/core/workflow/type/node.d.ts +++ b/packages/global/core/workflow/type/node.d.ts @@ -52,11 +52,10 @@ export type NodeToolConfigType = { }[]; }; httpToolSet?: { - toolId: string; - baseUrl: string; toolList: HttpToolConfigType[]; - apiSchemaStr: string; - customHeaders: string; + baseUrl?: string; + apiSchemaStr?: string; + customHeaders?: string; headerSecret?: StoreSecretValueType; }; httpTool?: { diff --git a/packages/global/package.json b/packages/global/package.json index 9fdb0952cf6f..591ae2ee6896 100644 --- a/packages/global/package.json +++ b/packages/global/package.json @@ -3,9 +3,13 @@ "version": "1.0.0", "dependencies": { "@fastgpt-sdk/plugin": "^0.1.19", + "@anatine/zod-openapi": "^2.2.8", "@apidevtools/swagger-parser": "^10.1.0", "@bany/curl-to-json": "^1.2.8", "axios": "^1.12.1", + "@ts-rest/core": "^3.52.1", + "@ts-rest/next": "^3.52.1", + "@ts-rest/open-api": "^3.52.1", "cron-parser": "^4.9.0", "dayjs": "^1.11.7", "encoding": "^0.1.13", @@ -17,7 +21,8 @@ "openai": "4.61.0", "openapi-types": "^12.1.3", "timezones-list": "^3.0.2", - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "zod": "^3.24.2" }, "devDependencies": { "@types/lodash": "^4.14.191", diff --git a/packages/service/common/response/index.ts b/packages/service/common/response/index.ts index 350a028472eb..651eb5cec1cc 100644 --- a/packages/service/common/response/index.ts +++ b/packages/service/common/response/index.ts @@ -12,6 +12,72 @@ export interface ResponseType { data: T; } +export interface ProcessedError { + code: number; + statusText: string; + message: string; + data?: any; + shouldClearCookie: boolean; +} + +/** + * 通用错误处理函数,提取错误信息并分类记录日志 + * @param params - 包含错误对象、URL和默认状态码的参数 + * @returns 处理后的错误对象 + */ +export function processError(params: { + error: any; + url?: string; + defaultCode?: number; +}): ProcessedError { + const { error, url, defaultCode = 500 } = params; + + const errResponseKey = typeof error === 'string' ? error : error?.message; + + // 1. 处理特定的业务错误(ERROR_RESPONSE) + if (ERROR_RESPONSE[errResponseKey]) { + const shouldClearCookie = errResponseKey === ERROR_ENUM.unAuthorization; + + // 记录业务侧错误日志 + addLog.info(`Api response error: ${url}`, ERROR_RESPONSE[errResponseKey]); + + return { + code: ERROR_RESPONSE[errResponseKey].code || defaultCode, + statusText: ERROR_RESPONSE[errResponseKey].statusText || 'error', + message: ERROR_RESPONSE[errResponseKey].message, + data: ERROR_RESPONSE[errResponseKey].data, + shouldClearCookie + }; + } + + // 2. 提取通用错误消息 + let msg = error?.response?.statusText || error?.message || '请求错误'; + if (typeof error === 'string') { + msg = error; + } else if (proxyError[error?.code]) { + msg = '网络连接异常'; + } else if (error?.response?.data?.error?.message) { + msg = error?.response?.data?.error?.message; + } else if (error?.error?.message) { + msg = error?.error?.message; + } + + // 3. 根据错误类型记录不同级别的日志 + if (error instanceof UserError) { + addLog.info(`Request error: ${url}, ${msg}`); + } else { + addLog.error(`System unexpected error: ${url}, ${msg}`, error); + } + + // 4. 返回处理后的错误信息 + return { + code: defaultCode, + statusText: 'error', + message: replaceSensitiveText(msg), + shouldClearCookie: false + }; +} + export const jsonRes = ( res: NextApiResponse, props?: { @@ -24,53 +90,37 @@ export const jsonRes = ( ) => { const { code = 200, message = '', data = null, error, url } = props || {}; - const errResponseKey = typeof error === 'string' ? error : error?.message; - // Specified error - if (ERROR_RESPONSE[errResponseKey]) { - // login is expired - if (errResponseKey === ERROR_ENUM.unAuthorization) { + // 如果有错误,使用统一的错误处理逻辑 + if (error) { + const processedError = processError({ error, url, defaultCode: code }); + + // 如果需要清除 cookie + if (processedError.shouldClearCookie) { clearCookie(res); } - // Bussiness Side Error - addLog.info(`Api response error: ${url}`, ERROR_RESPONSE[errResponseKey]); - - res.status(code); + res.status(processedError.code); + // 如果有自定义消息,直接发送 if (message) { res.send(message); } else { - res.json(ERROR_RESPONSE[errResponseKey]); + res.json({ + code: processedError.code, + statusText: processedError.statusText, + message: processedError.message, + data: processedError.data !== undefined ? processedError.data : null + }); } return; } - // another error - let msg = ''; - if ((code < 200 || code >= 400) && !message) { - msg = error?.response?.statusText || error?.message || '请求错误'; - if (typeof error === 'string') { - msg = error; - } else if (proxyError[error?.code]) { - msg = '网络连接异常'; - } else if (error?.response?.data?.error?.message) { - msg = error?.response?.data?.error?.message; - } else if (error?.error?.message) { - msg = error?.error?.message; - } - - if (error instanceof UserError) { - addLog.info(`Request error: ${url}, ${msg}`); - } else { - addLog.error(`System unexpected error: ${url}, ${msg}`, error); - } - } - + // 成功响应 res.status(code).json({ code, statusText: '', - message: replaceSensitiveText(message || msg), + message: replaceSensitiveText(message), data: data !== undefined ? data : null }); }; diff --git a/packages/service/core/app/http.ts b/packages/service/core/app/http.ts index 698695441fa6..3177ff8cf0da 100644 --- a/packages/service/core/app/http.ts +++ b/packages/service/core/app/http.ts @@ -3,6 +3,9 @@ import { getSecretValue } from '../../common/secret/utils'; import axios from 'axios'; import { getErrText } from '@fastgpt/global/common/error/utils'; import type { RequireOnlyOne } from '@fastgpt/global/common/type/utils'; +import type { HttpToolConfigType } from '@fastgpt/global/core/app/type'; +import { contentTypeMap, ContentTypes } from '@fastgpt/global/core/workflow/constants'; +import { replaceEditorVariable } from '@fastgpt/global/core/workflow/runtime/utils'; export type RunHTTPToolParams = { baseUrl: string; @@ -11,6 +14,9 @@ export type RunHTTPToolParams = { params: Record; headerSecret?: StoreSecretValueType; customHeaders?: Record; + staticParams?: HttpToolConfigType['staticParams']; + staticHeaders?: HttpToolConfigType['staticHeaders']; + staticBody?: HttpToolConfigType['staticBody']; }; export type RunHTTPToolResult = RequireOnlyOne<{ @@ -18,41 +24,143 @@ export type RunHTTPToolResult = RequireOnlyOne<{ errorMsg?: string; }>; -export async function runHTTPTool({ +const buildHttpRequest = ({ + method, + params, + headerSecret, + customHeaders, + staticParams, + staticHeaders, + staticBody +}: Omit) => { + const replaceVariables = (text: string) => { + return replaceEditorVariable({ + text, + nodes: [], + variables: params + }); + }; + + const body = (() => { + if (!staticBody || staticBody.type === ContentTypes.none) { + return ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase()) ? {} : undefined; + } + + if (staticBody.type === ContentTypes.json) { + const contentWithReplacedVars = staticBody.content + ? replaceVariables(staticBody.content) + : '{}'; + const staticContent = JSON.parse(contentWithReplacedVars); + return { ...staticContent }; + } + + if (staticBody.type === ContentTypes.formData) { + const formData = new (require('form-data'))(); + staticBody.formData?.forEach(({ key, value }) => { + const replacedKey = replaceVariables(key); + const replacedValue = replaceVariables(value); + formData.append(replacedKey, replacedValue); + }); + return formData; + } + + if (staticBody.type === ContentTypes.xWwwFormUrlencoded) { + const urlencoded = new URLSearchParams(); + staticBody.formData?.forEach(({ key, value }) => { + const replacedKey = replaceVariables(key); + const replacedValue = replaceVariables(value); + urlencoded.append(replacedKey, replacedValue); + }); + return urlencoded.toString(); + } + + if (staticBody.type === ContentTypes.xml || staticBody.type === ContentTypes.raw) { + return replaceVariables(staticBody.content || ''); + } + + return undefined; + })(); + + const contentType = contentTypeMap[staticBody?.type || ContentTypes.none]; + const headers = { + ...(contentType && { 'Content-Type': contentType }), + ...(customHeaders || {}), + ...(headerSecret ? getSecretValue({ storeSecret: headerSecret }) : {}), + ...(staticHeaders?.reduce( + (acc, { key, value }) => { + const replacedKey = replaceVariables(key); + const replacedValue = replaceVariables(value); + acc[replacedKey] = replacedValue; + return acc; + }, + {} as Record + ) || {}) + }; + + const queryParams = (() => { + const staticParamsObj = + staticParams?.reduce( + (acc, { key, value }) => { + const replacedKey = replaceVariables(key); + const replacedValue = replaceVariables(value); + acc[replacedKey] = replacedValue; + return acc; + }, + {} as Record + ) || {}; + + const mergedParams = + method.toUpperCase() === 'GET' || staticParams + ? { ...staticParamsObj, ...params } + : staticParamsObj; + + return Object.keys(mergedParams).length > 0 ? mergedParams : undefined; + })(); + + return { + headers, + body, + queryParams + }; +}; + +export const runHTTPTool = async ({ baseUrl, toolPath, method = 'POST', params, headerSecret, - customHeaders -}: RunHTTPToolParams): Promise { + customHeaders, + staticParams, + staticHeaders, + staticBody +}: RunHTTPToolParams): Promise => { try { - const headers = { - 'Content-Type': 'application/json', - ...(customHeaders || {}), - ...(headerSecret ? getSecretValue({ storeSecret: headerSecret }) : {}) - }; + const { headers, body, queryParams } = buildHttpRequest({ + method, + params, + headerSecret, + customHeaders, + staticParams, + staticHeaders, + staticBody + }); const { data } = await axios({ method: method.toUpperCase(), baseURL: baseUrl.startsWith('https://') ? baseUrl : `https://${baseUrl}`, url: toolPath, headers, - data: params, - params, + data: body, + params: queryParams, timeout: 300000, httpsAgent: new (require('https').Agent)({ rejectUnauthorized: false }) }); - return { - data - }; + return { data }; } catch (error: any) { - console.log(error); - return { - errorMsg: getErrText(error) - }; + return { errorMsg: getErrText(error) }; } -} +}; diff --git a/packages/service/core/chat/favouriteApp/schema.ts b/packages/service/core/chat/favouriteApp/schema.ts index 8b6f0aab7d56..93ee0cf296bd 100644 --- a/packages/service/core/chat/favouriteApp/schema.ts +++ b/packages/service/core/chat/favouriteApp/schema.ts @@ -1,5 +1,5 @@ import { connectionMongo, getMongoModel } from '../../../common/mongo'; -import { type ChatFavouriteAppSchema as ChatFavouriteAppType } from '@fastgpt/global/core/chat/favouriteApp/type'; +import { type ChatFavouriteAppType } from '@fastgpt/global/core/chat/favouriteApp/type'; import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant'; import { AppCollectionName } from '../../app/schema'; diff --git a/packages/service/core/chat/setting/schema.ts b/packages/service/core/chat/setting/schema.ts index 193ce7054b14..eae80af78bf1 100644 --- a/packages/service/core/chat/setting/schema.ts +++ b/packages/service/core/chat/setting/schema.ts @@ -1,5 +1,5 @@ import { connectionMongo, getMongoModel } from '../../../common/mongo'; -import { type ChatSettingSchema as ChatSettingType } from '@fastgpt/global/core/chat/setting/type'; +import { type ChatSettingType } from '@fastgpt/global/core/chat/setting/type'; import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant'; import { AppCollectionName } from '../../app/schema'; diff --git a/packages/service/core/workflow/dispatch/child/runTool.ts b/packages/service/core/workflow/dispatch/child/runTool.ts index 6b03fe0d42a2..3f6738f23d68 100644 --- a/packages/service/core/workflow/dispatch/child/runTool.ts +++ b/packages/service/core/workflow/dispatch/child/runTool.ts @@ -236,16 +236,19 @@ export const dispatchRunTool = async (props: RunToolProps): Promise => { let { runningAppInfo: { id: appId, teamId, tmbId }, diff --git a/packages/web/components/common/Radio/LeftRadio.tsx b/packages/web/components/common/Radio/LeftRadio.tsx index 6006d959e2c4..3ef981de9231 100644 --- a/packages/web/components/common/Radio/LeftRadio.tsx +++ b/packages/web/components/common/Radio/LeftRadio.tsx @@ -25,6 +25,7 @@ const LeftRadio = ({ align = 'center', px = 3.5, py = 4, + gridGap = [3, 5], defaultBg = 'myGray.50', activeBg = 'primary.50', onChange, @@ -75,7 +76,7 @@ const LeftRadio = ({ ); return ( - + {list.map((item) => { const isActive = value === item.value; return ( @@ -131,7 +132,7 @@ const LeftRadio = ({ lineHeight={1} color={'myGray.900'} > - {t(item.title as any)} + {t(item.title as any)} {!!item.tooltip && } ) : ( diff --git a/packages/web/i18n/en/app.json b/packages/web/i18n/en/app.json index 39bb925a8adb..13e74b501362 100644 --- a/packages/web/i18n/en/app.json +++ b/packages/web/i18n/en/app.json @@ -1,7 +1,12 @@ { + "Add_tool": "Add tool", "AutoOptimize": "Automatic optimization", "Click_to_delete_this_field": "Click to delete this field", + "Custom_params": "input parameters", + "Edit_tool": "Edit tool", "Filed_is_deprecated": "This field is deprecated", + "HTTPTools_Create_Type": "Create Type", + "HTTPTools_Create_Type_Tip": "Modification is not supported after selection", "HTTP_tools_list_with_number": "Tool list: {{total}}", "Index": "Index", "MCP_tools_debug": "debug", @@ -30,6 +35,7 @@ "Selected": "Selected", "Start_config": "Start configuration", "Team_Tags": "Team tags", + "Tool_name": "Tool name", "ai_point_price": "Billing", "ai_settings": "AI Configuration", "all_apps": "All Applications", @@ -89,6 +95,7 @@ "document_upload": "Document Upload", "edit_app": "Application details", "edit_info": "Edit", + "empty_tool_tips": "Please add tools on the left side", "execute_time": "Execution Time", "export_config_successful": "Configuration copied, some sensitive information automatically filtered. Please check for any remaining sensitive data.", "export_configs": "Export", @@ -99,12 +106,15 @@ "file_upload_tip": "Once enabled, documents/images can be uploaded. Documents are retained for 7 days, images for 15 days. Using this feature may incur additional costs. To ensure a good experience, please choose an AI model with a larger context length when using this feature.", "go_to_chat": "Go to Conversation", "go_to_run": "Go to Execution", + "http_toolset_add_tips": "Click the \"Add\" button to add tools", + "http_toolset_config_tips": "Click \"Start Configuration\" to add tools", "image_upload": "Image Upload", "image_upload_tip": "How to activate model image recognition capabilities", "import_configs": "Import", "import_configs_failed": "Import configuration failed, please ensure the configuration is correct!", "import_configs_success": "Import Successful", "initial_form": "initial state", + "input_params_tips": "Tool input parameters will not be passed directly to the request URL; they can be referenced on the right side using \"/\".", "interval.12_hours": "Every 12 Hours", "interval.2_hours": "Every 2 Hours", "interval.3_hours": "Every 3 Hours", @@ -283,6 +293,7 @@ "tool_detail": "Tool details", "tool_input_param_tip": "This plugin requires configuration of related information to run properly.", "tool_not_active": "This tool has not been activated yet", + "tool_params_description_tips": "The description of parameter functions, if used as tool invocation parameters, affects the model tool invocation effect.", "tool_run_free": "This tool runs without points consumption", "tool_tip": "When executed as a tool, is this field used as a tool response result?", "tool_type_tools": "tool", diff --git a/packages/web/i18n/zh-CN/app.json b/packages/web/i18n/zh-CN/app.json index d3e79c34e9ff..b41320f1e704 100644 --- a/packages/web/i18n/zh-CN/app.json +++ b/packages/web/i18n/zh-CN/app.json @@ -1,7 +1,12 @@ { + "Add_tool": "添加工具", "AutoOptimize": "自动优化", "Click_to_delete_this_field": "点击删除该字段", + "Custom_params": "输入参数", + "Edit_tool": "编辑工具", "Filed_is_deprecated": "该字段已弃用", + "HTTPTools_Create_Type": "创建方式", + "HTTPTools_Create_Type_Tip": "选择后不支持修改", "HTTP_tools_detail": "查看详情", "HTTP_tools_list_with_number": "工具列表: {{total}}", "Index": "索引", @@ -31,6 +36,8 @@ "Selected": "已选择", "Start_config": "开始配置", "Team_Tags": "团队标签", + "Tool_description": "工具描述", + "Tool_name": "工具名称", "ai_point_price": "AI积分计费", "ai_settings": "AI 配置", "all_apps": "全部应用", @@ -90,6 +97,8 @@ "document_upload": "文档上传", "edit_app": "应用详情", "edit_info": "编辑信息", + "edit_param": "编辑参数", + "empty_tool_tips": "请在左侧添加工具", "execute_time": "执行时间", "export_config_successful": "已复制配置,自动过滤部分敏感信息,请注意检查是否仍有敏感数据", "export_configs": "导出配置", @@ -100,12 +109,15 @@ "file_upload_tip": "开启后,可以上传文档/图片。文档保留7天,图片保留15天。使用该功能可能产生较多额外费用。为保证使用体验,使用该功能时,请选择上下文长度较大的AI模型。", "go_to_chat": "去对话", "go_to_run": "去运行", + "http_toolset_add_tips": "点击添加按钮来添加工具", + "http_toolset_config_tips": "点击开始配置来添加工具", "image_upload": "图片上传", "image_upload_tip": "如何启动模型图片识别能力", "import_configs": "导入配置", "import_configs_failed": "导入配置失败,请确保配置正常!", "import_configs_success": "导入成功", "initial_form": "初始状态", + "input_params_tips": "工具的输入参数,不会直接传递到请求地址,可在右侧通过 \"/\" 来引用变量", "interval.12_hours": "每12小时", "interval.2_hours": "每2小时", "interval.3_hours": "每3小时", @@ -297,6 +309,7 @@ "tool_detail": "工具详情", "tool_input_param_tip": "该插件正常运行需要配置相关信息", "tool_not_active": "该工具尚未激活", + "tool_params_description_tips": "参数功能的描述,若作为工具调用参数,影响模型工具调用效果", "tool_run_free": "该工具运行无积分消耗", "tool_tip": "作为工具执行时,该字段是否作为工具响应结果", "tool_type_tools": "工具", diff --git a/packages/web/i18n/zh-Hant/app.json b/packages/web/i18n/zh-Hant/app.json index 5267f65c87d5..a13316d8d062 100644 --- a/packages/web/i18n/zh-Hant/app.json +++ b/packages/web/i18n/zh-Hant/app.json @@ -1,7 +1,11 @@ { + "Add_tool": "添加工具", "AutoOptimize": "自動優化", "Click_to_delete_this_field": "點擊刪除該字段", + "Custom_params": "輸入參數", "Filed_is_deprecated": "該字段已棄用", + "HTTPTools_Create_Type": "創建方式", + "HTTPTools_Create_Type_Tip": "選擇後不支持修改", "HTTP_tools_list_with_number": "工具列表: {{total}}", "Index": "索引", "MCP_tools_debug": "偵錯", @@ -30,6 +34,8 @@ "Selected": "已選擇", "Start_config": "開始配置", "Team_Tags": "團隊標籤", + "Tool_description": "工具描述", + "Tool_name": "工具名稱", "ai_point_price": "AI 積分計費", "ai_settings": "AI 設定", "all_apps": "所有應用程式", @@ -89,6 +95,7 @@ "document_upload": "文件上傳", "edit_app": "應用詳情", "edit_info": "編輯資訊", + "empty_tool_tips": "請在左側添加工具", "execute_time": "執行時間", "export_config_successful": "已複製設定,自動過濾部分敏感資訊,請注意檢查是否仍有敏感資料", "export_configs": "匯出設定", @@ -99,12 +106,15 @@ "file_upload_tip": "開啟後,可以上傳文件/圖片。文件保留 7 天,圖片保留 15 天。使用這個功能可能產生較多額外費用。為了確保使用體驗,使用這個功能時,請選擇上下文長度較大的 AI 模型。", "go_to_chat": "前往對話", "go_to_run": "前往執行", + "http_toolset_add_tips": "點擊添加按鈕來添加工具", + "http_toolset_config_tips": "點擊開始配置來添加工具", "image_upload": "圖片上傳", "image_upload_tip": "如何啟用模型圖片辨識功能", "import_configs": "匯入設定", "import_configs_failed": "匯入設定失敗,請確認設定是否正常!", "import_configs_success": "匯入成功", "initial_form": "初始狀態", + "input_params_tips": "工具的輸入參數,不會直接傳遞到請求地址,可在右側通過 \"/\" 來引用變數", "interval.12_hours": "每 12 小時", "interval.2_hours": "每 2 小時", "interval.3_hours": "每 3 小時", @@ -283,6 +293,7 @@ "tool_detail": "工具詳情", "tool_input_param_tip": "這個外掛正常執行需要設定相關資訊", "tool_not_active": "該工具尚未激活", + "tool_params_description_tips": "參數功能的描述,若作為工具調用參數,影響模型工具調用效果", "tool_run_free": "該工具運行無積分消耗", "tool_tip": "作為工具執行時,該字段是否作為工具響應結果", "tool_type_tools": "工具", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7da780021d45..a5da78fe0a6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: packages/global: dependencies: + '@anatine/zod-openapi': + specifier: ^2.2.8 + version: 2.2.8(openapi3-ts@2.0.2)(zod@3.25.51) '@apidevtools/swagger-parser': specifier: ^10.1.0 version: 10.1.1(openapi-types@12.1.3) @@ -74,6 +77,15 @@ importers: '@fastgpt-sdk/plugin': specifier: ^0.1.19 version: 0.1.19(@types/node@20.14.0) + '@ts-rest/core': + specifier: ^3.52.1 + version: 3.52.1(@types/node@20.14.0)(zod@3.25.51) + '@ts-rest/next': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@20.14.0)(zod@3.25.51))(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1))(zod@3.25.51) + '@ts-rest/open-api': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@20.14.0)(zod@3.25.51))(zod@3.25.51) axios: specifier: ^1.12.1 version: 1.12.1 @@ -113,6 +125,9 @@ importers: timezones-list: specifier: ^3.0.2 version: 3.1.0 + zod: + specifier: ^3.24.2 + version: 3.25.51 devDependencies: '@types/js-yaml': specifier: ^4.0.9 @@ -506,9 +521,21 @@ importers: '@node-rs/jieba': specifier: 2.0.1 version: 2.0.1 + '@scalar/api-reference-react': + specifier: 0.7.48 + version: 0.7.48(axios@1.12.1)(nprogress@0.2.0)(qrcode@1.5.4)(react@18.3.1)(tailwindcss@4.1.14)(typescript@5.8.2) '@tanstack/react-query': specifier: ^4.24.10 version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ts-rest/core': + specifier: ^3.52.1 + version: 3.52.1(@types/node@20.17.24)(zod@3.24.2) + '@ts-rest/next': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@20.17.24)(zod@3.24.2))(next@14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(zod@3.24.2) + '@ts-rest/open-api': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@20.17.24)(zod@3.24.2))(zod@3.24.2) ahooks: specifier: ^3.7.11 version: 3.8.4(react@18.3.1) @@ -813,6 +840,18 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@anatine/zod-openapi@1.14.2': + resolution: {integrity: sha512-q0qHfnuNYVKu0Swrnnvfj9971AEyW7c8v9jCOZGCl5ZbyGMNG4RPyJkRcMi/JC8CRfdOe0IDfNm1nNsi2avprg==} + peerDependencies: + openapi3-ts: ^2.0.0 || ^3.0.0 + zod: ^3.20.0 + + '@anatine/zod-openapi@2.2.8': + resolution: {integrity: sha512-iyM8mB556KdiZ6a1GTZ67ACLnJakU1hrzzXoh7PLaReldAdMq88MlZn/Ir/U56/TBuQctBhh/4seo0b0B343uw==} + peerDependencies: + openapi3-ts: ^4.1.2 + zod: ^3.20.0 + '@angular-devkit/core@17.3.11': resolution: {integrity: sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -930,10 +969,18 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} @@ -951,6 +998,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -1465,6 +1517,10 @@ packages: resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@bany/curl-to-json@1.2.8': resolution: {integrity: sha512-hPt9KUM2sGZ5Ojx3O9utjzUgjRZI3CZPAlLf+cRY9EUzVs7tWt1OpA0bhEUTX2PEEkOeyZ6sC0tAQMOHh9ld+Q==} @@ -1587,6 +1643,45 @@ packages: peerDependencies: react: '>=16.8.0' + '@codemirror/autocomplete@6.19.0': + resolution: {integrity: sha512-61Hfv3cF07XvUxNeC3E7jhG8XNi1Yom1G0lRC936oLnlF+jrbrv8rc/J98XlYzcsAoTVupfsf5fLej1aI8kyIg==} + + '@codemirror/commands@6.9.0': + resolution: {integrity: sha512-454TVgjhO6cMufsyyGN70rGIfJxJEjcqjBG2x2Y03Y/+Fm99d3O/Kv1QDYWuG6hvxsgmjXmBuATikIIYvERX+w==} + + '@codemirror/lang-css@6.3.1': + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + + '@codemirror/lang-html@6.4.11': + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + + '@codemirror/lang-javascript@6.2.4': + resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} + + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + + '@codemirror/lang-xml@6.1.0': + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + + '@codemirror/lang-yaml@6.1.2': + resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} + + '@codemirror/language@6.11.3': + resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} + + '@codemirror/lint@6.9.0': + resolution: {integrity: sha512-wZxW+9XDytH3SKvS8cQzMyQCaaazH8XL1EMHleHe00wVzsv7NBQKVW2yzEHrRhmM7ZOhVdItPbvlRBvMp9ej7A==} + + '@codemirror/search@6.5.11': + resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} + + '@codemirror/state@6.5.2': + resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} + + '@codemirror/view@6.38.5': + resolution: {integrity: sha512-SFVsNAgsAoou+BjRewMqN+m9jaztB9wCWN9RSRgePqUbq8UVlvJfku5zB2KVhLPgH/h0RLk38tvd4tGeAhygnw==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -2034,6 +2129,18 @@ packages: '@fingerprintjs/fingerprintjs@4.6.1': resolution: {integrity: sha512-62TPnX6fXXMlxS7SOR3DJWEOKab7rCALwSWkuKWYMRrnsZ/jD9Ju4CUyy9VWDUYuhQ2ZW1RGLwOZJXTXR6K1pg==} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@floating-ui/vue@1.1.9': + resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} + '@fortaine/fetch-event-source@3.0.6': resolution: {integrity: sha512-621GAuLMvKtyZQ3IA6nlDWhV1V/7PGOTNIGLUifxt0KzM+dZIweJ6F3XvQF3QnqeNfS1N7WQ0Kil1Di/lhChEw==} engines: {node: '>=16.15'} @@ -2047,6 +2154,18 @@ packages: engines: {node: '>=6'} hasBin: true + '@headlessui/tailwindcss@0.2.2': + resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} + engines: {node: '>=10'} + peerDependencies: + tailwindcss: ^3.0 || ^4.0 + + '@headlessui/vue@1.7.23': + resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} + engines: {node: '>=10'} + peerDependencies: + vue: ^3.2.0 + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -2065,6 +2184,24 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@hyperjump/browser@1.3.1': + resolution: {integrity: sha512-Le5XZUjnVqVjkgLYv6yyWgALat/0HpB1XaCPuCZ+GCFki9NvXloSZITIJ0H+wRW7mb9At1SxvohKBbNQbrr/cw==} + engines: {node: '>=18.0.0'} + + '@hyperjump/json-pointer@1.1.1': + resolution: {integrity: sha512-M0T3s7TC2JepoWPMZQn1W6eYhFh06OXwpMqL+8c5wMVpvnCKNsPgpu9u7WyCI03xVQti8JAeAy4RzUa6SYlJLA==} + + '@hyperjump/json-schema@1.16.3': + resolution: {integrity: sha512-Vgr6+q05/TDcxTKXFGJEtAs1UDXfisX6vtthQhO3W4r63cNH07TVGJUqgyj34LoHCL1CDsOFjH5fCgSxljfOrg==} + peerDependencies: + '@hyperjump/browser': ^1.1.0 + + '@hyperjump/pact@1.4.0': + resolution: {integrity: sha512-01Q7VY6BcAkp9W31Fv+ciiZycxZHGlR2N6ba9BifgyclHYHdbaZgITo0U6QMhYRlem4k8pf8J31/tApxvqAz8A==} + + '@hyperjump/uri@1.3.2': + resolution: {integrity: sha512-OFo5oxuSEz1ktF/LDdBTptlnPyZ66jywLO4fJRuAhnr7NGnsiL2CPoj1JRVaDqVy0nXvWNsC8O8Muw9DR++eEg==} + '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -2191,6 +2328,12 @@ packages: cpu: [x64] os: [win32] + '@internationalized/date@3.10.0': + resolution: {integrity: sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==} + + '@internationalized/number@3.6.5': + resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -2290,6 +2433,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2426,6 +2572,33 @@ packages: lexical: 0.12.6 yjs: '>=13.5.22' + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/css@1.3.0': + resolution: {integrity: sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/html@1.3.12': + resolution: {integrity: sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==} + + '@lezer/javascript@1.5.4': + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} + + '@lezer/json@1.0.3': + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lezer/xml@1.0.6': + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} + + '@lezer/yaml@1.0.3': + resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + '@ljharb/through@2.3.14': resolution: {integrity: sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==} engines: {node: '>= 0.4'} @@ -2438,6 +2611,9 @@ packages: resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} @@ -3152,6 +3328,9 @@ packages: '@petamoriken/float16@3.9.2': resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + '@phosphor-icons/core@2.1.1': + resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3237,6 +3416,13 @@ packages: react: '>=17' react-dom: '>=17' + '@replit/codemirror-css-color-picker@6.3.0': + resolution: {integrity: sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@rollup/rollup-android-arm-eabi@4.35.0': resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} cpu: [arm] @@ -3338,6 +3524,103 @@ packages: '@rushstack/eslint-patch@1.11.0': resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} + '@scalar/analytics-client@1.0.0': + resolution: {integrity: sha512-pnkghhqfmSH7hhdlFpu2M3V/6EjP2R0XbKVbmP77JSli12DdInxR1c4Oiw9V5f/jgxQhVczQQTt74cFYbLzI/Q==} + engines: {node: '>=20'} + + '@scalar/api-client@2.5.32': + resolution: {integrity: sha512-UyFw1LoEB9bCyohgf9J8EopGZzLcmO2rIKhJpZ+xlfJc1XGyd/mEgPgWfI6D/IiCalfxKkTBd4NuzoyUOPxONg==} + engines: {node: '>=20'} + + '@scalar/api-reference-react@0.7.48': + resolution: {integrity: sha512-F54kzxNghs0j8KED87cO38GVHwZaOPIy6owYxRDPAvW1kNhKKFgtHTYjCloYd0/5iSvNVA8Gu+45+6j3Fh60dw==} + engines: {node: '>=20'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + '@scalar/api-reference@1.35.5': + resolution: {integrity: sha512-C7hkHRdv1R2lcBfJjmIqDWEohpBFWCQQwhdkAv7eHOkFn/xBjy10QINGSxtmLj5sEKhkxwQmqPbhpDBvWXdLNA==} + engines: {node: '>=20'} + + '@scalar/code-highlight@0.1.9': + resolution: {integrity: sha512-WUUVDd1Wk7QJVKWXl/Zdn/VINc2pc1NlWW8VJFYZRm3/hKJwBhi0on7+HjVQNKgUaRy7+zluru5Ckl1gcTHHEg==} + engines: {node: '>=20'} + + '@scalar/components@0.14.33': + resolution: {integrity: sha512-uCs0hwPphLPK6LHCrVzUDus0TF/wIxue47OXPYsYODAO+nk4DzjUQbjJ9JFQ1p+HMUGdzQjdSiMdx/pJdFHT0Q==} + engines: {node: '>=20'} + + '@scalar/draggable@0.2.0': + resolution: {integrity: sha512-UetHRB5Bqo5egVYlS21roWBcICmyk8CKh2htsidO+bFGAjl2e7Te+rY0borhNrMclr0xezHlPuLpEs1dvgLS2g==} + engines: {node: '>=20'} + + '@scalar/helpers@0.0.10': + resolution: {integrity: sha512-VmVgIAkSLBmE5fHgkPiQ0EUZqjsYQNSd/Wd5PwsInYgBvTAxojSeiM58ZVZzMsRRfrCwboCkGn9uNEkbZQX8fg==} + engines: {node: '>=20'} + + '@scalar/icons@0.4.7': + resolution: {integrity: sha512-0qXPGRdZ180TMfejWCPYy7ILszBrAraq4KBhPtcM12ghc5qkncFWWpTm5yXI/vrbm10t7wvtTK08CLZ36CnXlQ==} + engines: {node: '>=20'} + + '@scalar/import@0.4.23': + resolution: {integrity: sha512-jG5RfeSbpPCQk8OuBnqUNxRqsfqR6nhxhwr6mPJODQOKkDPbGFek1icJOA4/blv7uBYLPV1/43ZZ9CQ1IBo3+A==} + engines: {node: '>=20'} + + '@scalar/json-magic@0.4.2': + resolution: {integrity: sha512-a6Jyt4Fz7wt2p5Oy8+eOs19zSUNqm3wA/4EjVkJ498PBS3LQB7qa+fW38Fst+LwJCjRYDRTA1HB0kLqMNQ92LQ==} + engines: {node: '>=20'} + + '@scalar/oas-utils@0.4.28': + resolution: {integrity: sha512-emyWzDKiuBlrI2bzxDrjqVwvBiVDcjy7MVBoz2Mqbsn8xCyLntc8RuOiTPuRGykXWQt433yQZSwXYn3WQoWXqA==} + engines: {node: '>=20'} + + '@scalar/object-utils@1.2.6': + resolution: {integrity: sha512-8+tt8Zq6cbfyGniaOtW/71jH1fzMfZwC/3zyMvBgt6fZMF0C+ohLryx5Sx1jpIXQauVp1ofzZuA2WfnnxBpHfg==} + engines: {node: '>=20'} + + '@scalar/openapi-parser@0.20.5': + resolution: {integrity: sha512-f8suNeHTtvU+GYRuYJ8QFTXmYOWmg8U/md3DXX4BrpXp+V1w+MCPMp984LmyGwnP3IavrgKi7FtlChSJXPFRqg==} + engines: {node: '>=20'} + + '@scalar/openapi-types@0.3.7': + resolution: {integrity: sha512-QHSvHBVDze3+dUwAhIGq6l1iOev4jdoqdBK7QpfeN1Q4h+6qpVEw3EEqBiH0AXUSh/iWwObBv4uMgfIx0aNZ5g==} + engines: {node: '>=20'} + + '@scalar/postman-to-openapi@0.3.31': + resolution: {integrity: sha512-W7eGNxzMXFr+LWOOt+OJlQajW5YIWSD85KjbWzys1YevQgcmU0HQulgU0DSBao7MCRGnPpti/fOQ3QVwM627uw==} + engines: {node: '>=20'} + + '@scalar/snippetz@0.4.9': + resolution: {integrity: sha512-l3dsAHZsUs7NaYwRC4Tuh+I9GFARgWESmY8CE9R6lY1oZQot6e16pXwR/xPdEU4MpHUXqHnRpO62ts3TYrTISA==} + engines: {node: '>=20'} + + '@scalar/themes@0.13.16': + resolution: {integrity: sha512-1Jqey9WywVa+kxbHk1RtEiV8xnkJafHIsnK1gA90KKUyP1UdcE8FpUN2Jagx+vX/vCLAfWAbOEXJZzeXvPO95g==} + engines: {node: '>=20'} + + '@scalar/typebox@0.1.1': + resolution: {integrity: sha512-Mhhubu4zj1PiXhtgvNbz34zniedtO6PYdD80haMkIjOJwV9aWejxXILr2elHGBMsLfdhH3s9qxux6TL6X8Q6/Q==} + + '@scalar/types@0.2.15': + resolution: {integrity: sha512-x2aCNmkDqr3VXUHjw7wPXK9KZwHbGGMs4NuxJIzy9MbAxUS9li8HXGG0K82Q5fDm47SAM+68z0/tnWkJpu+kzg==} + engines: {node: '>=20'} + + '@scalar/use-codemirror@0.12.34': + resolution: {integrity: sha512-sFWMhH65vwA4hY/Z7CR58DkmCbaUQfnzepRXIls9J7uaMMYawFBbX2JlaXwjKHRId8otVydhGqcySA8eG+QFyQ==} + engines: {node: '>=20'} + + '@scalar/use-hooks@0.2.4': + resolution: {integrity: sha512-TXviVV9Cfmei6g24QadnfuFj2r1YkZY56ufsSnwHgLNbtDRd9U9jXGIswXAuA+k7whaEVEgcoZ3Zmq2v5ZLF8w==} + engines: {node: '>=20'} + + '@scalar/use-toasts@0.8.0': + resolution: {integrity: sha512-u+o77cdTNZ5ePqHPu8ZcFw1BLlISv+cthN0bR1zJHXmqBjvanFTy2kL+Gmv3eW9HxZiHdqycKVETlYd0mWiqJQ==} + engines: {node: '>=20'} + + '@scalar/workspace-store@0.15.5': + resolution: {integrity: sha512-wkFCDAQa7R7+KJCd1EHNyJdJe1ugw3txS51ri0zvnI5oZyjREh4fFu/nBBNCQPJ6tzDpoJ3jlrc1KO9dE9yR6A==} + engines: {node: '>=18'} + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -3460,6 +3743,14 @@ packages: react-native: optional: true + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + + '@tanstack/vue-virtual@3.13.12': + resolution: {integrity: sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -3478,6 +3769,22 @@ packages: zod: optional: true + '@ts-rest/next@3.52.1': + resolution: {integrity: sha512-LjxBlDlJDIdZafVucAfc/gJnYP3PATGLVN5nxFfSIJBRvLrlJeKK6oXxHB7biTUle/1xgyOZGTjh+i2S+0sJtA==} + peerDependencies: + '@ts-rest/core': ~3.52.0 + next: ^12.0.0 || ^13.0.0 || ^14.0.0 + zod: ^3.22.3 + peerDependenciesMeta: + zod: + optional: true + + '@ts-rest/open-api@3.52.1': + resolution: {integrity: sha512-VY91g6HFzCe1/fNgX4Y3HzaJbIdztCGHTg34drkh7bKgtNOizLJLXV0wwIkMwLGvjhRHojJxnwYxHjGMIkScwg==} + peerDependencies: + '@ts-rest/core': ~3.52.0 + zod: ^3.22.3 + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -3643,6 +3950,9 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/har-format@1.2.16': + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + '@types/hast@2.3.10': resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} @@ -3730,6 +4040,9 @@ packages: '@types/node@20.17.24': resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} + '@types/node@22.18.9': + resolution: {integrity: sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==} + '@types/node@24.0.13': resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==} @@ -3811,6 +4124,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} @@ -3884,6 +4200,20 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unhead/dom@1.11.20': + resolution: {integrity: sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==} + + '@unhead/schema@1.11.20': + resolution: {integrity: sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA==} + + '@unhead/shared@1.11.20': + resolution: {integrity: sha512-1MOrBkGgkUXS+sOKz/DBh4U20DNoITlJwpmvSInxEUNhghSNb56S0RnaHRq0iHkhrO/cDgz2zvfdlRpoPLGI3w==} + + '@unhead/vue@1.11.20': + resolution: {integrity: sha512-sqQaLbwqY9TvLEGeq8Fd7+F2TIuV3nZ5ihVISHjWpAM3y7DwNWRU7NmT9+yYT+2/jw1Vjwdkv5/HvDnvCLrgmg==} + peerDependencies: + vue: '>=2.7 || >=3' + '@vercel/otel@1.13.0': resolution: {integrity: sha512-esRkt470Y2jRK1B1g7S1vkt4Csu44gp83Zpu8rIyPoqy2BKgk4z7ik1uSMswzi45UogLHFl6yR5TauDurBQi4Q==} engines: {node: '>=18'} @@ -3952,32 +4282,123 @@ packages: '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} + '@vue/compiler-sfc@3.5.13': resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} + '@vue/compiler-ssr@3.5.13': resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/reactivity@3.5.13': resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} + '@vue/runtime-core@3.5.13': resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} + '@vue/runtime-dom@3.5.13': resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} + '@vue/server-renderer@3.5.13': resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} peerDependencies: vue: 3.5.13 + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} + peerDependencies: + vue: 3.5.22 + '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@11.3.0': + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + + '@vueuse/integrations@11.3.0': + resolution: {integrity: sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@11.3.0': + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@11.3.0': + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -4702,6 +5123,9 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + collapse-white-space@1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} @@ -4879,6 +5303,9 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -4915,6 +5342,14 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + cva@1.0.0-beta.2: + resolution: {integrity: sha512-dqcOFe247I5pKxfuzqfq3seLL5iMYsTgo40Uw7+pKZAntPgFtR7Tmy59P5IVIq/XgB0NQWoIvYDt9TwHkuK8Cg==} + peerDependencies: + typescript: '>= 4.5.5 < 6' + peerDependenciesMeta: + typescript: + optional: true + cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -5211,6 +5646,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -5863,6 +6301,9 @@ packages: resolution: {integrity: sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==} engines: {node: '>=10'} + focus-trap@7.6.5: + resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -5967,6 +6408,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + fuse.js@7.1.0: + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} + engines: {node: '>=10'} + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} @@ -5993,6 +6438,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -6027,6 +6476,9 @@ packages: github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -6127,6 +6579,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + hast-util-from-dom@5.0.1: resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} @@ -6139,18 +6597,42 @@ packages: hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} @@ -6170,12 +6652,22 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + highlightjs-curl@1.3.0: + resolution: {integrity: sha512-50UEfZq1KR0Lfk2Tr6xb/MUIZH3h10oNC0OTy9g7WELcs5Fgy/mKN1vEhuKTkKbdo8vr5F9GXstu2eLhApfQ3A==} + highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -6185,6 +6677,12 @@ packages: html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} @@ -6490,6 +6988,10 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -6512,6 +7014,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -6789,6 +7295,9 @@ packages: joplin-turndown-plugin-gfm@1.0.12: resolution: {integrity: sha512-qL4+1iycQjZ1fs8zk3jSRk7cg3ROBUHk7GKtiLAQLFzLPKErnILUvz5DLszSQvz3s1sTjPbywLDISVUtBY6HaA==} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -6846,6 +7355,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-deterministic@1.0.12: + resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==} + engines: {node: '>= 4'} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -6874,6 +7387,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -6885,6 +7402,12 @@ packages: jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + just-clone@6.2.0: + resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} + + just-curry-it@5.3.0: + resolution: {integrity: sha512-silMIRiFjUWlfaDhkgSzpuAyQ6EX/o09Eu8ZBfmFwQMbax7+LQzeIU2CBrICT6Ne4l86ITCGvUCBpCubWYy0Yw==} + jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} @@ -6947,6 +7470,10 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + leven@4.1.0: + resolution: {integrity: sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -7162,6 +7689,9 @@ packages: lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -7187,6 +7717,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -7330,6 +7863,9 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + microdiff@1.5.0: + resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} + micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -7706,6 +8242,11 @@ packages: resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} engines: {node: '>=12.0.0'} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.9: resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7716,6 +8257,11 @@ packages: engines: {node: ^18 || >=20} hasBin: true + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} + hasBin: true + napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} @@ -7963,6 +8509,9 @@ packages: openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + openapi3-ts@2.0.2: + resolution: {integrity: sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==} + option@0.2.4: resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} @@ -8031,6 +8580,9 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + packrup@0.1.2: + resolution: {integrity: sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -8054,6 +8606,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + parse5-htmlparser2-tree-adapter@7.1.0: resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} @@ -8256,6 +8812,10 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -8305,10 +8865,18 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + prismjs@1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} engines: {node: '>=6'} @@ -8347,6 +8915,9 @@ packages: property-information@5.6.0: resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.0.0: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} @@ -8405,6 +8976,11 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + radix-vue@1.9.17: + resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==} + peerDependencies: + vue: '>= 3.2.0' + raf-schd@4.0.3: resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} @@ -8681,9 +9257,24 @@ packages: rehype-external-links@3.0.0: resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + rehype-katex@7.0.1: resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + remark-breaks@4.0.0: resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==} @@ -8969,6 +9560,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -9195,6 +9790,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -9240,6 +9839,9 @@ packages: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + style-to-js@1.1.16: resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} @@ -9319,6 +9921,15 @@ packages: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + + tailwindcss@4.1.14: + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -9497,6 +10108,14 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-deepmerge@6.2.1: + resolution: {integrity: sha512-8CYSLazCyj0DJDpPIxOFzJG46r93uh6EynYjuey+bxcLltBeqZL7DMfaE5ZPzZNFlav7wx+2TDa/mBl8gkTYzw==} + engines: {node: '>=14.13.1'} + + ts-deepmerge@7.0.3: + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} + engines: {node: '>=14.13.1'} + ts-jest@29.2.6: resolution: {integrity: sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -9600,6 +10219,10 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -9667,9 +10290,15 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + unhead@1.11.20: + resolution: {integrity: sha512-3AsNQC0pjwlLqEYHLjtichGWankK8yqmocReITecmpB1H0aOabeESueyy+8X1gyJx4ftZVwo9hqQ4O3fPWffCA==} + unherit@1.1.3: resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} @@ -10030,6 +10659,28 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} + vue-component-type-helpers@3.1.1: + resolution: {integrity: sha512-B0kHv7qX6E7+kdc5nsaqjdGZ1KwNKSUQDWGy7XkTYT7wFsOpkEyaJ1Vq79TjwrrtuLRgizrTV7PPuC4rRQo+vw==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + peerDependencies: + vue: ^3.2.0 + + vue-sonner@1.3.2: + resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} + vue@3.5.13: resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: @@ -10038,9 +10689,20 @@ packages: typescript: optional: true - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + watchpack@2.4.2: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} @@ -10086,6 +10748,10 @@ packages: webpack-cli: optional: true + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-url@14.1.1: resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} engines: {node: '>=18'} @@ -10212,6 +10878,11 @@ packages: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + yaml@2.8.1: resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} @@ -10256,6 +10927,9 @@ packages: resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==} engines: {node: '>=12.20'} + zhead@2.2.4: + resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + zhlint@0.7.4: resolution: {integrity: sha512-E1rA6TyQJ1cWWfMoM8KE1hMdDDi5B8Gv+8OYPXe733Lf0C3EwJ+jh1cpoK/KTrYeITumRZQ0KSPkBRMNZuC8oA==} hasBin: true @@ -10271,6 +10945,9 @@ packages: peerDependencies: zod: ^3.18.0 + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} @@ -10308,6 +10985,24 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + '@anatine/zod-openapi@1.14.2(openapi3-ts@2.0.2)(zod@3.24.2)': + dependencies: + openapi3-ts: 2.0.2 + ts-deepmerge: 6.2.1 + zod: 3.24.2 + + '@anatine/zod-openapi@1.14.2(openapi3-ts@2.0.2)(zod@3.25.51)': + dependencies: + openapi3-ts: 2.0.2 + ts-deepmerge: 6.2.1 + zod: 3.25.51 + + '@anatine/zod-openapi@2.2.8(openapi3-ts@2.0.2)(zod@3.25.51)': + dependencies: + openapi3-ts: 2.0.2 + ts-deepmerge: 6.2.1 + zod: 3.25.51 + '@angular-devkit/core@17.3.11(chokidar@3.6.0)': dependencies: ajv: 8.12.0 @@ -10496,8 +11191,12 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} '@babel/helper-wrap-function@7.25.9': @@ -10517,6 +11216,10 @@ snapshots: dependencies: '@babel/types': 7.26.10 + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -11148,6 +11851,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bany/curl-to-json@1.2.8': dependencies: minimist: 1.2.8 @@ -11328,6 +12036,106 @@ snapshots: lodash.mergewith: 4.6.2 react: 18.3.1 + '@codemirror/autocomplete@6.19.0': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.9.0': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@lezer/common': 1.2.3 + + '@codemirror/lang-css@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.19.0 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/css': 1.3.0 + + '@codemirror/lang-html@6.4.11': + dependencies: + '@codemirror/autocomplete': 6.19.0 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@lezer/common': 1.2.3 + '@lezer/css': 1.3.0 + '@lezer/html': 1.3.12 + + '@codemirror/lang-javascript@6.2.4': + dependencies: + '@codemirror/autocomplete': 6.19.0 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.9.0 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@lezer/common': 1.2.3 + '@lezer/javascript': 1.5.4 + + '@codemirror/lang-json@6.0.2': + dependencies: + '@codemirror/language': 6.11.3 + '@lezer/json': 1.0.3 + + '@codemirror/lang-xml@6.1.0': + dependencies: + '@codemirror/autocomplete': 6.19.0 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@lezer/common': 1.2.3 + '@lezer/xml': 1.0.6 + + '@codemirror/lang-yaml@6.1.2': + dependencies: + '@codemirror/autocomplete': 6.19.0 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + '@lezer/yaml': 1.0.3 + + '@codemirror/language@6.11.3': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/lint@6.9.0': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + crelt: 1.0.6 + + '@codemirror/search@6.5.11': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + crelt: 1.0.6 + + '@codemirror/state@6.5.2': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/view@6.38.5': + dependencies: + '@codemirror/state': 6.5.2 + crelt: 1.0.6 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + '@colors/colors@1.5.0': optional: true @@ -11703,6 +12511,26 @@ snapshots: dependencies: tslib: 2.8.1 + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@floating-ui/vue@1.1.9(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@floating-ui/dom': 1.7.4 + '@floating-ui/utils': 0.2.10 + vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@fortaine/fetch-event-source@3.0.6': {} '@grpc/grpc-js@1.13.0': @@ -11717,6 +12545,15 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 + '@headlessui/tailwindcss@0.2.2(tailwindcss@4.1.14)': + dependencies: + tailwindcss: 4.1.14 + + '@headlessui/vue@1.7.23(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@tanstack/vue-virtual': 3.13.12(vue@3.5.22(typescript@5.8.2)) + vue: 3.5.22(typescript@5.8.2) + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -11737,6 +12574,30 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@hyperjump/browser@1.3.1': + dependencies: + '@hyperjump/json-pointer': 1.1.1 + '@hyperjump/uri': 1.3.2 + content-type: 1.0.5 + just-curry-it: 5.3.0 + + '@hyperjump/json-pointer@1.1.1': {} + + '@hyperjump/json-schema@1.16.3(@hyperjump/browser@1.3.1)': + dependencies: + '@hyperjump/browser': 1.3.1 + '@hyperjump/json-pointer': 1.1.1 + '@hyperjump/pact': 1.4.0 + '@hyperjump/uri': 1.3.2 + content-type: 1.0.5 + json-stringify-deterministic: 1.0.12 + just-curry-it: 5.3.0 + uuid: 9.0.1 + + '@hyperjump/pact@1.4.0': {} + + '@hyperjump/uri@1.3.2': {} + '@img/colour@1.0.0': optional: true @@ -11826,6 +12687,14 @@ snapshots: '@img/sharp-win32-x64@0.34.4': optional: true + '@internationalized/date@3.10.0': + dependencies: + '@swc/helpers': 0.5.15 + + '@internationalized/number@3.6.5': + dependencies: + '@swc/helpers': 0.5.15 + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -12026,6 +12895,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -12208,6 +13079,52 @@ snapshots: lexical: 0.12.6 yjs: 13.6.24 + '@lezer/common@1.2.3': {} + + '@lezer/css@1.3.0': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/html@1.3.12': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/javascript@1.5.4': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/json@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/xml@1.0.6': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/yaml@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + '@ljharb/through@2.3.14': dependencies: call-bind: 1.0.8 @@ -12216,6 +13133,8 @@ snapshots: '@lukeed/ms@2.0.2': {} + '@marijn/find-cluster-break@1.0.2': {} + '@microsoft/tsdoc@0.15.1': {} '@mixmark-io/domino@2.2.0': {} @@ -12231,8 +13150,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.24.2 - zod-to-json-schema: 3.24.5(zod@3.24.2) + zod: 3.25.51 + zod-to-json-schema: 3.24.5(zod@3.25.51) transitivePeerDependencies: - supports-color @@ -12835,6 +13754,8 @@ snapshots: '@petamoriken/float16@3.9.2': {} + '@phosphor-icons/core@2.1.1': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -12953,6 +13874,12 @@ snapshots: - '@types/react' - immer + '@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.5)': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@rollup/rollup-android-arm-eabi@4.35.0': optional: true @@ -13014,6 +13941,348 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} + '@scalar/analytics-client@1.0.0': + dependencies: + zod: 3.24.1 + + '@scalar/api-client@2.5.32(axios@1.12.1)(nprogress@0.2.0)(qrcode@1.5.4)(tailwindcss@4.1.14)(typescript@5.8.2)': + dependencies: + '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.1.14) + '@headlessui/vue': 1.7.23(vue@3.5.22(typescript@5.8.2)) + '@scalar/analytics-client': 1.0.0 + '@scalar/components': 0.14.33(typescript@5.8.2) + '@scalar/draggable': 0.2.0(typescript@5.8.2) + '@scalar/helpers': 0.0.10 + '@scalar/icons': 0.4.7(typescript@5.8.2) + '@scalar/import': 0.4.23(typescript@5.8.2) + '@scalar/oas-utils': 0.4.28(typescript@5.8.2) + '@scalar/object-utils': 1.2.6 + '@scalar/openapi-parser': 0.20.5(typescript@5.8.2) + '@scalar/openapi-types': 0.3.7 + '@scalar/postman-to-openapi': 0.3.31(typescript@5.8.2) + '@scalar/snippetz': 0.4.9 + '@scalar/themes': 0.13.16 + '@scalar/types': 0.2.15 + '@scalar/use-codemirror': 0.12.34(typescript@5.8.2) + '@scalar/use-hooks': 0.2.4(typescript@5.8.2) + '@scalar/use-toasts': 0.8.0(typescript@5.8.2) + '@scalar/workspace-store': 0.15.5(typescript@5.8.2) + '@types/har-format': 1.2.16 + '@vueuse/core': 11.3.0(vue@3.5.22(typescript@5.8.2)) + '@vueuse/integrations': 11.3.0(axios@1.12.1)(focus-trap@7.6.5)(fuse.js@7.1.0)(nprogress@0.2.0)(qrcode@1.5.4)(vue@3.5.22(typescript@5.8.2)) + focus-trap: 7.6.5 + fuse.js: 7.1.0 + js-base64: 3.7.8 + microdiff: 1.5.0 + nanoid: 5.1.5 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 + shell-quote: 1.8.3 + type-fest: 4.41.0 + vue: 3.5.22(typescript@5.8.2) + vue-router: 4.5.1(vue@3.5.22(typescript@5.8.2)) + whatwg-mimetype: 4.0.0 + yaml: 2.8.0 + zod: 3.24.1 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + + '@scalar/api-reference-react@0.7.48(axios@1.12.1)(nprogress@0.2.0)(qrcode@1.5.4)(react@18.3.1)(tailwindcss@4.1.14)(typescript@5.8.2)': + dependencies: + '@scalar/api-reference': 1.35.5(axios@1.12.1)(nprogress@0.2.0)(qrcode@1.5.4)(tailwindcss@4.1.14)(typescript@5.8.2) + '@scalar/types': 0.2.15 + react: 18.3.1 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + + '@scalar/api-reference@1.35.5(axios@1.12.1)(nprogress@0.2.0)(qrcode@1.5.4)(tailwindcss@4.1.14)(typescript@5.8.2)': + dependencies: + '@floating-ui/vue': 1.1.9(vue@3.5.22(typescript@5.8.2)) + '@headlessui/vue': 1.7.23(vue@3.5.22(typescript@5.8.2)) + '@scalar/api-client': 2.5.32(axios@1.12.1)(nprogress@0.2.0)(qrcode@1.5.4)(tailwindcss@4.1.14)(typescript@5.8.2) + '@scalar/code-highlight': 0.1.9 + '@scalar/components': 0.14.33(typescript@5.8.2) + '@scalar/helpers': 0.0.10 + '@scalar/icons': 0.4.7(typescript@5.8.2) + '@scalar/json-magic': 0.4.2(typescript@5.8.2) + '@scalar/oas-utils': 0.4.28(typescript@5.8.2) + '@scalar/object-utils': 1.2.6 + '@scalar/openapi-parser': 0.20.5(typescript@5.8.2) + '@scalar/openapi-types': 0.3.7 + '@scalar/snippetz': 0.4.9 + '@scalar/themes': 0.13.16 + '@scalar/types': 0.2.15 + '@scalar/use-hooks': 0.2.4(typescript@5.8.2) + '@scalar/use-toasts': 0.8.0(typescript@5.8.2) + '@scalar/workspace-store': 0.15.5(typescript@5.8.2) + '@unhead/vue': 1.11.20(vue@3.5.22(typescript@5.8.2)) + '@vueuse/core': 11.3.0(vue@3.5.22(typescript@5.8.2)) + flatted: 3.3.3 + fuse.js: 7.1.0 + github-slugger: 2.0.0 + js-base64: 3.7.8 + microdiff: 1.5.0 + nanoid: 5.1.5 + type-fest: 4.41.0 + vue: 3.5.22(typescript@5.8.2) + zod: 3.24.1 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + + '@scalar/code-highlight@0.1.9': + dependencies: + hast-util-to-text: 4.0.2 + highlight.js: 11.11.1 + highlightjs-curl: 1.3.0 + highlightjs-vue: 1.0.0 + lowlight: 3.3.0 + rehype-external-links: 3.0.0 + rehype-format: 5.0.1 + rehype-parse: 9.0.1 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + remark-stringify: 11.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@scalar/components@0.14.33(typescript@5.8.2)': + dependencies: + '@floating-ui/utils': 0.2.10 + '@floating-ui/vue': 1.1.9(vue@3.5.22(typescript@5.8.2)) + '@headlessui/vue': 1.7.23(vue@3.5.22(typescript@5.8.2)) + '@scalar/code-highlight': 0.1.9 + '@scalar/helpers': 0.0.10 + '@scalar/icons': 0.4.7(typescript@5.8.2) + '@scalar/oas-utils': 0.4.28(typescript@5.8.2) + '@scalar/themes': 0.13.16 + '@scalar/use-hooks': 0.2.4(typescript@5.8.2) + '@scalar/use-toasts': 0.8.0(typescript@5.8.2) + '@vueuse/core': 11.3.0(vue@3.5.22(typescript@5.8.2)) + cva: 1.0.0-beta.2(typescript@5.8.2) + nanoid: 5.1.5 + pretty-bytes: 6.1.1 + radix-vue: 1.9.17(vue@3.5.22(typescript@5.8.2)) + vue: 3.5.22(typescript@5.8.2) + vue-component-type-helpers: 3.1.1 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@scalar/draggable@0.2.0(typescript@5.8.2)': + dependencies: + vue: 3.5.22(typescript@5.8.2) + transitivePeerDependencies: + - typescript + + '@scalar/helpers@0.0.10': {} + + '@scalar/icons@0.4.7(typescript@5.8.2)': + dependencies: + '@phosphor-icons/core': 2.1.1 + '@types/node': 22.18.9 + chalk: 5.4.1 + vue: 3.5.22(typescript@5.8.2) + transitivePeerDependencies: + - typescript + + '@scalar/import@0.4.23(typescript@5.8.2)': + dependencies: + '@scalar/helpers': 0.0.10 + '@scalar/openapi-parser': 0.20.5(typescript@5.8.2) + yaml: 2.8.0 + transitivePeerDependencies: + - typescript + + '@scalar/json-magic@0.4.2(typescript@5.8.2)': + dependencies: + '@scalar/helpers': 0.0.10 + vue: 3.5.22(typescript@5.8.2) + yaml: 2.8.0 + transitivePeerDependencies: + - typescript + + '@scalar/oas-utils@0.4.28(typescript@5.8.2)': + dependencies: + '@hyperjump/browser': 1.3.1 + '@hyperjump/json-schema': 1.16.3(@hyperjump/browser@1.3.1) + '@scalar/helpers': 0.0.10 + '@scalar/json-magic': 0.4.2(typescript@5.8.2) + '@scalar/object-utils': 1.2.6 + '@scalar/openapi-types': 0.3.7 + '@scalar/themes': 0.13.16 + '@scalar/types': 0.2.15 + '@scalar/workspace-store': 0.15.5(typescript@5.8.2) + '@types/har-format': 1.2.16 + flatted: 3.3.3 + js-base64: 3.7.8 + microdiff: 1.5.0 + nanoid: 5.1.5 + type-fest: 4.41.0 + yaml: 2.8.0 + zod: 3.24.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@scalar/object-utils@1.2.6': + dependencies: + '@scalar/helpers': 0.0.10 + flatted: 3.3.3 + just-clone: 6.2.0 + ts-deepmerge: 7.0.3 + type-fest: 4.41.0 + + '@scalar/openapi-parser@0.20.5(typescript@5.8.2)': + dependencies: + '@scalar/json-magic': 0.4.2(typescript@5.8.2) + '@scalar/openapi-types': 0.3.7 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + ajv-formats: 3.0.1(ajv@8.17.1) + jsonpointer: 5.0.1 + leven: 4.1.0 + yaml: 2.8.0 + transitivePeerDependencies: + - typescript + + '@scalar/openapi-types@0.3.7': + dependencies: + zod: 3.24.1 + + '@scalar/postman-to-openapi@0.3.31(typescript@5.8.2)': + dependencies: + '@scalar/helpers': 0.0.10 + '@scalar/oas-utils': 0.4.28(typescript@5.8.2) + '@scalar/openapi-types': 0.3.7 + transitivePeerDependencies: + - supports-color + - typescript + + '@scalar/snippetz@0.4.9': + dependencies: + '@scalar/types': 0.2.15 + stringify-object: 5.0.0 + + '@scalar/themes@0.13.16': + dependencies: + '@scalar/types': 0.2.15 + nanoid: 5.1.5 + + '@scalar/typebox@0.1.1': {} + + '@scalar/types@0.2.15': + dependencies: + '@scalar/openapi-types': 0.3.7 + nanoid: 5.1.5 + zod: 3.24.1 + + '@scalar/use-codemirror@0.12.34(typescript@5.8.2)': + dependencies: + '@codemirror/autocomplete': 6.19.0 + '@codemirror/commands': 6.9.0 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-html': 6.4.11 + '@codemirror/lang-json': 6.0.2 + '@codemirror/lang-xml': 6.1.0 + '@codemirror/lang-yaml': 6.1.2 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.9.0 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.5) + '@scalar/components': 0.14.33(typescript@5.8.2) + codemirror: 6.0.2 + vue: 3.5.22(typescript@5.8.2) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@scalar/use-hooks@0.2.4(typescript@5.8.2)': + dependencies: + '@scalar/use-toasts': 0.8.0(typescript@5.8.2) + '@vueuse/core': 10.11.1(vue@3.5.22(typescript@5.8.2)) + cva: 1.0.0-beta.2(typescript@5.8.2) + tailwind-merge: 2.6.0 + vue: 3.5.22(typescript@5.8.2) + zod: 3.24.1 + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + + '@scalar/use-toasts@0.8.0(typescript@5.8.2)': + dependencies: + nanoid: 5.1.5 + vue: 3.5.22(typescript@5.8.2) + vue-sonner: 1.3.2 + transitivePeerDependencies: + - typescript + + '@scalar/workspace-store@0.15.5(typescript@5.8.2)': + dependencies: + '@scalar/code-highlight': 0.1.9 + '@scalar/helpers': 0.0.10 + '@scalar/json-magic': 0.4.2(typescript@5.8.2) + '@scalar/openapi-parser': 0.20.5(typescript@5.8.2) + '@scalar/snippetz': 0.4.9 + '@scalar/typebox': 0.1.1 + '@scalar/types': 0.2.15 + github-slugger: 2.0.0 + type-fest: 4.41.0 + vue: 3.5.22(typescript@5.8.2) + yaml: 2.8.0 + transitivePeerDependencies: + - supports-color + - typescript + '@sec-ant/readable-stream@0.4.1': {} '@sinclair/typebox@0.27.8': {} @@ -13142,6 +14411,13 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) + '@tanstack/virtual-core@3.13.12': {} + + '@tanstack/vue-virtual@3.13.12(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@tanstack/virtual-core': 3.13.12 + vue: 3.5.22(typescript@5.8.2) + '@tokenizer/token@0.3.0': {} '@trysound/sax@0.2.0': {} @@ -13151,6 +14427,39 @@ snapshots: '@types/node': 20.14.0 zod: 3.25.51 + '@ts-rest/core@3.52.1(@types/node@20.17.24)(zod@3.24.2)': + optionalDependencies: + '@types/node': 20.17.24 + zod: 3.24.2 + + '@ts-rest/next@3.52.1(@ts-rest/core@3.52.1(@types/node@20.14.0)(zod@3.25.51))(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1))(zod@3.25.51)': + dependencies: + '@ts-rest/core': 3.52.1(@types/node@20.14.0)(zod@3.25.51) + next: 14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1) + optionalDependencies: + zod: 3.25.51 + + '@ts-rest/next@3.52.1(@ts-rest/core@3.52.1(@types/node@20.17.24)(zod@3.24.2))(next@14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(zod@3.24.2)': + dependencies: + '@ts-rest/core': 3.52.1(@types/node@20.17.24)(zod@3.24.2) + next: 14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) + optionalDependencies: + zod: 3.24.2 + + '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@20.14.0)(zod@3.25.51))(zod@3.25.51)': + dependencies: + '@anatine/zod-openapi': 1.14.2(openapi3-ts@2.0.2)(zod@3.25.51) + '@ts-rest/core': 3.52.1(@types/node@20.14.0)(zod@3.25.51) + openapi3-ts: 2.0.2 + zod: 3.25.51 + + '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@20.17.24)(zod@3.24.2))(zod@3.24.2)': + dependencies: + '@anatine/zod-openapi': 1.14.2(openapi3-ts@2.0.2)(zod@3.24.2) + '@ts-rest/core': 3.52.1(@types/node@20.17.24)(zod@3.24.2) + openapi3-ts: 2.0.2 + zod: 3.24.2 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -13365,6 +14674,8 @@ snapshots: dependencies: '@types/node': 20.17.24 + '@types/har-format@1.2.16': {} + '@types/hast@2.3.10': dependencies: '@types/unist': 2.0.11 @@ -13459,6 +14770,10 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@22.18.9': + dependencies: + undici-types: 6.21.0 + '@types/node@24.0.13': dependencies: undici-types: 7.8.0 @@ -13557,6 +14872,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/web-bluetooth@0.0.20': {} + '@types/webidl-conversions@7.0.3': {} '@types/whatwg-url@11.0.5': @@ -13716,6 +15033,29 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unhead/dom@1.11.20': + dependencies: + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + + '@unhead/schema@1.11.20': + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + + '@unhead/shared@1.11.20': + dependencies: + '@unhead/schema': 1.11.20 + packrup: 0.1.2 + + '@unhead/vue@1.11.20(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + hookable: 5.5.3 + unhead: 1.11.20 + vue: 3.5.22(typescript@5.8.2) + '@vercel/otel@1.13.0(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))': dependencies: '@opentelemetry/api': 1.9.0 @@ -13829,11 +15169,24 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.22': + dependencies: + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.13': dependencies: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 + '@vue/compiler-dom@3.5.22': + dependencies: + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 + '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.26.10 @@ -13846,20 +15199,48 @@ snapshots: postcss: 8.5.3 source-map-js: 1.2.1 + '@vue/compiler-sfc@3.5.22': + dependencies: + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + estree-walker: 2.0.2 + magic-string: 0.30.19 + postcss: 8.5.6 + source-map-js: 1.2.1 + '@vue/compiler-ssr@3.5.13': dependencies: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 + '@vue/compiler-ssr@3.5.22': + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/devtools-api@6.6.4': {} + '@vue/reactivity@3.5.13': dependencies: '@vue/shared': 3.5.13 + '@vue/reactivity@3.5.22': + dependencies: + '@vue/shared': 3.5.22 + '@vue/runtime-core@3.5.13': dependencies: '@vue/reactivity': 3.5.13 '@vue/shared': 3.5.13 + '@vue/runtime-core@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 + '@vue/runtime-dom@3.5.13': dependencies: '@vue/reactivity': 3.5.13 @@ -13867,14 +15248,82 @@ snapshots: '@vue/shared': 3.5.13 csstype: 3.1.3 + '@vue/runtime-dom@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 + csstype: 3.1.3 + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))': dependencies: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 vue: 3.5.13(typescript@5.8.2) + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.8.2) + '@vue/shared@3.5.13': {} + '@vue/shared@3.5.22': {} + + '@vueuse/core@10.11.1(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.22(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@11.3.0(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.3.0 + '@vueuse/shared': 11.3.0(vue@3.5.22(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/integrations@11.3.0(axios@1.12.1)(focus-trap@7.6.5)(fuse.js@7.1.0)(nprogress@0.2.0)(qrcode@1.5.4)(vue@3.5.22(typescript@5.8.2))': + dependencies: + '@vueuse/core': 11.3.0(vue@3.5.22(typescript@5.8.2)) + '@vueuse/shared': 11.3.0(vue@3.5.22(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.2)) + optionalDependencies: + axios: 1.12.1 + focus-trap: 7.6.5 + fuse.js: 7.1.0 + nprogress: 0.2.0 + qrcode: 1.5.4 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@11.3.0': {} + + '@vueuse/shared@10.11.1(vue@3.5.22(typescript@5.8.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@11.3.0(vue@3.5.22(typescript@5.8.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -14745,6 +16194,16 @@ snapshots: co@4.6.0: {} + codemirror@6.0.2: + dependencies: + '@codemirror/autocomplete': 6.19.0 + '@codemirror/commands': 6.9.0 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.9.0 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.5 + collapse-white-space@1.0.6: {} collect-v8-coverage@1.0.2: {} @@ -14919,6 +16378,8 @@ snapshots: create-require@1.1.1: {} + crelt@1.0.6: {} + cron-parser@4.9.0: dependencies: luxon: 3.5.0 @@ -14966,6 +16427,12 @@ snapshots: csstype@3.1.3: {} + cva@1.0.0-beta.2(typescript@5.8.2): + dependencies: + clsx: 2.1.1 + optionalDependencies: + typescript: 5.8.2 + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): dependencies: cose-base: 1.0.3 @@ -15277,6 +16744,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.4: {} + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -16355,6 +17824,10 @@ snapshots: dependencies: tslib: 2.8.1 + focus-trap@7.6.5: + dependencies: + tabbable: 6.2.0 + follow-redirects@1.15.9(debug@4.4.0): optionalDependencies: debug: 4.4.0 @@ -16465,6 +17938,8 @@ snapshots: functions-have-names@1.2.3: {} + fuse.js@7.1.0: {} + generate-function@2.3.1: dependencies: is-property: 1.0.2 @@ -16492,6 +17967,8 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-package-type@0.1.0: {} get-proto@1.0.1: @@ -16525,6 +18002,8 @@ snapshots: github-from-package@0.0.0: {} + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -16635,6 +18114,21 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.1 + hast-util-from-dom@5.0.1: dependencies: '@types/hast': 3.0.4 @@ -16668,16 +18162,76 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + hast-util-parse-selector@2.2.5: {} hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.6: dependencies: '@types/estree': 1.0.6 @@ -16698,6 +18252,16 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-to-text@4.0.2: dependencies: '@types/hast': 3.0.4 @@ -16729,12 +18293,18 @@ snapshots: highlight.js@10.7.3: {} + highlight.js@11.11.1: {} + + highlightjs-curl@1.3.0: {} + highlightjs-vue@1.0.0: {} hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 + hookable@5.5.3: {} + html-escaper@2.0.2: {} html-parse-stringify@3.0.1: @@ -16743,6 +18313,10 @@ snapshots: html-url-attributes@3.0.1: {} + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 @@ -17060,6 +18634,8 @@ snapshots: is-obj@2.0.0: {} + is-obj@3.0.0: {} + is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} @@ -17077,6 +18653,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-regexp@3.1.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -17542,6 +19120,8 @@ snapshots: joplin-turndown-plugin-gfm@1.0.12: {} + js-base64@3.7.8: {} + js-cookie@3.0.5: {} js-tokens@4.0.0: {} @@ -17581,6 +19161,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-deterministic@1.0.12: {} + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -17607,6 +19189,8 @@ snapshots: '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) jsep: 1.4.0 + jsonpointer@5.0.1: {} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -17634,6 +19218,10 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 + just-clone@6.2.0: {} + + just-curry-it@5.3.0: {} + jwa@1.4.1: dependencies: buffer-equal-constant-time: 1.0.1 @@ -17693,6 +19281,8 @@ snapshots: leven@3.1.0: {} + leven@4.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -17898,6 +19488,12 @@ snapshots: fault: 1.0.4 highlight.js: 10.7.3 + lowlight@3.3.0: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -17916,6 +19512,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -18220,6 +19820,8 @@ snapshots: methods@1.1.2: {} + microdiff@1.5.0: {} + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.2.0 @@ -18817,10 +20419,14 @@ snapshots: dependencies: lru-cache: 7.18.3 + nanoid@3.3.11: {} + nanoid@3.3.9: {} nanoid@5.1.3: {} + nanoid@5.1.5: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} @@ -19169,6 +20775,10 @@ snapshots: openapi-types@12.1.3: {} + openapi3-ts@2.0.2: + dependencies: + yaml: 1.10.2 + option@0.2.4: {} optionator@0.9.4: @@ -19274,6 +20884,8 @@ snapshots: registry-url: 6.0.1 semver: 7.7.2 + packrup@0.1.2: {} + pako@1.0.11: {} papaparse@5.4.1: {} @@ -19317,6 +20929,8 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-ms@3.0.0: {} + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 @@ -19496,6 +21110,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-array@3.0.4: {} @@ -19537,12 +21157,18 @@ snapshots: prettier@3.2.4: {} + pretty-bytes@6.1.1: {} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + prismjs@1.27.0: {} prismjs@1.30.0: {} @@ -19577,6 +21203,8 @@ snapshots: dependencies: xtend: 4.0.2 + property-information@6.5.0: {} + property-information@7.0.0: {} proto-list@1.2.4: {} @@ -19643,6 +21271,23 @@ snapshots: quick-lru@5.1.1: {} + radix-vue@1.9.17(vue@3.5.22(typescript@5.8.2)): + dependencies: + '@floating-ui/dom': 1.7.4 + '@floating-ui/vue': 1.1.9(vue@3.5.22(typescript@5.8.2)) + '@internationalized/date': 3.10.0 + '@internationalized/number': 3.6.5 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.22(typescript@5.8.2)) + '@vueuse/core': 10.11.1(vue@3.5.22(typescript@5.8.2)) + '@vueuse/shared': 10.11.1(vue@3.5.22(typescript@5.8.2)) + aria-hidden: 1.2.4 + defu: 6.1.4 + fast-deep-equal: 3.1.3 + nanoid: 5.1.5 + vue: 3.5.22(typescript@5.8.2) + transitivePeerDependencies: + - '@vue/composition-api' + raf-schd@4.0.3: {} randombytes@2.1.0: @@ -19995,6 +21640,11 @@ snapshots: space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 + rehype-format@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-format: 1.1.0 + rehype-katex@7.0.1: dependencies: '@types/hast': 3.0.4 @@ -20005,6 +21655,29 @@ snapshots: unist-util-visit-parents: 6.0.1 vfile: 6.0.3 + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + remark-breaks@4.0.0: dependencies: '@types/mdast': 4.0.4 @@ -20410,6 +22083,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + shimmer@1.2.1: {} side-channel-list@1.0.0: @@ -20659,6 +22334,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -20694,6 +22375,8 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.4.2 + style-mod@4.1.2: {} + style-to-js@1.1.16: dependencies: style-to-object: 1.0.8 @@ -20775,6 +22458,12 @@ snapshots: symbol-observable@4.0.0: {} + tabbable@6.2.0: {} + + tailwind-merge@2.6.0: {} + + tailwindcss@4.1.14: {} + tapable@2.2.1: {} tar-fs@2.1.2: @@ -20937,6 +22626,10 @@ snapshots: ts-dedent@2.2.0: {} + ts-deepmerge@6.2.1: {} + + ts-deepmerge@7.0.3: {} + ts-jest@29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.17.24)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.17.24)(typescript@5.8.2)))(typescript@5.8.2): dependencies: bs-logger: 0.2.6 @@ -21036,6 +22729,8 @@ snapshots: type-fest@2.19.0: {} + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -21116,9 +22811,18 @@ snapshots: undici-types@6.19.8: {} + undici-types@6.21.0: {} + undici-types@7.8.0: optional: true + unhead@1.11.20: + dependencies: + '@unhead/dom': 1.11.20 + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + hookable: 5.5.3 + unherit@1.1.3: dependencies: inherits: 2.0.4 @@ -21594,6 +23298,19 @@ snapshots: void-elements@3.1.0: {} + vue-component-type-helpers@3.1.1: {} + + vue-demi@0.14.10(vue@3.5.22(typescript@5.8.2)): + dependencies: + vue: 3.5.22(typescript@5.8.2) + + vue-router@4.5.1(vue@3.5.22(typescript@5.8.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.22(typescript@5.8.2) + + vue-sonner@1.3.2: {} + vue@3.5.13(typescript@5.8.2): dependencies: '@vue/compiler-dom': 3.5.13 @@ -21604,6 +23321,18 @@ snapshots: optionalDependencies: typescript: 5.8.2 + vue@3.5.22(typescript@5.8.2): + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.8.2)) + '@vue/shared': 3.5.22 + optionalDependencies: + typescript: 5.8.2 + + w3c-keyname@2.2.8: {} + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -21667,6 +23396,8 @@ snapshots: - esbuild - uglify-js + whatwg-mimetype@4.0.0: {} + whatwg-url@14.1.1: dependencies: tr46: 5.1.0 @@ -21818,6 +23549,8 @@ snapshots: yaml@2.3.1: {} + yaml@2.8.0: {} + yaml@2.8.1: optional: true @@ -21872,6 +23605,8 @@ snapshots: yocto-queue@1.2.0: {} + zhead@2.2.4: {} + zhlint@0.7.4(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(typescript@5.8.2): dependencies: chalk: 4.1.2 @@ -21900,14 +23635,16 @@ snapshots: - terser - typescript - zod-to-json-schema@3.24.5(zod@3.24.2): + zod-to-json-schema@3.24.5(zod@3.25.51): dependencies: - zod: 3.24.2 + zod: 3.25.51 zod-validation-error@3.4.0(zod@3.25.51): dependencies: zod: 3.25.51 + zod@3.24.1: {} + zod@3.24.2: {} zod@3.25.51: {} diff --git a/projects/app/package.json b/projects/app/package.json index 4908e30cd126..4c2bcc353bdb 100644 --- a/projects/app/package.json +++ b/projects/app/package.json @@ -24,7 +24,11 @@ "@fortaine/fetch-event-source": "^3.0.6", "@modelcontextprotocol/sdk": "^1.12.1", "@node-rs/jieba": "2.0.1", + "@scalar/api-reference-react": "0.7.48", "@tanstack/react-query": "^4.24.10", + "@ts-rest/core": "^3.52.1", + "@ts-rest/next": "^3.52.1", + "@ts-rest/open-api": "^3.52.1", "ahooks": "^3.7.11", "axios": "^1.12.1", "date-fns": "2.30.0", diff --git a/projects/app/src/apiRouters/proApi.ts b/projects/app/src/apiRouters/proApi.ts new file mode 100644 index 000000000000..5c94d5ec7047 --- /dev/null +++ b/projects/app/src/apiRouters/proApi.ts @@ -0,0 +1,38 @@ +import type { Handler } from '@fastgpt/global/common/tsRest/type'; +import { FastGPTProUrl } from '@fastgpt/service/common/system/constants'; + +const handler: Handler = async ({ req, res, headers: _headers }) => { + return new Promise(async (resolve, reject) => { + try { + const requestPath = (req.url || '').replace('/proApi', ''); + + if (!requestPath) { + throw new Error('url is empty'); + } + if (!FastGPTProUrl) { + throw new Error(`未配置商业版链接: ${requestPath}`); + } + + const parsedUrl = new URL(FastGPTProUrl); + + // 删除敏感的 header + const headers = new Headers(_headers as Record); + headers.delete('rootkey'); + + const response = await fetch(`${parsedUrl.origin}${requestPath}`, { + headers, + method: req.method, + body: req.method === 'GET' || req.method === 'HEAD' ? undefined : JSON.stringify(req.body) + }); + + resolve({ + status: response.status, + body: await response.json() + }); + } catch (error) { + reject(error); + } + }); +}; + +export const proApi: (...args: any[]) => Promise = handler; diff --git a/projects/app/src/apiRouters/support/user/acccount/loginout.ts b/projects/app/src/apiRouters/support/user/acccount/loginout.ts new file mode 100644 index 000000000000..464b5f057078 --- /dev/null +++ b/projects/app/src/apiRouters/support/user/acccount/loginout.ts @@ -0,0 +1,15 @@ +import type { Handler } from '@fastgpt/global/common/tsRest/type'; +import { RestAPI } from '@/service/middleware/entry'; +import { authCert, clearCookie } from '@fastgpt/service/support/permission/auth/common'; +import { delUserAllSession } from '@fastgpt/service/support/user/session'; +import type { accountContract } from '@fastgpt/global/common/tsRest/fastgpt/contracts/support/user/account'; + +const handler: Handler = async ({ req, res }) => { + try { + const { userId } = await authCert({ req, authToken: true }); + await delUserAllSession(userId); + } catch (error) {} + clearCookie(res); +}; + +export const loginout = RestAPI(handler); diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx index 8427caf0cf5f..aad41db72c64 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx @@ -24,7 +24,7 @@ import { ChatItemContext } from '@/web/core/chat/context/chatItemContext'; import { ChatRecordContext } from '@/web/core/chat/context/chatRecordContext'; import { useCreation } from 'ahooks'; import type { ChatTypeEnum } from './constants'; -import type { QuickAppType } from '@fastgpt/global/core/chat/setting/type'; +import type { ChatQuickAppType } from '@fastgpt/global/core/chat/setting/type'; export type ChatProviderProps = { appId: string; @@ -39,7 +39,7 @@ export type ChatProviderProps = { slogan?: string; currentQuickAppId?: string; - quickAppList?: QuickAppType[]; + quickAppList?: ChatQuickAppType[]; onSwitchQuickApp?: (appId: string) => Promise; }; diff --git a/projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx b/projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx index 30d866a7c372..ca2781705669 100644 --- a/projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx +++ b/projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx @@ -4,7 +4,7 @@ import { useContextSelector } from 'use-context-selector'; import { AppContext } from '../context'; import ChatItemContextProvider from '@/web/core/chat/context/chatItemContext'; import ChatRecordContextProvider from '@/web/core/chat/context/chatRecordContext'; -import { Box, Button, Flex, HStack } from '@chakra-ui/react'; +import { Box, Button, Center, Flex, HStack } from '@chakra-ui/react'; import { cardStyles } from '../constants'; import { useTranslation } from 'next-i18next'; import { type HttpToolConfigType } from '@fastgpt/global/core/app/type'; @@ -19,6 +19,7 @@ import LabelAndFormRender from '@/components/core/app/formRender/LabelAndForm'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; import ValueTypeLabel from '../WorkflowComponents/Flow/nodes/render/ValueTypeLabel'; import LightRowTabs from '@fastgpt/web/components/common/Tabs/LightRowTabs'; +import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; const ChatTest = ({ currentTool, @@ -52,14 +53,16 @@ const ChatTest = ({ const { runAsync: runTool, loading: isRunning } = useRequest2( async (data: Record) => { if (!currentTool) return; - - return await postRunHTTPTool({ + return postRunHTTPTool({ baseUrl, params: data, - headerSecret, + headerSecret: currentTool.headerSecret || headerSecret, toolPath: currentTool.path, method: currentTool.method, - customHeaders: customHeaders + customHeaders: customHeaders, + staticParams: currentTool.staticParams, + staticHeaders: currentTool.staticHeaders, + staticBody: currentTool.staticBody }); }, { @@ -74,6 +77,7 @@ const ChatTest = ({ } } ); + console.log(currentTool); return ( @@ -95,72 +99,81 @@ const ChatTest = ({ - - { - setActiveTab(value); - }} - /> - - - {activeTab === 'input' ? ( - - {Object.keys(currentTool?.inputSchema.properties || {}).length > 0 ? ( - <> - - {Object.entries(currentTool?.inputSchema.properties || {}).map( - ([paramName, paramInfo]) => { - const inputType = valueTypeToInputType( - getNodeInputTypeFromSchemaInputType({ type: paramInfo.type }) - ); - const required = currentTool?.inputSchema.required?.includes(paramName); - - return ( - - {paramName} - - - } - required={required} - key={paramName} - inputType={inputType} - fieldName={paramName} - form={form} - placeholder={paramName} - /> - ); - } - )} - - - ) : ( - - {t('app:this_tool_requires_no_input')} - - )} - - - + {!currentTool ? ( +
+ +
) : ( - - {output && ( - - + <> + + { + setActiveTab(value); + }} + /> + + + {activeTab === 'input' ? ( + + {Object.keys(currentTool?.inputSchema.properties || {}).length > 0 ? ( + <> + + {Object.entries(currentTool?.inputSchema.properties || {}).map( + ([paramName, paramInfo]) => { + const inputType = valueTypeToInputType( + getNodeInputTypeFromSchemaInputType({ type: paramInfo.type }) + ); + const required = currentTool?.inputSchema.required?.includes(paramName); + + return ( + + {paramName} + + + } + required={required} + key={paramName} + inputType={inputType} + fieldName={paramName} + form={form} + placeholder={paramName} + /> + ); + } + )} + + + ) : ( + + {t('app:this_tool_requires_no_input')} + + )} + + + + ) : ( + + {output && ( + + + + )} )} - + )} diff --git a/projects/app/src/pageComponents/app/detail/HTTPTools/CurlImportModal.tsx b/projects/app/src/pageComponents/app/detail/HTTPTools/CurlImportModal.tsx new file mode 100644 index 000000000000..6a091cefae04 --- /dev/null +++ b/projects/app/src/pageComponents/app/detail/HTTPTools/CurlImportModal.tsx @@ -0,0 +1,141 @@ +import MyModal from '@fastgpt/web/components/common/MyModal'; +import React from 'react'; +import { useTranslation } from 'next-i18next'; +import { Button, ModalBody, ModalFooter, Textarea } from '@chakra-ui/react'; +import { useForm } from 'react-hook-form'; +import { parseCurl } from '@fastgpt/global/common/string/http'; +import { useToast } from '@fastgpt/web/hooks/useToast'; +import { type HttpMethod, ContentTypes } from '@fastgpt/global/core/workflow/constants'; +import type { ParamItemType } from './ManualToolModal'; +import type { StoreSecretValueType } from '@fastgpt/global/common/secret/type'; + +export type CurlImportResult = { + method: HttpMethod; + path: string; + params?: ParamItemType[]; + headers?: ParamItemType[]; + bodyType: string; + bodyContent?: string; + bodyFormData?: ParamItemType[]; + headerSecret?: StoreSecretValueType; +}; + +type CurlImportModalProps = { + onClose: () => void; + onImport: (result: CurlImportResult) => void; +}; + +const CurlImportModal = ({ onClose, onImport }: CurlImportModalProps) => { + const { t } = useTranslation(); + const { toast } = useToast(); + + const { register, handleSubmit } = useForm({ + defaultValues: { + curlContent: '' + } + }); + + const handleCurlImport = (data: { curlContent: string }) => { + try { + const parsed = parseCurl(data.curlContent); + + const convertToParamItemType = ( + items: Array<{ key: string; value?: string; type?: string }> + ): ParamItemType[] => { + return items.map((item) => ({ + key: item.key, + value: item.value || '' + })); + }; + + const { headerSecret, filteredHeaders } = (() => { + let headerSecret: StoreSecretValueType | undefined; + const filteredHeaders = parsed.headers.filter((header) => { + if (header.key.toLowerCase() === 'authorization') { + const authValue = header.value || ''; + if (authValue.startsWith('Bearer ')) { + const token = authValue.substring(7).trim(); + headerSecret = { + Bearer: { + value: token, + secret: '' + } + }; + return false; + } + if (authValue.startsWith('Basic ')) { + const credentials = authValue.substring(6).trim(); + headerSecret = { + Basic: { + value: credentials, + secret: '' + } + }; + return false; + } + } + return true; + }); + return { headerSecret, filteredHeaders }; + })(); + + const bodyType = (() => { + if (!parsed.body || parsed.body === '{}') { + return ContentTypes.none; + } + return ContentTypes.json; + })(); + + const result: CurlImportResult = { + method: parsed.method as HttpMethod, + path: parsed.url, + params: parsed.params.length > 0 ? convertToParamItemType(parsed.params) : undefined, + headers: filteredHeaders.length > 0 ? convertToParamItemType(filteredHeaders) : undefined, + bodyType, + bodyContent: bodyType === ContentTypes.json ? parsed.body : undefined, + ...(headerSecret && { headerSecret }) + }; + + onImport(result); + toast({ + title: t('common:import_success'), + status: 'success' + }); + } catch (error: any) { + toast({ + title: t('common:import_failed'), + description: error.message, + status: 'error' + }); + console.error('Curl import error:', error); + } + }; + + return ( + + +