@gulibs/safe-coder 0.0.4 → 0.0.6
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/README.md +112 -1
- package/dist/documentation/github-client.d.ts +3 -1
- package/dist/documentation/github-client.d.ts.map +1 -1
- package/dist/documentation/github-client.js +7 -5
- package/dist/documentation/github-client.js.map +1 -1
- package/dist/documentation/http-fetcher.d.ts +3 -0
- package/dist/documentation/http-fetcher.d.ts.map +1 -1
- package/dist/documentation/http-fetcher.js +6 -2
- package/dist/documentation/http-fetcher.js.map +1 -1
- package/dist/documentation/index.d.ts +5 -3
- package/dist/documentation/index.d.ts.map +1 -1
- package/dist/documentation/index.js +98 -14
- package/dist/documentation/index.js.map +1 -1
- package/dist/documentation/npm-client.d.ts +12 -0
- package/dist/documentation/npm-client.d.ts.map +1 -1
- package/dist/documentation/npm-client.js +150 -17
- package/dist/documentation/npm-client.js.map +1 -1
- package/dist/errors/api-validator.d.ts +9 -0
- package/dist/errors/api-validator.d.ts.map +1 -0
- package/dist/errors/api-validator.js +57 -0
- package/dist/errors/api-validator.js.map +1 -0
- package/dist/errors/contextual-analysis.d.ts +3 -0
- package/dist/errors/contextual-analysis.d.ts.map +1 -1
- package/dist/errors/contextual-analysis.js +102 -4
- package/dist/errors/contextual-analysis.js.map +1 -1
- package/dist/errors/cross-file-analyzer.d.ts +16 -0
- package/dist/errors/cross-file-analyzer.d.ts.map +1 -0
- package/dist/errors/cross-file-analyzer.js +172 -0
- package/dist/errors/cross-file-analyzer.js.map +1 -0
- package/dist/errors/eslint-integration.d.ts +1 -0
- package/dist/errors/eslint-integration.d.ts.map +1 -1
- package/dist/errors/eslint-integration.js +101 -22
- package/dist/errors/eslint-integration.js.map +1 -1
- package/dist/errors/framework-detector.d.ts +10 -0
- package/dist/errors/framework-detector.d.ts.map +1 -0
- package/dist/errors/framework-detector.js +126 -0
- package/dist/errors/framework-detector.js.map +1 -0
- package/dist/errors/index.d.ts +9 -2
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +78 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/patterns.d.ts.map +1 -1
- package/dist/errors/patterns.js +314 -0
- package/dist/errors/patterns.js.map +1 -1
- package/dist/errors/performance-detector.d.ts +11 -0
- package/dist/errors/performance-detector.d.ts.map +1 -0
- package/dist/errors/performance-detector.js +119 -0
- package/dist/errors/performance-detector.js.map +1 -0
- package/dist/errors/runtime-detector.d.ts +7 -0
- package/dist/errors/runtime-detector.d.ts.map +1 -0
- package/dist/errors/runtime-detector.js +86 -0
- package/dist/errors/runtime-detector.js.map +1 -0
- package/dist/errors/security-detector.d.ts +6 -0
- package/dist/errors/security-detector.d.ts.map +1 -0
- package/dist/errors/security-detector.js +75 -0
- package/dist/errors/security-detector.js.map +1 -0
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +155 -61
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/utils/config.d.ts +12 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +24 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/http-client.d.ts +17 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +62 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +128 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -69,6 +69,49 @@ npm run build
|
|
|
69
69
|
- `ENABLE_AUTO_FIX` - 启用自动修复,默认:true
|
|
70
70
|
- `RATE_LIMIT_REQUESTS` - 每个窗口的最大请求数,默认:100
|
|
71
71
|
- `RATE_LIMIT_WINDOW_MS` - 速率限制窗口(毫秒),默认:60000
|
|
72
|
+
- `LOG_LEVEL` - 日志级别:`DEBUG`、`INFO`、`WARN`、`ERROR`,默认:`INFO`
|
|
73
|
+
- `LOG_COLORS` - 启用彩色日志输出,默认:`true`(设置为 `false` 禁用)
|
|
74
|
+
|
|
75
|
+
### 代理配置(适用于国内网络环境)
|
|
76
|
+
|
|
77
|
+
如果无法直接访问 npm registry 或 GitHub API,可以配置代理:
|
|
78
|
+
|
|
79
|
+
- `HTTP_PROXY` 或 `http_proxy` - HTTP 代理地址,例如:`http://127.0.0.1:7890`
|
|
80
|
+
- `HTTPS_PROXY` 或 `https_proxy` - HTTPS 代理地址,例如:`http://127.0.0.1:7890`
|
|
81
|
+
- `NO_PROXY` 或 `no_proxy` - 不使用代理的地址列表(逗号分隔),例如:`localhost,127.0.0.1`
|
|
82
|
+
|
|
83
|
+
**示例配置:**
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# 使用 HTTP/HTTPS 代理
|
|
87
|
+
export HTTP_PROXY=http://127.0.0.1:7890
|
|
88
|
+
export HTTPS_PROXY=http://127.0.0.1:7890
|
|
89
|
+
|
|
90
|
+
# 或者使用 SOCKS5 代理(如果代理支持)
|
|
91
|
+
export HTTP_PROXY=socks5://127.0.0.1:1080
|
|
92
|
+
export HTTPS_PROXY=socks5://127.0.0.1:1080
|
|
93
|
+
|
|
94
|
+
# 排除本地地址
|
|
95
|
+
export NO_PROXY=localhost,127.0.0.1,*.local
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**在 Cursor 配置文件中设置:**
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"mcpServers": {
|
|
103
|
+
"safe-coder": {
|
|
104
|
+
"command": "npx",
|
|
105
|
+
"args": ["-y", "@gulibs/safe-coder"],
|
|
106
|
+
"env": {
|
|
107
|
+
"HTTP_PROXY": "http://127.0.0.1:7890",
|
|
108
|
+
"HTTPS_PROXY": "http://127.0.0.1:7890",
|
|
109
|
+
"NO_PROXY": "localhost,127.0.0.1"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
72
115
|
|
|
73
116
|
## 使用方法
|
|
74
117
|
|
|
@@ -85,7 +128,75 @@ npm start
|
|
|
85
128
|
|
|
86
129
|
服务器通过 stdio 运行,使用 MCP 协议进行通信。
|
|
87
130
|
|
|
88
|
-
### 2.
|
|
131
|
+
### 2. 监控服务状态
|
|
132
|
+
|
|
133
|
+
#### 查看日志
|
|
134
|
+
|
|
135
|
+
所有日志输出到 `stderr`(标准错误输出),包括:
|
|
136
|
+
- 服务器启动信息
|
|
137
|
+
- 工具调用记录(请求 ID、参数、执行时间)
|
|
138
|
+
- 错误和警告信息
|
|
139
|
+
|
|
140
|
+
**日志格式示例:**
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
[2024-01-01T12:00:00.000Z] [INFO] Safe Coder MCP server started {"version":"1.0.0","pid":12345}
|
|
144
|
+
[2024-01-01T12:00:00.100Z] [INFO] MCP server connected to transport
|
|
145
|
+
[2024-01-01T12:00:00.200Z] [INFO] Tool invoked: get_documentation {"requestId":"req-1234567890-1","tool":"get_documentation","params":{"packageName":"react"}}
|
|
146
|
+
[2024-01-01T12:00:00.500Z] [INFO] Tool completed: get_documentation {"requestId":"req-1234567890-1","tool":"get_documentation","duration":"500ms","success":true}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**日志级别(通过 `LOG_LEVEL` 环境变量设置):**
|
|
150
|
+
- `DEBUG` - 详细调试信息
|
|
151
|
+
- `INFO` - 一般信息(工具调用、完成)默认
|
|
152
|
+
- `WARN` - 警告信息
|
|
153
|
+
- `ERROR` - 错误信息
|
|
154
|
+
|
|
155
|
+
#### 使用 get_status 工具
|
|
156
|
+
|
|
157
|
+
在 Cursor 中,你可以调用 `get_status` 工具来查看服务器状态:
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"status": "running",
|
|
162
|
+
"uptime": 3600,
|
|
163
|
+
"version": "1.0.0",
|
|
164
|
+
"tools": ["get_documentation", "detect_errors", "validate_code", "resolve_error", "get_status"],
|
|
165
|
+
"cacheSize": 10,
|
|
166
|
+
"pid": 12345
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
#### 在 Cursor 中查看日志
|
|
171
|
+
|
|
172
|
+
1. **打开 Cursor 的开发者工具**:
|
|
173
|
+
- macOS: `Cmd + Shift + P` → "Developer: Toggle Developer Tools"
|
|
174
|
+
- Windows/Linux: `Ctrl + Shift + P` → "Developer: Toggle Developer Tools"
|
|
175
|
+
|
|
176
|
+
2. **查看控制台**:
|
|
177
|
+
- 在开发者工具中切换到 "Console" 标签
|
|
178
|
+
- MCP 服务器的日志会显示在这里
|
|
179
|
+
|
|
180
|
+
3. **启用调试模式**:
|
|
181
|
+
|
|
182
|
+
在 Cursor 配置中添加:
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"mcpServers": {
|
|
187
|
+
"safe-coder": {
|
|
188
|
+
"command": "npx",
|
|
189
|
+
"args": ["-y", "@gulibs/safe-coder"],
|
|
190
|
+
"env": {
|
|
191
|
+
"LOG_LEVEL": "DEBUG",
|
|
192
|
+
"LOG_COLORS": "true"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 3. 在 Cursor 中配置
|
|
89
200
|
|
|
90
201
|
> **⚠️ 重要提示**:如果包还没有发布到 npm,请使用"本地开发配置"方式。
|
|
91
202
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { Documentation, DocumentationSource } from '../types/documentation.js';
|
|
2
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
2
3
|
export declare class GitHubClient implements DocumentationSource {
|
|
3
4
|
private readonly apiUrl;
|
|
4
5
|
private readonly token?;
|
|
5
|
-
|
|
6
|
+
private httpClient;
|
|
7
|
+
constructor(token?: string, httpClient?: HttpClient);
|
|
6
8
|
fetch(packageName: string, version?: string): Promise<Documentation>;
|
|
7
9
|
private parseRepository;
|
|
8
10
|
private fetchReadme;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,qBAAa,YAAa,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,UAAU,CAAa;gBAEnB,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU;IAK7C,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA8B1E,OAAO,CAAC,eAAe;YAST,WAAW;YAoBX,SAAS;CAqCxB"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
2
2
|
export class GitHubClient {
|
|
3
3
|
apiUrl = 'https://api.github.com';
|
|
4
4
|
token;
|
|
5
|
-
|
|
5
|
+
httpClient;
|
|
6
|
+
constructor(token, httpClient) {
|
|
6
7
|
this.token = token || process.env.GITHUB_TOKEN;
|
|
8
|
+
this.httpClient = httpClient || new HttpClient();
|
|
7
9
|
}
|
|
8
10
|
async fetch(packageName, version) {
|
|
9
11
|
try {
|
|
@@ -48,7 +50,7 @@ export class GitHubClient {
|
|
|
48
50
|
if (this.token) {
|
|
49
51
|
headers['Authorization'] = `token ${this.token}`;
|
|
50
52
|
}
|
|
51
|
-
const response = await
|
|
53
|
+
const response = await this.httpClient.get(url, { headers });
|
|
52
54
|
return response.data;
|
|
53
55
|
}
|
|
54
56
|
catch (error) {
|
|
@@ -64,13 +66,13 @@ export class GitHubClient {
|
|
|
64
66
|
if (this.token) {
|
|
65
67
|
headers['Authorization'] = `token ${this.token}`;
|
|
66
68
|
}
|
|
67
|
-
const response = await
|
|
69
|
+
const response = await this.httpClient.get(url, { headers });
|
|
68
70
|
// If docs is a directory, fetch all markdown files
|
|
69
71
|
if (Array.isArray(response.data)) {
|
|
70
72
|
const markdownFiles = response.data.filter((file) => file.type === 'file' && file.name.endsWith('.md'));
|
|
71
73
|
const contents = await Promise.all(markdownFiles.map(async (file) => {
|
|
72
74
|
const fileUrl = `${this.apiUrl}/repos/${owner}/${repo}/contents/${file.path}${refParam}`;
|
|
73
|
-
const fileResponse = await
|
|
75
|
+
const fileResponse = await this.httpClient.get(fileUrl, {
|
|
74
76
|
headers: { ...headers, 'Accept': 'application/vnd.github.v3.raw' }
|
|
75
77
|
});
|
|
76
78
|
return `## ${file.name}\n\n${fileResponse.data}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/documentation/github-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { Documentation, DocumentationSource } from '../types/documentation.js';
|
|
2
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
2
3
|
export declare class HttpFetcher implements DocumentationSource {
|
|
4
|
+
private httpClient;
|
|
5
|
+
constructor(httpClient?: HttpClient);
|
|
3
6
|
fetch(packageName: string, version?: string): Promise<Documentation>;
|
|
4
7
|
}
|
|
5
8
|
//# sourceMappingURL=http-fetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-fetcher.d.ts","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-fetcher.d.ts","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,qBAAa,WAAY,YAAW,mBAAmB;IACrD,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,CAAC,EAAE,UAAU;IAI7B,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAwB3E"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
2
2
|
export class HttpFetcher {
|
|
3
|
+
httpClient;
|
|
4
|
+
constructor(httpClient) {
|
|
5
|
+
this.httpClient = httpClient || new HttpClient();
|
|
6
|
+
}
|
|
3
7
|
async fetch(packageName, version) {
|
|
4
8
|
try {
|
|
5
9
|
// packageName should be a URL for HTTP fetcher
|
|
6
10
|
const url = packageName.startsWith('http') ? packageName : `https://${packageName}`;
|
|
7
|
-
const response = await
|
|
11
|
+
const response = await this.httpClient.get(url, {
|
|
8
12
|
timeout: 10000,
|
|
9
13
|
headers: {
|
|
10
14
|
'User-Agent': 'Safe-Coder-MCP/1.0.0',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-fetcher.js","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-fetcher.js","sourceRoot":"","sources":["../../src/documentation/http-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,OAAO,WAAW;IACd,UAAU,CAAa;IAE/B,YAAY,UAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,UAAU,EAAE,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,OAAgB;QAC/C,IAAI,CAAC;YACH,+CAA+C;YAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,WAAW,EAAE,CAAC;YAEpF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC9C,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,YAAY,EAAE,sBAAsB;iBACrC;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;gBAC3B,OAAO;gBACP,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,MAAM,EAAE,MAAM;gBACd,GAAG;gBACH,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { DocumentationCache } from './cache.js';
|
|
2
2
|
import type { Documentation } from '../types/documentation.js';
|
|
3
|
+
import type { ProxyConfig } from '../utils/http-client.js';
|
|
3
4
|
export declare class DocumentationService {
|
|
4
5
|
private cache;
|
|
5
6
|
private npmClient;
|
|
6
7
|
private githubClient;
|
|
7
8
|
private httpFetcher;
|
|
8
9
|
private normalizer;
|
|
9
|
-
constructor(cacheTTLMinutes?: number, githubToken?: string);
|
|
10
|
-
getDocumentation(packageName: string, version?: string, source?: 'npm' | 'github' | 'http'): Promise<Documentation>;
|
|
11
|
-
refreshDocumentation(packageName: string, version?: string): Promise<
|
|
10
|
+
constructor(cacheTTLMinutes?: number, githubToken?: string, proxyConfig?: ProxyConfig);
|
|
11
|
+
getDocumentation(packageName: string, version?: string, source?: 'npm' | 'github' | 'http', forceRefresh?: boolean): Promise<Documentation>;
|
|
12
|
+
refreshDocumentation(packageName: string, version?: string): Promise<Documentation>;
|
|
13
|
+
checkForUpdates(packageName: string, version?: string): Promise<boolean>;
|
|
12
14
|
getCache(): DocumentationCache;
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAA0B;gBAEhC,eAAe,GAAE,MAAW,EAAE,WAAW,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAA0B;gBAEhC,eAAe,GAAE,MAAW,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IASnF,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,EAClC,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,aAAa,CAAC;IA+GnB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAKnF,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB9E,QAAQ,IAAI,kBAAkB;CAG/B"}
|
|
@@ -3,25 +3,29 @@ import { NpmRegistryClient } from './npm-client.js';
|
|
|
3
3
|
import { GitHubClient } from './github-client.js';
|
|
4
4
|
import { HttpFetcher } from './http-fetcher.js';
|
|
5
5
|
import { DocumentationNormalizer } from './normalizer.js';
|
|
6
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
6
7
|
export class DocumentationService {
|
|
7
8
|
cache;
|
|
8
9
|
npmClient;
|
|
9
10
|
githubClient;
|
|
10
11
|
httpFetcher;
|
|
11
12
|
normalizer;
|
|
12
|
-
constructor(cacheTTLMinutes = 60, githubToken) {
|
|
13
|
+
constructor(cacheTTLMinutes = 60, githubToken, proxyConfig) {
|
|
13
14
|
this.cache = new DocumentationCache(cacheTTLMinutes);
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
15
|
+
const httpClient = proxyConfig ? new HttpClient(proxyConfig) : new HttpClient();
|
|
16
|
+
this.npmClient = new NpmRegistryClient(httpClient);
|
|
17
|
+
this.githubClient = new GitHubClient(githubToken, httpClient);
|
|
18
|
+
this.httpFetcher = new HttpFetcher(httpClient);
|
|
17
19
|
this.normalizer = new DocumentationNormalizer();
|
|
18
20
|
}
|
|
19
|
-
async getDocumentation(packageName, version, source) {
|
|
21
|
+
async getDocumentation(packageName, version, source, forceRefresh = false) {
|
|
20
22
|
const cacheKey = this.cache.generateKey(packageName, version);
|
|
21
|
-
// Check cache first
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
// Check cache first (unless force refresh)
|
|
24
|
+
if (!forceRefresh) {
|
|
25
|
+
const cached = this.cache.get(cacheKey);
|
|
26
|
+
if (cached) {
|
|
27
|
+
return cached;
|
|
28
|
+
}
|
|
25
29
|
}
|
|
26
30
|
// Determine source if not specified
|
|
27
31
|
let actualSource = source;
|
|
@@ -36,12 +40,39 @@ export class DocumentationService {
|
|
|
36
40
|
actualSource = 'npm';
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
|
-
// Fetch documentation
|
|
43
|
+
// Fetch documentation with fallback strategy
|
|
40
44
|
let documentation;
|
|
45
|
+
let lastError = null;
|
|
41
46
|
try {
|
|
42
47
|
switch (actualSource) {
|
|
43
48
|
case 'npm':
|
|
44
49
|
documentation = await this.npmClient.fetch(packageName, version);
|
|
50
|
+
// If npm returns minimal content (fallback message), try GitHub as backup
|
|
51
|
+
if (documentation.content.includes('⚠️ No documentation found') && !version) {
|
|
52
|
+
try {
|
|
53
|
+
// Try to extract GitHub repo from npm metadata
|
|
54
|
+
const npmData = await this.npmClient.getPackageMetadata(packageName);
|
|
55
|
+
if (npmData?.repository?.url) {
|
|
56
|
+
const githubMatch = npmData.repository.url.match(/github\.com[\/:]([^\/]+)\/([^\/]+?)(?:\.git)?$/);
|
|
57
|
+
if (githubMatch) {
|
|
58
|
+
const [, owner, repo] = githubMatch;
|
|
59
|
+
try {
|
|
60
|
+
const githubDoc = await this.githubClient.fetch(`${owner}/${repo}`, version);
|
|
61
|
+
if (githubDoc.content && !githubDoc.content.includes('No documentation found')) {
|
|
62
|
+
documentation = githubDoc;
|
|
63
|
+
documentation.name = packageName; // Keep original package name
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (githubError) {
|
|
67
|
+
// GitHub also failed, keep npm result
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (fallbackError) {
|
|
73
|
+
// Fallback failed, keep npm result
|
|
74
|
+
}
|
|
75
|
+
}
|
|
45
76
|
break;
|
|
46
77
|
case 'github':
|
|
47
78
|
documentation = await this.githubClient.fetch(packageName, version);
|
|
@@ -55,18 +86,71 @@ export class DocumentationService {
|
|
|
55
86
|
// Normalize documentation
|
|
56
87
|
const normalized = this.normalizer.normalize(documentation.content, actualSource);
|
|
57
88
|
documentation = { ...documentation, sections: normalized.sections };
|
|
58
|
-
// Cache the result
|
|
89
|
+
// Cache the result (even if it's a fallback message)
|
|
59
90
|
this.cache.set(cacheKey, documentation);
|
|
60
91
|
return documentation;
|
|
61
92
|
}
|
|
62
93
|
catch (error) {
|
|
63
|
-
|
|
94
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
95
|
+
// If primary source failed and we haven't tried fallback, try fallback
|
|
96
|
+
if (actualSource === 'npm' && !version) {
|
|
97
|
+
try {
|
|
98
|
+
// Try GitHub as fallback
|
|
99
|
+
const npmData = await this.npmClient.getPackageMetadata(packageName);
|
|
100
|
+
if (npmData?.repository?.url) {
|
|
101
|
+
const githubMatch = npmData.repository.url.match(/github\.com[\/:]([^\/]+)\/([^\/]+?)(?:\.git)?$/);
|
|
102
|
+
if (githubMatch) {
|
|
103
|
+
const [, owner, repo] = githubMatch;
|
|
104
|
+
try {
|
|
105
|
+
const githubDoc = await this.githubClient.fetch(`${owner}/${repo}`, version);
|
|
106
|
+
if (githubDoc.content && !githubDoc.content.includes('No documentation found')) {
|
|
107
|
+
documentation = githubDoc;
|
|
108
|
+
documentation.name = packageName;
|
|
109
|
+
const normalized = this.normalizer.normalize(documentation.content, 'github');
|
|
110
|
+
documentation = { ...documentation, sections: normalized.sections };
|
|
111
|
+
this.cache.set(cacheKey, documentation);
|
|
112
|
+
return documentation;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (githubError) {
|
|
116
|
+
// GitHub also failed
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (fallbackError) {
|
|
122
|
+
// Fallback failed
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
throw new Error(`Failed to fetch documentation: ${lastError.message}`);
|
|
64
126
|
}
|
|
65
127
|
}
|
|
66
|
-
//
|
|
128
|
+
// Force refresh documentation (bypass cache)
|
|
67
129
|
async refreshDocumentation(packageName, version) {
|
|
130
|
+
return this.getDocumentation(packageName, version, undefined, true);
|
|
131
|
+
}
|
|
132
|
+
// Check if cached documentation is still up-to-date
|
|
133
|
+
async checkForUpdates(packageName, version) {
|
|
68
134
|
const cacheKey = this.cache.generateKey(packageName, version);
|
|
69
|
-
this.cache.
|
|
135
|
+
const cached = this.cache.get(cacheKey);
|
|
136
|
+
if (!cached) {
|
|
137
|
+
return true; // No cache, needs update
|
|
138
|
+
}
|
|
139
|
+
// For npm packages, check if newer version exists
|
|
140
|
+
if (cached.source === 'npm') {
|
|
141
|
+
try {
|
|
142
|
+
const fresh = await this.npmClient.fetch(packageName, version);
|
|
143
|
+
// Compare publish times
|
|
144
|
+
if (fresh.lastUpdated > cached.lastUpdated) {
|
|
145
|
+
return true; // Newer version available
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
// If check fails, assume cached is still valid
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return false; // Cached version is still latest
|
|
70
154
|
}
|
|
71
155
|
getCache() {
|
|
72
156
|
return this.cache;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/documentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,MAAM,OAAO,oBAAoB;IACvB,KAAK,CAAqB;IAC1B,SAAS,CAAoB;IAC7B,YAAY,CAAe;IAC3B,WAAW,CAAc;IACzB,UAAU,CAA0B;IAE5C,YAAY,kBAA0B,EAAE,EAAE,WAAoB,EAAE,WAAyB;QACvF,IAAI,CAAC,KAAK,GAAG,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;QAChF,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,WAAmB,EACnB,OAAgB,EAChB,MAAkC,EAClC,eAAwB,KAAK;QAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE9D,2CAA2C;QAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,YAAY,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,YAAY,GAAG,MAAM,CAAC;YACxB,CAAC;iBAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,YAAY,GAAG,QAAQ,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,aAA4B,CAAC;QACjC,IAAI,SAAS,GAAiB,IAAI,CAAC;QAEnC,IAAI,CAAC;YACH,QAAQ,YAAY,EAAE,CAAC;gBACrB,KAAK,KAAK;oBACR,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBACjE,0EAA0E;oBAC1E,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;wBAC5E,IAAI,CAAC;4BACH,+CAA+C;4BAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;4BACrE,IAAI,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;gCAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;gCACnG,IAAI,WAAW,EAAE,CAAC;oCAChB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC;oCACpC,IAAI,CAAC;wCACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;wCAC7E,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;4CAC/E,aAAa,GAAG,SAAS,CAAC;4CAC1B,aAAa,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,6BAA6B;wCACjE,CAAC;oCACH,CAAC;oCAAC,OAAO,WAAW,EAAE,CAAC;wCACrB,sCAAsC;oCACxC,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,OAAO,aAAa,EAAE,CAAC;4BACvB,mCAAmC;wBACrC,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBACpE,MAAM;gBACR,KAAK,MAAM;oBACT,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBACnE,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,0BAA0B;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAClF,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;YAEpE,qDAAqD;YACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAExC,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,uEAAuE;YACvE,IAAI,YAAY,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,yBAAyB;oBACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBACrE,IAAI,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;wBAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;wBACnG,IAAI,WAAW,EAAE,CAAC;4BAChB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC;4BACpC,IAAI,CAAC;gCACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;gCAC7E,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;oCAC/E,aAAa,GAAG,SAAS,CAAC;oCAC1B,aAAa,CAAC,IAAI,GAAG,WAAW,CAAC;oCACjC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oCAC9E,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;oCACpE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;oCACxC,OAAO,aAAa,CAAC;gCACvB,CAAC;4BACH,CAAC;4BAAC,OAAO,WAAW,EAAE,CAAC;gCACrB,qBAAqB;4BACvB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,kBAAkB;gBACpB,CAAC;YACH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,oBAAoB,CAAC,WAAmB,EAAE,OAAgB;QAC9D,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,OAAgB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,CAAC,yBAAyB;QACxC,CAAC;QAED,kDAAkD;QAClD,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC/D,wBAAwB;gBACxB,IAAI,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC3C,OAAO,IAAI,CAAC,CAAC,0BAA0B;gBACzC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+CAA+C;gBAC/C,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,iCAAiC;IACjD,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import type { Documentation, DocumentationSource } from '../types/documentation.js';
|
|
2
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
2
3
|
export declare class NpmRegistryClient implements DocumentationSource {
|
|
3
4
|
private readonly registryUrl;
|
|
5
|
+
private httpClient;
|
|
6
|
+
constructor(httpClient?: HttpClient);
|
|
7
|
+
getPackageMetadata(packageName: string): Promise<{
|
|
8
|
+
repository?: {
|
|
9
|
+
url?: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
};
|
|
12
|
+
homepage?: string;
|
|
13
|
+
} | null>;
|
|
4
14
|
fetch(packageName: string, version?: string): Promise<Documentation>;
|
|
5
15
|
private fetchFromRepository;
|
|
16
|
+
private fetchFromHomepage;
|
|
17
|
+
private generateFallbackMessage;
|
|
6
18
|
}
|
|
7
19
|
//# sourceMappingURL=npm-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-client.d.ts","sourceRoot":"","sources":["../../src/documentation/npm-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"npm-client.d.ts","sourceRoot":"","sources":["../../src/documentation/npm-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAC5D,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,CAAC,EAAE,UAAU;IAK7B,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QACrD,UAAU,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IAqBH,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAmE5D,mBAAmB;YAoCnB,iBAAiB;IAsC/B,OAAO,CAAC,uBAAuB;CAmChC"}
|