@1mcp/agent 0.16.0 → 0.17.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/README.md +37 -2
- package/build/commands/app/backups.d.ts +17 -0
- package/build/commands/app/backups.d.ts.map +1 -0
- package/build/commands/app/backups.js +162 -0
- package/build/commands/app/backups.js.map +1 -0
- package/build/commands/app/consolidate.d.ts +21 -0
- package/build/commands/app/consolidate.d.ts.map +1 -0
- package/build/commands/app/consolidate.js +383 -0
- package/build/commands/app/consolidate.js.map +1 -0
- package/build/commands/app/discover.d.ts +16 -0
- package/build/commands/app/discover.d.ts.map +1 -0
- package/build/commands/app/discover.js +79 -0
- package/build/commands/app/discover.js.map +1 -0
- package/build/commands/app/index.d.ts +12 -0
- package/build/commands/app/index.d.ts.map +1 -0
- package/build/commands/app/index.js +274 -0
- package/build/commands/app/index.js.map +1 -0
- package/build/commands/app/list.d.ts +16 -0
- package/build/commands/app/list.d.ts.map +1 -0
- package/build/commands/app/list.js +95 -0
- package/build/commands/app/list.js.map +1 -0
- package/build/commands/app/restore.d.ts +21 -0
- package/build/commands/app/restore.d.ts.map +1 -0
- package/build/commands/app/restore.js +265 -0
- package/build/commands/app/restore.js.map +1 -0
- package/build/commands/app/status.d.ts +16 -0
- package/build/commands/app/status.d.ts.map +1 -0
- package/build/commands/app/status.js +224 -0
- package/build/commands/app/status.js.map +1 -0
- package/build/commands/mcp/add.d.ts +19 -0
- package/build/commands/mcp/add.d.ts.map +1 -0
- package/build/commands/mcp/add.js +135 -0
- package/build/commands/mcp/add.js.map +1 -0
- package/build/commands/mcp/enable.d.ts +13 -0
- package/build/commands/mcp/enable.d.ts.map +1 -0
- package/build/commands/mcp/enable.js +100 -0
- package/build/commands/mcp/enable.js.map +1 -0
- package/build/commands/mcp/index.d.ts +12 -0
- package/build/commands/mcp/index.d.ts.map +1 -0
- package/build/commands/mcp/index.js +351 -0
- package/build/commands/mcp/index.js.map +1 -0
- package/build/commands/mcp/list.d.ts +11 -0
- package/build/commands/mcp/list.d.ts.map +1 -0
- package/build/commands/mcp/list.js +144 -0
- package/build/commands/mcp/list.js.map +1 -0
- package/build/commands/mcp/remove.d.ts +10 -0
- package/build/commands/mcp/remove.d.ts.map +1 -0
- package/build/commands/mcp/remove.js +89 -0
- package/build/commands/mcp/remove.js.map +1 -0
- package/build/commands/mcp/status.d.ts +10 -0
- package/build/commands/mcp/status.d.ts.map +1 -0
- package/build/commands/mcp/status.js +243 -0
- package/build/commands/mcp/status.js.map +1 -0
- package/build/commands/mcp/update.d.ts +18 -0
- package/build/commands/mcp/update.d.ts.map +1 -0
- package/build/commands/mcp/update.js +157 -0
- package/build/commands/mcp/update.js.map +1 -0
- package/build/commands/mcp/utils/configUtils.d.ts +64 -0
- package/build/commands/mcp/utils/configUtils.d.ts.map +1 -0
- package/build/commands/mcp/utils/configUtils.js +266 -0
- package/build/commands/mcp/utils/configUtils.js.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts +32 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js +61 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js.map +1 -0
- package/build/commands/mcp/utils/validation.d.ts +33 -0
- package/build/commands/mcp/utils/validation.d.ts.map +1 -0
- package/build/commands/mcp/utils/validation.js +235 -0
- package/build/commands/mcp/utils/validation.js.map +1 -0
- package/build/constants.d.ts +11 -2
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +15 -2
- package/build/constants.js.map +1 -1
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts +96 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts.map +1 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js +256 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js.map +1 -0
- package/build/core/capabilities/capabilityAggregator.d.ts +114 -0
- package/build/core/capabilities/capabilityAggregator.d.ts.map +1 -0
- package/build/core/capabilities/capabilityAggregator.js +234 -0
- package/build/core/capabilities/capabilityAggregator.js.map +1 -0
- package/build/core/client/clientManager.d.ts +28 -0
- package/build/core/client/clientManager.d.ts.map +1 -1
- package/build/core/client/clientManager.js +120 -0
- package/build/core/client/clientManager.js.map +1 -1
- package/build/core/loading/loadingStateTracker.d.ts +128 -0
- package/build/core/loading/loadingStateTracker.d.ts.map +1 -0
- package/build/core/loading/loadingStateTracker.js +209 -0
- package/build/core/loading/loadingStateTracker.js.map +1 -0
- package/build/core/loading/mcpLoadingManager.d.ts +139 -0
- package/build/core/loading/mcpLoadingManager.d.ts.map +1 -0
- package/build/core/loading/mcpLoadingManager.js +296 -0
- package/build/core/loading/mcpLoadingManager.js.map +1 -0
- package/build/core/notifications/notificationManager.d.ts +111 -0
- package/build/core/notifications/notificationManager.d.ts.map +1 -0
- package/build/core/notifications/notificationManager.js +232 -0
- package/build/core/notifications/notificationManager.js.map +1 -0
- package/build/core/server/agentConfig.d.ts +50 -0
- package/build/core/server/agentConfig.d.ts.map +1 -1
- package/build/core/server/agentConfig.js +68 -1
- package/build/core/server/agentConfig.js.map +1 -1
- package/build/core/server/serverManager.d.ts +1 -0
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +3 -0
- package/build/core/server/serverManager.js.map +1 -1
- package/build/index.js +115 -32
- package/build/index.js.map +1 -1
- package/build/server.d.ts +23 -2
- package/build/server.d.ts.map +1 -1
- package/build/server.js +83 -10
- package/build/server.js.map +1 -1
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts +79 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts.map +1 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js +243 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js.map +1 -0
- package/build/transport/http/routes/healthRoutes.d.ts +2 -1
- package/build/transport/http/routes/healthRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/healthRoutes.js +170 -1
- package/build/transport/http/routes/healthRoutes.js.map +1 -1
- package/build/transport/http/routes/sseRoutes.d.ts +2 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +13 -1
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts +2 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +13 -1
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts +7 -1
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +15 -4
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/transportFactory.d.ts +4 -0
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +1 -1
- package/build/transport/transportFactory.js.map +1 -1
- package/build/utils/appDiscovery.d.ts +75 -0
- package/build/utils/appDiscovery.d.ts.map +1 -0
- package/build/utils/appDiscovery.js +358 -0
- package/build/utils/appDiscovery.js.map +1 -0
- package/build/utils/appPresets.d.ts +88 -0
- package/build/utils/appPresets.d.ts.map +1 -0
- package/build/utils/appPresets.js +430 -0
- package/build/utils/appPresets.js.map +1 -0
- package/build/utils/backupManager.d.ts +61 -0
- package/build/utils/backupManager.d.ts.map +1 -0
- package/build/utils/backupManager.js +314 -0
- package/build/utils/backupManager.js.map +1 -0
- package/build/utils/urlDetection.d.ts +35 -0
- package/build/utils/urlDetection.d.ts.map +1 -0
- package/build/utils/urlDetection.js +115 -0
- package/build/utils/urlDetection.js.map +1 -0
- package/build/utils/validationHelpers.d.ts +62 -0
- package/build/utils/validationHelpers.d.ts.map +1 -0
- package/build/utils/validationHelpers.js +252 -0
- package/build/utils/validationHelpers.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import { getGlobalBackupDir, getAppBackupDir } from '../constants.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a backup of configuration file with metadata
|
|
8
|
+
*/
|
|
9
|
+
export function createBackup(configPath, app, operation, serverCount = 0) {
|
|
10
|
+
if (!fs.existsSync(configPath)) {
|
|
11
|
+
throw new Error(`Configuration file does not exist: ${configPath}`);
|
|
12
|
+
}
|
|
13
|
+
const timestamp = Date.now();
|
|
14
|
+
const dateStr = new Date(timestamp).toISOString().replace(/[:.-]/g, '').slice(0, 15); // YYYYMMDDTHHMMSS
|
|
15
|
+
// Create app-specific backup directory
|
|
16
|
+
const appBackupDir = getAppBackupDir(app);
|
|
17
|
+
fs.mkdirSync(appBackupDir, { recursive: true });
|
|
18
|
+
// Use descriptive filename in centralized location
|
|
19
|
+
const backupFileName = `${dateStr}_${operation}.backup`;
|
|
20
|
+
const backupPath = path.join(appBackupDir, backupFileName);
|
|
21
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
22
|
+
const checksum = crypto.createHash('sha256').update(content).digest('hex');
|
|
23
|
+
const stats = fs.statSync(configPath);
|
|
24
|
+
// Create backup file
|
|
25
|
+
fs.copyFileSync(configPath, backupPath);
|
|
26
|
+
const backupInfo = {
|
|
27
|
+
originalPath: configPath,
|
|
28
|
+
backupPath,
|
|
29
|
+
timestamp,
|
|
30
|
+
checksum,
|
|
31
|
+
metadata: {
|
|
32
|
+
app,
|
|
33
|
+
operation,
|
|
34
|
+
version: process.env.npm_package_version || 'unknown',
|
|
35
|
+
serverCount,
|
|
36
|
+
fileSize: stats.size,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
// Store backup metadata
|
|
40
|
+
const metaPath = `${backupPath}.meta`;
|
|
41
|
+
fs.writeFileSync(metaPath, JSON.stringify(backupInfo, null, 2));
|
|
42
|
+
return backupInfo;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Rollback from backup file
|
|
46
|
+
*/
|
|
47
|
+
export async function rollbackFromBackup(backup) {
|
|
48
|
+
if (!fs.existsSync(backup.backupPath)) {
|
|
49
|
+
throw new Error(`Backup file not found: ${backup.backupPath}`);
|
|
50
|
+
}
|
|
51
|
+
// Verify backup integrity
|
|
52
|
+
const backupContent = fs.readFileSync(backup.backupPath, 'utf8');
|
|
53
|
+
const currentChecksum = crypto.createHash('sha256').update(backupContent).digest('hex');
|
|
54
|
+
if (currentChecksum !== backup.checksum) {
|
|
55
|
+
throw new Error('Backup file integrity check failed - checksum mismatch');
|
|
56
|
+
}
|
|
57
|
+
// Restore original file
|
|
58
|
+
fs.copyFileSync(backup.backupPath, backup.originalPath);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Rollback from backup file path
|
|
62
|
+
*/
|
|
63
|
+
export async function rollbackFromBackupPath(backupPath) {
|
|
64
|
+
const metaPath = `${backupPath}.meta`;
|
|
65
|
+
if (!fs.existsSync(metaPath)) {
|
|
66
|
+
throw new Error(`Backup metadata not found: ${metaPath}`);
|
|
67
|
+
}
|
|
68
|
+
const metaContent = fs.readFileSync(metaPath, 'utf8');
|
|
69
|
+
const backupInfo = JSON.parse(metaContent);
|
|
70
|
+
await rollbackFromBackup(backupInfo);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* List all available backups for a specific app
|
|
74
|
+
*/
|
|
75
|
+
export function listAppBackups(app) {
|
|
76
|
+
const backups = [];
|
|
77
|
+
// First, check the centralized backup directory (most efficient)
|
|
78
|
+
const centralBackupDir = getGlobalBackupDir();
|
|
79
|
+
if (fs.existsSync(centralBackupDir)) {
|
|
80
|
+
if (app) {
|
|
81
|
+
// Search specific app directory
|
|
82
|
+
const appBackupDir = getAppBackupDir(app);
|
|
83
|
+
scanBackupsInDirectory(appBackupDir, backups, app);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Search all app directories
|
|
87
|
+
try {
|
|
88
|
+
const appDirs = fs.readdirSync(centralBackupDir);
|
|
89
|
+
for (const appDir of appDirs) {
|
|
90
|
+
const appBackupPath = path.join(centralBackupDir, appDir);
|
|
91
|
+
if (fs.statSync(appBackupPath).isDirectory()) {
|
|
92
|
+
scanBackupsInDirectory(appBackupPath, backups);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (_error) {
|
|
97
|
+
// Skip if can't read central directory
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Then check legacy locations for existing backups
|
|
102
|
+
const legacyPaths = getBackupSearchPaths().slice(1); // Skip central directory (already checked)
|
|
103
|
+
for (const searchPath of legacyPaths) {
|
|
104
|
+
scanBackupsInDirectory(searchPath, backups, app);
|
|
105
|
+
}
|
|
106
|
+
// Sort by timestamp (newest first)
|
|
107
|
+
backups.sort((a, b) => b.timestamp - a.timestamp);
|
|
108
|
+
return backups;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Scan a directory for backup files
|
|
112
|
+
*/
|
|
113
|
+
function scanBackupsInDirectory(dirPath, backups, filterApp) {
|
|
114
|
+
if (!fs.existsSync(dirPath)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const files = fs.readdirSync(dirPath);
|
|
119
|
+
for (const file of files) {
|
|
120
|
+
if (file.endsWith('.backup.meta')) {
|
|
121
|
+
const metaPath = path.join(dirPath, file);
|
|
122
|
+
try {
|
|
123
|
+
const metaContent = fs.readFileSync(metaPath, 'utf8');
|
|
124
|
+
const backupInfo = JSON.parse(metaContent);
|
|
125
|
+
// Filter by app if specified
|
|
126
|
+
if (filterApp && backupInfo.metadata.app !== filterApp) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const backupPath = backupInfo.backupPath;
|
|
130
|
+
// Check if backup file still exists
|
|
131
|
+
if (!fs.existsSync(backupPath)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
backups.push({
|
|
135
|
+
app: backupInfo.metadata.app,
|
|
136
|
+
backupPath,
|
|
137
|
+
metaPath,
|
|
138
|
+
timestamp: backupInfo.timestamp,
|
|
139
|
+
operation: backupInfo.metadata.operation,
|
|
140
|
+
serverCount: backupInfo.metadata.serverCount,
|
|
141
|
+
age: formatAge(backupInfo.timestamp),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (_error) {
|
|
145
|
+
// Skip invalid metadata files
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (_error) {
|
|
152
|
+
// Skip directories we can't read
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get search paths for backup files
|
|
158
|
+
*/
|
|
159
|
+
function getBackupSearchPaths() {
|
|
160
|
+
const paths = [
|
|
161
|
+
// Primary location: centralized backup directory
|
|
162
|
+
getGlobalBackupDir(),
|
|
163
|
+
];
|
|
164
|
+
// Legacy fallback locations for existing backups
|
|
165
|
+
const homeDir = os.homedir();
|
|
166
|
+
// Add current directory as fallback
|
|
167
|
+
paths.push(process.cwd());
|
|
168
|
+
// Add common app config directories as fallback
|
|
169
|
+
if (process.platform === 'darwin') {
|
|
170
|
+
paths.push(path.join(homeDir, 'Library/Application Support/Claude'), path.join(homeDir, '.cursor'), path.join(homeDir, '.vscode'));
|
|
171
|
+
}
|
|
172
|
+
else if (process.platform === 'win32') {
|
|
173
|
+
const appData = process.env.APPDATA || '';
|
|
174
|
+
if (appData) {
|
|
175
|
+
paths.push(path.join(appData, 'Claude'), path.join(homeDir, '.cursor'), path.join(homeDir, '.vscode'));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
paths.push(path.join(homeDir, '.config/claude'), path.join(homeDir, '.cursor'), path.join(homeDir, '.vscode'), path.join(homeDir, '.config/cline'));
|
|
180
|
+
}
|
|
181
|
+
return paths.filter((p) => typeof p === 'string' && p.length > 0);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Find backup by metadata file path
|
|
185
|
+
*/
|
|
186
|
+
export function findBackupByMetaPath(metaPath) {
|
|
187
|
+
try {
|
|
188
|
+
if (!fs.existsSync(metaPath)) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
const metaContent = fs.readFileSync(metaPath, 'utf8');
|
|
192
|
+
const backupInfo = JSON.parse(metaContent);
|
|
193
|
+
// Verify backup file exists
|
|
194
|
+
if (!fs.existsSync(backupInfo.backupPath)) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return backupInfo;
|
|
198
|
+
}
|
|
199
|
+
catch (_error) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Clean up old backups (older than specified days)
|
|
205
|
+
*/
|
|
206
|
+
export function cleanupOldBackups(maxAgeDays = 30) {
|
|
207
|
+
const backups = listAppBackups();
|
|
208
|
+
const cutoffTime = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;
|
|
209
|
+
let cleanedCount = 0;
|
|
210
|
+
for (const backup of backups) {
|
|
211
|
+
if (backup.timestamp < cutoffTime) {
|
|
212
|
+
try {
|
|
213
|
+
// Remove backup file
|
|
214
|
+
if (fs.existsSync(backup.backupPath)) {
|
|
215
|
+
fs.unlinkSync(backup.backupPath);
|
|
216
|
+
}
|
|
217
|
+
// Remove metadata file
|
|
218
|
+
if (fs.existsSync(backup.metaPath)) {
|
|
219
|
+
fs.unlinkSync(backup.metaPath);
|
|
220
|
+
}
|
|
221
|
+
cleanedCount++;
|
|
222
|
+
}
|
|
223
|
+
catch (_error) {
|
|
224
|
+
// Skip files we can't delete
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return cleanedCount;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Verify backup integrity
|
|
233
|
+
*/
|
|
234
|
+
export function verifyBackupIntegrity(backupInfo) {
|
|
235
|
+
try {
|
|
236
|
+
if (!fs.existsSync(backupInfo.backupPath)) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
const content = fs.readFileSync(backupInfo.backupPath, 'utf8');
|
|
240
|
+
const checksum = crypto.createHash('sha256').update(content).digest('hex');
|
|
241
|
+
return checksum === backupInfo.checksum;
|
|
242
|
+
}
|
|
243
|
+
catch (_error) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Format backup age for display
|
|
249
|
+
*/
|
|
250
|
+
function formatAge(timestamp) {
|
|
251
|
+
const now = Date.now();
|
|
252
|
+
const diffMs = now - timestamp;
|
|
253
|
+
const diffMinutes = Math.floor(diffMs / (1000 * 60));
|
|
254
|
+
const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
|
|
255
|
+
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
256
|
+
if (diffMinutes < 1) {
|
|
257
|
+
return 'just now';
|
|
258
|
+
}
|
|
259
|
+
else if (diffMinutes < 60) {
|
|
260
|
+
return `${diffMinutes}m ago`;
|
|
261
|
+
}
|
|
262
|
+
else if (diffHours < 24) {
|
|
263
|
+
return `${diffHours}h ago`;
|
|
264
|
+
}
|
|
265
|
+
else if (diffDays < 7) {
|
|
266
|
+
return `${diffDays}d ago`;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const date = new Date(timestamp);
|
|
270
|
+
return date.toLocaleDateString();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* File locking mechanism for atomic operations
|
|
275
|
+
*/
|
|
276
|
+
export async function withFileLock(filePath, operation) {
|
|
277
|
+
const lockPath = `${filePath}.lock`;
|
|
278
|
+
// Simple file-based locking mechanism
|
|
279
|
+
let lockAcquired = false;
|
|
280
|
+
const maxRetries = 10;
|
|
281
|
+
const retryDelay = 100;
|
|
282
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
283
|
+
try {
|
|
284
|
+
fs.writeFileSync(lockPath, process.pid.toString(), { flag: 'wx' });
|
|
285
|
+
lockAcquired = true;
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
if (error.code === 'EEXIST') {
|
|
290
|
+
// Lock file exists, wait and retry
|
|
291
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
throw error;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (!lockAcquired) {
|
|
298
|
+
throw new Error(`Failed to acquire lock for ${filePath} after ${maxRetries} retries`);
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
301
|
+
const result = await operation();
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
// Clean up lock file
|
|
306
|
+
try {
|
|
307
|
+
fs.unlinkSync(lockPath);
|
|
308
|
+
}
|
|
309
|
+
catch (_error) {
|
|
310
|
+
// Ignore cleanup errors
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=backupManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backupManager.js","sourceRoot":"","sources":["../../src/utils/backupManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-method URL detection system for app commands.
|
|
3
|
+
*
|
|
4
|
+
* Since app commands run standalone (not within serving process),
|
|
5
|
+
* the AgentConfigManager singleton isn't available. This module
|
|
6
|
+
* provides alternative detection methods with priority-based fallback.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Method 1: Detect URL from CLI arguments (highest priority)
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectUrlFromCliArgs(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Method 2: Detect running server on common ports
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectRunningServerUrl(): Promise<string | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Method 3: Detect URL from environment variables
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectUrlFromEnv(): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Method 4: Combined detection with priority fallback (primary implementation)
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectServer1mcpUrl(): Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Method 5: Get URL with user override (for command-specific URLs)
|
|
26
|
+
*/
|
|
27
|
+
export declare function getServer1mcpUrl(userOverrideUrl?: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Validate that a URL is accessible and appears to be a 1mcp server
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateServer1mcpUrl(url: string): Promise<{
|
|
32
|
+
valid: boolean;
|
|
33
|
+
error?: string;
|
|
34
|
+
}>;
|
|
35
|
+
//# sourceMappingURL=urlDetection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlDetection.d.ts","sourceRoot":"","sources":["../../src/utils/urlDetection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAiB7C;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAShD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAe3D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CA2BD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-method URL detection system for app commands.
|
|
3
|
+
*
|
|
4
|
+
* Since app commands run standalone (not within serving process),
|
|
5
|
+
* the AgentConfigManager singleton isn't available. This module
|
|
6
|
+
* provides alternative detection methods with priority-based fallback.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Method 1: Detect URL from CLI arguments (highest priority)
|
|
10
|
+
*/
|
|
11
|
+
export function detectUrlFromCliArgs() {
|
|
12
|
+
const args = process.argv;
|
|
13
|
+
// Parse external-url flag
|
|
14
|
+
const externalUrlIndex = args.findIndex((arg) => arg === '--external-url' || arg === '-u');
|
|
15
|
+
if (externalUrlIndex !== -1 && args[externalUrlIndex + 1]) {
|
|
16
|
+
return `${args[externalUrlIndex + 1]}/mcp`;
|
|
17
|
+
}
|
|
18
|
+
// Parse host and port
|
|
19
|
+
const hostIndex = args.findIndex((arg) => arg === '--host' || arg === '-H');
|
|
20
|
+
const portIndex = args.findIndex((arg) => arg === '--port' || arg === '-P');
|
|
21
|
+
const host = hostIndex !== -1 && args[hostIndex + 1] ? args[hostIndex + 1] : 'localhost';
|
|
22
|
+
const port = portIndex !== -1 && args[portIndex + 1] ? args[portIndex + 1] : '3050';
|
|
23
|
+
return `http://${host}:${port}/mcp`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Method 2: Detect running server on common ports
|
|
27
|
+
*/
|
|
28
|
+
export async function detectRunningServerUrl() {
|
|
29
|
+
// Try common ports and check /oauth endpoint (which always exists)
|
|
30
|
+
const commonPorts = [3050, 3051, 3052];
|
|
31
|
+
for (const port of commonPorts) {
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetch(`http://localhost:${port}/oauth/`, {
|
|
34
|
+
signal: AbortSignal.timeout(2000),
|
|
35
|
+
});
|
|
36
|
+
if (response.ok) {
|
|
37
|
+
return `http://localhost:${port}/mcp`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Continue to next port
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Method 3: Detect URL from environment variables
|
|
48
|
+
*/
|
|
49
|
+
export function detectUrlFromEnv() {
|
|
50
|
+
const externalUrl = process.env.ONE_MCP_EXTERNAL_URL;
|
|
51
|
+
if (externalUrl) {
|
|
52
|
+
return `${externalUrl}/mcp`;
|
|
53
|
+
}
|
|
54
|
+
const host = process.env.ONE_MCP_HOST || 'localhost';
|
|
55
|
+
const port = process.env.ONE_MCP_PORT || '3050';
|
|
56
|
+
return `http://${host}:${port}/mcp`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Method 4: Combined detection with priority fallback (primary implementation)
|
|
60
|
+
*/
|
|
61
|
+
export async function detectServer1mcpUrl() {
|
|
62
|
+
// 1. Try CLI args first (highest priority)
|
|
63
|
+
const cliUrl = detectUrlFromCliArgs();
|
|
64
|
+
if (cliUrl !== 'http://localhost:3050/mcp')
|
|
65
|
+
return cliUrl; // Only use if non-default
|
|
66
|
+
// 2. Try running server detection
|
|
67
|
+
const runningUrl = await detectRunningServerUrl();
|
|
68
|
+
if (runningUrl)
|
|
69
|
+
return runningUrl;
|
|
70
|
+
// 3. Try environment variables
|
|
71
|
+
const envUrl = detectUrlFromEnv();
|
|
72
|
+
if (envUrl && envUrl !== 'http://localhost:3050/mcp')
|
|
73
|
+
return envUrl;
|
|
74
|
+
// 4. Default fallback
|
|
75
|
+
return 'http://localhost:3050/mcp';
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Method 5: Get URL with user override (for command-specific URLs)
|
|
79
|
+
*/
|
|
80
|
+
export async function getServer1mcpUrl(userOverrideUrl) {
|
|
81
|
+
if (userOverrideUrl) {
|
|
82
|
+
// Ensure URL ends with /mcp if not already present
|
|
83
|
+
return userOverrideUrl.endsWith('/mcp') ? userOverrideUrl : `${userOverrideUrl}/mcp`;
|
|
84
|
+
}
|
|
85
|
+
return await detectServer1mcpUrl();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate that a URL is accessible and appears to be a 1mcp server
|
|
89
|
+
*/
|
|
90
|
+
export async function validateServer1mcpUrl(url) {
|
|
91
|
+
try {
|
|
92
|
+
// Remove /mcp suffix to test base URL
|
|
93
|
+
const baseUrl = url.replace('/mcp', '');
|
|
94
|
+
// Test basic connectivity to OAuth endpoint (which always exists)
|
|
95
|
+
const oauthResponse = await fetch(`${baseUrl}/oauth/`, {
|
|
96
|
+
signal: AbortSignal.timeout(5000),
|
|
97
|
+
});
|
|
98
|
+
if (!oauthResponse.ok) {
|
|
99
|
+
return {
|
|
100
|
+
valid: false,
|
|
101
|
+
error: `1mcp server not responding (HTTP ${oauthResponse.status})`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// For MCP endpoint, we just verify OAuth is working since MCP requires POST with specific payload
|
|
105
|
+
// The OAuth endpoint responding successfully indicates the server is properly running
|
|
106
|
+
return { valid: true };
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return {
|
|
110
|
+
valid: false,
|
|
111
|
+
error: `Cannot connect to 1mcp server: ${error.message}`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=urlDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlDetection.js","sourceRoot":"","sources":["../../src/utils/urlDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for app configuration consolidation.
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive validation for configuration files,
|
|
5
|
+
* server connectivity, and permission handling.
|
|
6
|
+
*/
|
|
7
|
+
export interface ValidationResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
errors: string[];
|
|
10
|
+
warnings: string[];
|
|
11
|
+
fixable: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface OperationPreview {
|
|
14
|
+
app: string;
|
|
15
|
+
configPath: string;
|
|
16
|
+
serversToImport: string[];
|
|
17
|
+
replacementUrl: string;
|
|
18
|
+
backupPath: string;
|
|
19
|
+
risks: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Validate application configuration file
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateAppConfig(configPath: string, content: any): ValidationResult;
|
|
25
|
+
/**
|
|
26
|
+
* Validate 1mcp server connectivity
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateServer1mcpConnection(url: string): Promise<ValidationResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Handle file permission errors with specific diagnostics
|
|
31
|
+
*/
|
|
32
|
+
export declare function handlePermissionError(filePath: string, error: any): string;
|
|
33
|
+
/**
|
|
34
|
+
* Validate file system permissions for configuration operations
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateFilePermissions(configPath: string): ValidationResult;
|
|
37
|
+
/**
|
|
38
|
+
* Generate operation preview for user confirmation
|
|
39
|
+
*/
|
|
40
|
+
export declare function generateOperationPreview(app: string, configPath: string, serversToImport: string[], replacementUrl: string, backupPath: string): OperationPreview;
|
|
41
|
+
/**
|
|
42
|
+
* Validate operation before execution
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateOperation(configPath: string, content: any, serverUrl: string): Promise<{
|
|
45
|
+
configValidation: ValidationResult;
|
|
46
|
+
permissionValidation: ValidationResult;
|
|
47
|
+
connectivityValidation: ValidationResult;
|
|
48
|
+
canProceed: boolean;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Validate that a path is safe (prevent path traversal attacks)
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateSafePath(filePath: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Validate JSON content safely
|
|
56
|
+
*/
|
|
57
|
+
export declare function validateJsonContent(content: string): {
|
|
58
|
+
valid: boolean;
|
|
59
|
+
parsed?: any;
|
|
60
|
+
error?: string;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=validationHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationHelpers.d.ts","sourceRoot":"","sources":["../../src/utils/validationHelpers.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,gBAAgB,CAyDpF;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkCzF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,CA2C1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA2C5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EAAE,EACzB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GACjB,gBAAgB,CAwBlB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IACT,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,EAAE,gBAAgB,CAAC;IACvC,sBAAsB,EAAE,gBAAgB,CAAC;IACzC,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC,CAaD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAoB1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAUrG"}
|