agentic-flow 1.8.11 ā 1.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/federation-cli.d.ts +53 -0
- package/dist/cli/federation-cli.js +431 -0
- package/dist/cli-proxy.js +28 -1
- package/dist/federation/EphemeralAgent.js +258 -0
- package/dist/federation/FederationHub.js +283 -0
- package/dist/federation/FederationHubClient.js +212 -0
- package/dist/federation/FederationHubServer.js +436 -0
- package/dist/federation/SecurityManager.js +191 -0
- package/dist/federation/debug/agent-debug-stream.js +474 -0
- package/dist/federation/debug/debug-stream.js +419 -0
- package/dist/federation/index.js +12 -0
- package/dist/federation/integrations/realtime-federation.js +404 -0
- package/dist/federation/integrations/supabase-adapter-debug.js +400 -0
- package/dist/federation/integrations/supabase-adapter.js +258 -0
- package/dist/utils/cli.js +5 -0
- package/docs/architecture/FEDERATION-DATA-LIFECYCLE.md +520 -0
- package/docs/federation/AGENT-DEBUG-STREAMING.md +403 -0
- package/docs/federation/DEBUG-STREAMING-COMPLETE.md +432 -0
- package/docs/federation/DEBUG-STREAMING.md +537 -0
- package/docs/federation/DEPLOYMENT-VALIDATION-SUCCESS.md +394 -0
- package/docs/federation/DOCKER-FEDERATION-DEEP-REVIEW.md +478 -0
- package/docs/issues/ISSUE-SUPABASE-INTEGRATION.md +536 -0
- package/docs/supabase/IMPLEMENTATION-SUMMARY.md +498 -0
- package/docs/supabase/INDEX.md +358 -0
- package/docs/supabase/QUICKSTART.md +365 -0
- package/docs/supabase/README.md +318 -0
- package/docs/supabase/SUPABASE-REALTIME-FEDERATION.md +575 -0
- package/docs/supabase/TEST-REPORT.md +446 -0
- package/docs/supabase/migrations/001_create_federation_tables.sql +339 -0
- package/docs/validation/reports/REGRESSION-TEST-V1.8.11.md +456 -0
- package/package.json +4 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Federation Hub CLI - Manage ephemeral agent federation
|
|
4
|
+
* Supports hub server, agent lifecycle, stats, and monitoring
|
|
5
|
+
*/
|
|
6
|
+
export interface FederationHubConfig {
|
|
7
|
+
port?: number;
|
|
8
|
+
dbPath?: string;
|
|
9
|
+
maxAgents?: number;
|
|
10
|
+
syncInterval?: number;
|
|
11
|
+
verbose?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface AgentConfig {
|
|
14
|
+
agentId?: string;
|
|
15
|
+
tenantId?: string;
|
|
16
|
+
lifetime?: number;
|
|
17
|
+
hubEndpoint?: string;
|
|
18
|
+
agentType?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Federation Hub CLI Manager
|
|
22
|
+
*/
|
|
23
|
+
export declare class FederationCLI {
|
|
24
|
+
private hubProcess;
|
|
25
|
+
/**
|
|
26
|
+
* Start federation hub server
|
|
27
|
+
*/
|
|
28
|
+
startHub(config?: FederationHubConfig): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Spawn ephemeral agent
|
|
31
|
+
*/
|
|
32
|
+
spawnAgent(config?: AgentConfig): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Show hub statistics
|
|
35
|
+
*/
|
|
36
|
+
stats(hubEndpoint?: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Show federation status
|
|
39
|
+
*/
|
|
40
|
+
status(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Run multi-agent collaboration test
|
|
43
|
+
*/
|
|
44
|
+
testCollaboration(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Print help message
|
|
47
|
+
*/
|
|
48
|
+
printHelp(): void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* CLI command handler
|
|
52
|
+
*/
|
|
53
|
+
export declare function handleFederationCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Federation Hub CLI - Manage ephemeral agent federation
|
|
4
|
+
* Supports hub server, agent lifecycle, stats, and monitoring
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
import { resolve, dirname } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { spawn } from 'child_process';
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
/**
|
|
13
|
+
* Federation Hub CLI Manager
|
|
14
|
+
*/
|
|
15
|
+
export class FederationCLI {
|
|
16
|
+
hubProcess = null;
|
|
17
|
+
/**
|
|
18
|
+
* Start federation hub server
|
|
19
|
+
*/
|
|
20
|
+
async startHub(config = {}) {
|
|
21
|
+
const port = config.port || parseInt(process.env.FEDERATION_HUB_PORT || '8443');
|
|
22
|
+
const dbPath = config.dbPath || process.env.FEDERATION_DB_PATH || ':memory:';
|
|
23
|
+
const maxAgents = config.maxAgents || parseInt(process.env.FEDERATION_MAX_AGENTS || '1000');
|
|
24
|
+
console.log('\nš Starting Federation Hub Server...');
|
|
25
|
+
console.log('ā'.repeat(60));
|
|
26
|
+
console.log(`š Port: ${port}`);
|
|
27
|
+
console.log(`š¾ Database: ${dbPath === ':memory:' ? 'In-Memory' : dbPath}`);
|
|
28
|
+
console.log(`š„ Max Agents: ${maxAgents}`);
|
|
29
|
+
console.log(`š Protocol: WebSocket (QUIC support planned)`);
|
|
30
|
+
console.log('');
|
|
31
|
+
// Start hub server
|
|
32
|
+
const hubPath = resolve(__dirname, '../federation/run-hub.js');
|
|
33
|
+
// Check if compiled hub exists
|
|
34
|
+
if (!existsSync(hubPath)) {
|
|
35
|
+
console.error(`ā Error: Hub server not found at ${hubPath}`);
|
|
36
|
+
console.error(' Please build the project first: npm run build');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
this.hubProcess = spawn('node', [hubPath], {
|
|
40
|
+
stdio: 'inherit',
|
|
41
|
+
env: {
|
|
42
|
+
...process.env,
|
|
43
|
+
FEDERATION_HUB_PORT: port.toString(),
|
|
44
|
+
FEDERATION_DB_PATH: dbPath,
|
|
45
|
+
FEDERATION_MAX_AGENTS: maxAgents.toString(),
|
|
46
|
+
DEBUG: config.verbose ? 'federation:*' : undefined
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
this.hubProcess.on('exit', (code) => {
|
|
50
|
+
console.log(`\nš Hub server stopped (exit code: ${code})`);
|
|
51
|
+
process.exit(code || 0);
|
|
52
|
+
});
|
|
53
|
+
// Handle signals
|
|
54
|
+
process.on('SIGINT', () => {
|
|
55
|
+
console.log('\n\nāøļø Shutting down hub server...');
|
|
56
|
+
if (this.hubProcess) {
|
|
57
|
+
this.hubProcess.kill('SIGINT');
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
process.on('SIGTERM', () => {
|
|
61
|
+
if (this.hubProcess) {
|
|
62
|
+
this.hubProcess.kill('SIGTERM');
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
console.log('ā
Hub server started successfully!');
|
|
66
|
+
console.log('\nAgent Connection:');
|
|
67
|
+
console.log(` Endpoint: ws://localhost:${port}`);
|
|
68
|
+
console.log(` Protocol: WebSocket (HTTP/2 upgrade)`);
|
|
69
|
+
console.log('\nUse Ctrl+C to stop the server\n');
|
|
70
|
+
// Keep alive
|
|
71
|
+
await new Promise(() => { });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Spawn ephemeral agent
|
|
75
|
+
*/
|
|
76
|
+
async spawnAgent(config = {}) {
|
|
77
|
+
const agentId = config.agentId || `agent-${Date.now()}`;
|
|
78
|
+
const tenantId = config.tenantId || process.env.FEDERATION_TENANT_ID || 'default';
|
|
79
|
+
const lifetime = config.lifetime || parseInt(process.env.AGENT_LIFETIME || '300'); // 5 minutes default
|
|
80
|
+
const hubEndpoint = config.hubEndpoint || process.env.FEDERATION_HUB_ENDPOINT || 'ws://localhost:8443';
|
|
81
|
+
const agentType = config.agentType || 'worker';
|
|
82
|
+
console.log('\nš¤ Spawning Ephemeral Agent...');
|
|
83
|
+
console.log('ā'.repeat(60));
|
|
84
|
+
console.log(`š Agent ID: ${agentId}`);
|
|
85
|
+
console.log(`š¢ Tenant: ${tenantId}`);
|
|
86
|
+
console.log(`ā±ļø Lifetime: ${lifetime}s`);
|
|
87
|
+
console.log(`š Hub: ${hubEndpoint}`);
|
|
88
|
+
console.log(`š Type: ${agentType}`);
|
|
89
|
+
console.log('');
|
|
90
|
+
// Spawn agent process
|
|
91
|
+
const agentPath = resolve(__dirname, '../federation/run-agent.js');
|
|
92
|
+
if (!existsSync(agentPath)) {
|
|
93
|
+
console.error(`ā Error: Agent runtime not found at ${agentPath}`);
|
|
94
|
+
console.error(' Please build the project first: npm run build');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
const agentProcess = spawn('node', [agentPath], {
|
|
98
|
+
stdio: 'inherit',
|
|
99
|
+
env: {
|
|
100
|
+
...process.env,
|
|
101
|
+
AGENT_ID: agentId,
|
|
102
|
+
TENANT_ID: tenantId,
|
|
103
|
+
AGENT_LIFETIME: lifetime.toString(),
|
|
104
|
+
HUB_ENDPOINT: hubEndpoint,
|
|
105
|
+
AGENT_TYPE: agentType
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
agentProcess.on('exit', (code) => {
|
|
109
|
+
console.log(`\nš Agent lifecycle complete (exit code: ${code})`);
|
|
110
|
+
process.exit(code || 0);
|
|
111
|
+
});
|
|
112
|
+
process.on('SIGINT', () => {
|
|
113
|
+
console.log('\n\nāøļø Terminating agent...');
|
|
114
|
+
agentProcess.kill('SIGINT');
|
|
115
|
+
});
|
|
116
|
+
process.on('SIGTERM', () => {
|
|
117
|
+
agentProcess.kill('SIGTERM');
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Show hub statistics
|
|
122
|
+
*/
|
|
123
|
+
async stats(hubEndpoint) {
|
|
124
|
+
const endpoint = hubEndpoint || process.env.FEDERATION_HUB_ENDPOINT || 'ws://localhost:8443';
|
|
125
|
+
console.log('\nš Federation Hub Statistics');
|
|
126
|
+
console.log('ā'.repeat(60));
|
|
127
|
+
console.log(`š Hub: ${endpoint}`);
|
|
128
|
+
console.log('');
|
|
129
|
+
try {
|
|
130
|
+
// TODO: Implement WebSocket stats query
|
|
131
|
+
// For now, show placeholder
|
|
132
|
+
console.log('ā³ Querying hub statistics...\n');
|
|
133
|
+
console.log('Note: Stats API not yet implemented.');
|
|
134
|
+
console.log('The hub server logs real-time statistics to stdout.');
|
|
135
|
+
console.log('\nExpected stats:');
|
|
136
|
+
console.log(' ⢠Connected agents count');
|
|
137
|
+
console.log(' ⢠Total episodes stored');
|
|
138
|
+
console.log(' ⢠Active tenants');
|
|
139
|
+
console.log(' ⢠Uptime and performance metrics');
|
|
140
|
+
console.log('');
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
console.error(`ā Failed to query stats: ${error.message}`);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Show federation status
|
|
149
|
+
*/
|
|
150
|
+
async status() {
|
|
151
|
+
console.log('\nš Federation System Status');
|
|
152
|
+
console.log('ā'.repeat(60));
|
|
153
|
+
console.log('');
|
|
154
|
+
console.log('Components:');
|
|
155
|
+
console.log(' ā
FederationHubServer - WebSocket hub for agent sync');
|
|
156
|
+
console.log(' ā
FederationHubClient - WebSocket client for agents');
|
|
157
|
+
console.log(' ā
EphemeralAgent - Short-lived agent lifecycle');
|
|
158
|
+
console.log(' ā
SecurityManager - JWT authentication & encryption');
|
|
159
|
+
console.log(' ā
AgentDB Integration - Vector memory storage (150x faster)');
|
|
160
|
+
console.log('');
|
|
161
|
+
console.log('Features:');
|
|
162
|
+
console.log(' ā
Tenant Isolation - Multi-tenant memory separation');
|
|
163
|
+
console.log(' ā
Persistent Hub - SQLite + AgentDB storage');
|
|
164
|
+
console.log(' ā
Ephemeral Agents - :memory: databases (5s-15min lifetime)');
|
|
165
|
+
console.log(' ā
Semantic Search - HNSW vector indexing');
|
|
166
|
+
console.log(' ā
Multi-Generation - Agents learn from past agents');
|
|
167
|
+
console.log(' ā³ QUIC Transport - Native QUIC planned (WebSocket fallback)');
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log('Architecture:');
|
|
170
|
+
console.log(' ⢠Hub: Persistent central database (disk)');
|
|
171
|
+
console.log(' ⢠Agents: Ephemeral local databases (RAM)');
|
|
172
|
+
console.log(' ⢠Sync: Real-time via WebSocket');
|
|
173
|
+
console.log(' ⢠Memory: Outlives agent lifecycle');
|
|
174
|
+
console.log('');
|
|
175
|
+
console.log('Documentation:');
|
|
176
|
+
console.log(' š Architecture: docs/architecture/FEDERATED-AGENTDB-EPHEMERAL-AGENTS.md');
|
|
177
|
+
console.log(' š Data Lifecycle: docs/architecture/FEDERATION-DATA-LIFECYCLE.md');
|
|
178
|
+
console.log(' š Test Report: docs/architecture/FEDERATION-TEST-REPORT.md');
|
|
179
|
+
console.log(' š Integration: docs/architecture/AGENTDB-INTEGRATION-COMPLETE.md');
|
|
180
|
+
console.log('');
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Run multi-agent collaboration test
|
|
184
|
+
*/
|
|
185
|
+
async testCollaboration() {
|
|
186
|
+
console.log('\nš§Ŗ Running Multi-Agent Collaboration Test...');
|
|
187
|
+
console.log('ā'.repeat(60));
|
|
188
|
+
console.log('');
|
|
189
|
+
const testPath = resolve(__dirname, '../../tests/federation/test-agentdb-collaboration.js');
|
|
190
|
+
if (!existsSync(testPath)) {
|
|
191
|
+
console.error(`ā Error: Test not found at ${testPath}`);
|
|
192
|
+
console.error(' Please build the project first: npm run build');
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
console.log('š Test Scenario:');
|
|
196
|
+
console.log(' ⢠5 collaborative agents (researcher, coder, tester, reviewer, isolated)');
|
|
197
|
+
console.log(' ⢠Real AgentDB integration');
|
|
198
|
+
console.log(' ⢠Cross-agent memory sharing');
|
|
199
|
+
console.log(' ⢠Tenant isolation validation');
|
|
200
|
+
console.log('');
|
|
201
|
+
const testProcess = spawn('node', [testPath], {
|
|
202
|
+
stdio: 'inherit'
|
|
203
|
+
});
|
|
204
|
+
testProcess.on('exit', (code) => {
|
|
205
|
+
if (code === 0) {
|
|
206
|
+
console.log('\nā
Collaboration test passed!');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
console.log(`\nā Collaboration test failed (exit code: ${code})`);
|
|
210
|
+
}
|
|
211
|
+
process.exit(code || 0);
|
|
212
|
+
});
|
|
213
|
+
process.on('SIGINT', () => {
|
|
214
|
+
console.log('\n\nāøļø Terminating test...');
|
|
215
|
+
testProcess.kill('SIGINT');
|
|
216
|
+
});
|
|
217
|
+
process.on('SIGTERM', () => {
|
|
218
|
+
testProcess.kill('SIGTERM');
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Print help message
|
|
223
|
+
*/
|
|
224
|
+
printHelp() {
|
|
225
|
+
console.log(`
|
|
226
|
+
š Federation Hub CLI - Ephemeral Agent Management
|
|
227
|
+
|
|
228
|
+
USAGE:
|
|
229
|
+
npx agentic-flow federation <command> [options]
|
|
230
|
+
|
|
231
|
+
COMMANDS:
|
|
232
|
+
start Start federation hub server
|
|
233
|
+
spawn Spawn ephemeral agent
|
|
234
|
+
stats Show hub statistics
|
|
235
|
+
status Show federation system status
|
|
236
|
+
test Run multi-agent collaboration test
|
|
237
|
+
help Show this help message
|
|
238
|
+
|
|
239
|
+
HUB SERVER OPTIONS:
|
|
240
|
+
--port, -p <port> Hub server port [default: 8443]
|
|
241
|
+
--db-path <path> Database path [default: :memory:]
|
|
242
|
+
--max-agents <number> Maximum concurrent agents [default: 1000]
|
|
243
|
+
--verbose, -v Enable verbose logging
|
|
244
|
+
|
|
245
|
+
AGENT OPTIONS:
|
|
246
|
+
--agent-id <id> Custom agent ID [default: auto-generated]
|
|
247
|
+
--tenant <id> Tenant ID [default: 'default']
|
|
248
|
+
--lifetime <seconds> Agent lifetime [default: 300]
|
|
249
|
+
--hub <endpoint> Hub WebSocket endpoint [default: ws://localhost:8443]
|
|
250
|
+
--type <type> Agent type [default: 'worker']
|
|
251
|
+
|
|
252
|
+
ENVIRONMENT VARIABLES:
|
|
253
|
+
FEDERATION_HUB_PORT Hub server port (default: 8443)
|
|
254
|
+
FEDERATION_DB_PATH Database path (default: :memory:)
|
|
255
|
+
FEDERATION_MAX_AGENTS Max concurrent agents (default: 1000)
|
|
256
|
+
FEDERATION_TENANT_ID Default tenant ID
|
|
257
|
+
FEDERATION_HUB_ENDPOINT Hub WebSocket endpoint
|
|
258
|
+
AGENT_LIFETIME Agent lifetime in seconds (default: 300)
|
|
259
|
+
|
|
260
|
+
DEBUG OPTIONS (for detailed operation visibility):
|
|
261
|
+
DEBUG_LEVEL Debug verbosity level
|
|
262
|
+
⢠SILENT (0) - No output
|
|
263
|
+
⢠BASIC (1) - Major events only [default]
|
|
264
|
+
⢠DETAILED (2) - Include all operations with timing
|
|
265
|
+
⢠VERBOSE (3) - All events + realtime + tasks
|
|
266
|
+
⢠TRACE (4) - Everything + internal state changes
|
|
267
|
+
DEBUG_FORMAT Output format (human | json | compact) [default: human]
|
|
268
|
+
DEBUG_OUTPUT Output destination (console | file | both) [default: console]
|
|
269
|
+
DEBUG_OUTPUT_FILE File path for debug output [default: none]
|
|
270
|
+
|
|
271
|
+
DEBUG EXAMPLES:
|
|
272
|
+
# Enable detailed debug with timing
|
|
273
|
+
DEBUG_LEVEL=DETAILED npx agentic-flow federation start
|
|
274
|
+
|
|
275
|
+
# Maximum verbosity for troubleshooting
|
|
276
|
+
DEBUG_LEVEL=TRACE DEBUG_FORMAT=human npx agentic-flow federation spawn
|
|
277
|
+
|
|
278
|
+
# Production monitoring with JSON output to file
|
|
279
|
+
DEBUG_LEVEL=BASIC DEBUG_FORMAT=json DEBUG_OUTPUT=file \\
|
|
280
|
+
DEBUG_OUTPUT_FILE=/var/log/federation.log npx agentic-flow federation start
|
|
281
|
+
|
|
282
|
+
# Compact format for log aggregation
|
|
283
|
+
DEBUG_LEVEL=DETAILED DEBUG_FORMAT=compact DEBUG_OUTPUT=both \\
|
|
284
|
+
DEBUG_OUTPUT_FILE=debug.log npx agentic-flow federation start
|
|
285
|
+
|
|
286
|
+
EXAMPLES:
|
|
287
|
+
# Start hub server (in-memory)
|
|
288
|
+
npx agentic-flow federation start
|
|
289
|
+
|
|
290
|
+
# Start hub with persistent storage
|
|
291
|
+
npx agentic-flow federation start --db-path ./data/hub.db
|
|
292
|
+
|
|
293
|
+
# Start hub on custom port
|
|
294
|
+
npx agentic-flow federation start --port 9443 --verbose
|
|
295
|
+
|
|
296
|
+
# Spawn ephemeral agent (5 minute lifetime)
|
|
297
|
+
npx agentic-flow federation spawn --tenant acme-corp
|
|
298
|
+
|
|
299
|
+
# Spawn agent with custom lifetime
|
|
300
|
+
npx agentic-flow federation spawn --tenant acme-corp --lifetime 600 --type researcher
|
|
301
|
+
|
|
302
|
+
# Show hub statistics
|
|
303
|
+
npx agentic-flow federation stats
|
|
304
|
+
|
|
305
|
+
# Show system status
|
|
306
|
+
npx agentic-flow federation status
|
|
307
|
+
|
|
308
|
+
# Run collaboration test
|
|
309
|
+
npx agentic-flow federation test
|
|
310
|
+
|
|
311
|
+
ARCHITECTURE:
|
|
312
|
+
Hub: Persistent central database (SQLite + AgentDB)
|
|
313
|
+
⢠Episode metadata storage
|
|
314
|
+
⢠Vector memory with HNSW indexing (150x faster)
|
|
315
|
+
⢠Tenant isolation via sessionId prefixes
|
|
316
|
+
⢠Change log for synchronization
|
|
317
|
+
|
|
318
|
+
Agents: Ephemeral local databases (:memory:)
|
|
319
|
+
⢠Short-lived (5 seconds to 15 minutes)
|
|
320
|
+
⢠Pull memories from hub on spawn
|
|
321
|
+
⢠Push new memories to hub during work
|
|
322
|
+
⢠Destroyed on cleanup (memory persists in hub)
|
|
323
|
+
|
|
324
|
+
Memory Persistence:
|
|
325
|
+
⢠Hub database outlives all agents
|
|
326
|
+
⢠New agents can access memories from dead agents
|
|
327
|
+
⢠Multi-generation learning enabled
|
|
328
|
+
⢠Semantic search for pattern discovery
|
|
329
|
+
|
|
330
|
+
BENEFITS:
|
|
331
|
+
ā
Memory outlives agents - Persistent learning across generations
|
|
332
|
+
ā
Tenant isolation - Multi-tenant with zero data leakage
|
|
333
|
+
ā
Semantic search - Find similar patterns via vector similarity
|
|
334
|
+
ā
150x faster search - HNSW indexing vs brute force
|
|
335
|
+
ā
Scalable architecture - Ready for 100+ concurrent agents
|
|
336
|
+
ā
WebSocket protocol - Real-time synchronization
|
|
337
|
+
ā
Zero-trust security - JWT auth + AES-256 encryption
|
|
338
|
+
|
|
339
|
+
DOCUMENTATION:
|
|
340
|
+
š Complete Architecture:
|
|
341
|
+
docs/architecture/FEDERATED-AGENTDB-EPHEMERAL-AGENTS.md
|
|
342
|
+
|
|
343
|
+
š Data Lifecycle Explanation:
|
|
344
|
+
docs/architecture/FEDERATION-DATA-LIFECYCLE.md
|
|
345
|
+
|
|
346
|
+
š Multi-Agent Test Report:
|
|
347
|
+
docs/architecture/FEDERATION-TEST-REPORT.md
|
|
348
|
+
|
|
349
|
+
š AgentDB Integration:
|
|
350
|
+
docs/architecture/AGENTDB-INTEGRATION-COMPLETE.md
|
|
351
|
+
|
|
352
|
+
š GitHub: https://github.com/ruvnet/agentic-flow
|
|
353
|
+
`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* CLI command handler
|
|
358
|
+
*/
|
|
359
|
+
export async function handleFederationCommand(args) {
|
|
360
|
+
const command = args[0];
|
|
361
|
+
const cli = new FederationCLI();
|
|
362
|
+
// Parse options
|
|
363
|
+
const parseOptions = (args) => {
|
|
364
|
+
const options = {};
|
|
365
|
+
for (let i = 0; i < args.length; i++) {
|
|
366
|
+
if ((args[i] === '--port' || args[i] === '-p') && args[i + 1]) {
|
|
367
|
+
options.port = parseInt(args[++i]);
|
|
368
|
+
}
|
|
369
|
+
else if (args[i] === '--db-path' && args[i + 1]) {
|
|
370
|
+
options.dbPath = args[++i];
|
|
371
|
+
}
|
|
372
|
+
else if (args[i] === '--max-agents' && args[i + 1]) {
|
|
373
|
+
options.maxAgents = parseInt(args[++i]);
|
|
374
|
+
}
|
|
375
|
+
else if (args[i] === '--verbose' || args[i] === '-v') {
|
|
376
|
+
options.verbose = true;
|
|
377
|
+
}
|
|
378
|
+
else if (args[i] === '--agent-id' && args[i + 1]) {
|
|
379
|
+
options.agentId = args[++i];
|
|
380
|
+
}
|
|
381
|
+
else if (args[i] === '--tenant' && args[i + 1]) {
|
|
382
|
+
options.tenantId = args[++i];
|
|
383
|
+
}
|
|
384
|
+
else if (args[i] === '--lifetime' && args[i + 1]) {
|
|
385
|
+
options.lifetime = parseInt(args[++i]);
|
|
386
|
+
}
|
|
387
|
+
else if (args[i] === '--hub' && args[i + 1]) {
|
|
388
|
+
options.hubEndpoint = args[++i];
|
|
389
|
+
}
|
|
390
|
+
else if (args[i] === '--type' && args[i + 1]) {
|
|
391
|
+
options.agentType = args[++i];
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return options;
|
|
395
|
+
};
|
|
396
|
+
const options = parseOptions(args.slice(1));
|
|
397
|
+
switch (command) {
|
|
398
|
+
case undefined:
|
|
399
|
+
case 'help':
|
|
400
|
+
cli.printHelp();
|
|
401
|
+
break;
|
|
402
|
+
case 'start':
|
|
403
|
+
await cli.startHub(options);
|
|
404
|
+
break;
|
|
405
|
+
case 'spawn':
|
|
406
|
+
await cli.spawnAgent(options);
|
|
407
|
+
break;
|
|
408
|
+
case 'stats':
|
|
409
|
+
await cli.stats(options.hubEndpoint);
|
|
410
|
+
break;
|
|
411
|
+
case 'status':
|
|
412
|
+
await cli.status();
|
|
413
|
+
break;
|
|
414
|
+
case 'test':
|
|
415
|
+
await cli.testCollaboration();
|
|
416
|
+
break;
|
|
417
|
+
default:
|
|
418
|
+
console.log(`\nā Unknown command: ${command}\n`);
|
|
419
|
+
console.log('Use "npx agentic-flow federation help" for usage information\n');
|
|
420
|
+
process.exit(1);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// If run directly
|
|
424
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
425
|
+
const args = process.argv.slice(2);
|
|
426
|
+
handleFederationCommand(args).catch((error) => {
|
|
427
|
+
console.error('\nā Error:', error.message);
|
|
428
|
+
console.error(error.stack);
|
|
429
|
+
process.exit(1);
|
|
430
|
+
});
|
|
431
|
+
}
|
package/dist/cli-proxy.js
CHANGED
|
@@ -33,6 +33,7 @@ import { claudeAgent } from "./agents/claudeAgent.js";
|
|
|
33
33
|
import { handleReasoningBankCommand } from "./utils/reasoningbankCommands.js";
|
|
34
34
|
import { handleConfigCommand } from "./cli/config-wizard.js";
|
|
35
35
|
import { handleAgentCommand } from "./cli/agent-manager.js";
|
|
36
|
+
import { handleFederationCommand } from "./cli/federation-cli.js";
|
|
36
37
|
import { ModelOptimizer } from "./utils/modelOptimizer.js";
|
|
37
38
|
import { detectModelCapabilities } from "./utils/modelCapabilities.js";
|
|
38
39
|
import { AgentBoosterPreprocessor } from "./utils/agentBoosterPreprocessor.js";
|
|
@@ -54,7 +55,7 @@ class AgenticFlowCLI {
|
|
|
54
55
|
process.exit(0);
|
|
55
56
|
}
|
|
56
57
|
// If no mode and no agent specified, show help
|
|
57
|
-
if (!options.agent && options.mode !== 'list' && !['config', 'agent-manager', 'mcp-manager', 'proxy', 'quic', 'claude-code', 'mcp', 'reasoningbank'].includes(options.mode)) {
|
|
58
|
+
if (!options.agent && options.mode !== 'list' && !['config', 'agent-manager', 'mcp-manager', 'proxy', 'quic', 'claude-code', 'mcp', 'reasoningbank', 'federation'].includes(options.mode)) {
|
|
58
59
|
this.printHelp();
|
|
59
60
|
process.exit(0);
|
|
60
61
|
}
|
|
@@ -144,6 +145,12 @@ class AgenticFlowCLI {
|
|
|
144
145
|
await handleReasoningBankCommand(subcommand);
|
|
145
146
|
process.exit(0);
|
|
146
147
|
}
|
|
148
|
+
if (options.mode === 'federation') {
|
|
149
|
+
// Handle Federation commands
|
|
150
|
+
const federationArgs = process.argv.slice(3); // Skip 'node', 'cli-proxy.js', 'federation'
|
|
151
|
+
await handleFederationCommand(federationArgs);
|
|
152
|
+
process.exit(0);
|
|
153
|
+
}
|
|
147
154
|
// Apply model optimization if requested
|
|
148
155
|
if (options.optimize && options.agent && options.task) {
|
|
149
156
|
const recommendation = ModelOptimizer.optimize({
|
|
@@ -892,6 +899,7 @@ COMMANDS:
|
|
|
892
899
|
config [subcommand] Manage environment configuration (interactive wizard)
|
|
893
900
|
mcp <command> [server] Manage MCP servers (start, stop, status, list)
|
|
894
901
|
agent <command> Agent management (list, create, info, conflicts)
|
|
902
|
+
federation <command> Federation hub management (start, spawn, stats, test)
|
|
895
903
|
proxy [options] Run standalone proxy server for Claude Code/Cursor
|
|
896
904
|
quic [options] Run QUIC transport proxy for ultra-low latency (50-70% faster)
|
|
897
905
|
claude-code [options] Spawn Claude Code with auto-configured proxy
|
|
@@ -920,6 +928,17 @@ AGENT COMMANDS:
|
|
|
920
928
|
npx agentic-flow agent info <name> Show detailed agent information
|
|
921
929
|
npx agentic-flow agent conflicts Check for package/local conflicts
|
|
922
930
|
|
|
931
|
+
FEDERATION COMMANDS:
|
|
932
|
+
npx agentic-flow federation start Start federation hub server
|
|
933
|
+
npx agentic-flow federation spawn Spawn ephemeral agent
|
|
934
|
+
npx agentic-flow federation stats Show hub statistics
|
|
935
|
+
npx agentic-flow federation status Show federation system status
|
|
936
|
+
npx agentic-flow federation test Run multi-agent collaboration test
|
|
937
|
+
npx agentic-flow federation help Show federation help
|
|
938
|
+
|
|
939
|
+
Federation enables ephemeral agents (5s-15min lifetime) with persistent memory.
|
|
940
|
+
Hub stores memories permanently; agents access past learnings from dead agents.
|
|
941
|
+
|
|
923
942
|
OPTIONS:
|
|
924
943
|
--task, -t <task> Task description for agent mode
|
|
925
944
|
--model, -m <model> Model to use (triggers OpenRouter if contains "/")
|
|
@@ -968,6 +987,14 @@ EXAMPLES:
|
|
|
968
987
|
npx agentic-flow mcp list # List all 203+ MCP tools
|
|
969
988
|
npx agentic-flow mcp status # Check server status
|
|
970
989
|
|
|
990
|
+
# Federation Hub Management
|
|
991
|
+
npx agentic-flow federation start # Start hub server (WebSocket)
|
|
992
|
+
npx agentic-flow federation start --port 9443 --db-path ./data/hub.db
|
|
993
|
+
npx agentic-flow federation spawn # Spawn ephemeral agent
|
|
994
|
+
npx agentic-flow federation spawn --tenant acme-corp --lifetime 600
|
|
995
|
+
npx agentic-flow federation stats # Show hub statistics
|
|
996
|
+
npx agentic-flow federation test # Run multi-agent test
|
|
997
|
+
|
|
971
998
|
# Proxy Server for Claude Code/Cursor
|
|
972
999
|
npx agentic-flow proxy --provider openrouter --port 3000
|
|
973
1000
|
npx agentic-flow proxy --provider gemini --port 3001
|