@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.
Files changed (185) hide show
  1. package/dist/api/cached-client.d.ts +48 -0
  2. package/dist/api/cached-client.d.ts.map +1 -0
  3. package/dist/api/cached-client.js +126 -0
  4. package/dist/api/cached-client.js.map +1 -0
  5. package/dist/api/client.d.ts +281 -0
  6. package/dist/api/client.d.ts.map +1 -0
  7. package/dist/api/client.js +371 -0
  8. package/dist/api/client.js.map +1 -0
  9. package/dist/auth/index.d.ts +8 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +26 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/middleware.d.ts +36 -0
  14. package/dist/auth/middleware.d.ts.map +1 -0
  15. package/dist/auth/middleware.js +194 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/permissions.d.ts +60 -0
  18. package/dist/auth/permissions.d.ts.map +1 -0
  19. package/dist/auth/permissions.js +262 -0
  20. package/dist/auth/permissions.js.map +1 -0
  21. package/dist/auth/token-validator.d.ts +52 -0
  22. package/dist/auth/token-validator.d.ts.map +1 -0
  23. package/dist/auth/token-validator.js +215 -0
  24. package/dist/auth/token-validator.js.map +1 -0
  25. package/dist/cache/cache-manager.d.ts +49 -0
  26. package/dist/cache/cache-manager.d.ts.map +1 -0
  27. package/dist/cache/cache-manager.js +191 -0
  28. package/dist/cache/cache-manager.js.map +1 -0
  29. package/dist/cache/index.d.ts +6 -0
  30. package/dist/cache/index.d.ts.map +1 -0
  31. package/dist/cache/index.js +12 -0
  32. package/dist/cache/index.js.map +1 -0
  33. package/dist/cache/redis-client.d.ts +45 -0
  34. package/dist/cache/redis-client.d.ts.map +1 -0
  35. package/dist/cache/redis-client.js +210 -0
  36. package/dist/cache/redis-client.js.map +1 -0
  37. package/dist/config/constants.d.ts +28 -0
  38. package/dist/config/constants.d.ts.map +1 -0
  39. package/dist/config/constants.js +31 -0
  40. package/dist/config/constants.js.map +1 -0
  41. package/dist/config/index.d.ts +71 -0
  42. package/dist/config/index.d.ts.map +1 -0
  43. package/dist/config/index.js +190 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/filesystem/manager.d.ts +45 -0
  46. package/dist/filesystem/manager.d.ts.map +1 -0
  47. package/dist/filesystem/manager.js +246 -0
  48. package/dist/filesystem/manager.js.map +1 -0
  49. package/dist/git/multi-source-manager.d.ts +78 -0
  50. package/dist/git/multi-source-manager.d.ts.map +1 -0
  51. package/dist/git/multi-source-manager.js +577 -0
  52. package/dist/git/multi-source-manager.js.map +1 -0
  53. package/dist/git/operations.d.ts +27 -0
  54. package/dist/git/operations.d.ts.map +1 -0
  55. package/dist/git/operations.js +83 -0
  56. package/dist/git/operations.js.map +1 -0
  57. package/dist/index.d.ts +6 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +122 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/monitoring/health.d.ts +35 -0
  62. package/dist/monitoring/health.d.ts.map +1 -0
  63. package/dist/monitoring/health.js +105 -0
  64. package/dist/monitoring/health.js.map +1 -0
  65. package/dist/prompts/cache.d.ts +69 -0
  66. package/dist/prompts/cache.d.ts.map +1 -0
  67. package/dist/prompts/cache.js +163 -0
  68. package/dist/prompts/cache.js.map +1 -0
  69. package/dist/prompts/generator.d.ts +49 -0
  70. package/dist/prompts/generator.d.ts.map +1 -0
  71. package/dist/prompts/generator.js +160 -0
  72. package/dist/prompts/generator.js.map +1 -0
  73. package/dist/prompts/index.d.ts +13 -0
  74. package/dist/prompts/index.d.ts.map +1 -0
  75. package/dist/prompts/index.js +24 -0
  76. package/dist/prompts/index.js.map +1 -0
  77. package/dist/prompts/manager.d.ts +207 -0
  78. package/dist/prompts/manager.d.ts.map +1 -0
  79. package/dist/prompts/manager.js +566 -0
  80. package/dist/prompts/manager.js.map +1 -0
  81. package/dist/resources/index.d.ts +6 -0
  82. package/dist/resources/index.d.ts.map +1 -0
  83. package/dist/resources/index.js +10 -0
  84. package/dist/resources/index.js.map +1 -0
  85. package/dist/resources/loader.d.ts +88 -0
  86. package/dist/resources/loader.d.ts.map +1 -0
  87. package/dist/resources/loader.js +492 -0
  88. package/dist/resources/loader.js.map +1 -0
  89. package/dist/server/http.d.ts +57 -0
  90. package/dist/server/http.d.ts.map +1 -0
  91. package/dist/server/http.js +435 -0
  92. package/dist/server/http.js.map +1 -0
  93. package/dist/server.d.ts +13 -0
  94. package/dist/server.d.ts.map +1 -0
  95. package/dist/server.js +201 -0
  96. package/dist/server.js.map +1 -0
  97. package/dist/session/manager.d.ts +91 -0
  98. package/dist/session/manager.d.ts.map +1 -0
  99. package/dist/session/manager.js +251 -0
  100. package/dist/session/manager.js.map +1 -0
  101. package/dist/telemetry/index.d.ts +3 -0
  102. package/dist/telemetry/index.d.ts.map +1 -0
  103. package/dist/telemetry/index.js +7 -0
  104. package/dist/telemetry/index.js.map +1 -0
  105. package/dist/telemetry/manager.d.ts +151 -0
  106. package/dist/telemetry/manager.d.ts.map +1 -0
  107. package/dist/telemetry/manager.js +367 -0
  108. package/dist/telemetry/manager.js.map +1 -0
  109. package/dist/tools/index.d.ts +13 -0
  110. package/dist/tools/index.d.ts.map +1 -0
  111. package/dist/tools/index.js +29 -0
  112. package/dist/tools/index.js.map +1 -0
  113. package/dist/tools/manage-subscription.d.ts +47 -0
  114. package/dist/tools/manage-subscription.d.ts.map +1 -0
  115. package/dist/tools/manage-subscription.js +317 -0
  116. package/dist/tools/manage-subscription.js.map +1 -0
  117. package/dist/tools/registry.d.ts +40 -0
  118. package/dist/tools/registry.d.ts.map +1 -0
  119. package/dist/tools/registry.js +85 -0
  120. package/dist/tools/registry.js.map +1 -0
  121. package/dist/tools/resolve-prompt-content.d.ts +35 -0
  122. package/dist/tools/resolve-prompt-content.d.ts.map +1 -0
  123. package/dist/tools/resolve-prompt-content.js +99 -0
  124. package/dist/tools/resolve-prompt-content.js.map +1 -0
  125. package/dist/tools/search-resources.d.ts +35 -0
  126. package/dist/tools/search-resources.d.ts.map +1 -0
  127. package/dist/tools/search-resources.js +159 -0
  128. package/dist/tools/search-resources.js.map +1 -0
  129. package/dist/tools/sync-resources.d.ts +54 -0
  130. package/dist/tools/sync-resources.d.ts.map +1 -0
  131. package/dist/tools/sync-resources.js +735 -0
  132. package/dist/tools/sync-resources.js.map +1 -0
  133. package/dist/tools/track-usage.d.ts +63 -0
  134. package/dist/tools/track-usage.d.ts.map +1 -0
  135. package/dist/tools/track-usage.js +90 -0
  136. package/dist/tools/track-usage.js.map +1 -0
  137. package/dist/tools/uninstall-resource.d.ts +30 -0
  138. package/dist/tools/uninstall-resource.d.ts.map +1 -0
  139. package/dist/tools/uninstall-resource.js +174 -0
  140. package/dist/tools/uninstall-resource.js.map +1 -0
  141. package/dist/tools/upload-resource.d.ts +81 -0
  142. package/dist/tools/upload-resource.d.ts.map +1 -0
  143. package/dist/tools/upload-resource.js +393 -0
  144. package/dist/tools/upload-resource.js.map +1 -0
  145. package/dist/transport/sse.d.ts +29 -0
  146. package/dist/transport/sse.d.ts.map +1 -0
  147. package/dist/transport/sse.js +271 -0
  148. package/dist/transport/sse.js.map +1 -0
  149. package/dist/types/errors.d.ts +60 -0
  150. package/dist/types/errors.d.ts.map +1 -0
  151. package/dist/types/errors.js +112 -0
  152. package/dist/types/errors.js.map +1 -0
  153. package/dist/types/index.d.ts +7 -0
  154. package/dist/types/index.d.ts.map +1 -0
  155. package/dist/types/index.js +23 -0
  156. package/dist/types/index.js.map +1 -0
  157. package/dist/types/mcp.d.ts +50 -0
  158. package/dist/types/mcp.d.ts.map +1 -0
  159. package/dist/types/mcp.js +6 -0
  160. package/dist/types/mcp.js.map +1 -0
  161. package/dist/types/resources.d.ts +109 -0
  162. package/dist/types/resources.d.ts.map +1 -0
  163. package/dist/types/resources.js +7 -0
  164. package/dist/types/resources.js.map +1 -0
  165. package/dist/types/tools.d.ts +253 -0
  166. package/dist/types/tools.d.ts.map +1 -0
  167. package/dist/types/tools.js +6 -0
  168. package/dist/types/tools.js.map +1 -0
  169. package/dist/utils/cursor-paths.d.ts +84 -0
  170. package/dist/utils/cursor-paths.d.ts.map +1 -0
  171. package/dist/utils/cursor-paths.js +166 -0
  172. package/dist/utils/cursor-paths.js.map +1 -0
  173. package/dist/utils/log-cleaner.d.ts +18 -0
  174. package/dist/utils/log-cleaner.d.ts.map +1 -0
  175. package/dist/utils/log-cleaner.js +112 -0
  176. package/dist/utils/log-cleaner.js.map +1 -0
  177. package/dist/utils/logger.d.ts +59 -0
  178. package/dist/utils/logger.d.ts.map +1 -0
  179. package/dist/utils/logger.js +292 -0
  180. package/dist/utils/logger.js.map +1 -0
  181. package/dist/utils/validation.d.ts +58 -0
  182. package/dist/utils/validation.d.ts.map +1 -0
  183. package/dist/utils/validation.js +214 -0
  184. package/dist/utils/validation.js.map +1 -0
  185. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"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"}
