@elliotding/ai-agent-mcp 0.1.0
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/dist/api/cached-client.d.ts +48 -0
- package/dist/api/cached-client.d.ts.map +1 -0
- package/dist/api/cached-client.js +126 -0
- package/dist/api/cached-client.js.map +1 -0
- package/dist/api/client.d.ts +213 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +326 -0
- package/dist/api/client.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +26 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +36 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +194 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/permissions.d.ts +60 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +256 -0
- package/dist/auth/permissions.js.map +1 -0
- package/dist/auth/token-validator.d.ts +52 -0
- package/dist/auth/token-validator.d.ts.map +1 -0
- package/dist/auth/token-validator.js +217 -0
- package/dist/auth/token-validator.js.map +1 -0
- package/dist/cache/cache-manager.d.ts +49 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +191 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/redis-client.d.ts +45 -0
- package/dist/cache/redis-client.d.ts.map +1 -0
- package/dist/cache/redis-client.js +210 -0
- package/dist/cache/redis-client.js.map +1 -0
- package/dist/config/constants.d.ts +28 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +54 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +168 -0
- package/dist/config/index.js.map +1 -0
- package/dist/filesystem/manager.d.ts +45 -0
- package/dist/filesystem/manager.d.ts.map +1 -0
- package/dist/filesystem/manager.js +246 -0
- package/dist/filesystem/manager.js.map +1 -0
- package/dist/git/multi-source-manager.d.ts +62 -0
- package/dist/git/multi-source-manager.d.ts.map +1 -0
- package/dist/git/multi-source-manager.js +293 -0
- package/dist/git/multi-source-manager.js.map +1 -0
- package/dist/git/operations.d.ts +27 -0
- package/dist/git/operations.d.ts.map +1 -0
- package/dist/git/operations.js +83 -0
- package/dist/git/operations.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/monitoring/health.d.ts +35 -0
- package/dist/monitoring/health.d.ts.map +1 -0
- package/dist/monitoring/health.js +105 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +10 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/loader.d.ts +87 -0
- package/dist/resources/loader.d.ts.map +1 -0
- package/dist/resources/loader.js +452 -0
- package/dist/resources/loader.js.map +1 -0
- package/dist/server/http.d.ts +57 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +336 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +157 -0
- package/dist/server.js.map +1 -0
- package/dist/session/manager.d.ts +91 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +251 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/manage-subscription.d.ts +43 -0
- package/dist/tools/manage-subscription.d.ts.map +1 -0
- package/dist/tools/manage-subscription.js +268 -0
- package/dist/tools/manage-subscription.js.map +1 -0
- package/dist/tools/registry.d.ts +40 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +85 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-resources.d.ts +31 -0
- package/dist/tools/search-resources.d.ts.map +1 -0
- package/dist/tools/search-resources.js +154 -0
- package/dist/tools/search-resources.js.map +1 -0
- package/dist/tools/sync-resources.d.ts +41 -0
- package/dist/tools/sync-resources.d.ts.map +1 -0
- package/dist/tools/sync-resources.js +606 -0
- package/dist/tools/sync-resources.js.map +1 -0
- package/dist/tools/uninstall-resource.d.ts +30 -0
- package/dist/tools/uninstall-resource.d.ts.map +1 -0
- package/dist/tools/uninstall-resource.js +259 -0
- package/dist/tools/uninstall-resource.js.map +1 -0
- package/dist/tools/upload-resource.d.ts +77 -0
- package/dist/tools/upload-resource.d.ts.map +1 -0
- package/dist/tools/upload-resource.js +252 -0
- package/dist/tools/upload-resource.js.map +1 -0
- package/dist/transport/sse.d.ts +29 -0
- package/dist/transport/sse.d.ts.map +1 -0
- package/dist/transport/sse.js +271 -0
- package/dist/transport/sse.js.map +1 -0
- package/dist/types/errors.d.ts +60 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +112 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +50 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +6 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/resources.d.ts +109 -0
- package/dist/types/resources.d.ts.map +1 -0
- package/dist/types/resources.js +7 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/tools.d.ts +147 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +6 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/cursor-paths.d.ts +49 -0
- package/dist/utils/cursor-paths.d.ts.map +1 -0
- package/dist/utils/cursor-paths.js +116 -0
- package/dist/utils/cursor-paths.js.map +1 -0
- package/dist/utils/log-cleaner.d.ts +18 -0
- package/dist/utils/log-cleaner.d.ts.map +1 -0
- package/dist/utils/log-cleaner.js +112 -0
- package/dist/utils/log-cleaner.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +292 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +58 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +214 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +58 -0
- package/src/api/cached-client.ts +144 -0
- package/src/api/client.ts +578 -0
- package/src/auth/index.ts +11 -0
- package/src/auth/middleware.ts +244 -0
- package/src/auth/permissions.ts +317 -0
- package/src/auth/token-validator.ts +294 -0
- package/src/cache/cache-manager.ts +243 -0
- package/src/cache/index.ts +6 -0
- package/src/cache/redis-client.ts +249 -0
- package/src/config/constants.ts +33 -0
- package/src/config/index.ts +228 -0
- package/src/filesystem/manager.ts +235 -0
- package/src/git/multi-source-manager.ts +333 -0
- package/src/git/operations.ts +93 -0
- package/src/index.ts +139 -0
- package/src/monitoring/health.ts +132 -0
- package/src/resources/index.ts +13 -0
- package/src/resources/loader.ts +530 -0
- package/src/server/http.ts +427 -0
- package/src/server.ts +191 -0
- package/src/session/manager.ts +296 -0
- package/src/tools/index.ts +11 -0
- package/src/tools/manage-subscription.ts +332 -0
- package/src/tools/registry.ts +97 -0
- package/src/tools/search-resources.ts +177 -0
- package/src/tools/sync-resources.ts +662 -0
- package/src/tools/uninstall-resource.ts +248 -0
- package/src/tools/upload-resource.ts +258 -0
- package/src/transport/sse.ts +308 -0
- package/src/types/errors.ts +146 -0
- package/src/types/index.ts +7 -0
- package/src/types/mcp.ts +61 -0
- package/src/types/resources.ts +141 -0
- package/src/types/tools.ts +175 -0
- package/src/utils/cursor-paths.ts +83 -0
- package/src/utils/log-cleaner.ts +92 -0
- package/src/utils/logger.ts +333 -0
- package/src/utils/validation.ts +262 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* REST API Client
|
|
4
|
+
* HTTP client for CSP Resource Server
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.apiClient = void 0;
|
|
41
|
+
const axios_1 = __importStar(require("axios"));
|
|
42
|
+
const config_1 = require("../config");
|
|
43
|
+
const logger_1 = require("../utils/logger");
|
|
44
|
+
const errors_1 = require("../types/errors");
|
|
45
|
+
class APIClient {
|
|
46
|
+
client;
|
|
47
|
+
maxRetries = 3;
|
|
48
|
+
retryDelay = 1000; // 1 second
|
|
49
|
+
constructor() {
|
|
50
|
+
this.client = axios_1.default.create({
|
|
51
|
+
baseURL: config_1.config.csp.apiBaseUrl,
|
|
52
|
+
timeout: config_1.config.csp.timeout,
|
|
53
|
+
headers: {
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
'User-Agent': `csp-ai-agent-mcp/0.2.0`,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
// Request interceptor for authentication and logging
|
|
59
|
+
this.client.interceptors.request.use((requestConfig) => {
|
|
60
|
+
if (config_1.config.csp.apiToken) {
|
|
61
|
+
requestConfig.headers.Authorization = `Bearer ${config_1.config.csp.apiToken}`;
|
|
62
|
+
}
|
|
63
|
+
// Enhanced request logging
|
|
64
|
+
logger_1.logger.debug({
|
|
65
|
+
type: 'api_request_start',
|
|
66
|
+
method: requestConfig.method?.toUpperCase(),
|
|
67
|
+
url: requestConfig.url,
|
|
68
|
+
params: requestConfig.params,
|
|
69
|
+
data: requestConfig.data ? JSON.stringify(requestConfig.data).substring(0, 500) : undefined,
|
|
70
|
+
headers: this.sanitizeHeaders(requestConfig.headers),
|
|
71
|
+
}, `API Request: ${requestConfig.method?.toUpperCase()} ${requestConfig.url}`);
|
|
72
|
+
// Record start time for duration calculation
|
|
73
|
+
requestConfig.startTime = Date.now();
|
|
74
|
+
return requestConfig;
|
|
75
|
+
}, (error) => {
|
|
76
|
+
logger_1.logger.error({
|
|
77
|
+
type: 'api_request_interceptor_error',
|
|
78
|
+
error: error.message
|
|
79
|
+
}, 'API request interceptor error');
|
|
80
|
+
return Promise.reject(error);
|
|
81
|
+
});
|
|
82
|
+
// Response interceptor for detailed logging
|
|
83
|
+
this.client.interceptors.response.use((response) => {
|
|
84
|
+
const startTime = response.config.startTime || Date.now();
|
|
85
|
+
const duration = Date.now() - startTime;
|
|
86
|
+
const method = response.config.method?.toUpperCase() || 'UNKNOWN';
|
|
87
|
+
const url = response.config.url || 'unknown';
|
|
88
|
+
// Enhanced response logging
|
|
89
|
+
(0, logger_1.logApiRequest)(method, url, response.status, duration, response.config.data, response.data, response.headers);
|
|
90
|
+
return response;
|
|
91
|
+
}, (error) => {
|
|
92
|
+
const startTime = error.config?.startTime || Date.now();
|
|
93
|
+
const duration = Date.now() - startTime;
|
|
94
|
+
const statusCode = error.response?.status;
|
|
95
|
+
const method = error.config?.method?.toUpperCase() || 'UNKNOWN';
|
|
96
|
+
const url = error.config?.url || 'unknown';
|
|
97
|
+
// Enhanced error logging
|
|
98
|
+
(0, logger_1.logApiError)(method, url, error, error.config?.data, statusCode);
|
|
99
|
+
// Log response details if available
|
|
100
|
+
if (error.response) {
|
|
101
|
+
logger_1.logger.error({
|
|
102
|
+
type: 'api_response_error',
|
|
103
|
+
method,
|
|
104
|
+
url,
|
|
105
|
+
status: statusCode,
|
|
106
|
+
statusText: error.response.statusText,
|
|
107
|
+
responseData: error.response.data ? JSON.stringify(error.response.data).substring(0, 1000) : undefined,
|
|
108
|
+
duration,
|
|
109
|
+
}, `API Error Response: ${method} ${url} - ${statusCode}`);
|
|
110
|
+
}
|
|
111
|
+
return Promise.reject(error);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Sanitize headers to hide sensitive information
|
|
116
|
+
*/
|
|
117
|
+
sanitizeHeaders(headers) {
|
|
118
|
+
const sanitized = { ...headers };
|
|
119
|
+
if (sanitized['Authorization'] || sanitized['authorization']) {
|
|
120
|
+
const key = sanitized['Authorization'] ? 'Authorization' : 'authorization';
|
|
121
|
+
const value = sanitized[key];
|
|
122
|
+
if (value && value.startsWith('Bearer ')) {
|
|
123
|
+
const token = value.substring(7);
|
|
124
|
+
sanitized[key] = `Bearer ${token.substring(0, 10)}...${token.substring(token.length - 10)}`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return sanitized;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Execute request with retry logic
|
|
131
|
+
*/
|
|
132
|
+
async executeWithRetry(requestFn, method, url, retryCount = 0) {
|
|
133
|
+
try {
|
|
134
|
+
return await requestFn();
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
const isNetworkError = error instanceof axios_1.AxiosError &&
|
|
138
|
+
(!error.response || error.code === 'ECONNREFUSED' || error.code === 'ETIMEDOUT');
|
|
139
|
+
if (isNetworkError && retryCount < this.maxRetries) {
|
|
140
|
+
const delay = this.retryDelay * Math.pow(2, retryCount);
|
|
141
|
+
logger_1.logger.warn({
|
|
142
|
+
method,
|
|
143
|
+
url,
|
|
144
|
+
retryCount: retryCount + 1,
|
|
145
|
+
maxRetries: this.maxRetries,
|
|
146
|
+
delay,
|
|
147
|
+
}, `API request failed, retrying in ${delay}ms...`);
|
|
148
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
149
|
+
return this.executeWithRetry(requestFn, method, url, retryCount + 1);
|
|
150
|
+
}
|
|
151
|
+
// Transform axios error to APIError
|
|
152
|
+
if (error instanceof axios_1.AxiosError) {
|
|
153
|
+
throw (0, errors_1.createAPIError)(method, url, error, error.response?.status, retryCount);
|
|
154
|
+
}
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* GET request
|
|
160
|
+
*/
|
|
161
|
+
async get(url, config) {
|
|
162
|
+
return this.executeWithRetry(async () => {
|
|
163
|
+
const response = await this.client.get(url, config);
|
|
164
|
+
return response.data;
|
|
165
|
+
}, 'GET', url);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* POST request
|
|
169
|
+
*/
|
|
170
|
+
async post(url, data, config) {
|
|
171
|
+
return this.executeWithRetry(async () => {
|
|
172
|
+
const response = await this.client.post(url, data, config);
|
|
173
|
+
return response.data;
|
|
174
|
+
}, 'POST', url);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* PUT request
|
|
178
|
+
*/
|
|
179
|
+
async put(url, data, config) {
|
|
180
|
+
return this.executeWithRetry(async () => {
|
|
181
|
+
const response = await this.client.put(url, data, config);
|
|
182
|
+
return response.data;
|
|
183
|
+
}, 'PUT', url);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* DELETE request
|
|
187
|
+
*/
|
|
188
|
+
async delete(url, config) {
|
|
189
|
+
return this.executeWithRetry(async () => {
|
|
190
|
+
const response = await this.client.delete(url, config);
|
|
191
|
+
return response.data;
|
|
192
|
+
}, 'DELETE', url);
|
|
193
|
+
}
|
|
194
|
+
//===========================================
|
|
195
|
+
// CSP Resource Server API Endpoints
|
|
196
|
+
//===========================================
|
|
197
|
+
/**
|
|
198
|
+
* Get subscription list
|
|
199
|
+
*/
|
|
200
|
+
async getSubscriptions(params) {
|
|
201
|
+
const response = await this.get('/csp/api/resources/subscriptions', { params });
|
|
202
|
+
// Extract data from CSP API response format
|
|
203
|
+
if (!response.data) {
|
|
204
|
+
throw new Error('Invalid API response: missing data field');
|
|
205
|
+
}
|
|
206
|
+
return response.data;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Subscribe to resource
|
|
210
|
+
*/
|
|
211
|
+
async subscribe(resourceIds, autoSync = true, scope // Added: subscription scope
|
|
212
|
+
) {
|
|
213
|
+
const response = await this.post('/csp/api/resources/subscriptions/add', {
|
|
214
|
+
resource_ids: resourceIds,
|
|
215
|
+
auto_sync: autoSync,
|
|
216
|
+
scope,
|
|
217
|
+
});
|
|
218
|
+
if (!response.data) {
|
|
219
|
+
throw new Error('Invalid API response: missing data field');
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
success: true,
|
|
223
|
+
subscriptions: response.data.subscriptions
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Unsubscribe from resource
|
|
228
|
+
*/
|
|
229
|
+
async unsubscribe(resourceIds) {
|
|
230
|
+
// Support batch unsubscribe
|
|
231
|
+
const ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];
|
|
232
|
+
const response = await this.delete('/csp/api/resources/subscriptions/remove', {
|
|
233
|
+
data: { resource_ids: ids }
|
|
234
|
+
});
|
|
235
|
+
// Just validate response, no need to return anything
|
|
236
|
+
if (!response.data) {
|
|
237
|
+
throw new Error('Invalid API response: missing data field');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Search resources
|
|
242
|
+
*/
|
|
243
|
+
async searchResources(params) {
|
|
244
|
+
const response = await this.get('/csp/api/resources/search', { params });
|
|
245
|
+
// Extract data from CSP API response format
|
|
246
|
+
if (!response.data) {
|
|
247
|
+
throw new Error('Invalid API response: missing data field');
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
total: response.data.total,
|
|
251
|
+
page: response.data.page,
|
|
252
|
+
page_size: response.data.page_size,
|
|
253
|
+
results: response.data.results.map(r => ({
|
|
254
|
+
...r,
|
|
255
|
+
score: r.score || 0,
|
|
256
|
+
is_subscribed: r.is_subscribed || false
|
|
257
|
+
}))
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Download resource — returns all files for the resource.
|
|
262
|
+
*
|
|
263
|
+
* GET /csp/api/resources/download/{id}
|
|
264
|
+
* Response: { data: { resource_id, name, type, version, hash, files: [{path, content}] } }
|
|
265
|
+
*
|
|
266
|
+
* files[].path is the relative path within the resource directory.
|
|
267
|
+
* Single-file resources (command, rule) have exactly one element.
|
|
268
|
+
* Multi-file resources (skill, mcp) have all their files included.
|
|
269
|
+
*/
|
|
270
|
+
async downloadResource(resourceId) {
|
|
271
|
+
const response = await this.get(`/csp/api/resources/download/${resourceId}`);
|
|
272
|
+
return response.data;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get resource detail
|
|
276
|
+
*/
|
|
277
|
+
async getResourceDetail(resourceId) {
|
|
278
|
+
return this.get(`/csp/api/resources/${resourceId}`);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Stage resource files for upload (Step 1 of two-step upload flow).
|
|
282
|
+
*
|
|
283
|
+
* POST /csp/api/resources/upload
|
|
284
|
+
* Body: { type, name, files: [{ path, content }] }
|
|
285
|
+
* Response: { upload_id, status, expires_at, preview_url }
|
|
286
|
+
*
|
|
287
|
+
* The server validates path traversal, total size (< 10 MB), and name conflicts.
|
|
288
|
+
* All file types are supported — mcp packages may include .py, .js, package.json, etc.
|
|
289
|
+
*/
|
|
290
|
+
async uploadResourceFiles(params) {
|
|
291
|
+
const resp = await this.post('/csp/api/resources/upload', params);
|
|
292
|
+
return resp.data;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Finalize staged upload — triggers Git commit (Step 2 of two-step upload flow).
|
|
296
|
+
*
|
|
297
|
+
* POST /csp/api/resources/finalize
|
|
298
|
+
* Body: { upload_id, commit_message }
|
|
299
|
+
* Response: { resource_id, version, url, commit_hash, download_url }
|
|
300
|
+
*/
|
|
301
|
+
async finalizeResourceUpload(uploadId, commitMessage) {
|
|
302
|
+
const resp = await this.post('/csp/api/resources/finalize', {
|
|
303
|
+
upload_id: uploadId,
|
|
304
|
+
commit_message: commitMessage,
|
|
305
|
+
});
|
|
306
|
+
return resp.data;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* @deprecated Use uploadResourceFiles() + finalizeResourceUpload() instead.
|
|
310
|
+
*/
|
|
311
|
+
async uploadResource(params) {
|
|
312
|
+
return this.post('/csp/api/resources/upload', params);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* @deprecated Use finalizeResourceUpload() instead.
|
|
316
|
+
*/
|
|
317
|
+
async finalizeUpload(uploadId, hash) {
|
|
318
|
+
return this.post('/csp/api/resources/finalize', {
|
|
319
|
+
upload_id: uploadId,
|
|
320
|
+
hash,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Export singleton instance
|
|
325
|
+
exports.apiClient = new APIClient();
|
|
326
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,mBAAmB,CAAC;AAGlC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication Module
|
|
4
|
+
* Exports all authentication and authorization utilities
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
// Token validation via CSP API (primary method)
|
|
22
|
+
__exportStar(require("./token-validator"), exports);
|
|
23
|
+
// Permissions and middleware
|
|
24
|
+
__exportStar(require("./permissions"), exports);
|
|
25
|
+
__exportStar(require("./middleware"), exports);
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,gDAAgD;AAChD,oDAAkC;AAElC,6BAA6B;AAC7B,gDAA8B;AAC9B,+CAA6B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication and Permission Middlewares
|
|
3
|
+
* Token authentication and permission checking for HTTP endpoints
|
|
4
|
+
*/
|
|
5
|
+
import { FastifyRequest, FastifyReply } from 'fastify';
|
|
6
|
+
import { TokenPayload } from './token-validator';
|
|
7
|
+
/**
|
|
8
|
+
* Extended request with user info
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthenticatedRequest extends FastifyRequest {
|
|
11
|
+
user?: TokenPayload;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Token Authentication Middleware
|
|
15
|
+
* Verifies token via external REST API
|
|
16
|
+
*/
|
|
17
|
+
export declare function tokenAuthMiddleware(request: AuthenticatedRequest, reply: FastifyReply): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Token Authentication Middleware with Legacy Bearer Token Support
|
|
20
|
+
* Supports both token validation via API and legacy bearer tokens
|
|
21
|
+
*/
|
|
22
|
+
export declare function tokenAuthOrLegacyMiddleware(request: AuthenticatedRequest, reply: FastifyReply): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Permission Check Middleware Factory
|
|
25
|
+
* Creates middleware to check permissions for a specific tool
|
|
26
|
+
*/
|
|
27
|
+
export declare function requirePermission(toolName: string): (request: AuthenticatedRequest, reply: FastifyReply) => Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Permission Check for Tool Call
|
|
30
|
+
* Checks permission when tools/call is invoked
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkToolCallPermission(toolName: string, user: TokenPayload): {
|
|
33
|
+
allowed: boolean;
|
|
34
|
+
reason?: string;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAe,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI9D;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAkEf;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CA+Df;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,IAClC,SAAS,oBAAoB,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CA+DjF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,YAAY,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAEvC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication and Permission Middlewares
|
|
4
|
+
* Token authentication and permission checking for HTTP endpoints
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.tokenAuthMiddleware = tokenAuthMiddleware;
|
|
8
|
+
exports.tokenAuthOrLegacyMiddleware = tokenAuthOrLegacyMiddleware;
|
|
9
|
+
exports.requirePermission = requirePermission;
|
|
10
|
+
exports.checkToolCallPermission = checkToolCallPermission;
|
|
11
|
+
const token_validator_1 = require("./token-validator");
|
|
12
|
+
const permissions_1 = require("./permissions");
|
|
13
|
+
const logger_1 = require("../utils/logger");
|
|
14
|
+
/**
|
|
15
|
+
* Token Authentication Middleware
|
|
16
|
+
* Verifies token via external REST API
|
|
17
|
+
*/
|
|
18
|
+
async function tokenAuthMiddleware(request, reply) {
|
|
19
|
+
try {
|
|
20
|
+
// Extract token from Authorization header
|
|
21
|
+
const authHeader = request.headers.authorization;
|
|
22
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
23
|
+
logger_1.logger.warn({
|
|
24
|
+
type: 'auth',
|
|
25
|
+
operation: 'middleware',
|
|
26
|
+
ip: request.ip,
|
|
27
|
+
url: request.url
|
|
28
|
+
}, 'Missing or invalid Authorization header');
|
|
29
|
+
reply.code(401).send({
|
|
30
|
+
error: 'Unauthorized',
|
|
31
|
+
message: 'Missing or invalid Authorization header. Expected: Bearer <token>',
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const token = authHeader.substring(7); // Remove 'Bearer ' prefix
|
|
36
|
+
// Verify token via external API
|
|
37
|
+
const payload = await (0, token_validator_1.verifyToken)(token);
|
|
38
|
+
if (!payload) {
|
|
39
|
+
logger_1.logger.warn({
|
|
40
|
+
type: 'auth',
|
|
41
|
+
operation: 'middleware',
|
|
42
|
+
ip: request.ip,
|
|
43
|
+
url: request.url
|
|
44
|
+
}, 'Token validation failed');
|
|
45
|
+
reply.code(401).send({
|
|
46
|
+
error: 'Unauthorized',
|
|
47
|
+
message: 'Invalid or expired token',
|
|
48
|
+
});
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Attach user info to request
|
|
52
|
+
request.user = payload;
|
|
53
|
+
logger_1.logger.debug({
|
|
54
|
+
type: 'auth',
|
|
55
|
+
operation: 'middleware',
|
|
56
|
+
userId: payload.userId,
|
|
57
|
+
email: payload.email,
|
|
58
|
+
groups: payload.groups
|
|
59
|
+
}, `Token authentication successful for user ${payload.userId}`);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger_1.logger.error({
|
|
63
|
+
type: 'auth',
|
|
64
|
+
operation: 'middleware',
|
|
65
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
66
|
+
}, 'Token authentication error');
|
|
67
|
+
reply.code(500).send({
|
|
68
|
+
error: 'Internal Server Error',
|
|
69
|
+
message: 'Authentication failed',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Token Authentication Middleware with Legacy Bearer Token Support
|
|
75
|
+
* Supports both token validation via API and legacy bearer tokens
|
|
76
|
+
*/
|
|
77
|
+
async function tokenAuthOrLegacyMiddleware(request, reply) {
|
|
78
|
+
try {
|
|
79
|
+
const authHeader = request.headers.authorization;
|
|
80
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
81
|
+
logger_1.logger.warn({
|
|
82
|
+
type: 'auth',
|
|
83
|
+
operation: 'middleware_legacy',
|
|
84
|
+
ip: request.ip,
|
|
85
|
+
url: request.url
|
|
86
|
+
}, 'Missing or invalid Authorization header');
|
|
87
|
+
reply.code(401).send({
|
|
88
|
+
error: 'Unauthorized',
|
|
89
|
+
message: 'Missing or invalid Authorization header',
|
|
90
|
+
});
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const token = authHeader.substring(7);
|
|
94
|
+
// Try to validate via API first
|
|
95
|
+
const payload = await (0, token_validator_1.verifyToken)(token);
|
|
96
|
+
if (payload) {
|
|
97
|
+
// API validation successful
|
|
98
|
+
request.user = payload;
|
|
99
|
+
logger_1.logger.debug({
|
|
100
|
+
type: 'auth',
|
|
101
|
+
operation: 'middleware_legacy',
|
|
102
|
+
userId: payload.userId,
|
|
103
|
+
email: payload.email,
|
|
104
|
+
groups: payload.groups
|
|
105
|
+
}, `Token validated via API for user ${payload.userId}`);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Fallback to legacy bearer token (for backward compatibility)
|
|
109
|
+
logger_1.logger.debug({
|
|
110
|
+
type: 'auth',
|
|
111
|
+
operation: 'middleware_legacy',
|
|
112
|
+
ip: request.ip
|
|
113
|
+
}, 'API validation failed, using legacy bearer token mode');
|
|
114
|
+
// In legacy mode, we don't have user info, so continue without setting request.user
|
|
115
|
+
// The endpoint will handle the legacy token separately
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
logger_1.logger.error({
|
|
119
|
+
type: 'auth',
|
|
120
|
+
operation: 'middleware_legacy',
|
|
121
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
122
|
+
}, 'Token authentication error');
|
|
123
|
+
reply.code(500).send({
|
|
124
|
+
error: 'Internal Server Error',
|
|
125
|
+
message: 'Authentication failed',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Permission Check Middleware Factory
|
|
131
|
+
* Creates middleware to check permissions for a specific tool
|
|
132
|
+
*/
|
|
133
|
+
function requirePermission(toolName) {
|
|
134
|
+
return async (request, reply) => {
|
|
135
|
+
try {
|
|
136
|
+
if (!request.user) {
|
|
137
|
+
logger_1.logger.error({
|
|
138
|
+
type: 'auth',
|
|
139
|
+
operation: 'permission_check',
|
|
140
|
+
url: request.url
|
|
141
|
+
}, 'Permission check called without authentication');
|
|
142
|
+
reply.code(401).send({
|
|
143
|
+
error: 'Unauthorized',
|
|
144
|
+
message: 'Authentication required',
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Check permission
|
|
149
|
+
const permissionCheck = (0, permissions_1.checkPermission)(toolName, request.user.groups);
|
|
150
|
+
if (!permissionCheck.allowed) {
|
|
151
|
+
logger_1.logger.warn({
|
|
152
|
+
type: 'auth',
|
|
153
|
+
operation: 'permission_check',
|
|
154
|
+
userId: request.user.userId,
|
|
155
|
+
email: request.user.email,
|
|
156
|
+
groups: request.user.groups,
|
|
157
|
+
toolName,
|
|
158
|
+
reason: permissionCheck.reason,
|
|
159
|
+
}, `Permission denied for user ${request.user.userId} to access tool ${toolName}`);
|
|
160
|
+
reply.code(403).send({
|
|
161
|
+
error: 'Forbidden',
|
|
162
|
+
message: permissionCheck.reason || 'Insufficient permissions',
|
|
163
|
+
});
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
logger_1.logger.debug({
|
|
167
|
+
type: 'auth',
|
|
168
|
+
operation: 'permission_check',
|
|
169
|
+
userId: request.user.userId,
|
|
170
|
+
toolName
|
|
171
|
+
}, `Permission granted for user ${request.user.userId} to access tool ${toolName}`);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
logger_1.logger.error({
|
|
175
|
+
type: 'auth',
|
|
176
|
+
operation: 'permission_check',
|
|
177
|
+
toolName,
|
|
178
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
179
|
+
}, 'Permission check error');
|
|
180
|
+
reply.code(500).send({
|
|
181
|
+
error: 'Internal Server Error',
|
|
182
|
+
message: 'Permission check failed',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Permission Check for Tool Call
|
|
189
|
+
* Checks permission when tools/call is invoked
|
|
190
|
+
*/
|
|
191
|
+
function checkToolCallPermission(toolName, user) {
|
|
192
|
+
return (0, permissions_1.checkPermission)(toolName, user.groups);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAkBH,kDAqEC;AAMD,kEAkEC;AAMD,8CAgEC;AAMD,0DAKC;AA7OD,uDAA8D;AAC9D,+CAAgD;AAChD,4CAAyC;AASzC;;;GAGG;AACI,KAAK,UAAU,mBAAmB,CACvC,OAA6B,EAC7B,KAAmB;IAEnB,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,eAAM,CAAC,IAAI,CACT;gBACE,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,YAAY;gBACvB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,EACD,yCAAyC,CAC1C,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,mEAAmE;aAC7E,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;QAEjE,gCAAgC;QAChC,MAAM,OAAO,GAAG,MAAM,IAAA,6BAAW,EAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,eAAM,CAAC,IAAI,CACT;gBACE,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,YAAY;gBACvB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,EACD,yBAAyB,CAC1B,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;QAEvB,eAAM,CAAC,KAAK,CACV;YACE,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,EACD,4CAA4C,OAAO,CAAC,MAAM,EAAE,CAC7D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,YAAY;YACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,EAAE,4BAA4B,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,2BAA2B,CAC/C,OAA6B,EAC7B,KAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,eAAM,CAAC,IAAI,CACT;gBACE,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,mBAAmB;gBAC9B,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,EACD,yCAAyC,CAC1C,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEtC,gCAAgC;QAChC,MAAM,OAAO,GAAG,MAAM,IAAA,6BAAW,EAAC,KAAK,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,4BAA4B;YAC5B,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;YACvB,eAAM,CAAC,KAAK,CACV;gBACE,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,mBAAmB;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,EACD,oCAAoC,OAAO,CAAC,MAAM,EAAE,CACrD,CAAC;YACF,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,eAAM,CAAC,KAAK,CACV;YACE,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,mBAAmB;YAC9B,EAAE,EAAE,OAAO,CAAC,EAAE;SACf,EACD,uDAAuD,CACxD,CAAC;QAEF,oFAAoF;QACpF,uDAAuD;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,mBAAmB;YAC9B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,EAAE,4BAA4B,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,OAAO,KAAK,EAAE,OAA6B,EAAE,KAAmB,EAAiB,EAAE;QACjF,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,eAAM,CAAC,KAAK,CACV;oBACE,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,kBAAkB;oBAC7B,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB,EACD,gDAAgD,CACjD,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,cAAc;oBACrB,OAAO,EAAE,yBAAyB;iBACnC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,mBAAmB;YACnB,MAAM,eAAe,GAAG,IAAA,6BAAe,EAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEvE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC7B,eAAM,CAAC,IAAI,CACT;oBACE,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,kBAAkB;oBAC7B,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;oBAC3B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;oBACzB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;oBAC3B,QAAQ;oBACR,MAAM,EAAE,eAAe,CAAC,MAAM;iBAC/B,EACD,8BAA8B,OAAO,CAAC,IAAI,CAAC,MAAM,mBAAmB,QAAQ,EAAE,CAC/E,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,eAAe,CAAC,MAAM,IAAI,0BAA0B;iBAC9D,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,eAAM,CAAC,KAAK,CACV;gBACE,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,kBAAkB;gBAC7B,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;gBAC3B,QAAQ;aACT,EACD,+BAA+B,OAAO,CAAC,IAAI,CAAC,MAAM,mBAAmB,QAAQ,EAAE,CAChF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,kBAAkB;gBAC7B,QAAQ;gBACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,EAAE,wBAAwB,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,QAAgB,EAChB,IAAkB;IAElB,OAAO,IAAA,6BAAe,EAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
|