@claude-flow/cli 3.5.24 → 3.5.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/src/commands/index.d.ts.map +1 -1
  2. package/dist/src/commands/index.js +2 -0
  3. package/dist/src/commands/index.js.map +1 -1
  4. package/dist/src/mcp-tools/browser-tools.js +2 -2
  5. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  6. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
  7. package/dist/src/mcp-tools/config-tools.js +10 -1
  8. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  9. package/dist/src/mcp-tools/index.d.ts +2 -0
  10. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  11. package/dist/src/mcp-tools/index.js +2 -0
  12. package/dist/src/mcp-tools/index.js.map +1 -1
  13. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  14. package/dist/src/mcp-tools/memory-tools.js +2 -0
  15. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  16. package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  17. package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
  18. package/dist/src/mcp-tools/ruvllm-tools.js +283 -0
  19. package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
  20. package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
  21. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
  22. package/dist/src/mcp-tools/swarm-tools.js +216 -30
  23. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  24. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
  25. package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
  26. package/dist/src/mcp-tools/wasm-agent-tools.js +230 -0
  27. package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
  28. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  29. package/dist/src/memory/memory-initializer.js +65 -6
  30. package/dist/src/memory/memory-initializer.js.map +1 -1
  31. package/dist/src/ruvector/agent-wasm.d.ts +182 -0
  32. package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
  33. package/dist/src/ruvector/agent-wasm.js +316 -0
  34. package/dist/src/ruvector/agent-wasm.js.map +1 -0
  35. package/dist/src/ruvector/index.d.ts +2 -0
  36. package/dist/src/ruvector/index.d.ts.map +1 -1
  37. package/dist/src/ruvector/index.js +4 -0
  38. package/dist/src/ruvector/index.js.map +1 -1
  39. package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
  40. package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
  41. package/dist/src/ruvector/ruvllm-wasm.js +363 -0
  42. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
  43. package/dist/src/transfer/storage/gcs.d.ts.map +1 -1
  44. package/dist/src/transfer/storage/gcs.js +22 -6
  45. package/dist/src/transfer/storage/gcs.js.map +1 -1
  46. package/dist/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +6 -3