@@ -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;AAkDD;;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,262 @@
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
+ // track_usage - internal telemetry tool, always allowed for all authenticated users
70
+ {
71
+ tool: 'track_usage',
72
+ allowedGroups: ['*'],
73
+ requiredPermission: PermissionLevel.WRITE,
74
+ },
75
+ ];
76
+ /**
77
+ * Custom permission rules (can be overridden via config)
78
+ */
79
+ let permissionRules = new Map();
80
+ /**
81
+ * Initialize permission system
82
+ */
83
+ function initializePermissions(customRules) {
84
+ // Load default permissions
85
+ for (const perm of defaultPermissions) {
86
+ permissionRules.set(perm.tool, perm);
87
+ }
88
+ // Override with custom rules if provided
89
+ if (customRules && customRules.length > 0) {
90
+ logger_1.logger.info({ count: customRules.length }, 'Loading custom permission rules');
91
+ for (const perm of customRules) {
92
+ permissionRules.set(perm.tool, perm);
93
+ }
94
+ }
95
+ logger_1.logger.info({ toolCount: permissionRules.size }, 'Permission system initialized');
96
+ }
97
+ /**
98
+ * Check if a user has permission to access a tool
99
+ * @param toolName - The name of the tool to check
100
+ * @param userGroups - The groups the user belongs to (from CSP API)
101
+ */
102
+ function checkPermission(toolName, userGroups) {
103
+ const checkStartTime = Date.now();
104
+ logger_1.logger.debug({
105
+ type: 'permission_check',
106
+ toolName,
107
+ userGroups,
108
+ timestamp: new Date().toISOString()
109
+ }, `Checking permission for tool: ${toolName}`);
110
+ // Check if tool has permission rules
111
+ const permission = permissionRules.get(toolName);
112
+ if (!permission) {
113
+ // If no permission rule defined, deny by default
114
+ logger_1.logger.warn({
115
+ type: 'permission_check',
116
+ toolName,
117
+ userGroups,
118
+ result: 'denied',
119
+ reason: 'no_rule',
120
+ timestamp: new Date().toISOString()
121
+ }, 'No permission rule found for tool, denying access');
122
+ (0, logger_1.logAuthAttempt)('permission_check', false, {
123
+ toolName,
124
+ userGroups,
125
+ reason: 'no_rule',
126
+ duration: Date.now() - checkStartTime
127
+ });
128
+ return {
129
+ allowed: false,
130
+ reason: `Tool '${toolName}' has no permission rule defined`,
131
+ };
132
+ }
133
+ // If no groups provided, deny access
134
+ if (!userGroups || userGroups.length === 0) {
135
+ logger_1.logger.warn({
136
+ type: 'permission_check',
137
+ toolName,
138
+ result: 'denied',
139
+ reason: 'no_groups',
140
+ timestamp: new Date().toISOString()
141
+ }, 'Permission denied: user has no groups');
142
+ (0, logger_1.logAuthAttempt)('permission_check', false, {
143
+ toolName,
144
+ reason: 'no_groups',
145
+ duration: Date.now() - checkStartTime
146
+ });
147
+ return {
148
+ allowed: false,
149
+ reason: `User must belong to at least one group to access tools`,
150
+ };
151
+ }
152
+ // Admin group bypasses all checks
153
+ if (userGroups.includes(exports.KnownGroups.ADMIN) || userGroups.includes('admin')) {
154
+ logger_1.logger.info({
155
+ type: 'permission_check',
156
+ toolName,
157
+ userGroups,
158
+ result: 'granted',
159
+ reason: 'admin_bypass',
160
+ duration: Date.now() - checkStartTime,
161
+ timestamp: new Date().toISOString()
162
+ }, 'Admin group access granted');
163
+ (0, logger_1.logAuthAttempt)('permission_check', true, {
164
+ toolName,
165
+ userGroups,
166
+ reason: 'admin',
167
+ duration: Date.now() - checkStartTime
168
+ });
169
+ return { allowed: true };
170
+ }
171
+ // Check if tool allows all authenticated users
172
+ if (permission.allowedGroups.includes('*')) {
173
+ logger_1.logger.info({
174
+ type: 'permission_check',
175
+ toolName,
176
+ userGroups,
177
+ allowedGroups: permission.allowedGroups,
178
+ result: 'granted',
179
+ reason: 'wildcard',
180
+ duration: Date.now() - checkStartTime,
181
+ timestamp: new Date().toISOString()
182
+ }, 'Permission granted (tool allows all authenticated users)');
183
+ (0, logger_1.logAuthAttempt)('permission_check', true, {
184
+ toolName,
185
+ userGroups,
186
+ reason: 'wildcard',
187
+ duration: Date.now() - checkStartTime
188
+ });
189
+ return { allowed: true };
190
+ }
191
+ // Check if user belongs to any of the allowed groups
192
+ const hasAllowedGroup = userGroups.some((group) => permission.allowedGroups.includes(group));
193
+ if (!hasAllowedGroup) {
194
+ logger_1.logger.warn({
195
+ type: 'permission_check',
196
+ toolName,
197
+ userGroups,
198
+ allowedGroups: permission.allowedGroups,
199
+ result: 'denied',
200
+ reason: 'group_mismatch',
201
+ duration: Date.now() - checkStartTime,
202
+ timestamp: new Date().toISOString()
203
+ }, 'Permission denied: user not in allowed groups');
204
+ (0, logger_1.logAuthAttempt)('permission_check', false, {
205
+ toolName,
206
+ userGroups,
207
+ allowedGroups: permission.allowedGroups,
208
+ reason: 'group_mismatch',
209
+ duration: Date.now() - checkStartTime
210
+ });
211
+ return {
212
+ allowed: false,
213
+ reason: `Tool '${toolName}' requires membership in one of: ${permission.allowedGroups.join(', ')}`,
214
+ };
215
+ }
216
+ logger_1.logger.info({
217
+ type: 'permission_check',
218
+ toolName,
219
+ userGroups,
220
+ allowedGroups: permission.allowedGroups,
221
+ result: 'granted',
222
+ reason: 'group_match',
223
+ duration: Date.now() - checkStartTime,
224
+ timestamp: new Date().toISOString()
225
+ }, 'Permission granted (user in allowed groups)');
226
+ (0, logger_1.logAuthAttempt)('permission_check', true, {
227
+ toolName,
228
+ userGroups,
229
+ matchedGroups: userGroups.filter(g => permission.allowedGroups.includes(g)),
230
+ duration: Date.now() - checkStartTime
231
+ });
232
+ return { allowed: true };
233
+ }
234
+ /**
235
+ * Get permission info for a tool
236
+ */
237
+ function getToolPermission(toolName) {
238
+ return permissionRules.get(toolName);
239
+ }
240
+ /**
241
+ * Get all permission rules
242
+ */
243
+ function getAllPermissions() {
244
+ return Array.from(permissionRules.values());
245
+ }
246
+ /**
247
+ * Update permission rule for a tool
248
+ */
249
+ function updatePermission(permission) {
250
+ permissionRules.set(permission.tool, permission);
251
+ logger_1.logger.info({ tool: permission.tool, permission }, 'Permission rule updated');
252
+ }
253
+ /**
254
+ * Remove permission rule for a tool
255
+ */
256
+ function removePermission(toolName) {
257
+ permissionRules.delete(toolName);
258
+ logger_1.logger.info({ toolName }, 'Permission rule removed');
259
+ }
260
+ // Initialize with default permissions
261
+ initializePermissions();
262
+ //# 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,CAkGnF;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,215 @@
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 the token presented in the SSE Authorization header.
80
+ const response = await client_1.apiClient.get('/csp/api/user/permissions', {
81
+ headers: {
82
+ 'Authorization': `Bearer ${token}`,
83
+ },
84
+ timeout: 5000, // 5 second timeout for auth check
85
+ });
86
+ const duration = Date.now() - startTime;
87
+ // Check response code (2000 means success)
88
+ if (response.code === 2000 && response.data) {
89
+ const payload = {
90
+ userId: response.data.user_id,
91
+ email: response.data.email,
92
+ groups: response.data.groups || [],
93
+ roles: response.data.groups || [], // Alias for backward compatibility
94
+ };
95
+ logger_1.logger.info({
96
+ type: 'auth',
97
+ operation: 'verify_token_api',
98
+ userId: payload.userId,
99
+ email: payload.email,
100
+ groups: payload.groups,
101
+ duration,
102
+ timestamp: new Date().toISOString()
103
+ }, `Token validated successfully for user ${payload.userId}`);
104
+ (0, logger_1.logAuthAttempt)('token_validation', true, {
105
+ userId: payload.userId,
106
+ email: payload.email,
107
+ groups: payload.groups,
108
+ duration
109
+ });
110
+ return payload;
111
+ }
112
+ logger_1.logger.warn({
113
+ type: 'auth',
114
+ operation: 'verify_token_api',
115
+ code: response.code,
116
+ message: response.message,
117
+ tokenPreview,
118
+ duration,
119
+ timestamp: new Date().toISOString()
120
+ }, 'Token validation failed - invalid or expired token');
121
+ (0, logger_1.logAuthAttempt)('token_validation', false, {
122
+ code: response.code,
123
+ message: response.message,
124
+ duration
125
+ });
126
+ return null;
127
+ }
128
+ catch (error) {
129
+ const duration = Date.now() - startTime;
130
+ (0, logger_1.logError)(error, {
131
+ type: 'auth',
132
+ operation: 'verify_token_api',
133
+ tokenPreview,
134
+ duration,
135
+ timestamp: new Date().toISOString()
136
+ });
137
+ (0, logger_1.logAuthAttempt)('token_validation', false, {
138
+ error: error instanceof Error ? error.message : String(error),
139
+ duration
140
+ });
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Verify token with caching
146
+ * Uses cached result if available to reduce API calls
147
+ * @param token - The token to verify
148
+ * @returns Token payload if valid, null otherwise
149
+ */
150
+ async function verifyToken(token) {
151
+ const tokenPreview = token.substring(0, 10) + '...' + token.substring(token.length - 10);
152
+ // Check cache first
153
+ const cached = tokenCache.get(token);
154
+ if (cached && cached.expireAt > Date.now()) {
155
+ logger_1.logger.debug({
156
+ type: 'auth',
157
+ operation: 'verify_token',
158
+ userId: cached.payload.userId,
159
+ email: cached.payload.email,
160
+ cacheHit: true,
161
+ tokenPreview,
162
+ timestamp: new Date().toISOString()
163
+ }, 'Token validation cache hit');
164
+ return cached.payload;
165
+ }
166
+ logger_1.logger.debug({
167
+ type: 'auth',
168
+ operation: 'verify_token',
169
+ cacheHit: false,
170
+ tokenPreview,
171
+ timestamp: new Date().toISOString()
172
+ }, 'Token validation cache miss, calling API');
173
+ // Validate via API
174
+ const payload = await verifyTokenViaAPI(token);
175
+ // Cache the result if valid (5 minute TTL)
176
+ if (payload) {
177
+ const expireAt = Date.now() + 5 * 60 * 1000; // 5 minutes
178
+ tokenCache.set(token, { payload, expireAt });
179
+ logger_1.logger.debug({
180
+ type: 'auth',
181
+ operation: 'verify_token',
182
+ userId: payload.userId,
183
+ email: payload.email,
184
+ cacheTTL: '5min',
185
+ timestamp: new Date().toISOString()
186
+ }, 'Token validation result cached (5 min TTL)');
187
+ }
188
+ return payload;
189
+ }
190
+ /**
191
+ * Clear token from cache (e.g., after logout)
192
+ * @param token - The token to invalidate
193
+ */
194
+ function invalidateToken(token) {
195
+ tokenCache.delete(token);
196
+ logger_1.logger.debug({ type: 'auth', operation: 'invalidate_token' }, 'Token removed from cache');
197
+ }
198
+ /**
199
+ * Clear all cached tokens
200
+ */
201
+ function clearTokenCache() {
202
+ tokenCache.clear();
203
+ logger_1.logger.info({ type: 'auth', operation: 'clear_cache' }, 'All cached tokens cleared');
204
+ }
205
+ /**
206
+ * Get cache statistics
207
+ */
208
+ function getTokenCacheStats() {
209
+ cleanExpiredCache();
210
+ return {
211
+ size: tokenCache.size,
212
+ tokens: Array.from(tokenCache.keys()).map(t => t.substring(0, 10) + '...'),
213
+ };
214
+ }
215
+ //# 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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"}