@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,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Control System
|
|
3
|
+
* Group-based access control for MCP tools
|
|
4
|
+
* Groups are obtained from CSP API /user/permissions (e.g., "zNet", "Client-Public")
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Known groups from CSP
|
|
8
|
+
* Users may belong to one or more groups
|
|
9
|
+
*/
|
|
10
|
+
export declare const KnownGroups: {
|
|
11
|
+
readonly ZNET: "zNet";
|
|
12
|
+
readonly CLIENT_PUBLIC: "Client-Public";
|
|
13
|
+
readonly ADMIN: "admin";
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Permission level for operations
|
|
17
|
+
*/
|
|
18
|
+
export declare enum PermissionLevel {
|
|
19
|
+
READ = "read",
|
|
20
|
+
WRITE = "write",
|
|
21
|
+
ADMIN = "admin"
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Tool permission configuration
|
|
25
|
+
*/
|
|
26
|
+
export interface ToolPermission {
|
|
27
|
+
tool: string;
|
|
28
|
+
allowedGroups: string[];
|
|
29
|
+
requiredPermission: PermissionLevel;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Initialize permission system
|
|
33
|
+
*/
|
|
34
|
+
export declare function initializePermissions(customRules?: ToolPermission[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Check if a user has permission to access a tool
|
|
37
|
+
* @param toolName - The name of the tool to check
|
|
38
|
+
* @param userGroups - The groups the user belongs to (from CSP API)
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkPermission(toolName: string, userGroups: string[]): {
|
|
41
|
+
allowed: boolean;
|
|
42
|
+
reason?: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Get permission info for a tool
|
|
46
|
+
*/
|
|
47
|
+
export declare function getToolPermission(toolName: string): ToolPermission | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Get all permission rules
|
|
50
|
+
*/
|
|
51
|
+
export declare function getAllPermissions(): ToolPermission[];
|
|
52
|
+
/**
|
|
53
|
+
* Update permission rule for a tool
|
|
54
|
+
*/
|
|
55
|
+
export declare function updatePermission(permission: ToolPermission): void;
|
|
56
|
+
/**
|
|
57
|
+
* Remove permission rule for a tool
|
|
58
|
+
*/
|
|
59
|
+
export declare function removePermission(toolName: string): void;
|
|
60
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX;;GAEG;AACH,oBAAY,eAAe;IACzB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,EAAE,eAAe,CAAC;CACrC;AA4CD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAqB1E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,GACnB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAwKvC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,EAAE,CAEpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAMjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGvD"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Permission Control System
|
|
4
|
+
* Group-based access control for MCP tools
|
|
5
|
+
* Groups are obtained from CSP API /user/permissions (e.g., "zNet", "Client-Public")
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PermissionLevel = exports.KnownGroups = void 0;
|
|
9
|
+
exports.initializePermissions = initializePermissions;
|
|
10
|
+
exports.checkPermission = checkPermission;
|
|
11
|
+
exports.getToolPermission = getToolPermission;
|
|
12
|
+
exports.getAllPermissions = getAllPermissions;
|
|
13
|
+
exports.updatePermission = updatePermission;
|
|
14
|
+
exports.removePermission = removePermission;
|
|
15
|
+
const logger_1 = require("../utils/logger");
|
|
16
|
+
/**
|
|
17
|
+
* Known groups from CSP
|
|
18
|
+
* Users may belong to one or more groups
|
|
19
|
+
*/
|
|
20
|
+
exports.KnownGroups = {
|
|
21
|
+
ZNET: 'zNet', // zNet team - full access
|
|
22
|
+
CLIENT_PUBLIC: 'Client-Public', // Client-Public team - standard access
|
|
23
|
+
ADMIN: 'admin', // Admin group - full access (if exists)
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Permission level for operations
|
|
27
|
+
*/
|
|
28
|
+
var PermissionLevel;
|
|
29
|
+
(function (PermissionLevel) {
|
|
30
|
+
PermissionLevel["READ"] = "read";
|
|
31
|
+
PermissionLevel["WRITE"] = "write";
|
|
32
|
+
PermissionLevel["ADMIN"] = "admin";
|
|
33
|
+
})(PermissionLevel || (exports.PermissionLevel = PermissionLevel = {}));
|
|
34
|
+
/**
|
|
35
|
+
* Default permission rules for each tool
|
|
36
|
+
* All authenticated users (with valid groups) can use these tools
|
|
37
|
+
*/
|
|
38
|
+
const defaultPermissions = [
|
|
39
|
+
// sync_resources - available to all authenticated users
|
|
40
|
+
{
|
|
41
|
+
tool: 'sync_resources',
|
|
42
|
+
allowedGroups: ['*'], // * means all authenticated users
|
|
43
|
+
requiredPermission: PermissionLevel.WRITE,
|
|
44
|
+
},
|
|
45
|
+
// manage_subscription - available to all authenticated users
|
|
46
|
+
{
|
|
47
|
+
tool: 'manage_subscription',
|
|
48
|
+
allowedGroups: ['*'],
|
|
49
|
+
requiredPermission: PermissionLevel.WRITE,
|
|
50
|
+
},
|
|
51
|
+
// search_resources - read-only, all authenticated users
|
|
52
|
+
{
|
|
53
|
+
tool: 'search_resources',
|
|
54
|
+
allowedGroups: ['*'],
|
|
55
|
+
requiredPermission: PermissionLevel.READ,
|
|
56
|
+
},
|
|
57
|
+
// upload_resource - requires write permission
|
|
58
|
+
{
|
|
59
|
+
tool: 'upload_resource',
|
|
60
|
+
allowedGroups: ['*'],
|
|
61
|
+
requiredPermission: PermissionLevel.WRITE,
|
|
62
|
+
},
|
|
63
|
+
// uninstall_resource - requires write permission
|
|
64
|
+
{
|
|
65
|
+
tool: 'uninstall_resource',
|
|
66
|
+
allowedGroups: ['*'],
|
|
67
|
+
requiredPermission: PermissionLevel.WRITE,
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
/**
|
|
71
|
+
* Custom permission rules (can be overridden via config)
|
|
72
|
+
*/
|
|
73
|
+
let permissionRules = new Map();
|
|
74
|
+
/**
|
|
75
|
+
* Initialize permission system
|
|
76
|
+
*/
|
|
77
|
+
function initializePermissions(customRules) {
|
|
78
|
+
// Load default permissions
|
|
79
|
+
for (const perm of defaultPermissions) {
|
|
80
|
+
permissionRules.set(perm.tool, perm);
|
|
81
|
+
}
|
|
82
|
+
// Override with custom rules if provided
|
|
83
|
+
if (customRules && customRules.length > 0) {
|
|
84
|
+
logger_1.logger.info({ count: customRules.length }, 'Loading custom permission rules');
|
|
85
|
+
for (const perm of customRules) {
|
|
86
|
+
permissionRules.set(perm.tool, perm);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
logger_1.logger.info({ toolCount: permissionRules.size }, 'Permission system initialized');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if a user has permission to access a tool
|
|
93
|
+
* @param toolName - The name of the tool to check
|
|
94
|
+
* @param userGroups - The groups the user belongs to (from CSP API)
|
|
95
|
+
*/
|
|
96
|
+
function checkPermission(toolName, userGroups) {
|
|
97
|
+
const checkStartTime = Date.now();
|
|
98
|
+
logger_1.logger.debug({
|
|
99
|
+
type: 'permission_check',
|
|
100
|
+
toolName,
|
|
101
|
+
userGroups,
|
|
102
|
+
timestamp: new Date().toISOString()
|
|
103
|
+
}, `Checking permission for tool: ${toolName}`);
|
|
104
|
+
// Check if tool has permission rules
|
|
105
|
+
const permission = permissionRules.get(toolName);
|
|
106
|
+
if (!permission) {
|
|
107
|
+
// If no permission rule defined, deny by default
|
|
108
|
+
logger_1.logger.warn({
|
|
109
|
+
type: 'permission_check',
|
|
110
|
+
toolName,
|
|
111
|
+
userGroups,
|
|
112
|
+
result: 'denied',
|
|
113
|
+
reason: 'no_rule',
|
|
114
|
+
timestamp: new Date().toISOString()
|
|
115
|
+
}, 'No permission rule found for tool, denying access');
|
|
116
|
+
(0, logger_1.logAuthAttempt)('permission_check', false, {
|
|
117
|
+
toolName,
|
|
118
|
+
userGroups,
|
|
119
|
+
reason: 'no_rule',
|
|
120
|
+
duration: Date.now() - checkStartTime
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
allowed: false,
|
|
124
|
+
reason: `Tool '${toolName}' has no permission rule defined`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// If no groups provided, deny access
|
|
128
|
+
if (!userGroups || userGroups.length === 0) {
|
|
129
|
+
logger_1.logger.warn({
|
|
130
|
+
type: 'permission_check',
|
|
131
|
+
toolName,
|
|
132
|
+
result: 'denied',
|
|
133
|
+
reason: 'no_groups',
|
|
134
|
+
timestamp: new Date().toISOString()
|
|
135
|
+
}, 'Permission denied: user has no groups');
|
|
136
|
+
(0, logger_1.logAuthAttempt)('permission_check', false, {
|
|
137
|
+
toolName,
|
|
138
|
+
reason: 'no_groups',
|
|
139
|
+
duration: Date.now() - checkStartTime
|
|
140
|
+
});
|
|
141
|
+
return {
|
|
142
|
+
allowed: false,
|
|
143
|
+
reason: `User must belong to at least one group to access tools`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Admin group bypasses all checks
|
|
147
|
+
if (userGroups.includes(exports.KnownGroups.ADMIN) || userGroups.includes('admin')) {
|
|
148
|
+
logger_1.logger.info({
|
|
149
|
+
type: 'permission_check',
|
|
150
|
+
toolName,
|
|
151
|
+
userGroups,
|
|
152
|
+
result: 'granted',
|
|
153
|
+
reason: 'admin_bypass',
|
|
154
|
+
duration: Date.now() - checkStartTime,
|
|
155
|
+
timestamp: new Date().toISOString()
|
|
156
|
+
}, 'Admin group access granted');
|
|
157
|
+
(0, logger_1.logAuthAttempt)('permission_check', true, {
|
|
158
|
+
toolName,
|
|
159
|
+
userGroups,
|
|
160
|
+
reason: 'admin',
|
|
161
|
+
duration: Date.now() - checkStartTime
|
|
162
|
+
});
|
|
163
|
+
return { allowed: true };
|
|
164
|
+
}
|
|
165
|
+
// Check if tool allows all authenticated users
|
|
166
|
+
if (permission.allowedGroups.includes('*')) {
|
|
167
|
+
logger_1.logger.info({
|
|
168
|
+
type: 'permission_check',
|
|
169
|
+
toolName,
|
|
170
|
+
userGroups,
|
|
171
|
+
allowedGroups: permission.allowedGroups,
|
|
172
|
+
result: 'granted',
|
|
173
|
+
reason: 'wildcard',
|
|
174
|
+
duration: Date.now() - checkStartTime,
|
|
175
|
+
timestamp: new Date().toISOString()
|
|
176
|
+
}, 'Permission granted (tool allows all authenticated users)');
|
|
177
|
+
(0, logger_1.logAuthAttempt)('permission_check', true, {
|
|
178
|
+
toolName,
|
|
179
|
+
userGroups,
|
|
180
|
+
reason: 'wildcard',
|
|
181
|
+
duration: Date.now() - checkStartTime
|
|
182
|
+
});
|
|
183
|
+
return { allowed: true };
|
|
184
|
+
}
|
|
185
|
+
// Check if user belongs to any of the allowed groups
|
|
186
|
+
const hasAllowedGroup = userGroups.some((group) => permission.allowedGroups.includes(group));
|
|
187
|
+
if (!hasAllowedGroup) {
|
|
188
|
+
logger_1.logger.warn({
|
|
189
|
+
type: 'permission_check',
|
|
190
|
+
toolName,
|
|
191
|
+
userGroups,
|
|
192
|
+
allowedGroups: permission.allowedGroups,
|
|
193
|
+
result: 'denied',
|
|
194
|
+
reason: 'group_mismatch',
|
|
195
|
+
duration: Date.now() - checkStartTime,
|
|
196
|
+
timestamp: new Date().toISOString()
|
|
197
|
+
}, 'Permission denied: user not in allowed groups');
|
|
198
|
+
(0, logger_1.logAuthAttempt)('permission_check', false, {
|
|
199
|
+
toolName,
|
|
200
|
+
userGroups,
|
|
201
|
+
allowedGroups: permission.allowedGroups,
|
|
202
|
+
reason: 'group_mismatch',
|
|
203
|
+
duration: Date.now() - checkStartTime
|
|
204
|
+
});
|
|
205
|
+
return {
|
|
206
|
+
allowed: false,
|
|
207
|
+
reason: `Tool '${toolName}' requires membership in one of: ${permission.allowedGroups.join(', ')}`,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
logger_1.logger.info({
|
|
211
|
+
type: 'permission_check',
|
|
212
|
+
toolName,
|
|
213
|
+
userGroups,
|
|
214
|
+
allowedGroups: permission.allowedGroups,
|
|
215
|
+
result: 'granted',
|
|
216
|
+
reason: 'group_match',
|
|
217
|
+
duration: Date.now() - checkStartTime,
|
|
218
|
+
timestamp: new Date().toISOString()
|
|
219
|
+
}, 'Permission granted (user in allowed groups)');
|
|
220
|
+
(0, logger_1.logAuthAttempt)('permission_check', true, {
|
|
221
|
+
toolName,
|
|
222
|
+
userGroups,
|
|
223
|
+
matchedGroups: userGroups.filter(g => permission.allowedGroups.includes(g)),
|
|
224
|
+
duration: Date.now() - checkStartTime
|
|
225
|
+
});
|
|
226
|
+
return { allowed: true };
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get permission info for a tool
|
|
230
|
+
*/
|
|
231
|
+
function getToolPermission(toolName) {
|
|
232
|
+
return permissionRules.get(toolName);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get all permission rules
|
|
236
|
+
*/
|
|
237
|
+
function getAllPermissions() {
|
|
238
|
+
return Array.from(permissionRules.values());
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Update permission rule for a tool
|
|
242
|
+
*/
|
|
243
|
+
function updatePermission(permission) {
|
|
244
|
+
permissionRules.set(permission.tool, permission);
|
|
245
|
+
logger_1.logger.info({ tool: permission.tool, permission }, 'Permission rule updated');
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Remove permission rule for a tool
|
|
249
|
+
*/
|
|
250
|
+
function removePermission(toolName) {
|
|
251
|
+
permissionRules.delete(toolName);
|
|
252
|
+
logger_1.logger.info({ toolName }, 'Permission rule removed');
|
|
253
|
+
}
|
|
254
|
+
// Initialize with default permissions
|
|
255
|
+
initializePermissions();
|
|
256
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Validation via CSP API
|
|
3
|
+
* Validates tokens by calling CSP /user/permissions endpoint
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Token validation payload structure
|
|
7
|
+
*/
|
|
8
|
+
export interface TokenPayload {
|
|
9
|
+
userId: string;
|
|
10
|
+
email: string;
|
|
11
|
+
groups: string[];
|
|
12
|
+
roles?: string[];
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Start cache cleanup interval
|
|
17
|
+
*/
|
|
18
|
+
export declare function startCacheCleanup(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Stop cache cleanup interval
|
|
21
|
+
*/
|
|
22
|
+
export declare function stopCacheCleanup(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Verify token by calling CSP API /user/permissions
|
|
25
|
+
* @param token - The JWT token to verify
|
|
26
|
+
* @returns Token payload if valid, null otherwise
|
|
27
|
+
*/
|
|
28
|
+
export declare function verifyTokenViaAPI(token: string): Promise<TokenPayload | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Verify token with caching
|
|
31
|
+
* Uses cached result if available to reduce API calls
|
|
32
|
+
* @param token - The token to verify
|
|
33
|
+
* @returns Token payload if valid, null otherwise
|
|
34
|
+
*/
|
|
35
|
+
export declare function verifyToken(token: string): Promise<TokenPayload | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Clear token from cache (e.g., after logout)
|
|
38
|
+
* @param token - The token to invalidate
|
|
39
|
+
*/
|
|
40
|
+
export declare function invalidateToken(token: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Clear all cached tokens
|
|
43
|
+
*/
|
|
44
|
+
export declare function clearTokenCache(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get cache statistics
|
|
47
|
+
*/
|
|
48
|
+
export declare function getTokenCacheStats(): {
|
|
49
|
+
size: number;
|
|
50
|
+
tokens: string[];
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=token-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-validator.d.ts","sourceRoot":"","sources":["../../src/auth/token-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA+CD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CASxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC;AAKD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAoGnF;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAqD7E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMnD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB;;;EAMjC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Token Validation via CSP API
|
|
4
|
+
* Validates tokens by calling CSP /user/permissions endpoint
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.startCacheCleanup = startCacheCleanup;
|
|
8
|
+
exports.stopCacheCleanup = stopCacheCleanup;
|
|
9
|
+
exports.verifyTokenViaAPI = verifyTokenViaAPI;
|
|
10
|
+
exports.verifyToken = verifyToken;
|
|
11
|
+
exports.invalidateToken = invalidateToken;
|
|
12
|
+
exports.clearTokenCache = clearTokenCache;
|
|
13
|
+
exports.getTokenCacheStats = getTokenCacheStats;
|
|
14
|
+
const client_1 = require("../api/client");
|
|
15
|
+
const logger_1 = require("../utils/logger");
|
|
16
|
+
/**
|
|
17
|
+
* Token validation cache (in-memory, 5 minute TTL)
|
|
18
|
+
*/
|
|
19
|
+
const tokenCache = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* Cache cleanup interval reference (for cleanup on shutdown)
|
|
22
|
+
*/
|
|
23
|
+
let cacheCleanupInterval = null;
|
|
24
|
+
/**
|
|
25
|
+
* Clean expired cache entries
|
|
26
|
+
*/
|
|
27
|
+
function cleanExpiredCache() {
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
let cleaned = 0;
|
|
30
|
+
for (const [token, entry] of tokenCache.entries()) {
|
|
31
|
+
if (entry.expireAt < now) {
|
|
32
|
+
tokenCache.delete(token);
|
|
33
|
+
cleaned++;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (cleaned > 0) {
|
|
37
|
+
logger_1.logger.debug({ type: 'cache_cleanup', cleaned, remaining: tokenCache.size }, `Cleaned ${cleaned} expired token(s) from cache`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Start cache cleanup interval
|
|
42
|
+
*/
|
|
43
|
+
function startCacheCleanup() {
|
|
44
|
+
if (cacheCleanupInterval) {
|
|
45
|
+
logger_1.logger.warn('Cache cleanup interval already running');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Clean cache every minute
|
|
49
|
+
cacheCleanupInterval = setInterval(cleanExpiredCache, 60000);
|
|
50
|
+
logger_1.logger.info('Token cache cleanup interval started (60s)');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Stop cache cleanup interval
|
|
54
|
+
*/
|
|
55
|
+
function stopCacheCleanup() {
|
|
56
|
+
if (cacheCleanupInterval) {
|
|
57
|
+
clearInterval(cacheCleanupInterval);
|
|
58
|
+
cacheCleanupInterval = null;
|
|
59
|
+
logger_1.logger.info('Token cache cleanup interval stopped');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Start cleanup on module load
|
|
63
|
+
startCacheCleanup();
|
|
64
|
+
/**
|
|
65
|
+
* Verify token by calling CSP API /user/permissions
|
|
66
|
+
* @param token - The JWT token to verify
|
|
67
|
+
* @returns Token payload if valid, null otherwise
|
|
68
|
+
*/
|
|
69
|
+
async function verifyTokenViaAPI(token) {
|
|
70
|
+
const tokenPreview = token.substring(0, 10) + '...' + token.substring(token.length - 10);
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
try {
|
|
73
|
+
logger_1.logger.debug({
|
|
74
|
+
type: 'auth',
|
|
75
|
+
operation: 'verify_token_api',
|
|
76
|
+
tokenPreview,
|
|
77
|
+
timestamp: new Date().toISOString()
|
|
78
|
+
}, 'Calling CSP API /user/permissions to validate token');
|
|
79
|
+
// Call CSP API to validate token and get permissions
|
|
80
|
+
// Note: apiClient already adds Authorization header with CSP_API_TOKEN
|
|
81
|
+
// But for SSE connection, we might use a different token from the client
|
|
82
|
+
const response = await client_1.apiClient.get('/csp/api/user/permissions', {
|
|
83
|
+
headers: {
|
|
84
|
+
'Authorization': `Bearer ${token}`,
|
|
85
|
+
},
|
|
86
|
+
timeout: 5000, // 5 second timeout for auth check
|
|
87
|
+
});
|
|
88
|
+
const duration = Date.now() - startTime;
|
|
89
|
+
// Check response code (2000 means success)
|
|
90
|
+
if (response.code === 2000 && response.data) {
|
|
91
|
+
const payload = {
|
|
92
|
+
userId: response.data.user_id,
|
|
93
|
+
email: response.data.email,
|
|
94
|
+
groups: response.data.groups || [],
|
|
95
|
+
roles: response.data.groups || [], // Alias for backward compatibility
|
|
96
|
+
};
|
|
97
|
+
logger_1.logger.info({
|
|
98
|
+
type: 'auth',
|
|
99
|
+
operation: 'verify_token_api',
|
|
100
|
+
userId: payload.userId,
|
|
101
|
+
email: payload.email,
|
|
102
|
+
groups: payload.groups,
|
|
103
|
+
duration,
|
|
104
|
+
timestamp: new Date().toISOString()
|
|
105
|
+
}, `Token validated successfully for user ${payload.userId}`);
|
|
106
|
+
(0, logger_1.logAuthAttempt)('token_validation', true, {
|
|
107
|
+
userId: payload.userId,
|
|
108
|
+
email: payload.email,
|
|
109
|
+
groups: payload.groups,
|
|
110
|
+
duration
|
|
111
|
+
});
|
|
112
|
+
return payload;
|
|
113
|
+
}
|
|
114
|
+
logger_1.logger.warn({
|
|
115
|
+
type: 'auth',
|
|
116
|
+
operation: 'verify_token_api',
|
|
117
|
+
code: response.code,
|
|
118
|
+
message: response.message,
|
|
119
|
+
tokenPreview,
|
|
120
|
+
duration,
|
|
121
|
+
timestamp: new Date().toISOString()
|
|
122
|
+
}, 'Token validation failed - invalid or expired token');
|
|
123
|
+
(0, logger_1.logAuthAttempt)('token_validation', false, {
|
|
124
|
+
code: response.code,
|
|
125
|
+
message: response.message,
|
|
126
|
+
duration
|
|
127
|
+
});
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const duration = Date.now() - startTime;
|
|
132
|
+
(0, logger_1.logError)(error, {
|
|
133
|
+
type: 'auth',
|
|
134
|
+
operation: 'verify_token_api',
|
|
135
|
+
tokenPreview,
|
|
136
|
+
duration,
|
|
137
|
+
timestamp: new Date().toISOString()
|
|
138
|
+
});
|
|
139
|
+
(0, logger_1.logAuthAttempt)('token_validation', false, {
|
|
140
|
+
error: error instanceof Error ? error.message : String(error),
|
|
141
|
+
duration
|
|
142
|
+
});
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Verify token with caching
|
|
148
|
+
* Uses cached result if available to reduce API calls
|
|
149
|
+
* @param token - The token to verify
|
|
150
|
+
* @returns Token payload if valid, null otherwise
|
|
151
|
+
*/
|
|
152
|
+
async function verifyToken(token) {
|
|
153
|
+
const tokenPreview = token.substring(0, 10) + '...' + token.substring(token.length - 10);
|
|
154
|
+
// Check cache first
|
|
155
|
+
const cached = tokenCache.get(token);
|
|
156
|
+
if (cached && cached.expireAt > Date.now()) {
|
|
157
|
+
logger_1.logger.debug({
|
|
158
|
+
type: 'auth',
|
|
159
|
+
operation: 'verify_token',
|
|
160
|
+
userId: cached.payload.userId,
|
|
161
|
+
email: cached.payload.email,
|
|
162
|
+
cacheHit: true,
|
|
163
|
+
tokenPreview,
|
|
164
|
+
timestamp: new Date().toISOString()
|
|
165
|
+
}, 'Token validation cache hit');
|
|
166
|
+
return cached.payload;
|
|
167
|
+
}
|
|
168
|
+
logger_1.logger.debug({
|
|
169
|
+
type: 'auth',
|
|
170
|
+
operation: 'verify_token',
|
|
171
|
+
cacheHit: false,
|
|
172
|
+
tokenPreview,
|
|
173
|
+
timestamp: new Date().toISOString()
|
|
174
|
+
}, 'Token validation cache miss, calling API');
|
|
175
|
+
// Validate via API
|
|
176
|
+
const payload = await verifyTokenViaAPI(token);
|
|
177
|
+
// Cache the result if valid (5 minute TTL)
|
|
178
|
+
if (payload) {
|
|
179
|
+
const expireAt = Date.now() + 5 * 60 * 1000; // 5 minutes
|
|
180
|
+
tokenCache.set(token, { payload, expireAt });
|
|
181
|
+
logger_1.logger.debug({
|
|
182
|
+
type: 'auth',
|
|
183
|
+
operation: 'verify_token',
|
|
184
|
+
userId: payload.userId,
|
|
185
|
+
email: payload.email,
|
|
186
|
+
cacheTTL: '5min',
|
|
187
|
+
timestamp: new Date().toISOString()
|
|
188
|
+
}, 'Token validation result cached (5 min TTL)');
|
|
189
|
+
}
|
|
190
|
+
return payload;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Clear token from cache (e.g., after logout)
|
|
194
|
+
* @param token - The token to invalidate
|
|
195
|
+
*/
|
|
196
|
+
function invalidateToken(token) {
|
|
197
|
+
tokenCache.delete(token);
|
|
198
|
+
logger_1.logger.debug({ type: 'auth', operation: 'invalidate_token' }, 'Token removed from cache');
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Clear all cached tokens
|
|
202
|
+
*/
|
|
203
|
+
function clearTokenCache() {
|
|
204
|
+
tokenCache.clear();
|
|
205
|
+
logger_1.logger.info({ type: 'auth', operation: 'clear_cache' }, 'All cached tokens cleared');
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get cache statistics
|
|
209
|
+
*/
|
|
210
|
+
function getTokenCacheStats() {
|
|
211
|
+
cleanExpiredCache();
|
|
212
|
+
return {
|
|
213
|
+
size: tokenCache.size,
|
|
214
|
+
tokens: Array.from(tokenCache.keys()).map(t => t.substring(0, 10) + '...'),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=token-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-validator.js","sourceRoot":"","sources":["../../src/auth/token-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Layer Cache Manager
|
|
3
|
+
* L1: In-memory LRU cache
|
|
4
|
+
* L2: Redis persistent cache
|
|
5
|
+
*/
|
|
6
|
+
export interface CacheStats {
|
|
7
|
+
l1Hits: number;
|
|
8
|
+
l2Hits: number;
|
|
9
|
+
misses: number;
|
|
10
|
+
hitRate: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class CacheManager {
|
|
13
|
+
private static instance;
|
|
14
|
+
private readonly l1;
|
|
15
|
+
private readonly l2;
|
|
16
|
+
private readonly defaultTtlSeconds;
|
|
17
|
+
private readonly defaultNamespace;
|
|
18
|
+
private l1Hits;
|
|
19
|
+
private l2Hits;
|
|
20
|
+
private misses;
|
|
21
|
+
private constructor();
|
|
22
|
+
static getInstance(options?: {
|
|
23
|
+
namespace?: string;
|
|
24
|
+
}): CacheManager;
|
|
25
|
+
static resetInstance(): Promise<void>;
|
|
26
|
+
private buildKey;
|
|
27
|
+
private getRedisPattern;
|
|
28
|
+
connect(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Get value from cache. Checks L1 first, then L2.
|
|
31
|
+
* On L2 hit, promotes value to L1.
|
|
32
|
+
*/
|
|
33
|
+
get(key: string, namespace?: string): Promise<unknown | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Set value in both L1 and L2 caches.
|
|
36
|
+
*/
|
|
37
|
+
set(key: string, value: unknown, ttl?: number, namespace?: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Delete key from both caches.
|
|
40
|
+
*/
|
|
41
|
+
del(key: string, namespace?: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Clear all cache layers. If namespace provided, clear only that namespace.
|
|
44
|
+
*/
|
|
45
|
+
clear(namespace?: string): Promise<void>;
|
|
46
|
+
getStats(): CacheStats;
|
|
47
|
+
resetStats(): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=cache-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO;IAyBP,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY;WAOrD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3C,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,eAAe;IAKjB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiDnE;;OAEG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyBhB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczD;;OAEG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC9C,QAAQ,IAAI,UAAU;IAWtB,UAAU,IAAI,IAAI;CAKnB"}
|