@elliotding/ai-agent-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/cached-client.d.ts +48 -0
- package/dist/api/cached-client.d.ts.map +1 -0
- package/dist/api/cached-client.js +126 -0
- package/dist/api/cached-client.js.map +1 -0
- package/dist/api/client.d.ts +213 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +326 -0
- package/dist/api/client.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +26 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +36 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +194 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/permissions.d.ts +60 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +256 -0
- package/dist/auth/permissions.js.map +1 -0
- package/dist/auth/token-validator.d.ts +52 -0
- package/dist/auth/token-validator.d.ts.map +1 -0
- package/dist/auth/token-validator.js +217 -0
- package/dist/auth/token-validator.js.map +1 -0
- package/dist/cache/cache-manager.d.ts +49 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +191 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/redis-client.d.ts +45 -0
- package/dist/cache/redis-client.d.ts.map +1 -0
- package/dist/cache/redis-client.js +210 -0
- package/dist/cache/redis-client.js.map +1 -0
- package/dist/config/constants.d.ts +28 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +54 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +168 -0
- package/dist/config/index.js.map +1 -0
- package/dist/filesystem/manager.d.ts +45 -0
- package/dist/filesystem/manager.d.ts.map +1 -0
- package/dist/filesystem/manager.js +246 -0
- package/dist/filesystem/manager.js.map +1 -0
- package/dist/git/multi-source-manager.d.ts +62 -0
- package/dist/git/multi-source-manager.d.ts.map +1 -0
- package/dist/git/multi-source-manager.js +293 -0
- package/dist/git/multi-source-manager.js.map +1 -0
- package/dist/git/operations.d.ts +27 -0
- package/dist/git/operations.d.ts.map +1 -0
- package/dist/git/operations.js +83 -0
- package/dist/git/operations.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/monitoring/health.d.ts +35 -0
- package/dist/monitoring/health.d.ts.map +1 -0
- package/dist/monitoring/health.js +105 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +10 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/loader.d.ts +87 -0
- package/dist/resources/loader.d.ts.map +1 -0
- package/dist/resources/loader.js +452 -0
- package/dist/resources/loader.js.map +1 -0
- package/dist/server/http.d.ts +57 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +336 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +157 -0
- package/dist/server.js.map +1 -0
- package/dist/session/manager.d.ts +91 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +251 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/manage-subscription.d.ts +43 -0
- package/dist/tools/manage-subscription.d.ts.map +1 -0
- package/dist/tools/manage-subscription.js +268 -0
- package/dist/tools/manage-subscription.js.map +1 -0
- package/dist/tools/registry.d.ts +40 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +85 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-resources.d.ts +31 -0
- package/dist/tools/search-resources.d.ts.map +1 -0
- package/dist/tools/search-resources.js +154 -0
- package/dist/tools/search-resources.js.map +1 -0
- package/dist/tools/sync-resources.d.ts +41 -0
- package/dist/tools/sync-resources.d.ts.map +1 -0
- package/dist/tools/sync-resources.js +606 -0
- package/dist/tools/sync-resources.js.map +1 -0
- package/dist/tools/uninstall-resource.d.ts +30 -0
- package/dist/tools/uninstall-resource.d.ts.map +1 -0
- package/dist/tools/uninstall-resource.js +259 -0
- package/dist/tools/uninstall-resource.js.map +1 -0
- package/dist/tools/upload-resource.d.ts +77 -0
- package/dist/tools/upload-resource.d.ts.map +1 -0
- package/dist/tools/upload-resource.js +252 -0
- package/dist/tools/upload-resource.js.map +1 -0
- package/dist/transport/sse.d.ts +29 -0
- package/dist/transport/sse.d.ts.map +1 -0
- package/dist/transport/sse.js +271 -0
- package/dist/transport/sse.js.map +1 -0
- package/dist/types/errors.d.ts +60 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +112 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +50 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +6 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/resources.d.ts +109 -0
- package/dist/types/resources.d.ts.map +1 -0
- package/dist/types/resources.js +7 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/tools.d.ts +147 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +6 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/cursor-paths.d.ts +49 -0
- package/dist/utils/cursor-paths.d.ts.map +1 -0
- package/dist/utils/cursor-paths.js +116 -0
- package/dist/utils/cursor-paths.js.map +1 -0
- package/dist/utils/log-cleaner.d.ts +18 -0
- package/dist/utils/log-cleaner.d.ts.map +1 -0
- package/dist/utils/log-cleaner.js +112 -0
- package/dist/utils/log-cleaner.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +292 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +58 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +214 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +58 -0
- package/src/api/cached-client.ts +144 -0
- package/src/api/client.ts +578 -0
- package/src/auth/index.ts +11 -0
- package/src/auth/middleware.ts +244 -0
- package/src/auth/permissions.ts +317 -0
- package/src/auth/token-validator.ts +294 -0
- package/src/cache/cache-manager.ts +243 -0
- package/src/cache/index.ts +6 -0
- package/src/cache/redis-client.ts +249 -0
- package/src/config/constants.ts +33 -0
- package/src/config/index.ts +228 -0
- package/src/filesystem/manager.ts +235 -0
- package/src/git/multi-source-manager.ts +333 -0
- package/src/git/operations.ts +93 -0
- package/src/index.ts +139 -0
- package/src/monitoring/health.ts +132 -0
- package/src/resources/index.ts +13 -0
- package/src/resources/loader.ts +530 -0
- package/src/server/http.ts +427 -0
- package/src/server.ts +191 -0
- package/src/session/manager.ts +296 -0
- package/src/tools/index.ts +11 -0
- package/src/tools/manage-subscription.ts +332 -0
- package/src/tools/registry.ts +97 -0
- package/src/tools/search-resources.ts +177 -0
- package/src/tools/sync-resources.ts +662 -0
- package/src/tools/uninstall-resource.ts +248 -0
- package/src/tools/upload-resource.ts +258 -0
- package/src/transport/sse.ts +308 -0
- package/src/types/errors.ts +146 -0
- package/src/types/index.ts +7 -0
- package/src/types/mcp.ts +61 -0
- package/src/types/resources.ts +141 -0
- package/src/types/tools.ts +175 -0
- package/src/utils/cursor-paths.ts +83 -0
- package/src/utils/log-cleaner.ts +92 -0
- package/src/utils/logger.ts +333 -0
- package/src/utils/validation.ts +262 -0
|
@@ -0,0 +1,168 @@
|
|
|
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
|
+
// Debug: Log CSP_API_TOKEN to verify it was loaded
|
|
100
|
+
console.log(`🔑 CSP_API_TOKEN from env: ${process.env.CSP_API_TOKEN ? process.env.CSP_API_TOKEN.substring(0, 20) + '...' : 'NOT SET'}`);
|
|
101
|
+
return {
|
|
102
|
+
nodeEnv,
|
|
103
|
+
port: getEnvNumber('PORT', 5090),
|
|
104
|
+
logLevel,
|
|
105
|
+
transport: {
|
|
106
|
+
mode: transportMode,
|
|
107
|
+
},
|
|
108
|
+
http: transportMode === 'sse' ? {
|
|
109
|
+
host: getEnv('HTTP_HOST', '0.0.0.0'),
|
|
110
|
+
port: getEnvNumber('HTTP_PORT', 3000),
|
|
111
|
+
} : undefined,
|
|
112
|
+
session: transportMode === 'sse' ? {
|
|
113
|
+
timeout: getEnvNumber('SESSION_TIMEOUT', 3600),
|
|
114
|
+
} : undefined,
|
|
115
|
+
csp: {
|
|
116
|
+
apiBaseUrl: getEnv('CSP_API_BASE_URL', 'https://csp.example.com'),
|
|
117
|
+
apiToken: getEnv('CSP_API_TOKEN', 'test-token-12345'),
|
|
118
|
+
timeout: getEnvNumber('CSP_API_TIMEOUT', 30000),
|
|
119
|
+
},
|
|
120
|
+
git: {
|
|
121
|
+
userName: getEnv('GIT_USER_NAME', 'CSP Agent'),
|
|
122
|
+
userEmail: getEnv('GIT_USER_EMAIL', 'agent@example.com'),
|
|
123
|
+
},
|
|
124
|
+
resource: {},
|
|
125
|
+
cache: {
|
|
126
|
+
enabled: getEnvBoolean('ENABLE_CACHE', true),
|
|
127
|
+
redis: process.env.REDIS_URL
|
|
128
|
+
? {
|
|
129
|
+
url: process.env.REDIS_URL,
|
|
130
|
+
ttl: getEnvNumber('REDIS_TTL', 900),
|
|
131
|
+
}
|
|
132
|
+
: undefined,
|
|
133
|
+
memory: {
|
|
134
|
+
maxSize: getEnvNumber('CACHE_MAX_SIZE', 100),
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
database: process.env.DATABASE_URL
|
|
138
|
+
? {
|
|
139
|
+
url: process.env.DATABASE_URL,
|
|
140
|
+
}
|
|
141
|
+
: undefined,
|
|
142
|
+
metrics: {
|
|
143
|
+
enabled: getEnvBoolean('ENABLE_METRICS', true),
|
|
144
|
+
port: process.env.METRICS_PORT ? getEnvNumber('METRICS_PORT') : undefined,
|
|
145
|
+
},
|
|
146
|
+
logging: {
|
|
147
|
+
dir: getEnv('LOG_DIR', '../Logs'),
|
|
148
|
+
retentionDays: getEnvNumber('LOG_RETENTION_DAYS', 3),
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// Validate configuration on load
|
|
153
|
+
let config;
|
|
154
|
+
try {
|
|
155
|
+
exports.config = config = loadConfig();
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
// Use logger for consistent error reporting
|
|
159
|
+
const logger = require('../utils/logger').logger;
|
|
160
|
+
logger.error({
|
|
161
|
+
type: 'config',
|
|
162
|
+
operation: 'load_config',
|
|
163
|
+
error: error.message,
|
|
164
|
+
stack: error.stack
|
|
165
|
+
}, 'Configuration loading failed');
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
//# 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,62 @@
|
|
|
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
|
+
* Check status of all sources without pulling
|
|
52
|
+
*/
|
|
53
|
+
checkAllSources(): Promise<Array<{
|
|
54
|
+
source: string;
|
|
55
|
+
exists: boolean;
|
|
56
|
+
hasRemote: boolean;
|
|
57
|
+
repoUrl: string | null;
|
|
58
|
+
}>>;
|
|
59
|
+
}
|
|
60
|
+
export declare const multiSourceGitManager: MultiSourceGitManager;
|
|
61
|
+
export {};
|
|
62
|
+
//# 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;IA+C5B;;OAEG;YACW,UAAU;IAgExB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAyC7C;;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;AAID,eAAO,MAAM,qBAAqB,uBAA+C,CAAC"}
|