@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,71 @@
1
+ /**
2
+ * Configuration Management Module
3
+ * Loads and validates configuration from environment variables
4
+ */
5
+ export interface Config {
6
+ nodeEnv: 'development' | 'production' | 'test';
7
+ port: number;
8
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
9
+ transport: {
10
+ mode: 'stdio' | 'sse';
11
+ };
12
+ http?: {
13
+ host: string;
14
+ port: number;
15
+ /** URL path prefix when the server runs behind a reverse proxy sub-path.
16
+ * e.g. HTTP_BASE_PATH=/csp-agent → SSE at /csp-agent/sse
17
+ * → messages POST to /csp-agent/message
18
+ * Leave empty (default) for direct / root-path deployments.
19
+ */
20
+ basePath: string;
21
+ /**
22
+ * The public-facing origin clients (Cursor) should use when posting
23
+ * JSON-RPC messages. Derived from CSP_API_BASE_URL so that teams only
24
+ * need one URL configured — the API base and the MCP server share the
25
+ * same external hostname.
26
+ *
27
+ * e.g. CSP_API_BASE_URL=https://zct.zoomdev.us → publicOrigin=https://zct.zoomdev.us
28
+ *
29
+ * Falls back to PUBLIC_URL env var if set, then to the internal
30
+ * http://host:port when running locally (where 0.0.0.0 == localhost).
31
+ */
32
+ publicOrigin: string;
33
+ };
34
+ session?: {
35
+ timeout: number;
36
+ };
37
+ csp: {
38
+ apiBaseUrl: string;
39
+ timeout: number;
40
+ };
41
+ git: {
42
+ userName: string;
43
+ userEmail: string;
44
+ };
45
+ resource: Record<string, never>;
46
+ cache: {
47
+ enabled: boolean;
48
+ redis?: {
49
+ url: string;
50
+ ttl: number;
51
+ };
52
+ memory: {
53
+ maxSize: number;
54
+ };
55
+ };
56
+ database?: {
57
+ url: string;
58
+ };
59
+ metrics: {
60
+ enabled: boolean;
61
+ port?: number;
62
+ };
63
+ logging: {
64
+ dir: string;
65
+ retentionDays: number;
66
+ };
67
+ }
68
+ export declare function loadConfig(): Config;
69
+ declare let config: Config;
70
+ export { config };
71
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,MAAM,WAAW,MAAM;IAErB,OAAO,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;IAG/C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG9C,SAAS,EAAE;QACT,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;KACvB,CAAC;IAGF,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb;;;;WAIG;QACH,QAAQ,EAAE,MAAM,CAAC;QACjB;;;;;;;;;;WAUG;QACH,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAGF,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAGF,GAAG,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QAKnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAGF,GAAG,EAAE;QACH,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAKF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAGhC,KAAK,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE;YACN,GAAG,EAAE,MAAM,CAAC;YACZ,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;QACF,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IAGF,QAAQ,CAAC,EAAE;QACT,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IAGF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAoCD,wBAAgB,UAAU,IAAI,MAAM,CAwFnC;AAGD,QAAA,IAAI,MAAM,EAAE,MAAM,CAAC;AAmBnB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration Management Module
4
+ * Loads and validates configuration from environment variables
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
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.config = void 0;
41
+ exports.loadConfig = loadConfig;
42
+ const dotenv = __importStar(require("dotenv"));
43
+ const path = __importStar(require("path"));
44
+ const fs = __importStar(require("fs"));
45
+ // Load .env file if exists
46
+ // Try multiple paths to find .env file
47
+ const possibleEnvPaths = [
48
+ path.resolve(process.cwd(), '.env'), // Current working directory
49
+ path.resolve(__dirname, '../../.env'), // Relative to compiled dist/config/
50
+ path.resolve(__dirname, '../../../.env'), // Project root (if deeper nesting)
51
+ ];
52
+ let envLoaded = false;
53
+ for (const envPath of possibleEnvPaths) {
54
+ if (fs.existsSync(envPath)) {
55
+ dotenv.config({ path: envPath });
56
+ console.log(`✓ Loaded .env from: ${envPath}`);
57
+ envLoaded = true;
58
+ break;
59
+ }
60
+ }
61
+ if (!envLoaded) {
62
+ console.warn('⚠ No .env file found, using environment variables only');
63
+ }
64
+ function getEnv(key, defaultValue) {
65
+ const value = process.env[key];
66
+ if (value === undefined) {
67
+ if (defaultValue !== undefined) {
68
+ return defaultValue;
69
+ }
70
+ throw new Error(`Missing required environment variable: ${key}`);
71
+ }
72
+ return value;
73
+ }
74
+ function getEnvNumber(key, defaultValue) {
75
+ const value = process.env[key];
76
+ if (value === undefined) {
77
+ if (defaultValue !== undefined) {
78
+ return defaultValue;
79
+ }
80
+ throw new Error(`Missing required environment variable: ${key}`);
81
+ }
82
+ const parsed = parseInt(value, 10);
83
+ if (isNaN(parsed)) {
84
+ throw new Error(`Environment variable ${key} must be a number, got: ${value}`);
85
+ }
86
+ return parsed;
87
+ }
88
+ function getEnvBoolean(key, defaultValue) {
89
+ const value = process.env[key];
90
+ if (value === undefined) {
91
+ return defaultValue;
92
+ }
93
+ return value.toLowerCase() === 'true';
94
+ }
95
+ function loadConfig() {
96
+ const nodeEnv = (process.env.NODE_ENV || 'development');
97
+ const logLevel = (process.env.LOG_LEVEL || 'info');
98
+ const transportMode = (process.env.TRANSPORT_MODE || 'stdio');
99
+ return {
100
+ nodeEnv,
101
+ port: getEnvNumber('PORT', 5090),
102
+ logLevel,
103
+ transport: {
104
+ mode: transportMode,
105
+ },
106
+ http: transportMode === 'sse' ? (() => {
107
+ const host = getEnv('HTTP_HOST', '0.0.0.0');
108
+ const port = getEnvNumber('HTTP_PORT', 3000);
109
+ const basePath = getEnv('HTTP_BASE_PATH', '');
110
+ // Derive the public-facing origin that external clients (Cursor) will use
111
+ // to POST JSON-RPC messages. Priority:
112
+ // 1. PUBLIC_URL env var — explicit override (e.g. ngrok / custom domain)
113
+ // 2. Origin extracted from CSP_API_BASE_URL — same host as the API
114
+ // 3. http://host:port — safe for local dev where host==0.0.0.0==localhost
115
+ const publicUrl = process.env['PUBLIC_URL'];
116
+ const cspApiBase = process.env['CSP_API_BASE_URL'] ?? '';
117
+ let publicOrigin;
118
+ if (publicUrl) {
119
+ publicOrigin = publicUrl.replace(/\/$/, '');
120
+ }
121
+ else if (cspApiBase) {
122
+ try {
123
+ const u = new URL(cspApiBase);
124
+ publicOrigin = u.origin; // e.g. "https://zct.zoomdev.us"
125
+ }
126
+ catch {
127
+ publicOrigin = `http://${host}:${port}`;
128
+ }
129
+ }
130
+ else {
131
+ publicOrigin = `http://${host}:${port}`;
132
+ }
133
+ return { host, port, basePath, publicOrigin };
134
+ })() : undefined,
135
+ session: transportMode === 'sse' ? {
136
+ timeout: getEnvNumber('SESSION_TIMEOUT', 3600),
137
+ } : undefined,
138
+ csp: {
139
+ apiBaseUrl: getEnv('CSP_API_BASE_URL', 'https://csp.example.com'),
140
+ timeout: getEnvNumber('CSP_API_TIMEOUT', 30000),
141
+ },
142
+ git: {
143
+ userName: getEnv('GIT_USER_NAME', 'CSP Agent'),
144
+ userEmail: getEnv('GIT_USER_EMAIL', 'agent@example.com'),
145
+ },
146
+ resource: {},
147
+ cache: {
148
+ enabled: getEnvBoolean('ENABLE_CACHE', true),
149
+ redis: process.env.REDIS_URL
150
+ ? {
151
+ url: process.env.REDIS_URL,
152
+ ttl: getEnvNumber('REDIS_TTL', 900),
153
+ }
154
+ : undefined,
155
+ memory: {
156
+ maxSize: getEnvNumber('CACHE_MAX_SIZE', 100),
157
+ },
158
+ },
159
+ database: process.env.DATABASE_URL
160
+ ? {
161
+ url: process.env.DATABASE_URL,
162
+ }
163
+ : undefined,
164
+ metrics: {
165
+ enabled: getEnvBoolean('ENABLE_METRICS', true),
166
+ port: process.env.METRICS_PORT ? getEnvNumber('METRICS_PORT') : undefined,
167
+ },
168
+ logging: {
169
+ dir: getEnv('LOG_DIR', '../Logs'),
170
+ retentionDays: getEnvNumber('LOG_RETENTION_DAYS', 3),
171
+ },
172
+ };
173
+ }
174
+ // Validate configuration on load
175
+ let config;
176
+ try {
177
+ exports.config = config = loadConfig();
178
+ }
179
+ catch (error) {
180
+ // Use logger for consistent error reporting
181
+ const logger = require('../utils/logger').logger;
182
+ logger.error({
183
+ type: 'config',
184
+ operation: 'load_config',
185
+ error: error.message,
186
+ stack: error.stack
187
+ }, 'Configuration loading failed');
188
+ process.exit(1);
189
+ }
190
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Filesystem Manager
3
+ * Atomic filesystem operations for resource management
4
+ */
5
+ declare class FilesystemManager {
6
+ /**
7
+ * Write resource file atomically
8
+ */
9
+ writeResource(filePath: string, content: string): Promise<void>;
10
+ /**
11
+ * Read resource file with validation
12
+ */
13
+ readResource(filePath: string): Promise<string>;
14
+ /**
15
+ * Delete resource file with backup
16
+ */
17
+ deleteResource(filePath: string): Promise<void>;
18
+ /**
19
+ * Validate resource content
20
+ */
21
+ private validateResourceContent;
22
+ /**
23
+ * Check if file exists
24
+ */
25
+ fileExists(filePath: string): Promise<boolean>;
26
+ /**
27
+ * List files in directory
28
+ */
29
+ listFiles(dirPath: string, pattern?: RegExp): Promise<string[]>;
30
+ /**
31
+ * Recursively scan a directory and return all text files as FileEntry[]
32
+ * Supported extensions: .md, .mdc, .txt, .yaml, .yml, .json
33
+ */
34
+ scanDirectory(dirPath: string): Promise<Array<{
35
+ path: string;
36
+ content: string;
37
+ }>>;
38
+ /**
39
+ * Remove empty directories recursively
40
+ */
41
+ removeEmptyDirs(dirPath: string): Promise<void>;
42
+ }
43
+ export declare const filesystemManager: FilesystemManager;
44
+ export {};
45
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/filesystem/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,cAAM,iBAAiB;IACrB;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BrE;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBrD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCrD;;OAEG;YACW,uBAAuB;IAuBrC;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASpD;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcrE;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAiDvF;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBtD;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ /**
3
+ * Filesystem Manager
4
+ * Atomic filesystem operations for resource management
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
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.filesystemManager = void 0;
41
+ const fs = __importStar(require("fs/promises"));
42
+ const fsSync = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const logger_1 = require("../utils/logger");
45
+ const errors_1 = require("../types/errors");
46
+ class FilesystemManager {
47
+ /**
48
+ * Write resource file atomically
49
+ */
50
+ async writeResource(filePath, content) {
51
+ const tempPath = `${filePath}.tmp`;
52
+ try {
53
+ // Ensure directory exists
54
+ const dir = path.dirname(filePath);
55
+ await fs.mkdir(dir, { recursive: true });
56
+ // Write to temporary file
57
+ await fs.writeFile(tempPath, content, 'utf-8');
58
+ // Validate content (basic check)
59
+ await this.validateResourceContent(tempPath, content);
60
+ // Atomic rename
61
+ await fs.rename(tempPath, filePath);
62
+ logger_1.logger.debug({ filePath }, 'Resource file written successfully');
63
+ }
64
+ catch (error) {
65
+ // Cleanup temporary file
66
+ try {
67
+ await fs.unlink(tempPath);
68
+ }
69
+ catch {
70
+ // Ignore cleanup errors
71
+ }
72
+ throw (0, errors_1.createFileSystemError)('write', filePath, error);
73
+ }
74
+ }
75
+ /**
76
+ * Read resource file with validation
77
+ */
78
+ async readResource(filePath) {
79
+ try {
80
+ // Check if file exists
81
+ await fs.access(filePath, fsSync.constants.R_OK);
82
+ // Read file
83
+ const content = await fs.readFile(filePath, 'utf-8');
84
+ // Validate format
85
+ await this.validateResourceContent(filePath, content);
86
+ return content;
87
+ }
88
+ catch (error) {
89
+ throw (0, errors_1.createFileSystemError)('read', filePath, error);
90
+ }
91
+ }
92
+ /**
93
+ * Delete resource file with backup
94
+ */
95
+ async deleteResource(filePath) {
96
+ const backupPath = `${filePath}.backup`;
97
+ try {
98
+ // Create backup
99
+ if (fsSync.existsSync(filePath)) {
100
+ await fs.copyFile(filePath, backupPath);
101
+ }
102
+ // Delete file
103
+ await fs.unlink(filePath);
104
+ // Remove backup on success
105
+ try {
106
+ await fs.unlink(backupPath);
107
+ }
108
+ catch {
109
+ // Ignore backup cleanup errors
110
+ }
111
+ logger_1.logger.debug({ filePath }, 'Resource file deleted successfully');
112
+ }
113
+ catch (error) {
114
+ // Restore from backup on failure
115
+ try {
116
+ if (fsSync.existsSync(backupPath)) {
117
+ await fs.copyFile(backupPath, filePath);
118
+ await fs.unlink(backupPath);
119
+ }
120
+ }
121
+ catch {
122
+ // Ignore restore errors
123
+ }
124
+ throw (0, errors_1.createFileSystemError)('delete', filePath, error);
125
+ }
126
+ }
127
+ /**
128
+ * Validate resource content
129
+ */
130
+ async validateResourceContent(filePath, content) {
131
+ const ext = path.extname(filePath);
132
+ // Check if empty
133
+ if (!content || content.trim().length === 0) {
134
+ throw (0, errors_1.createValidationError)(filePath, ext, 'File content is empty');
135
+ }
136
+ // Validate based on file type
137
+ if (ext === '.json') {
138
+ try {
139
+ JSON.parse(content);
140
+ }
141
+ catch (error) {
142
+ throw (0, errors_1.createValidationError)(filePath, 'json', 'Invalid JSON format');
143
+ }
144
+ }
145
+ else if (ext === '.md') {
146
+ // Basic markdown validation (check for minimum content)
147
+ if (content.length < 10) {
148
+ throw (0, errors_1.createValidationError)(filePath, 'markdown', 'Markdown content too short');
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * Check if file exists
154
+ */
155
+ async fileExists(filePath) {
156
+ try {
157
+ await fs.access(filePath, fsSync.constants.F_OK);
158
+ return true;
159
+ }
160
+ catch {
161
+ return false;
162
+ }
163
+ }
164
+ /**
165
+ * List files in directory
166
+ */
167
+ async listFiles(dirPath, pattern) {
168
+ try {
169
+ const files = await fs.readdir(dirPath, { recursive: true });
170
+ if (pattern) {
171
+ return files.filter((file) => pattern.test(file));
172
+ }
173
+ return files;
174
+ }
175
+ catch (error) {
176
+ throw (0, errors_1.createFileSystemError)('list', dirPath, error);
177
+ }
178
+ }
179
+ /**
180
+ * Recursively scan a directory and return all text files as FileEntry[]
181
+ * Supported extensions: .md, .mdc, .txt, .yaml, .yml, .json
182
+ */
183
+ async scanDirectory(dirPath) {
184
+ const TEXT_EXTENSIONS = new Set(['.md', '.mdc', '.txt', '.yaml', '.yml', '.json']);
185
+ const results = [];
186
+ const walk = async (currentPath, relBase) => {
187
+ let entries;
188
+ try {
189
+ entries = await fs.readdir(currentPath, { withFileTypes: true });
190
+ }
191
+ catch (error) {
192
+ throw (0, errors_1.createFileSystemError)('list', currentPath, error);
193
+ }
194
+ for (const entry of entries) {
195
+ const fullPath = path.join(currentPath, entry.name);
196
+ const relPath = path.join(relBase, entry.name);
197
+ if (entry.isDirectory()) {
198
+ await walk(fullPath, relPath);
199
+ }
200
+ else if (entry.isFile()) {
201
+ const ext = path.extname(entry.name).toLowerCase();
202
+ if (TEXT_EXTENSIONS.has(ext)) {
203
+ try {
204
+ const content = await fs.readFile(fullPath, 'utf-8');
205
+ if (content.trim().length > 0) {
206
+ results.push({ path: relPath, content });
207
+ }
208
+ }
209
+ catch {
210
+ // Skip unreadable files silently
211
+ logger_1.logger.warn({ filePath: fullPath }, 'Skipped unreadable file during directory scan');
212
+ }
213
+ }
214
+ }
215
+ }
216
+ };
217
+ await walk(dirPath, '');
218
+ if (results.length === 0) {
219
+ throw (0, errors_1.createValidationError)(dirPath, 'directory', `No text files found in directory: ${dirPath}`);
220
+ }
221
+ logger_1.logger.debug({ dirPath, fileCount: results.length }, 'Directory scan completed');
222
+ return results;
223
+ }
224
+ /**
225
+ * Remove empty directories recursively
226
+ */
227
+ async removeEmptyDirs(dirPath) {
228
+ try {
229
+ const files = await fs.readdir(dirPath);
230
+ if (files.length === 0) {
231
+ await fs.rmdir(dirPath);
232
+ logger_1.logger.debug({ dirPath }, 'Empty directory removed');
233
+ // Check parent directory
234
+ const parentDir = path.dirname(dirPath);
235
+ if (parentDir !== dirPath) {
236
+ await this.removeEmptyDirs(parentDir);
237
+ }
238
+ }
239
+ }
240
+ catch (error) {
241
+ // Ignore errors (directory might not be empty or already deleted)
242
+ }
243
+ }
244
+ }
245
+ exports.filesystemManager = new FilesystemManager();
246
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/filesystem/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Multi-Source Git Manager
3
+ * Manages multiple AI Resources Git repositories efficiently
4
+ */
5
+ interface SyncResult {
6
+ source: string;
7
+ action: 'cloned' | 'pulled' | 'up-to-date' | 'skipped';
8
+ changes: number;
9
+ duration: number;
10
+ }
11
+ declare class MultiSourceGitManager {
12
+ private configPath;
13
+ private baseDir;
14
+ constructor(baseDir: string);
15
+ /**
16
+ * Load AI Resources configuration
17
+ */
18
+ private loadConfig;
19
+ /**
20
+ * Get all enabled sources (including default)
21
+ */
22
+ private getEnabledSources;
23
+ /**
24
+ * Check if a Git repository exists at the given path
25
+ */
26
+ private repositoryExists;
27
+ /**
28
+ * Get Git repository URL from existing repo
29
+ */
30
+ private getRepoUrl;
31
+ /**
32
+ * Clone a Git repository
33
+ */
34
+ private cloneRepository;
35
+ /**
36
+ * Pull latest changes using fetch + fast-forward merge.
37
+ *
38
+ * Deliberately avoids --depth=1 on fetch: shallow fetches truncate local
39
+ * history, causing "no merge base" divergence errors on subsequent pulls.
40
+ */
41
+ private pullRepository;
42
+ /**
43
+ * Sync a single source repository
44
+ */
45
+ private syncSource;
46
+ /**
47
+ * Sync all enabled sources
48
+ */
49
+ syncAllSources(): Promise<SyncResult[]>;
50
+ /**
51
+ * Read the files for a named Command or Skill resource from the local git
52
+ * checkout. Used when the CSP API download returns an empty `files` array
53
+ * (which is expected for Command/Skill resources in MCP Prompt mode — the
54
+ * API only stores metadata; actual file content lives in the git repo).
55
+ *
56
+ * Searches all enabled sources in priority order and returns the first match.
57
+ *
58
+ * @param resourceName The resource name as returned by the subscriptions API.
59
+ * @param resourceType 'command' | 'skill'
60
+ * @returns Array of { path, content } file entries, or [] when not found.
61
+ */
62
+ readResourceFiles(resourceName: string, resourceType: 'command' | 'skill' | 'rule' | 'mcp'): Promise<Array<{
63
+ path: string;
64
+ content: string;
65
+ }>>;
66
+ /**
67
+ * Check status of all sources without pulling
68
+ */
69
+ checkAllSources(): Promise<Array<{
70
+ source: string;
71
+ exists: boolean;
72
+ hasRemote: boolean;
73
+ repoUrl: string | null;
74
+ }>>;
75
+ }
76
+ export declare const multiSourceGitManager: MultiSourceGitManager;
77
+ export {};
78
+ //# sourceMappingURL=multi-source-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-source-manager.d.ts","sourceRoot":"","sources":["../../src/git/multi-source-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8BH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,cAAM,qBAAqB;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAK3B;;OAEG;YACW,UAAU;IASxB;;OAEG;YACW,iBAAiB;IAe/B;;OAEG;YACW,gBAAgB;IAU9B;;OAEG;YACW,UAAU;IAWxB;;OAEG;YACW,eAAe;IAwB7B;;;;;OAKG;YACW,cAAc;IAgI5B;;OAEG;YACW,UAAU;IA4GxB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAyC7C;;;;;;;;;;;OAWG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GACjD,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAoIpD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAC,CAAC;CAuBJ;AAqDD,eAAO,MAAM,qBAAqB,uBAA+C,CAAC"}