@demox-site/mcp-server 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +391 -0
- package/bin/mcp.js +7 -0
- package/dist/adapter.d.ts +42 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +105 -0
- package/dist/adapter.js.map +1 -0
- package/dist/api/DemoxClient.d.ts +110 -0
- package/dist/api/DemoxClient.d.ts.map +1 -0
- package/dist/api/DemoxClient.js +433 -0
- package/dist/api/DemoxClient.js.map +1 -0
- package/dist/auth/OAuthManager.d.ts +62 -0
- package/dist/auth/OAuthManager.d.ts.map +1 -0
- package/dist/auth/OAuthManager.js +279 -0
- package/dist/auth/OAuthManager.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +309 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +359 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +28 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +65 -0
- package/dist/utils/config.js.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 demox-site
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
# @demox-site/mcp-server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@demox-site/mcp-server)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
> Demox MCP Server - 通过 AI 部署静态网站到 Demox 平台
|
|
7
|
+
|
|
8
|
+
## 📖 目录
|
|
9
|
+
|
|
10
|
+
- [什么是 MCP?](#什么是-mcp)
|
|
11
|
+
- [功能特性](#功能特性)
|
|
12
|
+
- [快速开始](#快速开始)
|
|
13
|
+
- [配置步骤](#配置步骤)
|
|
14
|
+
- [可用工具](#可用工具)
|
|
15
|
+
- [使用示例](#使用示例)
|
|
16
|
+
- [常见问题](#常见问题)
|
|
17
|
+
- [技术支持](#技术支持)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 什么是 MCP?
|
|
22
|
+
|
|
23
|
+
MCP (Model Context Protocol) 是 AI 助手与工具之间的标准化协议,允许 AI 工具(如 Claude Code、Cursor)安全地调用外部服务。
|
|
24
|
+
|
|
25
|
+
## 功能特性
|
|
26
|
+
|
|
27
|
+
- 🚀 **一键部署**: 部署静态网站到 Demox 平台
|
|
28
|
+
- 📦 **自动打包**: 支持直接传入目录,自动打包成 ZIP
|
|
29
|
+
- ☁️ **云存储上传**: 使用 CloudBase Storage,支持大文件(最大 500MB)
|
|
30
|
+
- 🔐 **自动登录**: Token 过期时自动触发登录流程
|
|
31
|
+
- 💻 **AI 集成**: 与 Claude Code、Cursor 等 MCP 客户端无缝集成
|
|
32
|
+
- 📋 **网站管理**: 查看、删除、管理已部署的网站
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 快速开始
|
|
37
|
+
|
|
38
|
+
### 安装 MCP Server
|
|
39
|
+
|
|
40
|
+
**在 AI 工具配置中使用 npx(推荐)**
|
|
41
|
+
|
|
42
|
+
无需安装,直接在配置文件中使用:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"demox": {
|
|
48
|
+
"command": "npx",
|
|
49
|
+
"args": ["-y", "@demox-site/mcp-server"]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
配置后重启 AI 工具,首次使用时会自动打开浏览器登录。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 配置步骤
|
|
60
|
+
|
|
61
|
+
### 1. 配置 AI 工具
|
|
62
|
+
|
|
63
|
+
根据您使用的 AI 工具,将以下配置导入到相应位置:
|
|
64
|
+
|
|
65
|
+
#### Claude Desktop / Claude Code
|
|
66
|
+
|
|
67
|
+
**macOS**:
|
|
68
|
+
```bash
|
|
69
|
+
~/Library/Application Support/Claude/claude_desktop_config.json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Windows**:
|
|
73
|
+
```bash
|
|
74
|
+
%APPDATA%/Claude/claude_desktop_config.json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Linux**:
|
|
78
|
+
```bash
|
|
79
|
+
~/.config/Claude/claude_desktop_config.json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
配置示例:
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"mcpServers": {
|
|
86
|
+
"demox": {
|
|
87
|
+
"command": "npx",
|
|
88
|
+
"args": ["-y", "@demox-site/mcp-server"]
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### Cursor AI
|
|
95
|
+
|
|
96
|
+
**macOS / Linux**: `~/.cursor/mcp.json`
|
|
97
|
+
**Windows**: `%APPDATA%/Cursor/mcp.json`
|
|
98
|
+
|
|
99
|
+
#### Cline (VS Code 插件)
|
|
100
|
+
|
|
101
|
+
所有平台: `~/.cline/mcp.json`
|
|
102
|
+
|
|
103
|
+
#### Continue (VS Code 插件)
|
|
104
|
+
|
|
105
|
+
所有平台: `~/.continue/mcp.json`
|
|
106
|
+
|
|
107
|
+
### 2. 重启 AI 工具
|
|
108
|
+
|
|
109
|
+
配置完成后,重启您的 AI 工具。
|
|
110
|
+
|
|
111
|
+
### 3. 首次使用
|
|
112
|
+
|
|
113
|
+
首次调用 MCP 工具时,会自动打开浏览器登录。
|
|
114
|
+
|
|
115
|
+
登录成功后,凭证会保存在本地(`~/.demox/token.json`),Access Token 有效期 5 分钟,Refresh Token 有效期 30 天。
|
|
116
|
+
|
|
117
|
+
**自动登录**:Token 过期时会自动打开浏览器,无需手动运行登录命令。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 可用工具
|
|
122
|
+
|
|
123
|
+
### deploy_website
|
|
124
|
+
|
|
125
|
+
部署静态网站到 Demox 平台。
|
|
126
|
+
|
|
127
|
+
**参数**:
|
|
128
|
+
- `zipFile` (string, **必需**): ZIP 文件路径或目录路径
|
|
129
|
+
- 支持本地 ZIP 文件:`./dist.zip`
|
|
130
|
+
- 支持本地目录(自动打包):`./dist`
|
|
131
|
+
- 支持 HTTPS URL(必须 .zip 结尾):`https://example.com/file.zip`
|
|
132
|
+
- `fileName` (string, 可选): 网站名称,用于标识和展示
|
|
133
|
+
- `websiteId` (string, 可选): 网站 ID,更新现有网站时提供
|
|
134
|
+
|
|
135
|
+
**限制**:
|
|
136
|
+
- 仅支持 ZIP 文件格式
|
|
137
|
+
- 最大文件大小:500MB
|
|
138
|
+
- 不支持 base64 编码内容
|
|
139
|
+
|
|
140
|
+
### list_websites
|
|
141
|
+
|
|
142
|
+
获取用户在 Demox 平台上的所有网站列表。
|
|
143
|
+
|
|
144
|
+
**返回信息**:
|
|
145
|
+
- 网站 ID
|
|
146
|
+
- 网站名称
|
|
147
|
+
- 访问 URL
|
|
148
|
+
- 创建时间
|
|
149
|
+
|
|
150
|
+
### get_website
|
|
151
|
+
|
|
152
|
+
获取指定网站的详细信息。
|
|
153
|
+
|
|
154
|
+
**参数**:
|
|
155
|
+
- `websiteId` (string, **必需**): 要查询的网站 ID
|
|
156
|
+
|
|
157
|
+
### delete_website
|
|
158
|
+
|
|
159
|
+
删除指定的网站及其所有文件。
|
|
160
|
+
|
|
161
|
+
**参数**:
|
|
162
|
+
- `websiteId` (string, **必需**): 要删除的网站 ID
|
|
163
|
+
|
|
164
|
+
**⚠️ 注意**: 此操作不可撤销
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 使用示例
|
|
169
|
+
|
|
170
|
+
### 在 Claude Desktop 中
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
用户: 部署 dist 目录到 Demox
|
|
174
|
+
|
|
175
|
+
Claude: 好的,我来帮您部署 dist 目录。
|
|
176
|
+
|
|
177
|
+
[检测到目录,自动打包成 ZIP...]
|
|
178
|
+
[正在上传文件到 CloudBase Storage...]
|
|
179
|
+
[文件上传成功]
|
|
180
|
+
|
|
181
|
+
✅ 网站部署成功!
|
|
182
|
+
网站名称: dist
|
|
183
|
+
网站 ID: ABC12345
|
|
184
|
+
访问地址: https://abc12345.demox.site
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 在 Cursor 中
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
# 在 Cursor 的 Chat 中输入
|
|
191
|
+
|
|
192
|
+
部署当前项目到 Demox
|
|
193
|
+
|
|
194
|
+
# Cursor 会自动:
|
|
195
|
+
# 1. 检测到项目目录(如 ./dist)
|
|
196
|
+
# 2. 自动打包成 ZIP
|
|
197
|
+
# 3. 上传到云存储
|
|
198
|
+
# 4. 调用云函数部署
|
|
199
|
+
# 5. 返回访问链接
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 示例对话
|
|
203
|
+
|
|
204
|
+
**场景 1:部署新网站**
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
用户: 把我的 react 项目的 build 目录部署到 Demox
|
|
208
|
+
|
|
209
|
+
Claude: 我来帮您部署 React 项目的 build 目录。
|
|
210
|
+
|
|
211
|
+
[正在打包目录 ./build...]
|
|
212
|
+
[文件大小: 2.3MB]
|
|
213
|
+
|
|
214
|
+
✅ 网站部署成功!
|
|
215
|
+
网站名称: build
|
|
216
|
+
网站 ID: XYZ67890
|
|
217
|
+
访问地址: https://xyz67890.demox.site
|
|
218
|
+
|
|
219
|
+
您现在可以访问上述地址查看您的网站了。
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**场景 2:更新现有网站**
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
用户: 更新网站 ABC12345
|
|
226
|
+
|
|
227
|
+
Claude: 我来帮您更新网站 ABC12345。
|
|
228
|
+
|
|
229
|
+
[文件大小: 2.5MB]
|
|
230
|
+
|
|
231
|
+
✅ 网站部署成功!
|
|
232
|
+
网站名称: my-project
|
|
233
|
+
网站 ID: ABC12345
|
|
234
|
+
访问地址: https://abc12345.demox.site
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**场景 3:查看所有网站**
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
用户: 显示我部署的所有网站
|
|
241
|
+
|
|
242
|
+
Claude: 我来帮您查看所有已部署的网站。
|
|
243
|
+
|
|
244
|
+
📋 您的网站列表(共 3 个)
|
|
245
|
+
|
|
246
|
+
1. **my-portfolio**
|
|
247
|
+
- ID: `ABC12345`
|
|
248
|
+
- URL: https://abc12345.demox.site
|
|
249
|
+
- 创建时间: 2026-01-20 14:30:00
|
|
250
|
+
|
|
251
|
+
2. **blog**
|
|
252
|
+
- ID: `XYZ67890`
|
|
253
|
+
- URL: https://xyz67890.demox.site
|
|
254
|
+
- 创建时间: 2026-01-21 09:15:00
|
|
255
|
+
|
|
256
|
+
3. **docs**
|
|
257
|
+
- ID: `DEF24680`
|
|
258
|
+
- URL: https://def24680.demox.site
|
|
259
|
+
- 创建时间: 2026-01-22 16:45:00
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 常见问题
|
|
265
|
+
|
|
266
|
+
### Token 过期怎么办?
|
|
267
|
+
|
|
268
|
+
**自动登录**:系统会在 Token 过期时自动打开浏览器登录,无需手动操作。
|
|
269
|
+
|
|
270
|
+
登录成功后会自动重试失败的工具调用。
|
|
271
|
+
|
|
272
|
+
### 支持哪些文件格式?
|
|
273
|
+
|
|
274
|
+
**仅支持 ZIP 文件或目录**:
|
|
275
|
+
- ✅ 本地 ZIP 文件:`./dist.zip`
|
|
276
|
+
- ✅ 本地目录:`./dist`(自动打包成 ZIP)
|
|
277
|
+
- ✅ HTTPS URL:`https://example.com/file.zip`(必须 .zip 结尾)
|
|
278
|
+
- ❌ 其他压缩格式(tar.gz, rar 等)
|
|
279
|
+
- ❌ Base64 编码内容
|
|
280
|
+
|
|
281
|
+
### 最大文件大小限制?
|
|
282
|
+
|
|
283
|
+
**500MB**
|
|
284
|
+
|
|
285
|
+
大文件会被流式传输,不会占用大量内存。
|
|
286
|
+
|
|
287
|
+
### 如何撤销授权?
|
|
288
|
+
|
|
289
|
+
删除本地 Token 文件:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
rm ~/.demox/token.json
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
下次使用时会自动触发登录。
|
|
296
|
+
|
|
297
|
+
### 支持哪些 AI 工具?
|
|
298
|
+
|
|
299
|
+
所有支持 MCP 协议的 AI 工具:
|
|
300
|
+
- Claude Desktop / Claude Code
|
|
301
|
+
- Cursor AI
|
|
302
|
+
- Cline (VS Code 插件)
|
|
303
|
+
- Continue (VS Code 插件)
|
|
304
|
+
- 其他 MCP 客户端
|
|
305
|
+
|
|
306
|
+
### 多台设备可以使用吗?
|
|
307
|
+
|
|
308
|
+
可以。每台设备需要单独登录,互不影响。
|
|
309
|
+
|
|
310
|
+
### 如何查看调试日志?
|
|
311
|
+
|
|
312
|
+
MCP Server 的日志会输出到 stderr,可以在 AI 工具的日志中查看。
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 技术细节
|
|
317
|
+
|
|
318
|
+
### 文件上传流程
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
输入(文件/目录/URL)
|
|
322
|
+
↓
|
|
323
|
+
转换为本地 ZIP 文件
|
|
324
|
+
↓
|
|
325
|
+
检查文件大小(最大 500MB)
|
|
326
|
+
↓
|
|
327
|
+
上传到 CloudBase Storage(流式传输)
|
|
328
|
+
↓
|
|
329
|
+
获取 fileId
|
|
330
|
+
↓
|
|
331
|
+
云函数从 Storage 下载并部署
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 安全性
|
|
335
|
+
|
|
336
|
+
- **OAuth 2.0 认证**: 使用标准的 OAuth 2.0 协议
|
|
337
|
+
- **Token 加密存储**: 本地存储的 Token 包含 Refresh Token
|
|
338
|
+
- **自动刷新**: Access Token 过期后自动刷新
|
|
339
|
+
- **作用域限制**: Token 仅包含必要的权限范围
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 技术支持
|
|
344
|
+
|
|
345
|
+
- 📖 **文档**: https://demox.site
|
|
346
|
+
- 🐛 **Issues**: https://github.com/demox-site/mcp-server/issues
|
|
347
|
+
- 📧 **邮箱**: support@demox.site
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## 开发
|
|
352
|
+
|
|
353
|
+
### 本地开发
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# 克隆项目
|
|
357
|
+
git clone https://github.com/demox-site/mcp-server.git
|
|
358
|
+
cd mcp-server
|
|
359
|
+
|
|
360
|
+
# 安装依赖
|
|
361
|
+
npm install
|
|
362
|
+
|
|
363
|
+
# 开发模式
|
|
364
|
+
npm run dev
|
|
365
|
+
|
|
366
|
+
# 构建
|
|
367
|
+
npm run build
|
|
368
|
+
|
|
369
|
+
# 测试 MCP Server
|
|
370
|
+
node dist/index.js
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### 贡献
|
|
374
|
+
|
|
375
|
+
欢迎贡献代码!请遵循以下步骤:
|
|
376
|
+
|
|
377
|
+
1. Fork 本仓库
|
|
378
|
+
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
|
|
379
|
+
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
|
380
|
+
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
|
381
|
+
5. 开启 Pull Request
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## 许可证
|
|
386
|
+
|
|
387
|
+
[MIT License](LICENSE)
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
Made with ❤️ by Demox Team
|
package/bin/mcp.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js Adapter for CloudBase JS SDK
|
|
3
|
+
* 提供 HTTP 请求能力,使 js-sdk 可以在 Node.js 环境中运行
|
|
4
|
+
*/
|
|
5
|
+
export declare const adapter: {
|
|
6
|
+
useDefaultAdapter: boolean;
|
|
7
|
+
request(options: {
|
|
8
|
+
url: string;
|
|
9
|
+
method: string;
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
data?: any;
|
|
12
|
+
timeout?: number;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
statusCode: number;
|
|
15
|
+
data: string;
|
|
16
|
+
headers: {
|
|
17
|
+
[k: string]: string;
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
uploadFile(options: {
|
|
21
|
+
url: string;
|
|
22
|
+
method: string;
|
|
23
|
+
headers?: Record<string, string>;
|
|
24
|
+
fileContent: Buffer | string;
|
|
25
|
+
onProgress?: (progress: {
|
|
26
|
+
loaded: number;
|
|
27
|
+
total: number;
|
|
28
|
+
}) => void;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
statusCode: number;
|
|
31
|
+
data: string;
|
|
32
|
+
}>;
|
|
33
|
+
getEnv(): string;
|
|
34
|
+
getUserInfo(): null;
|
|
35
|
+
storage: {
|
|
36
|
+
getItem(key: string): Promise<string | null>;
|
|
37
|
+
setItem(key: string, value: string): Promise<void>;
|
|
38
|
+
removeItem(key: string): Promise<void>;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export default adapter;
|
|
42
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,OAAO;;qBAKK;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;;;;;;;wBAoByB;QACxB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;QAC7B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KACpE;;;;;;;qBAgCoB,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;qBAgB/B,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;wBAwBlC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;;CAgB/C,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js Adapter for CloudBase JS SDK
|
|
3
|
+
* 提供 HTTP 请求能力,使 js-sdk 可以在 Node.js 环境中运行
|
|
4
|
+
*/
|
|
5
|
+
export const adapter = {
|
|
6
|
+
// 实现 adapter 接口必需的方法
|
|
7
|
+
useDefaultAdapter: false,
|
|
8
|
+
// HTTP 请求方法
|
|
9
|
+
async request(options) {
|
|
10
|
+
const fetch = (await import('node-fetch')).default;
|
|
11
|
+
const response = await fetch(options.url, {
|
|
12
|
+
method: options.method,
|
|
13
|
+
headers: options.headers || {},
|
|
14
|
+
body: options.data ? JSON.stringify(options.data) : undefined,
|
|
15
|
+
timeout: options.timeout || 30000,
|
|
16
|
+
});
|
|
17
|
+
const data = await response.text();
|
|
18
|
+
return {
|
|
19
|
+
statusCode: response.status,
|
|
20
|
+
data: data,
|
|
21
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
// Storage 上传方法
|
|
25
|
+
async uploadFile(options) {
|
|
26
|
+
const fetch = (await import('node-fetch')).default;
|
|
27
|
+
const response = await fetch(options.url, {
|
|
28
|
+
method: options.method,
|
|
29
|
+
headers: options.headers || {},
|
|
30
|
+
body: options.fileContent,
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
const text = await response.text();
|
|
34
|
+
throw new Error(`Upload failed: ${response.status} - ${text}`);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
statusCode: response.status,
|
|
38
|
+
data: await response.text(),
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
// 获取当前环境信息
|
|
42
|
+
getEnv() {
|
|
43
|
+
return 'node';
|
|
44
|
+
},
|
|
45
|
+
// 获取用户信息
|
|
46
|
+
getUserInfo() {
|
|
47
|
+
return null;
|
|
48
|
+
},
|
|
49
|
+
// 持久化存储
|
|
50
|
+
storage: {
|
|
51
|
+
async getItem(key) {
|
|
52
|
+
try {
|
|
53
|
+
const fs = await import('fs');
|
|
54
|
+
const path = await import('path');
|
|
55
|
+
const configPath = path.join(process.env.HOME || process.env.USERPROFILE || '', '.demox', 'storage.json');
|
|
56
|
+
if (fs.existsSync(configPath)) {
|
|
57
|
+
const data = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
58
|
+
return data[key] || null;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
async setItem(key, value) {
|
|
67
|
+
try {
|
|
68
|
+
const fs = await import('fs');
|
|
69
|
+
const path = await import('path');
|
|
70
|
+
const configDir = path.join(process.env.HOME || process.env.USERPROFILE || '', '.demox');
|
|
71
|
+
const configPath = path.join(configDir, 'storage.json');
|
|
72
|
+
// 确保目录存在
|
|
73
|
+
if (!fs.existsSync(configDir)) {
|
|
74
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
let data = {};
|
|
77
|
+
if (fs.existsSync(configPath)) {
|
|
78
|
+
data = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
79
|
+
}
|
|
80
|
+
data[key] = value;
|
|
81
|
+
fs.writeFileSync(configPath, JSON.stringify(data, null, 2));
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('Failed to save storage:', error);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
async removeItem(key) {
|
|
88
|
+
try {
|
|
89
|
+
const fs = await import('fs');
|
|
90
|
+
const path = await import('path');
|
|
91
|
+
const configPath = path.join(process.env.HOME || process.env.USERPROFILE || '', '.demox', 'storage.json');
|
|
92
|
+
if (fs.existsSync(configPath)) {
|
|
93
|
+
const data = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
94
|
+
delete data[key];
|
|
95
|
+
fs.writeFileSync(configPath, JSON.stringify(data, null, 2));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error('Failed to remove storage item:', error);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
export default adapter;
|
|
105
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,qBAAqB;IACrB,iBAAiB,EAAE,KAAK;IAExB,YAAY;IACZ,KAAK,CAAC,OAAO,CAAC,OAMb;QACC,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7D,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;SAClC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,OAAO;YACL,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAED,eAAe;IACf,KAAK,CAAC,UAAU,CAAC,OAMhB;QACC,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,IAAI,EAAE,OAAO,CAAC,WAAW;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO;YACL,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE;SAC5B,CAAC;IACJ,CAAC;IAED,WAAW;IACX,MAAM;QACJ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS;IACT,WAAW;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;IACR,OAAO,EAAE;QACP,KAAK,CAAC,OAAO,CAAC,GAAW;YACvB,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAE1G,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAA2B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;oBACtF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;gBAC3B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;YACtC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;gBACzF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;gBAExD,SAAS;gBACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,CAAC;gBAED,IAAI,IAAI,GAA2B,EAAE,CAAC;gBACtC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAClB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAW;YAC1B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAE1G,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAA2B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;oBACtF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;oBACjB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;KACF;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 鉴权错误类
|
|
3
|
+
* 当 token 过期或无效时抛出此错误,触发自动重新登录
|
|
4
|
+
*/
|
|
5
|
+
export declare class AuthError extends Error {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 部署参数
|
|
10
|
+
*/
|
|
11
|
+
export interface DeployParams {
|
|
12
|
+
zipFile: string;
|
|
13
|
+
websiteId?: string;
|
|
14
|
+
fileName: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 部署结果
|
|
18
|
+
*/
|
|
19
|
+
export interface DeployResult {
|
|
20
|
+
url: string;
|
|
21
|
+
websiteId: string;
|
|
22
|
+
path: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 网站信息
|
|
26
|
+
*/
|
|
27
|
+
export interface Website {
|
|
28
|
+
websiteId: string;
|
|
29
|
+
fileName: string;
|
|
30
|
+
url: string;
|
|
31
|
+
path: string;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
updatedAt: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Demox API 客户端
|
|
37
|
+
* 通过 mcp-api 云函数调用其他云函数
|
|
38
|
+
*/
|
|
39
|
+
export declare class DemoxClient {
|
|
40
|
+
private cloudFunctionUrl;
|
|
41
|
+
constructor(accessToken?: string);
|
|
42
|
+
/**
|
|
43
|
+
* 调用云函数
|
|
44
|
+
*
|
|
45
|
+
* 使用 mcp-api 代理模式:需要 { functionName, data } 包装
|
|
46
|
+
*/
|
|
47
|
+
private callFunction;
|
|
48
|
+
/**
|
|
49
|
+
* 部署网站
|
|
50
|
+
*/
|
|
51
|
+
deployWebsite(params: DeployParams, accessToken: string): Promise<DeployResult>;
|
|
52
|
+
/**
|
|
53
|
+
* 生成 8 位由大写字母与数字组成的随机 websiteId
|
|
54
|
+
*/
|
|
55
|
+
private generateWebsiteId;
|
|
56
|
+
/**
|
|
57
|
+
* 获取路径状态信息
|
|
58
|
+
*/
|
|
59
|
+
private getPathStat;
|
|
60
|
+
/**
|
|
61
|
+
* 获取文件大小
|
|
62
|
+
*/
|
|
63
|
+
private getFileSize;
|
|
64
|
+
/**
|
|
65
|
+
* 读取文件为 base64
|
|
66
|
+
*/
|
|
67
|
+
private readFileAsBase64;
|
|
68
|
+
/**
|
|
69
|
+
* 将目录打包成 ZIP 文件
|
|
70
|
+
*/
|
|
71
|
+
private zipDirectoryToFile;
|
|
72
|
+
/**
|
|
73
|
+
* 上传文件到云存储
|
|
74
|
+
* 使用云函数获取上传凭证,然后直接上传到主存储桶
|
|
75
|
+
*/
|
|
76
|
+
private uploadToCloudStorage;
|
|
77
|
+
/**
|
|
78
|
+
* 下载 ZIP 文件并保存为 Buffer
|
|
79
|
+
*/
|
|
80
|
+
private downloadZipFileToBuffer;
|
|
81
|
+
/**
|
|
82
|
+
* 保存 Buffer 到临时文件
|
|
83
|
+
*/
|
|
84
|
+
private saveBufferToTempFile;
|
|
85
|
+
/**
|
|
86
|
+
* 检查字符串是否是 base64 编码
|
|
87
|
+
*/
|
|
88
|
+
private isBase64;
|
|
89
|
+
/**
|
|
90
|
+
* 列出所有网站
|
|
91
|
+
*/
|
|
92
|
+
listWebsites(accessToken: string): Promise<Website[]>;
|
|
93
|
+
/**
|
|
94
|
+
* 删除网站
|
|
95
|
+
*/
|
|
96
|
+
deleteWebsite(websiteId: string, accessToken: string): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* 获取网站详情
|
|
99
|
+
*/
|
|
100
|
+
getWebsite(websiteId: string, accessToken: string): Promise<Website | null>;
|
|
101
|
+
/**
|
|
102
|
+
* 下载 ZIP 文件并转换为 base64
|
|
103
|
+
*/
|
|
104
|
+
private downloadZipFile;
|
|
105
|
+
/**
|
|
106
|
+
* 验证 Token 有效性
|
|
107
|
+
*/
|
|
108
|
+
verifyToken(accessToken: string): Promise<boolean>;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=DemoxClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DemoxClient.d.ts","sourceRoot":"","sources":["../../src/api/DemoxClient.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,gBAAgB,CAAS;gBAErB,WAAW,CAAC,EAAE,MAAM;IAKhC;;;;OAIG;YACW,YAAY;IAoF1B;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IA2FxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;YACW,WAAW;IAiBzB;;OAEG;YACW,WAAW;IAKzB;;OAEG;YACW,gBAAgB;IAa9B;;OAEG;YACW,kBAAkB;IAwBhC;;;OAGG;YACW,oBAAoB;IA2GlC;;OAEG;YACW,uBAAuB;IAgBrC;;OAEG;YACW,oBAAoB;IAelC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAUhB;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAe3D;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAe1B;;OAEG;YACW,eAAe;IAkB7B;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAiBzD"}
|