@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.
Files changed (191) 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 +213 -0
  6. package/dist/api/client.d.ts.map +1 -0
  7. package/dist/api/client.js +326 -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 +256 -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 +217 -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 +54 -0
  42. package/dist/config/index.d.ts.map +1 -0
  43. package/dist/config/index.js +168 -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 +62 -0
  50. package/dist/git/multi-source-manager.d.ts.map +1 -0
  51. package/dist/git/multi-source-manager.js +293 -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 +109 -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/resources/index.d.ts +6 -0
  66. package/dist/resources/index.d.ts.map +1 -0
  67. package/dist/resources/index.js +10 -0
  68. package/dist/resources/index.js.map +1 -0
  69. package/dist/resources/loader.d.ts +87 -0
  70. package/dist/resources/loader.d.ts.map +1 -0
  71. package/dist/resources/loader.js +452 -0
  72. package/dist/resources/loader.js.map +1 -0
  73. package/dist/server/http.d.ts +57 -0
  74. package/dist/server/http.d.ts.map +1 -0
  75. package/dist/server/http.js +336 -0
  76. package/dist/server/http.js.map +1 -0
  77. package/dist/server.d.ts +13 -0
  78. package/dist/server.d.ts.map +1 -0
  79. package/dist/server.js +157 -0
  80. package/dist/server.js.map +1 -0
  81. package/dist/session/manager.d.ts +91 -0
  82. package/dist/session/manager.d.ts.map +1 -0
  83. package/dist/session/manager.js +251 -0
  84. package/dist/session/manager.js.map +1 -0
  85. package/dist/tools/index.d.ts +11 -0
  86. package/dist/tools/index.d.ts.map +1 -0
  87. package/dist/tools/index.js +27 -0
  88. package/dist/tools/index.js.map +1 -0
  89. package/dist/tools/manage-subscription.d.ts +43 -0
  90. package/dist/tools/manage-subscription.d.ts.map +1 -0
  91. package/dist/tools/manage-subscription.js +268 -0
  92. package/dist/tools/manage-subscription.js.map +1 -0
  93. package/dist/tools/registry.d.ts +40 -0
  94. package/dist/tools/registry.d.ts.map +1 -0
  95. package/dist/tools/registry.js +85 -0
  96. package/dist/tools/registry.js.map +1 -0
  97. package/dist/tools/search-resources.d.ts +31 -0
  98. package/dist/tools/search-resources.d.ts.map +1 -0
  99. package/dist/tools/search-resources.js +154 -0
  100. package/dist/tools/search-resources.js.map +1 -0
  101. package/dist/tools/sync-resources.d.ts +41 -0
  102. package/dist/tools/sync-resources.d.ts.map +1 -0
  103. package/dist/tools/sync-resources.js +606 -0
  104. package/dist/tools/sync-resources.js.map +1 -0
  105. package/dist/tools/uninstall-resource.d.ts +30 -0
  106. package/dist/tools/uninstall-resource.d.ts.map +1 -0
  107. package/dist/tools/uninstall-resource.js +259 -0
  108. package/dist/tools/uninstall-resource.js.map +1 -0
  109. package/dist/tools/upload-resource.d.ts +77 -0
  110. package/dist/tools/upload-resource.d.ts.map +1 -0
  111. package/dist/tools/upload-resource.js +252 -0
  112. package/dist/tools/upload-resource.js.map +1 -0
  113. package/dist/transport/sse.d.ts +29 -0
  114. package/dist/transport/sse.d.ts.map +1 -0
  115. package/dist/transport/sse.js +271 -0
  116. package/dist/transport/sse.js.map +1 -0
  117. package/dist/types/errors.d.ts +60 -0
  118. package/dist/types/errors.d.ts.map +1 -0
  119. package/dist/types/errors.js +112 -0
  120. package/dist/types/errors.js.map +1 -0
  121. package/dist/types/index.d.ts +7 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +23 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/types/mcp.d.ts +50 -0
  126. package/dist/types/mcp.d.ts.map +1 -0
  127. package/dist/types/mcp.js +6 -0
  128. package/dist/types/mcp.js.map +1 -0
  129. package/dist/types/resources.d.ts +109 -0
  130. package/dist/types/resources.d.ts.map +1 -0
  131. package/dist/types/resources.js +7 -0
  132. package/dist/types/resources.js.map +1 -0
  133. package/dist/types/tools.d.ts +147 -0
  134. package/dist/types/tools.d.ts.map +1 -0
  135. package/dist/types/tools.js +6 -0
  136. package/dist/types/tools.js.map +1 -0
  137. package/dist/utils/cursor-paths.d.ts +49 -0
  138. package/dist/utils/cursor-paths.d.ts.map +1 -0
  139. package/dist/utils/cursor-paths.js +116 -0
  140. package/dist/utils/cursor-paths.js.map +1 -0
  141. package/dist/utils/log-cleaner.d.ts +18 -0
  142. package/dist/utils/log-cleaner.d.ts.map +1 -0
  143. package/dist/utils/log-cleaner.js +112 -0
  144. package/dist/utils/log-cleaner.js.map +1 -0
  145. package/dist/utils/logger.d.ts +59 -0
  146. package/dist/utils/logger.d.ts.map +1 -0
  147. package/dist/utils/logger.js +292 -0
  148. package/dist/utils/logger.js.map +1 -0
  149. package/dist/utils/validation.d.ts +58 -0
  150. package/dist/utils/validation.d.ts.map +1 -0
  151. package/dist/utils/validation.js +214 -0
  152. package/dist/utils/validation.js.map +1 -0
  153. package/package.json +58 -0
  154. package/src/api/cached-client.ts +144 -0
  155. package/src/api/client.ts +578 -0
  156. package/src/auth/index.ts +11 -0
  157. package/src/auth/middleware.ts +244 -0
  158. package/src/auth/permissions.ts +317 -0
  159. package/src/auth/token-validator.ts +294 -0
  160. package/src/cache/cache-manager.ts +243 -0
  161. package/src/cache/index.ts +6 -0
  162. package/src/cache/redis-client.ts +249 -0
  163. package/src/config/constants.ts +33 -0
  164. package/src/config/index.ts +228 -0
  165. package/src/filesystem/manager.ts +235 -0
  166. package/src/git/multi-source-manager.ts +333 -0
  167. package/src/git/operations.ts +93 -0
  168. package/src/index.ts +139 -0
  169. package/src/monitoring/health.ts +132 -0
  170. package/src/resources/index.ts +13 -0
  171. package/src/resources/loader.ts +530 -0
  172. package/src/server/http.ts +427 -0
  173. package/src/server.ts +191 -0
  174. package/src/session/manager.ts +296 -0
  175. package/src/tools/index.ts +11 -0
  176. package/src/tools/manage-subscription.ts +332 -0
  177. package/src/tools/registry.ts +97 -0
  178. package/src/tools/search-resources.ts +177 -0
  179. package/src/tools/sync-resources.ts +662 -0
  180. package/src/tools/uninstall-resource.ts +248 -0
  181. package/src/tools/upload-resource.ts +258 -0
  182. package/src/transport/sse.ts +308 -0
  183. package/src/types/errors.ts +146 -0
  184. package/src/types/index.ts +7 -0
  185. package/src/types/mcp.ts +61 -0
  186. package/src/types/resources.ts +141 -0
  187. package/src/types/tools.ts +175 -0
  188. package/src/utils/cursor-paths.ts +83 -0
  189. package/src/utils/log-cleaner.ts +92 -0
  190. package/src/utils/logger.ts +333 -0
  191. package/src/utils/validation.ts +262 -0
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Request Validation Utilities
3
+ * Enhanced validation with clear error messages
4
+ */
5
+
6
+ export interface ValidationError {
7
+ field: string;
8
+ message: string;
9
+ expected?: string;
10
+ received?: any;
11
+ suggestion?: string;
12
+ }
13
+
14
+ export class RequestValidationError extends Error {
15
+ public errors: ValidationError[];
16
+ public statusCode: number;
17
+
18
+ constructor(errors: ValidationError[], statusCode = 400) {
19
+ const message = errors.map(e => `${e.field}: ${e.message}`).join('; ');
20
+ super(message);
21
+ this.name = 'RequestValidationError';
22
+ this.errors = errors;
23
+ this.statusCode = statusCode;
24
+ }
25
+
26
+ toJSON() {
27
+ return {
28
+ error: 'Validation Error',
29
+ message: this.message,
30
+ details: this.errors,
31
+ };
32
+ }
33
+ }
34
+
35
+ /**
36
+ * Validate required field
37
+ */
38
+ export function validateRequired(
39
+ value: any,
40
+ fieldName: string
41
+ ): ValidationError | null {
42
+ if (value === undefined || value === null || value === '') {
43
+ return {
44
+ field: fieldName,
45
+ message: `Missing required field: '${fieldName}'`,
46
+ expected: 'non-empty value',
47
+ received: typeof value,
48
+ };
49
+ }
50
+ return null;
51
+ }
52
+
53
+ /**
54
+ * Validate string type
55
+ */
56
+ export function validateString(
57
+ value: any,
58
+ fieldName: string
59
+ ): ValidationError | null {
60
+ if (typeof value !== 'string') {
61
+ return {
62
+ field: fieldName,
63
+ message: `Field '${fieldName}' must be a string`,
64
+ expected: 'string',
65
+ received: typeof value,
66
+ };
67
+ }
68
+ return null;
69
+ }
70
+
71
+ /**
72
+ * Validate enum value
73
+ */
74
+ export function validateEnum(
75
+ value: any,
76
+ fieldName: string,
77
+ allowedValues: readonly string[]
78
+ ): ValidationError | null {
79
+ if (!allowedValues.includes(value)) {
80
+ // Find closest match for suggestion
81
+ const suggestion = findClosestMatch(value, allowedValues);
82
+
83
+ return {
84
+ field: fieldName,
85
+ message: `Field '${fieldName}' has invalid value`,
86
+ expected: `one of: ${allowedValues.map(v => `'${v}'`).join(', ')}`,
87
+ received: value,
88
+ suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,
89
+ };
90
+ }
91
+ return null;
92
+ }
93
+
94
+ /**
95
+ * Validate array type
96
+ */
97
+ export function validateArray(
98
+ value: any,
99
+ fieldName: string
100
+ ): ValidationError | null {
101
+ if (!Array.isArray(value)) {
102
+ return {
103
+ field: fieldName,
104
+ message: `Field '${fieldName}' must be an array`,
105
+ expected: 'array',
106
+ received: typeof value,
107
+ };
108
+ }
109
+ return null;
110
+ }
111
+
112
+ /**
113
+ * Validate object type
114
+ */
115
+ export function validateObject(
116
+ value: any,
117
+ fieldName: string
118
+ ): ValidationError | null {
119
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
120
+ return {
121
+ field: fieldName,
122
+ message: `Field '${fieldName}' must be an object`,
123
+ expected: 'object',
124
+ received: Array.isArray(value) ? 'array' : typeof value,
125
+ };
126
+ }
127
+ return null;
128
+ }
129
+
130
+ /**
131
+ * Validate boolean type
132
+ */
133
+ export function validateBoolean(
134
+ value: any,
135
+ fieldName: string
136
+ ): ValidationError | null {
137
+ if (typeof value !== 'boolean') {
138
+ return {
139
+ field: fieldName,
140
+ message: `Field '${fieldName}' must be a boolean`,
141
+ expected: 'boolean (true or false)',
142
+ received: typeof value,
143
+ };
144
+ }
145
+ return null;
146
+ }
147
+
148
+ /**
149
+ * Validate number type
150
+ */
151
+ export function validateNumber(
152
+ value: any,
153
+ fieldName: string
154
+ ): ValidationError | null {
155
+ if (typeof value !== 'number' || isNaN(value)) {
156
+ return {
157
+ field: fieldName,
158
+ message: `Field '${fieldName}' must be a number`,
159
+ expected: 'number',
160
+ received: typeof value,
161
+ };
162
+ }
163
+ return null;
164
+ }
165
+
166
+ /**
167
+ * Find closest string match (simple Levenshtein distance)
168
+ */
169
+ function findClosestMatch(
170
+ value: string,
171
+ candidates: readonly string[]
172
+ ): string | null {
173
+ if (!value || typeof value !== 'string') {
174
+ return null;
175
+ }
176
+
177
+ let minDistance = Infinity;
178
+ let closest: string | null = null;
179
+
180
+ for (const candidate of candidates) {
181
+ const distance = levenshteinDistance(
182
+ value.toLowerCase(),
183
+ candidate.toLowerCase()
184
+ );
185
+ if (distance < minDistance && distance <= 2) {
186
+ // Only suggest if distance is small
187
+ minDistance = distance;
188
+ closest = candidate;
189
+ }
190
+ }
191
+
192
+ return closest;
193
+ }
194
+
195
+ /**
196
+ * Calculate Levenshtein distance between two strings
197
+ */
198
+ function levenshteinDistance(a: string, b: string): number {
199
+ const matrix: number[][] = [];
200
+
201
+ for (let i = 0; i <= b.length; i++) {
202
+ matrix[i] = [i];
203
+ }
204
+
205
+ for (let j = 0; j <= a.length; j++) {
206
+ matrix[0]![j] = j;
207
+ }
208
+
209
+ for (let i = 1; i <= b.length; i++) {
210
+ for (let j = 1; j <= a.length; j++) {
211
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
212
+ matrix[i]![j] = matrix[i - 1]![j - 1]!;
213
+ } else {
214
+ matrix[i]![j] = Math.min(
215
+ matrix[i - 1]![j - 1]! + 1, // substitution
216
+ matrix[i]![j - 1]! + 1, // insertion
217
+ matrix[i - 1]![j]! + 1 // deletion
218
+ );
219
+ }
220
+ }
221
+ }
222
+
223
+ return matrix[b.length]![a.length]!;
224
+ }
225
+
226
+ /**
227
+ * Validate SSE connection parameters
228
+ */
229
+ export function validateSSEConnectionParams(_body: any): ValidationError[] {
230
+ const errors: ValidationError[] = [];
231
+
232
+ // Validate Authorization header (will be checked in middleware)
233
+ // No body parameters required for SSE connection
234
+
235
+ return errors;
236
+ }
237
+
238
+ /**
239
+ * Validate message parameters
240
+ */
241
+ export function validateMessageParams(body: any): ValidationError[] {
242
+ const errors: ValidationError[] = [];
243
+
244
+ // sessionId is required
245
+ const sessionIdError = validateRequired(body.sessionId, 'sessionId');
246
+ if (sessionIdError) {
247
+ errors.push(sessionIdError);
248
+ } else {
249
+ const sessionIdTypeError = validateString(body.sessionId, 'sessionId');
250
+ if (sessionIdTypeError) {
251
+ errors.push(sessionIdTypeError);
252
+ }
253
+ }
254
+
255
+ // message is required
256
+ const messageError = validateRequired(body.message, 'message');
257
+ if (messageError) {
258
+ errors.push(messageError);
259
+ }
260
+
261
+ return errors;
262
+ }