Compare commits

..

No commits in common. "396662864442153c6364637ba0b3e998a386c417" and "d9928ecc5d5ae0a036e519d850a8320a9ada0631" have entirely different histories.

104 changed files with 3704 additions and 7824 deletions

View File

@ -4,6 +4,9 @@ on:
push: push:
branches: branches:
- main - main
- dev
- hotfix
- hotfix/*
release: release:
types: types:
- published - published

View File

@ -4,6 +4,9 @@ on:
push: push:
branches: branches:
- main - main
- dev
- hotfix
- hotfix/*
release: release:
types: types:
- published - published

1
.gitignore vendored
View File

@ -18,4 +18,3 @@ resources/service
stats.html stats.html
.openmcp .openmcp
test-vsix test-vsix
resources/changelog/**

View File

@ -14,7 +14,6 @@ vsc-extension-quickstart.md
**/.vscode-test.* **/.vscode-test.*
renderer/** renderer/**
service/** service/**
news/**
test/** test/**
servers/** servers/**
scripts/** scripts/**

View File

@ -1,16 +1,5 @@
# Change Log # Change Log
## [main] 0.1.10
- 修复 issue #48: 修复错误的引导路径。
- 支持 kimi 的 usage 计数 + 支持 kimi 的 system prompt。
- 实现 openmcp 工具测试的并行执行和暂停功能。 https://picx.zhimg.com/80/v2-4e09958d91dcf561c578294d8b6f3349_1440w.png
- 修正 API 测速中算法,剥离为 tps + 排队时间两部分。 https://picx.zhimg.com/80/v2-1cc3044a3ec3d5d21cb265dd67518ca0_1440w.png
- 大模型 api 测速目前可以自定义 prompt 了。 https://picx.zhimg.com/80/v2-ff70af72254b82c11a941fe9cc29eeb8_1440w.png
- 实现 issue#49工具模块调试希望支持markdown渲染回显。 https://picx.zhimg.com/80/v2-5d708ccab00f33fdf63a656a0066bf23_1440w.png
- 实现 issue#54,右击服务器列表名,可以重命名服务器。 https://picx.zhimg.com/80/v2-87c2a29abdd2dd56a4d18cc4a8b946ff_1440w.png
- 修复 resources 和 prompts 有关热更新的一些问题。
- 更新 vscode 创建的标签栏的标题。 https://picx.zhimg.com/80/v2-4d40c20f3eaa032573e4de58298c859f_1440w.png
## [main] 0.1.9 ## [main] 0.1.9
- 增加 mook 功能可以利用随机种子或者AI生成来自动化填充测试 tool 的表单数据 - 增加 mook 功能可以利用随机种子或者AI生成来自动化填充测试 tool 的表单数据
- 增加工具自检功能openmcp 的 tool 下可以点击「工具模块」 右侧的 「工具自检」进入自检模式,该模式下,用户可以自己定义工具执行的拓扑顺序,然后一次性进行自动检测。 - 增加工具自检功能openmcp 的 tool 下可以点击「工具模块」 右侧的 「工具自检」进入自检模式,该模式下,用户可以自己定义工具执行的拓扑顺序,然后一次性进行自动检测。

View File

@ -6,7 +6,7 @@
English | [中文](./README.zh.md) English | [中文](./README.zh.md)
<a href="https://openmcp.kirigaya.cn" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none;">🫱 Official Documentation</a> <a href="https://kirigaya.cn/openmcp" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none;"> 📄 OpenMCP Documentation</a>
<a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #CB81DA; color: white; border-radius: .5em; text-decoration: none;">OpenMCP QQ Group</a> <a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #CB81DA; color: white; border-radius: .5em; text-decoration: none;">OpenMCP QQ Group</a>
@ -25,7 +25,7 @@ Integrated Inspector + MCP client basic functions, combining development and tes
![](./icons/openmcp.welcome.png) ![](./icons/openmcp.welcome.png)
Test mcp tools, prompts and resources with a variety of tools. Test resource protocols, tools, and Prompts for MCP servers.
![](./icons/openmcp.resource.png) ![](./icons/openmcp.resource.png)
@ -41,10 +41,6 @@ Supports multiple large models
![](./icons/openmcp.support.llm.png) ![](./icons/openmcp.support.llm.png)
Support XML mode and customized options for your tool selection.
![](./icons/openmcp.xml.png)
## TODO ## TODO
## Feature Roadmap ## Feature Roadmap

View File

@ -6,7 +6,7 @@
[English](./README.md) | 中文 [English](./README.md) | 中文
<a href="https://openmcp.kirigaya.cn" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none;"> 🫱 官方文档</a> <a href="https://kirigaya.cn/openmcp" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none;"> 📄 OpenMCP 文档网站</a>
<a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #CB81DA; color: white; border-radius: .5em; text-decoration: none;">OpenMCP QQ 讨论群</a> <a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #CB81DA; color: white; border-radius: .5em; text-decoration: none;">OpenMCP QQ 讨论群</a>
@ -41,10 +41,6 @@
![](./icons/openmcp.support.llm.png) ![](./icons/openmcp.support.llm.png)
支持 XML 模式和自定义工具选择
![](./icons/openmcp.xml.png)
## TODO ## TODO

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 KiB

After

Width:  |  Height:  |  Size: 543 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 675 KiB

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 KiB

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 KiB

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 KiB

View File

@ -16,7 +16,5 @@
"comment-plugin": "Comment Plugin", "comment-plugin": "Comment Plugin",
"preset-env-sync": "Preset environment variables synchronized successfully", "preset-env-sync": "Preset environment variables synchronized successfully",
"preset-env-sync.fail": "Failed to sync preset environment variables", "preset-env-sync.fail": "Failed to sync preset environment variables",
"error.notOpenWorkspace": "No workspace is currently open in VSCode. Please open a workspace (e.g., open a folder) first.", "error.notOpenWorkspace": "No workspace is currently open in VSCode. Please open a workspace (e.g., open a folder) first."
"openmcp.sidebar.installed-connection.changeConnectionName.title": "Enter the new connection name",
"error.connectionNameRequired": "Server name cannot be empty"
} }

View File

@ -16,6 +16,6 @@
"comment-plugin": "コメントプラグイン", "comment-plugin": "コメントプラグイン",
"preset-env-sync": "プリセット環境変数の同期が完了しました", "preset-env-sync": "プリセット環境変数の同期が完了しました",
"preset-env-sync.fail": "プリセット環境変数の同期に失敗しました", "preset-env-sync.fail": "プリセット環境変数の同期に失敗しました",
"openmcp.sidebar.installed-connection.changeConnectionName.title": "変更する接続名を入力してください", "error.notOpenWorkspace": "現在、VSCode でワークスペースが開かれていません。まずワークスペース(例:フォルダーを開く)を開いてください。"
"error.connectionNameRequired": "サーバー名は必須です"
} }

View File

@ -16,7 +16,5 @@
"comment-plugin": "评论插件", "comment-plugin": "评论插件",
"preset-env-sync": "预设环境变量同步完成", "preset-env-sync": "预设环境变量同步完成",
"preset-env-sync.fail": "预设环境变量同步失败", "preset-env-sync.fail": "预设环境变量同步失败",
"error.notOpenWorkspace": "当前VScode没有打开工作区请先打开工作区例如打开文件夹", "error.notOpenWorkspace": "当前VScode没有打开工作区请先打开工作区例如打开文件夹"
"openmcp.sidebar.installed-connection.changeConnectionName.title": "输入修改的名称",
"error.connectionNameRequired": "服务器名称不能为空"
} }

31
news/.gitignore vendored
View File

@ -1,31 +0,0 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
*.tsbuildinfo
./src/data.json

View File

@ -1,3 +0,0 @@
{
"recommendations": ["Vue.volar"]
}

View File

@ -1,183 +0,0 @@
## OpenMCP News
Change when user update extension
## Context
You are a clever bot to write SPA page to display the changelog and news of my software OpenMCP.
### Some basic information you should know
- Release is: https://github.com/LSTM-Kirigaya/openmcp-client/releases
- OpenMCP website is: https://openmcp.kirigaya.cn/
- Github: https://github.com/LSTM-Kirigaya/openmcp-client
- Discord: https://discord.com/invite/SKTZRf6NzU
- QQ: https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD
### Design framework
You should obey the following order to make the page:
1. 📣 What is news in xxx
2. 🐳 Learn more features
3. ✨ Core Features
4. ❤️ How to sponsor
5. 📚 Resources
6. 🔧 Troubleshooting
### Some design requirements
- Theme color of openmcp is #B988D1, you should use it wisely and don't use light blue as default theme color, use #B988D1 instead.
- This is a website designed to be opened in vscode, so you should make vscode oriented design, where you should use following css macro to dev css class:
```css
:root {
--font-monospace-family: var(--vscode-editor-font-family);
--font-monospace-weight: var(--vscode-editor-font-weight);
--font-monospace-size: var(--vscode-editor-font-size);
--link-foreground: var(--vscode-textLink-foreground);
--link-active: var(--vscode-textLink-activeForeground);
/* UI & Control */
--input-active-background: var(--vscode-input-background);
--input-active-border: var(--vscode-focusBorder);
--input-active-foreground: var(--vscode-input-foreground);
--input-error-background: var(--vscode-inputValidation-errorBackground);
--input-error-border: var(--vscode-inputValidation-errorBorder);
--input-error-foreground: var(--vscode-inputValidation-errorForeground);
--input-foreground: var(--vscode-input-foreground);
--input-background: var(--vscode-input-background);
--input-border: var(--vscode-input-border);
--input-hover: var(--vscode-input-background);
--input-placeholder: var(--vscode-input-placeholderForeground);
--input-radius: 0px;
--scrollbar-background: var(--vscode-scrollbarSlider-background);
--scrollbar-hover: var(--vscode-scrollbarSlider-hoverBackground);
--scrollbar-active: var(--vscode-scrollbarSlider-activeBackground);
/* Window */
--title-bar: #1f1f1f;
--title-color: #fff;
--foreground: var(--vscode-editor-foreground);
--background: var(--vscode-editor-background);
--label: rgb(189, 189, 189);
--shadow: #000;
--border: var(--vscode-input-border);
--window-button-hover: rgba(255,255,255,0.1);
--window-button-active: rgba(255,255,255,0.2);
--window-blur-background: rgba(0,0,0,0.25);
--window-title-foreground: var(--foreground);
--window-background: var(--sidebar);
--window-border: transparent;
--window-radius: 0px;
/* Sidebar */
--sidebar: var(--vscode-sideBar-background);
--sidebar-border: var(--vscode-sideBar-border);
--sidebar-min-width: 280px;
--sidebar-item-text: var(--vscode-list-inactiveSelectionForeground);
--sidebar-item-border: var(--vscode-input-border);
--sidebar-item-background: var(--sidebar);
--sidebar-item-selected: var(--vscode-list-inactiveSelectionBackground);
--sidebar-item-hover: var(--vscode-list-hoverBackground);
--sidebar-item-max-height: 40px;
--sidebar-item-radix-background: var(--vscode-breadcrumb-background);
--sidebar-group-text: var(--vscode-sideBarSectionHeader-foreground);
--sidebar-group-border: var(--vscode-sideBarSectionHeader-border);
--sidebar-group-background: var(--vscode-sideBarSectionHeader-background);
/* Labels */
--signalSize-background: rgba(0,0,0,0.5);
--signalSize-border: rgba(255,255,255,0.2);
--signalSize-color: var(--foreground);
/* Color Picker */
--picker-swatch-size: 15px;
--picker-swatch-cols: 8;
--picker-background: var(--vscode-breadcrumbPicker-background);
--picker-border: var(--vscode-dropdown-border);
/* Search */
--search-background: var(--vscode-quickInput-background);
--search-border: var(--border);
--search-panel-background: transparent;
--search-panel-border: var(--vscode-pickerGroup-border);
--search-panel-text: var(--vscode-quickInput-foreground);
--search-label: var(--foreground);
--search-selected-background: var(--vscode-list-inactiveSelectionBackground);
/* Properties */
--properties-background: var(--vscode-breadcrumb-background);
--properties-border: var(--border);
/* Navbar */
--navBar-background: var(--sidebar);
--navBar-height: 32px;
--navBar-button: transparent;
--navBar-button-text: var(--foreground);
--navBar-group-background: var(--background);
--navBar-preview-background: var(--vscode-scrollbarSlider-background);
--navBar-slider-border: var(--foreground);
/* Buttons */
--button: var(--vscode-button-background);
--button-text: var(--vscode-button-foreground);
--button-hover: var(--vscode-button-hoverBackground);
--button-active: var(--vscode-button-hoverBackground);
--button-disabled: var(--vscode-activityBar-background);
--button-disabled-text: var(--vscode-activityBar-inactiveForeground);
/* Grid Lines */
--grid-dash: 2;
--grid-space: 4;
--grid-line: var(--vscode-editorIndentGuide-background);
--grid-tick: var(--vscode-editorIndentGuide-activeBackground);
/* Cursor */
--cursor: var(--vscode-editorCursor-foreground);
--cursor-ghost: rgba(255, 255, 255, 0.2);
--cursor-width: 2;
/* X-Axis */
--axis-height: 38px;
--axis-line: var(--border);
--axis-background: var(--vscode-sideBar-background);
--axis-foreground: var(--foreground);
/* Signals */
--signal-highlight: var(--vscode-list-inactiveSelectionBackground);
/* Colors */
--accent: var(--vscode-button-background);
--accent-dim: #234175;
--accent-bright: #24c5f7;
--accent-hover: var(--vscode-button-hoverBackground);
--color-red: #ff5252;
--color-pink: #ff4081;
--color-purple: #e040fb;
--color-deepPurple: #7c4dff;
--color-indigo: #536dfe;
--color-blue: #448aff;
--color-lightBlue: #40c4ff;
--color-cyan: #18ffff;
--color-teal: #64ffda;
--color-green: #69f0ae;
--color-lightGreen: #b2ff59;
--color-lime: #eeff41;
--color-yellow: #ffff00;
--color-amber: #ffd740;
--color-orange: #ffab40;
--color-deepOrange: #ff6e40;
/* Settings */
--settings-action-background: var(--background);
}
```

6
news/env.d.ts vendored
View File

@ -1,6 +0,0 @@
/// <reference types="vite/client" />
declare module '*.vue' {
import { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}

View File

@ -1,25 +0,0 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="shortcut icon" href="/favicon.svg" type="image/x-icon">
<link rel="stylesheet" href="/default-dark.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OpenMCP News Feature</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
<style>
.openmcp-icon {
display: inline-block;
vertical-align: middle;
background: url('https://openmcp.kirigaya.cn/images/favicon.svg') no-repeat center/contain;
}
</style>

3255
news/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
{
"name": "news",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "run-p type-check \"build-only {@}\" --",
"preview": "vite preview",
"build-only": "vite build",
"type-check": "vue-tsc --build"
},
"dependencies": {
"vanilla-tilt": "^1.8.1",
"vue": "^3.5.17"
},
"devDependencies": {
"@tsconfig/node22": "^22.0.2",
"@types/node": "^22.15.32",
"@vitejs/plugin-vue": "^6.0.0",
"@vue/tsconfig": "^0.7.0",
"npm-run-all2": "^8.0.4",
"typescript": "~5.8.0",
"vite": "^7.0.0",
"vite-plugin-singlefile": "^2.3.0",
"vite-plugin-vue-devtools": "^7.7.7",
"vue-tsc": "^2.2.10"
}
}

View File

@ -1,772 +0,0 @@
:root {
--vscode-foreground: #cccccc;
--vscode-disabledForeground: rgba(204, 204, 204, 0.5);
--vscode-errorForeground: #f48771;
--vscode-descriptionForeground: rgba(204, 204, 204, 0.7);
--vscode-icon-foreground: #c5c5c5;
--vscode-focusBorder: #007fd4;
--vscode-textLink-foreground: #3794ff;
--vscode-textLink-activeForeground: #3794ff;
--vscode-textSeparator-foreground: rgba(255, 255, 255, 0.18);
--vscode-textPreformat-foreground: #d7ba7d;
--vscode-textPreformat-background: rgba(255, 255, 255, 0.1);
--vscode-textBlockQuote-background: #222222;
--vscode-textBlockQuote-border: rgba(0, 122, 204, 0.5);
--vscode-textCodeBlock-background: rgba(10, 10, 10, 0.4);
--vscode-sash-hoverBorder: #007fd4;
--vscode-badge-background: #4d4d4d;
--vscode-badge-foreground: #ffffff;
--vscode-scrollbar-shadow: #000000;
--vscode-scrollbarSlider-background: rgba(121, 121, 121, 0.4);
--vscode-scrollbarSlider-hoverBackground: rgba(100, 100, 100, 0.7);
--vscode-scrollbarSlider-activeBackground: rgba(191, 191, 191, 0.4);
--vscode-progressBar-background: #0e70c0;
--vscode-editor-background: #1e1e1e;
--vscode-editor-foreground: #d4d4d4;
--vscode-editorStickyScroll-background: #1e1e1e;
--vscode-editorStickyScrollHover-background: #2a2d2e;
--vscode-editorStickyScroll-shadow: #000000;
--vscode-editorWidget-background: #252526;
--vscode-editorWidget-foreground: #cccccc;
--vscode-editorWidget-border: #454545;
--vscode-editorError-foreground: #f14c4c;
--vscode-editorWarning-foreground: #cca700;
--vscode-editorInfo-foreground: #3794ff;
--vscode-editorHint-foreground: rgba(238, 238, 238, 0.7);
--vscode-editorLink-activeForeground: #4e94ce;
--vscode-editor-selectionBackground: #264f78;
--vscode-editor-inactiveSelectionBackground: #3a3d41;
--vscode-editor-selectionHighlightBackground: rgba(173, 214, 255, 0.15);
--vscode-editor-findMatchBackground: #515c6a;
--vscode-editor-findMatchHighlightBackground: rgba(234, 92, 0, 0.33);
--vscode-editor-findRangeHighlightBackground: rgba(58, 61, 65, 0.4);
--vscode-editor-hoverHighlightBackground: rgba(38, 79, 120, 0.25);
--vscode-editorHoverWidget-background: #252526;
--vscode-editorHoverWidget-foreground: #cccccc;
--vscode-editorHoverWidget-border: #454545;
--vscode-editorHoverWidget-statusBarBackground: #2c2c2d;
--vscode-editorInlayHint-foreground: #969696;
--vscode-editorInlayHint-background: rgba(77, 77, 77, 0.1);
--vscode-editorInlayHint-typeForeground: #969696;
--vscode-editorInlayHint-typeBackground: rgba(77, 77, 77, 0.1);
--vscode-editorInlayHint-parameterForeground: #969696;
--vscode-editorInlayHint-parameterBackground: rgba(77, 77, 77, 0.1);
--vscode-editorLightBulb-foreground: #ffcc00;
--vscode-editorLightBulbAutoFix-foreground: #75beff;
--vscode-editorLightBulbAi-foreground: #ffcc00;
--vscode-editor-snippetTabstopHighlightBackground: rgba(124, 124, 124, 0.3);
--vscode-editor-snippetFinalTabstopHighlightBorder: #525252;
--vscode-diffEditor-insertedTextBackground: rgba(156, 204, 44, 0.2);
--vscode-diffEditor-removedTextBackground: rgba(255, 0, 0, 0.2);
--vscode-diffEditor-insertedLineBackground: rgba(155, 185, 85, 0.2);
--vscode-diffEditor-removedLineBackground: rgba(255, 0, 0, 0.2);
--vscode-diffEditor-diagonalFill: rgba(204, 204, 204, 0.2);
--vscode-diffEditor-unchangedRegionBackground: #252526;
--vscode-diffEditor-unchangedRegionForeground: #cccccc;
--vscode-diffEditor-unchangedCodeBackground: rgba(116, 116, 116, 0.16);
--vscode-widget-shadow: rgba(0, 0, 0, 0.36);
--vscode-widget-border: #303031;
--vscode-toolbar-hoverBackground: rgba(90, 93, 94, 0.31);
--vscode-toolbar-activeBackground: rgba(99, 102, 103, 0.31);
--vscode-breadcrumb-foreground: rgba(204, 204, 204, 0.8);
--vscode-breadcrumb-background: #1e1e1e;
--vscode-breadcrumb-focusForeground: #e0e0e0;
--vscode-breadcrumb-activeSelectionForeground: #e0e0e0;
--vscode-breadcrumbPicker-background: #252526;
--vscode-merge-currentHeaderBackground: rgba(64, 200, 174, 0.5);
--vscode-merge-currentContentBackground: rgba(64, 200, 174, 0.2);
--vscode-merge-incomingHeaderBackground: rgba(64, 166, 255, 0.5);
--vscode-merge-incomingContentBackground: rgba(64, 166, 255, 0.2);
--vscode-merge-commonHeaderBackground: rgba(96, 96, 96, 0.4);
--vscode-merge-commonContentBackground: rgba(96, 96, 96, 0.16);
--vscode-editorOverviewRuler-currentContentForeground: rgba(64, 200, 174, 0.5);
--vscode-editorOverviewRuler-incomingContentForeground: rgba(64, 166, 255, 0.5);
--vscode-editorOverviewRuler-commonContentForeground: rgba(96, 96, 96, 0.4);
--vscode-editorOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49);
--vscode-editorOverviewRuler-selectionHighlightForeground: rgba(160, 160, 160, 0.8);
--vscode-problemsErrorIcon-foreground: #f14c4c;
--vscode-problemsWarningIcon-foreground: #cca700;
--vscode-problemsInfoIcon-foreground: #3794ff;
--vscode-minimap-findMatchHighlight: #d18616;
--vscode-minimap-selectionOccurrenceHighlight: #676767;
--vscode-minimap-selectionHighlight: #264f78;
--vscode-minimap-infoHighlight: #3794ff;
--vscode-minimap-warningHighlight: #cca700;
--vscode-minimap-errorHighlight: rgba(255, 18, 18, 0.7);
--vscode-minimap-foregroundOpacity: #000000;
--vscode-minimapSlider-background: rgba(121, 121, 121, 0.2);
--vscode-minimapSlider-hoverBackground: rgba(100, 100, 100, 0.35);
--vscode-minimapSlider-activeBackground: rgba(191, 191, 191, 0.2);
--vscode-charts-foreground: #cccccc;
--vscode-charts-lines: rgba(204, 204, 204, 0.5);
--vscode-charts-red: #f14c4c;
--vscode-charts-blue: #3794ff;
--vscode-charts-yellow: #cca700;
--vscode-charts-orange: #d18616;
--vscode-charts-green: #89d185;
--vscode-charts-purple: #b180d7;
--vscode-input-background: #3c3c3c;
--vscode-input-foreground: #cccccc;
--vscode-inputOption-activeBorder: #007acc;
--vscode-inputOption-hoverBackground: rgba(90, 93, 94, 0.5);
--vscode-inputOption-activeBackground: rgba(0, 127, 212, 0.4);
--vscode-inputOption-activeForeground: #ffffff;
--vscode-input-placeholderForeground: #a6a6a6;
--vscode-inputValidation-infoBackground: #063b49;
--vscode-inputValidation-infoBorder: #007acc;
--vscode-inputValidation-warningBackground: #352a05;
--vscode-inputValidation-warningBorder: #b89500;
--vscode-inputValidation-errorBackground: #5a1d1d;
--vscode-inputValidation-errorBorder: #be1100;
--vscode-dropdown-background: #3c3c3c;
--vscode-dropdown-foreground: #f0f0f0;
--vscode-dropdown-border: #3c3c3c;
--vscode-button-foreground: #ffffff;
--vscode-button-separator: rgba(255, 255, 255, 0.4);
--vscode-button-background: #0e639c;
--vscode-button-hoverBackground: #1177bb;
--vscode-button-secondaryForeground: #ffffff;
--vscode-button-secondaryBackground: #3a3d41;
--vscode-button-secondaryHoverBackground: #45494e;
--vscode-radio-activeForeground: #ffffff;
--vscode-radio-activeBackground: rgba(0, 127, 212, 0.4);
--vscode-radio-activeBorder: #007acc;
--vscode-radio-inactiveBorder: rgba(255, 255, 255, 0.2);
--vscode-radio-inactiveHoverBackground: rgba(90, 93, 94, 0.5);
--vscode-checkbox-background: #3c3c3c;
--vscode-checkbox-selectBackground: #252526;
--vscode-checkbox-foreground: #f0f0f0;
--vscode-checkbox-border: #6b6b6b;
--vscode-checkbox-selectBorder: #c5c5c5;
--vscode-keybindingLabel-background: rgba(128, 128, 128, 0.17);
--vscode-keybindingLabel-foreground: #cccccc;
--vscode-keybindingLabel-border: rgba(51, 51, 51, 0.6);
--vscode-keybindingLabel-bottomBorder: rgba(68, 68, 68, 0.6);
--vscode-list-focusOutline: #007fd4;
--vscode-list-activeSelectionBackground: #04395e;
--vscode-list-activeSelectionForeground: #ffffff;
--vscode-list-activeSelectionIconForeground: #ffffff;
--vscode-list-inactiveSelectionBackground: #37373d;
--vscode-list-hoverBackground: #2a2d2e;
--vscode-list-dropBackground: #383b3d;
--vscode-list-dropBetweenBackground: #c5c5c5;
--vscode-list-highlightForeground: #2aaaff;
--vscode-list-focusHighlightForeground: #2aaaff;
--vscode-list-invalidItemForeground: #b89500;
--vscode-list-errorForeground: #f88070;
--vscode-list-warningForeground: #cca700;
--vscode-listFilterWidget-background: #252526;
--vscode-listFilterWidget-outline: rgba(0, 0, 0, 0);
--vscode-listFilterWidget-noMatchesOutline: #be1100;
--vscode-listFilterWidget-shadow: rgba(0, 0, 0, 0.36);
--vscode-list-filterMatchBackground: rgba(234, 92, 0, 0.33);
--vscode-list-deemphasizedForeground: #8c8c8c;
--vscode-tree-indentGuidesStroke: #585858;
--vscode-tree-inactiveIndentGuidesStroke: rgba(88, 88, 88, 0.4);
--vscode-tree-tableColumnsBorder: rgba(204, 204, 204, 0.13);
--vscode-tree-tableOddRowsBackground: rgba(204, 204, 204, 0.04);
--vscode-editorActionList-background: #252526;
--vscode-editorActionList-foreground: #cccccc;
--vscode-editorActionList-focusForeground: #ffffff;
--vscode-editorActionList-focusBackground: #04395e;
--vscode-menu-border: #454545;
--vscode-menu-foreground: #cccccc;
--vscode-menu-background: #252526;
--vscode-menu-selectionForeground: #ffffff;
--vscode-menu-selectionBackground: #0078d4;
--vscode-menu-separatorBackground: #454545;
--vscode-quickInput-background: #252526;
--vscode-quickInput-foreground: #cccccc;
--vscode-quickInputTitle-background: rgba(255, 255, 255, 0.1);
--vscode-pickerGroup-foreground: #3794ff;
--vscode-pickerGroup-border: #3f3f46;
--vscode-quickInputList-focusForeground: #ffffff;
--vscode-quickInputList-focusIconForeground: #ffffff;
--vscode-quickInputList-focusBackground: #04395e;
--vscode-search-resultsInfoForeground: rgba(204, 204, 204, 0.65);
--vscode-searchEditor-findMatchBackground: rgba(234, 92, 0, 0.22);
--vscode-editor-lineHighlightBorder: #282828;
--vscode-editor-rangeHighlightBackground: rgba(255, 255, 255, 0.04);
--vscode-editor-symbolHighlightBackground: rgba(234, 92, 0, 0.33);
--vscode-editorCursor-foreground: #aeafad;
--vscode-editorMultiCursor-primary-foreground: #aeafad;
--vscode-editorMultiCursor-secondary-foreground: #aeafad;
--vscode-editorWhitespace-foreground: rgba(227, 228, 226, 0.16);
--vscode-editorLineNumber-foreground: #858585;
--vscode-editorIndentGuide-background: rgba(227, 228, 226, 0.16);
--vscode-editorIndentGuide-activeBackground: rgba(227, 228, 226, 0.16);
--vscode-editorIndentGuide-background1: #404040;
--vscode-editorIndentGuide-background2: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-background3: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-background4: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-background5: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-background6: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-activeBackground1: #707070;
--vscode-editorIndentGuide-activeBackground2: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-activeBackground3: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-activeBackground4: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-activeBackground5: rgba(0, 0, 0, 0);
--vscode-editorIndentGuide-activeBackground6: rgba(0, 0, 0, 0);
--vscode-editorActiveLineNumber-foreground: #c6c6c6;
--vscode-editorLineNumber-activeForeground: #c6c6c6;
--vscode-editorRuler-foreground: #5a5a5a;
--vscode-editorCodeLens-foreground: #999999;
--vscode-editorBracketMatch-background: rgba(0, 100, 0, 0.1);
--vscode-editorBracketMatch-border: #888888;
--vscode-editorOverviewRuler-border: rgba(127, 127, 127, 0.3);
--vscode-editorGutter-background: #1e1e1e;
--vscode-editorUnnecessaryCode-opacity: rgba(0, 0, 0, 0.67);
--vscode-editorGhostText-foreground: rgba(255, 255, 255, 0.34);
--vscode-editorOverviewRuler-rangeHighlightForeground: rgba(0, 122, 204, 0.6);
--vscode-editorOverviewRuler-errorForeground: rgba(255, 18, 18, 0.7);
--vscode-editorOverviewRuler-warningForeground: #cca700;
--vscode-editorOverviewRuler-infoForeground: #3794ff;
--vscode-editorBracketHighlight-foreground1: #ffd700;
--vscode-editorBracketHighlight-foreground2: #da70d6;
--vscode-editorBracketHighlight-foreground3: #179fff;
--vscode-editorBracketHighlight-foreground4: rgba(0, 0, 0, 0);
--vscode-editorBracketHighlight-foreground5: rgba(0, 0, 0, 0);
--vscode-editorBracketHighlight-foreground6: rgba(0, 0, 0, 0);
--vscode-editorBracketHighlight-unexpectedBracket-foreground: rgba(255, 18, 18, 0.8);
--vscode-editorBracketPairGuide-background1: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-background2: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-background3: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-background4: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-background5: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-background6: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-activeBackground1: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-activeBackground2: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-activeBackground3: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-activeBackground4: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-activeBackground5: rgba(0, 0, 0, 0);
--vscode-editorBracketPairGuide-activeBackground6: rgba(0, 0, 0, 0);
--vscode-editorUnicodeHighlight-border: #cca700;
--vscode-diffEditor-move-border: rgba(139, 139, 139, 0.61);
--vscode-diffEditor-moveActive-border: #ffa500;
--vscode-diffEditor-unchangedRegionShadow: #000000;
--vscode-editorOverviewRuler-bracketMatchForeground: #a0a0a0;
--vscode-symbolIcon-arrayForeground: #cccccc;
--vscode-symbolIcon-booleanForeground: #cccccc;
--vscode-symbolIcon-classForeground: #ee9d28;
--vscode-symbolIcon-colorForeground: #cccccc;
--vscode-symbolIcon-constantForeground: #cccccc;
--vscode-symbolIcon-constructorForeground: #b180d7;
--vscode-symbolIcon-enumeratorForeground: #ee9d28;
--vscode-symbolIcon-enumeratorMemberForeground: #75beff;
--vscode-symbolIcon-eventForeground: #ee9d28;
--vscode-symbolIcon-fieldForeground: #75beff;
--vscode-symbolIcon-fileForeground: #cccccc;
--vscode-symbolIcon-folderForeground: #cccccc;
--vscode-symbolIcon-functionForeground: #b180d7;
--vscode-symbolIcon-interfaceForeground: #75beff;
--vscode-symbolIcon-keyForeground: #cccccc;
--vscode-symbolIcon-keywordForeground: #cccccc;
--vscode-symbolIcon-methodForeground: #b180d7;
--vscode-symbolIcon-moduleForeground: #cccccc;
--vscode-symbolIcon-namespaceForeground: #cccccc;
--vscode-symbolIcon-nullForeground: #cccccc;
--vscode-symbolIcon-numberForeground: #cccccc;
--vscode-symbolIcon-objectForeground: #cccccc;
--vscode-symbolIcon-operatorForeground: #cccccc;
--vscode-symbolIcon-packageForeground: #cccccc;
--vscode-symbolIcon-propertyForeground: #cccccc;
--vscode-symbolIcon-referenceForeground: #cccccc;
--vscode-symbolIcon-snippetForeground: #cccccc;
--vscode-symbolIcon-stringForeground: #cccccc;
--vscode-symbolIcon-structForeground: #cccccc;
--vscode-symbolIcon-textForeground: #cccccc;
--vscode-symbolIcon-typeParameterForeground: #cccccc;
--vscode-symbolIcon-unitForeground: #cccccc;
--vscode-symbolIcon-variableForeground: #75beff;
--vscode-actionBar-toggledBackground: #383a49;
--vscode-peekViewTitle-background: #252526;
--vscode-peekViewTitleLabel-foreground: #ffffff;
--vscode-peekViewTitleDescription-foreground: rgba(204, 204, 204, 0.7);
--vscode-peekView-border: #3794ff;
--vscode-peekViewResult-background: #252526;
--vscode-peekViewResult-lineForeground: #bbbbbb;
--vscode-peekViewResult-fileForeground: #ffffff;
--vscode-peekViewResult-selectionBackground: rgba(51, 153, 255, 0.2);
--vscode-peekViewResult-selectionForeground: #ffffff;
--vscode-peekViewEditor-background: #001f33;
--vscode-peekViewEditorGutter-background: #001f33;
--vscode-peekViewEditorStickyScroll-background: #001f33;
--vscode-peekViewResult-matchHighlightBackground: rgba(234, 92, 0, 0.3);
--vscode-peekViewEditor-matchHighlightBackground: rgba(255, 143, 0, 0.6);
--vscode-editor-foldBackground: rgba(38, 79, 120, 0.3);
--vscode-editor-foldPlaceholderForeground: #808080;
--vscode-editorGutter-foldingControlForeground: #c5c5c5;
--vscode-editorSuggestWidget-background: #252526;
--vscode-editorSuggestWidget-border: #454545;
--vscode-editorSuggestWidget-foreground: #d4d4d4;
--vscode-editorSuggestWidget-selectedForeground: #ffffff;
--vscode-editorSuggestWidget-selectedIconForeground: #ffffff;
--vscode-editorSuggestWidget-selectedBackground: #04395e;
--vscode-editorSuggestWidget-highlightForeground: #2aaaff;
--vscode-editorSuggestWidget-focusHighlightForeground: #2aaaff;
--vscode-editorSuggestWidgetStatus-foreground: rgba(212, 212, 212, 0.5);
--vscode-editorMarkerNavigationError-background: #f14c4c;
--vscode-editorMarkerNavigationError-headerBackground: rgba(241, 76, 76, 0.1);
--vscode-editorMarkerNavigationWarning-background: #cca700;
--vscode-editorMarkerNavigationWarning-headerBackground: rgba(204, 167, 0, 0.1);
--vscode-editorMarkerNavigationInfo-background: #3794ff;
--vscode-editorMarkerNavigationInfo-headerBackground: rgba(55, 148, 255, 0.1);
--vscode-editorMarkerNavigation-background: #1e1e1e;
--vscode-editor-linkedEditingBackground: rgba(255, 0, 0, 0.3);
--vscode-editor-wordHighlightBackground: rgba(87, 87, 87, 0.72);
--vscode-editor-wordHighlightStrongBackground: rgba(0, 73, 114, 0.72);
--vscode-editor-wordHighlightTextBackground: rgba(87, 87, 87, 0.72);
--vscode-editorOverviewRuler-wordHighlightForeground: rgba(160, 160, 160, 0.8);
--vscode-editorOverviewRuler-wordHighlightStrongForeground: rgba(192, 160, 192, 0.8);
--vscode-editorOverviewRuler-wordHighlightTextForeground: rgba(160, 160, 160, 0.8);
--vscode-editorHoverWidget-highlightForeground: #2aaaff;
--vscode-editor-placeholder-foreground: rgba(255, 255, 255, 0.34);
--vscode-tab-activeBackground: #1e1e1e;
--vscode-tab-unfocusedActiveBackground: #1e1e1e;
--vscode-tab-inactiveBackground: #2d2d2d;
--vscode-tab-unfocusedInactiveBackground: #2d2d2d;
--vscode-tab-activeForeground: #ffffff;
--vscode-tab-inactiveForeground: rgba(255, 255, 255, 0.5);
--vscode-tab-unfocusedActiveForeground: rgba(255, 255, 255, 0.5);
--vscode-tab-unfocusedInactiveForeground: rgba(255, 255, 255, 0.25);
--vscode-tab-border: #252526;
--vscode-tab-lastPinnedBorder: rgba(204, 204, 204, 0.2);
--vscode-tab-selectedBackground: #222222;
--vscode-tab-selectedForeground: rgba(255, 255, 255, 0.63);
--vscode-tab-dragAndDropBorder: #ffffff;
--vscode-tab-activeModifiedBorder: #3399cc;
--vscode-tab-inactiveModifiedBorder: rgba(51, 153, 204, 0.5);
--vscode-tab-unfocusedActiveModifiedBorder: rgba(51, 153, 204, 0.5);
--vscode-tab-unfocusedInactiveModifiedBorder: rgba(51, 153, 204, 0.25);
--vscode-editorPane-background: #1e1e1e;
--vscode-editorGroupHeader-tabsBackground: #252526;
--vscode-editorGroupHeader-noTabsBackground: #1e1e1e;
--vscode-editorGroup-border: #444444;
--vscode-editorGroup-dropBackground: rgba(83, 89, 93, 0.5);
--vscode-editorGroup-dropIntoPromptForeground: #cccccc;
--vscode-editorGroup-dropIntoPromptBackground: #252526;
--vscode-sideBySideEditor-horizontalBorder: #444444;
--vscode-sideBySideEditor-verticalBorder: #444444;
--vscode-panel-background: #1e1e1e;
--vscode-panel-border: rgba(128, 128, 128, 0.35);
--vscode-panelTitle-activeForeground: #e7e7e7;
--vscode-panelTitle-inactiveForeground: rgba(231, 231, 231, 0.6);
--vscode-panelTitle-activeBorder: #e7e7e7;
--vscode-panel-dropBorder: #e7e7e7;
--vscode-panelSection-dropBackground: rgba(83, 89, 93, 0.5);
--vscode-panelSectionHeader-background: rgba(128, 128, 128, 0.2);
--vscode-panelSection-border: rgba(128, 128, 128, 0.35);
--vscode-panelStickyScroll-background: #1e1e1e;
--vscode-panelStickyScroll-shadow: #000000;
--vscode-banner-background: #04395e;
--vscode-banner-foreground: #ffffff;
--vscode-banner-iconForeground: #3794ff;
--vscode-statusBar-foreground: #ffffff;
--vscode-statusBar-noFolderForeground: #ffffff;
--vscode-statusBar-background: #007acc;
--vscode-statusBar-noFolderBackground: #68217a;
--vscode-statusBar-focusBorder: #ffffff;
--vscode-statusBarItem-activeBackground: rgba(255, 255, 255, 0.18);
--vscode-statusBarItem-focusBorder: #ffffff;
--vscode-statusBarItem-hoverBackground: rgba(255, 255, 255, 0.12);
--vscode-statusBarItem-hoverForeground: #ffffff;
--vscode-statusBarItem-compactHoverBackground: rgba(255, 255, 255, 0.2);
--vscode-statusBarItem-prominentForeground: #ffffff;
--vscode-statusBarItem-prominentBackground: rgba(0, 0, 0, 0.5);
--vscode-statusBarItem-prominentHoverForeground: #ffffff;
--vscode-statusBarItem-prominentHoverBackground: rgba(0, 0, 0, 0.3);
--vscode-statusBarItem-errorBackground: #c72e0f;
--vscode-statusBarItem-errorForeground: #ffffff;
--vscode-statusBarItem-errorHoverForeground: #ffffff;
--vscode-statusBarItem-errorHoverBackground: rgba(255, 255, 255, 0.12);
--vscode-statusBarItem-warningBackground: #7a6400;
--vscode-statusBarItem-warningForeground: #ffffff;
--vscode-statusBarItem-warningHoverForeground: #ffffff;
--vscode-statusBarItem-warningHoverBackground: rgba(255, 255, 255, 0.12);
--vscode-activityBar-background: #333333;
--vscode-activityBar-foreground: #ffffff;
--vscode-activityBar-inactiveForeground: rgba(255, 255, 255, 0.4);
--vscode-activityBar-activeBorder: #ffffff;
--vscode-activityBar-dropBorder: #ffffff;
--vscode-activityBarBadge-background: #007acc;
--vscode-activityBarBadge-foreground: #ffffff;
--vscode-activityBarTop-foreground: #e7e7e7;
--vscode-activityBarTop-activeBorder: #e7e7e7;
--vscode-activityBarTop-inactiveForeground: rgba(231, 231, 231, 0.6);
--vscode-activityBarTop-dropBorder: #e7e7e7;
--vscode-profileBadge-background: #4d4d4d;
--vscode-profileBadge-foreground: #ffffff;
--vscode-statusBarItem-remoteBackground: #16825d;
--vscode-statusBarItem-remoteForeground: #ffffff;
--vscode-statusBarItem-remoteHoverForeground: #ffffff;
--vscode-statusBarItem-remoteHoverBackground: rgba(255, 255, 255, 0.12);
--vscode-statusBarItem-offlineBackground: #6c1717;
--vscode-statusBarItem-offlineForeground: #ffffff;
--vscode-statusBarItem-offlineHoverForeground: #ffffff;
--vscode-statusBarItem-offlineHoverBackground: rgba(255, 255, 255, 0.12);
--vscode-extensionBadge-remoteBackground: #007acc;
--vscode-extensionBadge-remoteForeground: #ffffff;
--vscode-sideBar-background: #252526;
--vscode-sideBarTitle-background: #252526;
--vscode-sideBarTitle-foreground: #bbbbbb;
--vscode-sideBar-dropBackground: rgba(83, 89, 93, 0.5);
--vscode-sideBarSectionHeader-background: rgba(0, 0, 0, 0);
--vscode-sideBarSectionHeader-border: rgba(204, 204, 204, 0.2);
--vscode-sideBarActivityBarTop-border: rgba(204, 204, 204, 0.2);
--vscode-sideBarStickyScroll-background: #252526;
--vscode-sideBarStickyScroll-shadow: #000000;
--vscode-titleBar-activeForeground: #cccccc;
--vscode-titleBar-inactiveForeground: rgba(204, 204, 204, 0.6);
--vscode-titleBar-activeBackground: #3c3c3c;
--vscode-titleBar-inactiveBackground: rgba(60, 60, 60, 0.6);
--vscode-menubar-selectionForeground: #cccccc;
--vscode-menubar-selectionBackground: rgba(90, 93, 94, 0.31);
--vscode-commandCenter-foreground: #cccccc;
--vscode-commandCenter-activeForeground: #cccccc;
--vscode-commandCenter-inactiveForeground: rgba(204, 204, 204, 0.6);
--vscode-commandCenter-background: rgba(255, 255, 255, 0.05);
--vscode-commandCenter-activeBackground: rgba(255, 255, 255, 0.08);
--vscode-commandCenter-border: rgba(204, 204, 204, 0.2);
--vscode-commandCenter-activeBorder: rgba(204, 204, 204, 0.3);
--vscode-commandCenter-inactiveBorder: rgba(204, 204, 204, 0.15);
--vscode-notificationCenter-border: #303031;
--vscode-notificationToast-border: #303031;
--vscode-notifications-foreground: #cccccc;
--vscode-notifications-background: #252526;
--vscode-notificationLink-foreground: #3794ff;
--vscode-notificationCenterHeader-background: #303031;
--vscode-notifications-border: #303031;
--vscode-notificationsErrorIcon-foreground: #f14c4c;
--vscode-notificationsWarningIcon-foreground: #cca700;
--vscode-notificationsInfoIcon-foreground: #3794ff;
--vscode-inlineChat-foreground: #cccccc;
--vscode-inlineChat-background: #252526;
--vscode-inlineChat-border: #454545;
--vscode-inlineChat-shadow: rgba(0, 0, 0, 0.36);
--vscode-inlineChatInput-border: #454545;
--vscode-inlineChatInput-focusBorder: #007fd4;
--vscode-inlineChatInput-placeholderForeground: #a6a6a6;
--vscode-inlineChatInput-background: #3c3c3c;
--vscode-inlineChatDiff-inserted: rgba(156, 204, 44, 0.1);
--vscode-editorOverviewRuler-inlineChatInserted: rgba(156, 204, 44, 0.12);
--vscode-inlineChatDiff-removed: rgba(255, 0, 0, 0.1);
--vscode-editorOverviewRuler-inlineChatRemoved: rgba(255, 0, 0, 0.12);
--vscode-extensionButton-background: #0e639c;
--vscode-extensionButton-foreground: #ffffff;
--vscode-extensionButton-hoverBackground: #1177bb;
--vscode-extensionButton-separator: rgba(255, 255, 255, 0.4);
--vscode-extensionButton-prominentBackground: #0e639c;
--vscode-extensionButton-prominentForeground: #ffffff;
--vscode-extensionButton-prominentHoverBackground: #1177bb;
--vscode-chat-requestBorder: rgba(255, 255, 255, 0.1);
--vscode-chat-requestBackground: rgba(30, 30, 30, 0.62);
--vscode-chat-slashCommandBackground: rgba(52, 65, 75, 0.56);
--vscode-chat-slashCommandForeground: #40a6ff;
--vscode-chat-avatarBackground: #1f1f1f;
--vscode-chat-avatarForeground: #cccccc;
--vscode-terminal-foreground: #cccccc;
--vscode-terminal-selectionBackground: #264f78;
--vscode-terminal-inactiveSelectionBackground: #3a3d41;
--vscode-terminalCommandDecoration-defaultBackground: rgba(255, 255, 255, 0.25);
--vscode-terminalCommandDecoration-successBackground: #1b81a8;
--vscode-terminalCommandDecoration-errorBackground: #f14c4c;
--vscode-terminalOverviewRuler-cursorForeground: rgba(160, 160, 160, 0.8);
--vscode-terminal-border: rgba(128, 128, 128, 0.35);
--vscode-terminalOverviewRuler-border: rgba(127, 127, 127, 0.3);
--vscode-terminal-findMatchBackground: #515c6a;
--vscode-terminal-hoverHighlightBackground: rgba(38, 79, 120, 0.13);
--vscode-terminal-findMatchHighlightBackground: rgba(234, 92, 0, 0.33);
--vscode-terminalOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49);
--vscode-terminal-dropBackground: rgba(83, 89, 93, 0.5);
--vscode-terminal-initialHintForeground: rgba(255, 255, 255, 0.34);
--vscode-terminalStickyScrollHover-background: #2a2d2e;
--vscode-scmGraph-historyItemRefColor: #3794ff;
--vscode-scmGraph-historyItemRemoteRefColor: #b180d7;
--vscode-scmGraph-historyItemBaseRefColor: #ea5c00;
--vscode-scmGraph-historyItemHoverDefaultLabelForeground: #cccccc;
--vscode-scmGraph-historyItemHoverDefaultLabelBackground: #4d4d4d;
--vscode-scmGraph-historyItemHoverLabelForeground: #ffffff;
--vscode-scmGraph-historyItemHoverAdditionsForeground: #81b88b;
--vscode-scmGraph-historyItemHoverDeletionsForeground: #c74e39;
--vscode-scmGraph-foreground1: #ffb000;
--vscode-scmGraph-foreground2: #dc267f;
--vscode-scmGraph-foreground3: #994f00;
--vscode-scmGraph-foreground4: #40b0a6;
--vscode-scmGraph-foreground5: #b66dff;
--vscode-commentsView-resolvedIcon: rgba(204, 204, 204, 0.5);
--vscode-commentsView-unresolvedIcon: #007fd4;
--vscode-editorCommentsWidget-replyInputBackground: #252526;
--vscode-editorCommentsWidget-resolvedBorder: rgba(204, 204, 204, 0.5);
--vscode-editorCommentsWidget-unresolvedBorder: #007fd4;
--vscode-editorCommentsWidget-rangeBackground: rgba(0, 127, 212, 0.1);
--vscode-editorCommentsWidget-rangeActiveBackground: rgba(0, 127, 212, 0.1);
--vscode-editorGutter-commentRangeForeground: #37373d;
--vscode-editorOverviewRuler-commentForeground: #37373d;
--vscode-editorOverviewRuler-commentUnresolvedForeground: #37373d;
--vscode-editorGutter-commentGlyphForeground: #d4d4d4;
--vscode-editorGutter-commentUnresolvedGlyphForeground: #d4d4d4;
--vscode-activityWarningBadge-foreground: #000000;
--vscode-activityWarningBadge-background: #cca700;
--vscode-activityErrorBadge-foreground: #000000;
--vscode-activityErrorBadge-background: #f14c4c;
--vscode-ports-iconRunningProcessForeground: #369432;
--vscode-editorWatermark-foreground: rgba(212, 212, 212, 0.6);
--vscode-settings-headerForeground: #e7e7e7;
--vscode-settings-settingsHeaderHoverForeground: rgba(231, 231, 231, 0.7);
--vscode-settings-modifiedItemIndicator: #0c7d9d;
--vscode-settings-headerBorder: rgba(128, 128, 128, 0.35);
--vscode-settings-sashBorder: rgba(128, 128, 128, 0.35);
--vscode-settings-dropdownBackground: #3c3c3c;
--vscode-settings-dropdownForeground: #f0f0f0;
--vscode-settings-dropdownBorder: #3c3c3c;
--vscode-settings-dropdownListBorder: #454545;
--vscode-settings-checkboxBackground: #3c3c3c;
--vscode-settings-checkboxForeground: #f0f0f0;
--vscode-settings-checkboxBorder: #6b6b6b;
--vscode-settings-textInputBackground: #3c3c3c;
--vscode-settings-textInputForeground: #cccccc;
--vscode-settings-numberInputBackground: #3c3c3c;
--vscode-settings-numberInputForeground: #cccccc;
--vscode-settings-focusedRowBackground: rgba(42, 45, 46, 0.6);
--vscode-settings-rowHoverBackground: rgba(42, 45, 46, 0.3);
--vscode-settings-focusedRowBorder: #007fd4;
--vscode-keybindingTable-headerBackground: rgba(204, 204, 204, 0.04);
--vscode-keybindingTable-rowsBackground: rgba(204, 204, 204, 0.04);
--vscode-debugToolBar-background: #333333;
--vscode-debugIcon-startForeground: #89d185;
--vscode-notebook-cellBorderColor: #37373d;
--vscode-notebook-focusedEditorBorder: #007fd4;
--vscode-notebookStatusSuccessIcon-foreground: #89d185;
--vscode-notebookEditorOverviewRuler-runningCellForeground: #89d185;
--vscode-notebookStatusErrorIcon-foreground: #f48771;
--vscode-notebookStatusRunningIcon-foreground: #cccccc;
--vscode-notebook-cellToolbarSeparator: rgba(128, 128, 128, 0.35);
--vscode-notebook-selectedCellBackground: #37373d;
--vscode-notebook-selectedCellBorder: #37373d;
--vscode-notebook-focusedCellBorder: #007fd4;
--vscode-notebook-inactiveFocusedCellBorder: #37373d;
--vscode-notebook-cellStatusBarItemHoverBackground: rgba(255, 255, 255, 0.15);
--vscode-notebook-cellInsertionIndicator: #007fd4;
--vscode-notebookScrollbarSlider-background: rgba(121, 121, 121, 0.4);
--vscode-notebookScrollbarSlider-hoverBackground: rgba(100, 100, 100, 0.7);
--vscode-notebookScrollbarSlider-activeBackground: rgba(191, 191, 191, 0.4);
--vscode-notebook-symbolHighlightBackground: rgba(255, 255, 255, 0.04);
--vscode-notebook-cellEditorBackground: #252526;
--vscode-notebook-editorBackground: #1e1e1e;
--vscode-debugIcon-breakpointForeground: #e51400;
--vscode-debugIcon-breakpointDisabledForeground: #848484;
--vscode-debugIcon-breakpointUnverifiedForeground: #848484;
--vscode-debugIcon-breakpointCurrentStackframeForeground: #ffcc00;
--vscode-debugIcon-breakpointStackframeForeground: #89d185;
--vscode-editor-stackFrameHighlightBackground: rgba(255, 255, 0, 0.2);
--vscode-editor-focusedStackFrameHighlightBackground: rgba(122, 189, 122, 0.3);
--vscode-multiDiffEditor-headerBackground: #262626;
--vscode-multiDiffEditor-background: #1e1e1e;
--vscode-multiDiffEditor-border: rgba(204, 204, 204, 0.2);
--vscode-interactive-activeCodeBorder: #007acc;
--vscode-interactive-inactiveCodeBorder: #37373d;
--vscode-testing-iconFailed: #f14c4c;
--vscode-testing-iconErrored: #f14c4c;
--vscode-testing-iconPassed: #73c991;
--vscode-testing-runAction: #73c991;
--vscode-testing-iconQueued: #cca700;
--vscode-testing-iconUnset: #848484;
--vscode-testing-iconSkipped: #848484;
--vscode-testing-peekBorder: #f14c4c;
--vscode-testing-messagePeekBorder: #3794ff;
--vscode-testing-peekHeaderBackground: rgba(241, 76, 76, 0.1);
--vscode-testing-messagePeekHeaderBackground: rgba(55, 148, 255, 0.1);
--vscode-testing-coveredBackground: rgba(156, 204, 44, 0.2);
--vscode-testing-coveredBorder: rgba(156, 204, 44, 0.15);
--vscode-testing-coveredGutterBackground: rgba(156, 204, 44, 0.12);
--vscode-testing-uncoveredBranchBackground: #781212;
--vscode-testing-uncoveredBackground: rgba(255, 0, 0, 0.2);
--vscode-testing-uncoveredBorder: rgba(255, 0, 0, 0.15);
--vscode-testing-uncoveredGutterBackground: rgba(255, 0, 0, 0.3);
--vscode-testing-coverCountBadgeBackground: #4d4d4d;
--vscode-testing-coverCountBadgeForeground: #ffffff;
--vscode-testing-message-error-decorationForeground: #f14c4c;
--vscode-testing-message-error-lineBackground: rgba(255, 0, 0, 0.1);
--vscode-testing-message-info-decorationForeground: rgba(212, 212, 212, 0.5);
--vscode-testing-iconErrored-retired: rgba(241, 76, 76, 0.7);
--vscode-testing-iconFailed-retired: rgba(241, 76, 76, 0.7);
--vscode-testing-iconPassed-retired: rgba(115, 201, 145, 0.7);
--vscode-testing-iconQueued-retired: rgba(204, 167, 0, 0.7);
--vscode-testing-iconUnset-retired: rgba(132, 132, 132, 0.7);
--vscode-testing-iconSkipped-retired: rgba(132, 132, 132, 0.7);
--vscode-editorGutter-modifiedBackground: #1b81a8;
--vscode-editorGutter-addedBackground: #487e02;
--vscode-editorGutter-deletedBackground: #f14c4c;
--vscode-minimapGutter-modifiedBackground: #1b81a8;
--vscode-minimapGutter-addedBackground: #487e02;
--vscode-minimapGutter-deletedBackground: #f14c4c;
--vscode-editorOverviewRuler-modifiedForeground: rgba(27, 129, 168, 0.6);
--vscode-editorOverviewRuler-addedForeground: rgba(72, 126, 2, 0.6);
--vscode-editorOverviewRuler-deletedForeground: rgba(241, 76, 76, 0.6);
--vscode-debugExceptionWidget-border: #a31515;
--vscode-debugExceptionWidget-background: #420b0d;
--vscode-editor-inlineValuesForeground: rgba(255, 255, 255, 0.5);
--vscode-editor-inlineValuesBackground: rgba(255, 200, 0, 0.2);
--vscode-statusBar-debuggingBackground: #cc6633;
--vscode-statusBar-debuggingForeground: #ffffff;
--vscode-commandCenter-debuggingBackground: rgba(204, 102, 51, 0.26);
--vscode-debugTokenExpression-name: #c586c0;
--vscode-debugTokenExpression-type: #4a90e2;
--vscode-debugTokenExpression-value: rgba(204, 204, 204, 0.6);
--vscode-debugTokenExpression-string: #ce9178;
--vscode-debugTokenExpression-boolean: #4e94ce;
--vscode-debugTokenExpression-number: #b5cea8;
--vscode-debugTokenExpression-error: #f48771;
--vscode-debugView-exceptionLabelForeground: #cccccc;
--vscode-debugView-exceptionLabelBackground: #6c2022;
--vscode-debugView-stateLabelForeground: #cccccc;
--vscode-debugView-stateLabelBackground: rgba(136, 136, 136, 0.27);
--vscode-debugView-valueChangedHighlight: #569cd6;
--vscode-debugConsole-infoForeground: #3794ff;
--vscode-debugConsole-warningForeground: #cca700;
--vscode-debugConsole-errorForeground: #f48771;
--vscode-debugConsole-sourceForeground: #cccccc;
--vscode-debugConsoleInputIcon-foreground: #cccccc;
--vscode-debugIcon-pauseForeground: #75beff;
--vscode-debugIcon-stopForeground: #f48771;
--vscode-debugIcon-disconnectForeground: #f48771;
--vscode-debugIcon-restartForeground: #89d185;
--vscode-debugIcon-stepOverForeground: #75beff;
--vscode-debugIcon-stepIntoForeground: #75beff;
--vscode-debugIcon-stepOutForeground: #75beff;
--vscode-debugIcon-continueForeground: #75beff;
--vscode-debugIcon-stepBackForeground: #75beff;
--vscode-mergeEditor-change-background: rgba(155, 185, 85, 0.2);
--vscode-mergeEditor-change-word-background: rgba(156, 204, 44, 0.2);
--vscode-mergeEditor-changeBase-background: #4b1818;
--vscode-mergeEditor-changeBase-word-background: #6f1313;
--vscode-mergeEditor-conflict-unhandledUnfocused-border: rgba(255, 166, 0, 0.48);
--vscode-mergeEditor-conflict-unhandledFocused-border: #ffa600;
--vscode-mergeEditor-conflict-handledUnfocused-border: rgba(134, 134, 134, 0.29);
--vscode-mergeEditor-conflict-handledFocused-border: rgba(193, 193, 193, 0.8);
--vscode-mergeEditor-conflict-handled-minimapOverViewRuler: rgba(173, 172, 168, 0.93);
--vscode-mergeEditor-conflict-unhandled-minimapOverViewRuler: #fcba03;
--vscode-mergeEditor-conflictingLines-background: rgba(255, 234, 0, 0.28);
--vscode-mergeEditor-conflict-input1-background: rgba(64, 200, 174, 0.2);
--vscode-mergeEditor-conflict-input2-background: rgba(64, 166, 255, 0.2);
--vscode-extensionIcon-starForeground: #ff8e00;
--vscode-extensionIcon-verifiedForeground: #3794ff;
--vscode-extensionIcon-preReleaseForeground: #1d9271;
--vscode-extensionIcon-sponsorForeground: #d758b3;
--vscode-terminal-ansiBlack: #000000;
--vscode-terminal-ansiRed: #cd3131;
--vscode-terminal-ansiGreen: #0dbc79;
--vscode-terminal-ansiYellow: #e5e510;
--vscode-terminal-ansiBlue: #2472c8;
--vscode-terminal-ansiMagenta: #bc3fbc;
--vscode-terminal-ansiCyan: #11a8cd;
--vscode-terminal-ansiWhite: #e5e5e5;
--vscode-terminal-ansiBrightBlack: #666666;
--vscode-terminal-ansiBrightRed: #f14c4c;
--vscode-terminal-ansiBrightGreen: #23d18b;
--vscode-terminal-ansiBrightYellow: #f5f543;
--vscode-terminal-ansiBrightBlue: #3b8eea;
--vscode-terminal-ansiBrightMagenta: #d670d6;
--vscode-terminal-ansiBrightCyan: #29b8db;
--vscode-terminal-ansiBrightWhite: #e5e5e5;
--vscode-simpleFindWidget-sashBorder: #454545;
--vscode-terminalCommandGuide-foreground: #37373d;
--vscode-welcomePage-tileBackground: #252526;
--vscode-welcomePage-tileHoverBackground: #2c2c2d;
--vscode-welcomePage-tileBorder: rgba(255, 255, 255, 0.1);
--vscode-welcomePage-progress-background: #3c3c3c;
--vscode-welcomePage-progress-foreground: #3794ff;
--vscode-walkthrough-stepTitle-foreground: #ffffff;
--vscode-walkThrough-embeddedEditorBackground: rgba(0, 0, 0, 0.4);
--vscode-profiles-sashBorder: rgba(128, 128, 128, 0.35);
--vscode-gitDecoration-addedResourceForeground: #81b88b;
--vscode-gitDecoration-modifiedResourceForeground: #e2c08d;
--vscode-gitDecoration-deletedResourceForeground: #c74e39;
--vscode-gitDecoration-renamedResourceForeground: #73c991;
--vscode-gitDecoration-untrackedResourceForeground: #73c991;
--vscode-gitDecoration-ignoredResourceForeground: #8c8c8c;
--vscode-gitDecoration-stageModifiedResourceForeground: #e2c08d;
--vscode-gitDecoration-stageDeletedResourceForeground: #c74e39;
--vscode-gitDecoration-conflictingResourceForeground: #e4676b;
--vscode-gitDecoration-submoduleResourceForeground: #8db9e2;
--vscode-gitlens-gutterBackgroundColor: rgba(255, 255, 255, 0.07);
--vscode-gitlens-gutterForegroundColor: #bebebe;
--vscode-gitlens-gutterUncommittedForegroundColor: rgba(0, 188, 242, 0.6);
--vscode-gitlens-trailingLineBackgroundColor: rgba(0, 0, 0, 0);
--vscode-gitlens-trailingLineForegroundColor: rgba(153, 153, 153, 0.35);
--vscode-gitlens-lineHighlightBackgroundColor: rgba(0, 188, 242, 0.2);
--vscode-gitlens-lineHighlightOverviewRulerColor: rgba(0, 188, 242, 0.6);
--vscode-gitlens-openAutolinkedIssueIconColor: #3fb950;
--vscode-gitlens-closedAutolinkedIssueIconColor: #a371f7;
--vscode-gitlens-closedPullRequestIconColor: #f85149;
--vscode-gitlens-openPullRequestIconColor: #3fb950;
--vscode-gitlens-mergedPullRequestIconColor: #a371f7;
--vscode-gitlens-unpublishedChangesIconColor: #35b15e;
--vscode-gitlens-unpublishedCommitIconColor: #35b15e;
--vscode-gitlens-unpulledChangesIconColor: #b15e35;
--vscode-gitlens-decorations-addedForegroundColor: #81b88b;
--vscode-gitlens-decorations-copiedForegroundColor: #73c991;
--vscode-gitlens-decorations-deletedForegroundColor: #c74e39;
--vscode-gitlens-decorations-ignoredForegroundColor: #8c8c8c;
--vscode-gitlens-decorations-modifiedForegroundColor: #e2c08d;
--vscode-gitlens-decorations-untrackedForegroundColor: #73c991;
--vscode-gitlens-decorations-renamedForegroundColor: #73c991;
--vscode-gitlens-decorations-branchAheadForegroundColor: #35b15e;
--vscode-gitlens-decorations-branchBehindForegroundColor: #b15e35;
--vscode-gitlens-decorations-branchDivergedForegroundColor: #d8af1b;
--vscode-gitlens-decorations-branchMissingUpstreamForegroundColor: #c74e39;
--vscode-gitlens-decorations-statusMergingOrRebasingConflictForegroundColor: #c74e39;
--vscode-gitlens-decorations-statusMergingOrRebasingForegroundColor: #d8af1b;
--vscode-gitlens-decorations-workspaceRepoMissingForegroundColor: #909090;
--vscode-gitlens-decorations-workspaceCurrentForegroundColor: #35b15e;
--vscode-gitlens-decorations-workspaceRepoOpenForegroundColor: #35b15e;
--vscode-gitlens-decorations-worktreeHasUncommittedChangesForegroundColor: #e2c08d;
--vscode-gitlens-decorations-worktreeMissingForegroundColor: #c74e39;
--vscode-gitlens-graphLane1Color: #15a0bf;
--vscode-gitlens-graphLane2Color: #0669f7;
--vscode-gitlens-graphLane3Color: #8e00c2;
--vscode-gitlens-graphLane4Color: #c517b6;
--vscode-gitlens-graphLane5Color: #d90171;
--vscode-gitlens-graphLane6Color: #cd0101;
--vscode-gitlens-graphLane7Color: #f25d2e;
--vscode-gitlens-graphLane8Color: #f2ca33;
--vscode-gitlens-graphLane9Color: #7bd938;
--vscode-gitlens-graphLane10Color: #2ece9d;
--vscode-gitlens-graphChangesColumnAddedColor: #347d39;
--vscode-gitlens-graphChangesColumnDeletedColor: #c93c37;
--vscode-gitlens-graphMinimapMarkerHeadColor: #05e617;
--vscode-gitlens-graphScrollMarkerHeadColor: #05e617;
--vscode-gitlens-graphMinimapMarkerUpstreamColor: #09ae17;
--vscode-gitlens-graphScrollMarkerUpstreamColor: #09ae17;
--vscode-gitlens-graphMinimapMarkerHighlightsColor: #fbff0a;
--vscode-gitlens-graphScrollMarkerHighlightsColor: #fbff0a;
--vscode-gitlens-graphMinimapMarkerLocalBranchesColor: #3087cf;
--vscode-gitlens-graphScrollMarkerLocalBranchesColor: #3087cf;
--vscode-gitlens-graphMinimapMarkerPullRequestsColor: #c76801;
--vscode-gitlens-graphScrollMarkerPullRequestsColor: #c76801;
--vscode-gitlens-graphMinimapMarkerRemoteBranchesColor: #2b5e88;
--vscode-gitlens-graphScrollMarkerRemoteBranchesColor: #2b5e88;
--vscode-gitlens-graphMinimapMarkerStashesColor: #b34db3;
--vscode-gitlens-graphScrollMarkerStashesColor: #b34db3;
--vscode-gitlens-graphMinimapMarkerTagsColor: #6b562e;
--vscode-gitlens-graphScrollMarkerTagsColor: #6b562e;
--vscode-gitlens-launchpadIndicatorMergeableColor: #3fb950;
--vscode-gitlens-launchpadIndicatorMergeableHoverColor: #3fb950;
--vscode-gitlens-launchpadIndicatorBlockedColor: #c74e39;
--vscode-gitlens-launchpadIndicatorBlockedHoverColor: #c74e39;
--vscode-gitlens-launchpadIndicatorAttentionColor: #d8af1b;
--vscode-gitlens-launchpadIndicatorAttentionHoverColor: #d8af1b;
--vscode-remoteHub-decorations-addedForegroundColor: #81b88b;
--vscode-remoteHub-decorations-modifiedForegroundColor: #e2c08d;
--vscode-remoteHub-decorations-deletedForegroundColor: #c74e39;
--vscode-remoteHub-decorations-submoduleForegroundColor: #8db9e2;
--vscode-remoteHub-decorations-conflictForegroundColor: #e4676b;
--vscode-remoteHub-decorations-incomingAddedForegroundColor: #81b88b;
--vscode-remoteHub-decorations-incomingModifiedForegroundColor: #e2c08d;
--vscode-remoteHub-decorations-incomingDeletedForegroundColor: #c74e39;
--vscode-remoteHub-decorations-incomingRenamedForegroundColor: #73c991;
--vscode-remoteHub-decorations-possibleConflictForegroundColor: #cca700;
--vscode-remoteHub-decorations-ignoredResourceForeground: #8c8c8c;
--vscode-remoteHub-decorations-workspaceRepositoriesView-hasUncommittedChangesForegroundColor: #e2c08d;
--vscode-rust_analyzer-syntaxTreeBorder: #ffffff;
}

View File

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="612" height="612" viewBox="0 0 612 612" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="gradient_1" gradientUnits="userSpaceOnUse" x1="300" y1="0" x2="300" y2="600">
<stop offset="0" stop-color="#A1A7F6" />
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0.2" />
</linearGradient>
<linearGradient id="gradient_2" gradientUnits="userSpaceOnUse" x1="110.5" y1="0" x2="110.5" y2="221">
<stop offset="0.468" stop-color="#BFBAF6" />
<stop offset="1" stop-color="#FFFFFF" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-219" y="-219" width="221" height="221" id="filter_3">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
<linearGradient id="gradient_4" gradientUnits="userSpaceOnUse" x1="55.5" y1="0" x2="55.5" y2="111">
<stop offset="0" stop-color="#FFFFFF" />
<stop offset="1" stop-color="#A8A7F3" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-109" y="-109" width="111" height="111" id="filter_5">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
<linearGradient id="gradient_6" gradientUnits="userSpaceOnUse" x1="174" y1="0" x2="174" y2="348">
<stop offset="0.182" stop-color="#A594F6" />
<stop offset="1" stop-color="#F4E5FF" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-346" y="-346" width="348" height="348" id="filter_7">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
<linearGradient id="gradient_8" gradientUnits="userSpaceOnUse" x1="57" y1="0" x2="57" y2="114">
<stop offset="0" stop-color="#FFFFFF" />
<stop offset="0.614" stop-color="#C7BAF8" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-112" y="-112" width="114" height="114" id="filter_9">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
</defs>
<g transform="translate(6 2)">
<g>
<path d="M300 0C465.708 0 600 134.292 600 300C600 300 600 300 600 300C600 465.708 465.708 600 300 600C300 600 300 600 300 600C134.292 600 0 465.708 0 300C0 300 0 300 0 300C0 134.292 134.292 0 300 0Z" fill="#5A00FF" fill-rule="evenodd" />
<path d="M300 0C465.708 0 600 134.292 600 300C600 300 600 300 600 300C600 465.708 465.708 600 300 600C300 600 300 600 300 600C134.292 600 0 465.708 0 300C0 300 0 300 0 300C0 134.292 134.292 0 300 0Z" fill="url(#gradient_1)" fill-rule="evenodd" />
</g>
<path d="M0 110.5C0 49.4725 49.4725 0 110.5 0C171.527 0 221 49.4725 221 110.5C221 171.527 171.527 221 110.5 221C49.4725 221 0 171.527 0 110.5Z" fill="url(#gradient_2)" fill-rule="evenodd" filter="url(#filter_3)" transform="translate(293 324)" />
<path d="M0 55.5C0 24.8482 24.8482 0 55.5 0C86.1518 0 111 24.8482 111 55.5C111 86.1518 86.1518 111 55.5 111C24.8482 111 0 86.1518 0 55.5Z" fill="url(#gradient_4)" fill-rule="evenodd" filter="url(#filter_5)" transform="translate(48 269)" />
<path d="M0 174C0 77.9024 77.9024 0 174 0C270.098 0 348 77.9024 348 174C348 270.098 270.098 348 174 348C77.9024 348 0 270.098 0 174Z" fill="url(#gradient_6)" fill-rule="evenodd" filter="url(#filter_7)" transform="translate(188 56)" />
<path d="M0 57C0 25.5198 25.5198 0 57 0C88.4802 0 114 25.5198 114 57C114 88.4802 88.4802 114 57 114C25.5198 114 0 88.4802 0 57Z" fill="url(#gradient_8)" fill-rule="evenodd" filter="url(#filter_9)" transform="translate(388 129)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -1,115 +0,0 @@
<script setup lang="ts">
import OmHeader from './components/Header.vue';
import OmWhatNews from './components/WhatNews.vue';
import OmMoreFeature from './components/MoreFeature.vue';
import OmCoreFeature from './components/CoreFeature.vue';
import OmSponsor from './components/Sponsor.vue';
import OmResource from './components/Resource.vue';
import OmTroubleshoot from './components/Troubleshoot.vue';
import OmContributor from './components/Contributor.vue';
import data from './data.json';``
</script>
<template>
<main class="openmcp-news-root">
<om-header :version="data.version" />
<!-- 1. 📣 What is news in OpenMCP -->
<om-what-news :version="data.version" :changelogs="data.changelogs" />
<!-- 2. 🐳 Learn more features -->
<om-more-feature />
<!-- 3. Core Features -->
<om-core-feature />
<!-- 4. How to sponsor -->
<om-sponsor />
<!-- 5. 📚 Resources -->
<om-resource />
<!-- 6. 🔧 Troubleshooting -->
<om-troubleshoot />
<!-- 7. 👥 Contributors -->
<om-contributor :contributors="data.contributors" />
</main>
</template>
<style>
body {
color: var(--foreground, #222);
background: var(--background, #fff);
font-size: var(--vscode-font-size);
max-width: 900px;
margin: 0 auto;
padding: 2rem;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
}
.openmcp-news-root {
color: var(--foreground, #222);
background: var(--background, #fff);
padding: 32px 0 64px 0;
min-height: 100vh;
box-sizing: border-box;
max-width: 820px;
margin: 0 auto;
}
.release-link {
color: #B988D1;
font-weight: 500;
text-decoration: underline;
margin-bottom: 8px;
display: inline-block;
transition: color 0.2s;
}
.release-link:hover {
color: #8e5bbf;
}
.news-list {
list-style: none;
padding: 0;
margin: 0;
}
.news-badge {
display: inline-block;
background: #B988D1;
color: #fff;
border-radius: 8px;
font-size: 0.85em;
padding: 2px 10px;
margin-right: 10px;
font-weight: 500;
vertical-align: middle;
}
.openmcp-header {
display: flex;
justify-content: center;
align-items: center;
gap: 24px;
margin: 0 0 32px 0;
padding: 0 0 16px 0;
}
@media screen and (max-width: 600px) {
.openmcp-header {
flex-direction: column;
align-items: center;
}
}
.margin-bottom {
margin-bottom: 32px;
}
</style>

View File

@ -1,98 +0,0 @@
<script setup lang="ts">
import { ref, onMounted, reactive } from 'vue';
import VanillaTilt from 'vanilla-tilt';
const props = defineProps<{
contributors: {
username: string;
avatarUrl: string;
homeUrl: string;
}[];
}>();
const tiltElements = reactive<any[]>([]);
onMounted(() => {
// Tilt
tiltElements.forEach(el => {
VanillaTilt.init(el, {
max: 35,
speed: 400,
glare: true,
'max-glare': 0.2
});
});
});
</script>
<template>
<section class="troubleshoot-section">
<div class="section-title">👥 Contributors</div>
<div class="contributors-grid">
<div v-for="(contributor, idx) in props.contributors"
:key="contributor.username" class="contributor-tilt"
:ref="el => tiltElements[idx] = el"
>
<a :href="contributor.homeUrl" target="_blank">
<img :src="contributor.avatarUrl" :alt="contributor.username" class="contributor-avatar" />
<span class="contributor-name">{{ contributor.username }}</span>
</a>
</div>
</div>
</section>
</template>
<style>
.contributors-container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
.contributors-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 1.5rem;
margin-top: 2rem;
}
.contributor-tilt {
background: rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 1rem;
transition: transform 0.2s;
}
.contributor-tilt a {
text-decoration: none;
color: inherit;
display: flex;
flex-direction: column;
align-items: center;
}
.contributor-avatar {
width: 80px;
height: 80px;
border-radius: 50%;
object-fit: cover;
display: block;
margin: 0 auto 0.5rem;
border: 3px solid #fff;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.contributor-name {
display: block;
font-weight: 500;
color: #B988D1;
text-decoration: none;
}
/* Tilt.js 生成的眩光效果自定义 */
.tilt-glare {
border-radius: 12px !important;
}
</style>

View File

@ -1,92 +0,0 @@
<template>
<section class="core-section">
<div class="section-title"> Core Features</div>
<ul class="core-list">
<li class="core-card">
<span class="core-dot">🧩</span>
<span>Full support for all MCP protocols, including <b>stdio</b>, <b>SSE</b>, and <b>streamable HTTP</b> connection modes.</span>
<a href="https://openmcp.kirigaya.cn/plugin-tutorial/usage/debug.html" target="_blank">Learn more</a>
</li>
<li class="core-card">
<span class="core-dot">🧩</span>
<span>Connect Multiple MCP Servers and combine more mcp tools in just one instance.</span>
<a href="https://openmcp.kirigaya.cn/plugin-tutorial/usage/multi-server.html" target="_blank">Learn more</a>
</li>
<li class="core-card">
<span class="core-dot">🧩</span>
<span>One-click AI Mock data generation & Automatic mcp tool testing width custom and flexible order.</span>
<a href="https://openmcp.kirigaya.cn/sdk-tutorial/" target="_blank">Learn more</a>
</li>
<li class="core-card">
<span class="core-dot">🧩</span>
<span>Support function calling based on both <strong>XML</strong> and <strong>openai tools protocols.</strong></span>
<a href="https://openmcp.kirigaya.cn/sdk-tutorial/" target="_blank">Learn more</a>
</li>
<li class="core-card">
<span class="core-dot">🧩</span>
<span>Export connection as mcpconfig.json and deploy in openmcp-sdk</span>
<a href="https://openmcp.kirigaya.cn/sdk-tutorial/" target="_blank">Learn more</a>
</li>
<li class="core-card">
<span class="core-dot">🧩</span>
<span>Native VSCode experience, cross-platform support</span>
<a href="https://openmcp.kirigaya.cn/plugin-tutorial/quick-start/acquire-openmcp.html" target="_blank">Learn more</a>
</li>
</ul>
</section>
</template>
<style scoped>
.core-section {
margin-bottom: 20px;
}
.core-list {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 18px;
list-style: none;
padding: 0;
margin: 0;
}
@media (max-width: 950px) {
.core-list {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 630px) {
.core-list {
grid-template-columns: 1fr;
}
}
.core-card {
display: flex;
align-items: flex-start;
flex-direction: column;
gap: 12px;
padding: 1.5rem;
border-radius: 10px;
background-color: var(--vscode-sideBar-background);
transition: transform 0.2s ease, box-shadow 0.2s;
box-shadow: 0 2px 8px var(--vscode-widget-shadow, rgba(0,0,0,0.08));
font-size: 1.05em;
}
.core-card a {
color: #B988D1;
}
.core-card:hover {
transform: translateY(-4px) scale(1.025);
box-shadow: 0 6px 18px var(--vscode-widget-shadow, rgba(0,0,0,0.14));
}
.core-dot {
display: inline-block;
border-radius: 50%;
font-size: 30px;
flex-shrink: 0;
}
</style>

View File

@ -1,119 +0,0 @@
<script setup lang="ts">
const props = defineProps({
version: {
type: String,
default: '0.1.9'
}
});
</script>
<template>
<header class="openmcp-header">
<div class="openmcp-icon openmcp-logo"></div>
<div>
<h1>
OpenMCP Client<sup><small>{{ props.version }}</small></sup>
</h1>
<div class="links">
<a href="https://github.com/LSTM-Kirigaya/openmcp-client" target="_blank" title="GitHub">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"
style="vertical-align: middle;">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z">
</path>
</svg>
GitHub
</a>
<a href="https://github.com/LSTM-Kirigaya/openmcp-client/releases" target="_blank" title="Releases">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"
style="vertical-align: middle;">
<path
d="M21 10.975V8a2 2 0 00-2-2h-6V4.688c.305-.274.5-.668.5-1.11a1.5 1.5 0 00-3 0c0 .442.195.836.5 1.11V6H5a2 2 0 00-2 2v2.998l-.072.005A.999.999 0 002 12v2a1 1 0 001 1v5a2 2 0 002 2h14a2 2 0 002-2v-5a1 1 0 001-1v-1.975a1 1 0 00-.928-.997L21 10.975zm-5 5.025H8v-3h8v3z">
</path>
</svg>
Releases
</a>
<a href="https://openmcp.kirigaya.cn/" target="_blank" title="Website">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"
style="vertical-align: middle;">
<path
d="M12.001 1.993C6.486 1.994 2 6.48 2 11.994c0 5.514 4.486 9.999 10 10 5.515 0 10.001-4.485 10.001-10s-4.486-10-10-10.001zM12 19.994c-4.412 0-8.001-3.589-8.001-8s3.589-8 8-8.001C16.411 3.994 20 7.583 20 11.994c0 4.41-3.589 8-8 8z">
</path>
<path
d="M12.001 8.994l-4.005 4.005 1.414 1.414 2.591-2.591 2.591 2.591 1.414-1.414-4.005-4.005z">
</path>
</svg>
Website
</a>
<a href="https://discord.com/invite/SKTZRf6NzU" target="_blank" title="Discord">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"
style="vertical-align: middle;">
<path
d="M19.27 5.33C17.94 4.71 16.5 4.26 15 4a.09.09 0 00-.07.03c-.18.33-.39.76-.53 1.09a16.09 16.09 0 00-4.8 0c-.14-.34-.35-.76-.54-1.09-.01-.02-.04-.03-.07-.03-1.5.26-2.93.71-4.27 1.33-.01 0-.02.01-.03.02-2.72 4.07-3.47 8.03-3.1 11.95 0 .02.01.04.03.05 1.8 1.32 3.53 2.12 5.24 2.65.03.01.06 0 .07-.02.4-.55.76-1.13 1.07-1.74.02-.04 0-.08-.04-.09-.57-.22-1.11-.48-1.64-.78-.04-.02-.04-.08-.01-.11.11-.08.22-.17.33-.25.02-.02.05-.02.07-.01 3.44 1.57 7.15 1.57 10.55 0 .02-.01.05-.01.07.01.11.09.22.17.33.26.04.03.04.09-.01.11-.52.31-1.07.56-1.64.78-.04.01-.05.06-.04.09.32.61.68 1.19 1.07 1.74.03.01.06.02.09.01 1.72-.53 3.45-1.33 5.25-2.65.02-.01.03-.03.03-.05.44-4.53-.73-8.46-3.1-11.95-.01-.01-.02-.02-.04-.02zM8.52 14.91c-.99 0-1.8-.9-1.8-2s.79-2.01 1.8-2.01c1 0 1.81.9 1.81 2.01-.01 1.1-.8 2-1.81 2zm6.96 0c-.99 0-1.8-.9-1.8-2s.79-2.01 1.8-2.01c1 0 1.81.9 1.81 2.01-.01 1.1-.8 2-1.81 2z">
</path>
</svg>
Discord
</a>
<a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD"
target="_blank" title="QQ Group">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor">
<path d="M824.8 613.2c-16-51.4-34.4-94.6-62.7-165.3C766.5 262.2 689.3 112 511.5 112 331.7 112 256.2 265.2 261 447.9c-28.4 70.8-46.7 113.7-62.7 165.3-34 109.5-23 154.8-14.6 155.8 18 2.2 70.1-82.4 70.1-82.4 0 49 25.2 112.9 79.8 159-26.4 8.1-85.7 29.9-71.6 53.8 11.4 19.3 196.2 12.3 249.5 6.3 53.3 6 238.1 13 249.5-6.3 14.1-23.8-45.3-45.7-71.6-53.8 54.6-46.2 79.8-110.1 79.8-159 0 0 52.1 84.6 70.1 82.4 8.5-1.1 19.5-46.4-14.5-155.8z"></path>
</svg>
QQ Group
</a>
</div>
</div>
</header>
<hr>
</template>
<style>
.openmcp-logo {
display: inline-block;
width: 84px;
height: 84px;
border-radius: 16px;
vertical-align: middle;
}
hr {
border: none;
border-top: 1.5px solid #B988D1;
height: 0;
margin: 24px 0;
}
.openmcp-header h1 {
font-size: 2.1rem;
font-weight: bold;
margin: 0 0 20px 0;
display: flex;
justify-content: center;
color: #B988D1;
line-height: 1.2;
}
.openmcp-header .links {
display: flex;
flex-wrap: wrap;
gap: 16px;
justify-content: center;
margin-top: 4px;
}
.openmcp-header .links a {
color: var(--vscode-textLink-foreground);
font-weight: 500;
text-decoration: none;
display: flex;
align-items: center;
gap: 0.5rem;
transition: color 0.18s;
}
.openmcp-header .links a:hover {
color: #8e5bbf;
text-decoration: underline;
}
</style>

View File

@ -1,5 +0,0 @@
<template>
<div>
</div>
</template>

View File

@ -1,118 +0,0 @@
<script setup lang="ts">
import VanillaTilt from 'vanilla-tilt';
import { onMounted, ref } from 'vue';
const container = ref<any>(null);
onMounted(() => {
VanillaTilt.init(container.value, {
max: 12,
speed: 400,
glare: true,
'max-glare': 0.5
});
});
</script>
<template>
<section class="feature-section">
<div class="section-title">🐳 Learn More Features & Usage</div>
<div style="margin-bottom: 1.1rem;">Learn more about how to use openmcp to build your AI Agent & MCP fast</div>
<!-- <a href="https://www.youtube.com/embed/S7igsEhcLiw?si=6sqvbYJxSRoFS26g" target="_blank" class="bilibili-player-container" style="display:flex; width: 100%; justify-content: center;">
<iframe width="100%" height="580" src="https://www.youtube.com/embed/S7igsEhcLiw?si=6sqvbYJxSRoFS26g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</a> -->
<a href="https://www.youtube.com/watch?v=S7igsEhcLiw" target="_blank" class="bilibili-player-container">
<img src="https://pic1.zhimg.com/80/v2-951261f789708621a2c34faa5fa6f330_1440w.png" alt="" ref="container">
</a>
</section>
</template>
<style>
.feature-section {
margin-bottom: 20px;
}
.section-title {
font-size: 1.5rem;
font-weight: bold;
color: #B988D1;
margin-bottom: 12px;
}
.feature-cards {
display: flex;
flex-wrap: wrap;
gap: 18px;
}
.feature-card {
background: none;
border: 1.5px solid #B988D1;
border-radius: 10px;
padding: 18px 22px;
min-width: 180px;
flex: 1 1 180px;
color: var(--foreground, #222);
text-decoration: none;
transition: box-shadow 0.15s, border 0.15s;
box-shadow: 0 2px 8px 0 rgba(185, 136, 209, 0.04);
display: flex;
flex-direction: column;
gap: 6px;
}
.feature-card:hover {
border-color: #8e5bbf;
box-shadow: 0 4px 16px 0 rgba(185, 136, 209, 0.12);
}
.feature-card-title {
font-weight: bold;
color: #B988D1;
font-size: 1.1em;
}
.feature-card-desc {
font-size: 0.98em;
color: var(--foreground, #444);
opacity: 0.85;
}
.bilibili-player-container img {
max-width: 100%;
box-shadow: 0 4px 12px var(--vscode-widget-shadow);
border-radius: .5em;
}
.bilibili-player-container {
position: relative;
width: fit-content;
height: fit-content;
margin: 2rem 0;
border-radius: .5em;
overflow: hidden;
transition: box-shadow 0.3s ease, border-color 0.3s ease;
}
@media (max-width: 2700px) {
.bilibili-player-container {
width: 88%;
}
}
@media (max-width: 1200px) {
.bilibili-player-container {
width: 95%;
}
}
@media screen and (max-width: 741px) {
.bilibili-player-container iframe {
width: 100%;
}
}
</style>

View File

@ -1,98 +0,0 @@
<script setup lang="ts">
import { onMounted, ref } from 'vue';
const svgString = `
<svg width="84" height="84" viewBox="0 0 612 612" fill="none" xmlns="http://www.w3.org/2000/svg" class="openmcp-logo">
<defs>
<linearGradient id="gradient_1" gradientUnits="userSpaceOnUse" x1="300" y1="0" x2="300" y2="600">
<stop offset="0" stop-color="#A1A7F6" />
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0.2" />
</linearGradient>
<linearGradient id="gradient_2" gradientUnits="userSpaceOnUse" x1="110.5" y1="0" x2="110.5" y2="221">
<stop offset="0.468" stop-color="#BFBAF6" />
<stop offset="1" stop-color="#FFFFFF" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-219" y="-219" width="221" height="221" id="filter_3">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
<linearGradient id="gradient_4" gradientUnits="userSpaceOnUse" x1="55.5" y1="0" x2="55.5" y2="111">
<stop offset="0" stop-color="#FFFFFF" />
<stop offset="1" stop-color="#A8A7F3" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-109" y="-109" width="111" height="111" id="filter_5">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
<linearGradient id="gradient_6" gradientUnits="userSpaceOnUse" x1="174" y1="0" x2="174" y2="348">
<stop offset="0.182" stop-color="#A594F6" />
<stop offset="1" stop-color="#F4E5FF" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-346" y="-346" width="348" height="348" id="filter_7">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
<linearGradient id="gradient_8" gradientUnits="userSpaceOnUse" x1="57" y1="0" x2="57" y2="114">
<stop offset="0" stop-color="#FFFFFF" />
<stop offset="0.614" stop-color="#C7BAF8" />
</linearGradient>
<filter color-interpolation-filters="sRGB" x="-112" y="-112" width="114" height="114" id="filter_9">
<feFlood flood-opacity="0" result="BackgroundImageFix_1" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" in="SourceAlpha" />
<feOffset dx="0" dy="4" />
<feGaussianBlur stdDeviation="2" />
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" />
<feBlend mode="normal" in2="BackgroundImageFix_1" result="Shadow_2" />
<feBlend mode="normal" in="SourceGraphic" in2="Shadow_2" result="Shape_3" />
</filter>
</defs>
<g transform="translate(6 2)">
<g>
<path d="M300 0C465.708 0 600 134.292 600 300C600 300 600 300 600 300C600 465.708 465.708 600 300 600C300 600 300 600 300 600C134.292 600 0 465.708 0 300C0 300 0 300 0 300C0 134.292 134.292 0 300 0Z" fill="#5A00FF" fill-rule="evenodd" />
<path d="M300 0C465.708 0 600 134.292 600 300C600 300 600 300 600 300C600 465.708 465.708 600 300 600C300 600 300 600 300 600C134.292 600 0 465.708 0 300C0 300 0 300 0 300C0 134.292 134.292 0 300 0Z" fill="url(#gradient_1)" fill-rule="evenodd" />
</g>
<path d="M0 110.5C0 49.4725 49.4725 0 110.5 0C171.527 0 221 49.4725 221 110.5C221 171.527 171.527 221 110.5 221C49.4725 221 0 171.527 0 110.5Z" fill="url(#gradient_2)" fill-rule="evenodd" filter="url(#filter_3)" transform="translate(293 324)" />
<path d="M0 55.5C0 24.8482 24.8482 0 55.5 0C86.1518 0 111 24.8482 111 55.5C111 86.1518 86.1518 111 55.5 111C24.8482 111 0 86.1518 0 55.5Z" fill="url(#gradient_4)" fill-rule="evenodd" filter="url(#filter_5)" transform="translate(48 269)" />
<path d="M0 174C0 77.9024 77.9024 0 174 0C270.098 0 348 77.9024 348 174C348 270.098 270.098 348 174 348C77.9024 348 0 270.098 0 174Z" fill="url(#gradient_6)" fill-rule="evenodd" filter="url(#filter_7)" transform="translate(188 56)" />
<path d="M0 57C0 25.5198 25.5198 0 57 0C88.4802 0 114 25.5198 114 57C114 88.4802 88.4802 114 57 114C25.5198 114 0 88.4802 0 57Z" fill="url(#gradient_8)" fill-rule="evenodd" filter="url(#filter_9)" transform="translate(388 129)" />
</g>
</svg>
`;
const svgContainer = ref<HTMLElement | null>(null);
onMounted(() => {
if (svgContainer.value) {
svgContainer.value.innerHTML = svgString;
}
});
</script>
<template>
<span ref="svgContainer" class="openmcp-logo"></span>
</template>
<style>
.openmcp-logo {
display: inline-block;
width: 84px;
height: 84px;
border-radius: 16px;
vertical-align: middle;
}
</style>

View File

@ -1,45 +0,0 @@
<template>
<section class="resource-section">
<div class="section-title">📚 Resources</div>
<ul class="resource-list">
<li><a data-v-dd258f77="" class="VPNolebaseInlinePreviewLink" relative=""
href="https://www.bilibili.com/video/BV1zYGozgEHc" target="_blank" rel="noreferrer">MCP Series Video
Tutorials (Under Construction)</a></li>
<li><a data-v-dd258f77="" class="VPNolebaseInlinePreviewLink" relative=""
href="https://kirigaya.cn/blog/search?q=mcp" target="_blank" rel="noreferrer">Jin Hui's MCP Series
Blog</a></li>
<li><a data-v-dd258f77="" class="VPNolebaseInlinePreviewLink" relative=""
href="https://openmcp.kirigaya.cn/plugin-tutorial" target="_blank" rel="noreferrer">OpenMCP Official
Documentation</a></li>
<li><a data-v-dd258f77="" class="VPNolebaseInlinePreviewLink" relative=""
href="https://openmcp.kirigaya.cn/sdk-tutorial" target="_blank" rel="noreferrer">openmcp-sdk
Official Documentation</a></li>
</ul>
</section>
</template>
<style>
.resource-section {
margin-bottom: 20px;
padding-bottom: 16px;
}
.resource-list {
padding: 0;
margin: 0;
padding-left: 28px;
}
.resource-list li {
margin-bottom: 0.75rem;
}
.resource-list a {
color: #B988D1;
transition: color 0.2s;
}
.resource-list a:hover {
color: #8e5bbf;
}
</style>

View File

@ -1,61 +0,0 @@
<template>
<section class="sponsor-section">
<div class="section-title"> How to Sponsor</div>
<div class="sponsor-content">
<p>If you like openmcp, please support our work!</p>
<a class="sponsor-item" href="https://github.com/LSTM-Kirigaya/openmcp-client" target="_blank">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="vertical-align: middle;">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z">
</path>
</svg>
Github
</a>
<br>
<a class="sponsor-item" href="https://afdian.com/a/kirigaya" target="_blank">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.31-8.86c-1.77-.45-2.34-.94-2.34-1.67 0-.84.79-1.43 2.1-1.43 1.38 0 1.9.66 1.94 1.64h1.71c-.05-1.34-.87-2.57-2.49-2.97V5H10.9v1.69c-1.51.32-2.72 1.3-2.72 2.81 0 1.79 1.49 2.69 3.66 3.21 1.95.46 2.34 1.15 2.34 1.87 0 .53-.39 1.39-2.1 1.39-1.6 0-2.23-.72-2.32-1.64H8.04c.1 1.7 1.36 2.66 2.86 2.97V19h2.34v-1.67c1.52-.29 2.72-1.16 2.73-2.77-.01-2.2-1.9-2.96-3.66-3.42z">
</path>
</svg>
爱发电</a>
</div>
</section>
</template>
<style>
.sponsor-section {
margin-bottom: 20px;
padding-bottom: 16px;
}
.sponsor-content {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.sponsor-item {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
background-color: #B988D1;
color: var(--vscode-button-foreground);
border-radius: 4px;
text-decoration: none;
transition: transform 0.1s ease;
}
.sponsor-item:hover {
background-color: #8e5bbf;
transition: transform 0.1s ease;
}
.sponsor-item:active {
transform: scale(0.95);
transition: transform 0.1s ease;
}
</style>

View File

@ -1,44 +0,0 @@
<script setup lang="ts">
</script>
<template>
<section class="troubleshoot-section">
<div class="section-title">🔧 Troubleshooting</div>
<ul class="troubleshoot-list">
<li>
If the interface displays abnormally, try restarting VSCode or report an <a href="https://github.com/LSTM-Kirigaya/openmcp-client/issues" target="_blank">Issue</a>.
</li>
<li>
For more questions, refer to the <a href="https://openmcp.kirigaya.cn/" target="_blank">official
documentation</a> or join the community.</li>
<li>Contant Jinhui via <a href="mailto:1193466151@qq.com">1193466151@qq.com</a> to seek technical consultation or business cooperation.</li>
</ul>
</section>
</template>
<style>
.troubleshoot-section {
margin-bottom: 20px;
padding-bottom: 16px;
}
.troubleshoot-list {
list-style: disc inside;
padding-left: 18px;
color: var(--foreground, #444);
}
.troubleshoot-list li {
margin-bottom: 0.75rem;
}
.troubleshoot-list a {
color: #B988D1;
text-decoration: underline;
}
.troubleshoot-list a:hover {
color: #8e5bbf;
}
</style>

View File

@ -1,148 +0,0 @@
<script setup lang="ts">
import { computed } from 'vue';
const props = defineProps({
version: {
type: String,
default: '0.1.9'
},
changelogs: {
type: Array as () => string[],
default: () => [
'Brand new VSCode WebView adaptation, smoother experience https://example.com/image1.png',
'Support for AI Mock, toolchain visualization https://example.com/diagram.jpg and automatic topology detection',
'Multi-model concurrency, enhanced plugin capabilities https://example.com/arch.svg'
]
}
});
//
const processedChangelogs = computed(() => {
return props.changelogs.map(log => {
// https
const imageRegex = /(https:\/\/[^\s]+?\.(?:png|jpg|jpeg|gif|svg|webp))/gi;
const images = [];
let match;
// URL
while ((match = imageRegex.exec(log)) !== null) {
images.push(match[1]);
}
// URL
const text = log.replace(imageRegex, '').replace(/\s{2,}/g, ' ').trim();
return { text, images };
});
});
</script>
<template>
<section class="news-section">
<div class="news-title">
<span>📣 What's New in <span class="highlight">{{ props.version }}</span></span>
</div>
<div class="news-content">
<ul class="news-list">
<li v-for="(item, index) in processedChangelogs" :key="index">
<span class="news-badge">{{ '/' }}</span>
<div class="log-content">
<span>{{ item.text }}</span>
<div v-if="item.images.length" class="image-container">
<a v-for="(img, imgIndex) in item.images" :key="imgIndex" :href="img" target="_blank"
rel="noopener">
<img :src="img" alt="Changelog image" class="changelog-image" />
</a>
</div>
</div>
</li>
</ul>
<br>
<a class="release-link" href="https://openmcp.kirigaya.cn/preview/changelog.html" target="_blank"
rel="noopener">View History Changelog </a>
</div>
</section>
</template>
<style>
.news-section {
margin-bottom: 20px;
}
.news-title {
display: flex;
align-items: center;
font-size: 1.5rem;
font-weight: bold;
color: #B988D1;
margin-bottom: 10px;
}
.news-title .logo {
width: 38px;
height: 38px;
margin-right: 12px;
vertical-align: middle;
}
.news-title .highlight {
color: #B988D1;
}
.news-content {
border-radius: 12px;
padding: 2rem;
margin: 2rem 0;
background-color: var(--vscode-sideBar-background);
box-shadow: 0 2px 8px var(--vscode-widget-shadow);
}
.news-content li {
margin-bottom: 1.5rem;
display: flex;
align-items: flex-start;
}
.news-badge {
display: inline-block;
margin-right: 10px;
color: #B988D1;
font-weight: bold;
}
.log-content {
flex: 1;
}
.image-container {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
}
.changelog-image {
max-width: 100%;
max-height: 350px;
border-radius: 6px;
border: 1px solid var(--vscode-widget-border);
object-fit: contain;
background-color: var(--vscode-editor-background);
padding: 4px;
box-sizing: border-box;
transition: transform 0.2s ease;
}
.release-link {
color: #B988D1;
text-decoration: none;
font-weight: 500;
display: inline-block;
margin-top: 10px;
}
.release-link:hover {
text-decoration: underline;
}
</style>

View File

@ -1,151 +0,0 @@
:root {
--font-monospace-family: var(--vscode-editor-font-family);
--font-monospace-weight: var(--vscode-editor-font-weight);
--font-monospace-size: var(--vscode-editor-font-size);
--link-foreground: var(--vscode-textLink-foreground);
--link-active: var(--vscode-textLink-activeForeground);
/* UI & Control */
--input-active-background: var(--vscode-input-background);
--input-active-border: var(--vscode-focusBorder);
--input-active-foreground: var(--vscode-input-foreground);
--input-error-background: var(--vscode-inputValidation-errorBackground);
--input-error-border: var(--vscode-inputValidation-errorBorder);
--input-error-foreground: var(--vscode-inputValidation-errorForeground);
--input-foreground: var(--vscode-input-foreground);
--input-background: var(--vscode-input-background);
--input-border: var(--vscode-input-border);
--input-hover: var(--vscode-input-background);
--input-placeholder: var(--vscode-input-placeholderForeground);
--input-radius: 0px;
--scrollbar-background: var(--vscode-scrollbarSlider-background);
--scrollbar-hover: var(--vscode-scrollbarSlider-hoverBackground);
--scrollbar-active: var(--vscode-scrollbarSlider-activeBackground);
/* Window */
--title-bar: #1f1f1f;
--title-color: #fff;
--foreground: var(--vscode-editor-foreground);
--background: var(--vscode-editor-background);
--label: rgb(189, 189, 189);
--shadow: #000;
--border: var(--vscode-input-border);
--window-button-hover: rgba(255,255,255,0.1);
--window-button-active: rgba(255,255,255,0.2);
--window-blur-background: rgba(0,0,0,0.25);
--window-title-foreground: var(--foreground);
--window-background: var(--sidebar);
--window-border: transparent;
--window-radius: 0px;
/* Sidebar */
--sidebar: var(--vscode-sideBar-background);
--sidebar-border: var(--vscode-sideBar-border);
--sidebar-min-width: 280px;
--sidebar-item-text: var(--vscode-list-inactiveSelectionForeground);
--sidebar-item-border: var(--vscode-input-border);
--sidebar-item-background: var(--sidebar);
--sidebar-item-selected: var(--vscode-list-inactiveSelectionBackground);
--sidebar-item-hover: var(--vscode-list-hoverBackground);
--sidebar-item-max-height: 40px;
--sidebar-item-radix-background: var(--vscode-breadcrumb-background);
--sidebar-group-text: var(--vscode-sideBarSectionHeader-foreground);
--sidebar-group-border: var(--vscode-sideBarSectionHeader-border);
--sidebar-group-background: var(--vscode-sideBarSectionHeader-background);
/* Labels */
--signalSize-background: rgba(0,0,0,0.5);
--signalSize-border: rgba(255,255,255,0.2);
--signalSize-color: var(--foreground);
/* Color Picker */
--picker-swatch-size: 15px;
--picker-swatch-cols: 8;
--picker-background: var(--vscode-breadcrumbPicker-background);
--picker-border: var(--vscode-dropdown-border);
/* Search */
--search-background: var(--vscode-quickInput-background);
--search-border: var(--border);
--search-panel-background: transparent;
--search-panel-border: var(--vscode-pickerGroup-border);
--search-panel-text: var(--vscode-quickInput-foreground);
--search-label: var(--foreground);
--search-selected-background: var(--vscode-list-inactiveSelectionBackground);
/* Properties */
--properties-background: var(--vscode-breadcrumb-background);
--properties-border: var(--border);
/* Navbar */
--navBar-background: var(--sidebar);
--navBar-height: 32px;
--navBar-button: transparent;
--navBar-button-text: var(--foreground);
--navBar-group-background: var(--background);
--navBar-preview-background: var(--vscode-scrollbarSlider-background);
--navBar-slider-border: var(--foreground);
/* Buttons */
--button: var(--vscode-button-background);
--button-text: var(--vscode-button-foreground);
--button-hover: var(--vscode-button-hoverBackground);
--button-active: var(--vscode-button-hoverBackground);
--button-disabled: var(--vscode-activityBar-background);
--button-disabled-text: var(--vscode-activityBar-inactiveForeground);
/* Grid Lines */
--grid-dash: 2;
--grid-space: 4;
--grid-line: var(--vscode-editorIndentGuide-background);
--grid-tick: var(--vscode-editorIndentGuide-activeBackground);
/* Cursor */
--cursor: var(--vscode-editorCursor-foreground);
--cursor-ghost: rgba(255, 255, 255, 0.2);
--cursor-width: 2;
/* X-Axis */
--axis-height: 38px;
--axis-line: var(--border);
--axis-background: var(--vscode-sideBar-background);
--axis-foreground: var(--foreground);
/* Signals */
--signal-highlight: var(--vscode-list-inactiveSelectionBackground);
/* Colors */
--accent: var(--vscode-button-background);
--accent-dim: #234175;
--accent-bright: #24c5f7;
--accent-hover: var(--vscode-button-hoverBackground);
--vscode-font-size: 13px;
--color-red: #ff5252;
--color-pink: #ff4081;
--color-purple: #e040fb;
--color-deepPurple: #7c4dff;
--color-indigo: #536dfe;
--color-blue: #448aff;
--color-lightBlue: #40c4ff;
--color-cyan: #18ffff;
--color-teal: #64ffda;
--color-green: #69f0ae;
--color-lightGreen: #b2ff59;
--color-lime: #eeff41;
--color-yellow: #ffff00;
--color-amber: #ffd740;
--color-orange: #ffab40;
--color-deepOrange: #ff6e40;
/* Settings */
--settings-action-background: var(--background);
}

View File

@ -1,51 +0,0 @@
{
"version": "0.1.10",
"changelogs": [
"Fix issue #48: Correct the wrong boot path.",
"Support kimi's usage counting + support kimi's system prompt.",
"Implement parallel execution and pause functionality for openmcp tool testing. https://picx.zhimg.com/80/v2-4e09958d91dcf561c578294d8b6f3349_1440w.png",
"Revise the API speed test algorithm, splitting it into tps + queue time. https://picx.zhimg.com/80/v2-1cc3044a3ec3d5d21cb265dd67518ca0_1440w.png",
"The large model API speed test now supports custom prompts. https://picx.zhimg.com/80/v2-ff70af72254b82c11a941fe9cc29eeb8_1440w.png",
"Implement issue#49, tool module, debugging now supports markdown rendering echo. https://picx.zhimg.com/80/v2-5d708ccab00f33fdf63a656a0066bf23_1440w.png",
"Implement issue#54, right-click on the server list name to rename the server. https://picx.zhimg.com/80/v2-87c2a29abdd2dd56a4d18cc4a8b946ff_1440w.png",
"Fix some hot update issues related to resources and prompts.",
"Update the title of the tab created by vscode. https://picx.zhimg.com/80/v2-4d40c20f3eaa032573e4de58298c859f_1440w.png"
],
"contributors": [
{
"username": "LSTM-Kirigaya",
"avatarUrl": "https://avatars.githubusercontent.com/u/59416203?v=4",
"homeUrl": "https://github.com/LSTM-Kirigaya"
},
{
"username": "li1553770945",
"avatarUrl": "https://avatars.githubusercontent.com/u/55867654?v=4",
"homeUrl": "https://github.com/li1553770945"
},
{
"username": "STUzhy",
"avatarUrl": "https://avatars.githubusercontent.com/u/129645384?v=4",
"homeUrl": "https://github.com/STUzhy"
},
{
"username": "appli456",
"avatarUrl": "https://avatars.githubusercontent.com/u/8943691?v=4",
"homeUrl": "https://github.com/appli456"
},
{
"username": "cybermanhao",
"avatarUrl": "https://avatars.githubusercontent.com/u/37235140?v=4",
"homeUrl": "https://github.com/cybermanhao"
},
{
"username": "ArcStellar2025",
"avatarUrl": "https://avatars.githubusercontent.com/u/115577936?v=4",
"homeUrl": "https://github.com/ArcStellar2025"
},
{
"username": "ZYD045692",
"avatarUrl": "https://avatars.githubusercontent.com/u/206822796?v=4",
"homeUrl": "https://github.com/ZYD045692"
}
]
}

View File

@ -1,5 +0,0 @@
import './css/vscode.css';
import { createApp } from 'vue';
import App from './App.vue';
createApp(App).mount('#app')

View File

@ -1,12 +0,0 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"paths": {
"@/*": ["./src/*"]
}
}
}

View File

@ -1,11 +0,0 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.app.json"
}
]
}

View File

@ -1,19 +0,0 @@
{
"extends": "@tsconfig/node22/tsconfig.json",
"include": [
"vite.config.*",
"vitest.config.*",
"cypress.config.*",
"nightwatch.conf.*",
"playwright.config.*",
"eslint.config.*"
],
"compilerOptions": {
"noEmit": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"module": "ESNext",
"moduleResolution": "Bundler",
"types": ["node"]
}
}

View File

@ -1,20 +0,0 @@
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import { viteSingleFile } from 'vite-plugin-singlefile'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
// https://vite.dev/config/
export default defineConfig({
plugins: [
vue(),
vueDevTools(),
viteSingleFile(),
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
},
},
})

11
package-lock.json generated
View File

@ -52,7 +52,6 @@
"esbuild": "^0.25.5", "esbuild": "^0.25.5",
"fork-ts-checker-webpack-plugin": "^9.1.0", "fork-ts-checker-webpack-plugin": "^9.1.0",
"null-loader": "^4.0.1", "null-loader": "^4.0.1",
"ompipe": "^1.0.2",
"rollup": "^4.43.0", "rollup": "^4.43.0",
"rollup-plugin-copy": "^3.5.0", "rollup-plugin-copy": "^3.5.0",
"rollup-plugin-visualizer": "^6.0.1", "rollup-plugin-visualizer": "^6.0.1",
@ -10631,16 +10630,6 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/ompipe": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/ompipe/-/ompipe-1.0.2.tgz",
"integrity": "sha512-D9SbKT2fqSkVxQtp0AffMdSYNZiScA9YOrS0iymyt6Q4wLWyUzvxhmFcJO8AxlwYLZY/IddwirgM46EfeNdq4A==",
"dev": true,
"license": "ISC",
"dependencies": {
"chalk": "4.1.2"
}
},
"node_modules/on-exit-leak-free": { "node_modules/on-exit-leak-free": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",

View File

@ -2,7 +2,7 @@
"name": "openmcp", "name": "openmcp",
"displayName": "OpenMCP", "displayName": "OpenMCP",
"description": "An all in one MCP Client/TestTool", "description": "An all in one MCP Client/TestTool",
"version": "0.1.10", "version": "0.1.9",
"publisher": "kirigaya", "publisher": "kirigaya",
"private": true, "private": true,
"author": { "author": {
@ -107,20 +107,6 @@
"title": "%openmcp.hook.test-ocr.title%", "title": "%openmcp.hook.test-ocr.title%",
"category": "openmcp", "category": "openmcp",
"icon": "$(test)" "icon": "$(test)"
},
{
"command": "openmcp.hook.test-news",
"title": "%openmcp.hook.test-news.title%",
"category": "openmcp",
"icon": "$(test)"
},
{
"command": "openmcp.sidebar.installed-connection.changeConnectionName",
"title": "%openmcp.sidebar.installed-connection.changeConnectionName.title%"
},
{
"command": "openmcp.sidebar.workspace-connection.changeConnectionName",
"title": "%openmcp.sidebar.workspace-connection.changeConnectionName.title%"
} }
], ],
"menus": { "menus": {
@ -180,14 +166,6 @@
"view": "${viewItem}" "view": "${viewItem}"
} }
}, },
{
"command": "openmcp.sidebar.workspace-connection.changeConnectionName",
"group": "navigation@1",
"when": "view == openmcp.sidebar.workspace-connection && viewItem == workspace-item",
"args": {
"view": "${viewItem}"
}
},
{ {
"command": "openmcp.sidebar.installed-connection.revealWebviewPanel", "command": "openmcp.sidebar.installed-connection.revealWebviewPanel",
"group": "inline@1", "group": "inline@1",
@ -203,14 +181,6 @@
"args": { "args": {
"view": "${viewItem}" "view": "${viewItem}"
} }
},
{
"command": "openmcp.sidebar.installed-connection.changeConnectionName",
"group": "navigation@1",
"when": "view == openmcp.sidebar.workspace-connection && viewItem == installed-item",
"args": {
"view": "${viewItem}"
}
} }
] ]
}, },
@ -262,7 +232,6 @@
"lint": "eslint src --ext ts", "lint": "eslint src --ext ts",
"test": "node ./dist/test/e2e/runTest.js", "test": "node ./dist/test/e2e/runTest.js",
"prepare:ocr": "rollup -c rollup.tesseract.js --bundleConfigAsCjs", "prepare:ocr": "rollup -c rollup.tesseract.js --bundleConfigAsCjs",
"build:news": "npx tsx scripts/update-news-data.mts",
"build:task-loop": "npx vite build --config renderer/vite.config.task-loop.mjs && node renderer/scripts/task-loop.build.mjs" "build:task-loop": "npx vite build --config renderer/vite.config.task-loop.mjs && node renderer/scripts/task-loop.build.mjs"
}, },
"dependencies": { "dependencies": {
@ -306,7 +275,6 @@
"esbuild": "^0.25.5", "esbuild": "^0.25.5",
"fork-ts-checker-webpack-plugin": "^9.1.0", "fork-ts-checker-webpack-plugin": "^9.1.0",
"null-loader": "^4.0.1", "null-loader": "^4.0.1",
"ompipe": "^1.0.2",
"rollup": "^4.43.0", "rollup": "^4.43.0",
"rollup-plugin-copy": "^3.5.0", "rollup-plugin-copy": "^3.5.0",
"rollup-plugin-visualizer": "^6.0.1", "rollup-plugin-visualizer": "^6.0.1",

View File

@ -13,8 +13,5 @@
"openmcp.hook.test-ocr.title": "OCR をテスト", "openmcp.hook.test-ocr.title": "OCR をテスト",
"openmcp.sidebar.workspace-connection.view.title": "MCP 接続(ワークスペース)", "openmcp.sidebar.workspace-connection.view.title": "MCP 接続(ワークスペース)",
"openmcp.sidebar.installed-connection.view.title": "インストール済み MCP サーバー", "openmcp.sidebar.installed-connection.view.title": "インストール済み MCP サーバー",
"openmcp.sidebar.help.view.title": "はじめに・ヘルプ", "openmcp.sidebar.help.view.title": "はじめに・ヘルプ"
"openmcp.hook.test-news.title": "テストニュースレポート",
"openmcp.sidebar.installed-connection.changeConnectionName.title": "サーバー名を変更",
"openmcp.sidebar.workspace-connection.changeConnectionName.title": "サーバー名を変更"
} }

View File

@ -13,8 +13,5 @@
"openmcp.hook.test-ocr.title": "Test OCR", "openmcp.hook.test-ocr.title": "Test OCR",
"openmcp.sidebar.workspace-connection.view.title": "MCP Connections (Workspace)", "openmcp.sidebar.workspace-connection.view.title": "MCP Connections (Workspace)",
"openmcp.sidebar.installed-connection.view.title": "Installed MCP Servers", "openmcp.sidebar.installed-connection.view.title": "Installed MCP Servers",
"openmcp.sidebar.help.view.title": "Getting Started & Help", "openmcp.sidebar.help.view.title": "Getting Started & Help"
"openmcp.hook.test-news.title": "Test News Report",
"openmcp.sidebar.installed-connection.changeConnectionName.title": "Change Server Name",
"openmcp.sidebar.workspace-connection.changeConnectionName.title": "Change Server Name"
} }

View File

@ -13,8 +13,5 @@
"openmcp.hook.test-ocr.title": "测试 OCR", "openmcp.hook.test-ocr.title": "测试 OCR",
"openmcp.sidebar.workspace-connection.view.title": "MCP 连接 (工作区)", "openmcp.sidebar.workspace-connection.view.title": "MCP 连接 (工作区)",
"openmcp.sidebar.installed-connection.view.title": "安装的 MCP 服务器", "openmcp.sidebar.installed-connection.view.title": "安装的 MCP 服务器",
"openmcp.sidebar.help.view.title": "入门与帮助", "openmcp.sidebar.help.view.title": "入门与帮助"
"openmcp.hook.test-news.title": "测试新闻报告",
"openmcp.sidebar.installed-connection.changeConnectionName.title": "修改服务器名称",
"openmcp.sidebar.workspace-connection.changeConnectionName.title": "修改服务器名称"
} }

View File

@ -1,8 +1,8 @@
@font-face { @font-face {
font-family: "iconfont"; /* Project id 4870215 */ font-family: "iconfont"; /* Project id 4870215 */
src: url('iconfont.woff2?t=1751568095152') format('woff2'), src: url('iconfont.woff2?t=1750532923458') format('woff2'),
url('iconfont.woff?t=1751568095152') format('woff'), url('iconfont.woff?t=1750532923458') format('woff'),
url('iconfont.ttf?t=1751568095152') format('truetype'); url('iconfont.ttf?t=1750532923458') format('truetype');
} }
.iconfont { .iconfont {
@ -13,14 +13,6 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-pin:before {
content: "\e863";
}
.icon-serial:before {
content: "\e78f";
}
.icon-deploy:before { .icon-deploy:before {
content: "\e614"; content: "\e614";
} }

Binary file not shown.

View File

@ -24,7 +24,6 @@ import { userHasReadGuide } from './components/guide/tour';
import PasswordDialog from '@/components/password-dialog/index.vue'; import PasswordDialog from '@/components/password-dialog/index.vue';
import { privilegeStatus } from './components/password-dialog/status'; import { privilegeStatus } from './components/password-dialog/status';
import { useI18n } from 'vue-i18n';
const bridge = useMessageBridge(); const bridge = useMessageBridge();

View File

@ -1,7 +1,6 @@
import { pinkLog, redLog } from '@/views/setting/util'; import { pinkLog, redLog } from '@/views/setting/util';
import { acquireVsCodeApi, electronApi, getPlatform } from './platform'; import { acquireVsCodeApi, electronApi, getPlatform } from './platform';
import { isReactive } from 'vue'; import { isReactive } from 'vue';
import { v4 as uuidv4 } from 'uuid';
export interface VSCodeMessage { export interface VSCodeMessage {
command: string; command: string;
@ -10,7 +9,6 @@ export interface VSCodeMessage {
} }
export interface RestFulResponse<T = any> { export interface RestFulResponse<T = any> {
_id?: string
code: number; code: number;
msg: T; msg: T;
} }
@ -165,7 +163,7 @@ export class MessageBridge {
const command = message.command; const command = message.command;
const data = message.data; const data = message.data;
const handlers = this.handlers.get(command) || new Set(); const handlers = this.handlers.get(command) || [];
handlers.forEach(handler => handler(data)); handlers.forEach(handler => handler(data));
} }
@ -233,26 +231,15 @@ export class MessageBridge {
* @returns * @returns
*/ */
public commandRequest<T = any>(command: string, data?: ICommandRequestData): Promise<RestFulResponse<T>> { public commandRequest<T = any>(command: string, data?: ICommandRequestData): Promise<RestFulResponse<T>> {
const _id = uuidv4();
return new Promise<RestFulResponse>((resolve, reject) => { return new Promise<RestFulResponse>((resolve, reject) => {
const handler = this.addCommandListener(command, (data) => { this.addCommandListener(command, (data) => {
if (data._id === undefined) {
console.warn('detect data without id, data: ' + JSON.stringify(data, null, 2));
}
if (data._id === _id) {
handler();
resolve(data as RestFulResponse); resolve(data as RestFulResponse);
} }, { once: true });
}, { once: false });
this.postMessage({ this.postMessage({
command, command,
data: this.deserializeReactiveData({ data: this.deserializeReactiveData(data)
_id,
...data
})
}); });
}); });
} }

View File

@ -1,23 +1,23 @@
<template> <template>
<el-tour v-model="openTour"> <el-tour v-model="openTour">
<el-tour-step <el-tour-step
:next-button-props="{ children: t('begin') }" :next-button-props="{ children: '开始' }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t('introduction') }}</TourTitle> <TourTitle>介绍</TourTitle>
</template> </template>
<div style="display: flex; padding: 10px; padding-bottom: 20px;"> <div style="display: flex; padding: 10px; padding-bottom: 20px;">
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.1.1') }} 欢迎来到大模型与 mcp 的世界
<br><br> <br><br>
{{ t('guide.1.2') }} OpenMCP 将会助力你快速将任何奇思妙想开发成 mcp 服务器通过接入大模型让你的任何 idea 都可以快速落地
<br><br> <br><br>
{{ t('guide.1.3') }} 倘若阁下是第一次使用 OpenMCP请务必走完我们准备好的引导
</div> </div>
</div> </div>
@ -25,255 +25,254 @@
<el-tour-step <el-tour-step
target="#connected-status-container" target="#connected-status-container"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t('guide') }}</TourTitle> <TourTitle>引导</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.2.1') }} 这里会显示当前调试的 mcp 服务器的名称缩写和连接状态只有当连接状态为已连接调试工作才能开始
<br><br> <br><br>
{{ t('guide.2.2') }} OpenMCP 通过服务器名称对项目所的所有服务进行统一管理请避免在同一个项目中使用相同的名称
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
target="#sidebar-connect" target="#sidebar-connect"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step'), onClick: () => router.push(baseUrl + 'connect') }" :next-button-props="{ children: '下一步', onClick: () => router.push(baseUrl + 'connect') }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t("connect") }}</TourTitle> <TourTitle>连接</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.3.1') }} 如果显示未连接或阁下想要更改连接参数或者连接方式可以点击这里进入连接面板
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:target="mcpClientAdapter.clients[0].connectionSettingRef" :target="mcpClientAdapter.clients[0].connectionSettingRef"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
placement="right" placement="right"
> >
<template #header> <template #header>
<TourTitle>{{ t("connect") }}</TourTitle> <TourTitle>连接</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.4.1') }} 阁下可以在左侧面板选择与您心爱的 mcp 服务器进行连接的方式并填入对应的连接参数
<br><br> <br><br>
{{ t('guide.4.2') }} 对于 openmcp vscode/trae/cursor 插件端的用户当您通过面板按钮进入 openmcp 的时候默认就会选择 STDIO 作为连接方式并根据你的上下文生成启动参数
openmcp desktop 的用户可能就需要自己填写了Anyway这总比在你的好友电脑中植入 chrome 浏览器密码破解木马简单
{{ t('guide.4.3') }}
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:target="mcpClientAdapter.clients[0].connectionLogRef" :target="mcpClientAdapter.clients[0].connectionLogRef"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
placement="left" placement="left"
> >
<template #header> <template #header>
<TourTitle>{{ t("connect") }}</TourTitle> <TourTitle>连接</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.5.1') }} 连接响应会在这个地方打印出来如果出现绿色背景的信息代表连接成功
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:target="mcpServerAddRef" :target="mcpServerAddRef"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t("debug") }}</TourTitle> <TourTitle>调试</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.6.1') }} 你可以点击最右侧的加号来添加额外的 mcp 服务器让你当前正在调试的 agent 零成本快速获得额外的能力
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
target="#sidebar-debug" target="#sidebar-debug"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step'), onClick: () => router.push(baseUrl + 'debug') }" :next-button-props="{ children: '下一步', onClick: () => router.push(baseUrl + 'debug') }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t("debug") }}</TourTitle> <TourTitle>调试</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.7.1') }} 假设你已经成功连接了 mcp 服务器那么点击调试按钮你可以开始你的调试工作
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:target="welcomeRef" :target="welcomeRef"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
placement="right" placement="right"
> >
<template #header> <template #header>
<TourTitle>{{ t("debug") }}</TourTitle> <TourTitle>调试</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.8.1') }} 我们目前提供了四种主要调试选项资源提词工具分别和 MCP 协议中的 resourcespromptstools 对应
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:target="welcomeRef" :target="welcomeRef"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
placement="right" placement="right"
> >
<template #header> <template #header>
<TourTitle>{{ t("debug") }}</TourTitle> <TourTitle>调试</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.9.1') }} 交互测试则允许你直接将写好的 mcp 服务器放入大模型中直接做全链路测试从而更加获取更加真实的反馈和数据进而改进的你的 mcp 服务器
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:target="welcomeRef" :target="welcomeRef"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
placement="right" placement="right"
> >
<template #header> <template #header>
<TourTitle>{{ t("debug") }}</TourTitle> <TourTitle>调试</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.10.1') }} 基于我们在 agent rl 方向的最佳实践我们后续还会推出更多的调试和数据集聚合制作选项请期待吧
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
target="#sidebar-setting" target="#sidebar-setting"
:prev-button-props="{ children: t('prev-step'), onClick: () => router.push(baseUrl + 'debug') }" :prev-button-props="{ children: '上一步', onClick: () => router.push(baseUrl + 'debug') }"
:next-button-props="{ children: t('next-step'), onClick: () => router.push(baseUrl + 'setting') }" :next-button-props="{ children: '下一步', onClick: () => router.push(baseUrl + 'setting') }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t("setting") }}</TourTitle> <TourTitle>设置</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.11.1') }} 如果要进行交互测试请不要忘记先配置你常用的大模型 API
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:target="llmSettingRef" :target="llmSettingRef"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
placement="right" placement="right"
> >
<template #header> <template #header>
<TourTitle>{{ t("setting") }}</TourTitle> <TourTitle>设置</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.12.1') }} OpenMCP 目前支持所有支持 openai 接口规范的大模型比如 deepseekopenaikimi 等等
本地部署的 ollama 也正在支持
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
target="#add-new-server-button" target="#add-new-server-button"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t("setting") }}</TourTitle> <TourTitle>设置</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.13.1') }} 如果需要添加自定义的大模型服务请点击这里比如火山云阿里云硅基流动等
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
target="#test-llm-button" target="#test-llm-button"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t("setting") }}</TourTitle> <TourTitle>设置</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.14.1') }} 填写完成连接签名后点击这里来测试 大模型服务是否可以访问
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
target="#save-llm-button" target="#save-llm-button"
:prev-button-props="{ children: t('prev-step') }" :prev-button-props="{ children: '上一步' }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t("setting") }}</TourTitle> <TourTitle>设置</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
{{ t('guide.15.1') }} 最后请不要忘记点击保存按钮保存你的设置
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:prev-button-props="{ children: t('prev-step'), onClick: () => router.push(baseUrl + 'setting') }" :prev-button-props="{ children: '上一步', onClick: () => router.push(baseUrl + 'setting') }"
:next-button-props="{ children: t('next-step') }" :next-button-props="{ children: '下一步' }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>🎉 {{ t('congratulation') }}</TourTitle> <TourTitle>🎉 恭喜</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
🎉 {{ t('guide.16.1') }} 🎉 恭喜我的朋友现在的你已经是半个 mcp 专家了请充好一杯咖啡慢慢享用快乐的开发时间吧
<br> <br>
<br> <br>
<a href="https://openmcp.kirigaya.cn/" target="_blank">{{ t("openmcp-document") }}</a> <a href="https://kirigaya.cn/openmcp/" target="_blank">OpenMCP 官方文档</a> 是我们的文档站点您在其中能找到非常完整的使用说明和案例教程
{{ t('guide.16.2') }}
<br><br> <br><br>
{{ t('guide.16.3') }} 如果是插件用户左侧面板的最下面入门与帮助有一些我们准备好的资料希望能帮到阁下优雅地开发你的 mcp 服务器
{{ t('guide.16.4') }} 让我们一起把越来越多的 api sdk 接入 大模型吧
</div> </div>
</el-tour-step> </el-tour-step>
<el-tour-step <el-tour-step
:prev-button-props="{ children: t('prev-step'), onClick: () => router.push(baseUrl + 'setting') }" :prev-button-props="{ children: '上一步', onClick: () => router.push(baseUrl + 'setting') }"
:next-button-props="{ children: t('finish'), onClick: () => finishTour() }" :next-button-props="{ children: '结束', onClick: () => finishTour() }"
:show-close="false" :show-close="false"
> >
<template #header> <template #header>
<TourTitle>{{ t('maybe-end') }}</TourTitle> <TourTitle>终章</TourTitle>
</template> </template>
<div class="tour-common-text"> <div class="tour-common-text">
<pre><code style="color: unset !important; background-color: unset !important;" <pre><code style="color: unset !important; background-color: unset !important;"

View File

@ -167,11 +167,11 @@ const exportCode = async () => {
const gotoHowtoUse = () => { const gotoHowtoUse = () => {
if (locale.value === 'zh') { if (locale.value === 'zh') {
gotoWebsite('https://openmcp.kirigaya.cn/zh/sdk-tutorial/#%E4%BD%BF%E7%94%A8'); gotoWebsite('https://kirigaya.cn/openmcp/zh/sdk-tutorial/#%E4%BD%BF%E7%94%A8');
} else if (locale.value === 'ja') { } else if (locale.value === 'ja') {
gotoWebsite('https://openmcp.kirigaya.cn/ja/sdk-tutorial/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95'); gotoWebsite('https://kirigaya.cn/openmcp/ja/sdk-tutorial/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95');
} else { } else {
gotoWebsite('https://openmcp.kirigaya.cn/sdk-tutorial/#usage'); gotoWebsite('https://kirigaya.cn/openmcp/sdk-tutorial/#usage');
} }
} }

View File

@ -18,7 +18,6 @@ import { getXmlWrapperPrompt, getToolCallFromXmlString, getXmlsFromString, handl
export type ChatCompletionChunk = OpenAI.Chat.Completions.ChatCompletionChunk; export type ChatCompletionChunk = OpenAI.Chat.Completions.ChatCompletionChunk;
export interface TaskLoopChatOption { export interface TaskLoopChatOption {
id?: string id?: string
sessionId: string;
proxyServer?: string proxyServer?: string
enableXmlWrapper?: boolean enableXmlWrapper?: boolean
} }
@ -181,28 +180,15 @@ export class TaskLoop {
private handleChunkUsage(chunk: ChatCompletionChunk) { private handleChunkUsage(chunk: ChatCompletionChunk) {
const usage = chunk.usage; const usage = chunk.usage;
if (usage) { if (usage) {
this.completionUsage = usage; this.completionUsage = usage;
} else {
// 有一些模型会把 usage 放在 completion 中
const choice = chunk.choices[0] as any;
if (choice.usage) {
this.completionUsage = choice.usage;
}
} }
} }
private doConversation(chatData: ChatCompletionCreateParamsBase, toolcallIndexAdapter: (toolCall: ToolCall) => IToolCallIndex) { private doConversation(chatData: ChatCompletionCreateParamsBase, toolcallIndexAdapter: (toolCall: ToolCall) => IToolCallIndex) {
const sessionId = chatData.sessionId;
return new Promise<IDoConversationResult>((resolve, reject) => { return new Promise<IDoConversationResult>((resolve, reject) => {
const chunkHandler = this.bridge.addCommandListener('llm/chat/completions/chunk', data => { const chunkHandler = this.bridge.addCommandListener('llm/chat/completions/chunk', data => {
if (data.sessionId !== sessionId) {
return;
}
// data.code 一定为 200否则不会走这个 route // data.code 一定为 200否则不会走这个 route
const { chunk } = data.msg as { chunk: ChatCompletionChunk }; const { chunk } = data.msg as { chunk: ChatCompletionChunk };
@ -221,41 +207,30 @@ export class TaskLoop {
}, { once: false }); }, { once: false });
const doneHandler = this.bridge.addCommandListener('llm/chat/completions/done', data => { const doneHandler = this.bridge.addCommandListener('llm/chat/completions/done', data => {
if (data.sessionId !== sessionId) {
return;
}
this.consumeDones(); this.consumeDones();
chunkHandler(); chunkHandler();
errorHandler(); errorHandler();
doneHandler();
resolve({ resolve({
stop: false stop: false
}); });
}, { once: false }); }, { once: true });
const errorHandler = this.bridge.addCommandListener('llm/chat/completions/error', data => { const errorHandler = this.bridge.addCommandListener('llm/chat/completions/error', data => {
if (data.sessionId !== sessionId) {
return;
}
this.consumeErrors({ this.consumeErrors({
state: MessageState.ReceiveChunkError, state: MessageState.ReceiveChunkError,
msg: data.msg || '请求模型服务时发生错误' msg: data.msg || '请求模型服务时发生错误'
}); });
chunkHandler(); chunkHandler();
errorHandler();
doneHandler(); doneHandler();
resolve({ resolve({
stop: true stop: true
}); });
}, { once: false }); }, { once: true });
this.bridge.postMessage({ this.bridge.postMessage({
command: 'llm/chat/completions', command: 'llm/chat/completions',
@ -307,12 +282,10 @@ export class TaskLoop {
prompt += getXmlWrapperPrompt(tabStorage.settings.enableTools, tabStorage); prompt += getXmlWrapperPrompt(tabStorage.settings.enableTools, tabStorage);
} }
if (prompt) {
userMessages.push({ userMessages.push({
role: 'system', role: 'system',
content: prompt content: prompt
}); });
}
// 如果超出了 tabStorage.settings.contextLength, 则删除最早的消息 // 如果超出了 tabStorage.settings.contextLength, 则删除最早的消息
const loadMessages = tabStorage.messages.slice(- tabStorage.settings.contextLength); const loadMessages = tabStorage.messages.slice(- tabStorage.settings.contextLength);
@ -322,7 +295,7 @@ export class TaskLoop {
const id = crypto.randomUUID(); const id = crypto.randomUUID();
const chatData = { const chatData = {
sessionId: id, id,
baseURL, baseURL,
apiKey, apiKey,
model, model,
@ -593,7 +566,7 @@ export class TaskLoop {
break; break;
} }
this.currentChatId = chatData.sessionId; this.currentChatId = chatData.id!;
const llm = this.getLlmConfig(); const llm = this.getLlmConfig();
const toolcallIndexAdapter = getToolCallIndexAdapter(llm, chatData); const toolcallIndexAdapter = getToolCallIndexAdapter(llm, chatData);

View File

@ -6,7 +6,7 @@
<template #title> <template #title>
<h3 class="resource-template"> <h3 class="resource-template">
<span>resources/templates/list</span> <span>resources/templates/list</span>
<span class="iconfont icon-restart" @click.stop="reloadResources(client, { first: false })"></span> <span class="iconfont icon-restart" @click="reloadResources(client, { first: false })"></span>
</h3> </h3>
</template> </template>

View File

@ -6,7 +6,7 @@
<template #title> <template #title>
<h3 class="resource-template"> <h3 class="resource-template">
<span>resources/list</span> <span>resources/list</span>
<span class="iconfont icon-restart" @click.stop="reloadResources(client, { first: false })"></span> <span class="iconfont icon-restart" @click="reloadResources(client, { first: false })"></span>
</h3> </h3>
</template> </template>

View File

@ -2,17 +2,19 @@
<div class="diagram-item-record" v-if="props.dataView && props.dataView.tool"> <div class="diagram-item-record" v-if="props.dataView && props.dataView.tool">
<div class="item-header"> <div class="item-header">
<span class="item-title">{{ props.dataView.tool.name }}</span> <span class="item-title">{{ props.dataView.tool.name }}</span>
<span class="item-status" :class="props.dataView.status">{{ props.dataView.status }}</span>
</div> </div>
<div class="item-desc">{{ props.dataView.tool.description }}</div> <div class="item-desc">{{ props.dataView.tool.description }}</div>
<div v-if="props.dataView.function !== undefined" class="item-result">
<div class="item-label">Function</div>
<div class="item-json">{{ props.dataView.function.name }}</div>
</div>
<div v-if="props.dataView.function !== undefined" class="item-result"> <div v-if="props.dataView.function !== undefined" class="item-result">
<span class="item-label">Arguments</span> <span class="item-label">Arguments</span>
<div class="code-container">
<json-render :json="props.dataView.function.arguments" /> <json-render :json="props.dataView.function.arguments" />
</div> </div>
</div>
<div v-if="props.dataView.result !== undefined" class="item-result"> <div v-if="props.dataView.result !== undefined" class="item-result">
<span class="item-label">Result</span> <span class="item-label">Result</span>
@ -28,49 +30,6 @@
v-else-if="typeof props.dataView.result === 'string'">{{ props.dataView.result }}</pre> v-else-if="typeof props.dataView.result === 'string'">{{ props.dataView.result }}</pre>
<pre class="item-json" v-else>{{ formatJson(props.dataView.result) }}</pre> <pre class="item-json" v-else>{{ formatJson(props.dataView.result) }}</pre>
</div> </div>
<br>
<div class="item-meta">
<span v-if="props.dataView.createAt" class="item-meta-label">
Created: <b>{{ formatTime(props.dataView.createAt) }}</b>
</span>
<!-- <span v-if="props.dataView.finishAt" class="item-meta-label">
Finished: <b>{{ formatTime(props.dataView.finishAt) }}</b>
</span> -->
<!-- -->
</div>
<div class="item-timecost" v-if="props.dataView.llmTimecost !== undefined || props.dataView.toolcallTimecost !== undefined">
<template v-if="props.dataView.llmTimecost !== undefined && props.dataView.toolcallTimecost !== undefined">
<div class="timecost-bar">
<div
class="timecost-segment llm"
:style="{ width: llmPercent + '%' }"
:title="`LLM: ${props.dataView.llmTimecost}ms`"
></div>
<div
class="timecost-segment toolcall"
:style="{ width: toolcallPercent + '%' }"
:title="`ToolCall: ${props.dataView.toolcallTimecost}ms`"
></div>
</div>
<div class="timecost-labels">
<span class="llm-label">LLM: <b>{{ props.dataView.llmTimecost }}ms</b> ({{ llmPercent }}%)</span>
<span class="toolcall-label">ToolCall: <b>{{ props.dataView.toolcallTimecost }}ms</b> ({{ toolcallPercent }}%)</span>
</div>
</template>
<template v-else-if="props.dataView.llmTimecost !== undefined">
<div class="timecost-labels">
<span class="llm-label">LLM: <b>{{ props.dataView.llmTimecost }}ms</b></span>
</div>
</template>
<template v-else>
<div class="timecost-labels">
<span class="toolcall-label">ToolCall: <b>{{ props.dataView.toolcallTimecost }}ms</b></span>
</div>
</template>
</div>
</div> </div>
<div v-else class="diagram-item-record"> <div v-else class="diagram-item-record">
<div class="item-header"> <div class="item-header">
@ -85,7 +44,6 @@ import type { PropType } from 'vue';
import type { NodeDataView } from './diagram'; import type { NodeDataView } from './diagram';
import JsonRender from '@/components/json-render/index.vue'; import JsonRender from '@/components/json-render/index.vue';
import { computed } from 'vue';
const props = defineProps({ const props = defineProps({
dataView: { dataView: {
@ -101,27 +59,6 @@ function formatJson(obj: any) {
return String(obj) return String(obj)
} }
} }
//
function formatTime(val: string | number | Date) {
if (!val) return '-';
const d = new Date(val);
if (isNaN(d.getTime())) return '-';
return d.toLocaleString();
}
const llmPercent = computed(() => {
const l = props.dataView!.llmTimecost ?? 0;
const t = props.dataView!.toolcallTimecost ?? 0;
const sum = l + t;
return sum > 0 ? Math.round((l / sum) * 100) : 0;
});
const toolcallPercent = computed(() => {
const l = props.dataView!.llmTimecost ?? 0;
const t = props.dataView!.toolcallTimecost ?? 0;
const sum = l + t;
return sum > 0 ? Math.round((t / sum) * 100) : 0;
});
</script> </script>
<style scoped> <style scoped>
@ -148,29 +85,37 @@ const toolcallPercent = computed(() => {
} }
.item-status { .item-status {
font-size: 15px; font-size: 13px;
padding: 5px 0; padding: 2px 10px;
border-radius: 12px; border-radius: 12px;
margin-left: 8px;
text-transform: capitalize; text-transform: capitalize;
} }
.item-desc { .item-status.running {
margin-bottom: 15px; color: #2196f3;
opacity: 0.8;
font-size: 14px;
} }
.item-meta { .item-status.success {
margin-bottom: 8px; color: #43a047;
display: flex;
gap: 12px;
font-size: 13px;
color: #888;
flex-wrap: wrap;
} }
.item-meta-label b {
color: var(--main-color, #409EFF); .item-status.error {
font-weight: 500; color: #e53935;
}
.item-status.waiting {
color: #aaa;
}
.item-status.default {
color: #888;
}
.item-desc {
margin-bottom: 8px;
opacity: 0.8;
font-size: 14px;
} }
.item-label { .item-label {
@ -192,17 +137,8 @@ const toolcallPercent = computed(() => {
box-sizing: border-box; box-sizing: border-box;
} }
.code-container {
font-size: 13px;
margin-top: 10px;
border-radius: .3em;
padding: 0 10px;
background-color: var(--sidebar);
}
.item-result { .item-result {
margin-top: 6px; margin-top: 6px;
margin-bottom: 15px;
} }
.result-block { .result-block {
@ -213,6 +149,7 @@ const toolcallPercent = computed(() => {
max-width: 100%; max-width: 100%;
} }
.result-block.error { .result-block.error {
background-color: rgba(245, 108, 108, 0.5); background-color: rgba(245, 108, 108, 0.5);
} }
@ -220,49 +157,4 @@ const toolcallPercent = computed(() => {
.result-block.success { .result-block.success {
background-color: rgba(67, 160, 71, 0.5); background-color: rgba(67, 160, 71, 0.5);
} }
.item-timecost {
margin-bottom: 10px;
margin-top: 2px;
font-size: 14px;
color: #333;
}
.timecost-bar {
display: flex;
height: 12px;
border-radius: 6px;
overflow: hidden;
background: #f0eaff;
margin-bottom: 4px;
box-shadow: 0 1px 2px rgba(185,136,209,0.08);
}
.timecost-segment {
height: 100%;
transition: width 0.3s;
}
.llm {
background: #B988D1;
}
.toolcall {
background: #A1A7F6;
}
.timecost-labels {
display: flex;
gap: 18px;
font-size: 12px;
color: #888;
}
.llm-label b {
color: #B988D1;
}
.toolcall-label b {
color: #A1A7F6;
}
</style> </style>

View File

@ -41,17 +41,12 @@ export interface NodeDataView {
tool: ToolItem; tool: ToolItem;
status: 'default' | 'running' | 'waiting' | 'success' | 'error'; status: 'default' | 'running' | 'waiting' | 'success' | 'error';
function?: ChatCompletionChunk.Choice.Delta.ToolCall.Function; function?: ChatCompletionChunk.Choice.Delta.ToolCall.Function;
createAt?: number;
llmTimecost?: number;
toolcallTimecost?: number;
finishAt?: number;
result?: any; result?: any;
} }
export interface DiagramContext { export interface DiagramContext {
preset: (type: string) => void, reset: () => void,
render: () => void, render: () => void,
resetDataView: () => void,
state?: DiagramState, state?: DiagramState,
setCaption: (value: string) => void setCaption: (value: string) => void
} }
@ -162,7 +157,6 @@ export function topoSortParallel(state: DiagramState): string[][] {
return result; return result;
} }
export async function makeNodeTest( export async function makeNodeTest(
dataView: Reactive<NodeDataView>, dataView: Reactive<NodeDataView>,
enableXmlWrapper: boolean, enableXmlWrapper: boolean,
@ -174,12 +168,10 @@ export async function makeNodeTest(
} }
dataView.status = 'running'; dataView.status = 'running';
const createAt = Date.now();
dataView.createAt = createAt;
context.render(); context.render();
try { try {
const loop = new TaskLoop({ maxEpochs: 1, verbose: 0 }); const loop = new TaskLoop({ maxEpochs: 1 });
const usePrompt = (prompt || 'please call the tool {tool} to make some test').replace('{tool}', dataView.tool.name); const usePrompt = (prompt || 'please call the tool {tool} to make some test').replace('{tool}', dataView.tool.name);
const chatStorage = { const chatStorage = {
messages: [], messages: [],
@ -199,23 +191,26 @@ export async function makeNodeTest(
} }
} as ChatStorage; } as ChatStorage;
loop.setMaxEpochs(1);
let aiMockJson: any = undefined; let aiMockJson: any = undefined;
loop.registerOnToolCall(toolCall => { loop.registerOnToolCall(toolCall => {
dataView.function = toolCall.function; dataView.function = toolCall.function;
dataView.llmTimecost = Date.now() - createAt;
if (toolCall.function?.name === dataView.tool?.name) { if (toolCall.function?.name === dataView.tool?.name) {
try { try {
const toolArgs = JSON.parse(toolCall.function?.arguments || '{}'); const toolArgs = JSON.parse(toolCall.function?.arguments || '{}');
aiMockJson = toolArgs; aiMockJson = toolArgs;
} catch (e) { } catch (e) {
// ElMessage.error('AI 生成的 JSON 解析错误');
dataView.status = 'error'; dataView.status = 'error';
dataView.result = t('ai-gen-error-json'); dataView.result = t('ai-gen-error-json');
context.render(); context.render();
loop.abort(); loop.abort();
} }
} else { } else {
// ElMessage.error('AI 调用了未知的工具');
dataView.status = 'error'; dataView.status = 'error';
dataView.result = t('ai-invoke-unknown-tool') + ' ' + toolCall.function?.name; dataView.result = t('ai-invoke-unknown-tool') + ' ' + toolCall.function?.name;
context.render(); context.render();
@ -225,8 +220,6 @@ export async function makeNodeTest(
}); });
loop.registerOnToolCalled(toolCalled => { loop.registerOnToolCalled(toolCalled => {
dataView.toolcallTimecost = Date.now() - createAt - dataView.llmTimecost!;
if (toolCalled.state === MessageState.Success) { if (toolCalled.state === MessageState.Success) {
dataView.status = 'success'; dataView.status = 'success';
dataView.result = toolCalled.content; dataView.result = toolCalled.content;
@ -247,8 +240,6 @@ export async function makeNodeTest(
await loop.start(chatStorage, usePrompt); await loop.start(chatStorage, usePrompt);
} finally { } finally {
dataView.finishAt = Date.now();
if (dataView.status === 'running') { if (dataView.status === 'running') {
dataView.status = 'success'; dataView.status = 'success';
context.render(); context.render();

View File

@ -1,43 +1,27 @@
<template> <template>
<div style="display: flex; align-items: flex-start; gap: 32px;"> <div style="display: flex; align-items: center; gap: 16px;">
<div ref="svgContainer" class="diagram-container"></div> <div ref="svgContainer" class="diagram-container"></div>
<div class="diagram-info-panel">
<div style="display: flex; justify-content: space-between; align-items: center;"> <template v-for="(node, index) in state.nodes" :key="node.id + '-popup'">
<div v-if="infoNodeId && state.dataView.get(infoNodeId)" class="item-status" :class="state.dataView.get(infoNodeId)?.status || 'waiting'"> <transition name="collapse-from-top" mode="out-in">
{{ state.dataView.get(infoNodeId)?.status || 'waiting' }} <div
</div> v-show="state.hoverNodeId === node.id && state.dataView.get(node.id)?.status !== 'waiting'"
<div v-else> @mouseenter="setHoverItem(node.id)"
{{ "Unknown Status" }} @mouseleave="clearHoverItem()"
</div> :style="getNodePopupStyle(node)"
<el-button class="node-popup"
circle
size="small"
:type="state.pinnedNodeId ? 'primary' : 'default'"
@click="togglePin"
style="margin-bottom: 4px;"
:disabled="!infoNodeId"
> >
<span class="iconfont icon-pin"></span> <el-scrollbar height="100%" width="100%">
</el-button> <DiagramItemRecord :data-view="state.dataView.get(node.id)"/>
</div>
<template v-if="infoNodeId && state.dataView.get(infoNodeId)">
<el-scrollbar height="500px" width="300px">
<DiagramItemRecord :data-view="state.dataView.get(infoNodeId)" />
</el-scrollbar> </el-scrollbar>
</div>
</transition>
</template> </template>
<template v-else>
<div class="diagram-info-empty">
<div style="color: #bbb; font-size: 15px;">
{{ t('diagram-node-empty') }}
</div>
</div>
</template>
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, nextTick, reactive, inject, computed } from 'vue'; import { ref, onMounted, nextTick, reactive, inject } from 'vue';
import * as d3 from 'd3'; import * as d3 from 'd3';
import ELK from 'elkjs/lib/elk.bundled.js'; import ELK from 'elkjs/lib/elk.bundled.js';
import { mcpClientAdapter } from '@/views/connect/core'; import { mcpClientAdapter } from '@/views/connect/core';
@ -69,7 +53,6 @@ const state = reactive({
selectedNodeId: null as string | null, selectedNodeId: null as string | null,
draggingNodeId: null as string | null, draggingNodeId: null as string | null,
hoverNodeId: null as string | null, hoverNodeId: null as string | null,
pinnedNodeId: null as string | null, //
offset: { x: 0, y: 0 }, offset: { x: 0, y: 0 },
dataView: new Map<string, NodeDataView> dataView: new Map<string, NodeDataView>
}); });
@ -83,13 +66,8 @@ if (autoDetectDiagram) {
autoDetectDiagram.views?.forEach(item => { autoDetectDiagram.views?.forEach(item => {
state.dataView.set(item.tool.name, { state.dataView.set(item.tool.name, {
tool: item.tool, tool: item.tool,
function: item.function,
status: item.status || 'waiting', status: item.status || 'waiting',
result: item.result || null, result: item.result || null
createAt: item.createAt,
finishAt: item.finishAt,
llmTimecost: item.llmTimecost,
toolcallTimecost: item.toolcallTimecost
}); });
}); });
} else { } else {
@ -99,19 +77,20 @@ if (autoDetectDiagram) {
}; };
} }
console.log(tabStorage.autoDetectDiagram!.views);
console.log(state.dataView);
let cancelHoverHandler: NodeJS.Timeout | undefined = undefined; let cancelHoverHandler: NodeJS.Timeout | undefined = undefined;
const setHoverItem = (id: string) => { const setHoverItem = (id: string) => {
if (state.pinnedNodeId) return; // pinhover
if (cancelHoverHandler) { if (cancelHoverHandler) {
clearTimeout(cancelHoverHandler); clearTimeout(cancelHoverHandler);
} }
state.hoverNodeId = id; state.hoverNodeId = id;
}; }
const clearHoverItem = () => { const clearHoverItem = () => {
if (state.pinnedNodeId) return; // pinhover
cancelHoverHandler = setTimeout(() => { cancelHoverHandler = setTimeout(() => {
if (cancelHoverHandler) { if (cancelHoverHandler) {
clearTimeout(cancelHoverHandler); clearTimeout(cancelHoverHandler);
@ -122,19 +101,6 @@ const clearHoverItem = () => {
}, 300); }, 300);
}; };
// pin
function togglePin() {
if (state.pinnedNodeId) {
state.pinnedNodeId = null;
} else if (state.hoverNodeId) {
state.pinnedNodeId = state.hoverNodeId;
}
}
// pinnedNodeId
const infoNodeId = computed(() => state.pinnedNodeId || state.hoverNodeId);
const getAllTools = async () => { const getAllTools = async () => {
const items = []; const items = [];
for (const client of mcpClientAdapter.clients) { for (const client of mcpClientAdapter.clients) {
@ -222,7 +188,7 @@ const drawDiagram = async () => {
// dataView // dataView
state.dataView.set(tool.name, { state.dataView.set(tool.name, {
tool, tool,
status: 'waiting', status: 'waiting'
}); });
} }
} }
@ -421,7 +387,7 @@ function renderSvg() {
.attr('stroke-width', 2); .attr('stroke-width', 2);
}) })
.on('mouseout', function (event, d) { .on('mouseout', function (event, d) {
// clearHoverItem(); clearHoverItem();
if (state.selectedNodeId === d.id) return; if (state.selectedNodeId === d.id) return;
d3.select(this).select('rect') d3.select(this).select('rect')
.transition() .transition()
@ -591,7 +557,7 @@ function renderSvg() {
} }
// //
function serialConnection() { function resetConnections() {
if (!state.nodes.length) return; if (!state.nodes.length) return;
const edges = []; const edges = [];
for (let i = 0; i < state.nodes.length - 1; ++i) { for (let i = 0; i < state.nodes.length - 1; ++i) {
@ -607,21 +573,8 @@ function serialConnection() {
recomputeLayout().then(renderSvg); recomputeLayout().then(renderSvg);
} }
function parallelConnection() {
if (!state.nodes.length) return;
const edges = [] as Edge[];
state.edges = edges;
recomputeLayout().then(renderSvg);
}
const context = inject('context') as any; const context = inject('context') as any;
context.preset = (type: string) => { context.reset = resetConnections;
if (type === 'serial') {
serialConnection();
} else if (type === 'parallel') {
parallelConnection();
}
};
context.state = state; context.state = state;
context.render = renderSvg; context.render = renderSvg;
@ -662,34 +615,17 @@ function getNodePopupStyle(node: any): any {
height: `${popupHeight}px` height: `${popupHeight}px`
}; };
} }
//
function resetDataView() {
state.dataView.forEach((view, key) => {
state.dataView.set(key, {
...view,
status: 'waiting',
result: null,
createAt: undefined,
finishAt: undefined,
llmTimecost: undefined,
toolcallTimecost: undefined
});
});
}
context.resetDataView = resetDataView;
</script> </script>
<style> <style>
.diagram-container { .diagram-container {
width: 600px; width: 100%;
min-height: 200px; min-height: 200px;
display: flex;
justify-content: center;
align-items: flex-start;
border-radius: 8px; border-radius: 8px;
padding: 24px 0; padding: 24px 0;
display: flex;
justify-content: flex-start;
overflow-x: auto; overflow-x: auto;
} }
@ -715,62 +651,4 @@ context.resetDataView = resetDataView;
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
.diagram-container {
width: 600px;
min-height: 200px;
display: flex;
align-items: flex-start;
border-radius: 8px;
padding: 24px 0;
overflow-x: auto;
}
.diagram-info-panel {
position: absolute;
right: 30px;
top: 10px;
width: 300px;
min-height: 180px;
border: 1px solid var(--main-color);
border-radius: 12px;
box-shadow: 0 2px 12px 0 rgba(0,0,0,0.06);
padding: 10px;
display: flex;
flex-direction: column;
margin-top: 8px;
transition: box-shadow 0.2s;
}
.diagram-info-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
min-height: 120px;
opacity: 0.85;
font-size: 15px;
}
.item-status.running {
color: var(--main-color);
}
.item-status.success {
color: #43a047;
}
.item-status.error {
color: #e53935;
}
.item-status.waiting {
color: #aaa;
}
.item-status.default {
color: #888;
}
</style> </style>

View File

@ -4,30 +4,15 @@
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<span>Tool Diagram</span> <span>Tool Diagram</span>
&ensp; &ensp;
<!-- 重置按钮弹出下拉列表 --> <el-button size="small" type="primary" @click="() => context.reset()">{{ t("reset") }}</el-button>
<el-popover placement="bottom" width="180" trigger="click" v-model:visible="resetPopoverVisible"> <!-- 自检程序弹出表单 -->
<template #reference>
<el-button size="small" type="primary">
{{ t("preset") }}
</el-button>
</template>
<div style="display: flex; gap: 8px;">
<el-button size="small" @click="tomoPreset('serial')">
<span class="iconfont icon-serial"></span>
</el-button>
<el-button size="small" @click="tomoPreset('parallel')">
<span class="iconfont icon-parallel"></span>
</el-button>
</div>
</el-popover>
<!-- 原有自检程序弹出表单 -->
<el-popover placement="top" width="350" trigger="click" v-model:visible="testFormVisible"> <el-popover placement="top" width="350" trigger="click" v-model:visible="testFormVisible">
<template #reference> <template #reference>
<el-button size="small" type="primary"> <el-button size="small" type="primary">
{{ t('start-auto-detect') }} {{ t('start-auto-detect') }}
</el-button> </el-button>
</template> </template>
<!-- ...原有自检表单内容... -->
<el-input type="textarea" v-model="testPrompt" :rows="2" style="margin-bottom: 8px;" <el-input type="textarea" v-model="testPrompt" :rows="2" style="margin-bottom: 8px;"
placeholder="请输入 prompt" /> placeholder="请输入 prompt" />
<div style="display: flex; align-items: center; margin-bottom: 8px;"> <div style="display: flex; align-items: center; margin-bottom: 8px;">
@ -37,13 +22,6 @@
color: enableXmlWrapper ? 'var(--main-color)' : undefined color: enableXmlWrapper ? 'var(--main-color)' : undefined
}">XML</span> }">XML</span>
</div> </div>
<div style="display: flex; align-items: center; margin-bottom: 8px;">
<el-switch v-model="enableParallelTest" style="margin-right: 8px;" />
<span :style="{
opacity: enableParallelTest ? 1 : 0.7,
color: enableParallelTest ? 'var(--main-color)' : undefined
}">{{ t('parallel-test') }}</span>
</div>
<div style="text-align: right;"> <div style="text-align: right;">
<el-button size="small" @click="testFormVisible = false">{{ t("cancel") }}</el-button> <el-button size="small" @click="testFormVisible = false">{{ t("cancel") }}</el-button>
<el-button size="small" type="primary" @click="onTestConfirm"> <el-button size="small" type="primary" @click="onTestConfirm">
@ -56,24 +34,18 @@
<el-scrollbar height="80vh"> <el-scrollbar height="80vh">
<Diagram :tab-id="props.tabId" /> <Diagram :tab-id="props.tabId" />
</el-scrollbar> </el-scrollbar>
<transition name="main-fade" mode="out-in">
<div class="caption" v-if="showCaption"> <div class="caption" v-show="showCaption">
{{ caption }} {{ caption }}
</div> </div>
<div v-else> </transition>
<span class="caption">
<el-tooltip placement="top" effect="light" :content="t('self-detect-caption')">
<span class="iconfont icon-about"></span>
</el-tooltip>
</span>
</div>
</el-dialog> </el-dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, nextTick, provide, ref } from 'vue'; import { computed, nextTick, provide, ref } from 'vue';
import Diagram from './diagram.vue'; import Diagram from './diagram.vue';
import { makeNodeTest, topoSortParallel, type DiagramContext } from './diagram'; import { makeNodeTest, topoSortParallel, type DiagramContext, type DiagramState } from './diagram';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
@ -116,9 +88,8 @@ function setCaption(text: string) {
} }
const context: DiagramContext = { const context: DiagramContext = {
preset: () => { }, reset: () => { },
render: () => { }, render: () => { },
resetDataView: () => { },
state: undefined, state: undefined,
setCaption setCaption
}; };
@ -141,87 +112,48 @@ if (autoDetectDiagram) {
// //
const testFormVisible = ref(false); const testFormVisible = ref(false);
const enableXmlWrapper = ref(false); const enableXmlWrapper = ref(false);
const enableParallelTest = ref(true);
const testPrompt = ref('please call the tool {tool} to make some test'); const testPrompt = ref('please call the tool {tool} to make some test');
async function onTestConfirm() { async function onTestConfirm() {
testFormVisible.value = false; testFormVisible.value = false;
// enableXmlWrapper.value testPrompt.value
const state = context.state; const state = context.state;
tabStorage.autoDetectDiagram!.views = []; tabStorage.autoDetectDiagram!.views = [];
//
context.resetDataView();
context.render();
if (state) { if (state) {
const dispatches = topoSortParallel(state); const dispatches = topoSortParallel(state);
if (enableParallelTest.value) {
for (const nodeIds of dispatches) {
await Promise.all(nodeIds.map(async id => {
const view = state.dataView.get(id);
if (view) {
await makeNodeTest(view, enableXmlWrapper.value, testPrompt.value, context);
tabStorage.autoDetectDiagram!.views!.push({
tool: view.tool,
status: view.status,
function: view.function,
result: view.result,
createAt: view.createAt,
finishAt: view.finishAt,
llmTimecost: view.llmTimecost,
toolcallTimecost: view.toolcallTimecost,
});
context.render();
}
}));
}
} else {
//
for (const nodeIds of dispatches) { for (const nodeIds of dispatches) {
for (const id of nodeIds) { for (const id of nodeIds) {
const view = state.dataView.get(id); const view = state.dataView.get(id);
if (view) { if (view) {
await makeNodeTest(view, enableXmlWrapper.value, testPrompt.value, context); await makeNodeTest(view, enableXmlWrapper.value, testPrompt.value, context)
tabStorage.autoDetectDiagram!.views!.push({ tabStorage.autoDetectDiagram!.views!.push({
tool: view.tool, tool: view.tool,
status: view.status, status: view.status,
function: view.function, function: view.function,
result: view.result, result: view.result
createAt: view.createAt,
finishAt: view.finishAt,
llmTimecost: view.llmTimecost,
toolcallTimecost: view.toolcallTimecost,
}); });
context.render();
}
} }
} }
} }
} else { } else {
ElMessage.error('error'); ElMessage.error('error');
} }
}
const resetPopoverVisible = ref(false);
function tomoPreset(type: string) {
resetPopoverVisible.value = false;
context.preset?.(type);
} }
</script> </script>
<style> <style>
.no-padding-dialog { .no-padding-dialog {
margin-top: 30px !important; margin-top: 30px !important;
width: 90vw !important;
} }
.no-padding-dialog .caption { .no-padding-dialog .caption {
position: absolute; position: absolute;
right: 30px; left: 20px;
bottom: 10px; bottom: 10px;
margin: 0 auto; margin: 0 auto;
width: fit-content; width: fit-content;

View File

@ -2,13 +2,10 @@
<div class="tool-logger"> <div class="tool-logger">
<span> <span>
<span>{{ t('response') }}</span> <span>{{ t('response') }}</span>
<span style="width: 200px; display: flex;"> <span style="width: 200px;">
<el-segmented v-model="renderMode.current" :options="renderMode.data" size="default" <el-switch v-model="showRawJson" inline-prompt active-text="JSON" inactive-text="Text"
style="margin: 10px; background-color: var(--background); font-size: 12px;"> style="margin-left: 10px; width: 200px;"
<template #default="scope"> :inactive-action-style="'backgroundColor: var(--sidebar)'" />
{{ scope.item.label }}
</template>
</el-segmented>
</span> </span>
</span> </span>
<el-scrollbar height="500px"> <el-scrollbar height="500px">
@ -23,7 +20,7 @@
<div v-else> <div v-else>
<!-- 展示原本的信息 --> <!-- 展示原本的信息 -->
<template v-if="renderMode.current === 'plaintext'"> <template v-if="!showRawJson && tabStorage.lastToolCallResponse">
<div <div
v-for="(c, idx) in tabStorage.lastToolCallResponse!.content" v-for="(c, idx) in tabStorage.lastToolCallResponse!.content"
:key="idx" :key="idx"
@ -33,12 +30,8 @@
</div> </div>
</template> </template>
<template v-else-if="renderMode.current === 'markdown'">
<div class="markdown" v-html="resultMarkdown"></div>
</template>
<!-- 展示 json --> <!-- 展示 json -->
<template v-else-if="renderMode.current === 'json'"> <template v-else>
<json-render :json="tabStorage.lastToolCallResponse"/> <json-render :json="tabStorage.lastToolCallResponse"/>
</template> </template>
</div> </div>
@ -49,12 +42,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { defineComponent, defineProps, computed, ref, reactive } from 'vue'; import { defineComponent, defineProps, computed, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { tabs } from '../panel'; import { tabs } from '../panel';
import type { ToolStorage } from './tools'; import type { ToolStorage } from './tools';
import JsonRender from '@/components/json-render/index.vue'; import JsonRender from '@/components/json-render/index.vue';
import { markdownToHtml } from '../chat/markdown/markdown';
defineComponent({ name: 'tool-logger' }); defineComponent({ name: 'tool-logger' });
const { t } = useI18n(); const { t } = useI18n();
@ -69,37 +61,7 @@ const props = defineProps({
const tab = tabs.content[props.tabId]; const tab = tabs.content[props.tabId];
const tabStorage = tab.storage as ToolStorage; const tabStorage = tab.storage as ToolStorage;
const resultMarkdown = computed(() => { const showRawJson = ref(false);
const lastToolCallResponse = tabStorage.lastToolCallResponse;
if (!lastToolCallResponse) {
return '';
}
if (typeof lastToolCallResponse === 'string') {
return markdownToHtml(lastToolCallResponse.toString());
}
const rawText = lastToolCallResponse.content.map(c => c.text).join('\n\n');
const html = markdownToHtml(rawText);
return html;
})
const renderMode = reactive({
current: 'plaintext',
data: [
{
value: 'plaintext',
label: 'plaintext'
},
{
value: 'markdown',
label: 'markdown',
},
{
value: 'json',
label: 'json'
}
]
});
</script> </script>
@ -135,6 +97,12 @@ const renderMode = reactive({
min-height: 450px; min-height: 450px;
height: fit-content; height: fit-content;
font-family: var(--code-font-family); font-family: var(--code-font-family);
white-space: pre-wrap;
word-break: break-all;
user-select: text;
cursor: text;
font-size: 15px;
line-height: 1.5;
background-color: var(--sidebar); background-color: var(--sidebar);
} }

View File

@ -36,7 +36,6 @@ export function normaliseJavascriptType(type: string) {
} }
export const mcpSetting = reactive({ export const mcpSetting = reactive({
language: 'zh',
timeout: 60, timeout: 60,
proxyServer: '', proxyServer: '',
}); });

View File

@ -19,7 +19,6 @@ export async function loadSetting() {
llmManager.currentModelIndex = persistConfig.MODEL_INDEX || 0; llmManager.currentModelIndex = persistConfig.MODEL_INDEX || 0;
I18n.global.locale.value = persistConfig.LANG || 'zh'; I18n.global.locale.value = persistConfig.LANG || 'zh';
mcpSetting.language = persistConfig.LANG || 'zh';
mcpSetting.timeout = persistConfig.MCP_TIMEOUT_SEC || 60; mcpSetting.timeout = persistConfig.MCP_TIMEOUT_SEC || 60;
mcpSetting.proxyServer = persistConfig.PROXY_SERVER || ''; mcpSetting.proxyServer = persistConfig.PROXY_SERVER || '';

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "استدعت الذكاء الاصطناعي أداة غير معروفة", "ai-invoke-unknown-tool": "استدعت الذكاء الاصطناعي أداة غير معروفة",
"click-edge-to-delete": "انقر على الحافة للحذف", "click-edge-to-delete": "انقر على الحافة للحذف",
"select-node-define-test-tomo": "اختر عقدة أخرى لتحديد طوبولوجيا الاختبار", "select-node-define-test-tomo": "اختر عقدة أخرى لتحديد طوبولوجيا الاختبار",
"tool-self-detect": "الفحص الذاتي للأداة", "tool-self-detect": "الفحص الذاتي للأداة"
"self-detect-caption": "انقر على خط الاتصال لإلغاء التوصيل، انقر على العقدة لإنشاء اتصال",
"diagram-node-empty": "لا توجد معلومات عن العقدة",
"parallel-test": "اختبار متوازي",
"begin": "ابدأ",
"introduction": "مقدمة",
"prev-step": "الخطوة السابقة",
"next-step": "الخطوة التالية",
"guide.1.1": "مرحبًا بكم في عالم النماذج الكبيرة و MCP!",
"guide.1.2": "سوف يساعدك OpenMCP في تطوير أي فكرة إبداعية بسرعة إلى خادم MCP، من خلال دمج النماذج الكبيرة، لإنشاء وكيلك الخاص.",
"guide.1.3": "إذا كنت تستخدم OpenMCP لأول مرة، يرجى اتباع الدليل الذي أعددناه.",
"guide": "إرشاد",
"guide.2.1": "هنا سيتم عرض اسم خادم mcp الذي يتم تصحيحه (اختصار) وحالة الاتصال. لا يمكن بدء أعمال التصحيح إلا إذا كانت حالة الاتصال \"متصل\".",
"guide.2.2": "يقوم OpenMCP بإدارة جميع خدمات المشروع بشكل موحد عبر اسم الخادم، يرجى تجنب استخدام الاسم نفسه في المشروع الواحد",
"guide.3.1": "إذا ظهرت رسالة \"غير متصل\" أو إذا كنت ترغب في تغيير معلمات الاتصال أو طريقة الاتصال، يمكنك النقر هنا للانتقال إلى لوحة الاتصال.",
"guide.4.1": "يمكنك اختيار طريقة الاتصال بخادم MCP الذي تحبه في اللوحة اليسرى وإدخال معلمات الاتصال المقابلة.",
"guide.4.2": "للمستخدمين الذين يستخدمون إضافة openmcp vscode/trae/cursor، عند الدخول إلى openmcp عبر زر اللوحة، سيتم اختيار STDIO كطريقة اتصال افتراضية وسيتم إنشاء معلمات التشغيل بناءً على سياقك.",
"guide.4.3": "قد يحتاج مستخدمو openmcp desktop إلى ملء هذه المعلومات بأنفسهم. على أي حال، هذا أسهل من زرع حصان طروادة لاختراق كلمات مرور متصفح كروم في كمبيوتر صديقك.",
"guide.5.1": "سيتم طباعة استجابة الاتصال في هذا المكان، إذا ظهرت رسالة بخلفية خضراء، فهذا يعني أن الاتصال نجح.",
"guide.6.1": "يمكنك النقر على علامة الجمع الموجودة في أقصى اليمين لإضافة خادم MCP إضافي، مما يتيح للوكيل الذي تقوم بتصحيحه الحصول على قدرات إضافية بسرعة وبدون تكلفة.",
"guide.7.1": "افترض أنك قد نجحت في الاتصال بخادم mcp، فبالنقر على زر التصحيح، يمكنك بدء عمل التصحيح الخاص بك.",
"guide.8.1": "نحن نقدم حاليًا أربع خيارات تصحيح رئيسية، «الموارد»، «التعليمات البرمجية»، «الأدوات» تتوافق مع resources، prompts، tools في بروتوكول MCP على التوالي.",
"guide.9.1": "بينما يسمح لك «اختبار التفاعل» بوضع خادم MCP الذي كتبته مباشرة في النموذج الكبير لإجراء اختبار كامل للسلسلة، وبالتالي الحصول على ردود فعل وبيانات أكثر واقعية، ومن ثم تحسين خادم MCP الخاص بك.",
"guide.10.1": "استنادًا إلى أفضل الممارسات لدينا في مجال الوكيل وRL، سنقوم لاحقًا بإطلاق المزيد من خيارات التصحيح وتجميع مجموعات البيانات، فترقبوا ذلك!",
"guide.11.1": "إذا كنت تريد إجراء اختبار تفاعلي، فلا تنسَ تكوين واجهة برمجة التطبيقات للنموذج الكبير الذي تستخدمه بشكل شائع أولاً",
"guide.12.1": "OpenMCP يدحض حالياً جميع النماذج الكبيرة التي تدعم مواصفات واجهة openai، مثل deepseek، openai، kimi وغيرها.",
"guide.13.1": "إذا كنت بحاجة إلى إضافة خدمة نموذج كبير مخصصة، يرجى النقر هنا. على سبيل المثال، Volcano Cloud، Alibaba Cloud، Silicon Flow، إلخ.",
"guide.14.1": "بعد ملء توقيع الاتصال، انقر هنا لاختبار ما إذا كان يمكن الوصول إلى خدمة النموذج الكبير.",
"guide.15.1": "أخيرًا، لا تنس النقر على زر الحفظ لحفظ إعداداتك.",
"congratulation": "تهانينا",
"guide.16.1": "مبروك يا صديقي، الآن أنت خبير نصف ماسح في MCP، يرجى تحضير فنجان قهوة والاستمتاع بوقت تطوير سعيد!",
"guide.16.2": "هو موقعنا الوثائقي، حيث يمكنك العثور على إرشادات استخدام كاملة وشاملة ودروس تطبيقية.",
"guide.16.3": "إذا كنت مستخدمًا للإضافة، فهناك بعض المواد التي أعددناها في الجزء السفلي من اللوحة اليسرى تحت عنوان \"البدء والمساعدة\"، نأمل أن تساعدك في تطوير خادم MCP الخاص بك بشكل أنيق.",
"guide.16.4": "دعونا نعمل معًا على دمج المزيد والمزيد من APIs و SDKs في النموذج الكبير!",
"maybe-end": "الفصل الأخير؟",
"finish": "النهاية",
"queue-time": "وقت الانتظار"
} }

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "KI hat ein unbekanntes Tool aufgerufen", "ai-invoke-unknown-tool": "KI hat ein unbekanntes Tool aufgerufen",
"click-edge-to-delete": "Klicken Sie auf die Kante, um sie zu löschen", "click-edge-to-delete": "Klicken Sie auf die Kante, um sie zu löschen",
"select-node-define-test-tomo": "Wählen Sie einen anderen Knoten aus, um die Testtopologie zu definieren", "select-node-define-test-tomo": "Wählen Sie einen anderen Knoten aus, um die Testtopologie zu definieren",
"tool-self-detect": "Werkzeug-Selbsttest", "tool-self-detect": "Werkzeug-Selbsttest"
"self-detect-caption": "Klicken Sie auf die Verbindungslinie, um die Verbindung aufzuheben, klicken Sie auf den Knoten, um eine Verbindung herzustellen",
"diagram-node-empty": "Keine Knoteninformationen",
"parallel-test": "Paralleles Testen",
"begin": "Start",
"introduction": "Einführung",
"prev-step": "Zurück",
"next-step": "Weiter",
"guide.1.1": "Willkommen in der Welt der großen Modelle und MCP!",
"guide.1.2": "OpenMCP wird Ihnen helfen, jede kreative Idee schnell in einen MCP-Server zu entwickeln, indem Sie große Modelle integrieren, um Ihren eigenen Agenten zu erstellen.",
"guide.1.3": "Falls Sie OpenMCP zum ersten Mal verwenden, führen Sie bitte den von uns vorbereiteten Leitfaden durch.",
"guide": "Führung",
"guide.2.1": "Hier wird der Name des aktuell debuggten MCP-Servers (Abkürzung) und der Verbindungsstatus angezeigt. Debugging kann nur beginnen, wenn der Verbindungsstatus \"Verbunden\" lautet.",
"guide.2.2": "OpenMCP verwaltet alle Dienste eines Projekts einheitlich über den Servernamen. Bitte vermeiden Sie die Verwendung desselben Namens in einem Projekt.",
"guide.3.1": "Wenn \"Nicht verbunden\" angezeigt wird oder Sie die Verbindungsparameter oder die Verbindungsmethode ändern möchten, können Sie hier klicken, um zum Verbindungsmenü zu gelangen.",
"guide.4.1": "Sie können im linken Bereich die Verbindungsmethode zu Ihrem geliebten MCP-Server auswählen und die entsprechenden Verbindungsparameter eingeben.",
"guide.4.2": "Für Benutzer der openmcp vscode/trae/cursor-Erweiterung wird beim Betreten von openmcp über das Panel-Button standardmäßig STDIO als Verbindungsmethode ausgewählt, und die Startparameter werden basierend auf Ihrem Kontext generiert.",
"guide.4.3": "Benutzer von openmcp desktop müssen diese Informationen möglicherweise selbst ausfüllen. Jedenfalls ist das einfacher, als ein Chrome-Browser-Passwort-Trojaner auf dem Computer eines Freundes zu installieren.",
"guide.5.1": "Die Verbindungsantwort wird an dieser Stelle ausgegeben. Wenn eine Nachricht mit grünem Hintergrund erscheint, bedeutet dies, dass die Verbindung erfolgreich war.",
"guide.6.1": "Sie können auf das Pluszeichen ganz rechts klicken, um zusätzliche MCP-Server hinzuzufügen, damit der Agent, den Sie gerade debuggen, schnell und ohne zusätzliche Kosten zusätzliche Funktionen erhält.",
"guide.7.1": "Angenommen, Sie haben erfolgreich eine Verbindung zum MCP-Server hergestellt. Dann können Sie durch Klicken auf die Debug-Schaltfläche mit Ihrer Debug-Arbeit beginnen.",
"guide.8.1": "Wir bieten derzeit vier Hauptdebugging-Optionen an, „Ressourcen“, „Prompts“, „Tools“ entsprechen den resources, prompts, tools im MCP-Protokoll.",
"guide.9.1": "Der «Interaktionstest» ermöglicht es Ihnen, den geschriebenen MCP-Server direkt in das große Modell einzubringen, um einen vollständigen Link-Test durchzuführen, um realistischere Rückmeldungen und Daten zu erhalten und somit Ihren MCP-Server zu verbessern.",
"guide.10.1": "Basierend auf unseren Best Practices in den Bereichen Agent und RL werden wir in Zukunft weitere Debugging- und Datensatzaggregationsoptionen einführen. Bleiben Sie gespannt!",
"guide.11.1": "Wenn Sie einen Interaktionstest durchführen möchten, vergessen Sie nicht, zuerst die API Ihres häufig verwendeten großen Modells zu konfigurieren",
"guide.12.1": "OpenMCP unterstützt derzeit alle großen Modelle, die die OpenAI-Schnittstellenspezifikation unterstützen, wie z.B. deepseek, openai, kimi usw.",
"guide.13.1": "Wenn Sie einen benutzerdefinierten großen Modelldienst hinzufügen möchten, klicken Sie bitte hier. Zum Beispiel Volcano Cloud, Alibaba Cloud, Silicon Flow usw.",
"guide.14.1": "Nach dem Ausfüllen des Verbindungssignatur klicken Sie hier, um zu testen, ob der Großmodelldienst erreichbar ist.",
"guide.15.1": "Vergiss zum Schluss nicht, auf die Schaltfläche Speichern zu klicken, um deine Einstellungen zu speichern.",
"congratulation": "Glückwunsch",
"guide.16.1": "Glückwunsch, mein Freund, du bist jetzt ein halber MCP-Experte. Bereite dir eine Tasse Kaffee zu und genieße eine fröhliche Entwicklungszeit!",
"guide.16.2": "ist unsere Dokumentationsseite, auf der Sie sehr vollständige Gebrauchsanweisungen und Beispiel-Tutorials finden können.",
"guide.16.3": "Falls Sie ein Plugin-Benutzer sind, finden Sie unten im linken Panel unter \"Erste Schritte & Hilfe\" einige von uns vorbereitete Materialien, die Ihnen hoffentlich dabei helfen, Ihren MCP-Server elegant zu entwickeln.",
"guide.16.4": "Lasst uns gemeinsam immer mehr APIs und SDKs in das große Modell integrieren!",
"maybe-end": "Ende?",
"finish": "Ende",
"queue-time": "Wartezeit"
} }

View File

@ -157,7 +157,6 @@
"feedback": "Feedback", "feedback": "Feedback",
"waiting-mcp-server": "Waiting for MCP server response", "waiting-mcp-server": "Waiting for MCP server response",
"parallel-tool-calls": "Allow model to call multiple tools in single response", "parallel-tool-calls": "Allow model to call multiple tools in single response",
"parallel-test": "Parallel testing",
"proxy-server": "Proxy Server", "proxy-server": "Proxy Server",
"update-model-list": "Update Model List", "update-model-list": "Update Model List",
"preset-env-sync.success": "Preset environment variables synced", "preset-env-sync.success": "Preset environment variables synced",
@ -196,40 +195,5 @@
"ai-invoke-unknown-tool": "AI called an unknown tool", "ai-invoke-unknown-tool": "AI called an unknown tool",
"click-edge-to-delete": "Click the edge to delete", "click-edge-to-delete": "Click the edge to delete",
"select-node-define-test-tomo": "Select another node to define the test topology", "select-node-define-test-tomo": "Select another node to define the test topology",
"tool-self-detect": "Tool Self-Check", "tool-self-detect": "Tool Self-Check"
"self-detect-caption": "Click on the connection line to cancel the connection, click on the node to create a connection",
"diagram-node-empty": "No node information",
"begin": "Start",
"introduction": "Introduction",
"prev-step": "Previous",
"next-step": "Next",
"guide.1.1": "Welcome to the world of large models and MCP!",
"guide.1.2": "OpenMCP will help you quickly develop any creative idea into an MCP server, by integrating large models, to create your own Agent.",
"guide.1.3": "If you are using OpenMCP for the first time, please follow the guide we have prepared.",
"guide": "Guidance",
"guide.2.1": "Here will display the name (abbreviation) and connection status of the currently debugged mcp server. Debugging work can only begin when the connection status is \"Connected\".",
"guide.2.2": "OpenMCP uniformly manages all services of a project through the server name. Please avoid using the same name within the same project.",
"guide.3.1": "If \"Not connected\" is displayed or you want to change the connection parameters or connection method, you can click here to enter the connection panel.",
"guide.4.1": "You can select the connection method to your beloved MCP server in the left panel and enter the corresponding connection parameters.",
"guide.4.2": "For users of the openmcp vscode/trae/cursor plugin, when you enter openmcp via the panel button, STDIO will be selected as the connection method by default, and launch parameters will be generated based on your context.",
"guide.4.3": "Users of openmcp desktop may need to fill in this information themselves. Anyway, this is simpler than planting a Chrome browser password-cracking Trojan on your friend's computer.",
"guide.5.1": "The connection response will be printed here. If a message with a green background appears, it means the connection was successful.",
"guide.6.1": "You can click the plus sign on the far right to add additional MCP servers, allowing the agent you are currently debugging to quickly gain additional capabilities at no cost.",
"guide.7.1": "Assuming you have successfully connected to the mcp server, then by clicking the debug button, you can start your debugging work.",
"guide.8.1": "We currently offer four main debugging options, \"Resources\", \"Prompts\", \"Tools\" correspond to resources, prompts, tools in the MCP protocol respectively.",
"guide.9.1": "The «Interaction Test» allows you to directly place the written MCP server into the large model for a full-link test, thereby obtaining more realistic feedback and data, and thus improving your MCP server.",
"guide.10.1": "Based on our best practices in the agent and RL directions, we will subsequently introduce more debugging and dataset aggregation options, so stay tuned!",
"guide.11.1": "If you want to perform an interaction test, don't forget to configure the API of your commonly used large model first",
"guide.12.1": "OpenMCP currently supports all large models that comply with the openai interface specification, such as deepseek, openai, kimi, etc.",
"guide.13.1": "If you need to add a custom large model service, please click here. For example, Volcano Cloud, Alibaba Cloud, Silicon Flow, etc.",
"guide.14.1": "After filling in the connection signature, click here to test if the large model service is accessible.",
"guide.15.1": "Finally, don't forget to click the save button to save your settings.",
"congratulation": "Congratulations",
"guide.16.1": "Congratulations, my friend, you are now half an MCP expert. Please prepare a cup of coffee and enjoy a happy development time!",
"guide.16.2": "is our documentation site where you can find very complete usage instructions and example tutorials.",
"guide.16.3": "If you are a plugin user, there are some materials we have prepared at the bottom of the left panel under \"Getting Started & Help\", hoping to assist you in elegantly developing your MCP server.",
"guide.16.4": "Let's work together to integrate more and more APIs and SDKs into the large model!",
"maybe-end": "Final Chapter?",
"finish": "End",
"queue-time": "Waiting time"
} }

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "L'IA a appelé un outil inconnu", "ai-invoke-unknown-tool": "L'IA a appelé un outil inconnu",
"click-edge-to-delete": "Cliquez sur le bord pour supprimer", "click-edge-to-delete": "Cliquez sur le bord pour supprimer",
"select-node-define-test-tomo": "Sélectionnez un autre nœud pour définir la topologie de test", "select-node-define-test-tomo": "Sélectionnez un autre nœud pour définir la topologie de test",
"tool-self-detect": "Auto-vérification de l'outil", "tool-self-detect": "Auto-vérification de l'outil"
"self-detect-caption": "Cliquez sur la ligne de connexion pour annuler la connexion, cliquez sur le nœud pour créer une connexion",
"diagram-node-empty": "Aucune information sur le nœud",
"parallel-test": "Test en parallèle",
"begin": "Commencer",
"introduction": "Introduction",
"prev-step": "Précédent",
"next-step": "Suivant",
"guide.1.1": "Bienvenue dans le monde des grands modèles et MCP !",
"guide.1.2": "OpenMCP vous aidera à développer rapidement toute idée créative en un serveur MCP, en intégrant de grands modèles, pour créer votre propre Agent.",
"guide.1.3": "Si vous utilisez OpenMCP pour la première fois, veuillez suivre le guide que nous avons préparé.",
"guide": "Guidance",
"guide.2.1": "Ici s'affichera le nom (abréviation) et l'état de connexion du serveur mcp en cours de débogage. Le débogage ne peut commencer que lorsque l'état de la connexion est \"Connecté\".",
"guide.2.2": "OpenMCP gère de manière uniforme tous les services d'un projet via le nom du serveur. Veuillez éviter d'utiliser le même nom dans un même projet.",
"guide.3.1": "Si \"Non connecté\" s'affiche ou si vous souhaitez modifier les paramètres de connexion ou la méthode de connexion, vous pouvez cliquer ici pour accéder au panneau de connexion.",
"guide.4.1": "Vous pouvez sélectionner la méthode de connexion à votre serveur MCP bien-aimé dans le panneau de gauche et saisir les paramètres de connexion correspondants.",
"guide.4.2": "Pour les utilisateurs du plugin openmcp vscode/trae/cursor, lorsque vous accédez à openmcp via le bouton du panneau, STDIO sera sélectionné comme méthode de connexion par défaut, et les paramètres de lancement seront générés en fonction de votre contexte.",
"guide.4.3": "Les utilisateurs d'openmcp desktop devront peut-être remplir ces informations eux-mêmes. Quoi qu'il en soit, c'est plus simple que d'implanter un cheval de Troie pour cracker les mots de passe du navigateur Chrome sur l'ordinateur de votre ami.",
"guide.5.1": "La réponse de connexion sera imprimée à cet endroit. Si un message avec un fond vert apparaît, cela signifie que la connexion a réussi.",
"guide.6.1": "Vous pouvez cliquer sur le signe plus à l'extrême droite pour ajouter des serveurs MCP supplémentaires, permettant à l'agent que vous déboguez actuellement d'acquérir rapidement des capacités supplémentaires sans coût.",
"guide.7.1": "Supposons que vous vous êtes connecté avec succès au serveur mcp, alors en cliquant sur le bouton de débogage, vous pouvez commencer votre travail de débogage.",
"guide.8.1": "Nous proposons actuellement quatre options de débogage principales, « Ressources », « Invites », « Outils » correspondent respectivement à resources, prompts, tools dans le protocole MCP.",
"guide.9.1": "Le « test d'interaction » vous permet de placer directement le serveur MCP écrit dans le grand modèle pour un test complet de la chaîne, obtenant ainsi des retours et des données plus réalistes, et améliorant ainsi votre serveur MCP.",
"guide.10.1": "Sur la base de nos meilleures pratiques dans les domaines de l'agent et du RL, nous introduirons par la suite plus d'options de débogage et d'agrégation de jeux de données, alors restez à l'écoute!",
"guide.11.1": "Si vous souhaitez effectuer un test d'interaction, n'oubliez pas de configurer d'abord l'API de votre grand modèle couramment utilisé",
"guide.12.1": "OpenMCP prend actuellement en charge tous les grands modèles qui respectent la spécification de l'interface openai, tels que deepseek, openai, kimi, etc.",
"guide.13.1": "Si vous avez besoin d'ajouter un service de grand modèle personnalisé, veuillez cliquer ici. Par exemple, Volcano Cloud, Alibaba Cloud, Silicon Flow, etc.",
"guide.14.1": "Après avoir rempli la signature de connexion, cliquez ici pour tester si le service de grand modèle est accessible.",
"guide.15.1": "Enfin, n'oubliez pas de cliquer sur le bouton Enregistrer pour sauvegarder vos paramètres.",
"congratulation": "Félicitations",
"guide.16.1": "Félicitations, mon ami, vous êtes maintenant à moitié expert MCP. Préparez une tasse de café et profitez d'un moment de développement heureux !",
"guide.16.2": "est notre site de documentation où vous pouvez trouver des instructions d'utilisation très complètes et des tutoriels d'exemple.",
"guide.16.3": "Si vous êtes un utilisateur de plugin, vous trouverez quelques documents que nous avons préparés en bas du panneau de gauche sous \"Démarrage & Aide\", dans l'espoir de vous aider à développer élégamment votre serveur MCP.",
"guide.16.4": "Travaillons ensemble pour intégrer de plus en plus d'APIs et de SDKs dans le grand modèle !",
"maybe-end": "Chapitre final ?",
"finish": "Fin",
"queue-time": "Temps d'attente"
} }

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "AIが未知のツールを呼び出しました", "ai-invoke-unknown-tool": "AIが未知のツールを呼び出しました",
"click-edge-to-delete": "クリックして削除", "click-edge-to-delete": "クリックして削除",
"select-node-define-test-tomo": "テストトポロジを定義するために別のノードを選択してください", "select-node-define-test-tomo": "テストトポロジを定義するために別のノードを選択してください",
"tool-self-detect": "ツール自己診断", "tool-self-detect": "ツール自己診断"
"self-detect-caption": "接続線をクリックして接続を解除し、ノードをクリックして接続を作成します",
"diagram-node-empty": "ノード情報なし",
"parallel-test": "並列テスト",
"begin": "開始",
"introduction": "紹介",
"prev-step": "前へ",
"next-step": "次へ",
"guide.1.1": "大規模モデルとMCPの世界へようこそ",
"guide.1.2": "OpenMCPは、大規模モデルを統合することで、あらゆる創造的なアイデアを素早くMCPサーバーに開発し、あなた独自のエージェントを作成します。",
"guide.1.3": "OpenMCPを初めて使用する場合は、準備したガイドに従ってください。",
"guide": "ガイダンス",
"guide.2.1": "ここには現在デバッグ中のmcpサーバーの名前略称と接続状態が表示されます。接続状態が「接続済み」の場合のみ、デバッグ作業を開始できます。",
"guide.2.2": "OpenMCPはサーバ名を通じてプロジェクトのすべてのサービスを統一管理します。同じプロジェクト内で同じ名前を使用しないでください。",
"guide.3.1": "「未接続」と表示されている場合、または接続パラメータや接続方法を変更したい場合は、ここをクリックして接続パネルに入ります。",
"guide.4.1": "左側のパネルで、お気に入りのMCPサーバーバーへの接続方法を選択し、対応する接続パラメーターを入力できます。",
"guide.4.2": "openmcp vscode/trae/cursor プラグインのユーザーは、パネルボタンから openmcp に入ると、デフォルトで STDIO が接続方法として選択され、コンテキストに基づいて起動パラメータが生成されます。",
"guide.4.3": "openmcp desktop のユーザーは自分でこの情報を入力する必要があるかもしれません。とにかく、これは友達のコンピューターに Chrome ブラウザのパスワードクラッキングトロイの木馬を仕込むより簡単です。",
"guide.5.1": "接続の応答はここに表示されます。緑色の背景のメッセージが表示された場合、接続が成功したことを意味します。",
"guide.6.1": "右端のプラス記号をクリックすると、追加のMCPサーバーを追加でき、現在デバッグ中のエージェントが追加の機能を無料で素早く獲得できます。",
"guide.7.1": "mcpサーバーへの接続に成功したと仮定すると、デバッグボタンをクリックすることでデバッグ作業を開始できます。",
"guide.8.1": "現在、4つの主要なデバッグオプションを提供しており、「リソース」、「プロンプト」、「ツール」はそれぞれMCPプロトコルにおけるresources、prompts、toolsに対応しています。",
"guide.9.1": "「インタラクションテスト」では、作成したMCPサーバービッグモデルに直接配置してフルリンクテストを行い、より現実的なフィードバックとデータを取得し、MCPサーバーを改善することができます。",
"guide.10.1": "エージェントとRL分野における私たちのベストプラクティスに基づき、今後さらに多くのデバッグやデータセット集約のオプションを提供する予定ですので、ご期待ください",
"guide.11.1": "インタラクションテストを行う場合、よく使用する大規模モデルのAPIを最初に設定することを忘れないでください",
"guide.12.1": "OpenMCPは現在、openaiインターフェース仕様をサポートするすべての大規模モデル、例えばdeepseek、openai、kimiなどをサポートしています。",
"guide.13.1": "カスタム大規模モデルサービスを追加する必要がある場合は、こちらをクリックしてください。例Volcano Cloud、Alibaba Cloud、Silicon Flowなど。",
"guide.14.1": "接続署名を記入した後、ここをクリックして大規模モデルサービスにアクセスできるかどうかをテストします。",
"guide.15.1": "最後に、設定を保存するために保存ボタンをクリックすることを忘れないでください。",
"congratulation": "おめでとう",
"guide.16.1": "おめでとう、友よ、あなたは今やMCPの半人前の専門家です。コーヒーを入れて、楽しい開発時間をゆっくりお楽しみください",
"guide.16.2": "は私たちのドキュメントサイトで、非常に完全な使用説明と事例チュートリアルを見つけることができます。",
"guide.16.3": "プラグインユーザーの場合、左パネルの下部にある「はじめにヘルプ」には、MCPサーバーをエレガントに開発するための資料が用意されています。ぜひご活用ください。",
"guide.16.4": "大規模モデルにどんどんAPIやSDKを統合していきましょう",
"maybe-end": "終章?",
"finish": "終了",
"queue-time": "待ち時間"
} }

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "AI가 알 수 없는 도구를 호출했습니다", "ai-invoke-unknown-tool": "AI가 알 수 없는 도구를 호출했습니다",
"click-edge-to-delete": "가장자리를 클릭하여 삭제", "click-edge-to-delete": "가장자리를 클릭하여 삭제",
"select-node-define-test-tomo": "테스트 토폴로지를 정의하려면 다른 노드를 선택하세요", "select-node-define-test-tomo": "테스트 토폴로지를 정의하려면 다른 노드를 선택하세요",
"tool-self-detect": "도구 자체 점검", "tool-self-detect": "도구 자체 점검"
"self-detect-caption": "연결선을 클릭하여 연결을 취소하고, 노드를 클릭하여 연결을 생성합니다",
"diagram-node-empty": "노드 정보 없음",
"parallel-test": "병렬 테스트",
"begin": "시작",
"introduction": "소개",
"prev-step": "이전",
"next-step": "다음",
"guide.1.1": "대형 모델과 MCP의 세계에 오신 것을 환영합니다!",
"guide.1.2": "OpenMCP는 대형 모델을 통합하여 어떤 창의적인 아이디어든 MCP 서버로 빠르게 개발하고, 당신만의 에이전트를 만들 수 있도록 도와줍니다.",
"guide.1.3": "OpenMCP를 처음 사용하는 경우 준비된 가이드를 따라주세요.",
"guide": "안내",
"guide.2.1": "여기에는 현재 디버깅 중인 mcp 서버의 이름(약어)과 연결 상태가 표시됩니다. 연결 상태가 \"연결됨\"일 때만 디버깅 작업을 시작할 수 있습니다.",
"guide.2.2": "OpenMCP는 서버 이름을 통해 프로젝트의 모든 서비스를 통합 관리합니다. 같은 프로젝트 내에서 동일한 이름을 사용하지 마십시오.",
"guide.3.1": "\"연결되지 않음\"이 표시되거나 연결 매개변수 또는 연결 방법을 변경하려면 여기를 클릭하여 연결 패널로 들어갈 수 있습니다.",
"guide.4.1": "좌측 패널에서 원하는 MCP 서버의 연결 방법을 선택하고 해당 연결 매개변수를 입력할 수 있습니다.",
"guide.4.2": "openmcp vscode/trae/cursor 플러그인 사용자의 경우, 패널 버튼을 통해 openmcp에 들어가면 기본적으로 STDIO가 연결 방식으로 선택되며, 컨텍스트에 따라 시작 매개변수가 생성됩니다.",
"guide.4.3": "openmcp desktop 사용자는 이 정보를 직접 입력해야 할 수도 있습니다. 어쨌든, 이는 친구의 컴퓨터에 Chrome 브라우저 비밀번호 해킹 트로이 목마를 설치하는 것보다 간단합니다.",
"guide.5.1": "연결 응답은 이곳에 인쇄됩니다. 녹색 배경의 메시지가 나타나면 연결이 성공한 것을 의미합니다.",
"guide.6.1": "오른쪽 끝에 있는 더하기 기호를 클릭하여 추가 MCP 서버를 추가할 수 있습니다. 이렇게 하면 현재 디버깅 중인 에이전트가 추가 기능을 무료로 빠르게 얻을 수 있습니다.",
"guide.7.1": "mcp 서버에 성공적으로 연결되었다고 가정하면, 디버그 버튼을 클릭하여 디버깅 작업을 시작할 수 있습니다.",
"guide.8.1": "현재 4가지 주요 디버깅 옵션을 제공하고 있으며, '리소스', '프롬프트', '도구'는 각각 MCP 프로토콜의 resources, prompts, tools에 해당합니다.",
"guide.9.1": "«상호 작용 테스트»를 통해 작성한 MCP 서버를 대형 모델에 직접 배치하여 전체 링크 테스트를 수행할 수 있으므로 더 현실적인 피드백과 데이터를 얻을 수 있으며, 결과적으로 MCP 서버를 개선할 수 있습니다.",
"guide.10.1": "에이전트와 RL 분야에서의 우리의 최선의 실천 방법을 바탕으로, 앞으로 더 많은 디버깅 및 데이터셋 집계 옵션을 소개할 예정이니 기대해 주세요!",
"guide.11.1": "상호 작용 테스트를 수행하려면 먼저 일반적으로 사용하는 대형 모델의 API를 구성하는 것을 잊지 마세요",
"guide.12.1": "OpenMCP는 현재 openai 인터페이스 사양을 지원하는 모든 대형 모델(예: deepseek, openai, kimi 등)을 지원합니다.",
"guide.13.1": "사용자 정의 대형 모델 서비스를 추가해야 하는 경우 여기를 클릭하십시오. 예: Volcano Cloud, Alibaba Cloud, Silicon Flow 등.",
"guide.14.1": "연결 서명을 작성한 후 여기를 클릭하여 대형 모델 서비스에 접근할 수 있는지 테스트하세요.",
"guide.15.1": "마지막으로 설정을 저장하기 위해 저장 버튼을 클릭하는 것을 잊지 마세요.",
"congratulation": "축하합니다",
"guide.16.1": "축하합니다, 친구여, 이제 당신은 반쯤 MCP 전문가입니다. 커피 한 잔을 준비하고 즐거운 개발 시간을 만끽하세요!",
"guide.16.2": "는 당사 문서 사이트로, 매우 완벽한 사용 설명과 예제 튜토리얼을 찾을 수 있습니다.",
"guide.16.3": "플러그인 사용자라면, 왼쪽 패널 하단의 '시작하기 및 도움말'에 MCP 서버를 우아하게 개발할 수 있도록 준비한 자료가 있습니다. 도움이 되길 바랍니다.",
"guide.16.4": "대형 모델에 점점 더 많은 API와 SDK를 통합해 봅시다!",
"maybe-end": "종장?",
"finish": "종료",
"queue-time": "대기 시간"
} }

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "ИИ вызвал неизвестный инструмент", "ai-invoke-unknown-tool": "ИИ вызвал неизвестный инструмент",
"click-edge-to-delete": "Нажмите на край, чтобы удалить", "click-edge-to-delete": "Нажмите на край, чтобы удалить",
"select-node-define-test-tomo": "Выберите другой узел для определения тестовой топологии", "select-node-define-test-tomo": "Выберите другой узел для определения тестовой топологии",
"tool-self-detect": "Самопроверка инструмента", "tool-self-detect": "Самопроверка инструмента"
"self-detect-caption": "Нажмите на линию соединения, чтобы отменить соединение, нажмите на узел, чтобы создать соединение",
"diagram-node-empty": "Нет информации об узле",
"parallel-test": "Параллельное тестирование",
"begin": "Начать",
"introduction": "Введение",
"prev-step": "Назад",
"next-step": "Далее",
"guide.1.1": "Добро пожаловать в мир больших моделей и MCP!",
"guide.1.2": "OpenMCP поможет вам быстро разработать любую творческую идею в сервер MCP, интегрируя большие модели, чтобы создать вашего собственного Агента.",
"guide.1.3": "Если вы впервые используете OpenMCP, пожалуйста, следуйте подготовленному нами руководству.",
"guide": "Руководство",
"guide.2.1": "Здесь будет отображаться имя (сокращение) и состояние подключения отлаживаемого сервера mcp. Отладка может начаться только тогда, когда состояние подключения будет \"Подключено\".",
"guide.2.2": "OpenMCP унифицированно управляет всеми сервисами проекта через имя сервера. Пожалуйста, избегайте использования одного и того же имени в одном проекте.",
"guide.3.1": "Если отображается \"Не подключено\" или вы хотите изменить параметры подключения или способ подключения, вы можете нажать здесь, чтобы перейти на панель подключения.",
"guide.4.1": "Вы можете выбрать способ подключения к вашему любимому серверу MCP на левой панели и ввести соответствующие параметры подключения.",
"guide.4.2": "Для пользователей плагина openmcp vscode/trae/cursor при входе в openmcp через кнопку панели по умолчанию будет выбран STDIO в качестве способа подключения, а параметры запуска будут сгенерированы на основе вашего контекста.",
"guide.4.3": "Пользователям openmcp desktop, возможно, придется заполнять эту информацию самостоятельно. В любом случае, это проще, чем внедрять троян для взлома паролей браузера Chrome на компьютере вашего друга.",
"guide.5.1": "Ответ подключения будет напечатан здесь. Если появится сообщение с зеленым фоном, это означает, что подключение прошло успешно.",
"guide.6.1": "Вы можете нажать на знак плюса в крайнем правом углу, чтобы добавить дополнительные серверы MCP, что позволит агенту, который вы сейчас отлаживаете, быстро получить дополнительные возможности без каких-либо затрат.",
"guide.7.1": "Предполагая, что вы успешно подключились к серверу mcp, то, нажав кнопку отладки, вы можете начать свою работу по отладке.",
"guide.8.1": "В настоящее время мы предлагаем четыре основные опции отладки: «Ресурсы», «Подсказки», «Инструменты» соответствуют resources, prompts, tools в протоколе MCP соответственно.",
"guide.9.1": "«Интерактивное тестирование» позволяет вам напрямую поместить написанный MCP-сервер в большую модель для проведения полного тестирования цепи, тем самым получая более реалистичные отзывы и данные, а следовательно, улучшая ваш MCP-сервер.",
"guide.10.1": "Основываясь на наших лучших практиках в направлениях агента и RL, впоследствии мы представим больше опций для отладки и агрегации наборов данных, так что оставайтесь на связи!",
"guide.11.1": "Если вы хотите провести интерактивный тест, не забудьте сначала настроить API вашей часто используемой большой модели",
"guide.12.1": "OpenMCP в настоящее время поддерживает все большие модели, соответствующие спецификации интерфейса openai, такие как deepseek, openai, kimi и другие.",
"guide.13.1": "Если вам нужно добавить пользовательский сервис большой модели, нажмите здесь. Например, Volcano Cloud, Alibaba Cloud, Silicon Flow и т. д.",
"guide.14.1": "После заполнения подписи соединения нажмите здесь, чтобы проверить, доступен ли сервис большой модели.",
"guide.15.1": "Наконец, не забудьте нажать кнопку сохранения, чтобы сохранить ваши настройки.",
"congratulation": "Поздравляю",
"guide.16.1": "Поздравляю, мой друг, теперь ты наполовину эксперт по MCP. Приготовь чашку кофе и наслаждайся счастливым временем разработки!",
"guide.16.2": "это наш сайт документации, где вы можете найти очень полные инструкции по использованию и примеры руководств.",
"guide.16.3": "Если вы пользователь плагина, в нижней части левой панели в разделе \"Начало работы и помощь\" есть некоторые материалы, которые мы подготовили, надеясь помочь вам в элегантной разработке вашего сервера MCP.",
"guide.16.4": "Давайте вместе интегрировать все больше и больше API и SDK в большую модель!",
"maybe-end": "Заключительная глава?",
"finish": "Конец",
"queue-time": "Время ожидания"
} }

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "AI 调用了未知的工具", "ai-invoke-unknown-tool": "AI 调用了未知的工具",
"click-edge-to-delete": "点击边以删除", "click-edge-to-delete": "点击边以删除",
"select-node-define-test-tomo": "选择另一个节点以定义测试拓扑", "select-node-define-test-tomo": "选择另一个节点以定义测试拓扑",
"tool-self-detect": "工具自检", "tool-self-detect": "工具自检"
"self-detect-caption": "点击连接线取消连接,点击节点以创建连接",
"diagram-node-empty": "暂无节点信息",
"parallel-test": "并行测试",
"begin": "开始",
"introduction": "介绍",
"prev-step": "上一步",
"next-step": "下一步",
"guide.1.1": "欢迎来到大模型与 mcp 的世界!",
"guide.1.2": "OpenMCP 将会助力你快速将任何奇思妙想开发成 mcp 服务器,通过接入大模型,创造出属于你的 Agent。",
"guide.1.3": "倘若阁下是第一次使用 OpenMCP请务必走完我们准备好的引导。",
"guide": "引导",
"guide.2.1": "这里会显示当前调试的 mcp 服务器的名称(缩写)和连接状态。只有当连接状态为「已连接」,调试工作才能开始。",
"guide.2.2": "OpenMCP 通过服务器名称对项目所的所有服务进行统一管理,请避免在同一个项目中使用相同的名称",
"guide.3.1": "如果显示「未连接」或阁下想要更改连接参数或者连接方式,可以点击这里进入连接面板。",
"guide.4.1": "阁下可以在左侧面板选择与您心爱的 mcp 服务器进行连接的方式,并填入对应的连接参数。",
"guide.4.2": "对于 openmcp vscode/trae/cursor 插件端的用户,当您通过面板按钮进入 openmcp 的时候,默认就会选择 STDIO 作为连接方式,并根据你的上下文生成启动参数。",
"guide.4.3": "openmcp desktop 的用户可能就需要自己填写了。Anyway这总比在你的好友电脑中植入 chrome 浏览器密码破解木马简单。",
"guide.5.1": "连接响应会在这个地方打印出来,如果出现绿色背景的信息,代表连接成功。",
"guide.6.1": "你可以点击最右侧的加号来添加额外的 mcp 服务器,让你当前正在调试的 agent 零成本快速获得额外的能力。",
"guide.7.1": "假设你已经成功连接了 mcp 服务器,那么点击调试按钮,你可以开始你的调试工作。",
"guide.8.1": "我们目前提供了四种主要调试选项,「资源」、「提词」、「工具」分别和 MCP 协议中的 resources、prompts、tools 对应。",
"guide.9.1": "而「交互测试」则允许你直接将写好的 mcp 服务器放入大模型中直接做全链路测试,从而更加获取更加真实的反馈和数据,进而改进的你的 mcp 服务器。",
"guide.10.1": "基于我们在 agent 和 rl 方向的最佳实践,我们后续还会推出更多的调试和数据集聚合制作选项,请期待吧!",
"guide.11.1": "如果要进行交互测试,请不要忘记先配置你常用的大模型 API",
"guide.12.1": "OpenMCP 目前支持所有支持 openai 接口规范的大模型,比如 deepseekopenaikimi 等等。",
"guide.13.1": "如果需要添加自定义的大模型服务,请点击这里。比如火山云,阿里云,硅基流动等。",
"guide.14.1": "填写完成连接签名后,点击这里来测试 大模型服务是否可以访问。",
"guide.15.1": "最后请不要忘记点击保存按钮,保存你的设置。",
"congratulation": "恭喜",
"guide.16.1": "恭喜,我的朋友,现在的你已经是半个 mcp 专家了,请充好一杯咖啡,慢慢享用快乐的开发时间吧!",
"guide.16.2": "是我们的文档站点,您在其中能找到非常完整的使用说明和案例教程。",
"guide.16.3": "如果是插件用户,左侧面板的最下面「入门与帮助」有一些我们准备好的资料,希望能帮到阁下优雅地开发你的 mcp 服务器。",
"guide.16.4": "让我们一起把越来越多的 api 和 sdk 接入 大模型吧!",
"maybe-end": "终章?",
"finish": "结束",
"queue-time": "排队时间"
} }

View File

@ -195,41 +195,5 @@
"ai-invoke-unknown-tool": "AI調用了未知的工具", "ai-invoke-unknown-tool": "AI調用了未知的工具",
"click-edge-to-delete": "點擊邊緣以刪除", "click-edge-to-delete": "點擊邊緣以刪除",
"select-node-define-test-tomo": "選擇另一個節點以定義測試拓撲", "select-node-define-test-tomo": "選擇另一個節點以定義測試拓撲",
"tool-self-detect": "工具自檢", "tool-self-detect": "工具自檢"
"self-detect-caption": "點擊連接線取消連接,點擊節點以創建連接",
"diagram-node-empty": "暫無節點資訊",
"parallel-test": "並行測試",
"begin": "開始",
"introduction": "介紹",
"prev-step": "上一步",
"next-step": "下一步",
"guide.1.1": "歡迎來到大模型與 MCP 的世界!",
"guide.1.2": "OpenMCP 將會助力你快速將任何奇思妙想開發成 mcp 伺服器,通過接入大模型,創造出屬於你的 Agent。",
"guide.1.3": "倘若閣下是第一次使用OpenMCP請務必走完我們準備好的引導。",
"guide": "引導",
"guide.2.1": "這裡會顯示當前調試的 mcp 伺服器的名稱(縮寫)和連接狀態。只有當連接狀態為「已連接」,調試工作才能開始。",
"guide.2.2": "OpenMCP 通過伺服器名稱對項目所屬的所有服務進行統一管理,請避免在同一個項目中使用相同的名稱",
"guide.3.1": "如果顯示「未連接」或閣下想要更改連接參數或者連接方式,可以點擊這裡進入連接面板。",
"guide.4.1": "閣下可以在左側面板選擇與您心愛的 MCP 伺服器進行連接的方式,並填入對應的連接參數。",
"guide.4.2": "對於 openmcp vscode/trae/cursor 插件端的用戶,當您通過面板按鈕進入 openmcp 的時候,預設就會選擇 STDIO 作為連接方式,並根據你的上下文生成啟動參數。",
"guide.4.3": "openmcp desktop 的用戶可能就需要自己填寫了。總之,這比在你朋友的電腦中植入 Chrome 瀏覽器密碼破解木馬簡單。",
"guide.5.1": "連接響應會在這個地方打印出來,如果出現綠色背景的信息,代表連接成功。",
"guide.6.1": "你可以點擊最右側的加號來添加額外的 mcp 伺服器,讓你當前正在調試的 agent 零成本快速獲得額外的能力。",
"guide.7.1": "假設你已經成功連接了 mcp 伺服器,那麼點擊調試按鈕,你可以開始你的調試工作。",
"guide.8.1": "我們目前提供了四種主要調試選項,「資源」、「提詞」、「工具」分別和 MCP 協議中的 resources、prompts、tools 對應。",
"guide.9.1": "而「交互測試」則允許你直接將寫好的 MCP 伺服器放入大模型中直接做全鏈路測試,從而更加獲取更加真實的反饋和數據,進而改進你的 MCP 伺服器。",
"guide.10.1": "基於我們在agent和RL方向的最佳實踐我們後續還會推出更多的調試和數據集聚合製作選項請期待吧",
"guide.11.1": "如果要進行交互測試,請不要忘記先配置你常用的大模型 API",
"guide.12.1": "OpenMCP 目前支援所有符合 openai 介面規範的大模型,比如 deepseekopenaikimi 等等。",
"guide.13.1": "如果需要添加自定義的大模型服務,請點擊這裡。比如火山雲,阿里雲,矽基流動等。",
"guide.14.1": "填寫完成連接簽名後,點擊這裡來測試大模型服務是否可以訪問。",
"guide.15.1": "最後請不要忘記點擊保存按鈕,保存你的設定。",
"congratulation": "恭喜",
"guide.16.1": "恭喜,我的朋友,現在的你已經是半個 MCP 專家了,請充好一杯咖啡,慢慢享用快樂的開發時間吧!",
"guide.16.2": "是我們的文檔站點,您在其中能找到非常完整的使用說明和案例教程。",
"guide.16.3": "如果是插件用戶,左側面板的最下面「入門與幫助」有一些我們準備好的資料,希望能幫到閣下優雅地開發你的 MCP 伺服器。",
"guide.16.4": "讓我們一起把越來越多的API和SDK接入大模型吧",
"maybe-end": "終章?",
"finish": "結束",
"queue-time": "排隊時間"
} }

View File

@ -17,7 +17,7 @@
{{ t('star-our-project') }} {{ t('star-our-project') }}
</el-button> </el-button>
<el-button class="join-qq" type="primary" @click="gotoWebsite('https://openmcp.kirigaya.cn')"> <el-button class="join-qq" type="primary" @click="gotoWebsite('https://kirigaya.cn/openmcp')">
<span class="iconfont icon-wendang"></span> <span class="iconfont icon-wendang"></span>
{{ t('document') }} {{ t('document') }}
</el-button> </el-button>

View File

@ -282,6 +282,7 @@ export class McpClient {
this.resourceTemplates = new Map<string, ResourceTemplate>(); this.resourceTemplates = new Map<string, ResourceTemplate>();
msg.resourceTemplates.forEach(template => { msg.resourceTemplates.forEach(template => {
this.resourceTemplates!.set(template.name, template); this.resourceTemplates!.set(template.name, template);
}); });
return this.resourceTemplates; return this.resourceTemplates;
} }
@ -495,7 +496,7 @@ export class McpClient {
class McpClientAdapter { class McpClientAdapter {
public clients: Reactive<McpClient[]> = reactive([]); public clients: Reactive<McpClient[]> = [];
public currentClientIndex: number = 0; public currentClientIndex: number = 0;
public refreshSignal = reactive({ value: 0 }); public refreshSignal = reactive({ value: 0 });
@ -585,8 +586,6 @@ class McpClientAdapter {
console.log('clientIndex', clientIndex); console.log('clientIndex', clientIndex);
await this.clients[clientIndex].refreshAllResources(); await this.clients[clientIndex].refreshAllResources();
// 更新 refreshSignal所有 watch refreshSignal 的部分会发生更新
this.refreshSignal.value++; this.refreshSignal.value++;
} else { } else {
console.error( console.error(

View File

@ -5,31 +5,26 @@ import { reactive, ref } from 'vue';
import { makeUsageStatistic } from '@/components/main-panel/chat/core/usage'; import { makeUsageStatistic } from '@/components/main-panel/chat/core/usage';
export const llmSettingRef = ref<any>(null); export const llmSettingRef = ref<any>(null);
type NumberLike = string | number | undefined;
export const testPrompt = ref('you\'re a smart assistant, please write an article of at least 100 words to introduce mcp');
export const simpleTestResult = reactive<{ export const simpleTestResult = reactive<{
done: boolean, done: boolean,
start: boolean, start: boolean,
error: any, error: any,
tps: NumberLike, tps: string | number | undefined
outputTps: NumberLike
queueTime: NumberLike
}>({ }>({
done: false, done: false,
start: false, start: false,
error: '', error: '',
tps: undefined, tps: undefined
outputTps: undefined,
queueTime: undefined,
}); });
export async function makeSimpleTalk() { export async function makeSimpleTalk() {
simpleTestResult.done = false; simpleTestResult.done = false;
simpleTestResult.start = true; simpleTestResult.start = true;
simpleTestResult.tps = undefined; simpleTestResult.tps = undefined;
simpleTestResult.queueTime = undefined;
// 使用最简单的 hello 来测试
const testMessage = 'hello';
const loop = new TaskLoop(); const loop = new TaskLoop();
@ -49,14 +44,6 @@ export async function makeSimpleTalk() {
loop.setMaxEpochs(1); loop.setMaxEpochs(1);
let receiveTime = -1;
loop.registerOnChunk(() => {
if (receiveTime <= 0) {
receiveTime = Date.now();
}
});
loop.registerOnDone(() => { loop.registerOnDone(() => {
simpleTestResult.error = ''; simpleTestResult.error = '';
simpleTestResult.done = true; simpleTestResult.done = true;
@ -72,19 +59,16 @@ export async function makeSimpleTalk() {
}); });
const startTime = Date.now(); const startTime = Date.now();
await loop.start(chatStorage, testPrompt.value); await loop.start(chatStorage, testMessage);
const endTime = Date.now();
const costTime = (endTime - receiveTime) / 1000;
simpleTestResult.queueTime = (receiveTime - startTime) / 1000;
const costTime = (Date.now() - startTime!) / 1000;
const message = chatStorage.messages[chatStorage.messages.length - 1]; const message = chatStorage.messages[chatStorage.messages.length - 1];
console.log(chatStorage.messages);
if (message?.extraInfo) { if (message?.extraInfo) {
const usage = message.extraInfo.usage; const usage = message.extraInfo.usage;
if (usage?.prompt_tokens && usage.completion_tokens) { if (usage?.prompt_tokens && usage.completion_tokens) {
// const total = usage?.prompt_tokens + usage?.completion_tokens; const total = usage?.prompt_tokens + usage?.completion_tokens;
const total = usage?.completion_tokens;
simpleTestResult.tps = (total / costTime).toFixed(2); simpleTestResult.tps = (total / costTime).toFixed(2);
} }
} }

View File

@ -66,39 +66,15 @@
{{ t('update-model-list') }} {{ t('update-model-list') }}
</el-button> </el-button>
<!-- 新增测试 prompt 下拉输入 -->
<el-popover
placement="top"
width="400"
trigger="click"
v-model:visible="testPromptPopoverVisible"
>
<template #reference>
<el-button <el-button
type="primary" type="primary"
id="test-llm-button" id="test-llm-button"
@click="makeSimpleTalk"
:loading="simpleTestResult.start" :loading="simpleTestResult.start"
> >
<span v-show="!simpleTestResult.start" class="iconfont icon-test"></span> <span v-show="!simpleTestResult.start" class="iconfont icon-test"></span>
{{ t('test') }} {{ t('test') }}
</el-button> </el-button>
</template>
<div style="margin-bottom: 8px; font-weight: bold;">
{{ t('prompts') }}
</div>
<el-input
type="textarea"
v-model="testPrompt"
:rows="3"
:placeholder="t('test-prompt-placeholder') || '输入测试内容...'"
style="margin-bottom: 8px;"
clearable
/>
<div style="text-align: right;">
<el-button size="small" @click="testPromptPopoverVisible = false">{{ t('cancel') }}</el-button>
<el-button size="small" type="primary" @click="testPromptPopoverVisible = false; makeSimpleTalk()">{{ t('confirm') }}</el-button>
</div>
</el-popover>
<el-button <el-button
type="primary" type="primary"
@ -154,7 +130,7 @@ import { pinkLog } from './util';
import ConnectInterfaceOpenai from './connect-interface-openai.vue'; import ConnectInterfaceOpenai from './connect-interface-openai.vue';
import ConnectTest from './connect-test.vue'; import ConnectTest from './connect-test.vue';
import { llmSettingRef, makeSimpleTalk, simpleTestResult, testPrompt } from './api'; import { llmSettingRef, makeSimpleTalk, simpleTestResult } from './api';
import { useMessageBridge } from '@/api/message-bridge'; import { useMessageBridge } from '@/api/message-bridge';
import { mcpSetting } from '@/hook/mcp'; import { mcpSetting } from '@/hook/mcp';
@ -172,7 +148,6 @@ function saveLlmSetting() {
const currentDialogMode = ref(''); const currentDialogMode = ref('');
const dialogVisible = ref(false); const dialogVisible = ref(false);
const testPromptPopoverVisible = ref(false);
function addNewServer() { function addNewServer() {
newProviderForm.value = { newProviderForm.value = {

View File

@ -7,9 +7,6 @@
<div class="result-item" v-if="simpleTestResult.done"> <div class="result-item" v-if="simpleTestResult.done">
<span class="iconfont icon-dui"></span> <span class="iconfont icon-dui"></span>
<span>{{ " okey dockey :D" }}</span> <span>{{ " okey dockey :D" }}</span>
<span v-if="simpleTestResult.queueTime" class="queue-time">
{{ t('queue-time') }}: {{ simpleTestResult.queueTime }} s
</span>
<span v-if="simpleTestResult.tps" class="tps">{{ simpleTestResult.tps }} token/s</span> <span v-if="simpleTestResult.tps" class="tps">{{ simpleTestResult.tps }} token/s</span>
<span v-else class="tps">{{ t("server-not-support-statistic") }}</span> <span v-else class="tps">{{ t("server-not-support-statistic") }}</span>
</div> </div>
@ -85,12 +82,4 @@ console.log(llms[llmManager.currentModelIndex]);
margin-top: 15px; margin-top: 15px;
margin-bottom: 10px; margin-bottom: 10px;
} }
.queue-time {
margin-left: 8px;
color: var(--foreground);
background-color: var(--el-fill-color-light);
padding: 2px 6px;
border-radius: 4px;
}
</style> </style>

View File

@ -45,7 +45,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { defineComponent, onMounted, ref } from 'vue'; import { defineComponent, ref } from 'vue';
import { languageSetting } from './language'; import { languageSetting } from './language';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { mcpSetting } from '@/hook/mcp'; import { mcpSetting } from '@/hook/mcp';
@ -56,7 +56,19 @@ defineComponent({ name: 'appearance' });
const { t, locale } = useI18n(); const { t, locale } = useI18n();
function onlanguagechange() { const currentLanguage = ref('简体中文');
function onlanguagechange(code: string) {
console.log('enter lang change');
const option = languageSetting.options.find(item => item.value === code);
if (option) {
currentLanguage.value = option.text;
}
// languageDialogShow.value = true;
saveSetting(); saveSetting();
} }
@ -64,9 +76,6 @@ const safeSaveSetting = debounce(() => {
saveSetting(); saveSetting();
}, 10); }, 10);
onMounted(() => {
locale.value = mcpSetting.language;
});
</script> </script>

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@
<h3>openmcp-sdk: Deployment Framework for OpenMCP</h3> <h3>openmcp-sdk: Deployment Framework for OpenMCP</h3>
<h4>Lightning-fast deployment of your agent from lab to production</h4> <h4>Lightning-fast deployment of your agent from lab to production</h4>
<a href="https://openmcp.kirigaya.cn/sdk-tutorial/" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #7D3FF8; color: white; border-radius: .5em; text-decoration: none;">🫱 OpenMCP SDK 官方文档</a> <a href="https://kirigaya.cn/openmcp/sdk-tutorial/" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #7D3FF8; color: white; border-radius: .5em; text-decoration: none;">📄 OpenMCP SDK Documentation</a>
<a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #CB81DA; color: white; border-radius: .5em; text-decoration: none;">QQ Discussion Group</a><a href="https://discord.gg/af5cfB9a" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none; margin-left: 5px;">Discord Channel</a> <a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #CB81DA; color: white; border-radius: .5em; text-decoration: none;">QQ Discussion Group</a><a href="https://discord.gg/af5cfB9a" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none; margin-left: 5px;">Discord Channel</a>
@ -106,6 +106,6 @@ Posted: 8 hours ago
Link: https://github.com/Orange-OpenSource/hurl Link: https://github.com/Orange-OpenSource/hurl
``` ```
For more details, see the official documentation: [https://openmcp.kirigaya.cn/sdk-tutorial/](https://openmcp.kirigaya.cn/sdk-tutorial/) For more details, see the official documentation: [https://kirigaya.cn/openmcp/sdk-tutorial/](https://kirigaya.cn/openmcp/sdk-tutorial/)
Star our project: [https://github.com/LSTM-Kirigaya/openmcp-client](https://github.com/LSTM-Kirigaya/openmcp-client) Star our project: [https://github.com/LSTM-Kirigaya/openmcp-client](https://github.com/LSTM-Kirigaya/openmcp-client)

View File

@ -1,169 +0,0 @@
import { readFileSync, writeFileSync } from 'fs';
import fetch from 'node-fetch';
import path from 'path';
import { OpenAI } from 'openai';
import chalk from 'chalk';
const client = new OpenAI({
baseURL: 'https://api.deepseek.com',
apiKey: process.env.DEEPSEEK_API_TOKEN,
});
async function fetchContributorsFromRepo(owner: string, repo: string) {
let page = 1;
const per_page = 100;
let contributors: any[] = [];
while (true) {
const res = await fetch(
`https://api.github.com/repos/${owner}/${repo}/contributors?per_page=${per_page}&page=${page}`,
{
headers: {
'User-Agent': 'openmcp-client-script'
}
}
);
if (!res.ok) {
throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);
}
const data = await res.json();
if (data.length === 0) break;
contributors = contributors.concat(data);
page++;
}
return contributors;
}
async function fetchAndMergeContributors() {
const repos = [
{ owner: 'LSTM-Kirigaya', repo: 'openmcp-client' },
{ owner: 'LSTM-Kirigaya', repo: 'openmcp-document' }
];
const allContributors: Record<string, { username: string, avatarUrl: string, homeUrl: string, contributions: number }> = {};
for (const { owner, repo } of repos) {
const contributors = await fetchContributorsFromRepo(owner, repo);
for (const c of contributors) {
const username = c.login;
if (!allContributors[username]) {
allContributors[username] = {
username,
avatarUrl: c.avatar_url,
homeUrl: c.html_url,
contributions: c.contributions
};
} else {
allContributors[username].contributions += c.contributions;
}
}
}
// 按贡献次数排序
const result = Object.values(allContributors)
.sort((a, b) => b.contributions - a.contributions)
.map(({ contributions, ...rest }) => rest); // 去掉contributions字段
return result;
}
const PRJ_PATH = path.join(path.dirname(import.meta.dirname));
async function getVersionAndContent() {
const changelog = readFileSync( path.join(PRJ_PATH, 'CHANGELOG.md'), { encoding: 'utf-8' });
const newContent = changelog.split('## [main]')[1];
const version = newContent.split('\n')[0].trim();
// 提取 main 版本下的 markdown 列表内容
const contentLines = newContent.split('\n').slice(1);
const content = contentLines
.filter(line => line.trim().startsWith('- ') || line.trim().startsWith('* '))
.map(line => line.replace(/^[-*]\s*/, '').trim())
.join('\n');
// 让大模型翻译并输出 json
const prompt = `
Translate the following markdown list to English and return a JSON array of strings (do not include any markdown or extra text, only valid JSON array):
${content}
`;
const completion = await client.chat.completions.create({
model: 'deepseek-chat',
messages: [
{ role: 'system', content: 'You are a helpful assistant for translation and JSON formatting.' },
{ role: 'user', content: prompt }
],
temperature: 0.2,
max_tokens: 1024
});
// 解析大模型返回的 JSON
let changelogs: string[] = [];
try {
const choices = completion.choices;
if (!choices || choices.length === 0 || !choices[0].message || !choices[0].message.content) {
throw new Error('Invalid response from LLM');
}
const text = choices[0].message.content.trim();
// 按行过滤:只保留非 ``` 开头的行
const clearText = text.split('\n').filter(line => !line.startsWith('```')).join('\n')
changelogs = JSON.parse(clearText);
} catch (e) {
throw new Error('Failed to parse LLM output as JSON: ' + e);
}
return { version, changelogs };
}
console.log(chalk.green('Starting to update contributors...'));
const contributors = await fetchAndMergeContributors();
const { version, changelogs } = await getVersionAndContent();
const newsData = {
version,
changelogs,
contributors
};
const newsDataPath = path.join(PRJ_PATH, 'news', 'src', 'data.json');
writeFileSync(newsDataPath, JSON.stringify(newsData, null, 2), { encoding: 'utf-8' });
console.log('News data updated successfully:', newsDataPath);
import { execSync } from 'child_process';
// ...前面的代码...
// 写入 news/src/data.json
writeFileSync(newsDataPath, JSON.stringify(newsData, null, 2), { encoding: 'utf-8' });
console.log('News data updated successfully:', newsDataPath);
// 1. 进入 news 目录并编译
const newsDir = path.join(PRJ_PATH, 'news');
console.log('Building news SPA...');
execSync('npm run build', { cwd: newsDir, stdio: 'inherit' });
// 2. 拷贝编译产物到 resources/changelog
const buildOutputDir = path.join(newsDir, 'dist');
const targetDir = path.join(PRJ_PATH, 'resources', 'changelog');
// 简单递归复制函数
import { existsSync, mkdirSync, readdirSync, statSync, copyFileSync } from 'fs';
function copyDir(src: string, dest: string) {
if (!existsSync(dest)) mkdirSync(dest, { recursive: true });
for (const file of readdirSync(src)) {
const srcFile = path.join(src, file);
const destFile = path.join(dest, file);
if (file.endsWith('.css')) {
continue;
}
if (statSync(srcFile).isDirectory()) {
copyDir(srcFile, destFile);
} else {
copyFileSync(srcFile, destFile);
}
}
}
copyDir(buildOutputDir, targetDir);
console.log('Build output copied to:', targetDir);

