claude-flow-novice 2.0.3 → 2.0.4
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/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -1,713 +1,681 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web Server for Claude Code Console
|
|
3
3
|
* Serves the web-based UI and provides WebSocket communication
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { printSuccess, printError, printWarning, printInfo } from '../utils.js';
|
|
12
|
-
import { compat } from '../runtime-detector.js';
|
|
13
|
-
|
|
4
|
+
*/ import { createServer } from "http";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { readFileSync, existsSync } from "fs";
|
|
8
|
+
import { WebSocketServer } from "ws";
|
|
9
|
+
import { printSuccess, printError, printWarning, printInfo } from "../utils.js";
|
|
10
|
+
import { compat } from "../runtime-detector.js";
|
|
14
11
|
const __filename = fileURLToPath(import.meta.url);
|
|
15
12
|
const __dirname = dirname(__filename);
|
|
16
|
-
|
|
17
13
|
export class ClaudeCodeWebServer {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
connections: this.connections.size,
|
|
40
|
-
isRunning: this.isRunning,
|
|
41
|
-
port: this.port,
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
return router;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
14
|
+
async createAPIRoutes() {
|
|
15
|
+
const express = await import("express");
|
|
16
|
+
const router = express.Router();
|
|
17
|
+
// Health check endpoint
|
|
18
|
+
router.get('/health', (req, res)=>{
|
|
19
|
+
res.json({
|
|
20
|
+
status: 'ok',
|
|
21
|
+
uptime: process.uptime()
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
// System status endpoint
|
|
25
|
+
router.get('/status', (req, res)=>{
|
|
26
|
+
res.json({
|
|
27
|
+
connections: this.connections.size,
|
|
28
|
+
isRunning: this.isRunning,
|
|
29
|
+
port: this.port
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
return router;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
49
35
|
* Start the web server
|
|
50
|
-
*/
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
36
|
+
*/ async start() {
|
|
37
|
+
if (this.isRunning) {
|
|
38
|
+
printWarning('Web server is already running');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
// Create HTTP server with express
|
|
43
|
+
const express = await import("express");
|
|
44
|
+
const app = express.default();
|
|
45
|
+
// Enable CORS
|
|
46
|
+
app.use((req, res, next)=>{
|
|
47
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
48
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
49
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
50
|
+
next();
|
|
51
|
+
});
|
|
52
|
+
// Serve static files
|
|
53
|
+
app.use('/console', express.static(this.uiPath));
|
|
54
|
+
app.use('/api', await this.createAPIRoutes());
|
|
55
|
+
// Default route redirects to console
|
|
56
|
+
app.get('/', (req, res)=>{
|
|
57
|
+
res.redirect('/console');
|
|
58
|
+
});
|
|
59
|
+
this.server = createServer(app);
|
|
60
|
+
// Create WebSocket server
|
|
61
|
+
this.wss = new WebSocketServer({
|
|
62
|
+
server: this.server,
|
|
63
|
+
path: '/ws'
|
|
64
|
+
});
|
|
65
|
+
this.setupWebSocketServer();
|
|
66
|
+
// Start listening
|
|
67
|
+
await new Promise((resolve, reject)=>{
|
|
68
|
+
this.server.listen(this.port, (err)=>{
|
|
69
|
+
if (err) {
|
|
70
|
+
reject(err);
|
|
71
|
+
} else {
|
|
72
|
+
resolve();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
this.isRunning = true;
|
|
77
|
+
printSuccess(`🌐 Claude Code Web UI started successfully`);
|
|
78
|
+
console.log(`📍 Web Interface: http://localhost:${this.port}/console`);
|
|
79
|
+
console.log(`🔗 WebSocket: ws://localhost:${this.port}/ws`);
|
|
80
|
+
console.log(`📁 Serving UI from: ${this.uiPath}`);
|
|
81
|
+
console.log();
|
|
82
|
+
} catch (error) {
|
|
83
|
+
printError(`Failed to start web server: ${error.message}`);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
55
86
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
66
|
-
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
67
|
-
next();
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Serve static files
|
|
71
|
-
app.use('/console', express.static(this.uiPath));
|
|
72
|
-
app.use('/api', await this.createAPIRoutes());
|
|
73
|
-
|
|
74
|
-
// Default route redirects to console
|
|
75
|
-
app.get('/', (req, res) => {
|
|
76
|
-
res.redirect('/console');
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
this.server = createServer(app);
|
|
80
|
-
|
|
81
|
-
// Create WebSocket server
|
|
82
|
-
this.wss = new WebSocketServer({
|
|
83
|
-
server: this.server,
|
|
84
|
-
path: '/ws',
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
this.setupWebSocketServer();
|
|
88
|
-
|
|
89
|
-
// Start listening
|
|
90
|
-
await new Promise((resolve, reject) => {
|
|
91
|
-
this.server.listen(this.port, (err) => {
|
|
92
|
-
if (err) {
|
|
93
|
-
reject(err);
|
|
94
|
-
} else {
|
|
95
|
-
resolve();
|
|
96
|
-
}
|
|
87
|
+
/**
|
|
88
|
+
* Stop the web server
|
|
89
|
+
*/ async stop() {
|
|
90
|
+
if (!this.isRunning) return;
|
|
91
|
+
// Close all WebSocket connections
|
|
92
|
+
this.connections.forEach((ws)=>{
|
|
93
|
+
if (ws.readyState === ws.OPEN) {
|
|
94
|
+
ws.close(1000, 'Server shutting down');
|
|
95
|
+
}
|
|
97
96
|
});
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
97
|
+
// Close WebSocket server
|
|
98
|
+
if (this.wss) {
|
|
99
|
+
this.wss.close();
|
|
100
|
+
}
|
|
101
|
+
// Close HTTP server
|
|
102
|
+
if (this.server) {
|
|
103
|
+
await new Promise((resolve)=>{
|
|
104
|
+
this.server.close(resolve);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
this.isRunning = false;
|
|
108
|
+
printInfo('Web server stopped');
|
|
109
109
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Stop the web server
|
|
114
|
-
*/
|
|
115
|
-
async stop() {
|
|
116
|
-
if (!this.isRunning) return;
|
|
117
|
-
|
|
118
|
-
// Close all WebSocket connections
|
|
119
|
-
this.connections.forEach((ws) => {
|
|
120
|
-
if (ws.readyState === ws.OPEN) {
|
|
121
|
-
ws.close(1000, 'Server shutting down');
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
// Close WebSocket server
|
|
126
|
-
if (this.wss) {
|
|
127
|
-
this.wss.close();
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Close HTTP server
|
|
131
|
-
if (this.server) {
|
|
132
|
-
await new Promise((resolve) => {
|
|
133
|
-
this.server.close(resolve);
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
this.isRunning = false;
|
|
138
|
-
printInfo('Web server stopped');
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
110
|
+
/**
|
|
142
111
|
* Handle HTTP requests
|
|
143
|
-
*/
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
this.handle404(res);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
112
|
+
*/ handleRequest(req, res) {
|
|
113
|
+
const url = req.url;
|
|
114
|
+
// CORS headers
|
|
115
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
116
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
117
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
118
|
+
if (req.method === 'OPTIONS') {
|
|
119
|
+
res.writeHead(200);
|
|
120
|
+
res.end();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Route handling
|
|
124
|
+
if (url === '/' || url === '/console' || url === '/console/') {
|
|
125
|
+
this.serveConsoleHTML(res);
|
|
126
|
+
} else if (url.startsWith('/console/')) {
|
|
127
|
+
// Remove /console prefix and serve static files
|
|
128
|
+
const filePath = url.substring('/console/'.length);
|
|
129
|
+
this.serveStaticFile(res, filePath);
|
|
130
|
+
} else if (url === '/health') {
|
|
131
|
+
this.handleHealthCheck(res);
|
|
132
|
+
} else if (url === '/api/status') {
|
|
133
|
+
this.handleStatusAPI(res);
|
|
134
|
+
} else if (url === '/favicon.ico') {
|
|
135
|
+
this.handleFavicon(res);
|
|
136
|
+
} else {
|
|
137
|
+
this.handle404(res);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
177
141
|
* Serve the console HTML with corrected paths
|
|
178
|
-
*/
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
} catch (error) {
|
|
197
|
-
this.handle500(res, error);
|
|
142
|
+
*/ serveConsoleHTML(res) {
|
|
143
|
+
const filePath = join(this.uiPath, 'index.html');
|
|
144
|
+
if (!existsSync(filePath)) {
|
|
145
|
+
this.handle404(res);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
let content = readFileSync(filePath, 'utf8');
|
|
150
|
+
// Fix relative paths to be relative to /console/
|
|
151
|
+
content = content.replace(/href="styles\//g, 'href="/console/styles/');
|
|
152
|
+
content = content.replace(/src="js\//g, 'src="/console/js/');
|
|
153
|
+
res.writeHead(200, {
|
|
154
|
+
'Content-Type': 'text/html'
|
|
155
|
+
});
|
|
156
|
+
res.end(content);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
this.handle500(res, error);
|
|
159
|
+
}
|
|
198
160
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
/**
|
|
161
|
+
/**
|
|
202
162
|
* Serve a specific file from the UI directory
|
|
203
|
-
*/
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
163
|
+
*/ serveFile(res, filename, contentType) {
|
|
164
|
+
const filePath = join(this.uiPath, filename);
|
|
165
|
+
if (!existsSync(filePath)) {
|
|
166
|
+
this.handle404(res);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const content = readFileSync(filePath);
|
|
171
|
+
res.writeHead(200, {
|
|
172
|
+
'Content-Type': contentType
|
|
173
|
+
});
|
|
174
|
+
res.end(content);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
this.handle500(res, error);
|
|
177
|
+
}
|
|
218
178
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
/**
|
|
179
|
+
/**
|
|
222
180
|
* Serve static files (CSS, JS, etc.)
|
|
223
|
-
*/
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
} catch (error) {
|
|
246
|
-
this.handle500(res, error);
|
|
181
|
+
*/ serveStaticFile(res, requestPath) {
|
|
182
|
+
// Security: prevent directory traversal
|
|
183
|
+
if (requestPath.includes('..') || requestPath.includes('\0')) {
|
|
184
|
+
this.handle403(res);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const filePath = join(this.uiPath, requestPath);
|
|
188
|
+
if (!existsSync(filePath)) {
|
|
189
|
+
this.handle404(res);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// Determine content type
|
|
193
|
+
const contentType = this.getContentType(requestPath);
|
|
194
|
+
try {
|
|
195
|
+
const content = readFileSync(filePath);
|
|
196
|
+
res.writeHead(200, {
|
|
197
|
+
'Content-Type': contentType
|
|
198
|
+
});
|
|
199
|
+
res.end(content);
|
|
200
|
+
} catch (error) {
|
|
201
|
+
this.handle500(res, error);
|
|
202
|
+
}
|
|
247
203
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
/**
|
|
204
|
+
/**
|
|
251
205
|
* Get content type based on file extension
|
|
252
|
-
*/
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return contentTypes[ext] || 'text/plain';
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
206
|
+
*/ getContentType(filePath) {
|
|
207
|
+
const ext = filePath.split('.').pop().toLowerCase();
|
|
208
|
+
const contentTypes = {
|
|
209
|
+
html: 'text/html',
|
|
210
|
+
css: 'text/css',
|
|
211
|
+
js: 'application/javascript',
|
|
212
|
+
json: 'application/json',
|
|
213
|
+
png: 'image/png',
|
|
214
|
+
jpg: 'image/jpeg',
|
|
215
|
+
jpeg: 'image/jpeg',
|
|
216
|
+
gif: 'image/gif',
|
|
217
|
+
svg: 'image/svg+xml',
|
|
218
|
+
ico: 'image/x-icon',
|
|
219
|
+
woff: 'font/woff',
|
|
220
|
+
woff2: 'font/woff2',
|
|
221
|
+
ttf: 'font/ttf',
|
|
222
|
+
eot: 'application/vnd.ms-fontobject'
|
|
223
|
+
};
|
|
224
|
+
return contentTypes[ext] || 'text/plain';
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
277
227
|
* Handle health check endpoint
|
|
278
|
-
*/
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
/**
|
|
228
|
+
*/ handleHealthCheck(res) {
|
|
229
|
+
const health = {
|
|
230
|
+
status: 'ok',
|
|
231
|
+
timestamp: new Date().toISOString(),
|
|
232
|
+
uptime: process.uptime(),
|
|
233
|
+
connections: this.connections.size,
|
|
234
|
+
memory: process.memoryUsage(),
|
|
235
|
+
platform: compat.platform
|
|
236
|
+
};
|
|
237
|
+
res.writeHead(200, {
|
|
238
|
+
'Content-Type': 'application/json'
|
|
239
|
+
});
|
|
240
|
+
res.end(JSON.stringify(health, null, 2));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
294
243
|
* Handle status API endpoint
|
|
295
|
-
*/
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
/**
|
|
244
|
+
*/ handleStatusAPI(res) {
|
|
245
|
+
const status = {
|
|
246
|
+
server: {
|
|
247
|
+
running: this.isRunning,
|
|
248
|
+
port: this.port,
|
|
249
|
+
connections: this.connections.size
|
|
250
|
+
},
|
|
251
|
+
claudeFlow: {
|
|
252
|
+
initialized: true,
|
|
253
|
+
version: '1.0.72'
|
|
254
|
+
},
|
|
255
|
+
runtime: compat.runtime,
|
|
256
|
+
platform: compat.platform
|
|
257
|
+
};
|
|
258
|
+
res.writeHead(200, {
|
|
259
|
+
'Content-Type': 'application/json'
|
|
260
|
+
});
|
|
261
|
+
res.end(JSON.stringify(status, null, 2));
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
316
264
|
* Handle favicon request
|
|
317
|
-
*/
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
const favicon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
265
|
+
*/ handleFavicon(res) {
|
|
266
|
+
// Simple SVG favicon
|
|
267
|
+
const favicon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
321
268
|
<rect width="32" height="32" fill="#1f6feb"/>
|
|
322
269
|
<text x="16" y="20" text-anchor="middle" fill="white" font-family="monospace" font-size="18">⚡</text>
|
|
323
270
|
</svg>`;
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
271
|
+
res.writeHead(200, {
|
|
272
|
+
'Content-Type': 'image/svg+xml'
|
|
273
|
+
});
|
|
274
|
+
res.end(favicon);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
330
277
|
* Handle 403 Forbidden
|
|
331
|
-
*/
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
278
|
+
*/ handle403(res) {
|
|
279
|
+
res.writeHead(403, {
|
|
280
|
+
'Content-Type': 'text/plain'
|
|
281
|
+
});
|
|
282
|
+
res.end('403 Forbidden');
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
338
285
|
* Handle 404 Not Found
|
|
339
|
-
*/
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
286
|
+
*/ handle404(res) {
|
|
287
|
+
res.writeHead(404, {
|
|
288
|
+
'Content-Type': 'text/plain'
|
|
289
|
+
});
|
|
290
|
+
res.end('404 Not Found');
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
346
293
|
* Handle 500 Internal Server Error
|
|
347
|
-
*/
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
294
|
+
*/ handle500(res, error) {
|
|
295
|
+
console.error('Server error:', error);
|
|
296
|
+
res.writeHead(500, {
|
|
297
|
+
'Content-Type': 'text/plain'
|
|
298
|
+
});
|
|
299
|
+
res.end('500 Internal Server Error');
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
355
302
|
* Setup WebSocket server
|
|
356
|
-
*/
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/**
|
|
303
|
+
*/ setupWebSocketServer() {
|
|
304
|
+
this.wss.on('connection', (ws, req)=>{
|
|
305
|
+
this.handleWebSocketConnection(ws, req);
|
|
306
|
+
});
|
|
307
|
+
this.wss.on('error', (error)=>{
|
|
308
|
+
console.error('WebSocket server error:', error);
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
368
312
|
* Handle new WebSocket connection
|
|
369
|
-
*/
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
// Setup ping/pong for connection health
|
|
405
|
-
ws.on('pong', () => {
|
|
406
|
-
ws.isAlive = true;
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
/**
|
|
313
|
+
*/ handleWebSocketConnection(ws, req) {
|
|
314
|
+
const clientIP = req.socket.remoteAddress;
|
|
315
|
+
console.log(`🔗 New WebSocket connection from ${clientIP}`);
|
|
316
|
+
this.connections.add(ws);
|
|
317
|
+
// Send welcome message
|
|
318
|
+
this.sendMessage(ws, {
|
|
319
|
+
jsonrpc: '2.0',
|
|
320
|
+
method: 'connection/established',
|
|
321
|
+
params: {
|
|
322
|
+
server: 'claude-flow-web-server',
|
|
323
|
+
version: '2.0.0',
|
|
324
|
+
timestamp: new Date().toISOString()
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
// Handle messages
|
|
328
|
+
ws.on('message', (data)=>{
|
|
329
|
+
this.handleWebSocketMessage(ws, data);
|
|
330
|
+
});
|
|
331
|
+
// Handle close
|
|
332
|
+
ws.on('close', (code, reason)=>{
|
|
333
|
+
console.log(`❌ WebSocket connection closed: ${code} ${reason}`);
|
|
334
|
+
this.connections.delete(ws);
|
|
335
|
+
});
|
|
336
|
+
// Handle error
|
|
337
|
+
ws.on('error', (error)=>{
|
|
338
|
+
console.error('WebSocket connection error:', error);
|
|
339
|
+
this.connections.delete(ws);
|
|
340
|
+
});
|
|
341
|
+
// Setup ping/pong for connection health
|
|
342
|
+
ws.on('pong', ()=>{
|
|
343
|
+
ws.isAlive = true;
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
411
347
|
* Handle incoming WebSocket messages
|
|
412
|
-
*/
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
this.handleUnknownMethod(ws, message);
|
|
440
|
-
}
|
|
441
|
-
} catch (error) {
|
|
442
|
-
console.error('Error processing WebSocket message:', error);
|
|
443
|
-
this.sendError(ws, null, 'Invalid JSON message');
|
|
348
|
+
*/ handleWebSocketMessage(ws, data) {
|
|
349
|
+
try {
|
|
350
|
+
const message = JSON.parse(data.toString());
|
|
351
|
+
console.log('Received WebSocket message:', message.method, message.id);
|
|
352
|
+
// Handle different message types
|
|
353
|
+
switch(message.method){
|
|
354
|
+
case 'initialize':
|
|
355
|
+
this.handleInitialize(ws, message);
|
|
356
|
+
break;
|
|
357
|
+
case 'ping':
|
|
358
|
+
this.handlePing(ws, message);
|
|
359
|
+
break;
|
|
360
|
+
case 'tools/call':
|
|
361
|
+
this.handleToolCall(ws, message);
|
|
362
|
+
break;
|
|
363
|
+
case 'tools/list':
|
|
364
|
+
console.log('Handling tools/list request');
|
|
365
|
+
this.handleToolsList(ws, message);
|
|
366
|
+
break;
|
|
367
|
+
default:
|
|
368
|
+
console.log('Unknown method:', message.method);
|
|
369
|
+
this.handleUnknownMethod(ws, message);
|
|
370
|
+
}
|
|
371
|
+
} catch (error) {
|
|
372
|
+
console.error('Error processing WebSocket message:', error);
|
|
373
|
+
this.sendError(ws, null, 'Invalid JSON message');
|
|
374
|
+
}
|
|
444
375
|
}
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
/**
|
|
376
|
+
/**
|
|
448
377
|
* Handle initialize request
|
|
449
|
-
*/
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
378
|
+
*/ handleInitialize(ws, message) {
|
|
379
|
+
const response = {
|
|
380
|
+
jsonrpc: '2.0',
|
|
381
|
+
id: message.id,
|
|
382
|
+
result: {
|
|
383
|
+
protocolVersion: {
|
|
384
|
+
major: 2024,
|
|
385
|
+
minor: 11,
|
|
386
|
+
patch: 5
|
|
387
|
+
},
|
|
388
|
+
serverInfo: {
|
|
389
|
+
name: 'claude-flow-web-server',
|
|
390
|
+
version: '2.0.0'
|
|
391
|
+
},
|
|
392
|
+
capabilities: {
|
|
393
|
+
logging: {
|
|
394
|
+
level: 'info'
|
|
395
|
+
},
|
|
396
|
+
tools: {
|
|
397
|
+
listChanged: true
|
|
398
|
+
},
|
|
399
|
+
resources: {
|
|
400
|
+
listChanged: false,
|
|
401
|
+
subscribe: false
|
|
402
|
+
},
|
|
403
|
+
prompts: {
|
|
404
|
+
listChanged: false
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
this.sendMessage(ws, response);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
473
412
|
* Handle ping request
|
|
474
|
-
*/
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
/**
|
|
413
|
+
*/ handlePing(ws, message) {
|
|
414
|
+
this.sendMessage(ws, {
|
|
415
|
+
jsonrpc: '2.0',
|
|
416
|
+
method: 'pong',
|
|
417
|
+
params: {
|
|
418
|
+
timestamp: Date.now(),
|
|
419
|
+
original: message.params
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
487
424
|
* Handle tool call request
|
|
488
|
-
*/
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
this.sendMessage(ws, response);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
/**
|
|
425
|
+
*/ handleToolCall(ws, message) {
|
|
426
|
+
const { name, arguments: args } = message.params;
|
|
427
|
+
// Mock tool execution for demonstration
|
|
428
|
+
const result = this.executeMockTool(name, args);
|
|
429
|
+
const response = {
|
|
430
|
+
jsonrpc: '2.0',
|
|
431
|
+
id: message.id,
|
|
432
|
+
result: {
|
|
433
|
+
content: [
|
|
434
|
+
{
|
|
435
|
+
type: 'text',
|
|
436
|
+
text: result
|
|
437
|
+
}
|
|
438
|
+
]
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
this.sendMessage(ws, response);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
512
444
|
* Handle tools list request
|
|
513
|
-
*/
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
445
|
+
*/ handleToolsList(ws, message) {
|
|
446
|
+
const tools = [
|
|
447
|
+
{
|
|
448
|
+
name: 'claude-flow/execute',
|
|
449
|
+
description: 'Execute Claude Flow commands (start, stop, status, modes)',
|
|
450
|
+
inputSchema: {
|
|
451
|
+
type: 'object',
|
|
452
|
+
properties: {
|
|
453
|
+
command: {
|
|
454
|
+
type: 'string',
|
|
455
|
+
description: 'Command to execute'
|
|
456
|
+
},
|
|
457
|
+
args: {
|
|
458
|
+
type: 'object',
|
|
459
|
+
description: 'Command arguments'
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
required: [
|
|
463
|
+
'command'
|
|
464
|
+
]
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
name: 'swarm/orchestrate',
|
|
469
|
+
description: 'Manage swarm orchestration (create, start, stop, status)',
|
|
470
|
+
inputSchema: {
|
|
471
|
+
type: 'object',
|
|
472
|
+
properties: {
|
|
473
|
+
action: {
|
|
474
|
+
type: 'string',
|
|
475
|
+
description: 'Action to perform'
|
|
476
|
+
},
|
|
477
|
+
args: {
|
|
478
|
+
type: 'array',
|
|
479
|
+
description: 'Action arguments'
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
required: [
|
|
483
|
+
'action'
|
|
484
|
+
]
|
|
485
|
+
}
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
name: 'system/health',
|
|
489
|
+
description: 'Get comprehensive system health status',
|
|
490
|
+
inputSchema: {
|
|
491
|
+
type: 'object',
|
|
492
|
+
properties: {
|
|
493
|
+
detailed: {
|
|
494
|
+
type: 'boolean',
|
|
495
|
+
description: 'Include detailed metrics'
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
name: 'memory/manage',
|
|
502
|
+
description: 'Manage persistent memory and storage',
|
|
503
|
+
inputSchema: {
|
|
504
|
+
type: 'object',
|
|
505
|
+
properties: {
|
|
506
|
+
operation: {
|
|
507
|
+
type: 'string',
|
|
508
|
+
description: 'Operation: store, retrieve, list, delete'
|
|
509
|
+
},
|
|
510
|
+
key: {
|
|
511
|
+
type: 'string',
|
|
512
|
+
description: 'Memory key'
|
|
513
|
+
},
|
|
514
|
+
value: {
|
|
515
|
+
type: 'string',
|
|
516
|
+
description: 'Value to store'
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
required: [
|
|
520
|
+
'operation'
|
|
521
|
+
]
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
name: 'agents/manage',
|
|
526
|
+
description: 'Manage AI agents and their coordination',
|
|
527
|
+
inputSchema: {
|
|
528
|
+
type: 'object',
|
|
529
|
+
properties: {
|
|
530
|
+
action: {
|
|
531
|
+
type: 'string',
|
|
532
|
+
description: 'Action: list, create, start, stop, status'
|
|
533
|
+
},
|
|
534
|
+
agentType: {
|
|
535
|
+
type: 'string',
|
|
536
|
+
description: 'Agent type for creation'
|
|
537
|
+
},
|
|
538
|
+
agentId: {
|
|
539
|
+
type: 'string',
|
|
540
|
+
description: 'Agent ID for operations'
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
required: [
|
|
544
|
+
'action'
|
|
545
|
+
]
|
|
546
|
+
}
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
name: 'sparc/execute',
|
|
550
|
+
description: 'Execute SPARC mode operations',
|
|
551
|
+
inputSchema: {
|
|
552
|
+
type: 'object',
|
|
553
|
+
properties: {
|
|
554
|
+
mode: {
|
|
555
|
+
type: 'string',
|
|
556
|
+
description: 'SPARC mode: coder, architect, analyzer, etc.'
|
|
557
|
+
},
|
|
558
|
+
task: {
|
|
559
|
+
type: 'string',
|
|
560
|
+
description: 'Task description'
|
|
561
|
+
},
|
|
562
|
+
options: {
|
|
563
|
+
type: 'object',
|
|
564
|
+
description: 'Additional options'
|
|
565
|
+
}
|
|
566
|
+
},
|
|
567
|
+
required: [
|
|
568
|
+
'mode'
|
|
569
|
+
]
|
|
570
|
+
}
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
name: 'benchmark/run',
|
|
574
|
+
description: 'Run performance benchmarks',
|
|
575
|
+
inputSchema: {
|
|
576
|
+
type: 'object',
|
|
577
|
+
properties: {
|
|
578
|
+
suite: {
|
|
579
|
+
type: 'string',
|
|
580
|
+
description: 'Benchmark suite to run'
|
|
581
|
+
},
|
|
582
|
+
iterations: {
|
|
583
|
+
type: 'number',
|
|
584
|
+
description: 'Number of iterations'
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
];
|
|
590
|
+
const response = {
|
|
591
|
+
jsonrpc: '2.0',
|
|
592
|
+
id: message.id,
|
|
593
|
+
result: {
|
|
594
|
+
tools
|
|
595
|
+
}
|
|
596
|
+
};
|
|
597
|
+
this.sendMessage(ws, response);
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
612
600
|
* Handle unknown method
|
|
613
|
-
*/
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
/**
|
|
601
|
+
*/ handleUnknownMethod(ws, message) {
|
|
602
|
+
this.sendError(ws, message.id, `Unknown method: ${message.method}`);
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
619
605
|
* Execute mock tool for demonstration
|
|
620
|
-
*/
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
606
|
+
*/ executeMockTool(name, args) {
|
|
607
|
+
switch(name){
|
|
608
|
+
case 'claude-flow/execute':
|
|
609
|
+
return this.executeClaudeFlowCommand(args.command, args.args);
|
|
610
|
+
case 'system/health':
|
|
611
|
+
const healthData = {
|
|
612
|
+
status: 'healthy',
|
|
613
|
+
uptime: Math.floor(process.uptime()),
|
|
614
|
+
memory: process.memoryUsage(),
|
|
615
|
+
connections: this.connections.size,
|
|
616
|
+
platform: compat.platform,
|
|
617
|
+
timestamp: new Date().toISOString()
|
|
618
|
+
};
|
|
619
|
+
if (args.detailed) {
|
|
620
|
+
healthData.detailed = {
|
|
621
|
+
nodeVersion: process.version,
|
|
622
|
+
architecture: process.arch,
|
|
623
|
+
pid: process.pid,
|
|
624
|
+
cpuUsage: process.cpuUsage(),
|
|
625
|
+
resourceUsage: process.resourceUsage ? process.resourceUsage() : 'N/A'
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
return JSON.stringify(healthData, null, 2);
|
|
629
|
+
case 'swarm/orchestrate':
|
|
630
|
+
return this.executeSwarmCommand(args.action, args.args);
|
|
631
|
+
case 'swarm/status':
|
|
632
|
+
return this.executeSwarmCommand('status', args.args);
|
|
633
|
+
case 'memory/manage':
|
|
634
|
+
return this.executeMemoryCommand(args.operation, args.key, args.value);
|
|
635
|
+
case 'agents/manage':
|
|
636
|
+
return this.executeAgentsCommand(args.action, args.agentType, args.agentId);
|
|
637
|
+
case 'sparc/execute':
|
|
638
|
+
return this.executeSPARCCommand(args.mode, args.task, args.options);
|
|
639
|
+
case 'benchmark/run':
|
|
640
|
+
return this.executeBenchmarkCommand(args.suite, args.iterations);
|
|
641
|
+
default:
|
|
642
|
+
return `Tool '${name}' executed successfully with args: ${JSON.stringify(args)}`;
|
|
644
643
|
}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
case 'swarm/orchestrate':
|
|
649
|
-
return this.executeSwarmCommand(args.action, args.args);
|
|
650
|
-
|
|
651
|
-
case 'swarm/status':
|
|
652
|
-
return this.executeSwarmCommand('status', args.args);
|
|
653
|
-
|
|
654
|
-
case 'memory/manage':
|
|
655
|
-
return this.executeMemoryCommand(args.operation, args.key, args.value);
|
|
656
|
-
|
|
657
|
-
case 'agents/manage':
|
|
658
|
-
return this.executeAgentsCommand(args.action, args.agentType, args.agentId);
|
|
659
|
-
|
|
660
|
-
case 'sparc/execute':
|
|
661
|
-
return this.executeSPARCCommand(args.mode, args.task, args.options);
|
|
662
|
-
|
|
663
|
-
case 'benchmark/run':
|
|
664
|
-
return this.executeBenchmarkCommand(args.suite, args.iterations);
|
|
665
|
-
|
|
666
|
-
default:
|
|
667
|
-
return `Tool '${name}' executed successfully with args: ${JSON.stringify(args)}`;
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
/**
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
672
646
|
* Execute Claude Flow command simulation
|
|
673
|
-
*/
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
return `Claude Flow Status:
|
|
647
|
+
*/ executeClaudeFlowCommand(command, args = {}) {
|
|
648
|
+
switch(command){
|
|
649
|
+
case 'status':
|
|
650
|
+
return `Claude Flow Status:
|
|
678
651
|
Version: 2.0.0
|
|
679
652
|
Mode: Web Console
|
|
680
653
|
Active Processes: 3
|
|
681
654
|
Memory Usage: ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)}MB
|
|
682
655
|
Uptime: ${Math.floor(process.uptime())}s`;
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
return `Claude Flow initialization complete:
|
|
656
|
+
case 'init':
|
|
657
|
+
return `Claude Flow initialization complete:
|
|
686
658
|
✅ Project structure created
|
|
687
659
|
✅ Configuration files generated
|
|
688
660
|
✅ Memory bank initialized
|
|
689
661
|
✅ Ready for development`;
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
return `Active Agents:
|
|
662
|
+
case 'agents':
|
|
663
|
+
return `Active Agents:
|
|
693
664
|
• Research Agent (idle) - 0 tasks
|
|
694
665
|
• Code Developer (working) - 2 tasks
|
|
695
666
|
• Data Analyst (idle) - 0 tasks
|
|
696
667
|
|
|
697
668
|
Total: 3 agents`;
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
669
|
+
default:
|
|
670
|
+
return `Claude Flow command '${command}' executed successfully`;
|
|
671
|
+
}
|
|
701
672
|
}
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
/**
|
|
673
|
+
/**
|
|
705
674
|
* Execute swarm command simulation
|
|
706
|
-
*/
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
return `Swarm Orchestration Status:
|
|
675
|
+
*/ executeSwarmCommand(action = 'status', args = []) {
|
|
676
|
+
switch(action){
|
|
677
|
+
case 'status':
|
|
678
|
+
return `Swarm Orchestration Status:
|
|
711
679
|
🐝 Swarm: ACTIVE
|
|
712
680
|
🏗️ Topology: hierarchical
|
|
713
681
|
👥 Agents: 5/8 active
|
|
@@ -715,215 +683,177 @@ export class ClaudeCodeWebServer {
|
|
|
715
683
|
⚡ Mode: parallel execution
|
|
716
684
|
🧠 Memory: 15 coordination points stored
|
|
717
685
|
📈 Efficiency: 78%`;
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
return `Swarm initialization complete:
|
|
686
|
+
case 'init':
|
|
687
|
+
return `Swarm initialization complete:
|
|
721
688
|
✅ Hierarchical topology established
|
|
722
689
|
✅ 5 agents spawned successfully
|
|
723
690
|
✅ Coordination protocols active
|
|
724
691
|
✅ Memory synchronization enabled`;
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
return `Swarm Agent Status:
|
|
692
|
+
case 'agents':
|
|
693
|
+
return `Swarm Agent Status:
|
|
728
694
|
🟢 architect: Designing system components...
|
|
729
695
|
🟢 coder-1: Implementing user authentication...
|
|
730
696
|
🟢 coder-2: Building API endpoints...
|
|
731
697
|
🟡 analyst: Analyzing performance metrics...
|
|
732
698
|
🔴 tester: Waiting for code completion...`;
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
return `Swarm Test Results:
|
|
699
|
+
case 'test':
|
|
700
|
+
return `Swarm Test Results:
|
|
736
701
|
✅ Agent communication: PASS
|
|
737
702
|
✅ Task distribution: PASS
|
|
738
703
|
✅ Memory coordination: PASS
|
|
739
704
|
✅ Error handling: PASS
|
|
740
705
|
📊 Overall health: 95%`;
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
706
|
+
default:
|
|
707
|
+
return `Swarm ${action} completed successfully`;
|
|
708
|
+
}
|
|
744
709
|
}
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
/**
|
|
710
|
+
/**
|
|
748
711
|
* Execute memory command simulation
|
|
749
|
-
*/
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
default:
|
|
765
|
-
return `Memory operation '${operation}' completed`;
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
/**
|
|
712
|
+
*/ executeMemoryCommand(operation, key, value) {
|
|
713
|
+
switch(operation){
|
|
714
|
+
case 'store':
|
|
715
|
+
return `Memory stored successfully:\n Key: ${key}\n Value: ${value}\n Timestamp: ${new Date().toISOString()}`;
|
|
716
|
+
case 'retrieve':
|
|
717
|
+
return `Memory retrieved:\n Key: ${key}\n Value: "example stored value"\n Last Modified: ${new Date().toISOString()}`;
|
|
718
|
+
case 'list':
|
|
719
|
+
return `Memory Keys:\n • project/settings\n • swarm/topology\n • agents/coordination\n • session/state\n • benchmark/results\n \n Total: 5 entries`;
|
|
720
|
+
case 'delete':
|
|
721
|
+
return `Memory deleted:\n Key: ${key}\n Status: Success`;
|
|
722
|
+
default:
|
|
723
|
+
return `Memory operation '${operation}' completed`;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
/**
|
|
770
727
|
* Execute agents command simulation
|
|
771
|
-
*/
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
return `Agent stopped:\n ID: ${agentId}\n Status: Stopped\n Tasks: Completed gracefully`;
|
|
789
|
-
|
|
790
|
-
case 'status':
|
|
791
|
-
return `Agent Status:\n ID: ${agentId}\n Status: Active\n Type: researcher\n Current Task: Data analysis\n Uptime: 2h 15m\n Tasks Completed: 12\n Efficiency: 92%`;
|
|
792
|
-
|
|
793
|
-
default:
|
|
794
|
-
return `Agent ${action} completed for ${agentId || agentType}`;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
/**
|
|
728
|
+
*/ executeAgentsCommand(action, agentType, agentId) {
|
|
729
|
+
switch(action){
|
|
730
|
+
case 'list':
|
|
731
|
+
return `Active Agents:\n 🟢 agent-001 (architect) - Designing system components\n 🟢 agent-002 (coder) - Implementing features\n 🟡 agent-003 (analyst) - Analyzing performance\n 🔴 agent-004 (tester) - Waiting for code\n 🟢 agent-005 (coordinator) - Managing workflow\n \n Total: 5 agents`;
|
|
732
|
+
case 'create':
|
|
733
|
+
return `Agent created successfully:\n Type: ${agentType}\n ID: agent-${Math.floor(Math.random() * 1000).toString().padStart(3, '0')}\n Status: Active\n Capabilities: Full ${agentType} functionality`;
|
|
734
|
+
case 'start':
|
|
735
|
+
return `Agent started:\n ID: ${agentId}\n Status: Running\n Tasks: Ready to accept work`;
|
|
736
|
+
case 'stop':
|
|
737
|
+
return `Agent stopped:\n ID: ${agentId}\n Status: Stopped\n Tasks: Completed gracefully`;
|
|
738
|
+
case 'status':
|
|
739
|
+
return `Agent Status:\n ID: ${agentId}\n Status: Active\n Type: researcher\n Current Task: Data analysis\n Uptime: 2h 15m\n Tasks Completed: 12\n Efficiency: 92%`;
|
|
740
|
+
default:
|
|
741
|
+
return `Agent ${action} completed for ${agentId || agentType}`;
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
799
745
|
* Execute SPARC command simulation
|
|
800
|
-
*/
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
/**
|
|
746
|
+
*/ executeSPARCCommand(mode, task, options = {}) {
|
|
747
|
+
const modes = {
|
|
748
|
+
coder: 'Code development and implementation',
|
|
749
|
+
architect: 'System design and architecture',
|
|
750
|
+
analyzer: 'Data analysis and insights',
|
|
751
|
+
researcher: 'Research and information gathering',
|
|
752
|
+
reviewer: 'Code review and quality assurance',
|
|
753
|
+
tester: 'Testing and validation',
|
|
754
|
+
debugger: 'Bug finding and resolution',
|
|
755
|
+
documenter: 'Documentation and specifications',
|
|
756
|
+
optimizer: 'Performance optimization',
|
|
757
|
+
designer: 'UI/UX design and prototyping'
|
|
758
|
+
};
|
|
759
|
+
return `SPARC Mode Execution:\n Mode: ${mode} (${modes[mode] || 'Unknown mode'})\n Task: ${task || 'No task specified'}\n Status: Initialized\n Estimated Duration: 15-30 minutes\n Resources Allocated: 2 agents\n Options: ${JSON.stringify(options)}\n \n Ready to begin execution...`;
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
819
762
|
* Execute benchmark command simulation
|
|
820
|
-
*/
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
/**
|
|
763
|
+
*/ executeBenchmarkCommand(suite = 'default', iterations = 10) {
|
|
764
|
+
const suites = {
|
|
765
|
+
default: 'General performance benchmark',
|
|
766
|
+
memory: 'Memory usage and allocation',
|
|
767
|
+
cpu: 'CPU intensive operations',
|
|
768
|
+
network: 'Network communication speed',
|
|
769
|
+
swarm: 'Swarm coordination efficiency'
|
|
770
|
+
};
|
|
771
|
+
return `Benchmark Results:\n Suite: ${suite} (${suites[suite] || 'Custom suite'})\n Iterations: ${iterations}\n \n 📊 Results:\n • Average Response Time: 245ms\n • Memory Usage: 128MB\n • CPU Utilization: 15%\n • Success Rate: 98.5%\n • Throughput: 420 ops/sec\n \n 🏆 Performance Grade: A+\n ⚡ Optimization Suggestions: Enable caching for 12% improvement`;
|
|
772
|
+
}
|
|
773
|
+
/**
|
|
834
774
|
* Send message to WebSocket client
|
|
835
|
-
*/
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
/**
|
|
775
|
+
*/ sendMessage(ws, message) {
|
|
776
|
+
if (ws.readyState === ws.OPEN) {
|
|
777
|
+
ws.send(JSON.stringify(message));
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
843
781
|
* Send error response
|
|
844
|
-
*/
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
/**
|
|
782
|
+
*/ sendError(ws, id, errorMessage) {
|
|
783
|
+
const response = {
|
|
784
|
+
jsonrpc: '2.0',
|
|
785
|
+
id,
|
|
786
|
+
error: {
|
|
787
|
+
code: -32600,
|
|
788
|
+
message: errorMessage
|
|
789
|
+
}
|
|
790
|
+
};
|
|
791
|
+
this.sendMessage(ws, response);
|
|
792
|
+
}
|
|
793
|
+
/**
|
|
859
794
|
* Broadcast message to all connected clients
|
|
860
|
-
*/
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
/**
|
|
795
|
+
*/ broadcast(message) {
|
|
796
|
+
this.connections.forEach((ws)=>{
|
|
797
|
+
this.sendMessage(ws, message);
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
868
801
|
* Start heartbeat to check connection health
|
|
869
|
-
*/
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
}
|
|
884
|
-
|
|
885
|
-
/**
|
|
802
|
+
*/ startHeartbeat() {
|
|
803
|
+
setInterval(()=>{
|
|
804
|
+
this.connections.forEach((ws)=>{
|
|
805
|
+
if (ws.isAlive === false) {
|
|
806
|
+
ws.terminate();
|
|
807
|
+
this.connections.delete(ws);
|
|
808
|
+
return;
|
|
809
|
+
}
|
|
810
|
+
ws.isAlive = false;
|
|
811
|
+
ws.ping();
|
|
812
|
+
});
|
|
813
|
+
}, 30000); // 30 seconds
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
886
816
|
* Get server status
|
|
887
|
-
*/
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
}
|
|
895
|
-
|
|
817
|
+
*/ getStatus() {
|
|
818
|
+
return {
|
|
819
|
+
running: this.isRunning,
|
|
820
|
+
port: this.port,
|
|
821
|
+
connections: this.connections.size,
|
|
822
|
+
uiPath: this.uiPath
|
|
823
|
+
};
|
|
824
|
+
}
|
|
825
|
+
constructor(port = 3000){
|
|
826
|
+
this.port = port;
|
|
827
|
+
this.server = null;
|
|
828
|
+
this.wss = null;
|
|
829
|
+
this.connections = new Set();
|
|
830
|
+
this.uiPath = join(__dirname, '../../ui/console');
|
|
831
|
+
this.isRunning = false;
|
|
832
|
+
}
|
|
896
833
|
}
|
|
897
|
-
|
|
898
834
|
/**
|
|
899
835
|
* Start web server command
|
|
900
|
-
*/
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
return server;
|
|
919
|
-
} catch (error) {
|
|
920
|
-
printError(`Failed to start web server: ${error.message}`);
|
|
921
|
-
process.exit(1);
|
|
922
|
-
}
|
|
836
|
+
*/ export async function startWebServer(port = 3000) {
|
|
837
|
+
const server = new ClaudeCodeWebServer(port);
|
|
838
|
+
try {
|
|
839
|
+
await server.start();
|
|
840
|
+
// Setup graceful shutdown
|
|
841
|
+
const shutdown = async ()=>{
|
|
842
|
+
console.log('\n⏹️ Shutting down web server...');
|
|
843
|
+
await server.stop();
|
|
844
|
+
process.exit(0);
|
|
845
|
+
};
|
|
846
|
+
compat.terminal.onSignal('SIGINT', shutdown);
|
|
847
|
+
compat.terminal.onSignal('SIGTERM', shutdown);
|
|
848
|
+
// Keep server running
|
|
849
|
+
return server;
|
|
850
|
+
} catch (error) {
|
|
851
|
+
printError(`Failed to start web server: ${error.message}`);
|
|
852
|
+
process.exit(1);
|
|
853
|
+
}
|
|
923
854
|
}
|
|
924
|
-
|
|
925
855
|
// Auto-run if called directly
|
|
926
856
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
927
|
-
|
|
928
|
-
|
|
857
|
+
const port = process.argv[2] ? parseInt(process.argv[2]) : 3000;
|
|
858
|
+
await startWebServer(port);
|
|
929
859
|
}
|