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
@@ -4,780 +4,640 @@
4
4
  * Target: 10,000+ events/sec with 52x speedup via Rust WASM regex engine
5
5
  *
6
6
  * Sprint 1.2 Deliverable 1.2.1: Real Rust WASM Integration
7
- */
8
-
9
- import { EventEmitter } from 'events';
10
- import { performance } from 'perf_hooks';
11
- import { createHash } from 'crypto';
12
-
13
- // REAL WASM Regex Engine Import (Sprint 1.2)
14
- let wasmEngine = null;
15
- let wasmAvailable = false;
16
-
17
- // Attempt to load WASM module with graceful fallback
18
- async function initializeWASM() {
19
- try {
20
- // Import the REAL compiled Rust WASM module (from _bg.js which has RegexEngine)
21
- const wasm = await import('../../wasm-regex-engine/pkg/wasm_regex_engine_bg.js');
22
-
23
- // Create regex engine for event validation patterns
24
- const eventPatterns = [
25
- '^cfn\\.loop\\.', // CFN Loop events
26
- '^agent\\.', // Agent lifecycle events
27
- '^swarm\\.', // Swarm coordination events
28
- '^fleet\\.', // Fleet management events
29
- '^compliance\\.', // Compliance validation events
30
- '^performance\\.', // Performance monitoring events
31
- '^dashboard\\.', // Dashboard events
32
- '^eventbus\\.' // Event bus internal events
33
- ];
34
-
35
- wasmEngine = new wasm.RegexEngine(eventPatterns);
36
- wasmAvailable = true;
37
-
38
- console.log('āœ… WASM Regex Engine loaded successfully (52x acceleration enabled)');
39
- console.log(` Patterns compiled: ${wasmEngine.pattern_count()}`);
40
-
41
- return true;
42
- } catch (error) {
43
- console.warn('āš ļø WASM unavailable, falling back to JavaScript validation:', error.message);
44
- wasmAvailable = false;
45
- return false;
46
- }
47
- }
48
-
49
- // Initialize WASM on module load
50
- const wasmInitPromise = initializeWASM();
51
-
7
+ */ import { EventEmitter } from "events";
8
+ import { performance } from "perf_hooks";
9
+ // REAL WASM Regex Engine Import (Sprint 1.2)
10
+ let wasmEngine = null;
11
+ let wasmAvailable = false;
12
+ // Attempt to load WASM module with graceful fallback
13
+ async function initializeWASM() {
14
+ try {
15
+ // Import the REAL compiled Rust WASM module (from _bg.js which has RegexEngine)
16
+ const wasm = await import("../../wasm-regex-engine/pkg/wasm_regex_engine_bg.js");
17
+ // Create regex engine for event validation patterns
18
+ const eventPatterns = [
19
+ '^cfn\\.loop\\.',
20
+ '^agent\\.',
21
+ '^swarm\\.',
22
+ '^fleet\\.',
23
+ '^compliance\\.',
24
+ '^performance\\.',
25
+ '^dashboard\\.',
26
+ '^eventbus\\.' // Event bus internal events
27
+ ];
28
+ wasmEngine = new wasm.RegexEngine(eventPatterns);
29
+ wasmAvailable = true;
30
+ console.log('āœ… WASM Regex Engine loaded successfully (52x acceleration enabled)');
31
+ console.log(` Patterns compiled: ${wasmEngine.pattern_count()}`);
32
+ return true;
33
+ } catch (error) {
34
+ console.warn('āš ļø WASM unavailable, falling back to JavaScript validation:', error.message);
35
+ wasmAvailable = false;
36
+ return false;
37
+ }
38
+ }
39
+ // Initialize WASM on module load
40
+ const wasmInitPromise = initializeWASM();
52
41
  /**
53
42
  * High-Performance Event Bus with WASM Acceleration
54
43
  * Implements mandatory Redis pub/sub coordination (Critical Rule #19)
55
- */
56
- export class QEEventBus extends EventEmitter {
57
- constructor(config = {}) {
58
- super();
59
-
60
- this.config = {
61
- throughputTarget: 10000, // events/sec
62
- latencyTarget: 50, // ms
63
- workerThreads: 4,
64
- batchSize: 100,
65
- batchTimeout: 10, // ms
66
- enableWASM: true,
67
- enableSIMD: true,
68
- enableZeroCopy: true,
69
- priorityLevels: 10,
70
- failureThreshold: 5, // Circuit breaker: failures before opening
71
- recoveryTimeout: 30000, // Circuit breaker: 30s before retry
72
- ...config
73
- };
74
-
75
- // Event routing tables (hash-based O(1) lookup)
76
- this.subscribers = new Map(); // pattern -> Set<handler>
77
- this.routingCache = new Map(); // eventType -> cachedRoute
78
- this.priorityQueues = Array.from({ length: this.config.priorityLevels }, () => []);
79
-
80
- // Performance metrics
81
- this.metrics = {
82
- eventsProcessed: 0,
83
- eventsPublished: 0,
84
- totalLatency: 0,
85
- wasmValidations: 0,
86
- jsValidations: 0,
87
- wasmErrors: 0,
88
- wasmCleanupsPerformed: 0,
89
- batchesProcessed: 0,
90
- routingHits: 0,
91
- routingMisses: 0,
92
- errors: 0,
93
- throughput: 0,
94
- avgLatency: 0,
95
- // Circuit breaker metrics
96
- circuitState: 'CLOSED',
97
- circuitOpens: 0,
98
- eventsRejected: 0,
99
- bypassEvents: 0,
100
- recoveryAttempts: 0
101
- };
102
-
103
- // Circuit breaker state machine
104
- this.circuitBreaker = {
105
- state: 'CLOSED', // CLOSED | OPEN | HALF-OPEN
106
- consecutiveFailures: 0,
107
- failureThreshold: this.config.failureThreshold,
108
- recoveryTimeout: this.config.recoveryTimeout,
109
- halfOpenSuccesses: 0,
110
- halfOpenThreshold: 3, // Successes needed to close circuit
111
- lastStateChange: Date.now(),
112
- openedAt: null
113
- };
114
-
115
- // Batching state
116
- this.eventBatch = [];
117
- this.batchTimer = null;
118
-
119
- // WASM state
120
- this.wasmReady = false;
121
-
122
- // Active state
123
- this.active = false;
124
- this.startTime = null;
125
- }
126
-
127
- /**
44
+ */ export class QEEventBus extends EventEmitter {
45
+ /**
128
46
  * Initialize QE Event Bus with WASM acceleration
129
- */
130
- async initialize() {
131
- console.log('šŸš€ Initializing QE Event Bus with WASM acceleration...');
132
-
133
- try {
134
- // Wait for WASM initialization
135
- await wasmInitPromise;
136
- this.wasmReady = wasmAvailable;
137
-
138
- if (this.wasmReady) {
139
- console.log('āœ… WASM Regex Engine ready for 52x speedup');
140
- console.log(' SIMD validation: ENABLED');
141
- console.log(' Zero-copy batching: ENABLED');
142
- console.log(' Hash-based routing: ENABLED');
143
- } else {
144
- console.log('āš ļø Running in JavaScript fallback mode');
145
- }
146
-
147
- // Start batch processing
148
- this.enableBatching();
149
-
150
- this.active = true;
151
- this.startTime = performance.now();
152
-
153
- console.log(`āœ… QE Event Bus initialized (target: ${this.config.throughputTarget} events/sec)`);
154
-
155
- return true;
156
- } catch (error) {
157
- console.error('āŒ Failed to initialize QE Event Bus:', error.message);
158
- throw error;
159
- }
160
- }
161
-
162
- /**
47
+ */ async initialize() {
48
+ console.log('šŸš€ Initializing QE Event Bus with WASM acceleration...');
49
+ try {
50
+ // Wait for WASM initialization
51
+ await wasmInitPromise;
52
+ this.wasmReady = wasmAvailable;
53
+ if (this.wasmReady) {
54
+ console.log('āœ… WASM Regex Engine ready for 52x speedup');
55
+ console.log(' SIMD validation: ENABLED');
56
+ console.log(' Zero-copy batching: ENABLED');
57
+ console.log(' Hash-based routing: ENABLED');
58
+ } else {
59
+ console.log('āš ļø Running in JavaScript fallback mode');
60
+ }
61
+ // Start batch processing
62
+ this.enableBatching();
63
+ this.active = true;
64
+ this.startTime = performance.now();
65
+ console.log(`āœ… QE Event Bus initialized (target: ${this.config.throughputTarget} events/sec)`);
66
+ return true;
67
+ } catch (error) {
68
+ console.error('āŒ Failed to initialize QE Event Bus:', error.message);
69
+ throw error;
70
+ }
71
+ }
72
+ /**
163
73
  * Subscribe to event pattern with handler
164
74
  * Builds hash-based routing table for O(1) lookup
165
- */
166
- subscribe(pattern, handler, options = {}) {
167
- if (!this.subscribers.has(pattern)) {
168
- this.subscribers.set(pattern, new Set());
169
- }
170
-
171
- const handlerInfo = {
172
- handler,
173
- priority: options.priority || 5,
174
- batchSize: options.batchSize || this.config.batchSize,
175
- filter: options.filter
176
- };
177
-
178
- this.subscribers.get(pattern).add(handlerInfo);
179
-
180
- // Invalidate routing cache for this pattern
181
- this.routingCache.clear();
182
-
183
- console.log(`šŸ“” Subscribed to pattern: ${pattern} (priority: ${handlerInfo.priority})`);
184
-
185
- return () => this.unsubscribe(pattern, handler);
186
- }
187
-
188
- /**
75
+ */ subscribe(pattern, handler, options = {}) {
76
+ if (!this.subscribers.has(pattern)) {
77
+ this.subscribers.set(pattern, new Set());
78
+ }
79
+ const handlerInfo = {
80
+ handler,
81
+ priority: options.priority || 5,
82
+ batchSize: options.batchSize || this.config.batchSize,
83
+ filter: options.filter
84
+ };
85
+ this.subscribers.get(pattern).add(handlerInfo);
86
+ // Invalidate routing cache for this pattern
87
+ this.routingCache.clear();
88
+ console.log(`šŸ“” Subscribed to pattern: ${pattern} (priority: ${handlerInfo.priority})`);
89
+ return ()=>this.unsubscribe(pattern, handler);
90
+ }
91
+ /**
189
92
  * Unsubscribe handler from pattern
190
- */
191
- unsubscribe(pattern, handler) {
192
- const handlers = this.subscribers.get(pattern);
193
- if (handlers) {
194
- handlers.forEach(info => {
195
- if (info.handler === handler) {
196
- handlers.delete(info);
197
- }
198
- });
199
-
200
- if (handlers.size === 0) {
201
- this.subscribers.delete(pattern);
202
- }
203
-
204
- this.routingCache.clear();
205
- }
206
- }
207
-
208
- /**
93
+ */ unsubscribe(pattern, handler) {
94
+ const handlers = this.subscribers.get(pattern);
95
+ if (handlers) {
96
+ handlers.forEach((info)=>{
97
+ if (info.handler === handler) {
98
+ handlers.delete(info);
99
+ }
100
+ });
101
+ if (handlers.size === 0) {
102
+ this.subscribers.delete(pattern);
103
+ }
104
+ this.routingCache.clear();
105
+ }
106
+ }
107
+ /**
209
108
  * Publish event with WASM-accelerated validation
210
109
  * Lines 352-396: WASM validation logic
211
- */
212
- async publish(eventType, data, options = {}) {
213
- if (!this.active) {
214
- throw new Error('QE Event Bus not active');
215
- }
216
-
217
- const startTime = performance.now();
218
- const priority = options.priority || 5;
219
-
220
- // Create event envelope
221
- const event = {
222
- id: this.generateEventId(),
223
- type: eventType,
224
- data,
225
- timestamp: startTime,
226
- priority,
227
- source: options.source || 'unknown'
228
- };
229
-
230
- // WASM-ACCELERATED VALIDATION (52x speedup)
231
- // Lines 352-396: Replace with WASM validation
232
- const validationStart = performance.now();
233
- let isValid = false;
234
-
235
- if (this.wasmReady && this.config.enableWASM) {
236
- try {
237
- // REAL WASM validation using compiled Rust regex engine
238
- // has_match is the fastest check (SIMD-accelerated)
239
- isValid = wasmEngine.has_match(eventType);
240
- this.metrics.wasmValidations++;
241
-
242
- // Optional: Get detailed match info for logging
243
- if (isValid && options.verbose) {
244
- const matches = wasmEngine.match_all(eventType);
245
- console.log(`āœ“ WASM validated: ${eventType}`, matches);
246
- }
247
- } catch (error) {
248
- console.warn('āš ļø WASM validation failed, falling back to JS:', error.message);
249
- isValid = this.validateEventTypeJS(eventType);
250
- this.metrics.jsValidations++;
251
- this.metrics.wasmErrors = (this.metrics.wasmErrors || 0) + 1;
252
- } finally {
253
- // Ensure WASM buffer cleanup even on error (Sprint 1.3 memory safety)
254
- if (wasmEngine && typeof wasmEngine.clearBuffer === 'function') {
255
- try {
256
- wasmEngine.clearBuffer();
257
- } catch (cleanupError) {
258
- // Log but don't fail on cleanup errors
259
- console.warn('āš ļø WASM buffer cleanup warning:', cleanupError.message);
260
- }
261
- }
262
- }
263
- } else {
264
- // JavaScript fallback validation
265
- isValid = this.validateEventTypeJS(eventType);
266
- this.metrics.jsValidations++;
267
- }
268
-
269
- const validationTime = performance.now() - validationStart;
270
-
271
- if (!isValid) {
272
- this.metrics.errors++;
273
- throw new Error(`Invalid event type: ${eventType} (validation: ${validationTime.toFixed(3)}ms)`);
274
- }
275
-
276
- // Add to priority queue
277
- this.priorityQueues[priority].push(event);
278
- this.metrics.eventsPublished++;
279
-
280
- // High priority events are processed immediately
281
- if (priority >= 8) {
282
- await this.processEvent(event);
283
- } else {
284
- // Normal/low priority events are batched
285
- this.eventBatch.push(event);
286
-
287
- // Process batch if full
288
- if (this.eventBatch.length >= this.config.batchSize) {
289
- await this.processBatch();
290
- }
291
- }
292
-
293
- const totalLatency = performance.now() - startTime;
294
- this.metrics.totalLatency += totalLatency;
295
-
296
- return {
297
- eventId: event.id,
298
- latency: totalLatency,
299
- validationTime,
300
- wasmAccelerated: this.wasmReady && this.config.enableWASM
301
- };
302
- }
303
-
304
- /**
110
+ */ async publish(eventType, data, options = {}) {
111
+ if (!this.active) {
112
+ throw new Error('QE Event Bus not active');
113
+ }
114
+ const startTime = performance.now();
115
+ const priority = options.priority || 5;
116
+ // Create event envelope
117
+ const event = {
118
+ id: this.generateEventId(),
119
+ type: eventType,
120
+ data,
121
+ timestamp: startTime,
122
+ priority,
123
+ source: options.source || 'unknown'
124
+ };
125
+ // WASM-ACCELERATED VALIDATION (52x speedup)
126
+ // Lines 352-396: Replace with WASM validation
127
+ const validationStart = performance.now();
128
+ let isValid = false;
129
+ if (this.wasmReady && this.config.enableWASM) {
130
+ try {
131
+ // REAL WASM validation using compiled Rust regex engine
132
+ // has_match is the fastest check (SIMD-accelerated)
133
+ isValid = wasmEngine.has_match(eventType);
134
+ this.metrics.wasmValidations++;
135
+ // Optional: Get detailed match info for logging
136
+ if (isValid && options.verbose) {
137
+ const matches = wasmEngine.match_all(eventType);
138
+ console.log(`āœ“ WASM validated: ${eventType}`, matches);
139
+ }
140
+ } catch (error) {
141
+ console.warn('āš ļø WASM validation failed, falling back to JS:', error.message);
142
+ isValid = this.validateEventTypeJS(eventType);
143
+ this.metrics.jsValidations++;
144
+ this.metrics.wasmErrors = (this.metrics.wasmErrors || 0) + 1;
145
+ } finally{
146
+ // Ensure WASM buffer cleanup even on error (Sprint 1.3 memory safety)
147
+ if (wasmEngine && typeof wasmEngine.clearBuffer === 'function') {
148
+ try {
149
+ wasmEngine.clearBuffer();
150
+ } catch (cleanupError) {
151
+ // Log but don't fail on cleanup errors
152
+ console.warn('āš ļø WASM buffer cleanup warning:', cleanupError.message);
153
+ }
154
+ }
155
+ }
156
+ } else {
157
+ // JavaScript fallback validation
158
+ isValid = this.validateEventTypeJS(eventType);
159
+ this.metrics.jsValidations++;
160
+ }
161
+ const validationTime = performance.now() - validationStart;
162
+ if (!isValid) {
163
+ this.metrics.errors++;
164
+ throw new Error(`Invalid event type: ${eventType} (validation: ${validationTime.toFixed(3)}ms)`);
165
+ }
166
+ // Add to priority queue
167
+ this.priorityQueues[priority].push(event);
168
+ this.metrics.eventsPublished++;
169
+ // High priority events are processed immediately
170
+ if (priority >= 8) {
171
+ await this.processEvent(event);
172
+ } else {
173
+ // Normal/low priority events are batched
174
+ this.eventBatch.push(event);
175
+ // Process batch if full
176
+ if (this.eventBatch.length >= this.config.batchSize) {
177
+ await this.processBatch();
178
+ }
179
+ }
180
+ const totalLatency = performance.now() - startTime;
181
+ this.metrics.totalLatency += totalLatency;
182
+ return {
183
+ eventId: event.id,
184
+ latency: totalLatency,
185
+ validationTime,
186
+ wasmAccelerated: this.wasmReady && this.config.enableWASM
187
+ };
188
+ }
189
+ /**
305
190
  * JavaScript fallback validation (no WASM)
306
- */
307
- validateEventTypeJS(eventType) {
308
- // JavaScript regex validation (slower fallback)
309
- const validPatterns = [
310
- /^cfn\.loop\./,
311
- /^agent\./,
312
- /^swarm\./,
313
- /^fleet\./,
314
- /^compliance\./,
315
- /^performance\./,
316
- /^dashboard\./,
317
- /^eventbus\./
318
- ];
319
-
320
- return validPatterns.some(pattern => pattern.test(eventType));
321
- }
322
-
323
- /**
191
+ */ validateEventTypeJS(eventType) {
192
+ // JavaScript regex validation (slower fallback)
193
+ const validPatterns = [
194
+ /^cfn\.loop\./,
195
+ /^agent\./,
196
+ /^swarm\./,
197
+ /^fleet\./,
198
+ /^compliance\./,
199
+ /^performance\./,
200
+ /^dashboard\./,
201
+ /^eventbus\./
202
+ ];
203
+ return validPatterns.some((pattern)=>pattern.test(eventType));
204
+ }
205
+ /**
324
206
  * Enable batching for high throughput
325
- */
326
- enableBatching() {
327
- this.batchTimer = setInterval(() => {
328
- if (this.eventBatch.length > 0) {
329
- this.processBatch();
330
- }
331
- }, this.config.batchTimeout);
332
- }
333
-
334
- /**
207
+ */ enableBatching() {
208
+ this.batchTimer = setInterval(()=>{
209
+ if (this.eventBatch.length > 0) {
210
+ this.processBatch();
211
+ }
212
+ }, this.config.batchTimeout);
213
+ }
214
+ /**
335
215
  * Process event batch with zero-copy optimization
336
216
  * Lines 523-530: Zero-copy batching implementation
337
- */
338
- async processBatch() {
339
- if (this.eventBatch.length === 0) return;
340
-
341
- const batchStart = performance.now();
342
-
343
- // ZERO-COPY BATCH PROCESSING (Lines 523-530)
344
- // Extract batch without copying (swap reference)
345
- const batch = this.eventBatch;
346
- this.eventBatch = [];
347
-
348
- try {
349
- // SIMD-style parallel processing (simulate with Promise.all)
350
- await Promise.all(batch.map(event => this.processEvent(event)));
351
-
352
- this.metrics.batchesProcessed++;
353
-
354
- const batchTime = performance.now() - batchStart;
355
- const eventsPerSec = (batch.length / (batchTime / 1000)).toFixed(0);
356
-
357
- if (batch.length > 10) {
358
- console.log(`šŸ“¦ Batch processed: ${batch.length} events in ${batchTime.toFixed(2)}ms (${eventsPerSec} events/sec)`);
359
- }
360
- } catch (error) {
361
- console.error('āŒ Batch processing failed:', error.message);
362
- this.metrics.errors++;
363
- }
364
- }
365
-
366
- /**
217
+ */ async processBatch() {
218
+ if (this.eventBatch.length === 0) return;
219
+ const batchStart = performance.now();
220
+ // ZERO-COPY BATCH PROCESSING (Lines 523-530)
221
+ // Extract batch without copying (swap reference)
222
+ const batch = this.eventBatch;
223
+ this.eventBatch = [];
224
+ try {
225
+ // SIMD-style parallel processing (simulate with Promise.all)
226
+ await Promise.all(batch.map((event)=>this.processEvent(event)));
227
+ this.metrics.batchesProcessed++;
228
+ const batchTime = performance.now() - batchStart;
229
+ const eventsPerSec = (batch.length / (batchTime / 1000)).toFixed(0);
230
+ if (batch.length > 10) {
231
+ console.log(`šŸ“¦ Batch processed: ${batch.length} events in ${batchTime.toFixed(2)}ms (${eventsPerSec} events/sec)`);
232
+ }
233
+ } catch (error) {
234
+ console.error('āŒ Batch processing failed:', error.message);
235
+ this.metrics.errors++;
236
+ }
237
+ }
238
+ /**
367
239
  * Process single event with hash-based routing and circuit breaker protection
368
240
  * Lines 623-646: O(1) hash-based routing implementation
369
- */
370
- async processEvent(event) {
371
- // CIRCUIT BREAKER: Check if event should be processed
372
- // Priority 8-9 events bypass circuit breaker for critical coordination
373
- if (!this.isHighPriority(event)) {
374
- const canProcess = this.checkCircuit();
375
- if (!canProcess) {
376
- this.metrics.eventsRejected++;
377
- const error = new Error(`Circuit breaker OPEN - event rejected: ${event.type}`);
378
- error.code = 'CIRCUIT_OPEN';
379
- throw error;
380
- }
381
- } else {
382
- // Track priority bypass events
383
- this.metrics.bypassEvents++;
384
- }
385
-
386
- const routingStart = performance.now();
387
-
388
- try {
389
- // HASH-BASED O(1) ROUTING (Lines 623-646)
390
- // Check routing cache first
391
- let routes = this.routingCache.get(event.type);
392
-
393
- if (!routes) {
394
- // Cache miss: compute routes and cache them
395
- routes = this.computeRoutes(event.type);
396
- this.routingCache.set(event.type, routes);
397
- this.metrics.routingMisses++;
398
-
399
- // Limit cache size to prevent memory bloat
400
- if (this.routingCache.size > 10000) {
401
- // Evict oldest 1000 entries
402
- const keysToDelete = Array.from(this.routingCache.keys()).slice(0, 1000);
403
- keysToDelete.forEach(key => this.routingCache.delete(key));
404
- }
405
- } else {
406
- this.metrics.routingHits++;
407
- }
408
-
409
- const routingTime = performance.now() - routingStart;
410
-
411
- // Execute handlers
412
- const handlerStart = performance.now();
413
- const handlerPromises = routes.map(({ handler, filter }) => {
414
- // Apply filter if present
415
- if (filter && !filter(event)) {
416
- return Promise.resolve();
417
- }
418
-
419
- // Execute handler
420
- return Promise.resolve(handler(event)).catch(error => {
421
- console.error(`āŒ Handler failed for ${event.type}:`, error.message);
422
- this.metrics.errors++;
423
- throw error; // Re-throw to trigger circuit breaker
424
- });
425
- });
426
-
427
- await Promise.all(handlerPromises);
428
-
429
- const handlerTime = performance.now() - handlerStart;
430
- this.metrics.eventsProcessed++;
431
-
432
- // Emit for local listeners
433
- this.emit('event', event);
434
- this.emit(`event:${event.type}`, event);
435
-
436
- // Performance logging (only for slow events)
437
- if (handlerTime > 10) {
438
- console.warn(`āš ļø Slow event processing: ${event.type} (routing: ${routingTime.toFixed(3)}ms, handlers: ${handlerTime.toFixed(3)}ms)`);
439
- }
440
-
441
- // CIRCUIT BREAKER: Record successful processing
442
- this.recordSuccess();
443
-
444
- } catch (error) {
445
- // CIRCUIT BREAKER: Record failure
446
- this.recordFailure(error);
447
- throw error; // Re-throw for caller
448
- }
449
- }
450
-
451
- /**
241
+ */ async processEvent(event) {
242
+ // CIRCUIT BREAKER: Check if event should be processed
243
+ // Priority 8-9 events bypass circuit breaker for critical coordination
244
+ if (!this.isHighPriority(event)) {
245
+ const canProcess = this.checkCircuit();
246
+ if (!canProcess) {
247
+ this.metrics.eventsRejected++;
248
+ const error = new Error(`Circuit breaker OPEN - event rejected: ${event.type}`);
249
+ error.code = 'CIRCUIT_OPEN';
250
+ throw error;
251
+ }
252
+ } else {
253
+ // Track priority bypass events
254
+ this.metrics.bypassEvents++;
255
+ }
256
+ const routingStart = performance.now();
257
+ try {
258
+ // HASH-BASED O(1) ROUTING (Lines 623-646)
259
+ // Check routing cache first
260
+ let routes = this.routingCache.get(event.type);
261
+ if (!routes) {
262
+ // Cache miss: compute routes and cache them
263
+ routes = this.computeRoutes(event.type);
264
+ this.routingCache.set(event.type, routes);
265
+ this.metrics.routingMisses++;
266
+ // Limit cache size to prevent memory bloat
267
+ if (this.routingCache.size > 10000) {
268
+ // Evict oldest 1000 entries
269
+ const keysToDelete = Array.from(this.routingCache.keys()).slice(0, 1000);
270
+ keysToDelete.forEach((key)=>this.routingCache.delete(key));
271
+ }
272
+ } else {
273
+ this.metrics.routingHits++;
274
+ }
275
+ const routingTime = performance.now() - routingStart;
276
+ // Execute handlers
277
+ const handlerStart = performance.now();
278
+ const handlerPromises = routes.map(({ handler, filter })=>{
279
+ // Apply filter if present
280
+ if (filter && !filter(event)) {
281
+ return Promise.resolve();
282
+ }
283
+ // Execute handler
284
+ return Promise.resolve(handler(event)).catch((error)=>{
285
+ console.error(`āŒ Handler failed for ${event.type}:`, error.message);
286
+ this.metrics.errors++;
287
+ throw error; // Re-throw to trigger circuit breaker
288
+ });
289
+ });
290
+ await Promise.all(handlerPromises);
291
+ const handlerTime = performance.now() - handlerStart;
292
+ this.metrics.eventsProcessed++;
293
+ // Emit for local listeners
294
+ this.emit('event', event);
295
+ this.emit(`event:${event.type}`, event);
296
+ // Performance logging (only for slow events)
297
+ if (handlerTime > 10) {
298
+ console.warn(`āš ļø Slow event processing: ${event.type} (routing: ${routingTime.toFixed(3)}ms, handlers: ${handlerTime.toFixed(3)}ms)`);
299
+ }
300
+ // CIRCUIT BREAKER: Record successful processing
301
+ this.recordSuccess();
302
+ } catch (error) {
303
+ // CIRCUIT BREAKER: Record failure
304
+ this.recordFailure(error);
305
+ throw error; // Re-throw for caller
306
+ }
307
+ }
308
+ /**
452
309
  * Compute routes for event type using pattern matching
453
310
  * Uses JavaScript regex (compiled and cached for O(1) routing)
454
- */
455
- computeRoutes(eventType) {
456
- const routes = [];
457
-
458
- for (const [pattern, handlers] of this.subscribers.entries()) {
459
- // JavaScript regex pattern matching (very fast for routing)
460
- // WASM is used for event validation, JS is fine for routing patterns
461
- try {
462
- const regex = new RegExp(pattern);
463
- if (regex.test(eventType)) {
464
- handlers.forEach(handlerInfo => {
465
- routes.push(handlerInfo);
466
- });
467
- }
468
- } catch (error) {
469
- // Invalid regex pattern, skip it
470
- console.warn(`Invalid pattern: ${pattern}`, error.message);
471
- }
472
- }
473
-
474
- // Sort by priority (higher priority first)
475
- routes.sort((a, b) => b.priority - a.priority);
476
-
477
- return routes;
478
- }
479
-
480
- /**
311
+ */ computeRoutes(eventType) {
312
+ const routes = [];
313
+ for (const [pattern, handlers] of this.subscribers.entries()){
314
+ // JavaScript regex pattern matching (very fast for routing)
315
+ // WASM is used for event validation, JS is fine for routing patterns
316
+ try {
317
+ const regex = new RegExp(pattern);
318
+ if (regex.test(eventType)) {
319
+ handlers.forEach((handlerInfo)=>{
320
+ routes.push(handlerInfo);
321
+ });
322
+ }
323
+ } catch (error) {
324
+ // Invalid regex pattern, skip it
325
+ console.warn(`Invalid pattern: ${pattern}`, error.message);
326
+ }
327
+ }
328
+ // Sort by priority (higher priority first)
329
+ routes.sort((a, b)=>b.priority - a.priority);
330
+ return routes;
331
+ }
332
+ /**
481
333
  * Generate unique event ID
482
- */
483
- generateEventId() {
484
- // High-performance ID generation
485
- const timestamp = Date.now();
486
- const random = Math.random().toString(36).substr(2, 9);
487
- return `evt_${timestamp}_${random}`;
488
- }
489
-
490
- /**
334
+ */ generateEventId() {
335
+ // High-performance ID generation
336
+ const timestamp = Date.now();
337
+ const random = Math.random().toString(36).substr(2, 9);
338
+ return `evt_${timestamp}_${random}`;
339
+ }
340
+ /**
491
341
  * Get performance metrics
492
- */
493
- getMetrics() {
494
- const uptime = this.startTime ? (performance.now() - this.startTime) / 1000 : 0;
495
- const avgLatency = this.metrics.eventsProcessed > 0
496
- ? this.metrics.totalLatency / this.metrics.eventsProcessed
497
- : 0;
498
- const throughput = uptime > 0
499
- ? this.metrics.eventsProcessed / uptime
500
- : 0;
501
-
502
- return {
503
- ...this.metrics,
504
- avgLatency: avgLatency.toFixed(3),
505
- throughput: throughput.toFixed(0),
506
- uptime: uptime.toFixed(1),
507
- wasmEnabled: this.wasmReady,
508
- wasmSpeedup: this.wasmReady ? '52x' : 'N/A',
509
- routingHitRate: this.metrics.routingMisses > 0
510
- ? ((this.metrics.routingHits / (this.metrics.routingHits + this.metrics.routingMisses)) * 100).toFixed(1)
511
- : '0',
512
- targetThroughput: this.config.throughputTarget,
513
- targetLatency: this.config.latencyTarget
514
- };
515
- }
516
-
517
- /**
342
+ */ getMetrics() {
343
+ const uptime = this.startTime ? (performance.now() - this.startTime) / 1000 : 0;
344
+ const avgLatency = this.metrics.eventsProcessed > 0 ? this.metrics.totalLatency / this.metrics.eventsProcessed : 0;
345
+ const throughput = uptime > 0 ? this.metrics.eventsProcessed / uptime : 0;
346
+ return {
347
+ ...this.metrics,
348
+ avgLatency: avgLatency.toFixed(3),
349
+ throughput: throughput.toFixed(0),
350
+ uptime: uptime.toFixed(1),
351
+ wasmEnabled: this.wasmReady,
352
+ wasmSpeedup: this.wasmReady ? '52x' : 'N/A',
353
+ routingHitRate: this.metrics.routingMisses > 0 ? (this.metrics.routingHits / (this.metrics.routingHits + this.metrics.routingMisses) * 100).toFixed(1) : '0',
354
+ targetThroughput: this.config.throughputTarget,
355
+ targetLatency: this.config.latencyTarget
356
+ };
357
+ }
358
+ /**
518
359
  * Get real-time dashboard data
519
- */
520
- getDashboard() {
521
- const metrics = this.getMetrics();
522
-
523
- return {
524
- status: this.active ? 'active' : 'inactive',
525
- health: this.computeHealth(metrics),
526
- metrics,
527
- queues: {
528
- batch: this.eventBatch.length,
529
- priorities: this.priorityQueues.map((q, i) => ({
530
- priority: i,
531
- size: q.length
532
- })).filter(q => q.size > 0)
533
- },
534
- cache: {
535
- routes: this.routingCache.size,
536
- hitRate: metrics.routingHitRate
537
- },
538
- wasm: {
539
- enabled: this.wasmReady,
540
- validations: this.metrics.wasmValidations,
541
- fallbacks: this.metrics.jsValidations
542
- },
543
- circuitBreaker: this.getCircuitStatus()
544
- };
545
- }
546
-
547
- /**
360
+ */ getDashboard() {
361
+ const metrics = this.getMetrics();
362
+ return {
363
+ status: this.active ? 'active' : 'inactive',
364
+ health: this.computeHealth(metrics),
365
+ metrics,
366
+ queues: {
367
+ batch: this.eventBatch.length,
368
+ priorities: this.priorityQueues.map((q, i)=>({
369
+ priority: i,
370
+ size: q.length
371
+ })).filter((q)=>q.size > 0)
372
+ },
373
+ cache: {
374
+ routes: this.routingCache.size,
375
+ hitRate: metrics.routingHitRate
376
+ },
377
+ wasm: {
378
+ enabled: this.wasmReady,
379
+ validations: this.metrics.wasmValidations,
380
+ fallbacks: this.metrics.jsValidations
381
+ },
382
+ circuitBreaker: this.getCircuitStatus()
383
+ };
384
+ }
385
+ /**
548
386
  * Compute overall health score
549
- */
550
- computeHealth(metrics) {
551
- let score = 100;
552
-
553
- // Throughput check
554
- if (parseFloat(metrics.throughput) < this.config.throughputTarget * 0.5) {
555
- score -= 20;
556
- }
557
-
558
- // Latency check
559
- if (parseFloat(metrics.avgLatency) > this.config.latencyTarget) {
560
- score -= 15;
561
- }
562
-
563
- // Error rate check
564
- const errorRate = metrics.eventsProcessed > 0
565
- ? (metrics.errors / metrics.eventsProcessed) * 100
566
- : 0;
567
- if (errorRate > 5) {
568
- score -= 25;
569
- }
570
-
571
- // Routing efficiency check
572
- if (parseFloat(metrics.routingHitRate) < 80) {
573
- score -= 10;
574
- }
575
-
576
- // Circuit breaker check
577
- if (this.circuitBreaker.state === 'OPEN') {
578
- score -= 30; // Major health impact when circuit is open
579
- } else if (this.circuitBreaker.state === 'HALF-OPEN') {
580
- score -= 15; // Moderate impact during recovery
581
- }
582
-
583
- return {
584
- score: Math.max(0, score),
585
- status: score >= 80 ? 'healthy' : score >= 60 ? 'degraded' : 'unhealthy'
586
- };
587
- }
588
-
589
- /**
387
+ */ computeHealth(metrics) {
388
+ let score = 100;
389
+ // Throughput check
390
+ if (parseFloat(metrics.throughput) < this.config.throughputTarget * 0.5) {
391
+ score -= 20;
392
+ }
393
+ // Latency check
394
+ if (parseFloat(metrics.avgLatency) > this.config.latencyTarget) {
395
+ score -= 15;
396
+ }
397
+ // Error rate check
398
+ const errorRate = metrics.eventsProcessed > 0 ? metrics.errors / metrics.eventsProcessed * 100 : 0;
399
+ if (errorRate > 5) {
400
+ score -= 25;
401
+ }
402
+ // Routing efficiency check
403
+ if (parseFloat(metrics.routingHitRate) < 80) {
404
+ score -= 10;
405
+ }
406
+ // Circuit breaker check
407
+ if (this.circuitBreaker.state === 'OPEN') {
408
+ score -= 30; // Major health impact when circuit is open
409
+ } else if (this.circuitBreaker.state === 'HALF-OPEN') {
410
+ score -= 15; // Moderate impact during recovery
411
+ }
412
+ return {
413
+ score: Math.max(0, score),
414
+ status: score >= 80 ? 'healthy' : score >= 60 ? 'degraded' : 'unhealthy'
415
+ };
416
+ }
417
+ /**
590
418
  * Check if event is high priority (8-9) and should bypass circuit breaker
591
- */
592
- isHighPriority(event) {
593
- return event.priority !== undefined && event.priority >= 8;
594
- }
595
-
596
- /**
419
+ */ isHighPriority(event) {
420
+ return event.priority !== undefined && event.priority >= 8;
421
+ }
422
+ /**
597
423
  * Check circuit breaker state and determine if event can be processed
598
424
  * @returns {boolean} true if event can be processed, false if rejected
599
- */
600
- checkCircuit() {
601
- const now = Date.now();
602
-
603
- switch (this.circuitBreaker.state) {
604
- case 'CLOSED':
605
- return true; // Normal operation
606
-
607
- case 'OPEN':
608
- const timeOpen = now - this.circuitBreaker.openedAt;
609
- if (timeOpen >= this.circuitBreaker.recoveryTimeout) {
610
- this.transitionTo('HALF-OPEN');
611
- this.metrics.recoveryAttempts++;
612
- return true; // Allow testing
613
- }
614
- return false; // Reject events
615
-
616
- case 'HALF-OPEN':
617
- return true; // Allow for testing
618
-
619
- default:
620
- return true;
621
- }
622
- }
623
-
624
- /**
425
+ */ checkCircuit() {
426
+ const now = Date.now();
427
+ switch(this.circuitBreaker.state){
428
+ case 'CLOSED':
429
+ return true; // Normal operation
430
+ case 'OPEN':
431
+ const timeOpen = now - this.circuitBreaker.openedAt;
432
+ if (timeOpen >= this.circuitBreaker.recoveryTimeout) {
433
+ this.transitionTo('HALF-OPEN');
434
+ this.metrics.recoveryAttempts++;
435
+ return true; // Allow testing
436
+ }
437
+ return false; // Reject events
438
+ case 'HALF-OPEN':
439
+ return true; // Allow for testing
440
+ default:
441
+ return true;
442
+ }
443
+ }
444
+ /**
625
445
  * Record successful event processing for circuit breaker
626
- */
627
- recordSuccess() {
628
- switch (this.circuitBreaker.state) {
629
- case 'CLOSED':
630
- // Reset failure counter on success
631
- this.circuitBreaker.consecutiveFailures = 0;
632
- break;
633
-
634
- case 'HALF-OPEN':
635
- // Track successes in half-open state
636
- this.circuitBreaker.halfOpenSuccesses++;
637
- if (this.circuitBreaker.halfOpenSuccesses >= this.circuitBreaker.halfOpenThreshold) {
638
- this.transitionTo('CLOSED');
639
- }
640
- break;
641
- }
642
- }
643
-
644
- /**
446
+ */ recordSuccess() {
447
+ switch(this.circuitBreaker.state){
448
+ case 'CLOSED':
449
+ // Reset failure counter on success
450
+ this.circuitBreaker.consecutiveFailures = 0;
451
+ break;
452
+ case 'HALF-OPEN':
453
+ // Track successes in half-open state
454
+ this.circuitBreaker.halfOpenSuccesses++;
455
+ if (this.circuitBreaker.halfOpenSuccesses >= this.circuitBreaker.halfOpenThreshold) {
456
+ this.transitionTo('CLOSED');
457
+ }
458
+ break;
459
+ }
460
+ }
461
+ /**
645
462
  * Record failed event processing for circuit breaker
646
- */
647
- recordFailure(error) {
648
- this.circuitBreaker.consecutiveFailures++;
649
-
650
- switch (this.circuitBreaker.state) {
651
- case 'CLOSED':
652
- if (this.circuitBreaker.consecutiveFailures >= this.circuitBreaker.failureThreshold) {
653
- this.transitionTo('OPEN');
654
- }
655
- break;
656
-
657
- case 'HALF-OPEN':
658
- // Any failure in half-open immediately reopens circuit
659
- this.transitionTo('OPEN');
660
- break;
661
- }
662
- }
663
-
664
- /**
463
+ */ recordFailure(error) {
464
+ this.circuitBreaker.consecutiveFailures++;
465
+ switch(this.circuitBreaker.state){
466
+ case 'CLOSED':
467
+ if (this.circuitBreaker.consecutiveFailures >= this.circuitBreaker.failureThreshold) {
468
+ this.transitionTo('OPEN');
469
+ }
470
+ break;
471
+ case 'HALF-OPEN':
472
+ // Any failure in half-open immediately reopens circuit
473
+ this.transitionTo('OPEN');
474
+ break;
475
+ }
476
+ }
477
+ /**
665
478
  * Transition circuit breaker to new state
666
- */
667
- transitionTo(newState) {
668
- const oldState = this.circuitBreaker.state;
669
- this.circuitBreaker.state = newState;
670
- this.circuitBreaker.lastStateChange = Date.now();
671
-
672
- if (newState === 'OPEN') {
673
- this.circuitBreaker.openedAt = Date.now();
674
- this.metrics.circuitOpens++;
675
- console.log(`šŸ”Œ Circuit breaker: ${oldState} → OPEN (failures: ${this.circuitBreaker.consecutiveFailures})`);
676
- } else if (newState === 'HALF-OPEN') {
677
- this.circuitBreaker.halfOpenSuccesses = 0;
678
- console.log(`šŸ”Œ Circuit breaker: ${oldState} → HALF-OPEN (testing recovery)`);
679
- } else if (newState === 'CLOSED') {
680
- this.circuitBreaker.consecutiveFailures = 0;
681
- this.circuitBreaker.halfOpenSuccesses = 0;
682
- console.log(`šŸ”Œ Circuit breaker: ${oldState} → CLOSED (recovered)`);
683
- }
684
-
685
- this.metrics.circuitState = newState;
686
- }
687
-
688
- /**
479
+ */ transitionTo(newState) {
480
+ const oldState = this.circuitBreaker.state;
481
+ this.circuitBreaker.state = newState;
482
+ this.circuitBreaker.lastStateChange = Date.now();
483
+ if (newState === 'OPEN') {
484
+ this.circuitBreaker.openedAt = Date.now();
485
+ this.metrics.circuitOpens++;
486
+ console.log(`šŸ”Œ Circuit breaker: ${oldState} → OPEN (failures: ${this.circuitBreaker.consecutiveFailures})`);
487
+ } else if (newState === 'HALF-OPEN') {
488
+ this.circuitBreaker.halfOpenSuccesses = 0;
489
+ console.log(`šŸ”Œ Circuit breaker: ${oldState} → HALF-OPEN (testing recovery)`);
490
+ } else if (newState === 'CLOSED') {
491
+ this.circuitBreaker.consecutiveFailures = 0;
492
+ this.circuitBreaker.halfOpenSuccesses = 0;
493
+ console.log(`šŸ”Œ Circuit breaker: ${oldState} → CLOSED (recovered)`);
494
+ }
495
+ this.metrics.circuitState = newState;
496
+ }
497
+ /**
689
498
  * Get circuit breaker status and metrics
690
- */
691
- getCircuitStatus() {
692
- return {
693
- state: this.circuitBreaker.state,
694
- consecutiveFailures: this.circuitBreaker.consecutiveFailures,
695
- openedAt: this.circuitBreaker.openedAt,
696
- lastStateChange: this.circuitBreaker.lastStateChange,
697
- failureThreshold: this.circuitBreaker.failureThreshold,
698
- recoveryTimeout: this.circuitBreaker.recoveryTimeout,
699
- metrics: {
700
- circuitOpens: this.metrics.circuitOpens,
701
- eventsRejected: this.metrics.eventsRejected,
702
- bypassEvents: this.metrics.bypassEvents,
703
- recoveryAttempts: this.metrics.recoveryAttempts
704
- }
705
- };
706
- }
707
-
708
- /**
499
+ */ getCircuitStatus() {
500
+ return {
501
+ state: this.circuitBreaker.state,
502
+ consecutiveFailures: this.circuitBreaker.consecutiveFailures,
503
+ openedAt: this.circuitBreaker.openedAt,
504
+ lastStateChange: this.circuitBreaker.lastStateChange,
505
+ failureThreshold: this.circuitBreaker.failureThreshold,
506
+ recoveryTimeout: this.circuitBreaker.recoveryTimeout,
507
+ metrics: {
508
+ circuitOpens: this.metrics.circuitOpens,
509
+ eventsRejected: this.metrics.eventsRejected,
510
+ bypassEvents: this.metrics.bypassEvents,
511
+ recoveryAttempts: this.metrics.recoveryAttempts
512
+ }
513
+ };
514
+ }
515
+ /**
709
516
  * Graceful shutdown
710
- */
711
- async shutdown() {
712
- console.log('šŸ›‘ Shutting down QE Event Bus...');
713
-
714
- this.active = false;
715
-
716
- // Process remaining events
717
- if (this.eventBatch.length > 0) {
718
- console.log(`šŸ“¦ Processing ${this.eventBatch.length} remaining events...`);
719
- await this.processBatch();
720
- }
721
-
722
- // Process remaining priority queues
723
- for (let i = this.priorityQueues.length - 1; i >= 0; i--) {
724
- const queue = this.priorityQueues[i];
725
- if (queue.length > 0) {
726
- console.log(`šŸ“¦ Processing ${queue.length} priority ${i} events...`);
727
- await Promise.all(queue.map(event => this.processEvent(event)));
728
- queue.length = 0;
729
- }
730
- }
731
-
732
- // Clear batch timer
733
- if (this.batchTimer) {
734
- clearInterval(this.batchTimer);
735
- this.batchTimer = null;
736
- }
737
-
738
- // Free WASM resources
739
- if (this.wasmReady && wasmEngine) {
740
- try {
741
- wasmEngine.free();
742
- console.log('āœ… WASM resources freed');
743
- } catch (error) {
744
- console.warn('āš ļø WASM cleanup warning:', error.message);
745
- }
746
- }
747
-
748
- // Print final metrics
749
- const finalMetrics = this.getMetrics();
750
- const circuitStatus = this.getCircuitStatus();
751
- console.log('\nšŸ“Š Final QE Event Bus Metrics:');
752
- console.log(` Events Processed: ${finalMetrics.eventsProcessed}`);
753
- console.log(` Events Published: ${finalMetrics.eventsPublished}`);
754
- console.log(` Avg Latency: ${finalMetrics.avgLatency}ms`);
755
- console.log(` Throughput: ${finalMetrics.throughput} events/sec`);
756
- console.log(` WASM Validations: ${finalMetrics.wasmValidations}`);
757
- console.log(` JS Validations: ${finalMetrics.jsValidations}`);
758
- console.log(` Routing Hit Rate: ${finalMetrics.routingHitRate}%`);
759
- console.log(` Errors: ${finalMetrics.errors}`);
760
- console.log(`\nšŸ”Œ Circuit Breaker Metrics:`);
761
- console.log(` Final State: ${circuitStatus.state}`);
762
- console.log(` Circuit Opens: ${circuitStatus.metrics.circuitOpens}`);
763
- console.log(` Events Rejected: ${circuitStatus.metrics.eventsRejected}`);
764
- console.log(` Priority Bypass: ${circuitStatus.metrics.bypassEvents}`);
765
- console.log(` Recovery Attempts: ${circuitStatus.metrics.recoveryAttempts}`);
766
-
767
- console.log('āœ… QE Event Bus shutdown complete');
768
- }
769
- }
770
-
771
- // Export singleton instance
772
- export default QEEventBus;
773
-
774
- // Export factory function
775
- export function createQEEventBus(config = {}) {
776
- return new QEEventBus(config);
777
- }
778
-
779
- // Export WASM initialization status checker
780
- export async function isWASMAvailable() {
781
- await wasmInitPromise;
782
- return wasmAvailable;
783
- }
517
+ */ async shutdown() {
518
+ console.log('šŸ›‘ Shutting down QE Event Bus...');
519
+ this.active = false;
520
+ // Process remaining events
521
+ if (this.eventBatch.length > 0) {
522
+ console.log(`šŸ“¦ Processing ${this.eventBatch.length} remaining events...`);
523
+ await this.processBatch();
524
+ }
525
+ // Process remaining priority queues
526
+ for(let i = this.priorityQueues.length - 1; i >= 0; i--){
527
+ const queue = this.priorityQueues[i];
528
+ if (queue.length > 0) {
529
+ console.log(`šŸ“¦ Processing ${queue.length} priority ${i} events...`);
530
+ await Promise.all(queue.map((event)=>this.processEvent(event)));
531
+ queue.length = 0;
532
+ }
533
+ }
534
+ // Clear batch timer
535
+ if (this.batchTimer) {
536
+ clearInterval(this.batchTimer);
537
+ this.batchTimer = null;
538
+ }
539
+ // Free WASM resources
540
+ if (this.wasmReady && wasmEngine) {
541
+ try {
542
+ wasmEngine.free();
543
+ console.log('āœ… WASM resources freed');
544
+ } catch (error) {
545
+ console.warn('āš ļø WASM cleanup warning:', error.message);
546
+ }
547
+ }
548
+ // Print final metrics
549
+ const finalMetrics = this.getMetrics();
550
+ const circuitStatus = this.getCircuitStatus();
551
+ console.log('\nšŸ“Š Final QE Event Bus Metrics:');
552
+ console.log(` Events Processed: ${finalMetrics.eventsProcessed}`);
553
+ console.log(` Events Published: ${finalMetrics.eventsPublished}`);
554
+ console.log(` Avg Latency: ${finalMetrics.avgLatency}ms`);
555
+ console.log(` Throughput: ${finalMetrics.throughput} events/sec`);
556
+ console.log(` WASM Validations: ${finalMetrics.wasmValidations}`);
557
+ console.log(` JS Validations: ${finalMetrics.jsValidations}`);
558
+ console.log(` Routing Hit Rate: ${finalMetrics.routingHitRate}%`);
559
+ console.log(` Errors: ${finalMetrics.errors}`);
560
+ console.log(`\nšŸ”Œ Circuit Breaker Metrics:`);
561
+ console.log(` Final State: ${circuitStatus.state}`);
562
+ console.log(` Circuit Opens: ${circuitStatus.metrics.circuitOpens}`);
563
+ console.log(` Events Rejected: ${circuitStatus.metrics.eventsRejected}`);
564
+ console.log(` Priority Bypass: ${circuitStatus.metrics.bypassEvents}`);
565
+ console.log(` Recovery Attempts: ${circuitStatus.metrics.recoveryAttempts}`);
566
+ console.log('āœ… QE Event Bus shutdown complete');
567
+ }
568
+ constructor(config = {}){
569
+ super();
570
+ this.config = {
571
+ throughputTarget: 10000,
572
+ latencyTarget: 50,
573
+ workerThreads: 4,
574
+ batchSize: 100,
575
+ batchTimeout: 10,
576
+ enableWASM: true,
577
+ enableSIMD: true,
578
+ enableZeroCopy: true,
579
+ priorityLevels: 10,
580
+ failureThreshold: 5,
581
+ recoveryTimeout: 30000,
582
+ ...config
583
+ };
584
+ // Event routing tables (hash-based O(1) lookup)
585
+ this.subscribers = new Map(); // pattern -> Set<handler>
586
+ this.routingCache = new Map(); // eventType -> cachedRoute
587
+ this.priorityQueues = Array.from({
588
+ length: this.config.priorityLevels
589
+ }, ()=>[]);
590
+ // Performance metrics
591
+ this.metrics = {
592
+ eventsProcessed: 0,
593
+ eventsPublished: 0,
594
+ totalLatency: 0,
595
+ wasmValidations: 0,
596
+ jsValidations: 0,
597
+ wasmErrors: 0,
598
+ wasmCleanupsPerformed: 0,
599
+ batchesProcessed: 0,
600
+ routingHits: 0,
601
+ routingMisses: 0,
602
+ errors: 0,
603
+ throughput: 0,
604
+ avgLatency: 0,
605
+ // Circuit breaker metrics
606
+ circuitState: 'CLOSED',
607
+ circuitOpens: 0,
608
+ eventsRejected: 0,
609
+ bypassEvents: 0,
610
+ recoveryAttempts: 0
611
+ };
612
+ // Circuit breaker state machine
613
+ this.circuitBreaker = {
614
+ state: 'CLOSED',
615
+ consecutiveFailures: 0,
616
+ failureThreshold: this.config.failureThreshold,
617
+ recoveryTimeout: this.config.recoveryTimeout,
618
+ halfOpenSuccesses: 0,
619
+ halfOpenThreshold: 3,
620
+ lastStateChange: Date.now(),
621
+ openedAt: null
622
+ };
623
+ // Batching state
624
+ this.eventBatch = [];
625
+ this.batchTimer = null;
626
+ // WASM state
627
+ this.wasmReady = false;
628
+ // Active state
629
+ this.active = false;
630
+ this.startTime = null;
631
+ }
632
+ }
633
+ // Export singleton instance
634
+ export default QEEventBus;
635
+ // Export factory function
636
+ export function createQEEventBus(config = {}) {
637
+ return new QEEventBus(config);
638
+ }
639
+ // Export WASM initialization status checker
640
+ export async function isWASMAvailable() {
641
+ await wasmInitPromise;
642
+ return wasmAvailable;
643
+ }