@elliotding/ai-agent-mcp 0.1.26 → 0.1.27
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 +281 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +371 -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 +262 -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 +215 -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 +71 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +190 -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 +78 -0
- package/dist/git/multi-source-manager.d.ts.map +1 -0
- package/dist/git/multi-source-manager.js +577 -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 +122 -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/prompts/cache.d.ts +69 -0
- package/dist/prompts/cache.d.ts.map +1 -0
- package/dist/prompts/cache.js +163 -0
- package/dist/prompts/cache.js.map +1 -0
- package/dist/prompts/generator.d.ts +49 -0
- package/dist/prompts/generator.d.ts.map +1 -0
- package/dist/prompts/generator.js +160 -0
- package/dist/prompts/generator.js.map +1 -0
- package/dist/prompts/index.d.ts +13 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +24 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/manager.d.ts +207 -0
- package/dist/prompts/manager.d.ts.map +1 -0
- package/dist/prompts/manager.js +566 -0
- package/dist/prompts/manager.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 +88 -0
- package/dist/resources/loader.d.ts.map +1 -0
- package/dist/resources/loader.js +492 -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 +435 -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 +201 -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/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +7 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/manager.d.ts +151 -0
- package/dist/telemetry/manager.d.ts.map +1 -0
- package/dist/telemetry/manager.js +367 -0
- package/dist/telemetry/manager.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +29 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/manage-subscription.d.ts +47 -0
- package/dist/tools/manage-subscription.d.ts.map +1 -0
- package/dist/tools/manage-subscription.js +317 -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/resolve-prompt-content.d.ts +35 -0
- package/dist/tools/resolve-prompt-content.d.ts.map +1 -0
- package/dist/tools/resolve-prompt-content.js +99 -0
- package/dist/tools/resolve-prompt-content.js.map +1 -0
- package/dist/tools/search-resources.d.ts +35 -0
- package/dist/tools/search-resources.d.ts.map +1 -0
- package/dist/tools/search-resources.js +159 -0
- package/dist/tools/search-resources.js.map +1 -0
- package/dist/tools/sync-resources.d.ts +54 -0
- package/dist/tools/sync-resources.d.ts.map +1 -0
- package/dist/tools/sync-resources.js +735 -0
- package/dist/tools/sync-resources.js.map +1 -0
- package/dist/tools/track-usage.d.ts +63 -0
- package/dist/tools/track-usage.d.ts.map +1 -0
- package/dist/tools/track-usage.js +90 -0
- package/dist/tools/track-usage.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 +174 -0
- package/dist/tools/uninstall-resource.js.map +1 -0
- package/dist/tools/upload-resource.d.ts +81 -0
- package/dist/tools/upload-resource.d.ts.map +1 -0
- package/dist/tools/upload-resource.js +393 -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 +253 -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 +84 -0
- package/dist/utils/cursor-paths.d.ts.map +1 -0
- package/dist/utils/cursor-paths.js +166 -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 +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Git Operations Module
|
|
4
|
+
* Per-repo git helpers used by upload_resource to target a specific source repo.
|
|
5
|
+
* All repo URLs and branches come from AI-Resources/ai-resources-config.json —
|
|
6
|
+
* not from environment variables.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.gitOperations = void 0;
|
|
13
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
|
14
|
+
const config_1 = require("../config");
|
|
15
|
+
const logger_1 = require("../utils/logger");
|
|
16
|
+
const errors_1 = require("../types/errors");
|
|
17
|
+
class GitOperations {
|
|
18
|
+
// ---- Per-repo helpers (used by upload_resource to target a specific source) ----
|
|
19
|
+
/**
|
|
20
|
+
* Check whether a git repository exists at an arbitrary local path
|
|
21
|
+
*/
|
|
22
|
+
async repositoryExistsAt(repoPath) {
|
|
23
|
+
try {
|
|
24
|
+
const git = (0, simple_git_1.default)({ baseDir: repoPath, binary: 'git', maxConcurrentProcesses: 6 });
|
|
25
|
+
await git.status();
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get current branch of an arbitrary local repo
|
|
34
|
+
*/
|
|
35
|
+
async getCurrentBranchAt(repoPath) {
|
|
36
|
+
try {
|
|
37
|
+
const git = (0, simple_git_1.default)({ baseDir: repoPath, binary: 'git', maxConcurrentProcesses: 6 });
|
|
38
|
+
const branchSummary = await git.branch();
|
|
39
|
+
return branchSummary.current;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw (0, errors_1.createGitError)('get-branch', error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Commit and push to a specific repo / remote url / branch.
|
|
47
|
+
* Creates a unique remote testing branch and returns a PR URL.
|
|
48
|
+
*/
|
|
49
|
+
async commitAndPushRepo(repoPath, remoteUrl, baseBranch, message, files) {
|
|
50
|
+
try {
|
|
51
|
+
const git = (0, simple_git_1.default)({ baseDir: repoPath, binary: 'git', maxConcurrentProcesses: 6 });
|
|
52
|
+
logger_1.logger.info({ repoPath, remoteUrl, message, fileCount: files?.length }, 'Committing and pushing to source repo...');
|
|
53
|
+
await git.addConfig('user.name', config_1.config.git.userName);
|
|
54
|
+
await git.addConfig('user.email', config_1.config.git.userEmail);
|
|
55
|
+
const branchSummary = await git.branch();
|
|
56
|
+
const currentBranch = branchSummary.current;
|
|
57
|
+
const timestamp = Date.now();
|
|
58
|
+
const randomSuffix = Math.random().toString(36).substring(2, 8);
|
|
59
|
+
const remoteBranchName = `dev-${currentBranch}-testing-${timestamp}-${randomSuffix}`;
|
|
60
|
+
logger_1.logger.info({ remoteBranchName }, 'Generated remote branch name for PR');
|
|
61
|
+
if (files && files.length > 0) {
|
|
62
|
+
await git.add(files);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
await git.add('.');
|
|
66
|
+
}
|
|
67
|
+
const commitResult = await git.commit(message);
|
|
68
|
+
const commitHash = commitResult.commit;
|
|
69
|
+
logger_1.logger.info({ commitHash }, 'Git commit created');
|
|
70
|
+
await git.push(remoteUrl, `${currentBranch}:${remoteBranchName}`);
|
|
71
|
+
logger_1.logger.info({ remoteBranchName }, 'Git push completed');
|
|
72
|
+
const repoBaseUrl = remoteUrl.replace(/\.git$/, '');
|
|
73
|
+
const prUrl = `${repoBaseUrl}/compare/${baseBranch}...${remoteBranchName}`;
|
|
74
|
+
logger_1.logger.info({ prUrl, commitHash }, 'PR URL generated');
|
|
75
|
+
return { commitHash, prUrl };
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw (0, errors_1.createGitError)('commit-push', error, remoteUrl);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.gitOperations = new GitOperations();
|
|
83
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/git/operations.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CSP AI Agent MCP Server - Main Entry Point
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const config_1 = require("./config");
|
|
8
|
+
const logger_1 = require("./utils/logger");
|
|
9
|
+
const log_cleaner_1 = require("./utils/log-cleaner");
|
|
10
|
+
const server_1 = require("./server");
|
|
11
|
+
const token_validator_1 = require("./auth/token-validator");
|
|
12
|
+
const manager_1 = require("./session/manager");
|
|
13
|
+
const index_js_1 = require("./telemetry/index.js");
|
|
14
|
+
const client_js_1 = require("./api/client.js");
|
|
15
|
+
// Global error handlers
|
|
16
|
+
process.on('uncaughtException', (error) => {
|
|
17
|
+
// Handle EPIPE and ECONNRESET gracefully (client disconnected)
|
|
18
|
+
if (error.message.includes('EPIPE') || error.message.includes('ECONNRESET')) {
|
|
19
|
+
logger_1.logger.debug({
|
|
20
|
+
error: error.message,
|
|
21
|
+
type: 'uncaught_exception_network'
|
|
22
|
+
}, 'Client disconnected (EPIPE/ECONNRESET)');
|
|
23
|
+
return; // Don't exit for network errors
|
|
24
|
+
}
|
|
25
|
+
// For other uncaught exceptions, log and exit
|
|
26
|
+
logger_1.logger.error({ error, type: 'uncaught_exception' }, `Uncaught Exception: ${error.message}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
});
|
|
29
|
+
process.on('unhandledRejection', (reason, _promise) => {
|
|
30
|
+
logger_1.logger.error({
|
|
31
|
+
type: 'unhandled_rejection',
|
|
32
|
+
reason: reason instanceof Error ? reason.message : String(reason),
|
|
33
|
+
stack: reason instanceof Error ? reason.stack : undefined,
|
|
34
|
+
}, 'Unhandled Promise Rejection');
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
|
37
|
+
async function main() {
|
|
38
|
+
logger_1.logger.info({
|
|
39
|
+
nodeEnv: config_1.config.nodeEnv,
|
|
40
|
+
port: config_1.config.port,
|
|
41
|
+
logLevel: config_1.config.logLevel,
|
|
42
|
+
}, 'Starting CSP AI Agent MCP Server...');
|
|
43
|
+
// Start log cleanup scheduler
|
|
44
|
+
const cleanupTimer = (0, log_cleaner_1.startLogCleanupSchedule)();
|
|
45
|
+
// Wire up telemetry reporting (inject API client to avoid circular import).
|
|
46
|
+
// Tokens are sourced exclusively from authenticated SSE connections via setUserToken().
|
|
47
|
+
index_js_1.telemetry.configure((payload, token) => client_js_1.apiClient.reportTelemetry(payload, token));
|
|
48
|
+
try {
|
|
49
|
+
// Start MCP Server
|
|
50
|
+
await (0, server_1.startServer)();
|
|
51
|
+
logger_1.logger.info({ port: config_1.config.port }, `✅ CSP AI Agent MCP Server started successfully`);
|
|
52
|
+
// Start periodic telemetry flush (every 10 seconds)
|
|
53
|
+
index_js_1.telemetry.startPeriodicFlush(10_000);
|
|
54
|
+
logger_1.logger.info('Telemetry flush scheduler started (interval: 10s)');
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logger_1.logger.error({ error }, 'Failed to start server');
|
|
58
|
+
(0, log_cleaner_1.stopLogCleanupSchedule)(cleanupTimer);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
// Graceful shutdown handlers
|
|
62
|
+
let isShuttingDown = false;
|
|
63
|
+
const SHUTDOWN_TIMEOUT = Number(process.env.SHUTDOWN_TIMEOUT) || 30000; // 30 seconds default
|
|
64
|
+
const shutdown = async (signal) => {
|
|
65
|
+
// Prevent multiple shutdown attempts
|
|
66
|
+
if (isShuttingDown) {
|
|
67
|
+
logger_1.logger.warn({ signal }, 'Shutdown already in progress, ignoring signal');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
isShuttingDown = true;
|
|
71
|
+
logger_1.logger.info({ signal, timeout: SHUTDOWN_TIMEOUT }, `Received ${signal}, starting graceful shutdown...`);
|
|
72
|
+
// Set timeout for forced shutdown
|
|
73
|
+
const shutdownTimer = setTimeout(() => {
|
|
74
|
+
logger_1.logger.error({ timeout: SHUTDOWN_TIMEOUT }, `Graceful shutdown timeout (${SHUTDOWN_TIMEOUT}ms), forcing exit`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}, SHUTDOWN_TIMEOUT);
|
|
77
|
+
try {
|
|
78
|
+
// Phase 1: Stop accepting new requests
|
|
79
|
+
logger_1.logger.info('Phase 1: Stopping new requests...');
|
|
80
|
+
// Phase 2: Wait for ongoing requests to complete
|
|
81
|
+
logger_1.logger.info('Phase 2: Waiting for ongoing requests to complete...');
|
|
82
|
+
// Stop MCP Server (this will close all active sessions and connections)
|
|
83
|
+
await (0, server_1.stopServer)();
|
|
84
|
+
// Phase 3: Stop background tasks
|
|
85
|
+
logger_1.logger.info('Phase 3: Stopping background tasks...');
|
|
86
|
+
// Stop log cleanup
|
|
87
|
+
(0, log_cleaner_1.stopLogCleanupSchedule)(cleanupTimer);
|
|
88
|
+
// Stop session cleanup
|
|
89
|
+
manager_1.sessionManager.stopCleanup();
|
|
90
|
+
logger_1.logger.info('Session cleanup stopped');
|
|
91
|
+
// Stop token cache cleanup
|
|
92
|
+
(0, token_validator_1.stopCacheCleanup)();
|
|
93
|
+
logger_1.logger.info('Token cache cleanup stopped');
|
|
94
|
+
// Stop telemetry scheduler and perform final flush
|
|
95
|
+
index_js_1.telemetry.stopPeriodicFlush();
|
|
96
|
+
logger_1.logger.info('Telemetry scheduler stopped, performing final flush...');
|
|
97
|
+
await index_js_1.telemetry.flush();
|
|
98
|
+
logger_1.logger.info('Final telemetry flush completed');
|
|
99
|
+
// Phase 4: Flush logs
|
|
100
|
+
logger_1.logger.info('Phase 4: Flushing logs...');
|
|
101
|
+
// Give logger time to flush
|
|
102
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
103
|
+
// Clear shutdown timeout
|
|
104
|
+
clearTimeout(shutdownTimer);
|
|
105
|
+
logger_1.logger.info('✅ Graceful shutdown completed successfully');
|
|
106
|
+
process.exit(0);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
logger_1.logger.error({ error }, 'Error during graceful shutdown');
|
|
110
|
+
clearTimeout(shutdownTimer);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
process.on('SIGINT', () => void shutdown('SIGINT'));
|
|
115
|
+
process.on('SIGTERM', () => void shutdown('SIGTERM'));
|
|
116
|
+
}
|
|
117
|
+
// Start the application
|
|
118
|
+
void main().catch((error) => {
|
|
119
|
+
logger_1.logger.error({ error }, 'Fatal error during startup');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CacheManager } from '../cache/cache-manager.js';
|
|
2
|
+
export interface HealthStatus {
|
|
3
|
+
status: 'healthy' | 'unhealthy';
|
|
4
|
+
timestamp: string;
|
|
5
|
+
services: {
|
|
6
|
+
http: 'up' | 'down';
|
|
7
|
+
redis: 'up' | 'down' | 'not_configured';
|
|
8
|
+
cache: 'healthy' | 'degraded' | 'down';
|
|
9
|
+
};
|
|
10
|
+
details?: {
|
|
11
|
+
redisError?: string;
|
|
12
|
+
cacheError?: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare class HealthChecker {
|
|
16
|
+
private cacheManager;
|
|
17
|
+
constructor(cacheManager?: CacheManager);
|
|
18
|
+
/**
|
|
19
|
+
* Check HTTP Server health
|
|
20
|
+
*/
|
|
21
|
+
private checkHttpServer;
|
|
22
|
+
/**
|
|
23
|
+
* Check Redis connection health
|
|
24
|
+
*/
|
|
25
|
+
private checkRedis;
|
|
26
|
+
/**
|
|
27
|
+
* Check Cache health
|
|
28
|
+
*/
|
|
29
|
+
private checkCache;
|
|
30
|
+
/**
|
|
31
|
+
* Perform comprehensive health check
|
|
32
|
+
*/
|
|
33
|
+
check(): Promise<HealthStatus>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/monitoring/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;QACpB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,gBAAgB,CAAC;QACxC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;KACxC,CAAC;IACF,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAA6B;gBAErC,YAAY,CAAC,EAAE,YAAY;IAIvC;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,UAAU;IA+BxB;;OAEG;IACH,OAAO,CAAC,UAAU;IA2BlB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;CAiCrC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HealthChecker = void 0;
|
|
4
|
+
class HealthChecker {
|
|
5
|
+
cacheManager = null;
|
|
6
|
+
constructor(cacheManager) {
|
|
7
|
+
this.cacheManager = cacheManager || null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Check HTTP Server health
|
|
11
|
+
*/
|
|
12
|
+
checkHttpServer() {
|
|
13
|
+
// HTTP server is up if this code is running
|
|
14
|
+
return 'up';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check Redis connection health
|
|
18
|
+
*/
|
|
19
|
+
async checkRedis() {
|
|
20
|
+
if (!this.cacheManager) {
|
|
21
|
+
return { status: 'not_configured' };
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
// Try to check Redis connection via cache manager
|
|
25
|
+
const redisCache = this.cacheManager.l2Cache;
|
|
26
|
+
if (!redisCache) {
|
|
27
|
+
return { status: 'not_configured' };
|
|
28
|
+
}
|
|
29
|
+
// Try a simple Redis operation (check client status)
|
|
30
|
+
const client = redisCache.client;
|
|
31
|
+
if (!client || !client.isReady) {
|
|
32
|
+
return { status: 'down', error: 'Redis client not ready' };
|
|
33
|
+
}
|
|
34
|
+
// Try a ping operation
|
|
35
|
+
await client.ping();
|
|
36
|
+
return { status: 'up' };
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return {
|
|
40
|
+
status: 'down',
|
|
41
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check Cache health
|
|
47
|
+
*/
|
|
48
|
+
checkCache() {
|
|
49
|
+
if (!this.cacheManager) {
|
|
50
|
+
return { status: 'down', error: 'Cache manager not initialized' };
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
// Check if cache manager is functional
|
|
54
|
+
const stats = this.cacheManager.getStats();
|
|
55
|
+
// Cache is healthy if stats are available
|
|
56
|
+
if (stats && typeof stats.hitRate === 'number') {
|
|
57
|
+
// Check if hit rate is reasonable (> 0 means cache is working)
|
|
58
|
+
if (stats.hitRate >= 0) {
|
|
59
|
+
return { status: 'healthy' };
|
|
60
|
+
}
|
|
61
|
+
return { status: 'degraded', error: 'Low cache hit rate' };
|
|
62
|
+
}
|
|
63
|
+
return { status: 'degraded', error: 'Cache stats unavailable' };
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return {
|
|
67
|
+
status: 'down',
|
|
68
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Perform comprehensive health check
|
|
74
|
+
*/
|
|
75
|
+
async check() {
|
|
76
|
+
const httpStatus = this.checkHttpServer();
|
|
77
|
+
const redisResult = await this.checkRedis();
|
|
78
|
+
const cacheResult = this.checkCache();
|
|
79
|
+
const allHealthy = httpStatus === 'up' &&
|
|
80
|
+
(redisResult.status === 'up' || redisResult.status === 'not_configured') &&
|
|
81
|
+
cacheResult.status === 'healthy';
|
|
82
|
+
const health = {
|
|
83
|
+
status: allHealthy ? 'healthy' : 'unhealthy',
|
|
84
|
+
timestamp: new Date().toISOString(),
|
|
85
|
+
services: {
|
|
86
|
+
http: httpStatus,
|
|
87
|
+
redis: redisResult.status,
|
|
88
|
+
cache: cacheResult.status
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
// Add error details if any
|
|
92
|
+
if (redisResult.error || cacheResult.error) {
|
|
93
|
+
health.details = {};
|
|
94
|
+
if (redisResult.error) {
|
|
95
|
+
health.details.redisError = redisResult.error;
|
|
96
|
+
}
|
|
97
|
+
if (cacheResult.error) {
|
|
98
|
+
health.details.cacheError = cacheResult.error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return health;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.HealthChecker = HealthChecker;
|
|
105
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/monitoring/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptCache: manages the .prompt-cache/ directory inside the MCP Server's
|
|
3
|
+
* runtime working directory.
|
|
4
|
+
*
|
|
5
|
+
* Cache files hold the fully-expanded Prompt content for each Command/Skill
|
|
6
|
+
* resource so that the MCP Prompt handler can serve them without re-generating
|
|
7
|
+
* on every invocation.
|
|
8
|
+
*
|
|
9
|
+
* The cache directory is intentionally NOT committed to Git — it is regenerated
|
|
10
|
+
* from the canonical source files after every git pull or resource upload.
|
|
11
|
+
*
|
|
12
|
+
* File naming: {type}-{resource_id}.md
|
|
13
|
+
* e.g. cmd-client-sdk-generate-testcase.md
|
|
14
|
+
* skill-client-sdk-analyze-sdk-log.md
|
|
15
|
+
*/
|
|
16
|
+
export declare class PromptCache {
|
|
17
|
+
private readonly cacheDir;
|
|
18
|
+
/**
|
|
19
|
+
* @param baseDir Absolute base directory (defaults to process.cwd()).
|
|
20
|
+
*/
|
|
21
|
+
constructor(baseDir?: string);
|
|
22
|
+
/** Absolute path to the cache directory. */
|
|
23
|
+
get directory(): string;
|
|
24
|
+
/** Ensure the cache directory exists (idempotent). */
|
|
25
|
+
ensureDir(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Derive the cache file name for a resource.
|
|
28
|
+
* @param resourceType 'command' | 'skill'
|
|
29
|
+
* @param resourceId Canonical resource ID
|
|
30
|
+
*/
|
|
31
|
+
private cacheFileName;
|
|
32
|
+
/** Absolute path to the cache file for a given resource. */
|
|
33
|
+
cachePath(resourceType: string, resourceId: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Write (or overwrite) a resource's Prompt content to the cache.
|
|
36
|
+
* Uses atomic write-then-rename to prevent partial reads.
|
|
37
|
+
*
|
|
38
|
+
* @param resourceType 'command' | 'skill'
|
|
39
|
+
* @param resourceId Canonical resource ID
|
|
40
|
+
* @param content Fully-expanded Prompt Markdown content
|
|
41
|
+
*/
|
|
42
|
+
write(resourceType: string, resourceId: string, content: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Read the cached Prompt content for a resource.
|
|
45
|
+
* Returns null if the cache file does not exist or cannot be read.
|
|
46
|
+
*
|
|
47
|
+
* @param resourceType 'command' | 'skill'
|
|
48
|
+
* @param resourceId Canonical resource ID
|
|
49
|
+
*/
|
|
50
|
+
read(resourceType: string, resourceId: string): string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Delete the cache file for a resource.
|
|
53
|
+
* Silently succeeds if the file does not exist.
|
|
54
|
+
*
|
|
55
|
+
* @param resourceType 'command' | 'skill'
|
|
56
|
+
* @param resourceId Canonical resource ID
|
|
57
|
+
*/
|
|
58
|
+
delete(resourceType: string, resourceId: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Check whether a valid cache entry exists for a resource.
|
|
61
|
+
*
|
|
62
|
+
* @param resourceType 'command' | 'skill'
|
|
63
|
+
* @param resourceId Canonical resource ID
|
|
64
|
+
*/
|
|
65
|
+
exists(resourceType: string, resourceId: string): boolean;
|
|
66
|
+
}
|
|
67
|
+
/** Singleton cache instance using the process CWD as the base directory. */
|
|
68
|
+
export declare const promptCache: PromptCache;
|
|
69
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/prompts/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;OAEG;gBACS,OAAO,GAAE,MAAsB;IAI3C,4CAA4C;IAC5C,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,sDAAsD;IACtD,SAAS,IAAI,IAAI;IAIjB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAQrB,4DAA4D;IAC5D,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAI3D;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAoBtE;;;;;;OAMG;IACH,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS7D;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAetD;;;;;OAKG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;CAG1D;AAED,4EAA4E;AAC5E,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PromptCache: manages the .prompt-cache/ directory inside the MCP Server's
|
|
4
|
+
* runtime working directory.
|
|
5
|
+
*
|
|
6
|
+
* Cache files hold the fully-expanded Prompt content for each Command/Skill
|
|
7
|
+
* resource so that the MCP Prompt handler can serve them without re-generating
|
|
8
|
+
* on every invocation.
|
|
9
|
+
*
|
|
10
|
+
* The cache directory is intentionally NOT committed to Git — it is regenerated
|
|
11
|
+
* from the canonical source files after every git pull or resource upload.
|
|
12
|
+
*
|
|
13
|
+
* File naming: {type}-{resource_id}.md
|
|
14
|
+
* e.g. cmd-client-sdk-generate-testcase.md
|
|
15
|
+
* skill-client-sdk-analyze-sdk-log.md
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.promptCache = exports.PromptCache = void 0;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
55
|
+
/** Relative directory name inside the MCP Server CWD for cached Prompt files. */
|
|
56
|
+
const CACHE_DIR_NAME = '.prompt-cache';
|
|
57
|
+
class PromptCache {
|
|
58
|
+
cacheDir;
|
|
59
|
+
/**
|
|
60
|
+
* @param baseDir Absolute base directory (defaults to process.cwd()).
|
|
61
|
+
*/
|
|
62
|
+
constructor(baseDir = process.cwd()) {
|
|
63
|
+
this.cacheDir = path.join(baseDir, CACHE_DIR_NAME);
|
|
64
|
+
}
|
|
65
|
+
/** Absolute path to the cache directory. */
|
|
66
|
+
get directory() {
|
|
67
|
+
return this.cacheDir;
|
|
68
|
+
}
|
|
69
|
+
/** Ensure the cache directory exists (idempotent). */
|
|
70
|
+
ensureDir() {
|
|
71
|
+
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Derive the cache file name for a resource.
|
|
75
|
+
* @param resourceType 'command' | 'skill'
|
|
76
|
+
* @param resourceId Canonical resource ID
|
|
77
|
+
*/
|
|
78
|
+
cacheFileName(resourceType, resourceId) {
|
|
79
|
+
// Normalise type prefix: 'command' → 'cmd', 'skill' → 'skill'
|
|
80
|
+
const prefix = resourceType === 'command' ? 'cmd' : resourceType;
|
|
81
|
+
// Sanitise resourceId — remove characters unsafe in filenames.
|
|
82
|
+
const safeId = resourceId.replace(/[/\\:*?"<>|]/g, '-');
|
|
83
|
+
return `${prefix}-${safeId}.md`;
|
|
84
|
+
}
|
|
85
|
+
/** Absolute path to the cache file for a given resource. */
|
|
86
|
+
cachePath(resourceType, resourceId) {
|
|
87
|
+
return path.join(this.cacheDir, this.cacheFileName(resourceType, resourceId));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Write (or overwrite) a resource's Prompt content to the cache.
|
|
91
|
+
* Uses atomic write-then-rename to prevent partial reads.
|
|
92
|
+
*
|
|
93
|
+
* @param resourceType 'command' | 'skill'
|
|
94
|
+
* @param resourceId Canonical resource ID
|
|
95
|
+
* @param content Fully-expanded Prompt Markdown content
|
|
96
|
+
*/
|
|
97
|
+
write(resourceType, resourceId, content) {
|
|
98
|
+
this.ensureDir();
|
|
99
|
+
const dest = this.cachePath(resourceType, resourceId);
|
|
100
|
+
const tmp = `${dest}.${process.pid}.tmp`;
|
|
101
|
+
try {
|
|
102
|
+
fs.writeFileSync(tmp, content, 'utf8');
|
|
103
|
+
fs.renameSync(tmp, dest);
|
|
104
|
+
logger_js_1.logger.debug({ resourceId, resourceType, path: dest }, 'Prompt cache written');
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
// Best-effort cleanup of temp file
|
|
108
|
+
try {
|
|
109
|
+
fs.unlinkSync(tmp);
|
|
110
|
+
}
|
|
111
|
+
catch { /* ignore */ }
|
|
112
|
+
throw new Error(`Failed to write prompt cache for ${resourceId}: ${err.message}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Read the cached Prompt content for a resource.
|
|
117
|
+
* Returns null if the cache file does not exist or cannot be read.
|
|
118
|
+
*
|
|
119
|
+
* @param resourceType 'command' | 'skill'
|
|
120
|
+
* @param resourceId Canonical resource ID
|
|
121
|
+
*/
|
|
122
|
+
read(resourceType, resourceId) {
|
|
123
|
+
const p = this.cachePath(resourceType, resourceId);
|
|
124
|
+
try {
|
|
125
|
+
return fs.readFileSync(p, 'utf8');
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Delete the cache file for a resource.
|
|
133
|
+
* Silently succeeds if the file does not exist.
|
|
134
|
+
*
|
|
135
|
+
* @param resourceType 'command' | 'skill'
|
|
136
|
+
* @param resourceId Canonical resource ID
|
|
137
|
+
*/
|
|
138
|
+
delete(resourceType, resourceId) {
|
|
139
|
+
const p = this.cachePath(resourceType, resourceId);
|
|
140
|
+
try {
|
|
141
|
+
fs.unlinkSync(p);
|
|
142
|
+
logger_js_1.logger.debug({ resourceId, resourceType }, 'Prompt cache deleted');
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
if (err.code !== 'ENOENT') {
|
|
146
|
+
logger_js_1.logger.warn({ resourceId, error: err.message }, 'Failed to delete prompt cache file');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check whether a valid cache entry exists for a resource.
|
|
152
|
+
*
|
|
153
|
+
* @param resourceType 'command' | 'skill'
|
|
154
|
+
* @param resourceId Canonical resource ID
|
|
155
|
+
*/
|
|
156
|
+
exists(resourceType, resourceId) {
|
|
157
|
+
return fs.existsSync(this.cachePath(resourceType, resourceId));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.PromptCache = PromptCache;
|
|
161
|
+
/** Singleton cache instance using the process CWD as the base directory. */
|
|
162
|
+
exports.promptCache = new PromptCache();
|
|
163
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/prompts/cache.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,kDAA4C;AAE5C,iFAAiF;AACjF,MAAM,cAAc,GAAG,eAAe,CAAC;AAEvC,MAAa,WAAW;IACL,QAAQ,CAAS;IAElC;;OAEG;IACH,YAAY,UAAkB,OAAO,CAAC,GAAG,EAAE;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACrD,CAAC;IAED,4CAA4C;IAC5C,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,sDAAsD;IACtD,SAAS;QACP,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,YAAoB,EAAE,UAAkB;QAC5D,8DAA8D;QAC9D,MAAM,MAAM,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;QACjE,+DAA+D;QAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,MAAM,IAAI,MAAM,KAAK,CAAC;IAClC,CAAC;IAED,4DAA4D;IAC5D,SAAS,CAAC,YAAoB,EAAE,UAAkB;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAChF,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAoB,EAAE,UAAkB,EAAE,OAAe;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QACzC,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACvC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACzB,kBAAM,CAAC,KAAK,CACV,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,EACxC,sBAAsB,CACvB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mCAAmC;YACnC,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,IAAI,KAAK,CACb,oCAAoC,UAAU,KAAM,GAAa,CAAC,OAAO,EAAE,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,YAAoB,EAAE,UAAkB;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,YAAoB,EAAE,UAAkB;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACjB,kBAAM,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,sBAAsB,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,kBAAM,CAAC,IAAI,CACT,EAAE,UAAU,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,EAC7C,oCAAoC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,YAAoB,EAAE,UAAkB;QAC7C,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;CACF;AAjHD,kCAiHC;AAED,4EAA4E;AAC/D,QAAA,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
|