claude-flow-novice 1.3.0 ā 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-flow-novice/preferences/generation.json +147 -0
- package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
- package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
- package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
- package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
- package/.claude-flow-novice/preferences/project-local.json +91 -0
- package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
- package/.claude-flow-novice/preferences/team-shared.json +195 -0
- package/.claude-flow-novice/preferences/user-global.json +247 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
- package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
- package/CLAUDE.md +81 -0
- package/README-NPM.md +0 -0
- package/package.json +11 -7
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/migration/README.md +434 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
- package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
- package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
- package/src/cli/simple-commands/__tests__/task.test.js +8 -0
- package/src/cli/simple-commands/agent.js +216 -0
- package/src/cli/simple-commands/analysis.js +570 -0
- package/src/cli/simple-commands/automation-executor.js +1603 -0
- package/src/cli/simple-commands/automation.js +627 -0
- package/src/cli/simple-commands/batch-manager.js +338 -0
- package/src/cli/simple-commands/claude-telemetry.js +311 -0
- package/src/cli/simple-commands/claude-track.js +102 -0
- package/src/cli/simple-commands/concurrent-display.js +348 -0
- package/src/cli/simple-commands/config.js +319 -0
- package/src/cli/simple-commands/coordination.js +307 -0
- package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
- package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
- package/src/cli/simple-commands/fix-hook-variables.js +363 -0
- package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
- package/src/cli/simple-commands/github/github-api.js +624 -0
- package/src/cli/simple-commands/github/init.js +543 -0
- package/src/cli/simple-commands/github.js +377 -0
- package/src/cli/simple-commands/goal.js +145 -0
- package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
- package/src/cli/simple-commands/hive-mind/communication.js +740 -0
- package/src/cli/simple-commands/hive-mind/core.js +1031 -0
- package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
- package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
- package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
- package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
- package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
- package/src/cli/simple-commands/hive-mind/queen.js +809 -0
- package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
- package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
- package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
- package/src/cli/simple-commands/hive-mind.js +3112 -0
- package/src/cli/simple-commands/hive.js +140 -0
- package/src/cli/simple-commands/hook-safety.js +671 -0
- package/src/cli/simple-commands/hooks.js +1268 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
- package/src/cli/simple-commands/init/README.md +106 -0
- package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
- package/src/cli/simple-commands/init/agent-copier.js +347 -0
- package/src/cli/simple-commands/init/batch-init.js +663 -0
- package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
- package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
- package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
- package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
- package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
- package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
- package/src/cli/simple-commands/init/help.js +110 -0
- package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
- package/src/cli/simple-commands/init/index.js +1953 -0
- package/src/cli/simple-commands/init/performance-monitor.js +344 -0
- package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
- package/src/cli/simple-commands/init/rollback/index.js +399 -0
- package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
- package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
- package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
- package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
- package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
- package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
- package/src/cli/simple-commands/init/sparc-structure.js +68 -0
- package/src/cli/simple-commands/init/template-copier.js +640 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
- package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
- package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
- package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
- package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
- package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
- package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
- package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
- package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
- package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
- package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
- package/src/cli/simple-commands/init/templates/coordination.md +16 -0
- package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
- package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
- package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
- package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
- package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
- package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
- package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
- package/src/cli/simple-commands/init/templates/settings.json +109 -0
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
- package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
- package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
- package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
- package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
- package/src/cli/simple-commands/init/validation/index.js +388 -0
- package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
- package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
- package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
- package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
- package/src/cli/simple-commands/init.js +4 -0
- package/src/cli/simple-commands/mcp-health.js +163 -0
- package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
- package/src/cli/simple-commands/mcp.js +420 -0
- package/src/cli/simple-commands/memory-consolidation.js +631 -0
- package/src/cli/simple-commands/memory.js +345 -0
- package/src/cli/simple-commands/migrate-hooks.js +63 -0
- package/src/cli/simple-commands/monitor.js +417 -0
- package/src/cli/simple-commands/neural.js +148 -0
- package/src/cli/simple-commands/pair-autofix-only.js +755 -0
- package/src/cli/simple-commands/pair-basic.js +751 -0
- package/src/cli/simple-commands/pair-old.js +623 -0
- package/src/cli/simple-commands/pair-working.js +849 -0
- package/src/cli/simple-commands/pair.js +849 -0
- package/src/cli/simple-commands/performance-hooks.js +149 -0
- package/src/cli/simple-commands/performance-metrics.js +601 -0
- package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
- package/src/cli/simple-commands/process-ui.js +274 -0
- package/src/cli/simple-commands/realtime-update-system.js +659 -0
- package/src/cli/simple-commands/sparc/architecture.js +1750 -0
- package/src/cli/simple-commands/sparc/commands.js +575 -0
- package/src/cli/simple-commands/sparc/completion.js +1831 -0
- package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
- package/src/cli/simple-commands/sparc/index.js +321 -0
- package/src/cli/simple-commands/sparc/phase-base.js +430 -0
- package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
- package/src/cli/simple-commands/sparc/refinement.js +1856 -0
- package/src/cli/simple-commands/sparc/specification.js +736 -0
- package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
- package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
- package/src/cli/simple-commands/sparc-modes/code.js +148 -0
- package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
- package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
- package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
- package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
- package/src/cli/simple-commands/sparc-modes/index.js +201 -0
- package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
- package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
- package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
- package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
- package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
- package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
- package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
- package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
- package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
- package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
- package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
- package/src/cli/simple-commands/sparc.js +530 -0
- package/src/cli/simple-commands/start-ui.js +147 -0
- package/src/cli/simple-commands/start-wrapper.js +285 -0
- package/src/cli/simple-commands/start.js +2 -0
- package/src/cli/simple-commands/status.js +303 -0
- package/src/cli/simple-commands/stream-chain-clean.js +221 -0
- package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
- package/src/cli/simple-commands/stream-chain-real.js +408 -0
- package/src/cli/simple-commands/stream-chain-working.js +323 -0
- package/src/cli/simple-commands/stream-chain.js +491 -0
- package/src/cli/simple-commands/stream-processor.js +340 -0
- package/src/cli/simple-commands/swarm-executor.js +253 -0
- package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
- package/src/cli/simple-commands/swarm-ui.js +741 -0
- package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
- package/src/cli/simple-commands/swarm.js +2277 -0
- package/src/cli/simple-commands/task.js +228 -0
- package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
- package/src/cli/simple-commands/timestamp-fix.js +104 -0
- package/src/cli/simple-commands/token-tracker.js +372 -0
- package/src/cli/simple-commands/tool-execution-framework.js +555 -0
- package/src/cli/simple-commands/train-and-stream.js +354 -0
- package/src/cli/simple-commands/training-pipeline.js +874 -0
- package/src/cli/simple-commands/training.js +288 -0
- package/src/cli/simple-commands/verification-hooks.js +336 -0
- package/src/cli/simple-commands/verification-integration.js +464 -0
- package/src/cli/simple-commands/verification-training-integration.js +646 -0
- package/src/cli/simple-commands/verification.js +551 -0
- package/src/cli/simple-commands/web-server.js +929 -0
- package/src/cli/simple-commands/webui-validator.js +136 -0
- package/src/language/README.md +503 -0
- package/src/language/claude-md-generator.js +618 -0
- package/src/language/cli.js +422 -0
- package/src/language/example.js +347 -0
- package/src/language/integration-system.js +619 -0
- package/src/language/language-detector.js +581 -0
|
@@ -0,0 +1,929 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Server for Claude Code Console
|
|
3
|
+
* Serves the web-based UI and provides WebSocket communication
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { createServer } from 'http';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { readFileSync, existsSync } from 'fs';
|
|
10
|
+
import { WebSocketServer } from 'ws';
|
|
11
|
+
import { printSuccess, printError, printWarning, printInfo } from '../utils.js';
|
|
12
|
+
import { compat } from '../runtime-detector.js';
|
|
13
|
+
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
|
|
17
|
+
export class ClaudeCodeWebServer {
|
|
18
|
+
constructor(port = 3000) {
|
|
19
|
+
this.port = port;
|
|
20
|
+
this.server = null;
|
|
21
|
+
this.wss = null;
|
|
22
|
+
this.connections = new Set();
|
|
23
|
+
this.uiPath = join(__dirname, '../../ui/console');
|
|
24
|
+
this.isRunning = false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async createAPIRoutes() {
|
|
28
|
+
const express = await import('express');
|
|
29
|
+
const router = express.Router();
|
|
30
|
+
|
|
31
|
+
// Health check endpoint
|
|
32
|
+
router.get('/health', (req, res) => {
|
|
33
|
+
res.json({ status: 'ok', uptime: process.uptime() });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// System status endpoint
|
|
37
|
+
router.get('/status', (req, res) => {
|
|
38
|
+
res.json({
|
|
39
|
+
connections: this.connections.size,
|
|
40
|
+
isRunning: this.isRunning,
|
|
41
|
+
port: this.port,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return router;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Start the web server
|
|
50
|
+
*/
|
|
51
|
+
async start() {
|
|
52
|
+
if (this.isRunning) {
|
|
53
|
+
printWarning('Web server is already running');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
// Create HTTP server with express
|
|
59
|
+
const express = await import('express');
|
|
60
|
+
const app = express.default();
|
|
61
|
+
|
|
62
|
+
// Enable CORS
|
|
63
|
+
app.use((req, res, next) => {
|
|
64
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
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
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
this.isRunning = true;
|
|
101
|
+
printSuccess(`š Claude Code Web UI started successfully`);
|
|
102
|
+
console.log(`š Web Interface: http://localhost:${this.port}/console`);
|
|
103
|
+
console.log(`š WebSocket: ws://localhost:${this.port}/ws`);
|
|
104
|
+
console.log(`š Serving UI from: ${this.uiPath}`);
|
|
105
|
+
console.log();
|
|
106
|
+
} catch (error) {
|
|
107
|
+
printError(`Failed to start web server: ${error.message}`);
|
|
108
|
+
throw error;
|
|
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
|
+
/**
|
|
142
|
+
* Handle HTTP requests
|
|
143
|
+
*/
|
|
144
|
+
handleRequest(req, res) {
|
|
145
|
+
const url = req.url;
|
|
146
|
+
|
|
147
|
+
// CORS headers
|
|
148
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
149
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
150
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
151
|
+
|
|
152
|
+
if (req.method === 'OPTIONS') {
|
|
153
|
+
res.writeHead(200);
|
|
154
|
+
res.end();
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Route handling
|
|
159
|
+
if (url === '/' || url === '/console' || url === '/console/') {
|
|
160
|
+
this.serveConsoleHTML(res);
|
|
161
|
+
} else if (url.startsWith('/console/')) {
|
|
162
|
+
// Remove /console prefix and serve static files
|
|
163
|
+
const filePath = url.substring('/console/'.length);
|
|
164
|
+
this.serveStaticFile(res, filePath);
|
|
165
|
+
} else if (url === '/health') {
|
|
166
|
+
this.handleHealthCheck(res);
|
|
167
|
+
} else if (url === '/api/status') {
|
|
168
|
+
this.handleStatusAPI(res);
|
|
169
|
+
} else if (url === '/favicon.ico') {
|
|
170
|
+
this.handleFavicon(res);
|
|
171
|
+
} else {
|
|
172
|
+
this.handle404(res);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Serve the console HTML with corrected paths
|
|
178
|
+
*/
|
|
179
|
+
serveConsoleHTML(res) {
|
|
180
|
+
const filePath = join(this.uiPath, 'index.html');
|
|
181
|
+
|
|
182
|
+
if (!existsSync(filePath)) {
|
|
183
|
+
this.handle404(res);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
let content = readFileSync(filePath, 'utf8');
|
|
189
|
+
|
|
190
|
+
// Fix relative paths to be relative to /console/
|
|
191
|
+
content = content.replace(/href="styles\//g, 'href="/console/styles/');
|
|
192
|
+
content = content.replace(/src="js\//g, 'src="/console/js/');
|
|
193
|
+
|
|
194
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
195
|
+
res.end(content);
|
|
196
|
+
} catch (error) {
|
|
197
|
+
this.handle500(res, error);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Serve a specific file from the UI directory
|
|
203
|
+
*/
|
|
204
|
+
serveFile(res, filename, contentType) {
|
|
205
|
+
const filePath = join(this.uiPath, filename);
|
|
206
|
+
|
|
207
|
+
if (!existsSync(filePath)) {
|
|
208
|
+
this.handle404(res);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
const content = readFileSync(filePath);
|
|
214
|
+
res.writeHead(200, { 'Content-Type': contentType });
|
|
215
|
+
res.end(content);
|
|
216
|
+
} catch (error) {
|
|
217
|
+
this.handle500(res, error);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Serve static files (CSS, JS, etc.)
|
|
223
|
+
*/
|
|
224
|
+
serveStaticFile(res, requestPath) {
|
|
225
|
+
// Security: prevent directory traversal
|
|
226
|
+
if (requestPath.includes('..') || requestPath.includes('\0')) {
|
|
227
|
+
this.handle403(res);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const filePath = join(this.uiPath, requestPath);
|
|
232
|
+
|
|
233
|
+
if (!existsSync(filePath)) {
|
|
234
|
+
this.handle404(res);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Determine content type
|
|
239
|
+
const contentType = this.getContentType(requestPath);
|
|
240
|
+
|
|
241
|
+
try {
|
|
242
|
+
const content = readFileSync(filePath);
|
|
243
|
+
res.writeHead(200, { 'Content-Type': contentType });
|
|
244
|
+
res.end(content);
|
|
245
|
+
} catch (error) {
|
|
246
|
+
this.handle500(res, error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get content type based on file extension
|
|
252
|
+
*/
|
|
253
|
+
getContentType(filePath) {
|
|
254
|
+
const ext = filePath.split('.').pop().toLowerCase();
|
|
255
|
+
|
|
256
|
+
const contentTypes = {
|
|
257
|
+
html: 'text/html',
|
|
258
|
+
css: 'text/css',
|
|
259
|
+
js: 'application/javascript',
|
|
260
|
+
json: 'application/json',
|
|
261
|
+
png: 'image/png',
|
|
262
|
+
jpg: 'image/jpeg',
|
|
263
|
+
jpeg: 'image/jpeg',
|
|
264
|
+
gif: 'image/gif',
|
|
265
|
+
svg: 'image/svg+xml',
|
|
266
|
+
ico: 'image/x-icon',
|
|
267
|
+
woff: 'font/woff',
|
|
268
|
+
woff2: 'font/woff2',
|
|
269
|
+
ttf: 'font/ttf',
|
|
270
|
+
eot: 'application/vnd.ms-fontobject',
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
return contentTypes[ext] || 'text/plain';
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Handle health check endpoint
|
|
278
|
+
*/
|
|
279
|
+
handleHealthCheck(res) {
|
|
280
|
+
const health = {
|
|
281
|
+
status: 'ok',
|
|
282
|
+
timestamp: new Date().toISOString(),
|
|
283
|
+
uptime: process.uptime(),
|
|
284
|
+
connections: this.connections.size,
|
|
285
|
+
memory: process.memoryUsage(),
|
|
286
|
+
platform: compat.platform,
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
290
|
+
res.end(JSON.stringify(health, null, 2));
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Handle status API endpoint
|
|
295
|
+
*/
|
|
296
|
+
handleStatusAPI(res) {
|
|
297
|
+
const status = {
|
|
298
|
+
server: {
|
|
299
|
+
running: this.isRunning,
|
|
300
|
+
port: this.port,
|
|
301
|
+
connections: this.connections.size,
|
|
302
|
+
},
|
|
303
|
+
claudeFlow: {
|
|
304
|
+
initialized: true,
|
|
305
|
+
version: '1.0.72',
|
|
306
|
+
},
|
|
307
|
+
runtime: compat.runtime,
|
|
308
|
+
platform: compat.platform,
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
312
|
+
res.end(JSON.stringify(status, null, 2));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Handle favicon request
|
|
317
|
+
*/
|
|
318
|
+
handleFavicon(res) {
|
|
319
|
+
// Simple SVG favicon
|
|
320
|
+
const favicon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
321
|
+
<rect width="32" height="32" fill="#1f6feb"/>
|
|
322
|
+
<text x="16" y="20" text-anchor="middle" fill="white" font-family="monospace" font-size="18">ā”</text>
|
|
323
|
+
</svg>`;
|
|
324
|
+
|
|
325
|
+
res.writeHead(200, { 'Content-Type': 'image/svg+xml' });
|
|
326
|
+
res.end(favicon);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Handle 403 Forbidden
|
|
331
|
+
*/
|
|
332
|
+
handle403(res) {
|
|
333
|
+
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
334
|
+
res.end('403 Forbidden');
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Handle 404 Not Found
|
|
339
|
+
*/
|
|
340
|
+
handle404(res) {
|
|
341
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
342
|
+
res.end('404 Not Found');
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Handle 500 Internal Server Error
|
|
347
|
+
*/
|
|
348
|
+
handle500(res, error) {
|
|
349
|
+
console.error('Server error:', error);
|
|
350
|
+
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
351
|
+
res.end('500 Internal Server Error');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Setup WebSocket server
|
|
356
|
+
*/
|
|
357
|
+
setupWebSocketServer() {
|
|
358
|
+
this.wss.on('connection', (ws, req) => {
|
|
359
|
+
this.handleWebSocketConnection(ws, req);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
this.wss.on('error', (error) => {
|
|
363
|
+
console.error('WebSocket server error:', error);
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Handle new WebSocket connection
|
|
369
|
+
*/
|
|
370
|
+
handleWebSocketConnection(ws, req) {
|
|
371
|
+
const clientIP = req.socket.remoteAddress;
|
|
372
|
+
console.log(`š New WebSocket connection from ${clientIP}`);
|
|
373
|
+
|
|
374
|
+
this.connections.add(ws);
|
|
375
|
+
|
|
376
|
+
// Send welcome message
|
|
377
|
+
this.sendMessage(ws, {
|
|
378
|
+
jsonrpc: '2.0',
|
|
379
|
+
method: 'connection/established',
|
|
380
|
+
params: {
|
|
381
|
+
server: 'claude-flow-web-server',
|
|
382
|
+
version: '2.0.0',
|
|
383
|
+
timestamp: new Date().toISOString(),
|
|
384
|
+
},
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
// Handle messages
|
|
388
|
+
ws.on('message', (data) => {
|
|
389
|
+
this.handleWebSocketMessage(ws, data);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
// Handle close
|
|
393
|
+
ws.on('close', (code, reason) => {
|
|
394
|
+
console.log(`ā WebSocket connection closed: ${code} ${reason}`);
|
|
395
|
+
this.connections.delete(ws);
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
// Handle error
|
|
399
|
+
ws.on('error', (error) => {
|
|
400
|
+
console.error('WebSocket connection error:', error);
|
|
401
|
+
this.connections.delete(ws);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
// Setup ping/pong for connection health
|
|
405
|
+
ws.on('pong', () => {
|
|
406
|
+
ws.isAlive = true;
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Handle incoming WebSocket messages
|
|
412
|
+
*/
|
|
413
|
+
handleWebSocketMessage(ws, data) {
|
|
414
|
+
try {
|
|
415
|
+
const message = JSON.parse(data.toString());
|
|
416
|
+
console.log('Received WebSocket message:', message.method, message.id);
|
|
417
|
+
|
|
418
|
+
// Handle different message types
|
|
419
|
+
switch (message.method) {
|
|
420
|
+
case 'initialize':
|
|
421
|
+
this.handleInitialize(ws, message);
|
|
422
|
+
break;
|
|
423
|
+
|
|
424
|
+
case 'ping':
|
|
425
|
+
this.handlePing(ws, message);
|
|
426
|
+
break;
|
|
427
|
+
|
|
428
|
+
case 'tools/call':
|
|
429
|
+
this.handleToolCall(ws, message);
|
|
430
|
+
break;
|
|
431
|
+
|
|
432
|
+
case 'tools/list':
|
|
433
|
+
console.log('Handling tools/list request');
|
|
434
|
+
this.handleToolsList(ws, message);
|
|
435
|
+
break;
|
|
436
|
+
|
|
437
|
+
default:
|
|
438
|
+
console.log('Unknown method:', message.method);
|
|
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');
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Handle initialize request
|
|
449
|
+
*/
|
|
450
|
+
handleInitialize(ws, message) {
|
|
451
|
+
const response = {
|
|
452
|
+
jsonrpc: '2.0',
|
|
453
|
+
id: message.id,
|
|
454
|
+
result: {
|
|
455
|
+
protocolVersion: { major: 2024, minor: 11, patch: 5 },
|
|
456
|
+
serverInfo: {
|
|
457
|
+
name: 'claude-flow-web-server',
|
|
458
|
+
version: '2.0.0',
|
|
459
|
+
},
|
|
460
|
+
capabilities: {
|
|
461
|
+
logging: { level: 'info' },
|
|
462
|
+
tools: { listChanged: true },
|
|
463
|
+
resources: { listChanged: false, subscribe: false },
|
|
464
|
+
prompts: { listChanged: false },
|
|
465
|
+
},
|
|
466
|
+
},
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
this.sendMessage(ws, response);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Handle ping request
|
|
474
|
+
*/
|
|
475
|
+
handlePing(ws, message) {
|
|
476
|
+
this.sendMessage(ws, {
|
|
477
|
+
jsonrpc: '2.0',
|
|
478
|
+
method: 'pong',
|
|
479
|
+
params: {
|
|
480
|
+
timestamp: Date.now(),
|
|
481
|
+
original: message.params,
|
|
482
|
+
},
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Handle tool call request
|
|
488
|
+
*/
|
|
489
|
+
handleToolCall(ws, message) {
|
|
490
|
+
const { name, arguments: args } = message.params;
|
|
491
|
+
|
|
492
|
+
// Mock tool execution for demonstration
|
|
493
|
+
const result = this.executeMockTool(name, args);
|
|
494
|
+
|
|
495
|
+
const response = {
|
|
496
|
+
jsonrpc: '2.0',
|
|
497
|
+
id: message.id,
|
|
498
|
+
result: {
|
|
499
|
+
content: [
|
|
500
|
+
{
|
|
501
|
+
type: 'text',
|
|
502
|
+
text: result,
|
|
503
|
+
},
|
|
504
|
+
],
|
|
505
|
+
},
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
this.sendMessage(ws, response);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Handle tools list request
|
|
513
|
+
*/
|
|
514
|
+
handleToolsList(ws, message) {
|
|
515
|
+
const tools = [
|
|
516
|
+
{
|
|
517
|
+
name: 'claude-flow/execute',
|
|
518
|
+
description: 'Execute Claude Flow commands (start, stop, status, modes)',
|
|
519
|
+
inputSchema: {
|
|
520
|
+
type: 'object',
|
|
521
|
+
properties: {
|
|
522
|
+
command: { type: 'string', description: 'Command to execute' },
|
|
523
|
+
args: { type: 'object', description: 'Command arguments' },
|
|
524
|
+
},
|
|
525
|
+
required: ['command'],
|
|
526
|
+
},
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
name: 'swarm/orchestrate',
|
|
530
|
+
description: 'Manage swarm orchestration (create, start, stop, status)',
|
|
531
|
+
inputSchema: {
|
|
532
|
+
type: 'object',
|
|
533
|
+
properties: {
|
|
534
|
+
action: { type: 'string', description: 'Action to perform' },
|
|
535
|
+
args: { type: 'array', description: 'Action arguments' },
|
|
536
|
+
},
|
|
537
|
+
required: ['action'],
|
|
538
|
+
},
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
name: 'system/health',
|
|
542
|
+
description: 'Get comprehensive system health status',
|
|
543
|
+
inputSchema: {
|
|
544
|
+
type: 'object',
|
|
545
|
+
properties: {
|
|
546
|
+
detailed: { type: 'boolean', description: 'Include detailed metrics' },
|
|
547
|
+
},
|
|
548
|
+
},
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
name: 'memory/manage',
|
|
552
|
+
description: 'Manage persistent memory and storage',
|
|
553
|
+
inputSchema: {
|
|
554
|
+
type: 'object',
|
|
555
|
+
properties: {
|
|
556
|
+
operation: { type: 'string', description: 'Operation: store, retrieve, list, delete' },
|
|
557
|
+
key: { type: 'string', description: 'Memory key' },
|
|
558
|
+
value: { type: 'string', description: 'Value to store' },
|
|
559
|
+
},
|
|
560
|
+
required: ['operation'],
|
|
561
|
+
},
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
name: 'agents/manage',
|
|
565
|
+
description: 'Manage AI agents and their coordination',
|
|
566
|
+
inputSchema: {
|
|
567
|
+
type: 'object',
|
|
568
|
+
properties: {
|
|
569
|
+
action: { type: 'string', description: 'Action: list, create, start, stop, status' },
|
|
570
|
+
agentType: { type: 'string', description: 'Agent type for creation' },
|
|
571
|
+
agentId: { type: 'string', description: 'Agent ID for operations' },
|
|
572
|
+
},
|
|
573
|
+
required: ['action'],
|
|
574
|
+
},
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
name: 'sparc/execute',
|
|
578
|
+
description: 'Execute SPARC mode operations',
|
|
579
|
+
inputSchema: {
|
|
580
|
+
type: 'object',
|
|
581
|
+
properties: {
|
|
582
|
+
mode: { type: 'string', description: 'SPARC mode: coder, architect, analyzer, etc.' },
|
|
583
|
+
task: { type: 'string', description: 'Task description' },
|
|
584
|
+
options: { type: 'object', description: 'Additional options' },
|
|
585
|
+
},
|
|
586
|
+
required: ['mode'],
|
|
587
|
+
},
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
name: 'benchmark/run',
|
|
591
|
+
description: 'Run performance benchmarks',
|
|
592
|
+
inputSchema: {
|
|
593
|
+
type: 'object',
|
|
594
|
+
properties: {
|
|
595
|
+
suite: { type: 'string', description: 'Benchmark suite to run' },
|
|
596
|
+
iterations: { type: 'number', description: 'Number of iterations' },
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
},
|
|
600
|
+
];
|
|
601
|
+
|
|
602
|
+
const response = {
|
|
603
|
+
jsonrpc: '2.0',
|
|
604
|
+
id: message.id,
|
|
605
|
+
result: { tools },
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
this.sendMessage(ws, response);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Handle unknown method
|
|
613
|
+
*/
|
|
614
|
+
handleUnknownMethod(ws, message) {
|
|
615
|
+
this.sendError(ws, message.id, `Unknown method: ${message.method}`);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* Execute mock tool for demonstration
|
|
620
|
+
*/
|
|
621
|
+
executeMockTool(name, args) {
|
|
622
|
+
switch (name) {
|
|
623
|
+
case 'claude-flow/execute':
|
|
624
|
+
return this.executeClaudeFlowCommand(args.command, args.args);
|
|
625
|
+
|
|
626
|
+
case 'system/health':
|
|
627
|
+
const healthData = {
|
|
628
|
+
status: 'healthy',
|
|
629
|
+
uptime: Math.floor(process.uptime()),
|
|
630
|
+
memory: process.memoryUsage(),
|
|
631
|
+
connections: this.connections.size,
|
|
632
|
+
platform: compat.platform,
|
|
633
|
+
timestamp: new Date().toISOString(),
|
|
634
|
+
};
|
|
635
|
+
|
|
636
|
+
if (args.detailed) {
|
|
637
|
+
healthData.detailed = {
|
|
638
|
+
nodeVersion: process.version,
|
|
639
|
+
architecture: process.arch,
|
|
640
|
+
pid: process.pid,
|
|
641
|
+
cpuUsage: process.cpuUsage(),
|
|
642
|
+
resourceUsage: process.resourceUsage ? process.resourceUsage() : 'N/A',
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
return JSON.stringify(healthData, null, 2);
|
|
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
|
+
/**
|
|
672
|
+
* Execute Claude Flow command simulation
|
|
673
|
+
*/
|
|
674
|
+
executeClaudeFlowCommand(command, args = {}) {
|
|
675
|
+
switch (command) {
|
|
676
|
+
case 'status':
|
|
677
|
+
return `Claude Flow Status:
|
|
678
|
+
Version: 2.0.0
|
|
679
|
+
Mode: Web Console
|
|
680
|
+
Active Processes: 3
|
|
681
|
+
Memory Usage: ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)}MB
|
|
682
|
+
Uptime: ${Math.floor(process.uptime())}s`;
|
|
683
|
+
|
|
684
|
+
case 'init':
|
|
685
|
+
return `Claude Flow initialization complete:
|
|
686
|
+
ā
Project structure created
|
|
687
|
+
ā
Configuration files generated
|
|
688
|
+
ā
Memory bank initialized
|
|
689
|
+
ā
Ready for development`;
|
|
690
|
+
|
|
691
|
+
case 'agents':
|
|
692
|
+
return `Active Agents:
|
|
693
|
+
⢠Research Agent (idle) - 0 tasks
|
|
694
|
+
⢠Code Developer (working) - 2 tasks
|
|
695
|
+
⢠Data Analyst (idle) - 0 tasks
|
|
696
|
+
|
|
697
|
+
Total: 3 agents`;
|
|
698
|
+
|
|
699
|
+
default:
|
|
700
|
+
return `Claude Flow command '${command}' executed successfully`;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* Execute swarm command simulation
|
|
706
|
+
*/
|
|
707
|
+
executeSwarmCommand(action = 'status', args = []) {
|
|
708
|
+
switch (action) {
|
|
709
|
+
case 'status':
|
|
710
|
+
return `Swarm Orchestration Status:
|
|
711
|
+
š Swarm: ACTIVE
|
|
712
|
+
šļø Topology: hierarchical
|
|
713
|
+
š„ Agents: 5/8 active
|
|
714
|
+
š Tasks: 12 total (4 complete, 6 in-progress, 2 pending)
|
|
715
|
+
ā” Mode: parallel execution
|
|
716
|
+
š§ Memory: 15 coordination points stored
|
|
717
|
+
š Efficiency: 78%`;
|
|
718
|
+
|
|
719
|
+
case 'init':
|
|
720
|
+
return `Swarm initialization complete:
|
|
721
|
+
ā
Hierarchical topology established
|
|
722
|
+
ā
5 agents spawned successfully
|
|
723
|
+
ā
Coordination protocols active
|
|
724
|
+
ā
Memory synchronization enabled`;
|
|
725
|
+
|
|
726
|
+
case 'agents':
|
|
727
|
+
return `Swarm Agent Status:
|
|
728
|
+
š¢ architect: Designing system components...
|
|
729
|
+
š¢ coder-1: Implementing user authentication...
|
|
730
|
+
š¢ coder-2: Building API endpoints...
|
|
731
|
+
š” analyst: Analyzing performance metrics...
|
|
732
|
+
š“ tester: Waiting for code completion...`;
|
|
733
|
+
|
|
734
|
+
case 'test':
|
|
735
|
+
return `Swarm Test Results:
|
|
736
|
+
ā
Agent communication: PASS
|
|
737
|
+
ā
Task distribution: PASS
|
|
738
|
+
ā
Memory coordination: PASS
|
|
739
|
+
ā
Error handling: PASS
|
|
740
|
+
š Overall health: 95%`;
|
|
741
|
+
|
|
742
|
+
default:
|
|
743
|
+
return `Swarm ${action} completed successfully`;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
/**
|
|
748
|
+
* Execute memory command simulation
|
|
749
|
+
*/
|
|
750
|
+
executeMemoryCommand(operation, key, value) {
|
|
751
|
+
switch (operation) {
|
|
752
|
+
case 'store':
|
|
753
|
+
return `Memory stored successfully:\n Key: ${key}\n Value: ${value}\n Timestamp: ${new Date().toISOString()}`;
|
|
754
|
+
|
|
755
|
+
case 'retrieve':
|
|
756
|
+
return `Memory retrieved:\n Key: ${key}\n Value: "example stored value"\n Last Modified: ${new Date().toISOString()}`;
|
|
757
|
+
|
|
758
|
+
case 'list':
|
|
759
|
+
return `Memory Keys:\n ⢠project/settings\n ⢠swarm/topology\n ⢠agents/coordination\n ⢠session/state\n ⢠benchmark/results\n \n Total: 5 entries`;
|
|
760
|
+
|
|
761
|
+
case 'delete':
|
|
762
|
+
return `Memory deleted:\n Key: ${key}\n Status: Success`;
|
|
763
|
+
|
|
764
|
+
default:
|
|
765
|
+
return `Memory operation '${operation}' completed`;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/**
|
|
770
|
+
* Execute agents command simulation
|
|
771
|
+
*/
|
|
772
|
+
executeAgentsCommand(action, agentType, agentId) {
|
|
773
|
+
switch (action) {
|
|
774
|
+
case 'list':
|
|
775
|
+
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`;
|
|
776
|
+
|
|
777
|
+
case 'create':
|
|
778
|
+
return `Agent created successfully:\n Type: ${agentType}\n ID: agent-${Math.floor(
|
|
779
|
+
Math.random() * 1000,
|
|
780
|
+
)
|
|
781
|
+
.toString()
|
|
782
|
+
.padStart(3, '0')}\n Status: Active\n Capabilities: Full ${agentType} functionality`;
|
|
783
|
+
|
|
784
|
+
case 'start':
|
|
785
|
+
return `Agent started:\n ID: ${agentId}\n Status: Running\n Tasks: Ready to accept work`;
|
|
786
|
+
|
|
787
|
+
case 'stop':
|
|
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
|
+
/**
|
|
799
|
+
* Execute SPARC command simulation
|
|
800
|
+
*/
|
|
801
|
+
executeSPARCCommand(mode, task, options = {}) {
|
|
802
|
+
const modes = {
|
|
803
|
+
coder: 'Code development and implementation',
|
|
804
|
+
architect: 'System design and architecture',
|
|
805
|
+
analyzer: 'Data analysis and insights',
|
|
806
|
+
researcher: 'Research and information gathering',
|
|
807
|
+
reviewer: 'Code review and quality assurance',
|
|
808
|
+
tester: 'Testing and validation',
|
|
809
|
+
debugger: 'Bug finding and resolution',
|
|
810
|
+
documenter: 'Documentation and specifications',
|
|
811
|
+
optimizer: 'Performance optimization',
|
|
812
|
+
designer: 'UI/UX design and prototyping',
|
|
813
|
+
};
|
|
814
|
+
|
|
815
|
+
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...`;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
/**
|
|
819
|
+
* Execute benchmark command simulation
|
|
820
|
+
*/
|
|
821
|
+
executeBenchmarkCommand(suite = 'default', iterations = 10) {
|
|
822
|
+
const suites = {
|
|
823
|
+
default: 'General performance benchmark',
|
|
824
|
+
memory: 'Memory usage and allocation',
|
|
825
|
+
cpu: 'CPU intensive operations',
|
|
826
|
+
network: 'Network communication speed',
|
|
827
|
+
swarm: 'Swarm coordination efficiency',
|
|
828
|
+
};
|
|
829
|
+
|
|
830
|
+
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`;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/**
|
|
834
|
+
* Send message to WebSocket client
|
|
835
|
+
*/
|
|
836
|
+
sendMessage(ws, message) {
|
|
837
|
+
if (ws.readyState === ws.OPEN) {
|
|
838
|
+
ws.send(JSON.stringify(message));
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
/**
|
|
843
|
+
* Send error response
|
|
844
|
+
*/
|
|
845
|
+
sendError(ws, id, errorMessage) {
|
|
846
|
+
const response = {
|
|
847
|
+
jsonrpc: '2.0',
|
|
848
|
+
id,
|
|
849
|
+
error: {
|
|
850
|
+
code: -32600,
|
|
851
|
+
message: errorMessage,
|
|
852
|
+
},
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
this.sendMessage(ws, response);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/**
|
|
859
|
+
* Broadcast message to all connected clients
|
|
860
|
+
*/
|
|
861
|
+
broadcast(message) {
|
|
862
|
+
this.connections.forEach((ws) => {
|
|
863
|
+
this.sendMessage(ws, message);
|
|
864
|
+
});
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
/**
|
|
868
|
+
* Start heartbeat to check connection health
|
|
869
|
+
*/
|
|
870
|
+
startHeartbeat() {
|
|
871
|
+
setInterval(() => {
|
|
872
|
+
this.connections.forEach((ws) => {
|
|
873
|
+
if (ws.isAlive === false) {
|
|
874
|
+
ws.terminate();
|
|
875
|
+
this.connections.delete(ws);
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
ws.isAlive = false;
|
|
880
|
+
ws.ping();
|
|
881
|
+
});
|
|
882
|
+
}, 30000); // 30 seconds
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
/**
|
|
886
|
+
* Get server status
|
|
887
|
+
*/
|
|
888
|
+
getStatus() {
|
|
889
|
+
return {
|
|
890
|
+
running: this.isRunning,
|
|
891
|
+
port: this.port,
|
|
892
|
+
connections: this.connections.size,
|
|
893
|
+
uiPath: this.uiPath,
|
|
894
|
+
};
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Start web server command
|
|
900
|
+
*/
|
|
901
|
+
export async function startWebServer(port = 3000) {
|
|
902
|
+
const server = new ClaudeCodeWebServer(port);
|
|
903
|
+
|
|
904
|
+
try {
|
|
905
|
+
await server.start();
|
|
906
|
+
|
|
907
|
+
// Setup graceful shutdown
|
|
908
|
+
const shutdown = async () => {
|
|
909
|
+
console.log('\nā¹ļø Shutting down web server...');
|
|
910
|
+
await server.stop();
|
|
911
|
+
process.exit(0);
|
|
912
|
+
};
|
|
913
|
+
|
|
914
|
+
compat.terminal.onSignal('SIGINT', shutdown);
|
|
915
|
+
compat.terminal.onSignal('SIGTERM', shutdown);
|
|
916
|
+
|
|
917
|
+
// Keep server running
|
|
918
|
+
return server;
|
|
919
|
+
} catch (error) {
|
|
920
|
+
printError(`Failed to start web server: ${error.message}`);
|
|
921
|
+
process.exit(1);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
// Auto-run if called directly
|
|
926
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
927
|
+
const port = process.argv[2] ? parseInt(process.argv[2]) : 3000;
|
|
928
|
+
await startWebServer(port);
|
|
929
|
+
}
|