mcp-swarm 1.1.0 → 1.1.2
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/.prettierignore +6 -0
- package/.prettierrc +8 -0
- package/CHANGELOG.md +35 -0
- package/CHANGELOG.ru.md +35 -0
- package/dist/companion.js +73 -127
- package/dist/companion.js.map +1 -1
- package/dist/dashboard.js +143 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/doctor.js +243 -0
- package/dist/doctor.js.map +1 -0
- package/dist/fileLogger.js +99 -0
- package/dist/fileLogger.js.map +1 -0
- package/dist/fsSandbox.js +81 -0
- package/dist/fsSandbox.js.map +1 -0
- package/eslint.config.js +15 -0
- package/package.json +12 -3
package/.prettierignore
ADDED
package/.prettierrc
ADDED
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [1.1.2] - 2026-02-09
|
|
13
|
+
|
|
14
|
+
### 🏗️ Code Quality & Security
|
|
15
|
+
|
|
16
|
+
#### Added
|
|
17
|
+
|
|
18
|
+
- **ESLint + Prettier** — Full linting and formatting setup with `typescript-eslint`. New npm scripts: `lint`, `lint:fix`, `format`, `format:check`.
|
|
19
|
+
- **fs-sandbox** — File system sandbox module (`src/fsSandbox.ts`) restricts agent file operations to the project boundary, preventing path-traversal attacks.
|
|
20
|
+
|
|
21
|
+
#### Changed
|
|
22
|
+
|
|
23
|
+
- **Dashboard refactoring** — Extracted 133-line inline HTML from `companion.ts` into dedicated `dashboard.ts` module. Companion is now 700 lines (was 820).
|
|
24
|
+
- **ESLint config** — Flat config (`eslint.config.js`) with TypeScript support, ignoring `dist/`, `node_modules/`, `dashboard/`, `cloudflare/`.
|
|
25
|
+
- **Prettier config** — `.prettierrc` with 120-char line width, double quotes, trailing commas, LF line endings.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## [1.1.1] - 2026-02-09
|
|
30
|
+
|
|
31
|
+
### 🔭 Observability & Control
|
|
32
|
+
|
|
33
|
+
#### Added
|
|
34
|
+
|
|
35
|
+
- **File Logging** — All companion logs written to `~/.mcp-swarm/logs/companion-YYYY-MM-DD.log` with automatic 7-day rotation.
|
|
36
|
+
- **`mcp-swarm-doctor`** — New CLI self-diagnostics tool. Checks Node.js, Git, companion status, port, logs, Hub URL, IDE configs, and npm version.
|
|
37
|
+
- **Interactive Dashboard** — Buttons for Pause/Resume/Shutdown/Copy Project ID directly in the web dashboard at `http://localhost:37373`. Toast notifications for action feedback.
|
|
38
|
+
- **Auto-Update Notifier** — On startup, companion checks npm registry and warns if a newer version is available.
|
|
39
|
+
|
|
40
|
+
#### Changed
|
|
41
|
+
|
|
42
|
+
- **Graceful shutdown** now properly closes file log streams before exit.
|
|
43
|
+
- **Dashboard footer** updated to v1.1.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
12
47
|
## [1.1.0] - 2026-02-09
|
|
13
48
|
|
|
14
49
|
### 🐝 Web Dashboard + DX Improvements
|
package/CHANGELOG.ru.md
CHANGED
|
@@ -9,6 +9,41 @@
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [1.1.2] - 2026-02-09
|
|
13
|
+
|
|
14
|
+
### 🏗️ Качество кода и безопасность
|
|
15
|
+
|
|
16
|
+
#### Добавлено
|
|
17
|
+
|
|
18
|
+
- **ESLint + Prettier** — Полная настройка линтинга и форматирования с `typescript-eslint`. Новые npm-скрипты: `lint`, `lint:fix`, `format`, `format:check`.
|
|
19
|
+
- **fs-sandbox** — Модуль песочницы файловой системы (`src/fsSandbox.ts`) ограничивает файловые операции агентов границами проекта, предотвращая атаки path-traversal.
|
|
20
|
+
|
|
21
|
+
#### Изменено
|
|
22
|
+
|
|
23
|
+
- **Рефакторинг Dashboard** — Извлечён 133-строчный inline HTML из `companion.ts` в отдельный модуль `dashboard.ts`. Companion теперь 700 строк (было 820).
|
|
24
|
+
- **ESLint конфиг** — Flat config (`eslint.config.js`) с поддержкой TypeScript, игнорирует `dist/`, `node_modules/`, `dashboard/`, `cloudflare/`.
|
|
25
|
+
- **Prettier конфиг** — `.prettierrc` с 120-символьной шириной строки, двойные кавычки, trailing commas, LF окончания строк.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## [1.1.1] - 2026-02-09
|
|
30
|
+
|
|
31
|
+
### 🔭 Observability & Control
|
|
32
|
+
|
|
33
|
+
#### Добавлено
|
|
34
|
+
|
|
35
|
+
- **Файловое логирование** — Все логи companion пишутся в `~/.mcp-swarm/logs/companion-YYYY-MM-DD.log` с автоматической ротацией за 7 дней.
|
|
36
|
+
- **`mcp-swarm-doctor`** — Новая CLI-утилита самодиагностики. Проверяет Node.js, Git, статус companion, порт, логи, Hub URL, конфиги IDE и версию npm.
|
|
37
|
+
- **Интерактивный Dashboard** — Кнопки Pause/Resume/Shutdown/Copy Project ID прямо в веб-дашборде `http://localhost:37373`. Toast-уведомления для обратной связи.
|
|
38
|
+
- **Auto-Update Notifier** — При запуске companion проверяет npm-реестр и предупреждает, если доступна новая версия.
|
|
39
|
+
|
|
40
|
+
#### Изменено
|
|
41
|
+
|
|
42
|
+
- **Graceful shutdown** теперь корректно закрывает поток файлового лога перед выходом.
|
|
43
|
+
- **Footer дашборда** обновлён до v1.1.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
12
47
|
## [1.1.0] - 2026-02-09
|
|
13
48
|
|
|
14
49
|
### 🐝 Web Dashboard + DX улучшения
|
package/dist/companion.js
CHANGED
|
@@ -3,6 +3,8 @@ import http from "node:http";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import os from "node:os";
|
|
6
|
+
import { fileLog, closeFileLog, getLogFilePath } from "./fileLogger.js";
|
|
7
|
+
import { renderDashboard } from "./dashboard.js";
|
|
6
8
|
import { gitTry } from "./workflows/git.js";
|
|
7
9
|
import { getRepoRoot } from "./workflows/repo.js";
|
|
8
10
|
import { getStopState } from "./workflows/stopFlag.js";
|
|
@@ -50,7 +52,7 @@ function getEnvConfig() {
|
|
|
50
52
|
repoPath: process.env.SWARM_REPO_PATH,
|
|
51
53
|
project: process.env.SWARM_PROJECT ?? "default",
|
|
52
54
|
hubUrl: process.env.SWARM_HUB_URL,
|
|
53
|
-
mcpServerUrl: process.env.MCP_SERVER_URL, // Auto-Bridge
|
|
55
|
+
mcpServerUrl: process.env.MCP_SERVER_URL, // Auto-Bridge Рє Remote MCP
|
|
54
56
|
pollSeconds: Number.isFinite(pollSeconds) ? pollSeconds : 10,
|
|
55
57
|
controlPort: Number.isFinite(controlPort) ? controlPort : 37373,
|
|
56
58
|
controlToken: process.env.SWARM_CONTROL_TOKEN,
|
|
@@ -84,13 +86,15 @@ function log(level, message) {
|
|
|
84
86
|
success: colors.green,
|
|
85
87
|
};
|
|
86
88
|
const prefix = {
|
|
87
|
-
info: "
|
|
88
|
-
warn: "
|
|
89
|
-
error: "
|
|
90
|
-
success: "
|
|
89
|
+
info: "в„№пёЏ",
|
|
90
|
+
warn: "вљ пёЏ",
|
|
91
|
+
error: "вќЊ",
|
|
92
|
+
success: "вњ…",
|
|
91
93
|
};
|
|
92
94
|
// eslint-disable-next-line no-console
|
|
93
95
|
console.log(`${colorMap[level]}[${timestamp}] ${prefix[level]} ${message}${colors.reset}`);
|
|
96
|
+
// Write to file log
|
|
97
|
+
fileLog(level, message);
|
|
94
98
|
}
|
|
95
99
|
// ============ PID FILE ============
|
|
96
100
|
const PID_DIR = path.join(os.homedir(), ".mcp-swarm");
|
|
@@ -102,7 +106,7 @@ function writePidFile() {
|
|
|
102
106
|
fs.writeFileSync(PID_FILE, String(process.pid), "utf-8");
|
|
103
107
|
}
|
|
104
108
|
catch {
|
|
105
|
-
// Non-critical
|
|
109
|
+
// Non-critical — log and continue
|
|
106
110
|
}
|
|
107
111
|
}
|
|
108
112
|
function removePidFile() {
|
|
@@ -119,10 +123,12 @@ async function run() {
|
|
|
119
123
|
const repoRoot = await getRepoRoot(cfg.repoPath);
|
|
120
124
|
// Write PID file for process discovery
|
|
121
125
|
writePidFile();
|
|
126
|
+
// Check for updates (non-blocking)
|
|
127
|
+
checkForUpdates();
|
|
122
128
|
// ============ SMART PROJECT ID ============
|
|
123
129
|
const projectInfo = await getProjectIdSource(repoRoot);
|
|
124
130
|
const projectId = projectInfo.id;
|
|
125
|
-
log("info",
|
|
131
|
+
log("info", `рџ“Ѓ Project ID: ${colors.bright}${projectId}${colors.reset} (source: ${projectInfo.source})`);
|
|
126
132
|
// Show suggestions if git is not configured
|
|
127
133
|
if (projectInfo.suggestions && projectInfo.suggestions.length > 0) {
|
|
128
134
|
log("warn", `\n${projectInfo.suggestions.join("\n")}\n`);
|
|
@@ -134,10 +140,10 @@ async function run() {
|
|
|
134
140
|
const projectName = path.basename(repoRoot);
|
|
135
141
|
const registered = await registerProjectInTelegram(telegramUserId, projectId, projectName);
|
|
136
142
|
if (registered) {
|
|
137
|
-
log("success",
|
|
143
|
+
log("success", `рџ“± Project registered in Telegram for user ${telegramUserId}`);
|
|
138
144
|
}
|
|
139
145
|
else {
|
|
140
|
-
log("warn",
|
|
146
|
+
log("warn", `рџ“± Failed to register project in Telegram (will retry later)`);
|
|
141
147
|
}
|
|
142
148
|
}
|
|
143
149
|
// Register agent if not already registered
|
|
@@ -163,11 +169,11 @@ async function run() {
|
|
|
163
169
|
let role = electionResult.role;
|
|
164
170
|
const isOrchestrator = electionResult.isOrchestrator;
|
|
165
171
|
if (isOrchestrator) {
|
|
166
|
-
log("success",
|
|
172
|
+
log("success", `рџЋЇ ${colors.bright}ORCHESTRATOR MODE${colors.reset} - Running in INFINITE LOOP`);
|
|
167
173
|
log("info", "Orchestrator will coordinate all other agents and never stop automatically");
|
|
168
174
|
}
|
|
169
175
|
else {
|
|
170
|
-
log("info",
|
|
176
|
+
log("info", `рџ‘· ${colors.bright}EXECUTOR MODE${colors.reset} - Orchestrator: ${electionResult.orchestratorName}`);
|
|
171
177
|
log("info", "Executor will follow orchestrator's commands");
|
|
172
178
|
}
|
|
173
179
|
const hubUrl = cfg.hubUrl;
|
|
@@ -178,10 +184,10 @@ async function run() {
|
|
|
178
184
|
let stop = false;
|
|
179
185
|
let paused = false;
|
|
180
186
|
// ============ AUTO-BRIDGE ============
|
|
181
|
-
//
|
|
187
|
+
// Если задан MCP_SERVER_URL, автоматически подключаемся к Remote MCP
|
|
182
188
|
let bridgeManager = null;
|
|
183
189
|
if (cfg.mcpServerUrl) {
|
|
184
|
-
log("info",
|
|
190
|
+
log("info", `рџЊ‰ Auto-Bridge enabled: ${cfg.mcpServerUrl}`);
|
|
185
191
|
bridgeManager = new BridgeManager({
|
|
186
192
|
mcpServerUrl: cfg.mcpServerUrl,
|
|
187
193
|
projects: [repoRoot],
|
|
@@ -269,11 +275,11 @@ async function run() {
|
|
|
269
275
|
res.end(JSON.stringify({ ok: false, error: "Bridge not enabled. Set MCP_SERVER_URL env." }));
|
|
270
276
|
return;
|
|
271
277
|
}
|
|
272
|
-
log("info",
|
|
278
|
+
log("info", `рџЊ‰ Auto-adding project: ${projectPath}`);
|
|
273
279
|
bridgeManager.addProject(projectPath).then(() => {
|
|
274
|
-
log("success",
|
|
280
|
+
log("success", `рџЊ‰ Project added: ${projectPath}`);
|
|
275
281
|
}).catch(err => {
|
|
276
|
-
log("error",
|
|
282
|
+
log("error", `рџЊ‰ Failed to add project: ${err.message}`);
|
|
277
283
|
});
|
|
278
284
|
res.statusCode = 200;
|
|
279
285
|
res.setHeader("content-type", "application/json");
|
|
@@ -302,118 +308,32 @@ async function run() {
|
|
|
302
308
|
return;
|
|
303
309
|
}
|
|
304
310
|
bridgeManager.removeProject(projectPath);
|
|
305
|
-
log("info",
|
|
311
|
+
log("info", `рџЊ‰ Project removed: ${projectPath}`);
|
|
306
312
|
res.statusCode = 200;
|
|
307
313
|
res.setHeader("content-type", "application/json");
|
|
308
314
|
res.end(JSON.stringify({ ok: true, removed: projectPath }));
|
|
309
315
|
return;
|
|
310
316
|
}
|
|
311
317
|
// ============ WEB DASHBOARD ============
|
|
312
|
-
// GET /
|
|
318
|
+
// GET / — Beautiful HTML dashboard
|
|
313
319
|
if (req.method === "GET" && (req.url === "/" || req.url === "/dashboard")) {
|
|
314
320
|
res.statusCode = 200;
|
|
315
321
|
res.setHeader("content-type", "text/html; charset=utf-8");
|
|
316
322
|
const bridgeStatus = bridgeManager?.getStatus() ?? null;
|
|
317
323
|
const uptimeSeconds = Math.floor(process.uptime());
|
|
318
324
|
const uptimeStr = `${Math.floor(uptimeSeconds / 3600)}h ${Math.floor((uptimeSeconds % 3600) / 60)}m ${uptimeSeconds % 60}s`;
|
|
319
|
-
res.end(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
h1 span { color: #58a6ff; }
|
|
332
|
-
.subtitle { color: #8b949e; margin-bottom: 2rem; font-size: 0.95rem; }
|
|
333
|
-
.cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
|
|
334
|
-
.card { background: #161b22; border: 1px solid #30363d; border-radius: 12px; padding: 1.2rem; }
|
|
335
|
-
.card h3 { color: #8b949e; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }
|
|
336
|
-
.card .value { font-size: 1.4rem; font-weight: 600; }
|
|
337
|
-
.card .value.green { color: #3fb950; }
|
|
338
|
-
.card .value.blue { color: #58a6ff; }
|
|
339
|
-
.card .value.yellow { color: #d29922; }
|
|
340
|
-
.card .value.red { color: #f85149; }
|
|
341
|
-
.badge { display: inline-block; padding: 0.15rem 0.6rem; border-radius: 99px; font-size: 0.75rem; font-weight: 600; }
|
|
342
|
-
.badge.orch { background: #1f6feb33; color: #58a6ff; border: 1px solid #1f6feb; }
|
|
343
|
-
.badge.exec { background: #23863633; color: #3fb950; border: 1px solid #238636; }
|
|
344
|
-
.badge.running { background: #23863633; color: #3fb950; }
|
|
345
|
-
.badge.paused { background: #d2992233; color: #d29922; }
|
|
346
|
-
.badge.stopped { background: #f8514933; color: #f85149; }
|
|
347
|
-
.endpoints { margin-top: 1rem; }
|
|
348
|
-
.endpoints h2 { font-size: 1.1rem; margin-bottom: 0.8rem; color: #c9d1d9; }
|
|
349
|
-
.ep-list { list-style: none; }
|
|
350
|
-
.ep-list li { padding: 0.5rem 0.8rem; border-bottom: 1px solid #21262d; font-family: 'Cascadia Code', 'Fira Code', monospace; font-size: 0.85rem; display: flex; gap: 0.8rem; }
|
|
351
|
-
.ep-list .method { color: #3fb950; min-width: 3.5rem; font-weight: 600; }
|
|
352
|
-
.ep-list .path { color: #58a6ff; }
|
|
353
|
-
.ep-list .desc { color: #8b949e; margin-left: auto; }
|
|
354
|
-
.footer { margin-top: 2rem; color: #484f58; font-size: 0.8rem; text-align: center; }
|
|
355
|
-
.footer a { color: #58a6ff; text-decoration: none; }
|
|
356
|
-
</style>
|
|
357
|
-
</head>
|
|
358
|
-
<body>
|
|
359
|
-
<div class="container">
|
|
360
|
-
<h1>🐝 MCP <span>Swarm</span></h1>
|
|
361
|
-
<p class="subtitle">Companion Dashboard — auto-refreshes every 5s</p>
|
|
362
|
-
<div class="cards">
|
|
363
|
-
<div class="card">
|
|
364
|
-
<h3>Agent</h3>
|
|
365
|
-
<div class="value blue">${agentName}</div>
|
|
366
|
-
</div>
|
|
367
|
-
<div class="card">
|
|
368
|
-
<h3>Role</h3>
|
|
369
|
-
<div class="value"><span class="badge ${isOrchestrator ? 'orch' : 'exec'}">${role.toUpperCase()}</span></div>
|
|
370
|
-
</div>
|
|
371
|
-
<div class="card">
|
|
372
|
-
<h3>Status</h3>
|
|
373
|
-
<div class="value"><span class="badge ${stop ? 'stopped' : paused ? 'paused' : 'running'}">${stop ? '⏹ STOPPED' : paused ? '⏸ PAUSED' : '▶ RUNNING'}</span></div>
|
|
374
|
-
</div>
|
|
375
|
-
<div class="card">
|
|
376
|
-
<h3>Bridge</h3>
|
|
377
|
-
<div class="value ${bridgeManager ? 'green' : 'yellow'}">${bridgeManager ? '🌉 Connected' : '⚠ Not enabled'}</div>
|
|
378
|
-
</div>
|
|
379
|
-
<div class="card">
|
|
380
|
-
<h3>Project ID</h3>
|
|
381
|
-
<div class="value" style="font-size:1rem;word-break:break-all;">${projectId}</div>
|
|
382
|
-
</div>
|
|
383
|
-
<div class="card">
|
|
384
|
-
<h3>Uptime</h3>
|
|
385
|
-
<div class="value green">${uptimeStr}</div>
|
|
386
|
-
</div>
|
|
387
|
-
<div class="card">
|
|
388
|
-
<h3>PID</h3>
|
|
389
|
-
<div class="value" style="font-size:1rem;">${process.pid}</div>
|
|
390
|
-
</div>
|
|
391
|
-
<div class="card">
|
|
392
|
-
<h3>Port</h3>
|
|
393
|
-
<div class="value">${controlPort}</div>
|
|
394
|
-
</div>
|
|
395
|
-
</div>
|
|
396
|
-
<div class="endpoints">
|
|
397
|
-
<h2>📡 API Endpoints</h2>
|
|
398
|
-
<ul class="ep-list">
|
|
399
|
-
<li><span class="method">GET</span><span class="path">/</span><span class="desc">This dashboard</span></li>
|
|
400
|
-
<li><span class="method">GET</span><span class="path">/status</span><span class="desc">JSON status</span></li>
|
|
401
|
-
<li><span class="method">GET</span><span class="path">/health</span><span class="desc">Health check</span></li>
|
|
402
|
-
<li><span class="method">GET</span><span class="path">/bridge/status</span><span class="desc">Bridge status</span></li>
|
|
403
|
-
<li><span class="method">POST</span><span class="path">/stop</span><span class="desc">Stop companion</span></li>
|
|
404
|
-
<li><span class="method">POST</span><span class="path">/pause</span><span class="desc">Pause companion</span></li>
|
|
405
|
-
<li><span class="method">POST</span><span class="path">/resume</span><span class="desc">Resume companion</span></li>
|
|
406
|
-
<li><span class="method">POST</span><span class="path">/shutdown</span><span class="desc">Shutdown companion</span></li>
|
|
407
|
-
<li><span class="method">POST</span><span class="path">/bridge/add?project=</span><span class="desc">Add project to bridge</span></li>
|
|
408
|
-
<li><span class="method">POST</span><span class="path">/bridge/remove?project=</span><span class="desc">Remove project</span></li>
|
|
409
|
-
</ul>
|
|
410
|
-
</div>
|
|
411
|
-
<div class="footer">
|
|
412
|
-
MCP Swarm v1.0 • <a href="https://github.com/AbdrAbdr/MCP-Swarm" target="_blank">GitHub</a> • <a href="https://www.npmjs.com/package/mcp-swarm" target="_blank">npm</a>
|
|
413
|
-
</div>
|
|
414
|
-
</div>
|
|
415
|
-
</body>
|
|
416
|
-
</html>`);
|
|
325
|
+
res.end(renderDashboard({
|
|
326
|
+
agentName,
|
|
327
|
+
role,
|
|
328
|
+
isOrchestrator: role === "orchestrator",
|
|
329
|
+
paused: !!paused,
|
|
330
|
+
stop: !!stop,
|
|
331
|
+
bridgeConnected: !!bridgeManager,
|
|
332
|
+
projectId,
|
|
333
|
+
uptimeStr,
|
|
334
|
+
pid: process.pid,
|
|
335
|
+
logFilePath: getLogFilePath(),
|
|
336
|
+
}));
|
|
417
337
|
return;
|
|
418
338
|
}
|
|
419
339
|
// GET /health
|
|
@@ -439,7 +359,7 @@ async function run() {
|
|
|
439
359
|
const cmd = chunk.trim().toLowerCase();
|
|
440
360
|
if (cmd === "stop" || cmd === "exit" || cmd === "quit") {
|
|
441
361
|
if (isOrchestrator) {
|
|
442
|
-
log("warn", "
|
|
362
|
+
log("warn", "в›” ORCHESTRATOR STOP REQUESTED BY USER");
|
|
443
363
|
log("info", "Stopping orchestrator...");
|
|
444
364
|
}
|
|
445
365
|
stop = true;
|
|
@@ -486,14 +406,14 @@ async function run() {
|
|
|
486
406
|
}
|
|
487
407
|
}
|
|
488
408
|
// ============ AUTO-DETECT PROJECTS ============
|
|
489
|
-
//
|
|
409
|
+
// Если пришёл event с новым repoPath — автоматически подключаем bridge
|
|
490
410
|
if (bridgeManager && msg?.payload?.repoPath) {
|
|
491
411
|
const eventRepoPath = msg.payload.repoPath;
|
|
492
412
|
const status = bridgeManager.getStatus();
|
|
493
413
|
if (!status[eventRepoPath]) {
|
|
494
|
-
log("info",
|
|
414
|
+
log("info", `рџ”Ќ Auto-detected new project: ${eventRepoPath}`);
|
|
495
415
|
bridgeManager.addProject(eventRepoPath).catch(err => {
|
|
496
|
-
log("error",
|
|
416
|
+
log("error", `рџЊ‰ Failed to auto-add: ${err.message}`);
|
|
497
417
|
});
|
|
498
418
|
}
|
|
499
419
|
}
|
|
@@ -514,8 +434,8 @@ async function run() {
|
|
|
514
434
|
const inboxCheckInterval = 30_000; // Check inbox every 30 seconds
|
|
515
435
|
log("info", "Entering main loop...");
|
|
516
436
|
log("info", isOrchestrator
|
|
517
|
-
? "
|
|
518
|
-
: "
|
|
437
|
+
? "рџ”„ INFINITE LOOP MODE - Type 'stop' to exit"
|
|
438
|
+
: "рџ”„ EXECUTOR MODE - Will stop when orchestrator stops or task complete");
|
|
519
439
|
// ============ MAIN LOOP ============
|
|
520
440
|
// ORCHESTRATOR runs FOREVER until user types "stop"
|
|
521
441
|
// EXECUTOR runs until stopped or task complete
|
|
@@ -559,11 +479,11 @@ async function run() {
|
|
|
559
479
|
urgentOnly: false,
|
|
560
480
|
});
|
|
561
481
|
if (inbox.unread > 0) {
|
|
562
|
-
log("info",
|
|
482
|
+
log("info", `📬 ${inbox.unread} unread message(s) in inbox`);
|
|
563
483
|
// Auto-acknowledge urgent messages for orchestrator
|
|
564
484
|
for (const msg of inbox.messages) {
|
|
565
485
|
if (msg.importance === "urgent" && !msg.acknowledged) {
|
|
566
|
-
log("warn",
|
|
486
|
+
log("warn", `рџљЁ URGENT: ${msg.subject} from ${msg.from}`);
|
|
567
487
|
if (msg.ackRequired) {
|
|
568
488
|
await acknowledgeMessage({
|
|
569
489
|
repoPath: repoRoot,
|
|
@@ -610,7 +530,7 @@ async function run() {
|
|
|
610
530
|
if (ev.type === "task_announced") {
|
|
611
531
|
// Could auto-bid here in future
|
|
612
532
|
if (!isOrchestrator) {
|
|
613
|
-
log("info",
|
|
533
|
+
log("info", `рџ“ў New task announced: ${ev.payload?.taskId}`);
|
|
614
534
|
}
|
|
615
535
|
}
|
|
616
536
|
lastEventTs = Math.max(lastEventTs, ev.ts);
|
|
@@ -629,7 +549,7 @@ async function run() {
|
|
|
629
549
|
// ============ CLEANUP ============
|
|
630
550
|
if (bridgeManager) {
|
|
631
551
|
bridgeManager.stop();
|
|
632
|
-
log("info", "
|
|
552
|
+
log("info", "рџЊ‰ Bridge stopped");
|
|
633
553
|
}
|
|
634
554
|
if (ws) {
|
|
635
555
|
try {
|
|
@@ -647,18 +567,44 @@ async function run() {
|
|
|
647
567
|
}
|
|
648
568
|
log("info", `Companion stopped for agent ${agentName} (${role})`);
|
|
649
569
|
}
|
|
570
|
+
// ============ AUTO-UPDATE NOTIFIER ============
|
|
571
|
+
function checkForUpdates() {
|
|
572
|
+
try {
|
|
573
|
+
const pkgPath = new URL("../package.json", import.meta.url);
|
|
574
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
575
|
+
const currentVersion = pkg.version;
|
|
576
|
+
const req = http.get("http://registry.npmjs.org/mcp-swarm/latest", (res) => {
|
|
577
|
+
let data = "";
|
|
578
|
+
res.on("data", (chunk) => data += chunk.toString());
|
|
579
|
+
res.on("end", () => {
|
|
580
|
+
try {
|
|
581
|
+
const json = JSON.parse(data);
|
|
582
|
+
if (json.version && json.version !== currentVersion) {
|
|
583
|
+
log("warn", `🔄 Update available: ${currentVersion} → ${json.version} — run: npm install -g mcp-swarm@latest`);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
catch { /* ignore parse errors */ }
|
|
587
|
+
});
|
|
588
|
+
});
|
|
589
|
+
req.on("error", () => { });
|
|
590
|
+
req.setTimeout(5000, () => req.destroy());
|
|
591
|
+
}
|
|
592
|
+
catch { /* ignore */ }
|
|
593
|
+
}
|
|
650
594
|
// ============ GRACEFUL SHUTDOWN ============
|
|
651
595
|
function gracefulShutdown(signal) {
|
|
652
596
|
console.log(`\n[companion] Received ${signal}, shutting down gracefully...`);
|
|
597
|
+
closeFileLog();
|
|
653
598
|
removePidFile();
|
|
654
599
|
process.exit(0);
|
|
655
600
|
}
|
|
656
601
|
process.on("SIGTERM", () => gracefulShutdown("SIGTERM"));
|
|
657
602
|
process.on("SIGINT", () => gracefulShutdown("SIGINT"));
|
|
658
|
-
process.on("exit", () => removePidFile());
|
|
603
|
+
process.on("exit", () => { closeFileLog(); removePidFile(); });
|
|
659
604
|
run().catch(err => {
|
|
660
605
|
// eslint-disable-next-line no-console
|
|
661
606
|
console.error(err);
|
|
607
|
+
closeFileLog();
|
|
662
608
|
removePidFile();
|
|
663
609
|
process.exit(1);
|
|
664
610
|
});
|
package/dist/companion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companion.js","sourceRoot":"","sources":["../src/companion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,6CAA6C;AAC7C,yEAAyE;AACzE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;AAE5D;;;GAGG;AACH,KAAK,UAAU,yBAAyB,CACtC,MAAc,EACd,SAAiB,EACjB,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,WAAW,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC5B,SAAS;gBACT,IAAI,EAAE,WAAW;aAClB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAcD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,8DAA8D;AAC9D,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAQ,CAAC;AAEhC,SAAS,YAAY;IACnB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,OAAO,CAAC,CAAC,eAAe;IAC7E,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,MAAM,CAAC;IAC9E,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QACrC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS;QAC/C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QACjC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,2BAA2B;QACrE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QAC5D,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;QAC/D,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC7C,UAAU;QACV,qBAAqB;KACtB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,uCAAuC;AACvC,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF,SAAS,GAAG,CAAC,KAA4C,EAAE,OAAe;IACxE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,MAAM;QACnB,KAAK,EAAE,MAAM,CAAC,GAAG;QACjB,OAAO,EAAE,MAAM,CAAC,KAAK;KACtB,CAAC;IACF,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,GAAG;KACb,CAAC;IACF,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,qCAAqC;AACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAErD,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEjD,uCAAuC;IACvC,YAAY,EAAE,CAAC;IAEf,6CAA6C;IAC7C,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;IACjC,GAAG,CAAC,MAAM,EAAE,kBAAkB,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,aAAa,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1G,4CAA4C;IAC5C,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,EAAE,KAAK,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,kDAAkD;IAClD,iEAAiE;IACjE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC3F,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,SAAS,EAAE,8CAA8C,cAAc,EAAE,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,EAAE,8DAA8D,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9G,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,GAAG,CAAC,SAAS,EAAE,qBAAqB,UAAU,CAAC,KAAK,CAAC,SAAS,KAAK,QAAQ,GAAG,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,EAAE,SAAS,IAAI,cAAc,CAAC;IACxD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9G,GAAG,CAAC,MAAM,EAAE,iCAAiC,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAEzF,kDAAkD;IAClD,qEAAqE;IACrE,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC;QACjD,QAAQ,EAAE,QAAQ;QAClB,OAAO;QACP,SAAS;QACT,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,IAAI,GAAc,cAAc,CAAC,IAAI,CAAC;IAC1C,MAAM,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC;IAErD,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,SAAS,EAAE,MAAM,MAAM,CAAC,MAAM,oBAAoB,MAAM,CAAC,KAAK,6BAA6B,CAAC,CAAC;QACjG,GAAG,CAAC,MAAM,EAAE,4EAA4E,CAAC,CAAC;IAC5F,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,gBAAgB,MAAM,CAAC,KAAK,oBAAoB,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClH,GAAG,CAAC,MAAM,EAAE,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACzD,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,KAAK,CAAC;IAC7C,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IAEtC,IAAI,EAAE,GAAe,IAAI,CAAC;IAC1B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,wCAAwC;IACxC,qEAAqE;IACrE,IAAI,aAAa,GAAyB,IAAI,CAAC;IAC/C,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,GAAG,CAAC,MAAM,EAAE,2BAA2B,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3D,aAAa,GAAG,IAAI,aAAa,CAAC;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB,CAAC,CAAC;QACH,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAChC,GAAG,CAAC,OAAO,EAAE,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,UAAU,CAAC,GAAyB;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACjD,8DAA8D;YAC9D,IAAI,cAAc,EAAE,CAAC;gBACnB,GAAG,CAAC,MAAM,EAAE,mFAAmF,CAAC,CAAC;gBACjG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC,CAAC,CAAC;gBACzG,OAAO;YACT,CAAC;YACD,IAAI,GAAG,IAAI,CAAC;YACZ,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,GAAG,IAAI,CAAC;YACd,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,GAAG,KAAK,CAAC;YACf,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAClD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,IAAI;gBACJ,MAAM;gBACN,SAAS;gBACT,IAAI;gBACJ,cAAc;gBACd,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,IAAI;aAC3C,CAAC,CAAC,CAAC;YACJ,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,4CAA4C;QAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,WAAW,EAAE,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEpD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,CAAC,CAAC;gBAC7F,OAAO;YACT,CAAC;YAED,GAAG,CAAC,MAAM,EAAE,2BAA2B,WAAW,EAAE,CAAC,CAAC;YACtD,aAAa,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC9C,GAAG,CAAC,SAAS,EAAE,qBAAqB,WAAW,EAAE,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACb,GAAG,CAAC,OAAO,EAAE,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,gBAAgB,EAAE,CAAC;YACzD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,CAAC,CAAC,aAAa;gBACxB,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE;aAC3C,CAAC,CAAC,CAAC;YACJ,OAAO;QACT,CAAC;QAED,+CAA+C;QAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,WAAW,EAAE,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEpD,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC,CAAC;gBACvF,OAAO;YACT,CAAC;YAED,aAAa,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YACzC,GAAG,CAAC,MAAM,EAAE,uBAAuB,WAAW,EAAE,CAAC,CAAC;YAElD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,mCAAmC;QACnC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,YAAY,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,aAAa,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC;YACxD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,aAAa,GAAG,EAAE,GAAG,CAAC;YAC5H,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA8CoB,SAAS;;;;gDAIK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE;;;;gDAIvD,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;;;;4BAI/H,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe;;;;0EAIzC,SAAS;;;;mCAIhD,SAAS;;;;qDAIS,OAAO,CAAC,GAAG;;;;6BAInC,WAAW;;;;;;;;;;;;;;;;;;;;;;;QAuBhC,CAAC,CAAC;YACJ,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAClD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,EAAE,gDAAgD,WAAW,EAAE,CAAC,CAAC;IAE3E,kDAAkD;IAClD,wDAAwD;IACxD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACvD,IAAI,cAAc,EAAE,CAAC;oBACnB,GAAG,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;oBACrD,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;gBAC1C,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;YACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACpB,MAAM,GAAG,IAAI,CAAC;gBACd,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACxC,MAAM,GAAG,KAAK,CAAC;gBACf,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,aAAa,MAAM,WAAW,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,GAAG,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,SAAS;QACtB,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,6CAA6C;QACzF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEzC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE5B,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YACpF,GAAG,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,EAAE,GAAG,IAAI,CAAC;YACV,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;YACnF,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,GAAG,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,8CAA8C;oBAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;wBACpB,IAAI,GAAG,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,iDAAiD;gBACjD,uEAAuE;gBACvE,IAAI,aAAa,IAAI,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;oBAC5C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAkB,CAAC;oBACrD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;oBACzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC3B,GAAG,CAAC,MAAM,EAAE,iCAAiC,aAAa,EAAE,CAAC,CAAC;wBAC9D,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;4BAClD,GAAG,CAAC,OAAO,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;wBACxD,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,EAAE,CAAC;IAElB,gEAAgE;IAChE,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,cAAc,GAAG,CAAC,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,+BAA+B;IAElE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACrC,GAAG,CAAC,MAAM,EAAE,cAAc;QACxB,CAAC,CAAC,6CAA6C;QAC/C,CAAC,CAAC,uEAAuE,CAAC,CAAC;IAE7E,sCAAsC;IACtC,oDAAoD;IACpD,+CAA+C;IAC/C,OAAO,IAAI,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QAEZ,2CAA2C;QAC3C,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,cAAc,EAAE,CAAC;gBACnB,GAAG,CAAC,MAAM,EAAE,0CAA0C,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM;QACR,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,kDAAkD;QAClD,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE/B,+EAA+E;QAC/E,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,GAAG,CAAC,MAAM,EAAE,iDAAiD,CAAC,CAAC;YAC/D,MAAM;QACR,CAAC;QAED,sCAAsC;QACtC,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,qBAAqB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,wCAAwC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,cAAc,GAAG,kBAAkB,EAAE,CAAC;YAC9C,cAAc,GAAG,GAAG,CAAC;YAErB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC;oBAClC,QAAQ,EAAE,QAAQ;oBAClB,SAAS;oBACT,KAAK,EAAE,EAAE;oBACT,UAAU,EAAE,KAAK;iBAClB,CAAC,CAAC;gBAEH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,MAAM,6BAA6B,CAAC,CAAC;oBAE7D,oDAAoD;oBACpD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACjC,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;4BACrD,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,CAAC,OAAO,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;4BAC1D,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gCACpB,MAAM,kBAAkB,CAAC;oCACvB,QAAQ,EAAE,QAAQ;oCAClB,SAAS;oCACT,SAAS,EAAE,GAAG,CAAC,EAAE;iCAClB,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,WAAW,GAAG,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC;QAExC,IAAI,WAAW,EAAE,CAAC;YAChB,iCAAiC;YACjC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAClF,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,sBAAsB;YACtB,WAAW,EAAE,CAAC;YACd,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,SAAS,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,IAAI,WAAW,GAAG,cAAc,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;gBACrF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;oBACxB,0BAA0B;oBAC1B,IAAI,EAAE,CAAC,IAAI,KAAK,gBAAgB,IAAI,EAAE,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBAC/D,MAAM,OAAO,GAAG,EAAE,CAAC,OAAc,CAAC;wBAClC,mEAAmE;wBACnE,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;4BACxE,IAAI,GAAG,IAAI,CAAC;4BACZ,MAAM;wBACR,CAAC;oBACH,CAAC;oBACD,IAAI,EAAE,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;wBACjC,gCAAgC;wBAChC,IAAI,CAAC,cAAc,EAAE,CAAC;4BACpB,GAAG,CAAC,MAAM,EAAE,0BAA2B,EAAE,CAAC,OAAe,EAAE,MAAM,EAAE,CAAC,CAAC;wBACvE,CAAC;oBACH,CAAC;oBACD,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,SAAS,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,gCAAgC;YAC1D,GAAG,CAAC,MAAM,EAAE,0BAA0B,SAAS,WAAW,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,oCAAoC;IACpC,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,EAAE,EAAE,CAAC;QACP,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,GAAG,CAAC,MAAM,EAAE,+BAA+B,SAAS,KAAK,IAAI,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,8CAA8C;AAC9C,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,+BAA+B,CAAC,CAAC;IAC7E,aAAa,EAAE,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;AAE1C,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IAChB,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,aAAa,EAAE,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"companion.js","sourceRoot":"","sources":["../src/companion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Swarm — Dashboard HTML Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates the interactive web dashboard HTML for the companion control server.
|
|
5
|
+
* Extracted from companion.ts for better maintainability.
|
|
6
|
+
*/
|
|
7
|
+
export function renderDashboard(data) {
|
|
8
|
+
const { agentName, role, isOrchestrator, paused, stop, bridgeConnected, projectId, uptimeStr, pid, logFilePath } = data;
|
|
9
|
+
return `<!DOCTYPE html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="UTF-8">
|
|
13
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
14
|
+
<meta http-equiv="refresh" content="5">
|
|
15
|
+
<title>🐝 MCP Swarm — Dashboard</title>
|
|
16
|
+
<style>
|
|
17
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
18
|
+
body { font-family: 'Segoe UI', system-ui, sans-serif; background: #0d1117; color: #e6edf3; min-height: 100vh; padding: 2rem; }
|
|
19
|
+
.container { max-width: 960px; margin: 0 auto; }
|
|
20
|
+
h1 { font-size: 2rem; margin-bottom: 0.5rem; }
|
|
21
|
+
h1 span { color: #58a6ff; }
|
|
22
|
+
.subtitle { color: #8b949e; margin-bottom: 2rem; font-size: 0.95rem; }
|
|
23
|
+
.cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
|
|
24
|
+
.card { background: #161b22; border: 1px solid #30363d; border-radius: 12px; padding: 1.2rem; transition: border-color 0.2s; }
|
|
25
|
+
.card:hover { border-color: #58a6ff44; }
|
|
26
|
+
.card h3 { color: #8b949e; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }
|
|
27
|
+
.card .value { font-size: 1.3rem; font-weight: 600; }
|
|
28
|
+
.card .value.green { color: #3fb950; }
|
|
29
|
+
.card .value.blue { color: #58a6ff; }
|
|
30
|
+
.card .value.yellow { color: #d29922; }
|
|
31
|
+
.badge { display: inline-block; padding: 0.15rem 0.6rem; border-radius: 99px; font-size: 0.75rem; font-weight: 600; }
|
|
32
|
+
.badge.orch { background: #1f6feb33; color: #58a6ff; border: 1px solid #1f6feb; }
|
|
33
|
+
.badge.exec { background: #23863633; color: #3fb950; border: 1px solid #238636; }
|
|
34
|
+
.badge.running { background: #23863633; color: #3fb950; }
|
|
35
|
+
.badge.paused { background: #d2992233; color: #d29922; }
|
|
36
|
+
.badge.stopped { background: #f8514933; color: #f85149; }
|
|
37
|
+
.controls { display: flex; gap: 0.6rem; margin-bottom: 2rem; flex-wrap: wrap; }
|
|
38
|
+
.btn { padding: 0.5rem 1.2rem; border: 1px solid #30363d; border-radius: 8px; background: #161b22; color: #e6edf3; cursor: pointer; font-size: 0.85rem; font-weight: 500; transition: all 0.15s; }
|
|
39
|
+
.btn:hover { background: #1f2937; border-color: #58a6ff; transform: translateY(-1px); }
|
|
40
|
+
.btn:active { transform: translateY(0); }
|
|
41
|
+
.btn.danger { border-color: #f85149; color: #f85149; }
|
|
42
|
+
.btn.danger:hover { background: #f8514922; }
|
|
43
|
+
.btn.warn { border-color: #d29922; color: #d29922; }
|
|
44
|
+
.btn.warn:hover { background: #d2992222; }
|
|
45
|
+
.btn.ok { border-color: #3fb950; color: #3fb950; }
|
|
46
|
+
.btn.ok:hover { background: #3fb95022; }
|
|
47
|
+
.toast { position: fixed; bottom: 2rem; right: 2rem; background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 0.8rem 1.2rem; color: #e6edf3; font-size: 0.85rem; opacity: 0; transition: opacity 0.3s; z-index: 99; pointer-events: none; }
|
|
48
|
+
.toast.show { opacity: 1; }
|
|
49
|
+
.endpoints { margin-top: 1rem; }
|
|
50
|
+
.endpoints h2 { font-size: 1.1rem; margin-bottom: 0.8rem; color: #c9d1d9; }
|
|
51
|
+
.ep-list { list-style: none; }
|
|
52
|
+
.ep-list li { padding: 0.4rem 0.8rem; border-bottom: 1px solid #21262d; font-family: 'Cascadia Code', 'Fira Code', monospace; font-size: 0.8rem; display: flex; gap: 0.8rem; }
|
|
53
|
+
.ep-list .method { color: #3fb950; min-width: 3.5rem; font-weight: 600; }
|
|
54
|
+
.ep-list .path { color: #58a6ff; }
|
|
55
|
+
.ep-list .desc { color: #8b949e; margin-left: auto; }
|
|
56
|
+
.footer { margin-top: 2rem; color: #484f58; font-size: 0.8rem; text-align: center; }
|
|
57
|
+
.footer a { color: #58a6ff; text-decoration: none; }
|
|
58
|
+
</style>
|
|
59
|
+
</head>
|
|
60
|
+
<body>
|
|
61
|
+
<div class="container">
|
|
62
|
+
<h1>🐝 MCP <span>Swarm</span></h1>
|
|
63
|
+
<p class="subtitle">Companion Dashboard — auto-refreshes every 5s</p>
|
|
64
|
+
<div class="cards">
|
|
65
|
+
<div class="card">
|
|
66
|
+
<h3>Agent</h3>
|
|
67
|
+
<div class="value blue">${agentName}</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="card">
|
|
70
|
+
<h3>Role</h3>
|
|
71
|
+
<div class="value"><span class="badge ${isOrchestrator ? 'orch' : 'exec'}">${role.toUpperCase()}</span></div>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="card">
|
|
74
|
+
<h3>Status</h3>
|
|
75
|
+
<div class="value"><span class="badge ${stop ? 'stopped' : paused ? 'paused' : 'running'}">${stop ? '⏹ STOPPED' : paused ? '⏸ PAUSED' : '▶ RUNNING'}</span></div>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="card">
|
|
78
|
+
<h3>Bridge</h3>
|
|
79
|
+
<div class="value ${bridgeConnected ? 'green' : 'yellow'}">${bridgeConnected ? '🌉 Connected' : '⚠ Off'}</div>
|
|
80
|
+
</div>
|
|
81
|
+
<div class="card">
|
|
82
|
+
<h3>Project</h3>
|
|
83
|
+
<div class="value" style="font-size:0.9rem;word-break:break-all;" id="project-id">${projectId}</div>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="card">
|
|
86
|
+
<h3>Uptime</h3>
|
|
87
|
+
<div class="value green">${uptimeStr}</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="card">
|
|
90
|
+
<h3>PID</h3>
|
|
91
|
+
<div class="value" style="font-size:1rem;">${pid}</div>
|
|
92
|
+
</div>
|
|
93
|
+
<div class="card">
|
|
94
|
+
<h3>Log File</h3>
|
|
95
|
+
<div class="value" style="font-size:0.7rem;word-break:break-all;color:#8b949e;">${logFilePath}</div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
<div class="controls">
|
|
99
|
+
<button class="btn ${paused ? 'ok' : 'warn'}" onclick="action('${paused ? 'resume' : 'pause'}')">${paused ? '▶ Resume' : '⏸ Pause'}</button>
|
|
100
|
+
<button class="btn danger" onclick="if(confirm('Shutdown companion?')) action('stop')">⏹ Shutdown</button>
|
|
101
|
+
<button class="btn" onclick="copyId()">📋 Copy Project ID</button>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="endpoints">
|
|
104
|
+
<h2>📡 API Endpoints</h2>
|
|
105
|
+
<ul class="ep-list">
|
|
106
|
+
<li><span class="method">GET</span><span class="path">/</span><span class="desc">Dashboard</span></li>
|
|
107
|
+
<li><span class="method">GET</span><span class="path">/status</span><span class="desc">JSON status</span></li>
|
|
108
|
+
<li><span class="method">GET</span><span class="path">/health</span><span class="desc">Health check</span></li>
|
|
109
|
+
<li><span class="method">GET</span><span class="path">/bridge/status</span><span class="desc">Bridge info</span></li>
|
|
110
|
+
<li><span class="method">POST</span><span class="path">/pause</span><span class="desc">Pause</span></li>
|
|
111
|
+
<li><span class="method">POST</span><span class="path">/resume</span><span class="desc">Resume</span></li>
|
|
112
|
+
<li><span class="method">POST</span><span class="path">/stop</span><span class="desc">Stop</span></li>
|
|
113
|
+
</ul>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="footer">
|
|
116
|
+
MCP Swarm v1.1 • <a href="https://github.com/AbdrAbdr/MCP-Swarm" target="_blank">GitHub</a> • <a href="https://www.npmjs.com/package/mcp-swarm" target="_blank">npm</a>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="toast" id="toast"></div>
|
|
120
|
+
<script>
|
|
121
|
+
function toast(msg) {
|
|
122
|
+
const t = document.getElementById('toast');
|
|
123
|
+
t.textContent = msg;
|
|
124
|
+
t.classList.add('show');
|
|
125
|
+
setTimeout(() => t.classList.remove('show'), 2500);
|
|
126
|
+
}
|
|
127
|
+
async function action(act) {
|
|
128
|
+
try {
|
|
129
|
+
const r = await fetch('/' + act, { method: 'POST' });
|
|
130
|
+
const j = await r.json();
|
|
131
|
+
toast(j.ok ? act + ' OK ✅' : 'Error: ' + (j.message || 'unknown'));
|
|
132
|
+
if (act !== 'stop') setTimeout(() => location.reload(), 500);
|
|
133
|
+
} catch(e) { toast('Error: ' + e.message); }
|
|
134
|
+
}
|
|
135
|
+
function copyId() {
|
|
136
|
+
const id = document.getElementById('project-id').textContent;
|
|
137
|
+
navigator.clipboard.writeText(id).then(() => toast('Copied: ' + id)).catch(() => toast('Copy failed'));
|
|
138
|
+
}
|
|
139
|
+
</script>
|
|
140
|
+
</body>
|
|
141
|
+
</html>`;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,MAAM,UAAU,eAAe,CAAC,IAAmB;IAC/C,MAAM,EACF,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAC7C,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAC1D,GAAG,IAAI,CAAC;IAET,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA0DuB,SAAS;;;;gDAIK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE;;;;gDAIvD,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;;;;4BAI/H,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO;;;;4FAInB,SAAS;;;;mCAIlE,SAAS;;;;qDAIS,GAAG;;;;0FAIkC,WAAW;;;;2BAI1E,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,sBAAsB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0ChI,CAAC;AACT,CAAC"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Swarm Doctor — Self-diagnostics CLI
|
|
4
|
+
*
|
|
5
|
+
* Checks:
|
|
6
|
+
* 1. Node.js version (>= 18)
|
|
7
|
+
* 2. Git availability and version
|
|
8
|
+
* 3. Hub connectivity (SWARM_HUB_URL)
|
|
9
|
+
* 4. PID file (is companion running?)
|
|
10
|
+
* 5. Port availability (37373)
|
|
11
|
+
* 6. npm registry (latest version check)
|
|
12
|
+
* 7. IDE config detection
|
|
13
|
+
*
|
|
14
|
+
* Usage: npx mcp-swarm-doctor
|
|
15
|
+
*/
|
|
16
|
+
import { execSync } from "node:child_process";
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import os from "node:os";
|
|
20
|
+
import http from "node:http";
|
|
21
|
+
import { readFileSync } from "node:fs";
|
|
22
|
+
// ============ COLORS ============
|
|
23
|
+
const c = {
|
|
24
|
+
reset: "\x1b[0m",
|
|
25
|
+
green: "\x1b[32m",
|
|
26
|
+
red: "\x1b[31m",
|
|
27
|
+
yellow: "\x1b[33m",
|
|
28
|
+
blue: "\x1b[34m",
|
|
29
|
+
bright: "\x1b[1m",
|
|
30
|
+
dim: "\x1b[2m",
|
|
31
|
+
};
|
|
32
|
+
function ok(msg) { console.log(` ${c.green}✅${c.reset} ${msg}`); }
|
|
33
|
+
function warn(msg) { console.log(` ${c.yellow}⚠️${c.reset} ${msg}`); }
|
|
34
|
+
function fail(msg) { console.log(` ${c.red}❌${c.reset} ${msg}`); }
|
|
35
|
+
function info(msg) { console.log(` ${c.blue}ℹ${c.reset} ${msg}`); }
|
|
36
|
+
function header(msg) { console.log(`\n${c.bright}${msg}${c.reset}`); }
|
|
37
|
+
// ============ VERSION ============
|
|
38
|
+
function getVersion() {
|
|
39
|
+
try {
|
|
40
|
+
const pkgPath = path.join(new URL(".", import.meta.url).pathname.replace(/^\/([A-Z]:)/, "$1"), "..", "package.json");
|
|
41
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
42
|
+
return pkg.version || "unknown";
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return "unknown";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ============ CHECKS ============
|
|
49
|
+
function checkNode() {
|
|
50
|
+
const version = process.version;
|
|
51
|
+
const major = parseInt(version.slice(1).split(".")[0], 10);
|
|
52
|
+
if (major >= 18) {
|
|
53
|
+
ok(`Node.js ${version} (>= 18 required)`);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
fail(`Node.js ${version} — requires >= 18.0.0`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function checkGit() {
|
|
62
|
+
try {
|
|
63
|
+
const version = execSync("git --version", { encoding: "utf-8" }).trim();
|
|
64
|
+
ok(`${version}`);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
fail("Git not found — install from https://git-scm.com");
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function checkPidFile() {
|
|
73
|
+
const pidFile = path.join(os.homedir(), ".mcp-swarm", "companion.pid");
|
|
74
|
+
if (fs.existsSync(pidFile)) {
|
|
75
|
+
const pid = fs.readFileSync(pidFile, "utf-8").trim();
|
|
76
|
+
ok(`Companion PID file found (PID: ${pid})`);
|
|
77
|
+
// Check if process is actually running
|
|
78
|
+
try {
|
|
79
|
+
process.kill(parseInt(pid, 10), 0);
|
|
80
|
+
ok(`Companion process is running (PID: ${pid})`);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
warn(`PID file exists but process ${pid} is not running (stale PID file)`);
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
info("Companion is not running (no PID file)");
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function checkPort(port) {
|
|
93
|
+
return new Promise((resolve) => {
|
|
94
|
+
const req = http.get(`http://127.0.0.1:${port}/health`, (res) => {
|
|
95
|
+
let data = "";
|
|
96
|
+
res.on("data", (chunk) => data += chunk);
|
|
97
|
+
res.on("end", () => {
|
|
98
|
+
try {
|
|
99
|
+
const json = JSON.parse(data);
|
|
100
|
+
if (json.ok) {
|
|
101
|
+
ok(`Port ${port} — Companion responding (uptime: ${Math.floor(json.uptime)}s)`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
warn(`Port ${port} — Companion responding but unhealthy`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
warn(`Port ${port} — Something is listening but not Companion`);
|
|
109
|
+
}
|
|
110
|
+
resolve(true);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
req.on("error", () => {
|
|
114
|
+
info(`Port ${port} — Not in use (Companion not running)`);
|
|
115
|
+
resolve(true);
|
|
116
|
+
});
|
|
117
|
+
req.setTimeout(3000, () => {
|
|
118
|
+
req.destroy();
|
|
119
|
+
info(`Port ${port} — Timeout`);
|
|
120
|
+
resolve(true);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function checkLogDir() {
|
|
125
|
+
const logDir = path.join(os.homedir(), ".mcp-swarm", "logs");
|
|
126
|
+
if (fs.existsSync(logDir)) {
|
|
127
|
+
const files = fs.readdirSync(logDir).filter(f => f.endsWith(".log"));
|
|
128
|
+
ok(`Log directory exists — ${files.length} log file(s)`);
|
|
129
|
+
if (files.length > 0) {
|
|
130
|
+
const latest = files.sort().pop();
|
|
131
|
+
const stat = fs.statSync(path.join(logDir, latest));
|
|
132
|
+
const sizeKb = (stat.size / 1024).toFixed(1);
|
|
133
|
+
info(`Latest: ${latest} (${sizeKb} KB)`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
info("Log directory not created yet (will be created on first run)");
|
|
138
|
+
}
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
function checkHubUrl() {
|
|
142
|
+
const hubUrl = process.env.SWARM_HUB_URL;
|
|
143
|
+
if (hubUrl) {
|
|
144
|
+
ok(`SWARM_HUB_URL = ${hubUrl}`);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
warn("SWARM_HUB_URL not set — Hub connectivity disabled");
|
|
149
|
+
info("Set it in your MCP config env to enable remote sync");
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function checkIdeConfigs() {
|
|
154
|
+
const homeDir = os.homedir();
|
|
155
|
+
const configs = [
|
|
156
|
+
{ name: "Claude Code", path: path.join(homeDir, ".claude", "mcp_config.json") },
|
|
157
|
+
{ name: "Cursor", path: path.join(process.cwd(), ".cursor", "mcp.json") },
|
|
158
|
+
{ name: "Windsurf", path: path.join(process.cwd(), ".windsurf", "mcp.json") },
|
|
159
|
+
{ name: "Antigravity", path: path.join(homeDir, ".gemini", "antigravity", "mcp_config.json") },
|
|
160
|
+
];
|
|
161
|
+
let found = 0;
|
|
162
|
+
for (const cfg of configs) {
|
|
163
|
+
if (fs.existsSync(cfg.path)) {
|
|
164
|
+
try {
|
|
165
|
+
const content = JSON.parse(fs.readFileSync(cfg.path, "utf-8"));
|
|
166
|
+
const hasMcpSwarm = content.mcpServers?.["mcp-swarm"];
|
|
167
|
+
if (hasMcpSwarm) {
|
|
168
|
+
ok(`${cfg.name} — MCP Swarm configured`);
|
|
169
|
+
found++;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
info(`${cfg.name} — Config exists but MCP Swarm not configured`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
warn(`${cfg.name} — Config exists but cannot parse`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (found === 0) {
|
|
181
|
+
info("No IDE configs found with MCP Swarm. See examples/ for setup.");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function checkLatestVersion(currentVersion) {
|
|
185
|
+
return new Promise((resolve) => {
|
|
186
|
+
const req = http.get("http://registry.npmjs.org/mcp-swarm/latest", (res) => {
|
|
187
|
+
let data = "";
|
|
188
|
+
res.on("data", (chunk) => data += chunk);
|
|
189
|
+
res.on("end", () => {
|
|
190
|
+
try {
|
|
191
|
+
const json = JSON.parse(data);
|
|
192
|
+
const latest = json.version;
|
|
193
|
+
if (latest === currentVersion) {
|
|
194
|
+
ok(`Latest version (${currentVersion}) — up to date`);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
warn(`Update available: ${currentVersion} → ${latest}`);
|
|
198
|
+
info(`Run: npm install -g mcp-swarm@latest`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
info("Could not check npm registry");
|
|
203
|
+
}
|
|
204
|
+
resolve();
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
req.on("error", () => {
|
|
208
|
+
info("Could not reach npm registry (offline?)");
|
|
209
|
+
resolve();
|
|
210
|
+
});
|
|
211
|
+
req.setTimeout(5000, () => {
|
|
212
|
+
req.destroy();
|
|
213
|
+
info("npm registry timeout");
|
|
214
|
+
resolve();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// ============ MAIN ============
|
|
219
|
+
async function main() {
|
|
220
|
+
const version = getVersion();
|
|
221
|
+
console.log(`
|
|
222
|
+
${c.bright}🐝 MCP Swarm Doctor v${version}${c.reset}
|
|
223
|
+
${c.dim}${"─".repeat(40)}${c.reset}`);
|
|
224
|
+
header("📋 System");
|
|
225
|
+
checkNode();
|
|
226
|
+
checkGit();
|
|
227
|
+
header("🐝 Companion");
|
|
228
|
+
checkPidFile();
|
|
229
|
+
await checkPort(37373);
|
|
230
|
+
checkLogDir();
|
|
231
|
+
header("🌐 Network");
|
|
232
|
+
checkHubUrl();
|
|
233
|
+
await checkLatestVersion(version);
|
|
234
|
+
header("🔧 IDE Configs");
|
|
235
|
+
checkIdeConfigs();
|
|
236
|
+
console.log(`\n${c.dim}${"─".repeat(40)}${c.reset}`);
|
|
237
|
+
console.log(`${c.bright}Done!${c.reset} If you see warnings, follow the suggestions above.\n`);
|
|
238
|
+
}
|
|
239
|
+
main().catch(err => {
|
|
240
|
+
console.error("Doctor error:", err.message);
|
|
241
|
+
process.exit(1);
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Swarm — File Logger
|
|
3
|
+
*
|
|
4
|
+
* Writes logs to ~/.mcp-swarm/logs/ with daily rotation.
|
|
5
|
+
* Keeps last 7 days of logs automatically.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import os from "node:os";
|
|
10
|
+
const LOG_DIR = path.join(os.homedir(), ".mcp-swarm", "logs");
|
|
11
|
+
const MAX_LOG_DAYS = 7;
|
|
12
|
+
let logStream = null;
|
|
13
|
+
let currentLogDate = "";
|
|
14
|
+
function getDateStr() {
|
|
15
|
+
const d = new Date();
|
|
16
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
17
|
+
}
|
|
18
|
+
function getTimestamp() {
|
|
19
|
+
return new Date().toISOString();
|
|
20
|
+
}
|
|
21
|
+
function ensureLogDir() {
|
|
22
|
+
if (!fs.existsSync(LOG_DIR)) {
|
|
23
|
+
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function getLogStream() {
|
|
27
|
+
const today = getDateStr();
|
|
28
|
+
if (logStream && currentLogDate === today) {
|
|
29
|
+
return logStream;
|
|
30
|
+
}
|
|
31
|
+
// Close previous stream
|
|
32
|
+
if (logStream) {
|
|
33
|
+
try {
|
|
34
|
+
logStream.end();
|
|
35
|
+
}
|
|
36
|
+
catch { /* ignore */ }
|
|
37
|
+
}
|
|
38
|
+
ensureLogDir();
|
|
39
|
+
const logFile = path.join(LOG_DIR, `companion-${today}.log`);
|
|
40
|
+
logStream = fs.createWriteStream(logFile, { flags: "a" });
|
|
41
|
+
currentLogDate = today;
|
|
42
|
+
// Cleanup old logs
|
|
43
|
+
cleanupOldLogs();
|
|
44
|
+
return logStream;
|
|
45
|
+
}
|
|
46
|
+
function cleanupOldLogs() {
|
|
47
|
+
try {
|
|
48
|
+
const files = fs.readdirSync(LOG_DIR).filter(f => f.startsWith("companion-") && f.endsWith(".log"));
|
|
49
|
+
if (files.length <= MAX_LOG_DAYS)
|
|
50
|
+
return;
|
|
51
|
+
files.sort();
|
|
52
|
+
const toRemove = files.slice(0, files.length - MAX_LOG_DAYS);
|
|
53
|
+
for (const f of toRemove) {
|
|
54
|
+
try {
|
|
55
|
+
fs.unlinkSync(path.join(LOG_DIR, f));
|
|
56
|
+
}
|
|
57
|
+
catch { /* ignore */ }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch { /* ignore */ }
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Write a log entry to both console callback and file
|
|
64
|
+
*/
|
|
65
|
+
export function fileLog(level, message) {
|
|
66
|
+
try {
|
|
67
|
+
const stream = getLogStream();
|
|
68
|
+
const line = `[${getTimestamp()}] [${level.toUpperCase().padEnd(7)}] ${message}\n`;
|
|
69
|
+
stream.write(line);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Non-critical — don't crash companion if logging fails
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Close the log stream gracefully
|
|
77
|
+
*/
|
|
78
|
+
export function closeFileLog() {
|
|
79
|
+
if (logStream) {
|
|
80
|
+
try {
|
|
81
|
+
logStream.end();
|
|
82
|
+
}
|
|
83
|
+
catch { /* ignore */ }
|
|
84
|
+
logStream = null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the path to today's log file
|
|
89
|
+
*/
|
|
90
|
+
export function getLogFilePath() {
|
|
91
|
+
return path.join(LOG_DIR, `companion-${getDateStr()}.log`);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the log directory path
|
|
95
|
+
*/
|
|
96
|
+
export function getLogDir() {
|
|
97
|
+
return LOG_DIR;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=fileLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLogger.js","sourceRoot":"","sources":["../src/fileLogger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAC9D,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,IAAI,SAAS,GAA0B,IAAI,CAAC;AAC5C,IAAI,cAAc,GAAW,EAAE,CAAC;AAEhC,SAAS,UAAU;IACf,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACrH,CAAC;AAED,SAAS,YAAY;IACjB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,YAAY;IACjB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC;AAED,SAAS,YAAY;IACjB,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAE3B,IAAI,SAAS,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,wBAAwB;IACxB,IAAI,SAAS,EAAE,CAAC;QACZ,IAAI,CAAC;YAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,YAAY,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,KAAK,MAAM,CAAC,CAAC;IAC7D,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,cAAc,GAAG,KAAK,CAAC;IAEvB,mBAAmB;IACnB,cAAc,EAAE,CAAC;IAEjB,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,cAAc;IACnB,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpG,IAAI,KAAK,CAAC,MAAM,IAAI,YAAY;YAAE,OAAO;QAEzC,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACvB,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAID;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,KAAe,EAAE,OAAe;IACpD,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC;QACnF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACL,wDAAwD;IAC5D,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IACxB,IAAI,SAAS,EAAE,CAAC;QACZ,IAAI,CAAC;YAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC/C,SAAS,GAAG,IAAI,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,UAAU,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACrB,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Swarm — Filesystem Sandbox
|
|
3
|
+
*
|
|
4
|
+
* Wraps fs operations to prevent agents from accessing files
|
|
5
|
+
* outside the allowed project directory.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const sandbox = createSandbox('/home/user/my-project');
|
|
9
|
+
* sandbox.readFile('src/index.ts'); // OK
|
|
10
|
+
* sandbox.readFile('../../etc/passwd'); // THROWS
|
|
11
|
+
*/
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
export class FsSandboxError extends Error {
|
|
15
|
+
attemptedPath;
|
|
16
|
+
resolvedPath;
|
|
17
|
+
allowedRoot;
|
|
18
|
+
constructor(attemptedPath, resolvedPath, allowedRoot) {
|
|
19
|
+
super(`🛡️ Sandbox violation: "${attemptedPath}" resolves to "${resolvedPath}" which is outside allowed root "${allowedRoot}"`);
|
|
20
|
+
this.attemptedPath = attemptedPath;
|
|
21
|
+
this.resolvedPath = resolvedPath;
|
|
22
|
+
this.allowedRoot = allowedRoot;
|
|
23
|
+
this.name = "FsSandboxError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates a filesystem sandbox restricted to the given root directory.
|
|
28
|
+
* Any attempt to access files outside this directory will throw FsSandboxError.
|
|
29
|
+
*/
|
|
30
|
+
export function createSandbox(rootDir) {
|
|
31
|
+
const normalizedRoot = path.resolve(rootDir);
|
|
32
|
+
function validatePath(filePath) {
|
|
33
|
+
const resolved = path.resolve(normalizedRoot, filePath);
|
|
34
|
+
const relative = path.relative(normalizedRoot, resolved);
|
|
35
|
+
// If relative path starts with ".." or is absolute, it's outside the sandbox
|
|
36
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
37
|
+
throw new FsSandboxError(filePath, resolved, normalizedRoot);
|
|
38
|
+
}
|
|
39
|
+
return resolved;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
root: normalizedRoot,
|
|
43
|
+
resolve(filePath) {
|
|
44
|
+
return validatePath(filePath);
|
|
45
|
+
},
|
|
46
|
+
isAllowed(filePath) {
|
|
47
|
+
try {
|
|
48
|
+
validatePath(filePath);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
readFile(filePath, encoding = "utf-8") {
|
|
56
|
+
const safePath = validatePath(filePath);
|
|
57
|
+
return fs.readFileSync(safePath, encoding);
|
|
58
|
+
},
|
|
59
|
+
writeFile(filePath, content) {
|
|
60
|
+
const safePath = validatePath(filePath);
|
|
61
|
+
const dir = path.dirname(safePath);
|
|
62
|
+
if (!fs.existsSync(dir)) {
|
|
63
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
fs.writeFileSync(safePath, content, "utf-8");
|
|
66
|
+
},
|
|
67
|
+
exists(filePath) {
|
|
68
|
+
const safePath = validatePath(filePath);
|
|
69
|
+
return fs.existsSync(safePath);
|
|
70
|
+
},
|
|
71
|
+
readDir(dirPath) {
|
|
72
|
+
const safePath = validatePath(dirPath);
|
|
73
|
+
return fs.readdirSync(safePath);
|
|
74
|
+
},
|
|
75
|
+
stat(filePath) {
|
|
76
|
+
const safePath = validatePath(filePath);
|
|
77
|
+
return fs.statSync(safePath);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=fsSandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fsSandbox.js","sourceRoot":"","sources":["../src/fsSandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,OAAO,cAAe,SAAQ,KAAK;IAEjB;IACA;IACA;IAHpB,YACoB,aAAqB,EACrB,YAAoB,EACpB,WAAmB;QAEnC,KAAK,CAAC,2BAA2B,aAAa,kBAAkB,YAAY,oCAAoC,WAAW,GAAG,CAAC,CAAC;QAJhH,kBAAa,GAAb,aAAa,CAAQ;QACrB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,gBAAW,GAAX,WAAW,CAAQ;QAGnC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IACjC,CAAC;CACJ;AA4BD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C,SAAS,YAAY,CAAC,QAAgB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAEzD,6EAA6E;QAC7E,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO;QACH,IAAI,EAAE,cAAc;QAEpB,OAAO,CAAC,QAAgB;YACpB,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,SAAS,CAAC,QAAgB;YACtB,IAAI,CAAC;gBACD,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,QAAgB,EAAE,WAA2B,OAAO;YACzD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAED,SAAS,CAAC,QAAgB,EAAE,OAAe;YACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,CAAC,QAAgB;YACnB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,OAAe;YACnB,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACvC,OAAO,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,QAAgB;YACjB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;KACJ,CAAC;AACN,CAAC"}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import tseslint from "typescript-eslint";
|
|
2
|
+
|
|
3
|
+
export default tseslint.config(
|
|
4
|
+
{
|
|
5
|
+
ignores: ["dist/**", "node_modules/**", "dashboard/**", "cloudflare/**", "-p/**"],
|
|
6
|
+
},
|
|
7
|
+
...tseslint.configs.recommended,
|
|
8
|
+
{
|
|
9
|
+
rules: {
|
|
10
|
+
"@typescript-eslint/no-explicit-any": "warn",
|
|
11
|
+
"@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
|
|
12
|
+
"no-console": "off",
|
|
13
|
+
},
|
|
14
|
+
}
|
|
15
|
+
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-swarm",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Universal AI agent coordination platform with 26 consolidated smart tools, 21 AI models (Kimi K2.5, GPT-5.3, Opus 4.6), EWC++ self-learning, semantic caching, and Q-Learning routing",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"mcp-swarm": "./dist/serverSmart.js",
|
|
27
27
|
"mcp-swarm-remote": "./dist/remote/index.js",
|
|
28
28
|
"mcp-swarm-companion": "./dist/companion.js",
|
|
29
|
+
"mcp-swarm-doctor": "./dist/doctor.js",
|
|
29
30
|
"mcp-swarm-install": "./dist/installer/index.js"
|
|
30
31
|
},
|
|
31
32
|
"scripts": {
|
|
@@ -41,7 +42,11 @@
|
|
|
41
42
|
"dashboard:install": "cd dashboard && npm install",
|
|
42
43
|
"dashboard": "concurrently \"npm run dashboard:api\" \"npm run dashboard:ui\"",
|
|
43
44
|
"dashboard:build": "cd dashboard && npm run build",
|
|
44
|
-
"test": "node --enable-source-maps dist/tests/newModules.test.js"
|
|
45
|
+
"test": "node --enable-source-maps dist/tests/newModules.test.js",
|
|
46
|
+
"lint": "eslint src/",
|
|
47
|
+
"lint:fix": "eslint src/ --fix",
|
|
48
|
+
"format": "prettier --write src/",
|
|
49
|
+
"format:check": "prettier --check src/"
|
|
45
50
|
},
|
|
46
51
|
"dependencies": {
|
|
47
52
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
@@ -53,6 +58,10 @@
|
|
|
53
58
|
"@types/node": "^22.10.2",
|
|
54
59
|
"@types/ws": "^8.18.0",
|
|
55
60
|
"concurrently": "^8.2.2",
|
|
56
|
-
"
|
|
61
|
+
"eslint": "^9.39.2",
|
|
62
|
+
"eslint-config-prettier": "^10.1.8",
|
|
63
|
+
"prettier": "^3.8.1",
|
|
64
|
+
"typescript": "^5.6.3",
|
|
65
|
+
"typescript-eslint": "^8.54.0"
|
|
57
66
|
}
|
|
58
67
|
}
|