xiaozhi-client 1.9.3 → 1.9.4-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +2 -2
  2. package/dist/WebServerLauncher.js +2 -100
  3. package/dist/backend/WebServerLauncher.js +100 -0
  4. package/dist/backend/WebServerLauncher.js.map +1 -0
  5. package/dist/backend/cli.js +129 -0
  6. package/dist/backend/cli.js.map +1 -0
  7. package/dist/{package.json → backend/package.json} +21 -9
  8. package/dist/cli.js +2 -129
  9. package/dist/docs/404/index.html +19 -0
  10. package/dist/docs/404.html +19 -0
  11. package/dist/docs/_next/static/JZ0ESgtaHnsqkxSabOqqU/_buildManifest.js +1 -0
  12. package/dist/docs/_next/static/JZ0ESgtaHnsqkxSabOqqU/_ssgManifest.js +1 -0
  13. package/dist/docs/_next/static/chunks/112-c9cbd8401d35f825.js +4 -0
  14. package/dist/docs/_next/static/chunks/2a9bc5d7-4c434acf20ba934a.js +1 -0
  15. package/dist/docs/_next/static/chunks/782-c26ca6c69e488d48.js +1 -0
  16. package/dist/docs/_next/static/chunks/799-fe0d35806fd12012.js +1 -0
  17. package/dist/docs/_next/static/chunks/9b1cb2c3-cc9ed703e6aef1a2.js +1 -0
  18. package/dist/docs/_next/static/chunks/app/[[...mdxPath]]/page-48f5c8f3210e0a8a.js +1 -0
  19. package/dist/docs/_next/static/chunks/app/_not-found/page-2e38866a1cbb77e4.js +1 -0
  20. package/dist/docs/_next/static/chunks/app/layout-e8f420537fd59e8d.js +1 -0
  21. package/dist/docs/_next/static/chunks/framework-b73126dabbf07067.js +1 -0
  22. package/dist/docs/_next/static/chunks/main-75dc65850b89d90d.js +1 -0
  23. package/dist/docs/_next/static/chunks/main-app-3303134270964ce6.js +1 -0
  24. package/dist/docs/_next/static/chunks/pages/_app-e698a68d07c8993d.js +1 -0
  25. package/dist/docs/_next/static/chunks/pages/_error-189a41ab5833da03.js +1 -0
  26. package/dist/docs/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  27. package/dist/docs/_next/static/chunks/webpack-10e2bf7d852ddb6e.js +1 -0
  28. package/dist/docs/_next/static/css/2d82b615fcca1590.css +1 -0
  29. package/dist/docs/_next/static/css/b03484a3c350cf6e.css +1 -0
  30. package/dist/docs/_next/static/css/b289318ef4b60b0a.css +1 -0
  31. package/dist/docs/changelog/index.html +585 -0
  32. package/dist/docs/changelog/index.txt +1079 -0
  33. package/dist/docs/images/coze-workflow/get-parameter.png +0 -0
  34. package/dist/docs/index.html +22 -0
  35. package/dist/docs/index.txt +41 -0
  36. package/dist/docs/quickstart/index.html +64 -0
  37. package/dist/docs/quickstart/index.txt +185 -0
  38. package/dist/docs/reference/command/index.html +20 -0
  39. package/dist/docs/reference/command/index.txt +42 -0
  40. package/dist/docs/usage/as-mcp/index.html +36 -0
  41. package/dist/docs/usage/as-mcp/index.txt +101 -0
  42. package/dist/docs/usage/coze-workflow/index.html +35 -0
  43. package/dist/docs/usage/coze-workflow/index.txt +120 -0
  44. package/dist/docs/usage/docker/index.html +40 -0
  45. package/dist/docs/usage/docker/index.txt +154 -0
  46. package/dist/docs/usage/modelscope/index.html +32 -0
  47. package/dist/docs/usage/modelscope/index.txt +109 -0
  48. package/dist/docs/usage/multi-endpoint/index.html +32 -0
  49. package/dist/docs/usage/multi-endpoint/index.txt +118 -0
  50. package/dist/frontend/assets/form-utils-h64o2Nyg.js.map +1 -0
  51. package/{apps/frontend/dist → dist/frontend}/assets/index-88NfCOo9.js.map +1 -1
  52. package/dist/frontend/assets/radix-ui-BA32w1ww.js.map +1 -0
  53. package/dist/frontend/assets/react-vendor-DrjkXih1.js.map +1 -0
  54. package/dist/frontend/assets/utils-CiPelQLP.js.map +1 -0
  55. package/dist/frontend/assets/vendor-DK9yaMt3.js.map +1 -0
  56. package/dist/shared-types/index.js +36 -0
  57. package/dist/shared-types/index.js.map +1 -0
  58. package/package.json +21 -9
  59. package/apps/frontend/README.md +0 -169
  60. package/apps/frontend/dist/assets/form-utils-h64o2Nyg.js.map +0 -1
  61. package/apps/frontend/dist/assets/radix-ui-BA32w1ww.js.map +0 -1
  62. package/apps/frontend/dist/assets/react-vendor-DrjkXih1.js.map +0 -1
  63. package/apps/frontend/dist/assets/utils-CiPelQLP.js.map +0 -1
  64. package/apps/frontend/dist/assets/vendor-DK9yaMt3.js.map +0 -1
  65. package/dist/WebServerLauncher.js.map +0 -1
  66. package/dist/cli.js.map +0 -1
  67. package/docs/arch/cache.mdx +0 -885
  68. package/docs/changelog.mdx +0 -645
  69. package/docs/development/architecture.mdx +0 -71
  70. package/docs/development/docker-build.mdx +0 -256
  71. package/docs/development/todo__release-guide.md +0 -563
  72. package/docs/development/todo__setting-manager.md +0 -122
  73. package/docs/docs.json +0 -55
  74. package/docs/getting-started/install.mdx +0 -191
  75. package/docs/getting-started/intro.mdx +0 -11
  76. package/docs/getting-started/quickstart.mdx +0 -108
  77. package/docs/mcp-tool-calling.md +0 -363
  78. package/docs/python-dependencies.md +0 -216
  79. package/docs/reference/command.mdx +0 -15
  80. package/docs/usage/add-mcp-server.mdx +0 -6
  81. package/docs/usage/as-a-mcp-server.mdx +0 -76
  82. package/docs/usage/coze-workflow.mdx +0 -73
  83. package/docs/usage/docker.mdx +0 -99
  84. package/docs/usage/modelscope.mdx +0 -74
  85. package/docs/usage/use-multi-xiaozhi-mcp-endpoints.mdx +0 -77
  86. package/docs/usage/web-control.mdx +0 -6
  87. /package/dist/{WebServerLauncher.d.ts → backend/WebServerLauncher.d.ts} +0 -0
  88. /package/dist/{cli.d.ts → backend/cli.d.ts} +0 -0
  89. /package/dist/{templates → backend/templates}/default/mcpServers/calculator.js +0 -0
  90. /package/dist/{templates → backend/templates}/default/mcpServers/datetime.js +0 -0
  91. /package/dist/{templates → backend/templates}/default/package.json +0 -0
  92. /package/dist/{templates → backend/templates}/default/xiaozhi.config.json +0 -0
  93. /package/dist/{templates → backend/templates}/hello-world/mcpServers/calculator.js +0 -0
  94. /package/dist/{templates → backend/templates}/hello-world/mcpServers/datetime.js +0 -0
  95. /package/dist/{templates → backend/templates}/hello-world/package.json +0 -0
  96. /package/dist/{templates → backend/templates}/hello-world/xiaozhi.config.json +0 -0
  97. /package/dist/{templates → backend/templates}/json5/mcpServers/calculator.js +0 -0
  98. /package/dist/{templates → backend/templates}/json5/mcpServers/datetime.js +0 -0
  99. /package/dist/{templates → backend/templates}/json5/package.json +0 -0
  100. /package/dist/{templates → backend/templates}/json5/xiaozhi.config.json5 +0 -0
  101. /package/dist/{templates → backend/templates}/jsonc/mcpServers/calculator.js +0 -0
  102. /package/dist/{templates → backend/templates}/jsonc/mcpServers/datetime.js +0 -0
  103. /package/dist/{templates → backend/templates}/jsonc/package.json +0 -0
  104. /package/dist/{templates → backend/templates}/jsonc/xiaozhi.config.jsonc +0 -0
  105. /package/dist/{templates → backend/templates}/modelscope/xiaozhi.config.json +0 -0
  106. /package/{docs/images/coze-workflow/get-parameter.png → dist/docs/_next/static/media/get-parameter.62eee93d.png} +0 -0
  107. /package/{docs → dist/docs}/images/add-to-cherry-studio/step-1.png +0 -0
  108. /package/{docs → dist/docs}/images/add-to-cherry-studio/step-2.png +0 -0
  109. /package/{docs → dist/docs}/images/add-to-cherry-studio/step-3.png +0 -0
  110. /package/{docs → dist/docs}/images/add-to-cherry-studio/step-4.png +0 -0
  111. /package/{docs → dist/docs}/images/add-to-cherry-studio/step-5.png +0 -0
  112. /package/{docs → dist/docs}/images/add-to-cursor/step-1.png +0 -0
  113. /package/{docs → dist/docs}/images/add-to-cursor/step-2.png +0 -0
  114. /package/{docs → dist/docs}/images/add-to-cursor/step-3.png +0 -0
  115. /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-1.png +0 -0
  116. /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-2.png +0 -0
  117. /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-3.png +0 -0
  118. /package/{docs → dist/docs}/images/integrate-to-cherry-studio.png +0 -0
  119. /package/{docs → dist/docs}/images/integrate-to-cursor.png +0 -0
  120. /package/{docs → dist/docs}/images/modelscope/step-1.png +0 -0
  121. /package/{docs → dist/docs}/images/modelscope/step-2.png +0 -0
  122. /package/{docs → dist/docs}/images/modelscope/step-3.png +0 -0
  123. /package/{docs → dist/docs}/images/modelscope/step-4.png +0 -0
  124. /package/{docs → dist/docs}/images/preview.png +0 -0
  125. /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-1.png +0 -0
  126. /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-2.png +0 -0
  127. /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-3.png +0 -0
  128. /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-4.png +0 -0
  129. /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-5.png +0 -0
  130. /package/{docs → dist/docs}/images/web-ui-preview.png +0 -0
  131. /package/{apps/frontend/dist → dist/frontend}/assets/form-utils-h64o2Nyg.js +0 -0
  132. /package/{apps/frontend/dist → dist/frontend}/assets/index-88NfCOo9.js +0 -0
  133. /package/{apps/frontend/dist → dist/frontend}/assets/index-P6Zq3MZF.css +0 -0
  134. /package/{apps/frontend/dist → dist/frontend}/assets/radix-ui-BA32w1ww.js +0 -0
  135. /package/{apps/frontend/dist → dist/frontend}/assets/react-vendor-DrjkXih1.js +0 -0
  136. /package/{apps/frontend/dist → dist/frontend}/assets/utils-CiPelQLP.js +0 -0
  137. /package/{apps/frontend/dist → dist/frontend}/assets/vendor-DK9yaMt3.js +0 -0
  138. /package/{apps/frontend/dist → dist/frontend}/index.html +0 -0