@@ -0,0 +1,283 @@
1
+ /**
2
+ * RuVector LLM WASM MCP Tools
3
+ *
4
+ * Exposes @ruvector/ruvllm-wasm operations via MCP protocol.
5
+ * All tools gracefully degrade when the WASM package is not installed.
6
+ */
7
+ async function loadRuvllmWasm() {
8
+ return import('../ruvector/ruvllm-wasm.js');
9
+ }
10
+ export const ruvllmWasmTools = [
11
+ {
12
+ name: 'ruvllm_status',
13
+ description: 'Get ruvllm-wasm availability and initialization status.',
14
+ inputSchema: { type: 'object', properties: {} },
15
+ handler: async () => {
16
+ try {
17
+ const mod = await loadRuvllmWasm();
18
+ const status = await mod.getRuvllmStatus();
19
+ return { content: [{ type: 'text', text: JSON.stringify(status, null, 2) }] };
20
+ }
21
+ catch (err) {
22
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
23
+ }
24
+ },
25
+ },
26
+ {
27
+ name: 'ruvllm_hnsw_create',
28
+ description: 'Create a WASM HNSW router for semantic pattern routing. Max ~11 patterns (v2.0.1 limit).',
29
+ inputSchema: {
30
+ type: 'object',
31
+ properties: {
32
+ dimensions: { type: 'number', description: 'Embedding dimensions (e.g., 64, 128, 384)' },
33
+ maxPatterns: { type: 'number', description: 'Max patterns capacity (limit ~11 in v2.0.1)' },
34
+ efSearch: { type: 'number', description: 'HNSW ef search parameter (higher = more accurate, slower)' },
35
+ },
36
+ required: ['dimensions', 'maxPatterns'],
37
+ },
38
+ handler: async (args) => {
39
+ try {
40
+ const mod = await loadRuvllmWasm();
41
+ const router = await mod.createHnswRouter({
42
+ dimensions: args.dimensions,
43
+ maxPatterns: args.maxPatterns,
44
+ efSearch: args.efSearch,
45
+ });
46
+ // Store router in module-level registry
47
+ const id = `hnsw-${Date.now().toString(36)}`;
48
+ hnswRouters.set(id, router);
49
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, routerId: id, dimensions: args.dimensions, maxPatterns: args.maxPatterns }) }] };
50
+ }
51
+ catch (err) {
52
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
53
+ }
54
+ },
55
+ },
56
+ {
57
+ name: 'ruvllm_hnsw_add',
58
+ description: 'Add a pattern to an HNSW router. Embedding must match router dimensions.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ routerId: { type: 'string', description: 'HNSW router ID from ruvllm_hnsw_create' },
63
+ name: { type: 'string', description: 'Pattern name/label' },
64
+ embedding: { type: 'array', description: 'Float array embedding vector' },
65
+ metadata: { type: 'object', description: 'Optional metadata object' },
66
+ },
67
+ required: ['routerId', 'name', 'embedding'],
68
+ },
69
+ handler: async (args) => {
70
+ try {
71
+ const router = hnswRouters.get(args.routerId);
72
+ if (!router)
73
+ return { content: [{ type: 'text', text: JSON.stringify({ error: `Router not found: ${args.routerId}` }) }], isError: true };
74
+ const embedding = new Float32Array(args.embedding);
75
+ const ok = router.addPattern({
76
+ name: args.name,
77
+ embedding,
78
+ metadata: args.metadata,
79
+ });
80
+ return { content: [{ type: 'text', text: JSON.stringify({ success: ok, patternCount: router.patternCount() }) }] };
81
+ }
82
+ catch (err) {
83
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
84
+ }
85
+ },
86
+ },
87
+ {
88
+ name: 'ruvllm_hnsw_route',
89
+ description: 'Route a query embedding to nearest patterns in HNSW index.',
90
+ inputSchema: {
91
+ type: 'object',
92
+ properties: {
93
+ routerId: { type: 'string', description: 'HNSW router ID' },
94
+ query: { type: 'array', description: 'Query embedding vector' },
95
+ k: { type: 'number', description: 'Number of nearest neighbors (default: 3)' },
96
+ },
97
+ required: ['routerId', 'query'],
98
+ },
99
+ handler: async (args) => {
100
+ try {
101
+ const router = hnswRouters.get(args.routerId);
102
+ if (!router)
103
+ return { content: [{ type: 'text', text: JSON.stringify({ error: `Router not found: ${args.routerId}` }) }], isError: true };
104
+ const query = new Float32Array(args.query);
105
+ const results = router.route(query, args.k ?? 3);
106
+ return { content: [{ type: 'text', text: JSON.stringify({ results }) }] };
107
+ }
108
+ catch (err) {
109
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
110
+ }
111
+ },
112
+ },
113
+ {
114
+ name: 'ruvllm_sona_create',
115
+ description: 'Create a SONA instant adaptation loop (<1ms adaptation cycles).',
116
+ inputSchema: {
117
+ type: 'object',
118
+ properties: {
119
+ hiddenDim: { type: 'number', description: 'Hidden dimension (default: 64)' },
120
+ learningRate: { type: 'number', description: 'Learning rate (default: 0.01)' },
121
+ patternCapacity: { type: 'number', description: 'Max stored patterns' },
122
+ },
123
+ },
124
+ handler: async (args) => {
125
+ try {
126
+ const mod = await loadRuvllmWasm();
127
+ const sona = await mod.createSonaInstant({
128
+ hiddenDim: args.hiddenDim,
129
+ learningRate: args.learningRate,
130
+ patternCapacity: args.patternCapacity,
131
+ });
132
+ const id = `sona-${Date.now().toString(36)}`;
133
+ sonaInstances.set(id, sona);
134
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, sonaId: id }) }] };
135
+ }
136
+ catch (err) {
137
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
138
+ }
139
+ },
140
+ },
141
+ {
142
+ name: 'ruvllm_sona_adapt',
143
+ description: 'Run SONA instant adaptation with a quality signal.',
144
+ inputSchema: {
145
+ type: 'object',
146
+ properties: {
147
+ sonaId: { type: 'string', description: 'SONA instance ID' },
148
+ quality: { type: 'number', description: 'Quality signal (0.0-1.0)' },
149
+ },
150
+ required: ['sonaId', 'quality'],
151
+ },
152
+ handler: async (args) => {
153
+ try {
154
+ const sona = sonaInstances.get(args.sonaId);
155
+ if (!sona)
156
+ return { content: [{ type: 'text', text: JSON.stringify({ error: `SONA not found: ${args.sonaId}` }) }], isError: true };
157
+ sona.adapt(args.quality);
158
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, stats: sona.stats() }) }] };
159
+ }
160
+ catch (err) {
161
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
162
+ }
163
+ },
164
+ },
165
+ {
166
+ name: 'ruvllm_microlora_create',
167
+ description: 'Create a MicroLoRA adapter (ultra-lightweight LoRA, ranks 1-4).',
168
+ inputSchema: {
169
+ type: 'object',
170
+ properties: {
171
+ inputDim: { type: 'number', description: 'Input dimension' },
172
+ outputDim: { type: 'number', description: 'Output dimension' },
173
+ rank: { type: 'number', description: 'LoRA rank (1-4, default: 2)' },
174
+ alpha: { type: 'number', description: 'LoRA alpha scaling (default: 1.0)' },
175
+ },
176
+ required: ['inputDim', 'outputDim'],
177
+ },
178
+ handler: async (args) => {
179
+ try {
180
+ const mod = await loadRuvllmWasm();
181
+ const lora = await mod.createMicroLora({
182
+ inputDim: args.inputDim,
183
+ outputDim: args.outputDim,
184
+ rank: args.rank,
185
+ alpha: args.alpha,
186
+ });
187
+ const id = `lora-${Date.now().toString(36)}`;
188
+ loraInstances.set(id, lora);
189
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, loraId: id }) }] };
190
+ }
191
+ catch (err) {
192
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
193
+ }
194
+ },
195
+ },
196
+ {
197
+ name: 'ruvllm_microlora_adapt',
198
+ description: 'Adapt MicroLoRA weights with quality feedback.',
199
+ inputSchema: {
200
+ type: 'object',
201
+ properties: {
202
+ loraId: { type: 'string', description: 'MicroLoRA instance ID' },
203
+ quality: { type: 'number', description: 'Quality signal (0.0-1.0)' },
204
+ learningRate: { type: 'number', description: 'Learning rate (default: 0.01)' },
205
+ success: { type: 'boolean', description: 'Whether the adaptation was successful (default: true)' },
206
+ },
207
+ required: ['loraId', 'quality'],
208
+ },
209
+ handler: async (args) => {
210
+ try {
211
+ const lora = loraInstances.get(args.loraId);
212
+ if (!lora)
213
+ return { content: [{ type: 'text', text: JSON.stringify({ error: `MicroLoRA not found: ${args.loraId}` }) }], isError: true };
214
+ lora.adapt(args.quality, args.learningRate, args.success);
215
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, stats: lora.stats() }) }] };
216
+ }
217
+ catch (err) {
218
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
219
+ }
220
+ },
221
+ },
222
+ {
223
+ name: 'ruvllm_chat_format',
224
+ description: 'Format chat messages using a template (llama3, mistral, chatml, phi, gemma, or auto-detect).',
225
+ inputSchema: {
226
+ type: 'object',
227
+ properties: {
228
+ messages: {
229
+ type: 'array',
230
+ description: 'Array of {role, content} message objects',
231
+ },
232
+ template: { type: 'string', description: 'Template preset (llama3, mistral, chatml, phi, gemma) or model ID for auto-detection' },
233
+ },
234
+ required: ['messages', 'template'],
235
+ },
236
+ handler: async (args) => {
237
+ try {
238
+ const mod = await loadRuvllmWasm();
239
+ const messages = args.messages;
240
+ const templateStr = args.template;
241
+ const presets = ['llama3', 'mistral', 'chatml', 'phi', 'gemma'];
242
+ const template = presets.includes(templateStr)
243
+ ? templateStr
244
+ : { modelId: templateStr };
245
+ const formatted = await mod.formatChat(messages, template);
246
+ return { content: [{ type: 'text', text: formatted }] };
247
+ }
248
+ catch (err) {
249
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
250
+ }
251
+ },
252
+ },
253
+ {
254
+ name: 'ruvllm_generate_config',
255
+ description: 'Create a generation config (maxTokens, temperature, topP, etc.) as JSON.',
256
+ inputSchema: {
257
+ type: 'object',
258
+ properties: {
259
+ maxTokens: { type: 'number', description: 'Max tokens to generate' },
260
+ temperature: { type: 'number', description: 'Sampling temperature (note: f32 precision)' },
261
+ topP: { type: 'number', description: 'Top-p sampling' },
262
+ topK: { type: 'number', description: 'Top-k sampling' },
263
+ repetitionPenalty: { type: 'number', description: 'Repetition penalty' },
264
+ stopSequences: { type: 'array', description: 'Stop sequences' },
265
+ },
266
+ },
267
+ handler: async (args) => {
268
+ try {
269
+ const mod = await loadRuvllmWasm();
270
+ const config = await mod.createGenerateConfig(args);
271
+ return { content: [{ type: 'text', text: config }] };
272
+ }
273
+ catch (err) {
274
+ return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
275
+ }
276
+ },
277
+ },
278
+ ];
279
+ // ── Instance Registries ──────────────────────────────────────
280
+ const hnswRouters = new Map();
281
+ const sonaInstances = new Map();
282
+ const loraInstances = new Map();
283
+ //# sourceMappingURL=ruvllm-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruvllm-tools.js","sourceRoot":"","sources":["../../../src/mcp-tools/ruvllm-tools.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Swarm MCP Tools for CLI
3
3
  *
