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.
Files changed (272) hide show
  1. package/dist/src/cli/commands/guidance.js +487 -668
  2. package/dist/src/cli/commands/index-validate.js +18 -29
  3. package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
  4. package/dist/src/cli/commands/neural-goal-init.js +92 -125
  5. package/dist/src/cli/commands/swarm-exec.js +317 -393
  6. package/dist/src/cli/commands/swarm.js +1 -1
  7. package/dist/src/cli/commands/validate-framework.js +983 -1100
  8. package/dist/src/cli/commands/validate.js +144 -223
  9. package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
  10. package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
  11. package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
  12. package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
  13. package/dist/src/cli/simple-commands/agent.js +157 -193
  14. package/dist/src/cli/simple-commands/analysis.js +336 -446
  15. package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
  16. package/dist/src/cli/simple-commands/automation.js +481 -469
  17. package/dist/src/cli/simple-commands/batch-manager.js +261 -313
  18. package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
  19. package/dist/src/cli/simple-commands/claude-track.js +68 -90
  20. package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
  21. package/dist/src/cli/simple-commands/config.js +245 -290
  22. package/dist/src/cli/simple-commands/coordination.js +182 -234
  23. package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
  24. package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
  25. package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
  26. package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
  27. package/dist/src/cli/simple-commands/github/github-api.js +535 -574
  28. package/dist/src/cli/simple-commands/github/init.js +276 -303
  29. package/dist/src/cli/simple-commands/github.js +222 -247
  30. package/dist/src/cli/simple-commands/goal.js +51 -63
  31. package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
  32. package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
  33. package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
  34. package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
  35. package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
  36. package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
  37. package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
  38. package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
  39. package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
  40. package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
  41. package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
  42. package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
  43. package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
  44. package/dist/src/cli/simple-commands/hive.js +90 -79
  45. package/dist/src/cli/simple-commands/hook-safety.js +431 -521
  46. package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
  47. package/dist/src/cli/simple-commands/hooks.js +1064 -1204
  48. package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
  49. package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
  50. package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
  51. package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
  52. package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
  53. package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
  54. package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
  55. package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
  56. package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
  57. package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
  58. package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
  59. package/dist/src/cli/simple-commands/init/help.js +104 -107
  60. package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
  61. package/dist/src/cli/simple-commands/init/index.js +1510 -1759
  62. package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
  63. package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
  64. package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
  65. package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
  66. package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
  67. package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
  68. package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
  69. package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
  70. package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
  71. package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
  72. package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
  73. package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
  74. package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
  75. package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
  76. package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
  77. package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
  78. package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
  79. package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
  80. package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
  81. package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
  82. package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
  83. package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
  84. package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
  85. package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
  86. package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
  87. package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
  88. package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
  89. package/dist/src/cli/simple-commands/init.js +1 -2
  90. package/dist/src/cli/simple-commands/mcp-health.js +131 -158
  91. package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
  92. package/dist/src/cli/simple-commands/mcp.js +345 -400
  93. package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
  94. package/dist/src/cli/simple-commands/memory.js +247 -311
  95. package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
  96. package/dist/src/cli/simple-commands/monitor.js +294 -363
  97. package/dist/src/cli/simple-commands/neural.js +51 -65
  98. package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
  99. package/dist/src/cli/simple-commands/pair-basic.js +528 -656
  100. package/dist/src/cli/simple-commands/pair-old.js +430 -543
  101. package/dist/src/cli/simple-commands/pair-working.js +615 -751
  102. package/dist/src/cli/simple-commands/pair.js +615 -751
  103. package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
  104. package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
  105. package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
  106. package/dist/src/cli/simple-commands/process-ui.js +230 -254
  107. package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
  108. package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
  109. package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
  110. package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
  111. package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
  112. package/dist/src/cli/simple-commands/sparc/index.js +241 -298
  113. package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
  114. package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
  115. package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
  116. package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
  117. package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
  118. package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
  119. package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
  120. package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
  121. package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
  122. package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
  123. package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
  124. package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
  125. package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
  126. package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
  127. package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
  128. package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
  129. package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
  130. package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
  131. package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
  132. package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
  133. package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
  134. package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
  135. package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
  136. package/dist/src/cli/simple-commands/sparc.js +465 -493
  137. package/dist/src/cli/simple-commands/start-ui.js +108 -132
  138. package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
  139. package/dist/src/cli/simple-commands/start.js +1 -1
  140. package/dist/src/cli/simple-commands/status.js +254 -275
  141. package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
  142. package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
  143. package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
  144. package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
  145. package/dist/src/cli/simple-commands/stream-chain.js +260 -318
  146. package/dist/src/cli/simple-commands/stream-processor.js +290 -315
  147. package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
  148. package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
  149. package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
  150. package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
  151. package/dist/src/cli/simple-commands/swarm.js +887 -1082
  152. package/dist/src/cli/simple-commands/task.js +161 -206
  153. package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
  154. package/dist/src/cli/simple-commands/token-tracker.js +258 -316
  155. package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
  156. package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
  157. package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
  158. package/dist/src/cli/simple-commands/training.js +170 -227
  159. package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
  160. package/dist/src/cli/simple-commands/verification-integration.js +389 -417
  161. package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
  162. package/dist/src/cli/simple-commands/verification.js +493 -513
  163. package/dist/src/cli/simple-commands/web-server.js +766 -836
  164. package/dist/src/cli/simple-commands/webui-validator.js +106 -124
  165. package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
  166. package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
  167. package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
  168. package/dist/src/coordination/iteration-tracker.js +363 -454
  169. package/dist/src/enterprise/analytics-manager.js +1135 -0
  170. package/dist/src/enterprise/audit-manager.js +1115 -0
  171. package/dist/src/enterprise/cloud-manager.js +891 -0
  172. package/dist/src/enterprise/deployment-manager.js +966 -0
  173. package/dist/src/enterprise/index.js +6 -0
  174. package/dist/src/enterprise/project-manager.js +584 -0
  175. package/dist/src/enterprise/security-manager.js +991 -0
  176. package/dist/src/index.js +1 -1
  177. package/dist/src/mcp/DEPRECATED.js +46 -60
  178. package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
  179. package/dist/src/mcp/implementations/agent-tracker.js +114 -128
  180. package/dist/src/mcp/implementations/daa-tools.js +292 -350
  181. package/dist/src/mcp/implementations/workflow-tools.js +329 -361
  182. package/dist/src/mcp/mcp-config-manager.js +1183 -1331
  183. package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
  184. package/dist/src/mcp/mcp-server-novice.js +11 -17
  185. package/dist/src/mcp/mcp-server-sdk.js +11 -17
  186. package/dist/src/mcp/mcp-server.js +1620 -1484
  187. package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
  188. package/dist/src/memory/advanced-serializer.js +609 -589
  189. package/dist/src/memory/enhanced-examples.js +220 -305
  190. package/dist/src/memory/enhanced-memory.js +295 -336
  191. package/dist/src/memory/enhanced-session-serializer.js +408 -492
  192. package/dist/src/memory/fallback-memory-system.js +900 -1021
  193. package/dist/src/memory/fallback-store.js +93 -131
  194. package/dist/src/memory/high-performance-serialization.js +592 -730
  195. package/dist/src/memory/in-memory-store.js +161 -213
  196. package/dist/src/memory/index.js +123 -157
  197. package/dist/src/memory/lock-free-structures.js +578 -764
  198. package/dist/src/memory/memory-mapped-persistence.js +585 -766
  199. package/dist/src/memory/memory-pressure-manager.js +569 -707
  200. package/dist/src/memory/migration.js +358 -445
  201. package/dist/src/memory/shared-memory.js +641 -768
  202. package/dist/src/memory/sqlite-store.js +245 -325
  203. package/dist/src/memory/sqlite-wrapper.js +122 -151
  204. package/dist/src/memory/swarm-memory.js +470 -603
  205. package/dist/src/memory/test-example.js +126 -134
  206. package/dist/src/memory/ultra-fast-memory-store.js +622 -821
  207. package/dist/src/memory/unified-memory-manager.js +356 -437
  208. package/dist/src/migration/index.js +92 -0
  209. package/dist/src/migration/logger.js +121 -0
  210. package/dist/src/migration/migration-analyzer.js +268 -0
  211. package/dist/src/migration/migration-runner.js +522 -0
  212. package/dist/src/migration/migration-validator.js +285 -0
  213. package/dist/src/migration/progress-reporter.js +150 -0
  214. package/dist/src/migration/rollback-manager.js +321 -0
  215. package/dist/src/migration/tests/migration-system.test.js +7 -0
  216. package/dist/src/migration/types.js +3 -0
  217. package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
  218. package/dist/src/swarm/__tests__/integration.test.js +227 -0
  219. package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
  220. package/dist/src/swarm/advanced-orchestrator.js +1095 -0
  221. package/dist/src/swarm/claude-code-interface.js +961 -0
  222. package/dist/src/swarm/claude-flow-executor.js +229 -0
  223. package/dist/src/swarm/consensus-coordinator.js +475 -0
  224. package/dist/src/swarm/coordinator.js +2993 -0
  225. package/dist/src/swarm/direct-executor.js +1180 -0
  226. package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
  227. package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
  228. package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
  229. package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
  230. package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
  231. package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
  232. package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
  233. package/dist/src/swarm/executor-v2.js +322 -0
  234. package/dist/src/swarm/executor.js +815 -0
  235. package/dist/src/swarm/hive-mind-integration.js +703 -0
  236. package/dist/src/swarm/index.js +41 -0
  237. package/dist/src/swarm/json-output-aggregator.js +267 -0
  238. package/dist/src/swarm/large-scale-coordinator.js +542 -0
  239. package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
  240. package/dist/src/swarm/memory.js +1117 -0
  241. package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
  242. package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
  243. package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
  244. package/dist/src/swarm/optimizations/connection-pool.js +244 -0
  245. package/dist/src/swarm/optimizations/index.js +28 -0
  246. package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
  247. package/dist/src/swarm/optimizations/ttl-map.js +234 -0
  248. package/dist/src/swarm/prompt-cli.js +200 -0
  249. package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
  250. package/dist/src/swarm/prompt-copier.js +381 -0
  251. package/dist/src/swarm/prompt-manager.js +295 -0
  252. package/dist/src/swarm/prompt-utils.js +310 -0
  253. package/dist/src/swarm/result-aggregator.js +718 -0
  254. package/dist/src/swarm/sparc-executor.js +1568 -0
  255. package/dist/src/swarm/strategies/auto.js +758 -0
  256. package/dist/src/swarm/strategies/base.js +128 -0
  257. package/dist/src/swarm/strategies/research.js +914 -0
  258. package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
  259. package/dist/src/swarm/types.js +52 -0
  260. package/dist/src/swarm/workers/copy-worker.js +56 -0
  261. package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
  262. package/dist/src/utils/github-cli-safe.js +56 -64
  263. package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
  264. package/dist/src/utils/npx-isolated-cache.js +104 -119
  265. package/dist/src/utils/preference-manager.js +622 -652
  266. package/dist/src/utils/timezone-utils.js +86 -105
  267. package/dist/src/validators/epic-config-schema.js +214 -0
  268. package/dist/src/validators/index.js +10 -0
  269. package/dist/src/validators/swarm-init-validator.js +259 -0
  270. package/dist/src/validators/todowrite-batching-validator.js +215 -0
  271. package/dist/src/validators/todowrite-integration.js +187 -0
  272. 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 { 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
-
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
- 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
- /**
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
- async start() {
52
- if (this.isRunning) {
53
- printWarning('Web server is already running');
54
- return;
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
- 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
- }
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
- 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;
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
- 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
- /**
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
- 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);
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
- 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);
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
- 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);
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
- 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
- /**
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
- 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
- /**
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
- 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
- /**
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
- handleFavicon(res) {
319
- // Simple SVG favicon
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
- res.writeHead(200, { 'Content-Type': 'image/svg+xml' });
326
- res.end(favicon);
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
- handle403(res) {
333
- res.writeHead(403, { 'Content-Type': 'text/plain' });
334
- res.end('403 Forbidden');
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
- handle404(res) {
341
- res.writeHead(404, { 'Content-Type': 'text/plain' });
342
- res.end('404 Not Found');
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
- 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
- /**
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
- 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
- /**
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
- 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
- /**
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
- 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');
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
- 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
- /**
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
- 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
- /**
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
- 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
- /**
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
- 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
- /**
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
- handleUnknownMethod(ws, message) {
615
- this.sendError(ws, message.id, `Unknown method: ${message.method}`);
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
- 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
- };
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
- 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
- /**
644
+ }
645
+ /**
672
646
  * Execute Claude Flow command simulation
673
- */
674
- executeClaudeFlowCommand(command, args = {}) {
675
- switch (command) {
676
- case 'status':
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
- case 'init':
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
- case 'agents':
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
- default:
700
- return `Claude Flow command '${command}' executed successfully`;
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
- executeSwarmCommand(action = 'status', args = []) {
708
- switch (action) {
709
- case 'status':
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
- case 'init':
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
- case 'agents':
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
- case 'test':
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
- default:
743
- return `Swarm ${action} completed successfully`;
706
+ default:
707
+ return `Swarm ${action} completed successfully`;
708
+ }
744
709
  }
745
- }
746
-
747
- /**
710
+ /**
748
711
  * 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
- /**
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
- 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
- /**
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
- 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
- /**
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
- 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
- /**
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
- sendMessage(ws, message) {
837
- if (ws.readyState === ws.OPEN) {
838
- ws.send(JSON.stringify(message));
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
- 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
- /**
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
- broadcast(message) {
862
- this.connections.forEach((ws) => {
863
- this.sendMessage(ws, message);
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
- 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
- /**
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
- getStatus() {
889
- return {
890
- running: this.isRunning,
891
- port: this.port,
892
- connections: this.connections.size,
893
- uiPath: this.uiPath,
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
- 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
- }
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
- const port = process.argv[2] ? parseInt(process.argv[2]) : 3000;
928
- await startWebServer(port);
857
+ const port = process.argv[2] ? parseInt(process.argv[2]) : 3000;
858
+ await startWebServer(port);
929
859
  }