462
servers/uv.lock generated
View File

@ -1,273 +1,273 @@
version = 1 version = 1
revision = 2 revision = 1
requires-python = ">=3.11" requires-python = ">=3.11"
[[package]] [[package]]
name = "annotated-types" name = "annotated-types"
version = "0.7.0" version = "0.7.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
] ]
[[package]] [[package]]
name = "anyio" name = "anyio"
version = "4.9.0" version = "4.9.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "idna" }, { name = "idna" },
{ name = "sniffio" }, { name = "sniffio" },
{ name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 },
] ]
[[package]] [[package]]
name = "beautifulsoup4" name = "beautifulsoup4"
version = "4.13.4" version = "4.13.4"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "soupsieve" }, { name = "soupsieve" },
{ name = "typing-extensions" }, { name = "typing-extensions" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 },
] ]
[[package]] [[package]]
name = "bs4" name = "bs4"
version = "0.0.2" version = "0.0.2"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "beautifulsoup4" }, { name = "beautifulsoup4" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698, upload-time = "2024-01-17T18:15:47.371Z" } sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189, upload-time = "2024-01-17T18:15:48.613Z" }, { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189 },
] ]
[[package]] [[package]]
name = "certifi" name = "certifi"
version = "2025.1.31" version = "2025.1.31"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577, upload-time = "2025-01-31T02:16:47.166Z" } sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393, upload-time = "2025-01-31T02:16:45.015Z" }, { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
] ]
[[package]] [[package]]
name = "charset-normalizer" name = "charset-normalizer"
version = "3.4.1" version = "3.4.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188, upload-time = "2024-12-24T18:12:35.43Z" } sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995, upload-time = "2024-12-24T18:10:12.838Z" }, { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471, upload-time = "2024-12-24T18:10:14.101Z" }, { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831, upload-time = "2024-12-24T18:10:15.512Z" }, { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335, upload-time = "2024-12-24T18:10:18.369Z" }, { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862, upload-time = "2024-12-24T18:10:19.743Z" }, { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673, upload-time = "2024-12-24T18:10:21.139Z" }, { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211, upload-time = "2024-12-24T18:10:22.382Z" }, { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039, upload-time = "2024-12-24T18:10:24.802Z" }, { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939, upload-time = "2024-12-24T18:10:26.124Z" }, { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075, upload-time = "2024-12-24T18:10:30.027Z" }, { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340, upload-time = "2024-12-24T18:10:32.679Z" }, { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205, upload-time = "2024-12-24T18:10:34.724Z" }, { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441, upload-time = "2024-12-24T18:10:37.574Z" }, { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105, upload-time = "2024-12-24T18:10:38.83Z" }, { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404, upload-time = "2024-12-24T18:10:44.272Z" }, { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423, upload-time = "2024-12-24T18:10:45.492Z" }, { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184, upload-time = "2024-12-24T18:10:47.898Z" }, { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268, upload-time = "2024-12-24T18:10:50.589Z" }, { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601, upload-time = "2024-12-24T18:10:52.541Z" }, { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098, upload-time = "2024-12-24T18:10:53.789Z" }, { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520, upload-time = "2024-12-24T18:10:55.048Z" }, { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852, upload-time = "2024-12-24T18:10:57.647Z" }, { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488, upload-time = "2024-12-24T18:10:59.43Z" }, { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192, upload-time = "2024-12-24T18:11:00.676Z" }, { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550, upload-time = "2024-12-24T18:11:01.952Z" }, { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785, upload-time = "2024-12-24T18:11:03.142Z" }, { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698, upload-time = "2024-12-24T18:11:05.834Z" }, { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162, upload-time = "2024-12-24T18:11:07.064Z" }, { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263, upload-time = "2024-12-24T18:11:08.374Z" }, { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966, upload-time = "2024-12-24T18:11:09.831Z" }, { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992, upload-time = "2024-12-24T18:11:12.03Z" }, { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162, upload-time = "2024-12-24T18:11:13.372Z" }, { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972, upload-time = "2024-12-24T18:11:14.628Z" }, { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095, upload-time = "2024-12-24T18:11:17.672Z" }, { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668, upload-time = "2024-12-24T18:11:18.989Z" }, { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073, upload-time = "2024-12-24T18:11:21.507Z" }, { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732, upload-time = "2024-12-24T18:11:22.774Z" }, { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391, upload-time = "2024-12-24T18:11:24.139Z" }, { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702, upload-time = "2024-12-24T18:11:26.535Z" }, { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767, upload-time = "2024-12-24T18:12:32.852Z" }, { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
] ]
[[package]] [[package]]
name = "click" name = "click"
version = "8.1.8" version = "8.1.8"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" }, { name = "colorama", marker = "sys_platform == 'win32'" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
] ]
[[package]] [[package]]
name = "colorama" name = "colorama"
version = "0.4.6" version = "0.4.6"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
] ]
[[package]] [[package]]
name = "distro" name = "distro"
version = "1.9.0" version = "1.9.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 },
] ]
[[package]] [[package]]
name = "h11" name = "h11"
version = "0.14.0" version = "0.14.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418, upload-time = "2022-09-25T15:40:01.519Z" } sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload-time = "2022-09-25T15:39:59.68Z" }, { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
] ]
[[package]] [[package]]
name = "httpcore" name = "httpcore"
version = "1.0.7" version = "1.0.7"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "certifi" }, { name = "certifi" },
{ name = "h11" }, { name = "h11" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196, upload-time = "2024-11-15T12:30:47.531Z" } sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551, upload-time = "2024-11-15T12:30:45.782Z" }, { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
] ]
[[package]] [[package]]
name = "httpx" name = "httpx"
version = "0.28.1" version = "0.28.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "anyio" }, { name = "anyio" },
{ name = "certifi" }, { name = "certifi" },
{ name = "httpcore" }, { name = "httpcore" },
{ name = "idna" }, { name = "idna" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
] ]
[[package]] [[package]]
name = "httpx-sse" name = "httpx-SSE"
version = "0.4.0" version = "0.4.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624, upload-time = "2023-12-22T08:01:21.083Z" } sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-SSE-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819, upload-time = "2023-12-22T08:01:19.89Z" }, { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 },
] ]
[[package]] [[package]]
name = "idna" name = "idna"
version = "3.10" version = "3.10"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
] ]
[[package]] [[package]]
name = "jiter" name = "jiter"
version = "0.9.0" version = "0.9.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload-time = "2025-03-10T21:37:03.278Z" } sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654, upload-time = "2025-03-10T21:35:23.939Z" }, { url = "https://files.pythonhosted.org/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909, upload-time = "2025-03-10T21:35:26.127Z" }, { url = "https://files.pythonhosted.org/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733, upload-time = "2025-03-10T21:35:27.94Z" }, { url = "https://files.pythonhosted.org/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097, upload-time = "2025-03-10T21:35:29.605Z" }, { url = "https://files.pythonhosted.org/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603, upload-time = "2025-03-10T21:35:31.696Z" }, { url = "https://files.pythonhosted.org/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625, upload-time = "2025-03-10T21:35:33.182Z" }, { url = "https://files.pythonhosted.org/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832, upload-time = "2025-03-10T21:35:35.394Z" }, { url = "https://files.pythonhosted.org/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590, upload-time = "2025-03-10T21:35:37.171Z" }, { url = "https://files.pythonhosted.org/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690, upload-time = "2025-03-10T21:35:38.717Z" }, { url = "https://files.pythonhosted.org/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649, upload-time = "2025-03-10T21:35:40.157Z" }, { url = "https://files.pythonhosted.org/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920, upload-time = "2025-03-10T21:35:41.72Z" }, { url = "https://files.pythonhosted.org/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119, upload-time = "2025-03-10T21:35:43.46Z" }, { url = "https://files.pythonhosted.org/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203, upload-time = "2025-03-10T21:35:44.852Z" }, { url = "https://files.pythonhosted.org/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678, upload-time = "2025-03-10T21:35:46.365Z" }, { url = "https://files.pythonhosted.org/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816, upload-time = "2025-03-10T21:35:47.856Z" }, { url = "https://files.pythonhosted.org/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152, upload-time = "2025-03-10T21:35:49.397Z" }, { url = "https://files.pythonhosted.org/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991, upload-time = "2025-03-10T21:35:50.745Z" }, { url = "https://files.pythonhosted.org/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824, upload-time = "2025-03-10T21:35:52.162Z" }, { url = "https://files.pythonhosted.org/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318, upload-time = "2025-03-10T21:35:53.566Z" }, { url = "https://files.pythonhosted.org/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591, upload-time = "2025-03-10T21:35:54.95Z" }, { url = "https://files.pythonhosted.org/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746, upload-time = "2025-03-10T21:35:56.444Z" }, { url = "https://files.pythonhosted.org/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754, upload-time = "2025-03-10T21:35:58.789Z" }, { url = "https://files.pythonhosted.org/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075, upload-time = "2025-03-10T21:36:00.616Z" }, { url = "https://files.pythonhosted.org/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999, upload-time = "2025-03-10T21:36:02.366Z" }, { url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload-time = "2025-03-10T21:36:03.828Z" }, { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload-time = "2025-03-10T21:36:05.281Z" }, { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload-time = "2025-03-10T21:36:06.716Z" }, { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload-time = "2025-03-10T21:36:08.138Z" }, { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload-time = "2025-03-10T21:36:10.934Z" }, { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload-time = "2025-03-10T21:36:12.468Z" }, { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload-time = "2025-03-10T21:36:14.148Z" }, { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload-time = "2025-03-10T21:36:15.545Z" }, { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload-time = "2025-03-10T21:36:17.016Z" }, { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload-time = "2025-03-10T21:36:18.47Z" }, { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload-time = "2025-03-10T21:36:19.809Z" }, { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload-time = "2025-03-10T21:36:21.536Z" }, { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload-time = "2025-03-10T21:36:22.959Z" }, { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload-time = "2025-03-10T21:36:24.414Z" }, { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload-time = "2025-03-10T21:36:25.843Z" }, { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867 },
] ]
[[package]] [[package]]
name = "markdown-it-py" name = "markdown-it-py"
version = "3.0.0" version = "3.0.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "mdurl" }, { name = "mdurl" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
] ]
[[package]] [[package]]
name = "mcp" name = "mcp"
version = "1.5.0" version = "1.5.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "anyio" }, { name = "anyio" },
{ name = "httpx" }, { name = "httpx" },
{ name = "httpx-sse" }, { name = "httpx-SSE" },
{ name = "pydantic" }, { name = "pydantic" },
{ name = "pydantic-settings" }, { name = "pydantic-settings" },
{ name = "sse-starlette" }, { name = "SSE-starlette" },
{ name = "starlette" }, { name = "starlette" },
{ name = "uvicorn" }, { name = "uvicorn" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6d/c9/c55764824e893fdebe777ac7223200986a275c3191dba9169f8eb6d7c978/mcp-1.5.0.tar.gz", hash = "sha256:5b2766c05e68e01a2034875e250139839498c61792163a7b221fc170c12f5aa9", size = 159128, upload-time = "2025-03-21T12:51:04.183Z" } sdist = { url = "https://files.pythonhosted.org/packages/6d/c9/c55764824e893fdebe777ac7223200986a275c3191dba9169f8eb6d7c978/mcp-1.5.0.tar.gz", hash = "sha256:5b2766c05e68e01a2034875e250139839498c61792163a7b221fc170c12f5aa9", size = 159128 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c1/d1/3ff566ecf322077d861f1a68a1ff025cad337417bd66ad22a7c6f7dfcfaf/mcp-1.5.0-py3-none-any.whl", hash = "sha256:51c3f35ce93cb702f7513c12406bbea9665ef75a08db909200b07da9db641527", size = 73734, upload-time = "2025-03-21T12:51:02.597Z" }, { url = "https://files.pythonhosted.org/packages/c1/d1/3ff566ecf322077d861f1a68a1ff025cad337417bd66ad22a7c6f7dfcfaf/mcp-1.5.0-py3-none-any.whl", hash = "sha256:51c3f35ce93cb702f7513c12406bbea9665ef75a08db909200b07da9db641527", size = 73734 },
] ]
[package.optional-dependencies] [package.optional-dependencies]
@ -279,16 +279,16 @@ cli = [
[[package]] [[package]]
name = "mdurl" name = "mdurl"
version = "0.1.2" version = "0.1.2"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
] ]
[[package]] [[package]]
name = "openai" name = "openai"
version = "1.76.0" version = "1.76.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "anyio" }, { name = "anyio" },
{ name = "distro" }, { name = "distro" },
@ -299,135 +299,135 @@ dependencies = [
{ name = "tqdm" }, { name = "tqdm" },
{ name = "typing-extensions" }, { name = "typing-extensions" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/84/51/817969ec969b73d8ddad085670ecd8a45ef1af1811d8c3b8a177ca4d1309/openai-1.76.0.tar.gz", hash = "sha256:fd2bfaf4608f48102d6b74f9e11c5ecaa058b60dad9c36e409c12477dfd91fb2", size = 434660, upload-time = "2025-04-23T16:33:53.266Z" } sdist = { url = "https://files.pythonhosted.org/packages/84/51/817969ec969b73d8ddad085670ecd8a45ef1af1811d8c3b8a177ca4d1309/openai-1.76.0.tar.gz", hash = "sha256:fd2bfaf4608f48102d6b74f9e11c5ecaa058b60dad9c36e409c12477dfd91fb2", size = 434660 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/59/aa/84e02ab500ca871eb8f62784426963a1c7c17a72fea3c7f268af4bbaafa5/openai-1.76.0-py3-none-any.whl", hash = "sha256:a712b50e78cf78e6d7b2a8f69c4978243517c2c36999756673e07a14ce37dc0a", size = 661201, upload-time = "2025-04-23T16:33:51.12Z" }, { url = "https://files.pythonhosted.org/packages/59/aa/84e02ab500ca871eb8f62784426963a1c7c17a72fea3c7f268af4bbaafa5/openai-1.76.0-py3-none-any.whl", hash = "sha256:a712b50e78cf78e6d7b2a8f69c4978243517c2c36999756673e07a14ce37dc0a", size = 661201 },
] ]
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "2.10.6" version = "2.10.6"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "annotated-types" }, { name = "annotated-types" },
{ name = "pydantic-core" }, { name = "pydantic-core" },
{ name = "typing-extensions" }, { name = "typing-extensions" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681, upload-time = "2025-01-24T01:42:12.693Z" } sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696, upload-time = "2025-01-24T01:42:10.371Z" }, { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 },
] ]
[[package]] [[package]]
name = "pydantic-core" name = "pydantic-core"
version = "2.27.2" version = "2.27.2"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "typing-extensions" }, { name = "typing-extensions" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443, upload-time = "2024-12-18T11:31:54.917Z" } sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421, upload-time = "2024-12-18T11:27:55.409Z" }, { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998, upload-time = "2024-12-18T11:27:57.252Z" }, { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167, upload-time = "2024-12-18T11:27:59.146Z" }, { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071, upload-time = "2024-12-18T11:28:02.625Z" }, { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244, upload-time = "2024-12-18T11:28:04.442Z" }, { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470, upload-time = "2024-12-18T11:28:07.679Z" }, { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291, upload-time = "2024-12-18T11:28:10.297Z" }, { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613, upload-time = "2024-12-18T11:28:13.362Z" }, { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355, upload-time = "2024-12-18T11:28:16.587Z" }, { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661, upload-time = "2024-12-18T11:28:18.407Z" }, { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261, upload-time = "2024-12-18T11:28:21.471Z" }, { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361, upload-time = "2024-12-18T11:28:23.53Z" }, { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484, upload-time = "2024-12-18T11:28:25.391Z" }, { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102, upload-time = "2024-12-18T11:28:28.593Z" }, { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127, upload-time = "2024-12-18T11:28:30.346Z" }, { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340, upload-time = "2024-12-18T11:28:32.521Z" }, { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900, upload-time = "2024-12-18T11:28:34.507Z" }, { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177, upload-time = "2024-12-18T11:28:36.488Z" }, { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046, upload-time = "2024-12-18T11:28:39.409Z" }, { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386, upload-time = "2024-12-18T11:28:41.221Z" }, { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060, upload-time = "2024-12-18T11:28:44.709Z" }, { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870, upload-time = "2024-12-18T11:28:46.839Z" }, { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822, upload-time = "2024-12-18T11:28:48.896Z" }, { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364, upload-time = "2024-12-18T11:28:50.755Z" }, { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303, upload-time = "2024-12-18T11:28:54.122Z" }, { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064, upload-time = "2024-12-18T11:28:56.074Z" }, { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046, upload-time = "2024-12-18T11:28:58.107Z" }, { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092, upload-time = "2024-12-18T11:29:01.335Z" }, { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709, upload-time = "2024-12-18T11:29:03.193Z" }, { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273, upload-time = "2024-12-18T11:29:05.306Z" }, { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027, upload-time = "2024-12-18T11:29:07.294Z" }, { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888, upload-time = "2024-12-18T11:29:09.249Z" }, { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738, upload-time = "2024-12-18T11:29:11.23Z" }, { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138, upload-time = "2024-12-18T11:29:16.396Z" }, { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025, upload-time = "2024-12-18T11:29:20.25Z" }, { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633, upload-time = "2024-12-18T11:29:23.877Z" }, { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404, upload-time = "2024-12-18T11:29:25.872Z" }, { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130, upload-time = "2024-12-18T11:29:29.252Z" }, { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946, upload-time = "2024-12-18T11:29:31.338Z" }, { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387, upload-time = "2024-12-18T11:29:33.481Z" }, { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453, upload-time = "2024-12-18T11:29:35.533Z" }, { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 },
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186, upload-time = "2024-12-18T11:29:37.649Z" }, { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 },
] ]
[[package]] [[package]]
name = "pydantic-settings" name = "pydantic-settings"
version = "2.8.1" version = "2.8.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "pydantic" }, { name = "pydantic" },
{ name = "python-dotenv" }, { name = "python-dotenv" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550, upload-time = "2025-02-27T10:10:32.338Z" } sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839, upload-time = "2025-02-27T10:10:30.711Z" }, { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 },
] ]
[[package]] [[package]]
name = "pygments" name = "pygments"
version = "2.19.1" version = "2.19.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
] ]
[[package]] [[package]]
name = "python-dotenv" name = "python-dotenv"
version = "1.1.0" version = "1.1.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" } sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" }, { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 },
] ]
[[package]] [[package]]
name = "requests" name = "requests"
version = "2.32.3" version = "2.32.3"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "certifi" }, { name = "certifi" },
{ name = "charset-normalizer" }, { name = "charset-normalizer" },
{ name = "idna" }, { name = "idna" },
{ name = "urllib3" }, { name = "urllib3" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
] ]
[[package]] [[package]]
name = "rich" name = "rich"
version = "13.9.4" version = "13.9.4"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "markdown-it-py" }, { name = "markdown-it-py" },
{ name = "pygments" }, { name = "pygments" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload-time = "2024-11-01T16:43:57.873Z" } sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload-time = "2024-11-01T16:43:55.817Z" }, { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
] ]
[[package]] [[package]]
@ -452,109 +452,109 @@ requires-dist = [
[[package]] [[package]]
name = "shellingham" name = "shellingham"
version = "1.5.4" version = "1.5.4"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
] ]
[[package]] [[package]]
name = "sniffio" name = "sniffio"
version = "1.3.1" version = "1.3.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
] ]
[[package]] [[package]]
name = "soupsieve" name = "soupsieve"
version = "2.6" version = "2.6"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569, upload-time = "2024-08-13T13:39:12.166Z" } sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186, upload-time = "2024-08-13T13:39:10.986Z" }, { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 },
] ]
[[package]] [[package]]
name = "sse-starlette" name = "SSE-starlette"
version = "2.2.1" version = "2.2.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "anyio" }, { name = "anyio" },
{ name = "starlette" }, { name = "starlette" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376, upload-time = "2024-12-25T09:09:30.616Z" } sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120, upload-time = "2024-12-25T09:09:26.761Z" }, { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 },
] ]
[[package]] [[package]]
name = "starlette" name = "starlette"
version = "0.46.1" version = "0.46.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "anyio" }, { name = "anyio" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102, upload-time = "2025-03-08T10:55:34.504Z" } sdist = { url = "https://files.pythonhosted.org/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995, upload-time = "2025-03-08T10:55:32.662Z" }, { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 },
] ]
[[package]] [[package]]
name = "tqdm" name = "tqdm"
version = "4.67.1" version = "4.67.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" }, { name = "colorama", marker = "sys_platform == 'win32'" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 },
] ]
[[package]] [[package]]
name = "typer" name = "typer"
version = "0.15.2" version = "0.15.2"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "click" }, { name = "click" },
{ name = "rich" }, { name = "rich" },
{ name = "shellingham" }, { name = "shellingham" },
{ name = "typing-extensions" }, { name = "typing-extensions" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711, upload-time = "2025-02-27T19:17:34.807Z" } sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061, upload-time = "2025-02-27T19:17:32.111Z" }, { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 },
] ]
[[package]] [[package]]
name = "typing-extensions" name = "typing-extensions"
version = "4.13.0" version = "4.13.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0e/3e/b00a62db91a83fff600de219b6ea9908e6918664899a2d85db222f4fbf19/typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b", size = 106520, upload-time = "2025-03-26T03:49:41.628Z" } sdist = { url = "https://files.pythonhosted.org/packages/0e/3e/b00a62db91a83fff600de219b6ea9908e6918664899a2d85db222f4fbf19/typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b", size = 106520 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683, upload-time = "2025-03-26T03:49:40.35Z" }, { url = "https://files.pythonhosted.org/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683 },
] ]
[[package]] [[package]]
name = "urllib3" name = "urllib3"
version = "2.4.0" version = "2.4.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" } sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
] ]
[[package]] [[package]]
name = "uvicorn" name = "uvicorn"
version = "0.34.0" version = "0.34.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "click" }, { name = "click" },
{ name = "h11" }, { name = "h11" },
] ]
sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568, upload-time = "2024-12-15T13:33:30.42Z" } sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 }
wheels = [ wheels = [
{ url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315, upload-time = "2024-12-15T13:33:27.467Z" }, { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 },
] ]