@@ -0,0 +1,36 @@
1
+ // src/frontend/api.ts
2
+ var MCPErrorCode = /* @__PURE__ */ ((MCPErrorCode2) => {
3
+ MCPErrorCode2["SERVER_NOT_FOUND"] = "SERVER_NOT_FOUND";
4
+ MCPErrorCode2["SERVER_ALREADY_EXISTS"] = "SERVER_ALREADY_EXISTS";
5
+ MCPErrorCode2["INVALID_SERVICE_NAME"] = "INVALID_SERVICE_NAME";
6
+ MCPErrorCode2["INVALID_CONFIG"] = "INVALID_CONFIG";
7
+ MCPErrorCode2["CONFIG_UPDATE_FAILED"] = "CONFIG_UPDATE_FAILED";
8
+ MCPErrorCode2["CONNECTION_FAILED"] = "CONNECTION_FAILED";
9
+ MCPErrorCode2["ADD_FAILED"] = "ADD_FAILED";
10
+ MCPErrorCode2["REMOVE_FAILED"] = "REMOVE_FAILED";
11
+ MCPErrorCode2["INTERNAL_ERROR"] = "INTERNAL_ERROR";
12
+ MCPErrorCode2["VALIDATION_ERROR"] = "VALIDATION_ERROR";
13
+ return MCPErrorCode2;
14
+ })(MCPErrorCode || {});
15
+
16
+ // src/utils/timeout.ts
17
+ var TimeoutError = class _TimeoutError extends Error {
18
+ name = "TimeoutError";
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = "TimeoutError";
22
+ Error.captureStackTrace(this, _TimeoutError);
23
+ }
24
+ toJSON() {
25
+ return {
26
+ name: this.name,
27
+ message: this.message,
28
+ stack: this.stack
29
+ };
30
+ }
31
+ };
32
+ export {
33
+ MCPErrorCode,
34
+ TimeoutError
35
+ };
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/shared-types/src/frontend/api.ts","../../packages/shared-types/src/utils/timeout.ts"],"sourcesContent":["/**\n * 前端API响应相关类型定义\n */\n\nimport type { MCPServerConfig } from \"../config\";\n\n/**\n * MCP 服务添加请求接口(单服务格式)\n */\nexport interface MCPServerAddRequest {\n name: string;\n config: MCPServerConfig;\n}\n\n/**\n * MCP 服务批量添加请求接口(mcpServers 格式)\n */\nexport interface MCPServerBatchAddRequest {\n mcpServers: Record<string, MCPServerConfig>;\n}\n\n/**\n * MCP 服务添加操作结果\n */\nexport interface MCPServerAddResult {\n name: string;\n success: boolean;\n error?: string;\n config?: MCPServerConfig;\n tools?: string[];\n status?: string;\n}\n\n/**\n * MCP 服务批量添加响应\n */\nexport interface MCPServerBatchAddResponse {\n success: boolean;\n message: string;\n results: MCPServerAddResult[];\n addedCount: number;\n failedCount: number;\n}\n\n/**\n * MCP 服务状态接口\n */\nexport interface MCPServerStatus {\n name: string;\n status: \"connected\" | \"disconnected\" | \"connecting\" | \"error\";\n connected: boolean;\n tools: string[];\n lastUpdated?: string;\n config: MCPServerConfig;\n}\n\n/**\n * MCP 服务列表响应接口\n */\nexport interface MCPServerListResponse {\n servers: MCPServerStatus[];\n total: number;\n}\n\n/**\n * API 统一响应格式接口\n */\nexport interface ApiSuccessResponse<T = any> {\n success: boolean;\n data?: T;\n message?: string;\n}\n\nexport interface ApiErrorResponse {\n error: {\n code: string;\n message: string;\n details?: {\n serverName?: string;\n config?: any;\n tools?: string[];\n timestamp: string;\n };\n };\n}\n\n/**\n * API 错误码枚举\n */\nexport enum MCPErrorCode {\n // 服务相关错误\n SERVER_NOT_FOUND = \"SERVER_NOT_FOUND\",\n SERVER_ALREADY_EXISTS = \"SERVER_ALREADY_EXISTS\",\n INVALID_SERVICE_NAME = \"INVALID_SERVICE_NAME\",\n\n // 配置相关错误\n INVALID_CONFIG = \"INVALID_CONFIG\",\n CONFIG_UPDATE_FAILED = \"CONFIG_UPDATE_FAILED\",\n\n // 连接相关错误\n CONNECTION_FAILED = \"CONNECTION_FAILED\",\n\n // 操作相关错误\n ADD_FAILED = \"ADD_FAILED\",\n REMOVE_FAILED = \"REMOVE_FAILED\",\n\n // 系统错误\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n VALIDATION_ERROR = \"VALIDATION_ERROR\",\n}\n\n/**\n * 工具调用记录\n */\nexport interface ToolCallRecord {\n /** 工具名称 */\n toolName: string;\n /** 原始工具名称(如果有的话) */\n originalToolName?: string;\n /** 服务器名称 */\n serverName?: string;\n /** 调用参数 */\n arguments?: any;\n /** 调用结果 */\n result?: any;\n /** 是否成功 */\n success: boolean;\n /** 调用耗时(毫秒) */\n duration?: number;\n /** 错误信息 */\n error?: string;\n /** 时间戳 */\n timestamp?: number;\n}\n\n/**\n * 工具调用日志响应\n */\nexport interface ToolCallLogsResponse {\n /** 日志记录列表 */\n records: ToolCallRecord[];\n /** 总数量 */\n total: number;\n /** 是否有更多数据 */\n hasMore: boolean;\n}\n\n/**\n * API通用响应格式\n */\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: {\n code: string;\n message: string;\n details?: any;\n };\n}\n","/**\n * 超时处理相关类型定义\n */\n\n/**\n * 超时错误类型\n */\nexport class TimeoutError extends Error {\n public override readonly name = \"TimeoutError\" as const;\n\n constructor(message: string) {\n super(message);\n this.name = \"TimeoutError\";\n Error.captureStackTrace(this, TimeoutError);\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n/**\n * 超时响应接口\n */\nexport interface TimeoutResponse {\n content: Array<{\n type: \"text\";\n text: string;\n }>;\n isError: boolean;\n taskId: string;\n status: \"timeout\";\n message: string;\n nextAction: string;\n}\n\n/**\n * 验证是否为超时响应\n */\nexport function isTimeoutResponse(response: any): response is TimeoutResponse {\n return !!(\n response &&\n response.status === \"timeout\" &&\n typeof response.taskId === \"string\" &&\n Array.isArray(response.content) &&\n response.content.length > 0 &&\n response.content[0].type === \"text\"\n );\n}\n\n/**\n * 验证是否为超时错误\n */\nexport function isTimeoutError(error: any): error is TimeoutError {\n return !!(\n error &&\n error.name === \"TimeoutError\" &&\n error instanceof TimeoutError\n );\n}\n"],"mappings":";AAyFO,IAAK,eAAL,kBAAKA,kBAAL;AAEL,EAAAA,cAAA,sBAAmB;AACnB,EAAAA,cAAA,2BAAwB;AACxB,EAAAA,cAAA,0BAAuB;AAGvB,EAAAA,cAAA,oBAAiB;AACjB,EAAAA,cAAA,0BAAuB;AAGvB,EAAAA,cAAA,uBAAoB;AAGpB,EAAAA,cAAA,gBAAa;AACb,EAAAA,cAAA,mBAAgB;AAGhB,EAAAA,cAAA,oBAAiB;AACjB,EAAAA,cAAA,sBAAmB;AAnBT,SAAAA;AAAA,GAAA;;;AClFL,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACb,OAAO;AAAA,EAEhC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,UAAM,kBAAkB,MAAM,aAAY;AAAA,EAC5C;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;","names":["MCPErrorCode"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xiaozhi-client",
3
- "version": "1.9.3",
3
+ "version": "1.9.4-beta.1",
4
4
  "description": "小智 AI 客户端 命令行工具",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,12 +15,10 @@
15
15
  "ai"
16
16
  ],
