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.
@@ -0,0 +1,6 @@
1
+ dist
2
+ node_modules
3
+ dashboard
4
+ cloudflare
5
+ -p
6
+ *.md
package/.prettierrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "semi": true,
3
+ "singleQuote": false,
4
+ "trailingComma": "all",
5
+ "printWidth": 120,
6
+ "tabWidth": 2,
7
+ "endOfLine": "lf"
8
+ }
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 к Remote MCP
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 log and continue
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", `📁 Project ID: ${colors.bright}${projectId}${colors.reset} (source: ${projectInfo.source})`);
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", `📱 Project registered in Telegram for user ${telegramUserId}`);
143
+ log("success", `рџ“± Project registered in Telegram for user ${telegramUserId}`);
138
144
  }
139
145
  else {
140
- log("warn", `📱 Failed to register project in Telegram (will retry later)`);
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", `🎯 ${colors.bright}ORCHESTRATOR MODE${colors.reset} - Running in INFINITE LOOP`);
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", `👷 ${colors.bright}EXECUTOR MODE${colors.reset} - Orchestrator: ${electionResult.orchestratorName}`);
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
- // Если задан MCP_SERVER_URL, автоматически подключаемся к Remote MCP
187
+ // Если задан MCP_SERVER_URL, автоматически подключаемся к Remote MCP
182
188
  let bridgeManager = null;
183
189
  if (cfg.mcpServerUrl) {
184
- log("info", `🌉 Auto-Bridge enabled: ${cfg.mcpServerUrl}`);
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", `🌉 Auto-adding project: ${projectPath}`);
278
+ log("info", `рџЊ‰ Auto-adding project: ${projectPath}`);
273
279
  bridgeManager.addProject(projectPath).then(() => {
274
- log("success", `🌉 Project added: ${projectPath}`);
280
+ log("success", `рџЊ‰ Project added: ${projectPath}`);
275
281
  }).catch(err => {
276
- log("error", `🌉 Failed to add project: ${err.message}`);
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", `🌉 Project removed: ${projectPath}`);
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 / Beautiful HTML dashboard
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(`<!DOCTYPE html>
320
- <html lang="en">
321
- <head>
322
- <meta charset="UTF-8">
323
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
324
- <meta http-equiv="refresh" content="5">
325
- <title>🐝 MCP Swarm — Dashboard</title>
326
- <style>
327
- * { margin: 0; padding: 0; box-sizing: border-box; }
328
- body { font-family: 'Segoe UI', system-ui, sans-serif; background: #0d1117; color: #e6edf3; min-height: 100vh; padding: 2rem; }
329
- .container { max-width: 900px; margin: 0 auto; }
330
- h1 { font-size: 2rem; margin-bottom: 0.5rem; }
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", " ORCHESTRATOR STOP REQUESTED BY USER");
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
- // Если пришёл event с новым repoPath автоматически подключаем bridge
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", `🔍 Auto-detected new project: ${eventRepoPath}`);
414
+ log("info", `рџ”Ќ Auto-detected new project: ${eventRepoPath}`);
495
415
  bridgeManager.addProject(eventRepoPath).catch(err => {
496
- log("error", `🌉 Failed to auto-add: ${err.message}`);
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
- ? "🔄 INFINITE LOOP MODE - Type 'stop' to exit"
518
- : "🔄 EXECUTOR MODE - Will stop when orchestrator stops or task complete");
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", `📬 ${inbox.unread} unread message(s) in inbox`);
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", `🚨 URGENT: ${msg.subject} from ${msg.from}`);
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", `📢 New task announced: ${ev.payload?.taskId}`);
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", "🌉 Bridge stopped");
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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"companion.js","sourceRoot":"","sources":["../src/companion.ts"],"names":[],"mappings":"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"}
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":"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"}
@@ -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"}
@@ -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.0",
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
- "typescript": "^5.6.3"
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
  }