View File

@ -26,18 +26,12 @@ export async function routeMessage(command: string, data: any, webview: PostMess
// res.code = -1 代表当前请求不需要返回发送 // res.code = -1 代表当前请求不需要返回发送
if (res.code >= 0) { if (res.code >= 0) {
webview.postMessage({ webview.postMessage({ command, data: res });
command, data: {
_id: data._id,
...res
}
});
} }
} catch (error) { } catch (error) {
// console.error(error); // console.error(error);
webview.postMessage({ webview.postMessage({
command, data: { command, data: {
_id: data._id,
code: 500, code: 500,
msg: (error as any).toString() msg: (error as any).toString()
} }

View File

@ -1,6 +1,5 @@
export let VSCODE_WORKSPACE = ''; export let VSCODE_WORKSPACE = '';
export let RUNNING_CWD = ''; export let RUNNING_CWD = '';
export let DEFAULT_LANG = 'zh';
export function setVscodeWorkspace(workspace: string) { export function setVscodeWorkspace(workspace: string) {
VSCODE_WORKSPACE = workspace; VSCODE_WORKSPACE = workspace;
@ -9,7 +8,3 @@ export function setVscodeWorkspace(workspace: string) {
export function setRunningCWD(path: string) { export function setRunningCWD(path: string) {
RUNNING_CWD = path; RUNNING_CWD = path;
} }
export function setDefaultLang(lang: string) {
DEFAULT_LANG = lang;
}

View File

@ -1,4 +1,4 @@
export { routeMessage } from './common/router.js'; export { routeMessage } from './common/router.js';
export { VSCodeWebViewLike } from './hook/adapter.js'; export { VSCodeWebViewLike } from './hook/adapter.js';
export { setVscodeWorkspace, setRunningCWD, setDefaultLang } from './hook/setting.js'; export { setVscodeWorkspace, setRunningCWD } from './hook/setting.js';
export { clientMap } from './mcp/connect.service.js'; export { clientMap } from './mcp/connect.service.js';

View File

@ -17,8 +17,6 @@ export class LlmController {
webview.postMessage({ webview.postMessage({
command: 'llm/chat/completions/error', command: 'llm/chat/completions/error',
data: { data: {
sessionId: data.sessionId,
code: 500,
msg: error msg: error
} }
}); });

View File

@ -5,16 +5,15 @@ import { RestfulResponse } from "../common/index.dto.js";
import { ocrDB } from "../hook/db.js"; import { ocrDB } from "../hook/db.js";
import type { ToolCallContent } from "../mcp/client.dto.js"; import type { ToolCallContent } from "../mcp/client.dto.js";
import { ocrWorkerStorage } from "../mcp/ocr.service.js"; import { ocrWorkerStorage } from "../mcp/ocr.service.js";
import Table from 'cli-table3';
// 用 Map<string, AsyncIterable<any> | null> 管理多个流 export let currentStream: AsyncIterable<any> | null = null;
export const chatStreams = new Map<string, AsyncIterable<any>>();
export async function streamingChatCompletion( export async function streamingChatCompletion(
data: any, data: any,
webview: PostMessageble webview: PostMessageble
) { ) {
const { const {
sessionId,
baseURL, baseURL,
apiKey, apiKey,
model, model,
@ -25,6 +24,16 @@ export async function streamingChatCompletion(
proxyServer = '' proxyServer = ''
} = data; } = data;
// 创建请求参数表格
const requestTable = new Table({
head: ['Parameter', 'Value'],
colWidths: [20, 40],
style: {
head: ['cyan'],
border: ['grey']
}
});
// 构建OpenRouter特定的请求头 // 构建OpenRouter特定的请求头
const defaultHeaders: Record<string, string> = {}; const defaultHeaders: Record<string, string> = {};
@ -45,6 +54,19 @@ export async function streamingChatCompletion(
await postProcessMessages(messages); await postProcessMessages(messages);
// // 使用表格渲染请求参数
// requestTable.push(
// ['Model', model],
// ['Base URL', baseURL || 'Default'],
// ['Temperature', temperature],
// ['Tools Count', tools.length],
// ['Parallel Tool Calls', parallelToolCalls],
// ['Proxy Server', proxyServer || 'No Proxy']
// );
// console.log('\nOpenAI Request Parameters:');
// console.log(requestTable.toString());
const stream = await client.chat.completions.create({ const stream = await client.chat.completions.create({
model, model,
messages, messages,
@ -54,20 +76,19 @@ export async function streamingChatCompletion(
stream: true stream: true
}); });
// 用 sessionId 作为 key 存储流 // 存储当前的流式传输对象
if (sessionId) { currentStream = stream;
chatStreams.set(sessionId, stream);
}
// 流式传输结果 // 流式传输结果
for await (const chunk of stream) { for await (const chunk of stream) {
if (!chatStreams.has(sessionId)) { if (!currentStream) {
// 如果流被中止,则停止循环 // 如果流被中止,则停止循环
// TODO: 为每一个标签页设置不同的 currentStream 管理器
stream.controller.abort(); stream.controller.abort();
// 传输结束
webview.postMessage({ webview.postMessage({
command: 'llm/chat/completions/done', command: 'llm/chat/completions/done',
data: { data: {
sessionId,
code: 200, code: 200,
msg: { msg: {
success: true, success: true,
@ -79,29 +100,24 @@ export async function streamingChatCompletion(
} }
if (chunk.choices) { if (chunk.choices) {
webview.postMessage({ const chunkResult = {
command: 'llm/chat/completions/chunk',
data: {
sessionId,
code: 200, code: 200,
msg: { msg: {
chunk chunk
} }
} };
webview.postMessage({
command: 'llm/chat/completions/chunk',
data: chunkResult
}); });
} }
} }
console.log('sessionId finish ' + sessionId); // 传输结束
// 传输结束,移除对应的 stream
if (sessionId) {
chatStreams.delete(sessionId);
}
webview.postMessage({ webview.postMessage({
command: 'llm/chat/completions/done', command: 'llm/chat/completions/done',
data: { data: {
sessionId,
code: 200, code: 200,
msg: { msg: {
success: true, success: true,
@ -114,9 +130,9 @@ export async function streamingChatCompletion(
// 处理中止消息的函数 // 处理中止消息的函数
export function abortMessageService(data: any, webview: PostMessageble): RestfulResponse { export function abortMessageService(data: any, webview: PostMessageble): RestfulResponse {
const sessionId = data?.sessionId; if (currentStream) {
if (sessionId) { // 标记流已中止
chatStreams.delete(sessionId); currentStream = null;
} }
return { return {

View File

@ -110,7 +110,6 @@ wss.on('connection', (ws) => {
webview.postMessage({ webview.postMessage({
command: 'web/launch-signature', command: 'web/launch-signature',
data: { data: {
_id: data._id,
code: 200, code: 200,
msg: option.items msg: option.items
} }

View File

@ -44,7 +44,6 @@ export class McpServerConnectMonitor {
switch (options.connectionType) { switch (options.connectionType) {
case 'STDIO': case 'STDIO':
console.log('monitor on ' + this.filePath);
this.setupStdioMonitor(onchange); this.setupStdioMonitor(onchange);
break; break;
case 'SSE': case 'SSE':
@ -65,6 +64,8 @@ export class McpServerConnectMonitor {
try { try {
await onchange(this.uuid, this.Options); await onchange(this.uuid, this.Options);
console.log('send something');
this.sendWebviewMessage('connect/refresh', { this.sendWebviewMessage('connect/refresh', {
code: 200, code: 200,
msg: { msg: {

View File

@ -25,21 +25,6 @@ export async function updateClientMap(uuid: string, options: McpOptions): Promis
chalk.white('update client tools'), chalk.white('update client tools'),
chalk.blue(tools.tools.map(tool => tool.name).join(',')) chalk.blue(tools.tools.map(tool => tool.name).join(','))
); );
const resourceTemplates = await client.listResourceTemplates();
console.log(
chalk.white('update client resourceTemplates'),
chalk.blue(resourceTemplates.resourceTemplates.map(r => r.name).join(','))
);
const resources = await client.listResources();
console.log(
chalk.white('update client resources'),
chalk.blue(resources.resources.map(r => r.name).join(','))
);
const prompts = await client.listPrompts();
console.log(
chalk.white('update client prompts'),
chalk.blue(prompts.prompts.map(p => p.name).join(','))
);
return { res: true }; return { res: true };
} catch (error) { } catch (error) {
console.error('[updateClientMap] error:', error); console.error('[updateClientMap] error:', error);

View File

@ -1,7 +1,7 @@
import * as fs from 'fs'; import * as fs from 'fs';
import * as os from 'os'; import * as os from 'os';
import * as path from 'path'; import * as path from 'path';
import { DEFAULT_LANG, VSCODE_WORKSPACE } from '../hook/setting.js'; import { VSCODE_WORKSPACE } from '../hook/setting.js';
import { IConfig } from './setting.dto.js'; import { IConfig } from './setting.dto.js';
import { llms } from '../hook/llm.js'; import { llms } from '../hook/llm.js';
@ -14,14 +14,19 @@ function getConfigurationPath() {
return path.join(configDir, 'setting.json'); return path.join(configDir, 'setting.json');
} }
function getDefaultConfig() { function getDefaultLanguage() {
return { if (process.env.VSCODE_PID) {
// TODO: 获取 vscode 内部的语言
}
return 'zh';
}
const DEFAULT_CONFIG: IConfig = {
MODEL_INDEX: 0, MODEL_INDEX: 0,
LLM_INFO: llms, LLM_INFO: llms,
LANG: DEFAULT_LANG, LANG: getDefaultLanguage(), MCP_TIMEOUT_SEC: 60
MCP_TIMEOUT_SEC: 60 };
}
}
function createConfig(): IConfig { function createConfig(): IConfig {
@ -34,9 +39,8 @@ function createConfig(): IConfig {
} }
// 写入默认配置 // 写入默认配置
const defaultConfig = getDefaultConfig(); fs.writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2), 'utf-8');
fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2), 'utf-8'); return DEFAULT_CONFIG;
return defaultConfig;
} }
export function loadSetting(): IConfig { export function loadSetting(): IConfig {

View File

@ -1,6 +1,6 @@
{ {
"clientId": "27a62b3c-2b3c-562b3c408e5-862b3c408e5800e-5800ec5e", "clientId": "ea2b1e70-1e70-5b1e705a3ac-8b1e705a3ac8921-c8921324",
"currentIndex": 0, "currentIndex": 1,
"tabs": [ "tabs": [
{ {
"name": "工具", "name": "工具",
@ -42,11 +42,7 @@
], ],
"isError": false "isError": false
}, },
"currentPromptName": "translate", "currentPromptName": "translate"
"autoDetectDiagram": {
"edges": [],
"views": []
}
} }
}, },
{ {
@ -414,6 +410,322 @@
}, },
"enabled": true "enabled": true
}, },
{
"name": "k_get_full_page_text",
"description": "获取页面所有文本内容",
"inputSchema": {
"type": "object",
"properties": {}
},
"enabled": true
},
{
"name": "k_navigate",
"description": "Navigate to a URL",
"inputSchema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "URL to navigate to"
},
"launchOptions": {
"type": "object",
"description": "PuppeteerJS LaunchOptions. Default null. If changed and not null, browser restarts. Example: { headless: true, args: ['--no-sandbox'] }"
},
"allowDangerous": {
"type": "boolean",
"description": "Allow dangerous LaunchOptions that reduce security. When false, dangerous args like --no-sandbox will throw errors. Default false."
}
},
"required": [
"url"
]
},
"enabled": true
},
{
"name": "k_screenshot",
"description": "Take a screenshot of the current page or a specific element",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name for the screenshot"
},
"selector": {
"type": "string",
"description": "CSS selector for element to screenshot"
},
"width": {
"type": "number",
"description": "Width in pixels (default: 800)"
},
"height": {
"type": "number",
"description": "Height in pixels (default: 600)"
}
},
"required": [
"name"
]
},
"enabled": true
},
{
"name": "k_click",
"description": "Click an element on the page",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to click"
}
},
"required": [
"selector"
]
},
"enabled": true
},
{
"name": "k_fill",
"description": "Fill out an input field",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for input field"
},
"value": {
"type": "string",
"description": "Value to fill"
}
},
"required": [
"selector",
"value"
]
},
"enabled": true
},
{
"name": "k_select",
"description": "Select an element on the page with Select tag",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to select"
},
"value": {
"type": "string",
"description": "Value to select"
}
},
"required": [
"selector",
"value"
]
},
"enabled": true
},
{
"name": "k_hover",
"description": "Hover an element on the page",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to hover"
}
},
"required": [
"selector"
]
},
"enabled": true
},
{
"name": "k_evaluate",
"description": "Execute JavaScript in the browser console",
"inputSchema": {
"type": "object",
"properties": {
"script": {
"type": "string",
"description": "JavaScript code to execute"
}
},
"required": [
"script"
]
},
"enabled": true
},
{
"name": "k_get_full_page_text",
"description": "获取页面所有文本内容",
"inputSchema": {
"type": "object",
"properties": {}
},
"enabled": true
},
{
"name": "k_navigate",
"description": "Navigate to a URL",
"inputSchema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "URL to navigate to"
},
"launchOptions": {
"type": "object",
"description": "PuppeteerJS LaunchOptions. Default null. If changed and not null, browser restarts. Example: { headless: true, args: ['--no-sandbox'] }"
},
"allowDangerous": {
"type": "boolean",
"description": "Allow dangerous LaunchOptions that reduce security. When false, dangerous args like --no-sandbox will throw errors. Default false."
}
},
"required": [
"url"
]
},
"enabled": true
},
{
"name": "k_screenshot",
"description": "Take a screenshot of the current page or a specific element",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name for the screenshot"
},
"selector": {
"type": "string",
"description": "CSS selector for element to screenshot"
},
"width": {
"type": "number",
"description": "Width in pixels (default: 800)"
},
"height": {
"type": "number",
"description": "Height in pixels (default: 600)"
}
},
"required": [
"name"
]
},
"enabled": true
},
{
"name": "k_click",
"description": "Click an element on the page",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to click"
}
},
"required": [
"selector"
]
},
"enabled": true
},
{
"name": "k_fill",
"description": "Fill out an input field",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for input field"
},
"value": {
"type": "string",
"description": "Value to fill"
}
},
"required": [
"selector",
"value"
]
},
"enabled": true
},
{
"name": "k_select",
"description": "Select an element on the page with Select tag",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to select"
},
"value": {
"type": "string",
"description": "Value to select"
}
},
"required": [
"selector",
"value"
]
},
"enabled": true
},
{
"name": "k_hover",
"description": "Hover an element on the page",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to hover"
}
},
"required": [
"selector"
]
},
"enabled": true
},
{
"name": "k_evaluate",
"description": "Execute JavaScript in the browser console",
"inputSchema": {
"type": "object",
"properties": {
"script": {
"type": "string",
"description": "JavaScript code to execute"
}
},
"required": [
"script"
]
},
"enabled": true
},
{ {
"name": "k_get_full_page_text", "name": "k_get_full_page_text",
"description": "获取页面所有文本内容", "description": "获取页面所有文本内容",

View File

@ -1,8 +1,7 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { setRunningCWD, setVscodeWorkspace, setDefaultLang } from '../openmcp-sdk/service/index.js'; import { setRunningCWD, setVscodeWorkspace } from '../openmcp-sdk/service/index.js';
import { launch } from './common/entry.js'; import { launch } from './common/entry.js';
import { initialiseI18n, getAvailableKeys, getDefaultLanguage } from './i18n/index.js'; import { initialiseI18n, getAvailableKeys } from './i18n/index.js';
import { checkNews } from './webview/webview.service.js';
export function activate(context: vscode.ExtensionContext) { export function activate(context: vscode.ExtensionContext) {
console.log('activate openmcp'); console.log('activate openmcp');
@ -13,9 +12,6 @@ export function activate(context: vscode.ExtensionContext) {
const workspace = workspaceFolder?.uri.fsPath || ''; const workspace = workspaceFolder?.uri.fsPath || '';
setVscodeWorkspace(workspace); setVscodeWorkspace(workspace);
setRunningCWD(context.extensionPath); setRunningCWD(context.extensionPath);
const lang = getDefaultLanguage();
setDefaultLang(lang);
initialiseI18n(context); initialiseI18n(context);
// 添加i18n调试信息 // 添加i18n调试信息
@ -23,7 +19,6 @@ export function activate(context: vscode.ExtensionContext) {
console.log('Available i18n keys:', getAvailableKeys().length); console.log('Available i18n keys:', getAvailableKeys().length);
launch(context); launch(context);
checkNews(context);
} }

View File

@ -39,7 +39,6 @@ export interface McpOptions {
name?: string; name?: string;
version?: string; version?: string;
type?: ConnectionType; type?: ConnectionType;
rename?: boolean;
[key: string]: any; [key: string]: any;
} }
@ -153,7 +152,8 @@ export function getWorkspaceConnectionConfig():IConnectionConfig| null {
const workspacePath = getWorkspacePath(); const workspacePath = getWorkspacePath();
for (let item of connection.items) { for (let item of connection.items) {
for (let connection of detachMcpOptionAsArray(item)) { const connections = Array.isArray(item) ? item : [item];
for (let connection of connections) {
const connectionType = (connection.type || connection.connectionType).toUpperCase() as ConnectionType; const connectionType = (connection.type || connection.connectionType).toUpperCase() as ConnectionType;
connection.type = undefined; connection.type = undefined;
connection.connectionType = connectionType; connection.connectionType = connectionType;
@ -205,9 +205,8 @@ export function saveWorkspaceConnectionConfig(workspace: string) {
const workspacePath = getWorkspacePath(); const workspacePath = getWorkspacePath();
for (let item of connectionConfig.items) { for (let item of connectionConfig.items) {
for (let connection of detachMcpOptionAsArray(item)) { const connections = Array.isArray(item) ? item : [item];
console.log(connection); for (let connection of connections) {
const connectionType = (connection.type || connection.connectionType).toUpperCase() as ConnectionType; const connectionType = (connection.type || connection.connectionType).toUpperCase() as ConnectionType;
connection.type = undefined; connection.type = undefined;
connection.connectionType = connectionType; connection.connectionType = connectionType;
@ -246,22 +245,20 @@ export function updateWorkspaceConnectionConfig(
// 如果存在,替换老的 connectionItem // 如果存在,替换老的 connectionItem
if (connectionItem) { if (connectionItem) {
console.log("存在的 connection")
const index = workspaceConnectionConfig.items.indexOf(connectionItem); const index = workspaceConnectionConfig.items.indexOf(connectionItem);
if (index !== -1) { if (index !== -1) {
// check rename value // 替换现有项目而不是删除后插入到开头
const oldNItem = detachMcpOptionAsItem(workspaceConnectionConfig.items[index]); console.log("替换现有项目而不是删除后插入到开头")
if (oldNItem.rename) {
// if renamed, reserve user defined name
const newNItem = detachMcpOptionAsItem(data);
newNItem.name = oldNItem.name;
}
workspaceConnectionConfig.items[index] = data; workspaceConnectionConfig.items[index] = data;
} else { } else {
// insert new one // 如果索引查找失败,则插入到第一个
console.log("没有找到现有项目,插入到第一个")
workspaceConnectionConfig.items.unshift(data); workspaceConnectionConfig.items.unshift(data);
} }
} else { } else {
// 没有找到现有项目,插入到第一个
console.log("没有找到现有项目,插入到第一个")
workspaceConnectionConfig.items.unshift(data); workspaceConnectionConfig.items.unshift(data);
} }
@ -289,14 +286,18 @@ export function updateInstalledConnectionConfig(
console.log('get connectionItem: ', data); console.log('get connectionItem: ', data);
// 如果存在,替换老的 connectionItem
if (connectionItem) { if (connectionItem) {
const index = installedConnectionConfig.items.indexOf(connectionItem); const index = installedConnectionConfig.items.indexOf(connectionItem);
if (index !== -1) { if (index !== -1) {
// 替换现有项目而不是删除后插入到开头
installedConnectionConfig.items[index] = data; installedConnectionConfig.items[index] = data;
} else { } else {
// 如果索引查找失败,则插入到第一个
installedConnectionConfig.items.unshift(data); installedConnectionConfig.items.unshift(data);
} }
} else { } else {
// 没有找到现有项目,插入到第一个
installedConnectionConfig.items.unshift(data); installedConnectionConfig.items.unshift(data);
} }
@ -337,7 +338,7 @@ export function getWorkspaceConnectionConfigItemByPath(absPath: string) {
const normaliseAbsPath = absPath.replace(/\\/g, '/'); const normaliseAbsPath = absPath.replace(/\\/g, '/');
for (let item of workspaceConnectionConfig.items) { for (let item of workspaceConnectionConfig.items) {
const nItem = detachMcpOptionAsItem(item); const nItem = Array.isArray(item) ? item[0] : item;
const filePath = normaliseConnectionFilePath(nItem, workspacePath); const filePath = normaliseConnectionFilePath(nItem, workspacePath);
if (filePath === normaliseAbsPath) { if (filePath === normaliseAbsPath) {
@ -358,7 +359,7 @@ export function getWorkspaceConnectionConfigItemByName(name: string) {
return null; // 如果没有工作区连接配置文件,则返回 null return null; // 如果没有工作区连接配置文件,则返回 null
} }
for (let item of workspaceConnectionConfig.items) { for (let item of workspaceConnectionConfig.items) {
const nItem = detachMcpOptionAsItem(item); const nItem = Array.isArray(item) ? item[0] : item;
if (nItem.name === name) { if (nItem.name === name) {
return item; return item;
} }
@ -375,7 +376,7 @@ export function getInstalledConnectionConfigItemByName(name: string) {
const installedConnectionConfig = getConnectionConfig(); const installedConnectionConfig = getConnectionConfig();
for (let item of installedConnectionConfig.items) { for (let item of installedConnectionConfig.items) {
const nItem = detachMcpOptionAsItem(item); const nItem = Array.isArray(item) ? item[0] : item;
if (nItem.name) { if (nItem.name) {
return item; return item;
@ -395,7 +396,7 @@ export function getInstalledConnectionConfigItemByPath(absPath: string) {
const normaliseAbsPath = absPath.replace(/\\/g, '/'); const normaliseAbsPath = absPath.replace(/\\/g, '/');
for (let item of installedConnectionConfig.items) { for (let item of installedConnectionConfig.items) {
const nItem = detachMcpOptionAsItem(item); const nItem = Array.isArray(item) ? item[0] : item;
const filePath = (nItem.filePath || '').replace(/\\/g, '/'); const filePath = (nItem.filePath || '').replace(/\\/g, '/');
if (filePath === normaliseAbsPath) { if (filePath === normaliseAbsPath) {
@ -448,11 +449,3 @@ export async function exportFile(filename: string, content: any) {
fs.writeFileSync(uri.fsPath, content, 'utf-8'); fs.writeFileSync(uri.fsPath, content, 'utf-8');
} }
} }
export function detachMcpOptionAsItem(data: McpOptions | McpOptions[]): McpOptions {
return Array.isArray(data) ? data[0] : data;
}
export function detachMcpOptionAsArray(data: McpOptions | McpOptions[]): McpOptions[] {
return Array.isArray(data) ? data : [data];
}

View File

@ -2,7 +2,7 @@ import { RegisterCommand } from "../common/index.js";
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as path from 'path'; import * as path from 'path';
import Tesseract from 'tesseract.js'; import Tesseract from 'tesseract.js';
import { revealOpenMcpNewsWebviewPanel } from "../webview/webview.service.js";
export class HookController { export class HookController {
@ -40,8 +40,4 @@ export class HookController {
} }
} }
@RegisterCommand('openmcp.hook.test-news')
async testNews(context: vscode.ExtensionContext) {
revealOpenMcpNewsWebviewPanel(context);
}
} }

View File

@ -4,14 +4,6 @@ import * as path from 'path';
const defaultBundle: Record<string, string> = {} const defaultBundle: Record<string, string> = {}
export function getDefaultLanguage() {
const lang = vscode.env.language || 'en';
if (lang === 'zh-cn') {
return 'zh';
}
return lang;
}
export function initialiseI18n(context: vscode.ExtensionContext) { export function initialiseI18n(context: vscode.ExtensionContext) {
if (vscode.l10n.bundle === undefined) { if (vscode.l10n.bundle === undefined) {
// 获取用户的语言设置 // 获取用户的语言设置

View File

@ -20,12 +20,12 @@ export class HelpProvider implements vscode.TreeDataProvider<SidebarItem> {
new SidebarItem(t('quick-start'), vscode.TreeItemCollapsibleState.None, { new SidebarItem(t('quick-start'), vscode.TreeItemCollapsibleState.None, {
command: 'vscode.open', command: 'vscode.open',
title: 'Open Guide', title: 'Open Guide',
arguments: [vscode.Uri.parse('https://openmcp.kirigaya.cn/plugin-tutorial/usage/connect-mcp.html')] arguments: [vscode.Uri.parse('https://kirigaya.cn/openmcp/plugin-tutorial/usage/connect-mcp.html·')]
}, 'book'), }, 'book'),
new SidebarItem(t('read-document'), vscode.TreeItemCollapsibleState.None, { new SidebarItem(t('read-document'), vscode.TreeItemCollapsibleState.None, {
command: 'vscode.open', command: 'vscode.open',
title: 'Open Documentation', title: 'Open Documentation',
arguments: [vscode.Uri.parse('https://openmcp.kirigaya.cn')] arguments: [vscode.Uri.parse('https://kirigaya.cn/openmcp')]
}, 'file-text'), }, 'file-text'),
new SidebarItem(t('report-issue'), vscode.TreeItemCollapsibleState.None, { new SidebarItem(t('report-issue'), vscode.TreeItemCollapsibleState.None, {
command: 'vscode.open', command: 'vscode.open',

View File

@ -2,7 +2,7 @@ import * as vscode from 'vscode';
import { RegisterCommand, RegisterTreeDataProvider } from '../common/index.js'; import { RegisterCommand, RegisterTreeDataProvider } from '../common/index.js';
import { ConnectionViewItem } from './common.js'; import { ConnectionViewItem } from './common.js';
import { getConnectionConfig, getInstalledConnectionConfigPath, saveConnectionConfig } from '../global.js'; import { getConnectionConfig, getInstalledConnectionConfigPath, saveConnectionConfig } from '../global.js';
import { acquireInstalledConnection, changeInstalledConnectionName, deleteInstalledConnection } from './installed.service.js'; import { acquireInstalledConnection, deleteInstalledConnection } from './installed.service.js';
import { revealOpenMcpWebviewPanel } from '../webview/webview.service.js'; import { revealOpenMcpWebviewPanel } from '../webview/webview.service.js';
@RegisterTreeDataProvider('openmcp.sidebar.installed-connection') @RegisterTreeDataProvider('openmcp.sidebar.installed-connection')
@ -14,7 +14,6 @@ export class McpInstalledConnectProvider implements vscode.TreeDataProvider<Conn
// 实现 TreeDataProvider 接口 // 实现 TreeDataProvider 接口
getTreeItem(element: ConnectionViewItem): vscode.TreeItem { getTreeItem(element: ConnectionViewItem): vscode.TreeItem {
element.contextValue = 'installed-item';
return element; return element;
} }
@ -76,10 +75,4 @@ export class McpInstalledConnectProvider implements vscode.TreeDataProvider<Conn
const connectionItem = view.item; const connectionItem = view.item;
await deleteInstalledConnection(connectionItem); await deleteInstalledConnection(connectionItem);
} }
@RegisterCommand('changeConnectionName')
public async changeConnectionName(context: vscode.ExtensionContext, view: ConnectionViewItem) {
const connectionItem = view.item;
await changeInstalledConnectionName(connectionItem);
}
} }

View File

@ -44,47 +44,6 @@ export async function deleteInstalledConnection(item: McpOptions[] | McpOptions)
} }
} }
export async function changeInstalledConnectionName(item: McpOptions[] | McpOptions) {
// 获取当前连接项
const masterNode = Array.isArray(item) ? item[0] : item;
const currentName = masterNode.name || '';
// 弹出输入框让用户输入新的服务器名称
const newName = await vscode.window.showInputBox({
prompt: t('openmcp.sidebar.installed-connection.changeConnectionName.title'),
value: currentName,
validateInput: (value) => {
if (!value || value.trim() === '') {
return t('error.connectionNameRequired');
}
return null;
}
});
// 用户取消或输入无效名称
if (!newName || newName.trim() === '' || newName === currentName) {
return;
}
// 获取已安装的连接配置
const installedConnection = getConnectionConfig();
// 更新 panel 标题
if (masterNode.name && panels.has(masterNode.name)) {
const panel = panels.get(masterNode.name)!;
panel.title = 'OpenMCP ' + newName.trim();
}
// 更新连接名称
masterNode.name = newName.trim();
masterNode.rename = true;
// 保存更新后的配置
saveConnectionConfig();
// 刷新侧边栏视图
vscode.commands.executeCommand('openmcp.sidebar.installed-connection.refresh');
}
export async function acquireInstalledConnection(): Promise<McpOptions[]> { export async function acquireInstalledConnection(): Promise<McpOptions[]> {
// 让用户选择连接类型 // 让用户选择连接类型

Some files were not shown because too many files have changed in this diff Show More