claude-flow 3.32.9 → 3.32.11

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 (451) hide show
  1. package/.claude/.proven-config-version +1 -0
  2. package/.claude/agents/MIGRATION_SUMMARY.md +221 -221
  3. package/.claude/agents/analysis/analyze-code-quality.md +57 -57
  4. package/.claude/agents/analysis/code-analyzer.md +188 -188
  5. package/.claude/agents/analysis/code-review/analyze-code-quality.md +57 -57
  6. package/.claude/agents/architecture/system-design/arch-system-design.md +35 -35
  7. package/.claude/agents/base-template-generator.md +41 -41
  8. package/.claude/agents/consensus/byzantine-coordinator.md +42 -42
  9. package/.claude/agents/consensus/crdt-synchronizer.md +976 -976
  10. package/.claude/agents/consensus/gossip-coordinator.md +42 -42
  11. package/.claude/agents/consensus/performance-benchmarker.md +830 -830
  12. package/.claude/agents/consensus/quorum-manager.md +802 -802
  13. package/.claude/agents/consensus/raft-manager.md +42 -42
  14. package/.claude/agents/consensus/security-manager.md +601 -601
  15. package/.claude/agents/core/coder.md +254 -254
  16. package/.claude/agents/core/planner.md +151 -151
  17. package/.claude/agents/core/researcher.md +173 -173
  18. package/.claude/agents/core/reviewer.md +308 -308
  19. package/.claude/agents/core/tester.md +299 -299
  20. package/.claude/agents/custom/test-long-runner.md +43 -43
  21. package/.claude/agents/data/ml/data-ml-model.md +75 -75
  22. package/.claude/agents/database-specialist.md +9 -9
  23. package/.claude/agents/development/backend/dev-backend-api.md +28 -28
  24. package/.claude/agents/development/dev-backend-api.md +177 -177
  25. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +51 -51
  26. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +62 -62
  27. package/.claude/agents/dual-mode/codex-coordinator.md +206 -206
  28. package/.claude/agents/dual-mode/codex-worker.md +190 -190
  29. package/.claude/agents/dual-mode/dual-orchestrator.md +253 -253
  30. package/.claude/agents/flow-nexus/app-store.md +87 -87
  31. package/.claude/agents/flow-nexus/authentication.md +68 -68
  32. package/.claude/agents/flow-nexus/challenges.md +80 -80
  33. package/.claude/agents/flow-nexus/neural-network.md +87 -87
  34. package/.claude/agents/flow-nexus/payments.md +82 -82
  35. package/.claude/agents/flow-nexus/sandbox.md +75 -75
  36. package/.claude/agents/flow-nexus/swarm.md +75 -75
  37. package/.claude/agents/flow-nexus/user-tools.md +95 -95
  38. package/.claude/agents/flow-nexus/workflow.md +83 -83
  39. package/.claude/agents/github/code-review-swarm.md +520 -520
  40. package/.claude/agents/github/github-modes.md +153 -153
  41. package/.claude/agents/github/issue-tracker.md +298 -298
  42. package/.claude/agents/github/multi-repo-swarm.md +524 -524
  43. package/.claude/agents/github/pr-manager.md +162 -162
  44. package/.claude/agents/github/project-board-sync.md +477 -477
  45. package/.claude/agents/github/release-manager.md +337 -337
  46. package/.claude/agents/github/release-swarm.md +550 -550
  47. package/.claude/agents/github/repo-architect.md +364 -364
  48. package/.claude/agents/github/swarm-issue.md +550 -550
  49. package/.claude/agents/github/swarm-pr.md +401 -401
  50. package/.claude/agents/github/sync-coordinator.md +424 -424
  51. package/.claude/agents/github/workflow-automation.md +604 -604
  52. package/.claude/agents/goal/agent.md +816 -816
  53. package/.claude/agents/goal/code-goal-planner.md +444 -444
  54. package/.claude/agents/goal/goal-planner.md +167 -167
  55. package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +128 -128
  56. package/.claude/agents/hive-mind/queen-coordinator.md +201 -201
  57. package/.claude/agents/hive-mind/scout-explorer.md +240 -240
  58. package/.claude/agents/hive-mind/swarm-memory-manager.md +191 -191
  59. package/.claude/agents/hive-mind/worker-specialist.md +215 -215
  60. package/.claude/agents/neural/safla-neural.md +73 -73
  61. package/.claude/agents/optimization/benchmark-suite.md +662 -662
  62. package/.claude/agents/optimization/load-balancer.md +428 -428
  63. package/.claude/agents/optimization/performance-monitor.md +669 -669
  64. package/.claude/agents/optimization/resource-allocator.md +671 -671
  65. package/.claude/agents/optimization/topology-optimizer.md +805 -805
  66. package/.claude/agents/payments/agentic-payments.md +126 -126
  67. package/.claude/agents/project-coordinator.md +8 -8
  68. package/.claude/agents/python-specialist.md +9 -9
  69. package/.claude/agents/reasoning/agent.md +816 -816
  70. package/.claude/agents/reasoning/goal-planner.md +72 -72
  71. package/.claude/agents/security-auditor.md +9 -9
  72. package/.claude/agents/sona/sona-learning-optimizer.md +65 -65
  73. package/.claude/agents/sparc/architecture.md +452 -452
  74. package/.claude/agents/sparc/pseudocode.md +298 -298
  75. package/.claude/agents/sparc/refinement.md +503 -503
  76. package/.claude/agents/sparc/specification.md +257 -257
  77. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +87 -87
  78. package/.claude/agents/sublinear/consensus-coordinator.md +337 -337
  79. package/.claude/agents/sublinear/matrix-optimizer.md +184 -184
  80. package/.claude/agents/sublinear/pagerank-analyzer.md +298 -298
  81. package/.claude/agents/sublinear/performance-optimizer.md +367 -367
  82. package/.claude/agents/sublinear/trading-predictor.md +245 -245
  83. package/.claude/agents/swarm/adaptive-coordinator.md +363 -363
  84. package/.claude/agents/swarm/hierarchical-coordinator.md +299 -299
  85. package/.claude/agents/swarm/mesh-coordinator.md +362 -362
  86. package/.claude/agents/templates/automation-smart-agent.md +184 -184
  87. package/.claude/agents/templates/coordinator-swarm-init.md +82 -82
  88. package/.claude/agents/templates/github-pr-manager.md +154 -154
  89. package/.claude/agents/templates/implementer-sparc-coder.md +242 -242
  90. package/.claude/agents/templates/memory-coordinator.md +162 -162
  91. package/.claude/agents/templates/migration-plan.md +723 -723
  92. package/.claude/agents/templates/orchestrator-task.md +119 -119
  93. package/.claude/agents/templates/performance-analyzer.md +178 -178
  94. package/.claude/agents/templates/sparc-coordinator.md +162 -162
  95. package/.claude/agents/testing/production-validator.md +372 -372
  96. package/.claude/agents/testing/tdd-london-swarm.md +221 -221
  97. package/.claude/agents/testing/unit/tdd-london-swarm.md +221 -221
  98. package/.claude/agents/testing/validation/production-validator.md +372 -372
  99. package/.claude/agents/typescript-specialist.md +9 -9
  100. package/.claude/agents/v3/database-specialist.md +9 -9
  101. package/.claude/agents/v3/project-coordinator.md +8 -8
  102. package/.claude/agents/v3/python-specialist.md +9 -9
  103. package/.claude/agents/v3/test-architect.md +9 -9
  104. package/.claude/agents/v3/typescript-specialist.md +9 -9
  105. package/.claude/agents/v3/v3-integration-architect.md +311 -311
  106. package/.claude/agents/v3/v3-memory-specialist.md +280 -280
  107. package/.claude/agents/v3/v3-performance-engineer.md +362 -362
  108. package/.claude/agents/v3/v3-queen-coordinator.md +62 -62
  109. package/.claude/agents/v3/v3-security-architect.md +139 -139
  110. package/.claude/checkpoints/1767754460.json +8 -8
  111. package/.claude/commands/agents/README.md +10 -10
  112. package/.claude/commands/agents/agent-capabilities.md +21 -21
  113. package/.claude/commands/agents/agent-coordination.md +28 -28
  114. package/.claude/commands/agents/agent-spawning.md +28 -28
  115. package/.claude/commands/agents/agent-types.md +26 -26
  116. package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +53 -53
  117. package/.claude/commands/analysis/README.md +9 -9
  118. package/.claude/commands/analysis/bottleneck-detect.md +162 -162
  119. package/.claude/commands/analysis/performance-bottlenecks.md +58 -58
  120. package/.claude/commands/analysis/performance-report.md +25 -25
  121. package/.claude/commands/analysis/token-efficiency.md +44 -44
  122. package/.claude/commands/analysis/token-usage.md +25 -25
  123. package/.claude/commands/automation/README.md +9 -9
  124. package/.claude/commands/automation/auto-agent.md +122 -122
  125. package/.claude/commands/automation/self-healing.md +105 -105
  126. package/.claude/commands/automation/session-memory.md +89 -89
  127. package/.claude/commands/automation/smart-agents.md +72 -72
  128. package/.claude/commands/automation/smart-spawn.md +25 -25
  129. package/.claude/commands/automation/workflow-select.md +25 -25
  130. package/.claude/commands/claude-flow-help.md +103 -103
  131. package/.claude/commands/claude-flow-memory.md +107 -107
  132. package/.claude/commands/claude-flow-swarm.md +205 -205
  133. package/.claude/commands/coordination/README.md +9 -9
  134. package/.claude/commands/coordination/agent-spawn.md +25 -25
  135. package/.claude/commands/coordination/init.md +44 -44
  136. package/.claude/commands/coordination/orchestrate.md +43 -43
  137. package/.claude/commands/coordination/spawn.md +45 -45
  138. package/.claude/commands/coordination/swarm-init.md +85 -85
  139. package/.claude/commands/coordination/task-orchestrate.md +25 -25
  140. package/.claude/commands/flow-nexus/app-store.md +123 -123
  141. package/.claude/commands/flow-nexus/challenges.md +119 -119
  142. package/.claude/commands/flow-nexus/login-registration.md +64 -64
  143. package/.claude/commands/flow-nexus/neural-network.md +133 -133
  144. package/.claude/commands/flow-nexus/payments.md +115 -115
  145. package/.claude/commands/flow-nexus/sandbox.md +82 -82
  146. package/.claude/commands/flow-nexus/swarm.md +86 -86
  147. package/.claude/commands/flow-nexus/user-tools.md +151 -151
  148. package/.claude/commands/flow-nexus/workflow.md +114 -114
  149. package/.claude/commands/github/README.md +11 -11
  150. package/.claude/commands/github/code-review-swarm.md +513 -513
  151. package/.claude/commands/github/code-review.md +25 -25
  152. package/.claude/commands/github/github-modes.md +146 -146
  153. package/.claude/commands/github/github-swarm.md +121 -121
  154. package/.claude/commands/github/issue-tracker.md +291 -291
  155. package/.claude/commands/github/issue-triage.md +25 -25
  156. package/.claude/commands/github/multi-repo-swarm.md +518 -518
  157. package/.claude/commands/github/pr-enhance.md +26 -26
  158. package/.claude/commands/github/pr-manager.md +169 -169
  159. package/.claude/commands/github/project-board-sync.md +470 -470
  160. package/.claude/commands/github/release-manager.md +337 -337
  161. package/.claude/commands/github/release-swarm.md +543 -543
  162. package/.claude/commands/github/repo-analyze.md +25 -25
  163. package/.claude/commands/github/repo-architect.md +366 -366
  164. package/.claude/commands/github/swarm-issue.md +481 -481
  165. package/.claude/commands/github/swarm-pr.md +284 -284
  166. package/.claude/commands/github/sync-coordinator.md +300 -300
  167. package/.claude/commands/github/workflow-automation.md +441 -441
  168. package/.claude/commands/hive-mind/README.md +17 -17
  169. package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -8
  170. package/.claude/commands/hive-mind/hive-mind-init.md +18 -18
  171. package/.claude/commands/hive-mind/hive-mind-memory.md +8 -8
  172. package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -8
  173. package/.claude/commands/hive-mind/hive-mind-resume.md +8 -8
  174. package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -8
  175. package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -21
  176. package/.claude/commands/hive-mind/hive-mind-status.md +8 -8
  177. package/.claude/commands/hive-mind/hive-mind-stop.md +8 -8
  178. package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -8
  179. package/.claude/commands/hive-mind/hive-mind.md +27 -27
  180. package/.claude/commands/hooks/README.md +11 -11
  181. package/.claude/commands/hooks/overview.md +57 -57
  182. package/.claude/commands/hooks/post-edit.md +117 -117
  183. package/.claude/commands/hooks/post-task.md +112 -112
  184. package/.claude/commands/hooks/pre-edit.md +113 -113
  185. package/.claude/commands/hooks/pre-task.md +111 -111
  186. package/.claude/commands/hooks/session-end.md +118 -118
  187. package/.claude/commands/hooks/setup.md +102 -102
  188. package/.claude/commands/memory/README.md +9 -9
  189. package/.claude/commands/memory/memory-persist.md +25 -25
  190. package/.claude/commands/memory/memory-search.md +25 -25
  191. package/.claude/commands/memory/memory-usage.md +25 -25
  192. package/.claude/commands/memory/neural.md +47 -47
  193. package/.claude/commands/monitoring/README.md +9 -9
  194. package/.claude/commands/monitoring/agent-metrics.md +25 -25
  195. package/.claude/commands/monitoring/agents.md +44 -44
  196. package/.claude/commands/monitoring/real-time-view.md +25 -25
  197. package/.claude/commands/monitoring/status.md +46 -46
  198. package/.claude/commands/monitoring/swarm-monitor.md +25 -25
  199. package/.claude/commands/optimization/README.md +9 -9
  200. package/.claude/commands/optimization/auto-topology.md +61 -61
  201. package/.claude/commands/optimization/cache-manage.md +25 -25
  202. package/.claude/commands/optimization/parallel-execute.md +25 -25
  203. package/.claude/commands/optimization/parallel-execution.md +49 -49
  204. package/.claude/commands/optimization/topology-optimize.md +25 -25
  205. package/.claude/commands/pair/README.md +260 -260
  206. package/.claude/commands/pair/commands.md +545 -545
  207. package/.claude/commands/pair/config.md +509 -509
  208. package/.claude/commands/pair/examples.md +511 -511
  209. package/.claude/commands/pair/modes.md +347 -347
  210. package/.claude/commands/pair/session.md +406 -406
  211. package/.claude/commands/pair/start.md +208 -208
  212. package/.claude/commands/sparc/analyzer.md +51 -51
  213. package/.claude/commands/sparc/architect.md +53 -53
  214. package/.claude/commands/sparc/ask.md +97 -97
  215. package/.claude/commands/sparc/batch-executor.md +54 -54
  216. package/.claude/commands/sparc/code.md +89 -89
  217. package/.claude/commands/sparc/coder.md +54 -54
  218. package/.claude/commands/sparc/debug.md +83 -83
  219. package/.claude/commands/sparc/debugger.md +54 -54
  220. package/.claude/commands/sparc/designer.md +53 -53
  221. package/.claude/commands/sparc/devops.md +109 -109
  222. package/.claude/commands/sparc/docs-writer.md +80 -80
  223. package/.claude/commands/sparc/documenter.md +54 -54
  224. package/.claude/commands/sparc/innovator.md +54 -54
  225. package/.claude/commands/sparc/integration.md +83 -83
  226. package/.claude/commands/sparc/mcp.md +117 -117
  227. package/.claude/commands/sparc/memory-manager.md +54 -54
  228. package/.claude/commands/sparc/optimizer.md +54 -54
  229. package/.claude/commands/sparc/orchestrator.md +131 -131
  230. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
  231. package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
  232. package/.claude/commands/sparc/researcher.md +54 -54
  233. package/.claude/commands/sparc/reviewer.md +54 -54
  234. package/.claude/commands/sparc/security-review.md +80 -80
  235. package/.claude/commands/sparc/sparc-modes.md +174 -174
  236. package/.claude/commands/sparc/sparc.md +111 -111
  237. package/.claude/commands/sparc/spec-pseudocode.md +80 -80
  238. package/.claude/commands/sparc/supabase-admin.md +348 -348
  239. package/.claude/commands/sparc/swarm-coordinator.md +54 -54
  240. package/.claude/commands/sparc/tdd.md +54 -54
  241. package/.claude/commands/sparc/tester.md +54 -54
  242. package/.claude/commands/sparc/tutorial.md +79 -79
  243. package/.claude/commands/sparc/workflow-manager.md +54 -54
  244. package/.claude/commands/sparc.md +166 -166
  245. package/.claude/commands/stream-chain/pipeline.md +120 -120
  246. package/.claude/commands/stream-chain/run.md +69 -69
  247. package/.claude/commands/swarm/README.md +15 -15
  248. package/.claude/commands/swarm/analysis.md +95 -95
  249. package/.claude/commands/swarm/development.md +96 -96
  250. package/.claude/commands/swarm/examples.md +168 -168
  251. package/.claude/commands/swarm/maintenance.md +102 -102
  252. package/.claude/commands/swarm/optimization.md +117 -117
  253. package/.claude/commands/swarm/research.md +136 -136
  254. package/.claude/commands/swarm/swarm-analysis.md +8 -8
  255. package/.claude/commands/swarm/swarm-background.md +8 -8
  256. package/.claude/commands/swarm/swarm-init.md +19 -19
  257. package/.claude/commands/swarm/swarm-modes.md +8 -8
  258. package/.claude/commands/swarm/swarm-monitor.md +8 -8
  259. package/.claude/commands/swarm/swarm-spawn.md +19 -19
  260. package/.claude/commands/swarm/swarm-status.md +8 -8
  261. package/.claude/commands/swarm/swarm-strategies.md +8 -8
  262. package/.claude/commands/swarm/swarm.md +27 -27
  263. package/.claude/commands/swarm/testing.md +131 -131
  264. package/.claude/commands/training/README.md +9 -9
  265. package/.claude/commands/training/model-update.md +25 -25
  266. package/.claude/commands/training/neural-patterns.md +73 -73
  267. package/.claude/commands/training/neural-train.md +25 -25
  268. package/.claude/commands/training/pattern-learn.md +25 -25
  269. package/.claude/commands/training/specialization.md +62 -62
  270. package/.claude/commands/truth/start.md +142 -142
  271. package/.claude/commands/verify/check.md +49 -49
  272. package/.claude/commands/verify/start.md +127 -127
  273. package/.claude/commands/workflows/README.md +9 -9
  274. package/.claude/commands/workflows/development.md +77 -77
  275. package/.claude/commands/workflows/research.md +62 -62
  276. package/.claude/commands/workflows/workflow-create.md +25 -25
  277. package/.claude/commands/workflows/workflow-execute.md +25 -25
  278. package/.claude/commands/workflows/workflow-export.md +25 -25
  279. package/.claude/config/v3-dependency-optimization.json +265 -265
  280. package/.claude/config/v3-performance-targets.json +250 -250
  281. package/.claude/helpers/.LOCKED +2 -2
  282. package/.claude/helpers/.helpers-version +1 -0
  283. package/.claude/helpers/README.md +96 -96
  284. package/.claude/helpers/adr-compliance.sh +186 -186
  285. package/.claude/helpers/aggressive-microcompact.mjs +36 -36
  286. package/.claude/helpers/auto-commit.sh +178 -178
  287. package/.claude/helpers/auto-memory-hook.mjs +430 -430
  288. package/.claude/helpers/checkpoint-manager.sh +251 -251
  289. package/.claude/helpers/context-persistence-hook.mjs +2001 -2001
  290. package/.claude/helpers/daemon-manager.sh +252 -252
  291. package/.claude/helpers/ddd-tracker.sh +144 -144
  292. package/.claude/helpers/github-safe.js +156 -156
  293. package/.claude/helpers/github-setup.sh +45 -45
  294. package/.claude/helpers/guidance-hook.sh +13 -13
  295. package/.claude/helpers/guidance-hooks.sh +102 -102
  296. package/.claude/helpers/health-monitor.sh +108 -108
  297. package/.claude/helpers/helpers.manifest.json +13 -0
  298. package/.claude/helpers/hook-handler.cjs +464 -464
  299. package/.claude/helpers/intelligence.cjs +1058 -1058
  300. package/.claude/helpers/learning-hooks.sh +329 -329
  301. package/.claude/helpers/learning-optimizer.sh +127 -127
  302. package/.claude/helpers/learning-service.mjs +1144 -1144
  303. package/.claude/helpers/memory.cjs +84 -84
  304. package/.claude/helpers/metrics-db.mjs +503 -503
  305. package/.claude/helpers/patch-aggressive-prune.mjs +184 -184
  306. package/.claude/helpers/pattern-consolidator.sh +86 -86
  307. package/.claude/helpers/perf-worker.sh +160 -160
  308. package/.claude/helpers/quick-start.sh +19 -19
  309. package/.claude/helpers/router.cjs +62 -62
  310. package/.claude/helpers/security-scanner.sh +127 -127
  311. package/.claude/helpers/session.cjs +125 -125
  312. package/.claude/helpers/setup-mcp.sh +18 -18
  313. package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
  314. package/.claude/helpers/statusline.cjs +156 -1
  315. package/.claude/helpers/swarm-comms.sh +353 -353
  316. package/.claude/helpers/swarm-hooks.sh +761 -761
  317. package/.claude/helpers/swarm-monitor.sh +210 -210
  318. package/.claude/helpers/sync-v3-metrics.sh +245 -245
  319. package/.claude/helpers/update-v3-progress.sh +165 -165
  320. package/.claude/helpers/v3-quick-status.sh +57 -57
  321. package/.claude/helpers/v3.sh +110 -110
  322. package/.claude/helpers/validate-v3-config.sh +215 -215
  323. package/.claude/helpers/worker-manager.sh +170 -170
  324. package/.claude/mcp.json +12 -12
  325. package/.claude/proven-config.json +42 -0
  326. package/.claude/settings.json +284 -284
  327. package/.claude/settings.json.bak +526 -526
  328. package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
  329. package/.claude/skills/agentdb-learning/SKILL.md +545 -545
  330. package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
  331. package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
  332. package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
  333. package/.claude/skills/agentic-jujutsu/SKILL.md +645 -645
  334. package/.claude/skills/browser/SKILL.md +204 -204
  335. package/.claude/skills/dual-mode/README.md +71 -71
  336. package/.claude/skills/dual-mode/dual-collect.md +103 -103
  337. package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
  338. package/.claude/skills/dual-mode/dual-spawn.md +81 -81
  339. package/.claude/skills/flow-nexus-neural/SKILL.md +727 -727
  340. package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -1154
  341. package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -604
  342. package/.claude/skills/github-code-review/SKILL.md +1125 -1125
  343. package/.claude/skills/github-multi-repo/SKILL.md +862 -862
  344. package/.claude/skills/github-project-management/SKILL.md +1262 -1262
  345. package/.claude/skills/github-release-management/SKILL.md +1064 -1064
  346. package/.claude/skills/github-workflow-automation/SKILL.md +1047 -1047
  347. package/.claude/skills/hive-mind-advanced/SKILL.md +709 -709
  348. package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
  349. package/.claude/skills/pair-programming/SKILL.md +1202 -1202
  350. package/.claude/skills/performance-analysis/SKILL.md +560 -560
  351. package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
  352. package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
  353. package/.claude/skills/skill-builder/SKILL.md +910 -910
  354. package/.claude/skills/sparc-methodology/SKILL.md +1106 -1106
  355. package/.claude/skills/stream-chain/SKILL.md +560 -560
  356. package/.claude/skills/swarm-advanced/SKILL.md +970 -970
  357. package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
  358. package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
  359. package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
  360. package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
  361. package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
  362. package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
  363. package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
  364. package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
  365. package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
  366. package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
  367. package/.claude/skills/verification-quality/SKILL.md +691 -691
  368. package/.claude/skills/worker-benchmarks/SKILL.md +129 -129
  369. package/.claude/skills/worker-integration/SKILL.md +147 -147
  370. package/.claude/statusline-command.sh +176 -176
  371. package/.claude/statusline.mjs +109 -109
  372. package/.claude/statusline.sh +431 -431
  373. package/.claude/workflows/full-system-test.js +65 -65
  374. package/.claude/workflows/intelligence-system-hardening.js +120 -120
  375. package/.claude/workflows/plugin-contract-audit.js +91 -91
  376. package/.claude-plugin/README.md +720 -720
  377. package/.claude-plugin/docs/INSTALLATION.md +261 -261
  378. package/.claude-plugin/docs/PLUGIN_SUMMARY.md +361 -361
  379. package/.claude-plugin/docs/QUICKSTART.md +361 -361
  380. package/.claude-plugin/docs/STRUCTURE.md +128 -128
  381. package/.claude-plugin/hooks/hooks.json +79 -79
  382. package/.claude-plugin/marketplace.json +185 -185
  383. package/.claude-plugin/plugin.json +71 -71
  384. package/.claude-plugin/scripts/install.sh +234 -234
  385. package/.claude-plugin/scripts/ruflo-hook.cjs +166 -166
  386. package/.claude-plugin/scripts/ruflo-hook.sh +52 -52
  387. package/.claude-plugin/scripts/uninstall.sh +36 -36
  388. package/.claude-plugin/scripts/verify.sh +108 -108
  389. package/LICENSE +21 -21
  390. package/README.md +419 -419
  391. package/bin/cli.js +11 -11
  392. package/bin/npx-repair.js +7 -7
  393. package/bin/npx-safe-launch.js +9 -9
  394. package/package.json +192 -192
  395. package/v3/@claude-flow/cli/README.md +419 -419
  396. package/v3/@claude-flow/cli/bin/cli.js +314 -314
  397. package/v3/@claude-flow/cli/bin/mcp-server.js +224 -224
  398. package/v3/@claude-flow/cli/bin/preinstall.cjs +2 -2
  399. package/v3/@claude-flow/cli/catalog-manifest.json +2 -2
  400. package/v3/@claude-flow/cli/dist/src/autopilot-state.js +24 -7
  401. package/v3/@claude-flow/cli/dist/src/benchmarks/gaia-critic.js +24 -24
  402. package/v3/@claude-flow/cli/dist/src/business-pods/bbs-budget-tracker.js +53 -53
  403. package/v3/@claude-flow/cli/dist/src/commands/completions.js +409 -409
  404. package/v3/@claude-flow/cli/dist/src/commands/daemon.js +44 -44
  405. package/v3/@claude-flow/cli/dist/src/commands/embeddings.js +26 -26
  406. package/v3/@claude-flow/cli/dist/src/commands/hive-mind.js +97 -97
  407. package/v3/@claude-flow/cli/dist/src/commands/hooks.js +31 -10
  408. package/v3/@claude-flow/cli/dist/src/commands/init.js +202 -34
  409. package/v3/@claude-flow/cli/dist/src/commands/memory.js +12 -1
  410. package/v3/@claude-flow/cli/dist/src/commands/ruvector/backup.js +23 -23
  411. package/v3/@claude-flow/cli/dist/src/commands/ruvector/benchmark.js +31 -31
  412. package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.js +14 -14
  413. package/v3/@claude-flow/cli/dist/src/commands/ruvector/init.js +115 -115
  414. package/v3/@claude-flow/cli/dist/src/commands/ruvector/migrate.js +99 -99
  415. package/v3/@claude-flow/cli/dist/src/commands/ruvector/optimize.js +51 -51
  416. package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.js +624 -624
  417. package/v3/@claude-flow/cli/dist/src/commands/ruvector/status.js +38 -38
  418. package/v3/@claude-flow/cli/dist/src/config/proven-config.js +2 -2
  419. package/v3/@claude-flow/cli/dist/src/funnel/disclosure.js +13 -2
  420. package/v3/@claude-flow/cli/dist/src/funnel/messages.d.ts +12 -10
  421. package/v3/@claude-flow/cli/dist/src/funnel/messages.js +83 -11
  422. package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.js +231 -231
  423. package/v3/@claude-flow/cli/dist/src/init/executor.js +453 -453
  424. package/v3/@claude-flow/cli/dist/src/init/helper-signing.js +2 -2
  425. package/v3/@claude-flow/cli/dist/src/init/helpers-generator.js +751 -751
  426. package/v3/@claude-flow/cli/dist/src/init/statusline-generator.js +24 -24
  427. package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.js +15 -15
  428. package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-intent-tools.js +19 -19
  429. package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-tools.js +8 -0
  430. package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +21 -0
  431. package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.js +4 -3
  432. package/v3/@claude-flow/cli/dist/src/memory/graph-edge-writer.js +22 -22
  433. package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +248 -158
  434. package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +407 -407
  435. package/v3/@claude-flow/cli/dist/src/memory/rabitq-index.js +5 -5
  436. package/v3/@claude-flow/cli/dist/src/parser.js +25 -9
  437. package/v3/@claude-flow/cli/dist/src/proxy/verify.js +2 -2
  438. package/v3/@claude-flow/cli/dist/src/runtime/headless.js +28 -28
  439. package/v3/@claude-flow/cli/dist/src/services/distill-tuning.js +7 -7
  440. package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.js +84 -84
  441. package/v3/@claude-flow/cli/dist/src/services/memory-distillation.js +4 -4
  442. package/v3/@claude-flow/cli/dist/src/services/worker-daemon.js +7 -4
  443. package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.js +23 -23
  444. package/v3/@claude-flow/cli/package.json +137 -137
  445. package/v3/@claude-flow/guidance/README.md +1195 -1195
  446. package/v3/@claude-flow/guidance/package.json +198 -198
  447. package/v3/@claude-flow/shared/README.md +323 -323
  448. package/v3/@claude-flow/shared/dist/events/event-store.js +31 -31
  449. package/v3/@claude-flow/shared/dist/hooks/safety/git-commit.js +3 -3
  450. package/v3/@claude-flow/shared/package.json +43 -43
  451. package/v3/README.md +493 -493