17
17
  "type": "module",
18
- "main": "dist/cli.js",
18
+ "main": "dist/backend/cli.js",
19
19
  "files": [
20
20
  "dist",
21
- "docs",
22
21
  "templates",
23
- "apps/frontend/dist",
24
22
  "README.md",
25
23
  "LICENSE"
26
24
  ],
@@ -29,8 +27,8 @@
29
27
  "registry": "https://registry.npmjs.org"
30
28
  },
31
29
  "bin": {
32
- "xiaozhi": "dist/cli.js",
33
- "xiaozhi-client": "dist/cli.js"
30
+ "xiaozhi": "dist/backend/cli.js",
31
+ "xiaozhi-client": "dist/backend/cli.js"
34
32
  },
35
33
  "scripts": {
36
34
  "build": "pnpm run build:packages && pnpm run build:web && cross-env NODE_ENV=${NODE_ENV:-production} tsup --config config/tsup.config.ts",
@@ -52,9 +50,20 @@
52
50
  "duplicate:check": "jscpd apps/backend/",
53
51
  "docker:update-version": "node docker/scripts/update-version.js",
54
52
  "example": "node --loader ts-node/esm",
55
- "docs:dev": "cd docs && mintlify dev",
53
+ "docs:dev": "cd docs && pnpm dev",
56
54
  "release": "npx release-it --config config/release-it.json",
57
- "release:dry": "npx release-it --config config/release-it.json --dry-run"
55
+ "release:dry": "npx release-it --config config/release-it.json --dry-run",
56
+ "nx:lint": "nx run-many -t lint",
57
+ "nx:type-check": "nx run-many -t type-check",
58
+ "nx:test": "nx run-many -t test",
59
+ "nx:test:coverage": "nx run-many -t test:coverage --parallel=true",
60
+ "nx:build": "nx run-many -t build --parallel=false",
61
+ "nx:projects": "nx show projects",
62
+ "nx:graph": "nx graph",
63
+ "nx:affected": "nx print-affected",
64
+ "nx:backend": "nx run backend:build",
65
+ "nx:frontend": "nx run frontend:build",
66
+ "nx:docs": "nx run docs:build"
58
67
  },