4
- * Tool definitions for swarm coordination.
4
+ * Tool definitions for swarm coordination with file-based state persistence.
5
+ * Replaces previous stub implementations with real state tracking.
5
6
  */
6
7
  import type { MCPTool } from './types.js';
7
8
  export declare const swarmTools: MCPTool[];
@@ -1 +1 @@
1
- {"version":3,"file":"swarm-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/swarm-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,UAAU,EAAE,OAAO,EAgG/B,CAAC"}
1
+ {"version":3,"file":"swarm-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/swarm-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA0D1C,eAAO,MAAM,UAAU,EAAE,OAAO,EAuQ/B,CAAC"}
@@ -1,82 +1,212 @@
1
1
  /**
2
2
  * Swarm MCP Tools for CLI
3
3
  *
4
- * Tool definitions for swarm coordination.
4
+ * Tool definitions for swarm coordination with file-based state persistence.
5
+ * Replaces previous stub implementations with real state tracking.
5
6
  */
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ // Swarm state persistence
10
+ const SWARM_DIR = '.claude-flow/swarm';
11
+ const SWARM_STATE_FILE = 'swarm-state.json';
12
+ function getSwarmDir() {
13
+ return join(process.cwd(), SWARM_DIR);
14
+ }
15
+ function getSwarmStatePath() {
16
+ return join(getSwarmDir(), SWARM_STATE_FILE);
17
+ }
18
+ function ensureSwarmDir() {
19
+ const dir = getSwarmDir();
20
+ if (!existsSync(dir)) {
21
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
22
+ }
23
+ }
24
+ function loadSwarmStore() {
25
+ try {
26
+ const path = getSwarmStatePath();
27
+ if (existsSync(path)) {
28
+ return JSON.parse(readFileSync(path, 'utf-8'));
29
+ }
30
+ }
31
+ catch { /* return default */ }
32
+ return { swarms: {}, version: '3.0.0' };
33
+ }
34
+ function saveSwarmStore(store) {
35
+ ensureSwarmDir();
36
+ writeFileSync(getSwarmStatePath(), JSON.stringify(store, null, 2), 'utf-8');
37
+ }
38
+ // Input validation
39
+ const VALID_TOPOLOGIES = new Set([
40
+ 'hierarchical', 'mesh', 'hierarchical-mesh', 'ring', 'star', 'hybrid', 'adaptive',
41
+ ]);
6
42
  export const swarmTools = [
7
43
  {
8
44
  name: 'swarm_init',
9
- description: 'Initialize a swarm',
45
+ description: 'Initialize a swarm with persistent state tracking',
10
46
  category: 'swarm',
11
47
  inputSchema: {
12
48
  type: 'object',
13
49
  properties: {
14
- topology: { type: 'string', description: 'Swarm topology type' },
15
- maxAgents: { type: 'number', description: 'Maximum number of agents' },
16
- config: { type: 'object', description: 'Swarm configuration' },
50
+ topology: { type: 'string', description: 'Swarm topology type (hierarchical, mesh, hierarchical-mesh, ring, star, hybrid, adaptive)' },
51
+ maxAgents: { type: 'number', description: 'Maximum number of agents (1-50)' },
52
+ strategy: { type: 'string', description: 'Agent strategy (specialized, balanced, adaptive)' },
53
+ config: { type: 'object', description: 'Additional swarm configuration' },
17
54
  },
18
55
  },
19
56
  handler: async (input) => {
20
57
  const topology = input.topology || 'hierarchical-mesh';
21
- const maxAgents = input.maxAgents || 15;
58
+ const maxAgents = Math.min(Math.max(input.maxAgents || 15, 1), 50);
59
+ const strategy = input.strategy || 'specialized';
22
60
  const config = (input.config || {});
23
- return {
24
- success: true,
25
- swarmId: `swarm-${Date.now()}`,
61
+ if (!VALID_TOPOLOGIES.has(topology)) {
62
+ return {
63
+ success: false,
64
+ error: `Invalid topology: ${topology}. Valid: ${[...VALID_TOPOLOGIES].join(', ')}`,
65
+ };
66
+ }
67
+ const swarmId = `swarm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
68
+ const now = new Date().toISOString();
69
+ const swarmState = {
70
+ swarmId,
26
71
  topology,
27
- initializedAt: new Date().toISOString(),
72
+ maxAgents,
73
+ status: 'running',
74
+ agents: [],
75
+ tasks: [],
28
76
  config: {
29
77
  topology,
30
78
  maxAgents,
31
- currentAgents: 0,
79
+ strategy,
32
80
  communicationProtocol: config.communicationProtocol || 'message-bus',
33
81
  autoScaling: config.autoScaling ?? true,
34
82
  consensusMechanism: config.consensusMechanism || 'majority',
35
83
  },
84
+ createdAt: now,
85
+ updatedAt: now,
86
+ };
87
+ const store = loadSwarmStore();
88
+ store.swarms[swarmId] = swarmState;
89
+ saveSwarmStore(store);
90
+ return {
91
+ success: true,
92
+ swarmId,
93
+ topology,
94
+ strategy,
95
+ maxAgents,
96
+ initializedAt: now,
97
+ config: swarmState.config,
98
+ persisted: true,
36
99
  };
37
100
  },
38
101
  },
39
102
  {
40
103
  name: 'swarm_status',
41
- description: 'Get swarm status',
104
+ description: 'Get swarm status from persistent state',
42
105
  category: 'swarm',
43
106
  inputSchema: {
44
107
  type: 'object',
45
108
  properties: {
46
- swarmId: { type: 'string', description: 'Swarm ID' },
109
+ swarmId: { type: 'string', description: 'Swarm ID (omit for most recent)' },
47
110
  },
48
111
  },
49
112
  handler: async (input) => {
113
+ const store = loadSwarmStore();
114
+ const swarmId = input.swarmId;
115
+ if (swarmId && store.swarms[swarmId]) {
116
+ const swarm = store.swarms[swarmId];
117
+ return {
118
+ swarmId: swarm.swarmId,
119
+ status: swarm.status,
120
+ topology: swarm.topology,
121
+ maxAgents: swarm.maxAgents,
122
+ agentCount: swarm.agents.length,
123
+ taskCount: swarm.tasks.length,
124
+ config: swarm.config,
125
+ createdAt: swarm.createdAt,
126
+ updatedAt: swarm.updatedAt,
127
+ };
128
+ }
129
+ // Return most recent swarm if no ID specified
130
+ const swarmIds = Object.keys(store.swarms);
131
+ if (swarmIds.length === 0) {
132
+ return {
133
+ status: 'no_swarm',
134
+ message: 'No active swarms. Use swarm_init to create one.',
135
+ totalSwarms: 0,
136
+ };
137
+ }
138
+ const latest = swarmIds
139
+ .map(id => store.swarms[id])
140
+ .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())[0];
50
141
  return {
51
- swarmId: input.swarmId,
52
- status: 'running',
53
- agentCount: 0,
54
- taskCount: 0,
142
+ swarmId: latest.swarmId,
143
+ status: latest.status,
144
+ topology: latest.topology,
145
+ maxAgents: latest.maxAgents,
146
+ agentCount: latest.agents.length,
147
+ taskCount: latest.tasks.length,
148
+ config: latest.config,
149
+ createdAt: latest.createdAt,
150
+ updatedAt: latest.updatedAt,
151
+ totalSwarms: swarmIds.length,
55
152
  };
56
153
  },
57
154
  },
58
155
  {
59
156
  name: 'swarm_shutdown',
60
- description: 'Shutdown a swarm',
157
+ description: 'Shutdown a swarm and update persistent state',
61
158
  category: 'swarm',
62
159
  inputSchema: {
63
160
  type: 'object',
64
161
  properties: {
65
- swarmId: { type: 'string', description: 'Swarm ID' },
66
- graceful: { type: 'boolean', description: 'Graceful shutdown' },
162
+ swarmId: { type: 'string', description: 'Swarm ID to shutdown' },
163
+ graceful: { type: 'boolean', description: 'Graceful shutdown (default: true)' },
67
164
  },
68
165
  },
69
166
  handler: async (input) => {
167
+ const store = loadSwarmStore();
168
+ const swarmId = input.swarmId;
169
+ // Find the swarm
170
+ let target;
171
+ if (swarmId && store.swarms[swarmId]) {
172
+ target = store.swarms[swarmId];
173
+ }
174
+ else {
175
+ // Shutdown most recent running swarm
176
+ const running = Object.values(store.swarms)
177
+ .filter(s => s.status === 'running')
178
+ .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
179
+ target = running[0];
180
+ }
181
+ if (!target) {
182
+ return {
183
+ success: false,
184
+ error: swarmId ? `Swarm ${swarmId} not found` : 'No running swarms to shutdown',
185
+ };
186
+ }
187
+ if (target.status === 'terminated') {
188
+ return {
189
+ success: false,
190
+ swarmId: target.swarmId,
191
+ error: 'Swarm already terminated',
192
+ };
193
+ }
194
+ target.status = 'terminated';
195
+ target.updatedAt = new Date().toISOString();
196
+ saveSwarmStore(store);
70
197
  return {
71
198
  success: true,
72
- swarmId: input.swarmId,
199
+ swarmId: target.swarmId,
73
200
  terminated: true,
201
+ graceful: input.graceful ?? true,
202
+ agentsTerminated: target.agents.length,
203
+ terminatedAt: target.updatedAt,
74
204
  };
75
205
  },
76
206
  },
77
207
  {
78
208
  name: 'swarm_health',
79
- description: 'Check swarm health status',
209
+ description: 'Check swarm health status with real state inspection',
80
210
  category: 'swarm',
81
211
  inputSchema: {
82
212
  type: 'object',
@@ -85,15 +215,71 @@ export const swarmTools = [
85
215
  },
86
216
  },
87
217
  handler: async (input) => {
218
+ const store = loadSwarmStore();
219
+ const swarmId = input.swarmId;
220
+ // Find the swarm
221
+ let target;
222
+ if (swarmId) {
223
+ target = store.swarms[swarmId];
224
+ if (!target) {
225
+ return {
226
+ status: 'not_found',
227
+ healthy: false,
228
+ checks: [
229
+ { name: 'swarm_exists', status: 'fail', message: `Swarm ${swarmId} not found` },
230
+ ],
231
+ checkedAt: new Date().toISOString(),
232
+ };
233
+ }
234
+ }
235
+ else {
236
+ const running = Object.values(store.swarms)
237
+ .filter(s => s.status === 'running')
238
+ .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
239
+ target = running[0];
240
+ }
241
+ if (!target) {
242
+ return {
243
+ status: 'no_swarm',
244
+ healthy: false,
245
+ checks: [
246
+ { name: 'swarm_exists', status: 'fail', message: 'No active swarm found' },
247
+ ],
248
+ checkedAt: new Date().toISOString(),
249
+ };
250
+ }
251
+ const isRunning = target.status === 'running';
252
+ const stateFileExists = existsSync(getSwarmStatePath());
253
+ const checks = [
254
+ {
255
+ name: 'coordinator',
256
+ status: isRunning ? 'ok' : 'warn',
257
+ message: isRunning ? 'Coordinator active' : `Swarm status: ${target.status}`,
258
+ },
259
+ {
260
+ name: 'agents',
261
+ status: target.agents.length > 0 ? 'ok' : 'info',
262
+ message: `${target.agents.length} agents registered (max: ${target.maxAgents})`,
263
+ },
264
+ {
265
+ name: 'persistence',
266
+ status: stateFileExists ? 'ok' : 'warn',
267
+ message: stateFileExists ? 'State file persisted' : 'State file missing',
268
+ },
269
+ {
270
+ name: 'topology',
271
+ status: 'ok',
272
+ message: `Topology: ${target.topology}`,
273
+ },
274
+ ];
275
+ const healthy = isRunning && stateFileExists;
88
276
  return {
89
- status: 'healthy',
90
- swarmId: input.swarmId || 'default',
91
- checks: [
92
- { name: 'coordinator', status: 'ok', message: 'Coordinator responding' },
93
- { name: 'agents', status: 'ok', message: 'Agent pool healthy' },
94
- { name: 'memory', status: 'ok', message: 'Memory backend connected' },
95
- { name: 'messaging', status: 'ok', message: 'Message bus active' },
96
- ],
277
+ status: healthy ? 'healthy' : 'degraded',
278
+ healthy,
279
+ swarmId: target.swarmId,
280
+ topology: target.topology,
281
+ agentCount: target.agents.length,
282
+ checks,
97
283
  checkedAt: new Date().toISOString(),
98
284
  };
99
285
  },