@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,293 @@
1
+ "use strict";
2
+ /**
3
+ * Multi-Source Git Manager
4
+ * Manages multiple AI Resources Git repositories efficiently
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.multiSourceGitManager = void 0;
44
+ const fs = __importStar(require("fs/promises"));
45
+ const path = __importStar(require("path"));
46
+ const simple_git_1 = __importDefault(require("simple-git"));
47
+ const logger_1 = require("../utils/logger");
48
+ const errors_1 = require("../types/errors");
49
+ class MultiSourceGitManager {
50
+ configPath;
51
+ baseDir;
52
+ constructor(baseDir) {
53
+ this.baseDir = baseDir;
54
+ this.configPath = path.join(baseDir, 'ai-resources-config.json');
55
+ }
56
+ /**
57
+ * Load AI Resources configuration
58
+ */
59
+ async loadConfig() {
60
+ try {
61
+ const configContent = await fs.readFile(this.configPath, 'utf-8');
62
+ return JSON.parse(configContent);
63
+ }
64
+ catch (error) {
65
+ throw new Error(`Failed to load AI Resources config: ${error instanceof Error ? error.message : String(error)}`);
66
+ }
67
+ }
68
+ /**
69
+ * Get all enabled sources (including default)
70
+ */
71
+ async getEnabledSources() {
72
+ const config = await this.loadConfig();
73
+ const sources = [];
74
+ if (config.default_source.enabled) {
75
+ sources.push(config.default_source);
76
+ }
77
+ if (config.extended_sources) {
78
+ sources.push(...config.extended_sources.filter(s => s.enabled));
79
+ }
80
+ return sources;
81
+ }
82
+ /**
83
+ * Check if a Git repository exists at the given path
84
+ */
85
+ async repositoryExists(repoPath) {
86
+ try {
87
+ const gitDir = path.join(repoPath, '.git');
88
+ const stats = await fs.stat(gitDir);
89
+ return stats.isDirectory();
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ }
95
+ /**
96
+ * Get Git repository URL from existing repo
97
+ */
98
+ async getRepoUrl(repoPath) {
99
+ try {
100
+ const git = (0, simple_git_1.default)(repoPath);
101
+ const remotes = await git.getRemotes(true);
102
+ const origin = remotes.find(r => r.name === 'origin');
103
+ return origin?.refs.fetch || null;
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ }
109
+ /**
110
+ * Clone a Git repository
111
+ */
112
+ async cloneRepository(repoUrl, targetPath, branch = 'main') {
113
+ try {
114
+ logger_1.logger.info({ repoUrl, targetPath, branch }, 'Cloning Git repository...');
115
+ // Ensure parent directory exists
116
+ const parentDir = path.dirname(targetPath);
117
+ await fs.mkdir(parentDir, { recursive: true });
118
+ const git = (0, simple_git_1.default)();
119
+ // Clone with --single-branch to limit downloaded history to the target
120
+ // branch only, keeping the clone fast without creating a shallow repo
121
+ // (shallow repos cause "no merge base" errors on subsequent fetches).
122
+ await git.clone(repoUrl, targetPath, [
123
+ '--branch', branch,
124
+ '--single-branch',
125
+ ]);
126
+ logger_1.logger.info({ repoUrl, targetPath }, 'Repository cloned successfully');
127
+ }
128
+ catch (error) {
129
+ throw (0, errors_1.createGitError)('clone', error, repoUrl);
130
+ }
131
+ }
132
+ /**
133
+ * Pull latest changes using fetch + fast-forward merge.
134
+ *
135
+ * Deliberately avoids --depth=1 on fetch: shallow fetches truncate local
136
+ * history, causing "no merge base" divergence errors on subsequent pulls.
137
+ */
138
+ async pullRepository(repoPath, branch = 'main') {
139
+ try {
140
+ const git = (0, simple_git_1.default)(repoPath);
141
+ logger_1.logger.info({ repoPath, branch }, 'Fetching latest changes...');
142
+ // If the local repo is shallow (was previously cloned with --depth),
143
+ // unshallow it first so subsequent fetches have a proper merge base.
144
+ const isShallow = (await git.raw(['rev-parse', '--is-shallow-repository'])).trim() === 'true';
145
+ if (isShallow) {
146
+ logger_1.logger.info({ repoPath }, 'Shallow repo detected — running fetch --unshallow first');
147
+ await git.fetch(['--unshallow', 'origin', branch]);
148
+ }
149
+ else {
150
+ // Fetch the branch from origin without --depth to keep full history intact.
151
+ await git.fetch(['origin', branch]);
152
+ }
153
+ // Compare local HEAD with remote tip to detect changes before merging.
154
+ const remoteBranch = `origin/${branch}`;
155
+ const diffSummary = await git.diffSummary([`HEAD...${remoteBranch}`]);
156
+ const hasChanges = diffSummary.files.length > 0;
157
+ if (!hasChanges) {
158
+ logger_1.logger.info({ repoPath }, 'Repository is up-to-date, no changes to pull');
159
+ return { hasChanges: false, filesChanged: 0 };
160
+ }
161
+ // Fast-forward only — never auto-merge diverged histories.
162
+ logger_1.logger.info({ repoPath, filesChanged: diffSummary.files.length }, 'Pulling changes...');
163
+ await git.merge([remoteBranch, '--ff-only']);
164
+ logger_1.logger.info({
165
+ repoPath,
166
+ filesChanged: diffSummary.files.length,
167
+ insertions: diffSummary.insertions,
168
+ deletions: diffSummary.deletions,
169
+ }, 'Repository updated successfully');
170
+ return { hasChanges: true, filesChanged: diffSummary.files.length };
171
+ }
172
+ catch (error) {
173
+ throw (0, errors_1.createGitError)('pull', error, repoPath);
174
+ }
175
+ }
176
+ /**
177
+ * Sync a single source repository
178
+ */
179
+ async syncSource(source) {
180
+ const startTime = Date.now();
181
+ const sourcePath = path.join(this.baseDir, source.path);
182
+ logger_1.logger.info({
183
+ source: source.name,
184
+ path: sourcePath,
185
+ priority: source.priority
186
+ }, 'Syncing AI Resources source...');
187
+ try {
188
+ const exists = await this.repositoryExists(sourcePath);
189
+ if (!exists) {
190
+ // First time: clone repository
191
+ if (!source.git_url) {
192
+ logger_1.logger.warn({ source: source.name }, 'Source has no git_url configured, skipping clone');
193
+ return {
194
+ source: source.name,
195
+ action: 'skipped',
196
+ changes: 0,
197
+ duration: Date.now() - startTime
198
+ };
199
+ }
200
+ logger_1.logger.info({ source: source.name }, 'Repository does not exist, cloning...');
201
+ await this.cloneRepository(source.git_url, sourcePath, source.git_branch || 'main');
202
+ return {
203
+ source: source.name,
204
+ action: 'cloned',
205
+ changes: -1, // -1 means full clone
206
+ duration: Date.now() - startTime
207
+ };
208
+ }
209
+ else {
210
+ // Repository exists: pull latest changes
211
+ logger_1.logger.info({ source: source.name }, 'Repository exists, pulling latest changes...');
212
+ const { hasChanges, filesChanged } = await this.pullRepository(sourcePath, source.git_branch || 'main');
213
+ return {
214
+ source: source.name,
215
+ action: hasChanges ? 'pulled' : 'up-to-date',
216
+ changes: filesChanged,
217
+ duration: Date.now() - startTime
218
+ };
219
+ }
220
+ }
221
+ catch (error) {
222
+ logger_1.logger.error({
223
+ source: source.name,
224
+ error: error instanceof Error ? error.message : String(error)
225
+ }, 'Failed to sync source');
226
+ throw error;
227
+ }
228
+ }
229
+ /**
230
+ * Sync all enabled sources
231
+ */
232
+ async syncAllSources() {
233
+ logger_1.logger.info('Starting multi-source sync...');
234
+ const sources = await this.getEnabledSources();
235
+ logger_1.logger.info({
236
+ totalSources: sources.length,
237
+ sourceNames: sources.map(s => s.name)
238
+ }, 'Found enabled sources');
239
+ const results = [];
240
+ for (const source of sources) {
241
+ try {
242
+ const result = await this.syncSource(source);
243
+ results.push(result);
244
+ }
245
+ catch (error) {
246
+ logger_1.logger.error({
247
+ source: source.name,
248
+ error: error instanceof Error ? error.message : String(error)
249
+ }, 'Failed to sync source, continuing with next...');
250
+ results.push({
251
+ source: source.name,
252
+ action: 'skipped',
253
+ changes: 0,
254
+ duration: 0
255
+ });
256
+ }
257
+ }
258
+ logger_1.logger.info({
259
+ results,
260
+ totalSources: results.length,
261
+ cloned: results.filter(r => r.action === 'cloned').length,
262
+ pulled: results.filter(r => r.action === 'pulled').length,
263
+ upToDate: results.filter(r => r.action === 'up-to-date').length
264
+ }, 'Multi-source sync completed');
265
+ return results;
266
+ }
267
+ /**
268
+ * Check status of all sources without pulling
269
+ */
270
+ async checkAllSources() {
271
+ const sources = await this.getEnabledSources();
272
+ const statuses = [];
273
+ for (const source of sources) {
274
+ const sourcePath = path.join(this.baseDir, source.path);
275
+ const exists = await this.repositoryExists(sourcePath);
276
+ let repoUrl = null;
277
+ if (exists) {
278
+ repoUrl = await this.getRepoUrl(sourcePath);
279
+ }
280
+ statuses.push({
281
+ source: source.name,
282
+ exists,
283
+ hasRemote: !!repoUrl,
284
+ repoUrl
285
+ });
286
+ }
287
+ return statuses;
288
+ }
289
+ }
290
+ // Export singleton instance
291
+ const AI_RESOURCES_BASE = path.resolve(process.cwd(), '../AI-Resources');
292
+ exports.multiSourceGitManager = new MultiSourceGitManager(AI_RESOURCES_BASE);
293
+ //# sourceMappingURL=multi-source-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-source-manager.js","sourceRoot":"","sources":["../../src/git/multi-source-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Git Operations Module
3
+ * Per-repo git helpers used by upload_resource to target a specific source repo.
4
+ * All repo URLs and branches come from AI-Resources/ai-resources-config.json —
5
+ * not from environment variables.
6
+ */
7
+ declare class GitOperations {
8
+ /**
9
+ * Check whether a git repository exists at an arbitrary local path
10
+ */
11
+ repositoryExistsAt(repoPath: string): Promise<boolean>;
12
+ /**
13
+ * Get current branch of an arbitrary local repo
14
+ */
15
+ getCurrentBranchAt(repoPath: string): Promise<string>;
16
+ /**
17
+ * Commit and push to a specific repo / remote url / branch.
18
+ * Creates a unique remote testing branch and returns a PR URL.
19
+ */
20
+ commitAndPushRepo(repoPath: string, remoteUrl: string, baseBranch: string, message: string, files?: string[]): Promise<{
21
+ commitHash: string;
22
+ prUrl?: string;
23
+ }>;
24
+ }
25
+ export declare const gitOperations: GitOperations;
26
+ export {};
27
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/git/operations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,cAAM,aAAa;IAGjB;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5D;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU3D;;;OAGG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAuCnD;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -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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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CSP AI Agent MCP Server - Main Entry Point
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,109 @@
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
+ // Global error handlers
14
+ process.on('uncaughtException', (error) => {
15
+ // Handle EPIPE and ECONNRESET gracefully (client disconnected)
16
+ if (error.message.includes('EPIPE') || error.message.includes('ECONNRESET')) {
17
+ logger_1.logger.debug({
18
+ error: error.message,
19
+ type: 'uncaught_exception_network'
20
+ }, 'Client disconnected (EPIPE/ECONNRESET)');
21
+ return; // Don't exit for network errors
22
+ }
23
+ // For other uncaught exceptions, log and exit
24
+ logger_1.logger.error({ error, type: 'uncaught_exception' }, `Uncaught Exception: ${error.message}`);
25
+ process.exit(1);
26
+ });
27
+ process.on('unhandledRejection', (reason, _promise) => {
28
+ logger_1.logger.error({
29
+ type: 'unhandled_rejection',
30
+ reason: reason instanceof Error ? reason.message : String(reason),
31
+ stack: reason instanceof Error ? reason.stack : undefined,
32
+ }, 'Unhandled Promise Rejection');
33
+ process.exit(1);
34
+ });
35
+ async function main() {
36
+ logger_1.logger.info({
37
+ nodeEnv: config_1.config.nodeEnv,
38
+ port: config_1.config.port,
39
+ logLevel: config_1.config.logLevel,
40
+ }, 'Starting CSP AI Agent MCP Server...');
41
+ // Start log cleanup scheduler
42
+ const cleanupTimer = (0, log_cleaner_1.startLogCleanupSchedule)();
43
+ try {
44
+ // Start MCP Server
45
+ await (0, server_1.startServer)();
46
+ logger_1.logger.info({ port: config_1.config.port }, `✅ CSP AI Agent MCP Server started successfully`);
47
+ }
48
+ catch (error) {
49
+ logger_1.logger.error({ error }, 'Failed to start server');
50
+ (0, log_cleaner_1.stopLogCleanupSchedule)(cleanupTimer);
51
+ process.exit(1);
52
+ }
53
+ // Graceful shutdown handlers
54
+ let isShuttingDown = false;
55
+ const SHUTDOWN_TIMEOUT = Number(process.env.SHUTDOWN_TIMEOUT) || 30000; // 30 seconds default
56
+ const shutdown = async (signal) => {
57
+ // Prevent multiple shutdown attempts
58
+ if (isShuttingDown) {
59
+ logger_1.logger.warn({ signal }, 'Shutdown already in progress, ignoring signal');
60
+ return;
61
+ }
62
+ isShuttingDown = true;
63
+ logger_1.logger.info({ signal, timeout: SHUTDOWN_TIMEOUT }, `Received ${signal}, starting graceful shutdown...`);
64
+ // Set timeout for forced shutdown
65
+ const shutdownTimer = setTimeout(() => {
66
+ logger_1.logger.error({ timeout: SHUTDOWN_TIMEOUT }, `Graceful shutdown timeout (${SHUTDOWN_TIMEOUT}ms), forcing exit`);
67
+ process.exit(1);
68
+ }, SHUTDOWN_TIMEOUT);
69
+ try {
70
+ // Phase 1: Stop accepting new requests
71
+ logger_1.logger.info('Phase 1: Stopping new requests...');
72
+ // Phase 2: Wait for ongoing requests to complete
73
+ logger_1.logger.info('Phase 2: Waiting for ongoing requests to complete...');
74
+ // Stop MCP Server (this will close all active sessions and connections)
75
+ await (0, server_1.stopServer)();
76
+ // Phase 3: Stop background tasks
77
+ logger_1.logger.info('Phase 3: Stopping background tasks...');
78
+ // Stop log cleanup
79
+ (0, log_cleaner_1.stopLogCleanupSchedule)(cleanupTimer);
80
+ // Stop session cleanup
81
+ manager_1.sessionManager.stopCleanup();
82
+ logger_1.logger.info('Session cleanup stopped');
83
+ // Stop token cache cleanup
84
+ (0, token_validator_1.stopCacheCleanup)();
85
+ logger_1.logger.info('Token cache cleanup stopped');
86
+ // Phase 4: Flush logs
87
+ logger_1.logger.info('Phase 4: Flushing logs...');
88
+ // Give logger time to flush
89
+ await new Promise(resolve => setTimeout(resolve, 500));
90
+ // Clear shutdown timeout
91
+ clearTimeout(shutdownTimer);
92
+ logger_1.logger.info('✅ Graceful shutdown completed successfully');
93
+ process.exit(0);
94
+ }
95
+ catch (error) {
96
+ logger_1.logger.error({ error }, 'Error during graceful shutdown');
97
+ clearTimeout(shutdownTimer);
98
+ process.exit(1);
99
+ }
100
+ };
101
+ process.on('SIGINT', () => void shutdown('SIGINT'));
102
+ process.on('SIGTERM', () => void shutdown('SIGTERM'));
103
+ }
104
+ // Start the application
105
+ void main().catch((error) => {
106
+ logger_1.logger.error({ error }, 'Fatal error during startup');
107
+ process.exit(1);
108
+ });
109
+ //# 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"}