59
68
  "dependencies": {
60
69
  "@coze/api": "^1.3.9",
@@ -85,6 +94,9 @@
85
94
  "devDependencies": {
86
95
  "@biomejs/biome": "1.9.4",
87
96
  "@codecov/vite-plugin": "^1.9.1",
97
+ "@nx/vite": "^22.3.3",
98
+ "@nx/vitest": "^22.3.3",
99
+ "@nx/workspace": "^22.3.3",
88
100
  "@release-it/conventional-changelog": "^10.0.1",
89
101
  "@types/node": "^24.3.0",
90
102
  "@types/node-fetch": "^2.6.12",
@@ -101,7 +113,7 @@
101
113
  "glob": "^11.0.3",
102
114
  "happy-dom": "^20.0.2",
103
115
  "jscpd": "^4.0.5",
104
- "mintlify": "^4.0.423",
116
+ "nx": "^22.3.3",
105
117
  "release-it": "^19.0.4",
106
118
  "semver": "^7.7.2",
107
119
  "supertest": "^7.1.4",
@@ -1,169 +0,0 @@
1
- # 小智客户端 Web UI
2
-
3
- 这是小智客户端的 Web 配置界面,提供了一个现代化、直观的界面来管理 MCP 服务配置。
4
-
5
- ## 功能特性
6
-
7
- - 🎨 **现代化设计**:基于 shadcn/ui 组件库,提供优雅的用户界面
8
- - 🔧 **可视化配置**:无需手动编辑 JSON 文件,通过界面即可完成所有配置
9
- - 🚀 **实时状态监控**:实时显示与小智服务器的连接状态
10
- - 📦 **MCP 服务管理**:支持添加、编辑、删除 MCP 服务,支持本地和 SSE 类型
11
- - ⚙️ **灵活的配置选项**:可调整心跳间隔、超时时间等连接参数
12
- - 🎯 **优秀的用户体验**:Toast 通知、确认对话框、平滑动画等
13
-
14
- ## 技术栈
15
-
16
- - **框架**: React 18 + TypeScript
17
- - **构建工具**: Vite
18
- - **样式**: Tailwind CSS
19
- - **UI 组件**: shadcn/ui
20
- - **状态管理**: React Hooks
21
- - **通知系统**: Sonner
22
- - **图标**: Lucide React
23
- - **代码质量**: Biome (代码格式化和 linting)
24
- - **测试**: Vitest + React Testing Library
25
-
26
- ## 开发指南
27
-
28
- ### 安装依赖
29
-
30
- ```bash
31
- pnpm install
32
- ```
33
-
34
- ### 开发命令
35
-
36
- ```bash
37
- # 启动开发服务器
38
- pnpm dev
39
-
40
- # 构建生产版本
41
- pnpm build
42
-
43
- # 预览生产构建
44
- pnpm preview
45
-
46
- # 运行测试
47
- pnpm test
48
-
49
- # 运行测试(watch 模式)
50
- pnpm test:watch
51
-
52
- # 生成测试覆盖率报告
53
- pnpm test:coverage
54
-
55
- # 代码格式化
56
- pnpm format
57
-
58
- # 代码检查
59
- pnpm lint
60
-
61
- # 类型检查
62
- pnpm type:check
63
-
64
- # 运行所有检查并修复
65
- pnpm check:write
66
- ```
67
-
68
- ### 项目结构
69
-
70
- ```
71
- web/
72
- ├── src/
73
- │ ├── components/
74
- │ │ ├── ui/ # shadcn/ui 组件
75
- │ │ ├── ConfigEditor.tsx # 配置编辑器
76
- │ │ ├── MCPServerList.tsx # MCP 服务列表
77
- │ │ └── StatusCard.tsx # 状态卡片
78
- │ ├── hooks/ # 自定义 React Hooks
79
- │ │ └── useWebSocket.ts # WebSocket 连接管理
80
- │ ├── pages/ # 页面组件
81
- │ │ └── Dashboard.tsx # 主控制台页面
82
- │ ├── types/ # TypeScript 类型定义
83
- │ ├── utils/ # 工具函数
84
- │ ├── App.tsx # 应用主组件
85
- │ ├── main.tsx # 应用入口
86
- │ └── index.css # 全局样式
87
- ├── public/ # 静态资源
88
- ├── tests/ # 测试文件
89
- └── package.json # 项目配置
90
- ```
91
-
92
- ### UI 组件说明
93
-
94
- #### StatusCard
95
- 显示与小智服务器的连接状态,包括:
96
- - 连接状态指示器(连接中/已连接/已断开)
97
- - 最后活动时间
98
- - 重连按钮
99
-
100
- #### ConfigEditor
101
- 配置编辑器,用于:
102
- - 编辑 MCP 接入点 URL
103
- - 调整连接参数(心跳间隔、超时时间等)
104
- - 管理 ModelScope API Key
105
-
106
- #### MCPServerList
107
- MCP 服务管理界面,支持:
108
- - 查看所有已配置的 MCP 服务
109
- - 添加新服务(支持 JSON 批量导入)
110
- - 编辑现有服务配置
111
- - 删除服务(带确认对话框)
112
-
113
- ### 样式定制
114
-
115
- 项目使用 Tailwind CSS 和 CSS 变量进行样式管理。主题颜色定义在 `src/index.css` 中:
116
-
117
- ```css
118
- :root {
119
- --background: 0 0% 100%;
120
- --foreground: 222.2 84% 4.9%;
121
- --primary: 222.2 47.4% 11.2%;
122
- --destructive: 0 84.2% 60.2%;
123
- /* ... 其他颜色变量 */
124
- }
125
- ```
126
-
127
- ### 添加新的 UI 组件
128
-
129
- 如果需要添加新的 shadcn/ui 组件:
130
-
131
- ```bash
132
- # 查看可用组件
133
- npx shadcn@latest add
134
-
135
- # 添加特定组件(例如 dialog)
136
- npx shadcn@latest add dialog
137
- ```
138
-
139
- ### 测试
140
-
141
- 项目使用 Vitest 进行单元测试:
142
-
143
- ```bash
144
- # 运行所有测试
145
- pnpm test
146
-
147
- # 运行特定测试文件
148
- pnpm test ConfigEditor
149
-
150
- # 生成覆盖率报告
151
- pnpm test:coverage
152
- ```
153
-
154
- ### 贡献指南
155
-
156
- 1. Fork 项目
157
- 2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
158
- 3. 提交更改 (`git commit -m 'feat: 添加某个很棒的功能'`)
159
- 4. 推送到分支 (`git push origin feature/amazing-feature`)
160
- 5. 创建 Pull Request
161
-
162
- 提交前请确保:
163
- - 所有测试通过 (`pnpm test`)
164
- - 代码通过格式检查 (`pnpm check:write`)
165
- - 类型检查通过 (`pnpm type:check`)
166
-
167
- ## 许可证
168
-
169
- MIT License