@@ -1,977 +1,977 @@
1
- ---
2
- name: crdt-synchronizer
3
- description: Implements Conflict-free Replicated Data Types for eventually consistent state synchronization
4
- ---
5
-
6
- # CRDT Synchronizer
7
-
8
- Implements Conflict-free Replicated Data Types for eventually consistent distributed state synchronization.
9
-
10
- ## Core Responsibilities
11
-
12
- 1. **CRDT Implementation**: Deploy state-based and operation-based conflict-free data types
13
- 2. **Data Structure Management**: Handle counters, sets, registers, and composite structures
14
- 3. **Delta Synchronization**: Implement efficient incremental state updates
15
- 4. **Conflict Resolution**: Ensure deterministic conflict-free merge operations
16
- 5. **Causal Consistency**: Maintain proper ordering of causally related operations
17
-
18
- ## Technical Implementation
19
-
20
- ### Base CRDT Framework
21
- ```javascript
22
- class CRDTSynchronizer {
23
- constructor(nodeId, replicationGroup) {
24
- this.nodeId = nodeId;
25
- this.replicationGroup = replicationGroup;
26
- this.crdtInstances = new Map();
27
- this.vectorClock = new VectorClock(nodeId);
28
- this.deltaBuffer = new Map();
29
- this.syncScheduler = new SyncScheduler();
30
- this.causalTracker = new CausalTracker();
31
- }
32
-
33
- // Register CRDT instance
34
- registerCRDT(name, crdtType, initialState = null) {
35
- const crdt = this.createCRDTInstance(crdtType, initialState);
36
- this.crdtInstances.set(name, crdt);
37
-
38
- // Subscribe to CRDT changes for delta tracking
39
- crdt.onUpdate((delta) => {
40
- this.trackDelta(name, delta);
41
- });
42
-
43
- return crdt;
44
- }
45
-
46
- // Create specific CRDT instance
47
- createCRDTInstance(type, initialState) {
48
- switch (type) {
49
- case 'G_COUNTER':
50
- return new GCounter(this.nodeId, this.replicationGroup, initialState);
51
- case 'PN_COUNTER':
52
- return new PNCounter(this.nodeId, this.replicationGroup, initialState);
53
- case 'OR_SET':
54
- return new ORSet(this.nodeId, initialState);
55
- case 'LWW_REGISTER':
56
- return new LWWRegister(this.nodeId, initialState);
57
- case 'OR_MAP':
58
- return new ORMap(this.nodeId, this.replicationGroup, initialState);
59
- case 'RGA':
60
- return new RGA(this.nodeId, initialState);
61
- default:
62
- throw new Error(`Unknown CRDT type: ${type}`);
63
- }
64
- }
65
-
66
- // Synchronize with peer nodes
67
- async synchronize(peerNodes = null) {
68
- const targets = peerNodes || Array.from(this.replicationGroup);
69
-
70
- for (const peer of targets) {
71
- if (peer !== this.nodeId) {
72
- await this.synchronizeWithPeer(peer);
73
- }
74
- }
75
- }
76
-
77
- async synchronizeWithPeer(peerNode) {
78
- // Get current state and deltas
79
- const localState = this.getCurrentState();
80
- const deltas = this.getDeltasSince(peerNode);
81
-
82
- // Send sync request
83
- const syncRequest = {
84
- type: 'CRDT_SYNC_REQUEST',
85
- sender: this.nodeId,
86
- vectorClock: this.vectorClock.clone(),
87
- state: localState,
88
- deltas: deltas
89
- };
90
-
91
- try {
92
- const response = await this.sendSyncRequest(peerNode, syncRequest);
93
- await this.processSyncResponse(response);
94
- } catch (error) {
95
- console.error(`Sync failed with ${peerNode}:`, error);
96
- }
97
- }
98
- }
99
- ```
100
-
101
- ### G-Counter Implementation
102
- ```javascript
103
- class GCounter {
104
- constructor(nodeId, replicationGroup, initialState = null) {
105
- this.nodeId = nodeId;
106
- this.replicationGroup = replicationGroup;
107
- this.payload = new Map();
108
-
109
- // Initialize counters for all nodes
110
- for (const node of replicationGroup) {
111
- this.payload.set(node, 0);
112
- }
113
-
114
- if (initialState) {
115
- this.merge(initialState);
116
- }
117
-
118
- this.updateCallbacks = [];
119
- }
120
-
121
- // Increment operation (can only be performed by owner node)
122
- increment(amount = 1) {
123
- if (amount < 0) {
124
- throw new Error('G-Counter only supports positive increments');
125
- }
126
-
127
- const oldValue = this.payload.get(this.nodeId) || 0;
128
- const newValue = oldValue + amount;
129
- this.payload.set(this.nodeId, newValue);
130
-
131
- // Notify observers
132
- this.notifyUpdate({
133
- type: 'INCREMENT',
134
- node: this.nodeId,
135
- oldValue: oldValue,
136
- newValue: newValue,
137
- delta: amount
138
- });
139
-
140
- return newValue;
141
- }
142
-
143
- // Get current value (sum of all node counters)
144
- value() {
145
- return Array.from(this.payload.values()).reduce((sum, val) => sum + val, 0);
146
- }
147
-
148
- // Merge with another G-Counter state
149
- merge(otherState) {
150
- let changed = false;
151
-
152
- for (const [node, otherValue] of otherState.payload) {
153
- const currentValue = this.payload.get(node) || 0;
154
- if (otherValue > currentValue) {
155
- this.payload.set(node, otherValue);
156
- changed = true;
157
- }
158
- }
159
-
160
- if (changed) {
161
- this.notifyUpdate({
162
- type: 'MERGE',
163
- mergedFrom: otherState
164
- });
165
- }
166
- }
167
-
168
- // Compare with another state
169
- compare(otherState) {
170
- for (const [node, otherValue] of otherState.payload) {
171
- const currentValue = this.payload.get(node) || 0;
172
- if (currentValue < otherValue) {
173
- return 'LESS_THAN';
174
- } else if (currentValue > otherValue) {
175
- return 'GREATER_THAN';
176
- }
177
- }
178
- return 'EQUAL';
179
- }
180
-
181
- // Clone current state
182
- clone() {
183
- const newCounter = new GCounter(this.nodeId, this.replicationGroup);
184
- newCounter.payload = new Map(this.payload);
185
- return newCounter;
186
- }
187
-
188
- onUpdate(callback) {
189
- this.updateCallbacks.push(callback);
190
- }
191
-
192
- notifyUpdate(delta) {
193
- this.updateCallbacks.forEach(callback => callback(delta));
194
- }
195
- }
196
- ```
197
-
198
- ### OR-Set Implementation
199
- ```javascript
200
- class ORSet {
201
- constructor(nodeId, initialState = null) {
202
- this.nodeId = nodeId;
203
- this.elements = new Map(); // element -> Set of unique tags
204
- this.tombstones = new Set(); // removed element tags
205
- this.tagCounter = 0;
206
-
207
- if (initialState) {
208
- this.merge(initialState);
209
- }
210
-
211
- this.updateCallbacks = [];
212
- }
213
-
214
- // Add element to set
215
- add(element) {
216
- const tag = this.generateUniqueTag();
217
-
218
- if (!this.elements.has(element)) {
219
- this.elements.set(element, new Set());
220
- }
221
-
222
- this.elements.get(element).add(tag);
223
-
224
- this.notifyUpdate({
225
- type: 'ADD',
226
- element: element,
227
- tag: tag
228
- });
229
-
230
- return tag;
231
- }
232
-
233
- // Remove element from set
234
- remove(element) {
235
- if (!this.elements.has(element)) {
236
- return false; // Element not present
237
- }
238
-
239
- const tags = this.elements.get(element);
240
- const removedTags = [];
241
-
242
- // Add all tags to tombstones
243
- for (const tag of tags) {
244
- this.tombstones.add(tag);
245
- removedTags.push(tag);
246
- }
247
-
248
- this.notifyUpdate({
249
- type: 'REMOVE',
250
- element: element,
251
- removedTags: removedTags
252
- });
253
-
254
- return true;
255
- }
256
-
257
- // Check if element is in set
258
- has(element) {
259
- if (!this.elements.has(element)) {
260
- return false;
261
- }
262
-
263
- const tags = this.elements.get(element);
264
-
265
- // Element is present if it has at least one non-tombstoned tag
266
- for (const tag of tags) {
267
- if (!this.tombstones.has(tag)) {
268
- return true;
269
- }
270
- }
271
-
272
- return false;
273
- }
274
-
275
- // Get all elements in set
276
- values() {
277
- const result = new Set();
278
-
279
- for (const [element, tags] of this.elements) {
280
- // Include element if it has at least one non-tombstoned tag
281
- for (const tag of tags) {
282
- if (!this.tombstones.has(tag)) {
283
- result.add(element);
284
- break;
285
- }
286
- }
287
- }
288
-
289
- return result;
290
- }
291
-
292
- // Merge with another OR-Set
293
- merge(otherState) {
294
- let changed = false;
295
-
296
- // Merge elements and their tags
297
- for (const [element, otherTags] of otherState.elements) {
298
- if (!this.elements.has(element)) {
299
- this.elements.set(element, new Set());
300
- }
301
-
302
- const currentTags = this.elements.get(element);
303
-
304
- for (const tag of otherTags) {
305
- if (!currentTags.has(tag)) {
306
- currentTags.add(tag);
307
- changed = true;
308
- }
309
- }
310
- }
311
-
312
- // Merge tombstones
313
- for (const tombstone of otherState.tombstones) {
314
- if (!this.tombstones.has(tombstone)) {
315
- this.tombstones.add(tombstone);
316
- changed = true;
317
- }
318
- }
319
-
320
- if (changed) {
321
- this.notifyUpdate({
322
- type: 'MERGE',
323
- mergedFrom: otherState
324
- });
325
- }
326
- }
327
-
328
- generateUniqueTag() {
329
- return `${this.nodeId}-${Date.now()}-${++this.tagCounter}`;
330
- }
331
-
332
- onUpdate(callback) {
333
- this.updateCallbacks.push(callback);
334
- }
335
-
336
- notifyUpdate(delta) {
337
- this.updateCallbacks.forEach(callback => callback(delta));
338
- }
339
- }
340
- ```
341
-
342
- ### LWW-Register Implementation
343
- ```javascript
344
- class LWWRegister {
345
- constructor(nodeId, initialValue = null) {
346
- this.nodeId = nodeId;
347
- this.value = initialValue;
348
- this.timestamp = initialValue ? Date.now() : 0;
349
- this.vectorClock = new VectorClock(nodeId);
350
- this.updateCallbacks = [];
351
- }
352
-
353
- // Set new value with timestamp
354
- set(newValue, timestamp = null) {
355
- const ts = timestamp || Date.now();
356
-
357
- if (ts > this.timestamp ||
358
- (ts === this.timestamp && this.nodeId > this.getLastWriter())) {
359
- const oldValue = this.value;
360
- this.value = newValue;
361
- this.timestamp = ts;
362
- this.vectorClock.increment();
363
-
364
- this.notifyUpdate({
365
- type: 'SET',
366
- oldValue: oldValue,
367
- newValue: newValue,
368
- timestamp: ts
369
- });
370
- }
371
- }
372
-
373
- // Get current value
374
- get() {
375
- return this.value;
376
- }
377
-
378
- // Merge with another LWW-Register
379
- merge(otherRegister) {
380
- if (otherRegister.timestamp > this.timestamp ||
381
- (otherRegister.timestamp === this.timestamp &&
382
- otherRegister.nodeId > this.nodeId)) {
383
-
384
- const oldValue = this.value;
385
- this.value = otherRegister.value;
386
- this.timestamp = otherRegister.timestamp;
387
-
388
- this.notifyUpdate({
389
- type: 'MERGE',
390
- oldValue: oldValue,
391
- newValue: this.value,
392
- mergedFrom: otherRegister
393
- });
394
- }
395
-
396
- // Merge vector clocks
397
- this.vectorClock.merge(otherRegister.vectorClock);
398
- }
399
-
400
- getLastWriter() {
401
- // In real implementation, this would track the actual writer
402
- return this.nodeId;
403
- }
404
-
405
- onUpdate(callback) {
406
- this.updateCallbacks.push(callback);
407
- }
408
-
409
- notifyUpdate(delta) {
410
- this.updateCallbacks.forEach(callback => callback(delta));
411
- }
412
- }
413
- ```
414
-
415
- ### RGA (Replicated Growable Array) Implementation
416
- ```javascript
417
- class RGA {
418
- constructor(nodeId, initialSequence = []) {
419
- this.nodeId = nodeId;
420
- this.sequence = [];
421
- this.tombstones = new Set();
422
- this.vertexCounter = 0;
423
-
424
- // Initialize with sequence
425
- for (const element of initialSequence) {
426
- this.insert(this.sequence.length, element);
427
- }
428
-
429
- this.updateCallbacks = [];
430
- }
431
-
432
- // Insert element at position
433
- insert(position, element) {
434
- const vertex = this.createVertex(element, position);
435
-
436
- // Find insertion point based on causal ordering
437
- const insertionIndex = this.findInsertionIndex(vertex, position);
438
-
439
- this.sequence.splice(insertionIndex, 0, vertex);
440
-
441
- this.notifyUpdate({
442
- type: 'INSERT',
443
- position: insertionIndex,
444
- element: element,
445
- vertex: vertex
446
- });
447
-
448
- return vertex.id;
449
- }
450
-
451
- // Remove element at position
452
- remove(position) {
453
- if (position < 0 || position >= this.visibleLength()) {
454
- throw new Error('Position out of bounds');
455
- }
456
-
457
- const visibleVertex = this.getVisibleVertex(position);
458
- if (visibleVertex) {
459
- this.tombstones.add(visibleVertex.id);
460
-
461
- this.notifyUpdate({
462
- type: 'REMOVE',
463
- position: position,
464
- vertex: visibleVertex
465
- });
466
-
467
- return true;
468
- }
469
-
470
- return false;
471
- }
472
-
473
- // Get visible elements (non-tombstoned)
474
- toArray() {
475
- return this.sequence
476
- .filter(vertex => !this.tombstones.has(vertex.id))
477
- .map(vertex => vertex.element);
478
- }
479
-
480
- // Get visible length
481
- visibleLength() {
482
- return this.sequence.filter(vertex => !this.tombstones.has(vertex.id)).length;
483
- }
484
-
485
- // Merge with another RGA
486
- merge(otherRGA) {
487
- let changed = false;
488
-
489
- // Merge sequences
490
- const mergedSequence = this.mergeSequences(this.sequence, otherRGA.sequence);
491
- if (mergedSequence.length !== this.sequence.length) {
492
- this.sequence = mergedSequence;
493
- changed = true;
494
- }
495
-
496
- // Merge tombstones
497
- for (const tombstone of otherRGA.tombstones) {
498
- if (!this.tombstones.has(tombstone)) {
499
- this.tombstones.add(tombstone);
500
- changed = true;
501
- }
502
- }
503
-
504
- if (changed) {
505
- this.notifyUpdate({
506
- type: 'MERGE',
507
- mergedFrom: otherRGA
508
- });
509
- }
510
- }
511
-
512
- createVertex(element, position) {
513
- const leftVertex = position > 0 ? this.getVisibleVertex(position - 1) : null;
514
-
515
- return {
516
- id: `${this.nodeId}-${++this.vertexCounter}`,
517
- element: element,
518
- leftOrigin: leftVertex ? leftVertex.id : null,
519
- timestamp: Date.now(),
520
- nodeId: this.nodeId
521
- };
522
- }
523
-
524
- findInsertionIndex(vertex, targetPosition) {
525
- // Simplified insertion logic - in practice would use more sophisticated
526
- // causal ordering based on left origins and vector clocks
527
- let visibleCount = 0;
528
-
529
- for (let i = 0; i < this.sequence.length; i++) {
530
- if (!this.tombstones.has(this.sequence[i].id)) {
531
- if (visibleCount === targetPosition) {
532
- return i;
533
- }
534
- visibleCount++;
535
- }
536
- }
537
-
538
- return this.sequence.length;
539
- }
540
-
541
- getVisibleVertex(position) {
542
- let visibleCount = 0;
543
-
544
- for (const vertex of this.sequence) {
545
- if (!this.tombstones.has(vertex.id)) {
546
- if (visibleCount === position) {
547
- return vertex;
548
- }
549
- visibleCount++;
550
- }
551
- }
552
-
553
- return null;
554
- }
555
-
556
- mergeSequences(seq1, seq2) {
557
- // Simplified merge - real implementation would use topological sort
558
- // based on causal dependencies
559
- const merged = [...seq1];
560
-
561
- for (const vertex of seq2) {
562
- if (!merged.find(v => v.id === vertex.id)) {
563
- merged.push(vertex);
564
- }
565
- }
566
-
567
- // Sort by timestamp for basic ordering
568
- return merged.sort((a, b) => a.timestamp - b.timestamp);
569
- }
570
-
571
- onUpdate(callback) {
572
- this.updateCallbacks.push(callback);
573
- }
574
-
575
- notifyUpdate(delta) {
576
- this.updateCallbacks.forEach(callback => callback(delta));
577
- }
578
- }
579
- ```
580
-
581
- ### Delta-State CRDT Framework
582
- ```javascript
583
- class DeltaStateCRDT {
584
- constructor(baseCRDT) {
585
- this.baseCRDT = baseCRDT;
586
- this.deltaBuffer = [];
587
- this.lastSyncVector = new Map();
588
- this.maxDeltaBuffer = 1000;
589
- }
590
-
591
- // Apply operation and track delta
592
- applyOperation(operation) {
593
- const oldState = this.baseCRDT.clone();
594
- const result = this.baseCRDT.applyOperation(operation);
595
- const newState = this.baseCRDT.clone();
596
-
597
- // Compute delta
598
- const delta = this.computeDelta(oldState, newState);
599
- this.addDelta(delta);
600
-
601
- return result;
602
- }
603
-
604
- // Add delta to buffer
605
- addDelta(delta) {
606
- this.deltaBuffer.push({
607
- delta: delta,
608
- timestamp: Date.now(),
609
- vectorClock: this.baseCRDT.vectorClock.clone()
610
- });
611
-
612
- // Maintain buffer size
613
- if (this.deltaBuffer.length > this.maxDeltaBuffer) {
614
- this.deltaBuffer.shift();
615
- }
616
- }
617
-
618
- // Get deltas since last sync with peer
619
- getDeltasSince(peerNode) {
620
- const lastSync = this.lastSyncVector.get(peerNode) || new VectorClock();
621
-
622
- return this.deltaBuffer.filter(deltaEntry =>
623
- deltaEntry.vectorClock.isAfter(lastSync)
624
- );
625
- }
626
-
627
- // Apply received deltas
628
- applyDeltas(deltas) {
629
- const sortedDeltas = this.sortDeltasByCausalOrder(deltas);
630
-
631
- for (const delta of sortedDeltas) {
632
- this.baseCRDT.merge(delta.delta);
633
- }
634
- }
635
-
636
- // Compute delta between two states
637
- computeDelta(oldState, newState) {
638
- // Implementation depends on specific CRDT type
639
- // This is a simplified version
640
- return {
641
- type: 'STATE_DELTA',
642
- changes: this.compareStates(oldState, newState)
643
- };
644
- }
645
-
646
- sortDeltasByCausalOrder(deltas) {
647
- // Sort deltas to respect causal ordering
648
- return deltas.sort((a, b) => {
649
- if (a.vectorClock.isBefore(b.vectorClock)) return -1;
650
- if (b.vectorClock.isBefore(a.vectorClock)) return 1;
651
- return 0;
652
- });
653
- }
654
-
655
- // Garbage collection for old deltas
656
- garbageCollectDeltas() {
657
- const cutoffTime = Date.now() - (24 * 60 * 60 * 1000); // 24 hours
658
-
659
- this.deltaBuffer = this.deltaBuffer.filter(
660
- deltaEntry => deltaEntry.timestamp > cutoffTime
661
- );
662
- }
663
- }
664
- ```
665
-
666
- ## MCP Integration Hooks
667
-
668
- ### Memory Coordination for CRDT State
669
- ```javascript
670
- // Store CRDT state persistently
671
- await this.mcpTools.memory_usage({
672
- action: 'store',
673
- key: `crdt_state_${this.crdtName}`,
674
- value: JSON.stringify({
675
- type: this.crdtType,
676
- state: this.serializeState(),
677
- vectorClock: Array.from(this.vectorClock.entries()),
678
- lastSync: Array.from(this.lastSyncVector.entries())
679
- }),
680
- namespace: 'crdt_synchronization',
681
- ttl: 0 // Persistent
682
- });
683
-
684
- // Coordinate delta synchronization
685
- await this.mcpTools.memory_usage({
686
- action: 'store',
687
- key: `deltas_${this.nodeId}_${Date.now()}`,
688
- value: JSON.stringify(this.getDeltasSince(null)),
689
- namespace: 'crdt_deltas',
690
- ttl: 86400000 // 24 hours
691
- });
692
- ```
693
-
694
- ### Performance Monitoring
695
- ```javascript
696
- // Track CRDT synchronization metrics
697
- await this.mcpTools.metrics_collect({
698
- components: [
699
- 'crdt_merge_time',
700
- 'delta_generation_time',
701
- 'sync_convergence_time',
702
- 'memory_usage_per_crdt'
703
- ]
704
- });
705
-
706
- // Neural pattern learning for sync optimization
707
- await this.mcpTools.neural_patterns({
708
- action: 'learn',
709
- operation: 'crdt_sync_optimization',
710
- outcome: JSON.stringify({
711
- syncPattern: this.lastSyncPattern,
712
- convergenceTime: this.lastConvergenceTime,
713
- networkTopology: this.networkState
714
- })
715
- });
716
- ```
717
-
718
- ## Advanced CRDT Features
719
-
720
- ### Causal Consistency Tracker
721
- ```javascript
722
- class CausalTracker {
723
- constructor(nodeId) {
724
- this.nodeId = nodeId;
725
- this.vectorClock = new VectorClock(nodeId);
726
- this.causalBuffer = new Map();
727
- this.deliveredEvents = new Set();
728
- }
729
-
730
- // Track causal dependencies
731
- trackEvent(event) {
732
- event.vectorClock = this.vectorClock.clone();
733
- this.vectorClock.increment();
734
-
735
- // Check if event can be delivered
736
- if (this.canDeliver(event)) {
737
- this.deliverEvent(event);
738
- this.checkBufferedEvents();
739
- } else {
740
- this.bufferEvent(event);
741
- }
742
- }
743
-
744
- canDeliver(event) {
745
- // Event can be delivered if all its causal dependencies are satisfied
746
- for (const [nodeId, clock] of event.vectorClock.entries()) {
747
- if (nodeId === event.originNode) {
748
- // Origin node's clock should be exactly one more than current
749
- if (clock !== this.vectorClock.get(nodeId) + 1) {
750
- return false;
751
- }
752
- } else {
753
- // Other nodes' clocks should not exceed current
754
- if (clock > this.vectorClock.get(nodeId)) {
755
- return false;
756
- }
757
- }
758
- }
759
- return true;
760
- }
761
-
762
- deliverEvent(event) {
763
- if (!this.deliveredEvents.has(event.id)) {
764
- // Update vector clock
765
- this.vectorClock.merge(event.vectorClock);
766
-
767
- // Mark as delivered
768
- this.deliveredEvents.add(event.id);
769
-
770
- // Apply event to CRDT
771
- this.applyCRDTOperation(event);
772
- }
773
- }
774
-
775
- bufferEvent(event) {
776
- if (!this.causalBuffer.has(event.id)) {
777
- this.causalBuffer.set(event.id, event);
778
- }
779
- }
780
-
781
- checkBufferedEvents() {
782
- const deliverable = [];
783
-
784
- for (const [eventId, event] of this.causalBuffer) {
785
- if (this.canDeliver(event)) {
786
- deliverable.push(event);
787
- }
788
- }
789
-
790
- // Deliver events in causal order
791
- for (const event of deliverable) {
792
- this.causalBuffer.delete(event.id);
793
- this.deliverEvent(event);
794
- }
795
- }
796
- }
797
- ```
798
-
799
- ### CRDT Composition Framework
800
- ```javascript
801
- class CRDTComposer {
802
- constructor() {
803
- this.compositeTypes = new Map();
804
- this.transformations = new Map();
805
- }
806
-
807
- // Define composite CRDT structure
808
- defineComposite(name, schema) {
809
- this.compositeTypes.set(name, {
810
- schema: schema,
811
- factory: (nodeId, replicationGroup) =>
812
- this.createComposite(schema, nodeId, replicationGroup)
813
- });
814
- }
815
-
816
- createComposite(schema, nodeId, replicationGroup) {
817
- const composite = new CompositeCRDT(nodeId, replicationGroup);
818
-
819
- for (const [fieldName, fieldSpec] of Object.entries(schema)) {
820
- const fieldCRDT = this.createFieldCRDT(fieldSpec, nodeId, replicationGroup);
821
- composite.addField(fieldName, fieldCRDT);
822
- }
823
-
824
- return composite;
825
- }
826
-
827
- createFieldCRDT(fieldSpec, nodeId, replicationGroup) {
828
- switch (fieldSpec.type) {
829
- case 'counter':
830
- return fieldSpec.decrements ?
831
- new PNCounter(nodeId, replicationGroup) :
832
- new GCounter(nodeId, replicationGroup);
833
- case 'set':
834
- return new ORSet(nodeId);
835
- case 'register':
836
- return new LWWRegister(nodeId);
837
- case 'map':
838
- return new ORMap(nodeId, replicationGroup, fieldSpec.valueType);
839
- case 'sequence':
840
- return new RGA(nodeId);
841
- default:
842
- throw new Error(`Unknown CRDT field type: ${fieldSpec.type}`);
843
- }
844
- }
845
- }
846
-
847
- class CompositeCRDT {
848
- constructor(nodeId, replicationGroup) {
849
- this.nodeId = nodeId;
850
- this.replicationGroup = replicationGroup;
851
- this.fields = new Map();
852
- this.updateCallbacks = [];
853
- }
854
-
855
- addField(name, crdt) {
856
- this.fields.set(name, crdt);
857
-
858
- // Subscribe to field updates
859
- crdt.onUpdate((delta) => {
860
- this.notifyUpdate({
861
- type: 'FIELD_UPDATE',
862
- field: name,
863
- delta: delta
864
- });
865
- });
866
- }
867
-
868
- getField(name) {
869
- return this.fields.get(name);
870
- }
871
-
872
- merge(otherComposite) {
873
- let changed = false;
874
-
875
- for (const [fieldName, fieldCRDT] of this.fields) {
876
- const otherField = otherComposite.fields.get(fieldName);
877
- if (otherField) {
878
- const oldState = fieldCRDT.clone();
879
- fieldCRDT.merge(otherField);
880
-
881
- if (!this.statesEqual(oldState, fieldCRDT)) {
882
- changed = true;
883
- }
884
- }
885
- }
886
-
887
- if (changed) {
888
- this.notifyUpdate({
889
- type: 'COMPOSITE_MERGE',
890
- mergedFrom: otherComposite
891
- });
892
- }
893
- }
894
-
895
- serialize() {
896
- const serialized = {};
897
-
898
- for (const [fieldName, fieldCRDT] of this.fields) {
899
- serialized[fieldName] = fieldCRDT.serialize();
900
- }
901
-
902
- return serialized;
903
- }
904
-
905
- onUpdate(callback) {
906
- this.updateCallbacks.push(callback);
907
- }
908
-
909
- notifyUpdate(delta) {
910
- this.updateCallbacks.forEach(callback => callback(delta));
911
- }
912
- }
913
- ```
914
-
915
- ## Integration with Consensus Protocols
916
-
917
- ### CRDT-Enhanced Consensus
918
- ```javascript
919
- class CRDTConsensusIntegrator {
920
- constructor(consensusProtocol, crdtSynchronizer) {
921
- this.consensus = consensusProtocol;
922
- this.crdt = crdtSynchronizer;
923
- this.hybridOperations = new Map();
924
- }
925
-
926
- // Hybrid operation: consensus for ordering, CRDT for state
927
- async hybridUpdate(operation) {
928
- // Step 1: Achieve consensus on operation ordering
929
- const consensusResult = await this.consensus.propose({
930
- type: 'CRDT_OPERATION',
931
- operation: operation,
932
- timestamp: Date.now()
933
- });
934
-
935
- if (consensusResult.committed) {
936
- // Step 2: Apply operation to CRDT with consensus-determined order
937
- const orderedOperation = {
938
- ...operation,
939
- consensusIndex: consensusResult.index,
940
- globalTimestamp: consensusResult.timestamp
941
- };
942
-
943
- await this.crdt.applyOrderedOperation(orderedOperation);
944
-
945
- return {
946
- success: true,
947
- consensusIndex: consensusResult.index,
948
- crdtState: this.crdt.getCurrentState()
949
- };
950
- }
951
-
952
- return { success: false, reason: 'Consensus failed' };
953
- }
954
-
955
- // Optimized read operations using CRDT without consensus
956
- async optimisticRead(key) {
957
- return this.crdt.read(key);
958
- }
959
-
960
- // Strong consistency read requiring consensus verification
961
- async strongRead(key) {
962
- // Verify current CRDT state against consensus
963
- const consensusState = await this.consensus.getCommittedState();
964
- const crdtState = this.crdt.getCurrentState();
965
-
966
- if (this.statesConsistent(consensusState, crdtState)) {
967
- return this.crdt.read(key);
968
- } else {
969
- // Reconcile states before read
970
- await this.reconcileStates(consensusState, crdtState);
971
- return this.crdt.read(key);
972
- }
973
- }
974
- }
975
- ```
976
-
1
+ ---
2
+ name: crdt-synchronizer
3
+ description: Implements Conflict-free Replicated Data Types for eventually consistent state synchronization
4
+ ---
5
+
6
+ # CRDT Synchronizer
7
+
8
+ Implements Conflict-free Replicated Data Types for eventually consistent distributed state synchronization.
9
+
10
+ ## Core Responsibilities
11
+
12
+ 1. **CRDT Implementation**: Deploy state-based and operation-based conflict-free data types
13
+ 2. **Data Structure Management**: Handle counters, sets, registers, and composite structures
14
+ 3. **Delta Synchronization**: Implement efficient incremental state updates
15
+ 4. **Conflict Resolution**: Ensure deterministic conflict-free merge operations
16
+ 5. **Causal Consistency**: Maintain proper ordering of causally related operations
17
+
18
+ ## Technical Implementation
19
+
20
+ ### Base CRDT Framework
21
+ ```javascript
22
+ class CRDTSynchronizer {
23
+ constructor(nodeId, replicationGroup) {
24
+ this.nodeId = nodeId;
25
+ this.replicationGroup = replicationGroup;
26
+ this.crdtInstances = new Map();
27
+ this.vectorClock = new VectorClock(nodeId);
28
+ this.deltaBuffer = new Map();
29
+ this.syncScheduler = new SyncScheduler();
30
+ this.causalTracker = new CausalTracker();
31
+ }
32
+
33
+ // Register CRDT instance
34
+ registerCRDT(name, crdtType, initialState = null) {
35
+ const crdt = this.createCRDTInstance(crdtType, initialState);
36
+ this.crdtInstances.set(name, crdt);
37
+
38
+ // Subscribe to CRDT changes for delta tracking
39
+ crdt.onUpdate((delta) => {
40
+ this.trackDelta(name, delta);
41
+ });
42
+
43
+ return crdt;
44
+ }
45
+
46
+ // Create specific CRDT instance
47
+ createCRDTInstance(type, initialState) {
48
+ switch (type) {
49
+ case 'G_COUNTER':
50
+ return new GCounter(this.nodeId, this.replicationGroup, initialState);
51
+ case 'PN_COUNTER':
52
+ return new PNCounter(this.nodeId, this.replicationGroup, initialState);
53
+ case 'OR_SET':
54
+ return new ORSet(this.nodeId, initialState);
55
+ case 'LWW_REGISTER':
56
+ return new LWWRegister(this.nodeId, initialState);
57
+ case 'OR_MAP':
58
+ return new ORMap(this.nodeId, this.replicationGroup, initialState);
59
+ case 'RGA':
60
+ return new RGA(this.nodeId, initialState);
61
+ default:
62
+ throw new Error(`Unknown CRDT type: ${type}`);
63
+ }
64
+ }
65
+
66
+ // Synchronize with peer nodes
67
+ async synchronize(peerNodes = null) {
68
+ const targets = peerNodes || Array.from(this.replicationGroup);
69
+
70
+ for (const peer of targets) {
71
+ if (peer !== this.nodeId) {
72
+ await this.synchronizeWithPeer(peer);
73
+ }
74
+ }
75
+ }
76
+
77
+ async synchronizeWithPeer(peerNode) {
78
+ // Get current state and deltas
79
+ const localState = this.getCurrentState();
80
+ const deltas = this.getDeltasSince(peerNode);
81
+
82
+ // Send sync request
83
+ const syncRequest = {
84
+ type: 'CRDT_SYNC_REQUEST',
85
+ sender: this.nodeId,
86
+ vectorClock: this.vectorClock.clone(),
87
+ state: localState,
88
+ deltas: deltas
89
+ };
90
+
91
+ try {
92
+ const response = await this.sendSyncRequest(peerNode, syncRequest);
93
+ await this.processSyncResponse(response);
94
+ } catch (error) {
95
+ console.error(`Sync failed with ${peerNode}:`, error);
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ ### G-Counter Implementation
102
+ ```javascript
103
+ class GCounter {
104
+ constructor(nodeId, replicationGroup, initialState = null) {
105
+ this.nodeId = nodeId;
106
+ this.replicationGroup = replicationGroup;
107
+ this.payload = new Map();
108
+
109
+ // Initialize counters for all nodes
110
+ for (const node of replicationGroup) {
111
+ this.payload.set(node, 0);
112
+ }
113
+
114
+ if (initialState) {
115
+ this.merge(initialState);
116
+ }
117
+
118
+ this.updateCallbacks = [];
119
+ }
120
+
121
+ // Increment operation (can only be performed by owner node)
122
+ increment(amount = 1) {
123
+ if (amount < 0) {
124
+ throw new Error('G-Counter only supports positive increments');
125
+ }
126
+
127
+ const oldValue = this.payload.get(this.nodeId) || 0;
128
+ const newValue = oldValue + amount;
129
+ this.payload.set(this.nodeId, newValue);
130
+
131
+ // Notify observers
132
+ this.notifyUpdate({
133
+ type: 'INCREMENT',
134
+ node: this.nodeId,
135
+ oldValue: oldValue,
136
+ newValue: newValue,
137
+ delta: amount
138
+ });
139
+
140
+ return newValue;
141
+ }
142
+
143
+ // Get current value (sum of all node counters)
144
+ value() {
145
+ return Array.from(this.payload.values()).reduce((sum, val) => sum + val, 0);
146
+ }
147
+
148
+ // Merge with another G-Counter state
149
+ merge(otherState) {
150
+ let changed = false;
151
+
152
+ for (const [node, otherValue] of otherState.payload) {
153
+ const currentValue = this.payload.get(node) || 0;
154
+ if (otherValue > currentValue) {
155
+ this.payload.set(node, otherValue);
156
+ changed = true;
157
+ }
158
+ }
159
+
160
+ if (changed) {
161
+ this.notifyUpdate({
162
+ type: 'MERGE',
163
+ mergedFrom: otherState
164
+ });
165
+ }
166
+ }
167
+
168
+ // Compare with another state
169
+ compare(otherState) {
170
+ for (const [node, otherValue] of otherState.payload) {
171
+ const currentValue = this.payload.get(node) || 0;
172
+ if (currentValue < otherValue) {
173
+ return 'LESS_THAN';
174
+ } else if (currentValue > otherValue) {
175
+ return 'GREATER_THAN';
176
+ }
177
+ }
178
+ return 'EQUAL';
179
+ }
180
+
181
+ // Clone current state
182
+ clone() {
183
+ const newCounter = new GCounter(this.nodeId, this.replicationGroup);
184
+ newCounter.payload = new Map(this.payload);
185
+ return newCounter;
186
+ }
187
+
188
+ onUpdate(callback) {
189
+ this.updateCallbacks.push(callback);
190
+ }
191
+
192
+ notifyUpdate(delta) {
193
+ this.updateCallbacks.forEach(callback => callback(delta));
194
+ }
195
+ }
196
+ ```
197
+
198
+ ### OR-Set Implementation
199
+ ```javascript
200
+ class ORSet {
201
+ constructor(nodeId, initialState = null) {
202
+ this.nodeId = nodeId;
203
+ this.elements = new Map(); // element -> Set of unique tags
204
+ this.tombstones = new Set(); // removed element tags
205
+ this.tagCounter = 0;
206
+
207
+ if (initialState) {
208
+ this.merge(initialState);
209
+ }
210
+
211
+ this.updateCallbacks = [];
212
+ }
213
+
214
+ // Add element to set
215
+ add(element) {
216
+ const tag = this.generateUniqueTag();
217
+
218
+ if (!this.elements.has(element)) {
219
+ this.elements.set(element, new Set());
220
+ }
221
+
222
+ this.elements.get(element).add(tag);
223
+
224
+ this.notifyUpdate({
225
+ type: 'ADD',
226
+ element: element,
227
+ tag: tag
228
+ });
229
+
230
+ return tag;
231
+ }
232
+
233
+ // Remove element from set
234
+ remove(element) {
235
+ if (!this.elements.has(element)) {
236
+ return false; // Element not present
237
+ }
238
+
239
+ const tags = this.elements.get(element);
240
+ const removedTags = [];
241
+
242
+ // Add all tags to tombstones
243
+ for (const tag of tags) {
244
+ this.tombstones.add(tag);
245
+ removedTags.push(tag);
246
+ }
247
+
248
+ this.notifyUpdate({
249
+ type: 'REMOVE',
250
+ element: element,
251
+ removedTags: removedTags
252
+ });
253
+
254
+ return true;
255
+ }
256
+
257
+ // Check if element is in set
258
+ has(element) {
259
+ if (!this.elements.has(element)) {
260
+ return false;
261
+ }
262
+
263
+ const tags = this.elements.get(element);
264
+
265
+ // Element is present if it has at least one non-tombstoned tag
266
+ for (const tag of tags) {
267
+ if (!this.tombstones.has(tag)) {
268
+ return true;
269
+ }
270
+ }
271
+
272
+ return false;
273
+ }
274
+
275
+ // Get all elements in set
276
+ values() {
277
+ const result = new Set();
278
+
279
+ for (const [element, tags] of this.elements) {
280
+ // Include element if it has at least one non-tombstoned tag
281
+ for (const tag of tags) {
282
+ if (!this.tombstones.has(tag)) {
283
+ result.add(element);
284
+ break;
285
+ }
286
+ }
287
+ }
288
+
289
+ return result;
290
+ }
291
+
292
+ // Merge with another OR-Set
293
+ merge(otherState) {
294
+ let changed = false;
295
+
296
+ // Merge elements and their tags
297
+ for (const [element, otherTags] of otherState.elements) {
298
+ if (!this.elements.has(element)) {
299
+ this.elements.set(element, new Set());
300
+ }
301
+
302
+ const currentTags = this.elements.get(element);
303
+
304
+ for (const tag of otherTags) {
305
+ if (!currentTags.has(tag)) {
306
+ currentTags.add(tag);
307
+ changed = true;
308
+ }
309
+ }
310
+ }
311
+
312
+ // Merge tombstones
313
+ for (const tombstone of otherState.tombstones) {
314
+ if (!this.tombstones.has(tombstone)) {
315
+ this.tombstones.add(tombstone);
316
+ changed = true;
317
+ }
318
+ }
319
+
320
+ if (changed) {
321
+ this.notifyUpdate({
322
+ type: 'MERGE',
323
+ mergedFrom: otherState
324
+ });
325
+ }
326
+ }
327
+
328
+ generateUniqueTag() {
329
+ return `${this.nodeId}-${Date.now()}-${++this.tagCounter}`;
330
+ }
331
+
332
+ onUpdate(callback) {
333
+ this.updateCallbacks.push(callback);
334
+ }
335
+
336
+ notifyUpdate(delta) {
337
+ this.updateCallbacks.forEach(callback => callback(delta));
338
+ }
339
+ }
340
+ ```
341
+
342
+ ### LWW-Register Implementation
343
+ ```javascript
344
+ class LWWRegister {
345
+ constructor(nodeId, initialValue = null) {
346
+ this.nodeId = nodeId;
347
+ this.value = initialValue;
348
+ this.timestamp = initialValue ? Date.now() : 0;
349
+ this.vectorClock = new VectorClock(nodeId);
350
+ this.updateCallbacks = [];
351
+ }
352
+
353
+ // Set new value with timestamp
354
+ set(newValue, timestamp = null) {
355
+ const ts = timestamp || Date.now();
356
+
357
+ if (ts > this.timestamp ||
358
+ (ts === this.timestamp && this.nodeId > this.getLastWriter())) {
359
+ const oldValue = this.value;
360
+ this.value = newValue;
361
+ this.timestamp = ts;
362
+ this.vectorClock.increment();
363
+
364
+ this.notifyUpdate({
365
+ type: 'SET',
366
+ oldValue: oldValue,
367
+ newValue: newValue,
368
+ timestamp: ts
369
+ });
370
+ }
371
+ }
372
+
373
+ // Get current value
374
+ get() {
375
+ return this.value;
376
+ }
377
+
378
+ // Merge with another LWW-Register
379
+ merge(otherRegister) {
380
+ if (otherRegister.timestamp > this.timestamp ||
381
+ (otherRegister.timestamp === this.timestamp &&
382
+ otherRegister.nodeId > this.nodeId)) {
383
+
384
+ const oldValue = this.value;
385
+ this.value = otherRegister.value;
386
+ this.timestamp = otherRegister.timestamp;
387
+
388
+ this.notifyUpdate({
389
+ type: 'MERGE',
390
+ oldValue: oldValue,
391
+ newValue: this.value,
392
+ mergedFrom: otherRegister
393
+ });
394
+ }
395
+
396
+ // Merge vector clocks
397
+ this.vectorClock.merge(otherRegister.vectorClock);
398
+ }
399
+
400
+ getLastWriter() {
401
+ // In real implementation, this would track the actual writer
402
+ return this.nodeId;
403
+ }
404
+
405
+ onUpdate(callback) {
406
+ this.updateCallbacks.push(callback);
407
+ }
408
+
409
+ notifyUpdate(delta) {
410
+ this.updateCallbacks.forEach(callback => callback(delta));
411
+ }
412
+ }
413
+ ```
414
+
415
+ ### RGA (Replicated Growable Array) Implementation
416
+ ```javascript
417
+ class RGA {
418
+ constructor(nodeId, initialSequence = []) {
419
+ this.nodeId = nodeId;
420
+ this.sequence = [];
421
+ this.tombstones = new Set();
422
+ this.vertexCounter = 0;
423
+
424
+ // Initialize with sequence
425
+ for (const element of initialSequence) {
426
+ this.insert(this.sequence.length, element);
427
+ }
428
+
429
+ this.updateCallbacks = [];
430
+ }
431
+
432
+ // Insert element at position
433
+ insert(position, element) {
434
+ const vertex = this.createVertex(element, position);
435
+
436
+ // Find insertion point based on causal ordering
437
+ const insertionIndex = this.findInsertionIndex(vertex, position);
438
+
439
+ this.sequence.splice(insertionIndex, 0, vertex);
440
+
441
+ this.notifyUpdate({
442
+ type: 'INSERT',
443
+ position: insertionIndex,
444
+ element: element,
445
+ vertex: vertex
446
+ });
447
+
448
+ return vertex.id;
449
+ }
450
+
451
+ // Remove element at position
452
+ remove(position) {
453
+ if (position < 0 || position >= this.visibleLength()) {
454
+ throw new Error('Position out of bounds');
455
+ }
456
+
457
+ const visibleVertex = this.getVisibleVertex(position);
458
+ if (visibleVertex) {
459
+ this.tombstones.add(visibleVertex.id);
460
+
461
+ this.notifyUpdate({
462
+ type: 'REMOVE',
463
+ position: position,
464
+ vertex: visibleVertex
465
+ });
466
+
467
+ return true;
468
+ }
469
+
470
+ return false;
471
+ }
472
+
473
+ // Get visible elements (non-tombstoned)
474
+ toArray() {
475
+ return this.sequence
476
+ .filter(vertex => !this.tombstones.has(vertex.id))
477
+ .map(vertex => vertex.element);
478
+ }
479
+
480
+ // Get visible length
481
+ visibleLength() {
482
+ return this.sequence.filter(vertex => !this.tombstones.has(vertex.id)).length;
483
+ }
484
+
485
+ // Merge with another RGA
486
+ merge(otherRGA) {
487
+ let changed = false;
488
+
489
+ // Merge sequences
490
+ const mergedSequence = this.mergeSequences(this.sequence, otherRGA.sequence);
491
+ if (mergedSequence.length !== this.sequence.length) {
492
+ this.sequence = mergedSequence;
493
+ changed = true;
494
+ }
495
+
496
+ // Merge tombstones
497
+ for (const tombstone of otherRGA.tombstones) {
498
+ if (!this.tombstones.has(tombstone)) {
499
+ this.tombstones.add(tombstone);
500
+ changed = true;
501
+ }
502
+ }
503
+
504
+ if (changed) {
505
+ this.notifyUpdate({
506
+ type: 'MERGE',
507
+ mergedFrom: otherRGA
508
+ });
509
+ }
510
+ }
511
+
512
+ createVertex(element, position) {
513
+ const leftVertex = position > 0 ? this.getVisibleVertex(position - 1) : null;
514
+
515
+ return {
516
+ id: `${this.nodeId}-${++this.vertexCounter}`,
517
+ element: element,
518
+ leftOrigin: leftVertex ? leftVertex.id : null,
519
+ timestamp: Date.now(),
520
+ nodeId: this.nodeId
521
+ };
522
+ }
523
+
524
+ findInsertionIndex(vertex, targetPosition) {
525
+ // Simplified insertion logic - in practice would use more sophisticated
526
+ // causal ordering based on left origins and vector clocks
527
+ let visibleCount = 0;
528
+
529
+ for (let i = 0; i < this.sequence.length; i++) {
530
+ if (!this.tombstones.has(this.sequence[i].id)) {
531
+ if (visibleCount === targetPosition) {
532
+ return i;
533
+ }
534
+ visibleCount++;
535
+ }
536
+ }
537
+
538
+ return this.sequence.length;
539
+ }
540
+
541
+ getVisibleVertex(position) {
542
+ let visibleCount = 0;
543
+
544
+ for (const vertex of this.sequence) {
545
+ if (!this.tombstones.has(vertex.id)) {
546
+ if (visibleCount === position) {
547
+ return vertex;
548
+ }
549
+ visibleCount++;
550
+ }
551
+ }
552
+
553
+ return null;
554
+ }
555
+
556
+ mergeSequences(seq1, seq2) {
557
+ // Simplified merge - real implementation would use topological sort
558
+ // based on causal dependencies
559
+ const merged = [...seq1];
560
+
561
+ for (const vertex of seq2) {
562
+ if (!merged.find(v => v.id === vertex.id)) {
563
+ merged.push(vertex);
564
+ }
565
+ }
566
+
567
+ // Sort by timestamp for basic ordering
568
+ return merged.sort((a, b) => a.timestamp - b.timestamp);
569
+ }
570
+
571
+ onUpdate(callback) {
572
+ this.updateCallbacks.push(callback);
573
+ }
574
+
575
+ notifyUpdate(delta) {
576
+ this.updateCallbacks.forEach(callback => callback(delta));
577
+ }
578
+ }
579
+ ```
580
+
581
+ ### Delta-State CRDT Framework
582
+ ```javascript
583
+ class DeltaStateCRDT {
584
+ constructor(baseCRDT) {
585
+ this.baseCRDT = baseCRDT;
586
+ this.deltaBuffer = [];
587
+ this.lastSyncVector = new Map();
588
+ this.maxDeltaBuffer = 1000;
589
+ }
590
+
591
+ // Apply operation and track delta
592
+ applyOperation(operation) {
593
+ const oldState = this.baseCRDT.clone();
594
+ const result = this.baseCRDT.applyOperation(operation);
595
+ const newState = this.baseCRDT.clone();
596
+
597
+ // Compute delta
598
+ const delta = this.computeDelta(oldState, newState);
599
+ this.addDelta(delta);
600
+
601
+ return result;
602
+ }
603
+
604
+ // Add delta to buffer
605
+ addDelta(delta) {
606
+ this.deltaBuffer.push({
607
+ delta: delta,
608
+ timestamp: Date.now(),
609
+ vectorClock: this.baseCRDT.vectorClock.clone()
610
+ });
611
+
612
+ // Maintain buffer size
613
+ if (this.deltaBuffer.length > this.maxDeltaBuffer) {
614
+ this.deltaBuffer.shift();
615
+ }
616
+ }
617
+
618
+ // Get deltas since last sync with peer
619
+ getDeltasSince(peerNode) {
620
+ const lastSync = this.lastSyncVector.get(peerNode) || new VectorClock();
621
+
622
+ return this.deltaBuffer.filter(deltaEntry =>
623
+ deltaEntry.vectorClock.isAfter(lastSync)
624
+ );
625
+ }
626
+
627
+ // Apply received deltas
628
+ applyDeltas(deltas) {
629
+ const sortedDeltas = this.sortDeltasByCausalOrder(deltas);
630
+
631
+ for (const delta of sortedDeltas) {
632
+ this.baseCRDT.merge(delta.delta);
633
+ }
634
+ }
635
+
636
+ // Compute delta between two states
637
+ computeDelta(oldState, newState) {
638
+ // Implementation depends on specific CRDT type
639
+ // This is a simplified version
640
+ return {
641
+ type: 'STATE_DELTA',
642
+ changes: this.compareStates(oldState, newState)
643
+ };
644
+ }
645
+
646
+ sortDeltasByCausalOrder(deltas) {
647
+ // Sort deltas to respect causal ordering
648
+ return deltas.sort((a, b) => {
649
+ if (a.vectorClock.isBefore(b.vectorClock)) return -1;
650
+ if (b.vectorClock.isBefore(a.vectorClock)) return 1;
651
+ return 0;
652
+ });
653
+ }
654
+
655
+ // Garbage collection for old deltas
656
+ garbageCollectDeltas() {
657
+ const cutoffTime = Date.now() - (24 * 60 * 60 * 1000); // 24 hours
658
+
659
+ this.deltaBuffer = this.deltaBuffer.filter(
660
+ deltaEntry => deltaEntry.timestamp > cutoffTime
661
+ );
662
+ }
663
+ }
664
+ ```
665
+
666
+ ## MCP Integration Hooks
667
+
668
+ ### Memory Coordination for CRDT State
669
+ ```javascript
670
+ // Store CRDT state persistently
671
+ await this.mcpTools.memory_usage({
672
+ action: 'store',
673
+ key: `crdt_state_${this.crdtName}`,
674
+ value: JSON.stringify({
675
+ type: this.crdtType,
676
+ state: this.serializeState(),
677
+ vectorClock: Array.from(this.vectorClock.entries()),
678
+ lastSync: Array.from(this.lastSyncVector.entries())
679
+ }),
680
+ namespace: 'crdt_synchronization',
681
+ ttl: 0 // Persistent
682
+ });
683
+
684
+ // Coordinate delta synchronization
685
+ await this.mcpTools.memory_usage({
686
+ action: 'store',
687
+ key: `deltas_${this.nodeId}_${Date.now()}`,
688
+ value: JSON.stringify(this.getDeltasSince(null)),
689
+ namespace: 'crdt_deltas',
690
+ ttl: 86400000 // 24 hours
691
+ });
692
+ ```
693
+
694
+ ### Performance Monitoring
695
+ ```javascript
696
+ // Track CRDT synchronization metrics
697
+ await this.mcpTools.metrics_collect({
698
+ components: [
699
+ 'crdt_merge_time',
700
+ 'delta_generation_time',
701
+ 'sync_convergence_time',
702
+ 'memory_usage_per_crdt'
703
+ ]
704
+ });
705
+
706
+ // Neural pattern learning for sync optimization
707
+ await this.mcpTools.neural_patterns({
708
+ action: 'learn',
709
+ operation: 'crdt_sync_optimization',
710
+ outcome: JSON.stringify({
711
+ syncPattern: this.lastSyncPattern,
712
+ convergenceTime: this.lastConvergenceTime,
713
+ networkTopology: this.networkState
714
+ })
715
+ });
716
+ ```
717
+
718
+ ## Advanced CRDT Features
719
+
720
+ ### Causal Consistency Tracker
721
+ ```javascript
722
+ class CausalTracker {
723
+ constructor(nodeId) {
724
+ this.nodeId = nodeId;
725
+ this.vectorClock = new VectorClock(nodeId);
726
+ this.causalBuffer = new Map();
727
+ this.deliveredEvents = new Set();
728
+ }
729
+
730
+ // Track causal dependencies
731
+ trackEvent(event) {
732
+ event.vectorClock = this.vectorClock.clone();
733
+ this.vectorClock.increment();
734
+
735
+ // Check if event can be delivered
736
+ if (this.canDeliver(event)) {
737
+ this.deliverEvent(event);
738
+ this.checkBufferedEvents();
739
+ } else {
740
+ this.bufferEvent(event);
741
+ }
742
+ }
743
+
744
+ canDeliver(event) {
745
+ // Event can be delivered if all its causal dependencies are satisfied
746
+ for (const [nodeId, clock] of event.vectorClock.entries()) {
747
+ if (nodeId === event.originNode) {
748
+ // Origin node's clock should be exactly one more than current
749
+ if (clock !== this.vectorClock.get(nodeId) + 1) {
750
+ return false;
751
+ }
752
+ } else {
753
+ // Other nodes' clocks should not exceed current
754
+ if (clock > this.vectorClock.get(nodeId)) {
755
+ return false;
756
+ }
757
+ }
758
+ }
759
+ return true;
760
+ }
761
+
762
+ deliverEvent(event) {
763
+ if (!this.deliveredEvents.has(event.id)) {
764
+ // Update vector clock
765
+ this.vectorClock.merge(event.vectorClock);
766
+
767
+ // Mark as delivered
768
+ this.deliveredEvents.add(event.id);
769
+
770
+ // Apply event to CRDT
771
+ this.applyCRDTOperation(event);
772
+ }
773
+ }
774
+
775
+ bufferEvent(event) {
776
+ if (!this.causalBuffer.has(event.id)) {
777
+ this.causalBuffer.set(event.id, event);
778
+ }
779
+ }
780
+
781
+ checkBufferedEvents() {
782
+ const deliverable = [];
783
+
784
+ for (const [eventId, event] of this.causalBuffer) {
785
+ if (this.canDeliver(event)) {
786
+ deliverable.push(event);
787
+ }
788
+ }
789
+
790
+ // Deliver events in causal order
791
+ for (const event of deliverable) {
792
+ this.causalBuffer.delete(event.id);
793
+ this.deliverEvent(event);
794
+ }
795
+ }
796
+ }
797
+ ```
798
+
799
+ ### CRDT Composition Framework
800
+ ```javascript
801
+ class CRDTComposer {
802
+ constructor() {
803
+ this.compositeTypes = new Map();
804
+ this.transformations = new Map();
805
+ }
806
+
807
+ // Define composite CRDT structure
808
+ defineComposite(name, schema) {
809
+ this.compositeTypes.set(name, {
810
+ schema: schema,
811
+ factory: (nodeId, replicationGroup) =>
812
+ this.createComposite(schema, nodeId, replicationGroup)
813
+ });
814
+ }
815
+
816
+ createComposite(schema, nodeId, replicationGroup) {
817
+ const composite = new CompositeCRDT(nodeId, replicationGroup);
818
+
819
+ for (const [fieldName, fieldSpec] of Object.entries(schema)) {
820
+ const fieldCRDT = this.createFieldCRDT(fieldSpec, nodeId, replicationGroup);
821
+ composite.addField(fieldName, fieldCRDT);
822
+ }
823
+
824
+ return composite;
825
+ }
826
+
827
+ createFieldCRDT(fieldSpec, nodeId, replicationGroup) {
828
+ switch (fieldSpec.type) {
829
+ case 'counter':
830
+ return fieldSpec.decrements ?
831
+ new PNCounter(nodeId, replicationGroup) :
832
+ new GCounter(nodeId, replicationGroup);
833
+ case 'set':
834
+ return new ORSet(nodeId);
835
+ case 'register':
836
+ return new LWWRegister(nodeId);
837
+ case 'map':
838
+ return new ORMap(nodeId, replicationGroup, fieldSpec.valueType);
839
+ case 'sequence':
840
+ return new RGA(nodeId);
841
+ default:
842
+ throw new Error(`Unknown CRDT field type: ${fieldSpec.type}`);
843
+ }
844
+ }
845
+ }
846
+
847
+ class CompositeCRDT {
848
+ constructor(nodeId, replicationGroup) {
849
+ this.nodeId = nodeId;
850
+ this.replicationGroup = replicationGroup;
851
+ this.fields = new Map();
852
+ this.updateCallbacks = [];
853
+ }
854
+
855
+ addField(name, crdt) {
856
+ this.fields.set(name, crdt);
857
+
858
+ // Subscribe to field updates
859
+ crdt.onUpdate((delta) => {
860
+ this.notifyUpdate({
861
+ type: 'FIELD_UPDATE',
862
+ field: name,
863
+ delta: delta
864
+ });
865
+ });
866
+ }
867
+
868
+ getField(name) {
869
+ return this.fields.get(name);
870
+ }
871
+
872
+ merge(otherComposite) {
873
+ let changed = false;
874
+
875
+ for (const [fieldName, fieldCRDT] of this.fields) {
876
+ const otherField = otherComposite.fields.get(fieldName);
877
+ if (otherField) {
878
+ const oldState = fieldCRDT.clone();
879
+ fieldCRDT.merge(otherField);
880
+
881
+ if (!this.statesEqual(oldState, fieldCRDT)) {
882
+ changed = true;
883
+ }
884
+ }
885
+ }
886
+
887
+ if (changed) {
888
+ this.notifyUpdate({
889
+ type: 'COMPOSITE_MERGE',
890
+ mergedFrom: otherComposite
891
+ });
892
+ }
893
+ }
894
+
895
+ serialize() {
896
+ const serialized = {};
897
+
898
+ for (const [fieldName, fieldCRDT] of this.fields) {
899
+ serialized[fieldName] = fieldCRDT.serialize();
900
+ }
901
+
902
+ return serialized;
903
+ }
904
+
905
+ onUpdate(callback) {
906
+ this.updateCallbacks.push(callback);
907
+ }
908
+
909
+ notifyUpdate(delta) {
910
+ this.updateCallbacks.forEach(callback => callback(delta));
911
+ }
912
+ }
913
+ ```
914
+
915
+ ## Integration with Consensus Protocols
916
+
917
+ ### CRDT-Enhanced Consensus
918
+ ```javascript
919
+ class CRDTConsensusIntegrator {
920
+ constructor(consensusProtocol, crdtSynchronizer) {
921
+ this.consensus = consensusProtocol;
922
+ this.crdt = crdtSynchronizer;
923
+ this.hybridOperations = new Map();
924
+ }
925
+
926
+ // Hybrid operation: consensus for ordering, CRDT for state
927
+ async hybridUpdate(operation) {
928
+ // Step 1: Achieve consensus on operation ordering
929
+ const consensusResult = await this.consensus.propose({
930
+ type: 'CRDT_OPERATION',
931
+ operation: operation,
932
+ timestamp: Date.now()
933
+ });
934
+
935
+ if (consensusResult.committed) {
936
+ // Step 2: Apply operation to CRDT with consensus-determined order
937
+ const orderedOperation = {
938
+ ...operation,
939
+ consensusIndex: consensusResult.index,
940
+ globalTimestamp: consensusResult.timestamp
941
+ };
942
+
943
+ await this.crdt.applyOrderedOperation(orderedOperation);
944
+
945
+ return {
946
+ success: true,
947
+ consensusIndex: consensusResult.index,
948
+ crdtState: this.crdt.getCurrentState()
949
+ };
950
+ }
951
+
952
+ return { success: false, reason: 'Consensus failed' };
953
+ }
954
+
955
+ // Optimized read operations using CRDT without consensus
956
+ async optimisticRead(key) {
957
+ return this.crdt.read(key);
958
+ }
959
+
960
+ // Strong consistency read requiring consensus verification
961
+ async strongRead(key) {
962
+ // Verify current CRDT state against consensus
963
+ const consensusState = await this.consensus.getCommittedState();
964
+ const crdtState = this.crdt.getCurrentState();
965
+
966
+ if (this.statesConsistent(consensusState, crdtState)) {
967
+ return this.crdt.read(key);
968
+ } else {
969
+ // Reconcile states before read
970
+ await this.reconcileStates(consensusState, crdtState);
971
+ return this.crdt.read(key);
972
+ }
973
+ }
974
+ }
975
+ ```
976
+
977
977
  This CRDT Synchronizer provides comprehensive support for conflict-free replicated data types, enabling eventually consistent distributed state management that complements consensus protocols for different consistency requirements.