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
@@ -5,500 +5,409 @@
5
5
  * to SwarmMemory. Enforces maximum iteration limits and provides escalation triggers.
6
6
  *
7
7
  * @module coordination/iteration-tracker
8
- */
9
-
10
- import { createSwarmMemory } from '../memory/swarm-memory.js';
11
-
8
+ */ import { createSwarmMemory } from "../memory/swarm-memory.js";
12
9
  /**
13
10
  * Iteration limits for CFN loops
14
- */
15
- const ITERATION_LIMITS = {
16
- LOOP2_MAX: 5, // Maximum phase-level iterations
17
- LOOP3_MAX: 10, // Maximum swarm-level iterations
18
- };
19
-
11
+ */ const ITERATION_LIMITS = {
12
+ LOOP2_MAX: 5,
13
+ LOOP3_MAX: 10
14
+ };
20
15
  /**
21
16
  * Escalation strategies
22
- */
23
- const ESCALATION_STRATEGIES = {
24
- LOOP2_EXCEEDED: 'phase_retry_limit',
25
- LOOP3_EXCEEDED: 'swarm_stuck',
26
- CONTINUE: 'continue',
27
- };
28
-
17
+ */ const ESCALATION_STRATEGIES = {
18
+ LOOP2_EXCEEDED: 'phase_retry_limit',
19
+ LOOP3_EXCEEDED: 'swarm_stuck',
20
+ CONTINUE: 'continue'
21
+ };
29
22
  /**
30
23
  * IterationTracker class
31
24
  * Manages iteration counting, limit enforcement, and state persistence
32
- */
33
- export class IterationTracker {
34
- /**
35
- * Create an IterationTracker instance
36
- * @param {Object} options - Configuration options
37
- * @param {string} options.phaseId - Unique identifier for the current phase
38
- * @param {string} options.swarmId - Swarm identifier for memory namespace
39
- * @param {number} options.loop2Max - Custom Loop 2 max (default: 5)
40
- * @param {number} options.loop3Max - Custom Loop 3 max (default: 10)
41
- * @param {Object} options.memory - Optional SwarmMemory instance
42
- */
43
- constructor(options = {}) {
44
- this.phaseId = options.phaseId || `phase-${Date.now()}`;
45
- this.swarmId = options.swarmId || 'default';
46
-
47
- // Iteration limits with input validation
48
- // Use nullish coalescing to properly handle 0 value
49
- const loop2Max =
50
- options.loop2Max !== undefined
51
- ? options.loop2Max
52
- : ITERATION_LIMITS.LOOP2_MAX;
53
- const loop3Max =
54
- options.loop3Max !== undefined
55
- ? options.loop3Max
56
- : ITERATION_LIMITS.LOOP3_MAX;
57
-
58
- // SECURITY: Validate iteration limits (CVE-2025-001 fix)
59
- // Prevent DoS attacks via excessive iteration limits
60
- if (!Number.isInteger(loop2Max) || loop2Max < 1 || loop2Max > 100) {
61
- throw new Error(
62
- `Invalid loop2Max: ${loop2Max}. Must be integer between 1 and 100`
63
- );
64
- }
65
- if (!Number.isInteger(loop3Max) || loop3Max < 1 || loop3Max > 100) {
66
- throw new Error(
67
- `Invalid loop3Max: ${loop3Max}. Must be integer between 1 and 100`
68
- );
69
- }
70
-
71
- this.loop2Max = loop2Max;
72
- this.loop3Max = loop3Max;
73
-
74
- // Current iteration counters
75
- this.loop2Counter = 0; // Phase-level iterations
76
- this.loop3Counter = 0; // Swarm-level iterations
77
-
78
- // State tracking
79
- this.initialized = false;
80
- this.lastUpdated = null;
81
- this.escalationHistory = [];
82
-
83
- // Memory persistence
84
- this.memory = options.memory || null;
85
- this.memoryNamespace = `cfn-loop/iterations/${this.phaseId}`;
86
-
87
- // Statistics
88
- this.stats = {
89
- totalLoop2Iterations: 0,
90
- totalLoop3Iterations: 0,
91
- loop3Resets: 0,
92
- escalations: 0,
93
- successfulGatePasses: 0,
94
- };
95
- }
96
-
97
- /**
25
+ */ export class IterationTracker {
26
+ /**
98
27
  * Initialize the tracker and load persisted state if available
99
28
  * @returns {Promise<Object>} Initialization result
100
- */
101
- async initialize() {
102
- if (this.initialized) {
103
- return { success: true, message: 'Already initialized' };
104
- }
105
-
106
- // Initialize SwarmMemory if not provided
107
- if (!this.memory) {
108
- this.memory = createSwarmMemory({ swarmId: this.swarmId });
109
- await this.memory.initialize();
110
- }
111
-
112
- // Try to load persisted state
113
- const loaded = await this.loadState(this.phaseId);
114
-
115
- if (loaded) {
116
- this.initialized = true;
117
- return {
118
- success: true,
119
- message: 'Loaded from persisted state',
120
- state: this.getState(),
121
- };
122
- }
123
-
124
- // Initialize fresh state
125
- this.initialized = true;
126
- this.lastUpdated = new Date().toISOString();
127
-
128
- // Persist initial state
129
- await this.persistState();
130
-
131
- return {
132
- success: true,
133
- message: 'Initialized fresh state',
134
- state: this.getState(),
135
- };
136
- }
137
-
138
- /**
29
+ */ async initialize() {
30
+ if (this.initialized) {
31
+ return {
32
+ success: true,
33
+ message: 'Already initialized'
34
+ };
35
+ }
36
+ // Initialize SwarmMemory if not provided
37
+ if (!this.memory) {
38
+ this.memory = createSwarmMemory({
39
+ swarmId: this.swarmId
40
+ });
41
+ await this.memory.initialize();
42
+ }
43
+ // Try to load persisted state
44
+ const loaded = await this.loadState(this.phaseId);
45
+ if (loaded) {
46
+ this.initialized = true;
47
+ return {
48
+ success: true,
49
+ message: 'Loaded from persisted state',
50
+ state: this.getState()
51
+ };
52
+ }
53
+ // Initialize fresh state
54
+ this.initialized = true;
55
+ this.lastUpdated = new Date().toISOString();
56
+ // Persist initial state
57
+ await this.persistState();
58
+ return {
59
+ success: true,
60
+ message: 'Initialized fresh state',
61
+ state: this.getState()
62
+ };
63
+ }
64
+ /**
139
65
  * Increment Loop 2 counter (phase-level iterations)
140
66
  * @returns {Promise<Object>} Result with current count and status
141
- */
142
- async incrementLoop2() {
143
- if (!this.initialized) {
144
- await this.initialize();
145
- }
146
-
147
- this.loop2Counter++;
148
- this.stats.totalLoop2Iterations++;
149
- this.lastUpdated = new Date().toISOString();
150
-
151
- const status = this.checkLimits();
152
-
153
- // Persist updated state
154
- await this.persistState();
155
-
156
- return {
157
- counter: this.loop2Counter,
158
- max: this.loop2Max,
159
- remaining: this.loop2Max - this.loop2Counter,
160
- status: status.status,
161
- escalate: status.escalate,
162
- message: `Loop 2 iteration ${this.loop2Counter}/${this.loop2Max}`,
163
- };
164
- }
165
-
166
- /**
67
+ */ async incrementLoop2() {
68
+ if (!this.initialized) {
69
+ await this.initialize();
70
+ }
71
+ this.loop2Counter++;
72
+ this.stats.totalLoop2Iterations++;
73
+ this.lastUpdated = new Date().toISOString();
74
+ const status = this.checkLimits();
75
+ // Persist updated state
76
+ await this.persistState();
77
+ return {
78
+ counter: this.loop2Counter,
79
+ max: this.loop2Max,
80
+ remaining: this.loop2Max - this.loop2Counter,
81
+ status: status.status,
82
+ escalate: status.escalate,
83
+ message: `Loop 2 iteration ${this.loop2Counter}/${this.loop2Max}`
84
+ };
85
+ }
86
+ /**
167
87
  * Increment Loop 3 counter (swarm-level iterations)
168
88
  * @returns {Promise<Object>} Result with current count and status
169
- */
170
- async incrementLoop3() {
171
- if (!this.initialized) {
172
- await this.initialize();
173
- }
174
-
175
- this.loop3Counter++;
176
- this.stats.totalLoop3Iterations++;
177
- this.lastUpdated = new Date().toISOString();
178
-
179
- const status = this.checkLimits();
180
-
181
- // Persist updated state
182
- await this.persistState();
183
-
184
- return {
185
- counter: this.loop3Counter,
186
- max: this.loop3Max,
187
- remaining: this.loop3Max - this.loop3Counter,
188
- status: status.status,
189
- escalate: status.escalate,
190
- message: `Loop 3 iteration ${this.loop3Counter}/${this.loop3Max}`,
191
- };
192
- }
193
-
194
- /**
89
+ */ async incrementLoop3() {
90
+ if (!this.initialized) {
91
+ await this.initialize();
92
+ }
93
+ this.loop3Counter++;
94
+ this.stats.totalLoop3Iterations++;
95
+ this.lastUpdated = new Date().toISOString();
96
+ const status = this.checkLimits();
97
+ // Persist updated state
98
+ await this.persistState();
99
+ return {
100
+ counter: this.loop3Counter,
101
+ max: this.loop3Max,
102
+ remaining: this.loop3Max - this.loop3Counter,
103
+ status: status.status,
104
+ escalate: status.escalate,
105
+ message: `Loop 3 iteration ${this.loop3Counter}/${this.loop3Max}`
106
+ };
107
+ }
108
+ /**
195
109
  * Check iteration limits and return status
196
110
  * @returns {Object} Status object with escalation flags
197
- */
198
- checkLimits() {
199
- // Check Loop 2 limit
200
- if (this.loop2Counter >= this.loop2Max) {
201
- return {
202
- status: ESCALATION_STRATEGIES.LOOP2_EXCEEDED,
203
- escalate: true,
204
- reason: 'Phase exceeded retry limit, escalating with feedback',
205
- loop: 2,
206
- counter: this.loop2Counter,
207
- max: this.loop2Max,
208
- };
209
- }
210
-
211
- // Check Loop 3 limit
212
- if (this.loop3Counter >= this.loop3Max) {
213
- return {
214
- status: ESCALATION_STRATEGIES.LOOP3_EXCEEDED,
215
- escalate: true,
216
- reason: 'Swarm stuck, resetting and trying new approach',
217
- loop: 3,
218
- counter: this.loop3Counter,
219
- max: this.loop3Max,
220
- };
221
- }
222
-
223
- // Within limits
224
- return {
225
- status: ESCALATION_STRATEGIES.CONTINUE,
226
- escalate: false,
227
- reason: 'Within iteration limits',
228
- loop2: {
229
- counter: this.loop2Counter,
230
- max: this.loop2Max,
231
- remaining: this.loop2Max - this.loop2Counter,
232
- },
233
- loop3: {
234
- counter: this.loop3Counter,
235
- max: this.loop3Max,
236
- remaining: this.loop3Max - this.loop3Counter,
237
- },
238
- };
239
- }
240
-
241
- /**
111
+ */ checkLimits() {
112
+ // Check Loop 2 limit
113
+ if (this.loop2Counter >= this.loop2Max) {
114
+ return {
115
+ status: ESCALATION_STRATEGIES.LOOP2_EXCEEDED,
116
+ escalate: true,
117
+ reason: 'Phase exceeded retry limit, escalating with feedback',
118
+ loop: 2,
119
+ counter: this.loop2Counter,
120
+ max: this.loop2Max
121
+ };
122
+ }
123
+ // Check Loop 3 limit
124
+ if (this.loop3Counter >= this.loop3Max) {
125
+ return {
126
+ status: ESCALATION_STRATEGIES.LOOP3_EXCEEDED,
127
+ escalate: true,
128
+ reason: 'Swarm stuck, resetting and trying new approach',
129
+ loop: 3,
130
+ counter: this.loop3Counter,
131
+ max: this.loop3Max
132
+ };
133
+ }
134
+ // Within limits
135
+ return {
136
+ status: ESCALATION_STRATEGIES.CONTINUE,
137
+ escalate: false,
138
+ reason: 'Within iteration limits',
139
+ loop2: {
140
+ counter: this.loop2Counter,
141
+ max: this.loop2Max,
142
+ remaining: this.loop2Max - this.loop2Counter
143
+ },
144
+ loop3: {
145
+ counter: this.loop3Counter,
146
+ max: this.loop3Max,
147
+ remaining: this.loop3Max - this.loop3Counter
148
+ }
149
+ };
150
+ }
151
+ /**
242
152
  * Reset Loop 3 counter (called on gate pass or phase completion)
243
153
  * @param {string} reason - Reason for reset
244
154
  * @returns {Promise<Object>} Reset confirmation
245
- */
246
- async resetLoop3(reason = 'gate_pass') {
247
- if (!this.initialized) {
248
- await this.initialize();
249
- }
250
-
251
- const previousCounter = this.loop3Counter;
252
- this.loop3Counter = 0;
253
- this.stats.loop3Resets++;
254
-
255
- if (reason === 'gate_pass') {
256
- this.stats.successfulGatePasses++;
257
- }
258
-
259
- this.lastUpdated = new Date().toISOString();
260
-
261
- // Persist updated state
262
- await this.persistState();
263
-
264
- return {
265
- success: true,
266
- previousCounter,
267
- currentCounter: 0,
268
- reason,
269
- message: `Loop 3 reset from ${previousCounter} to 0 (${reason})`,
270
- };
271
- }
272
-
273
- /**
155
+ */ async resetLoop3(reason = 'gate_pass') {
156
+ if (!this.initialized) {
157
+ await this.initialize();
158
+ }
159
+ const previousCounter = this.loop3Counter;
160
+ this.loop3Counter = 0;
161
+ this.stats.loop3Resets++;
162
+ if (reason === 'gate_pass') {
163
+ this.stats.successfulGatePasses++;
164
+ }
165
+ this.lastUpdated = new Date().toISOString();
166
+ // Persist updated state
167
+ await this.persistState();
168
+ return {
169
+ success: true,
170
+ previousCounter,
171
+ currentCounter: 0,
172
+ reason,
173
+ message: `Loop 3 reset from ${previousCounter} to 0 (${reason})`
174
+ };
175
+ }
176
+ /**
274
177
  * Get current iteration state
275
178
  * @returns {Object} Current state snapshot
276
- */
277
- getState() {
278
- return {
279
- phaseId: this.phaseId,
280
- swarmId: this.swarmId,
281
- counters: {
282
- loop2: this.loop2Counter,
283
- loop3: this.loop3Counter,
284
- },
285
- limits: {
286
- loop2Max: this.loop2Max,
287
- loop3Max: this.loop3Max,
288
- },
289
- remaining: {
290
- loop2: this.loop2Max - this.loop2Counter,
291
- loop3: this.loop3Max - this.loop3Counter,
292
- },
293
- status: this.checkLimits(),
294
- stats: { ...this.stats },
295
- lastUpdated: this.lastUpdated,
296
- initialized: this.initialized,
297
- };
298
- }
299
-
300
- /**
179
+ */ getState() {
180
+ return {
181
+ phaseId: this.phaseId,
182
+ swarmId: this.swarmId,
183
+ counters: {
184
+ loop2: this.loop2Counter,
185
+ loop3: this.loop3Counter
186
+ },
187
+ limits: {
188
+ loop2Max: this.loop2Max,
189
+ loop3Max: this.loop3Max
190
+ },
191
+ remaining: {
192
+ loop2: this.loop2Max - this.loop2Counter,
193
+ loop3: this.loop3Max - this.loop3Counter
194
+ },
195
+ status: this.checkLimits(),
196
+ stats: {
197
+ ...this.stats
198
+ },
199
+ lastUpdated: this.lastUpdated,
200
+ initialized: this.initialized
201
+ };
202
+ }
203
+ /**
301
204
  * Persist state to SwarmMemory
302
205
  * @returns {Promise<Object>} Persistence result
303
- */
304
- async persistState() {
305
- if (!this.memory) {
306
- throw new Error('Memory not initialized');
307
- }
308
-
309
- const state = this.getState();
310
- const key = `iteration-tracker:${this.phaseId}`;
311
-
312
- await this.memory.storeCoordination(key, {
313
- ...state,
314
- persistedAt: new Date().toISOString(),
315
- });
316
-
317
- return {
318
- success: true,
319
- key,
320
- namespace: this.memoryNamespace,
321
- state,
322
- };
323
- }
324
-
325
- /**
206
+ */ async persistState() {
207
+ if (!this.memory) {
208
+ throw new Error('Memory not initialized');
209
+ }
210
+ const state = this.getState();
211
+ const key = `iteration-tracker:${this.phaseId}`;
212
+ await this.memory.storeCoordination(key, {
213
+ ...state,
214
+ persistedAt: new Date().toISOString()
215
+ });
216
+ return {
217
+ success: true,
218
+ key,
219
+ namespace: this.memoryNamespace,
220
+ state
221
+ };
222
+ }
223
+ /**
326
224
  * Load state from SwarmMemory
327
225
  * @param {string} phaseId - Phase ID to load state for
328
226
  * @returns {Promise<boolean>} True if state was loaded, false otherwise
329
- */
330
- async loadState(phaseId) {
331
- if (!this.memory) {
332
- return false;
333
- }
334
-
335
- const key = `iteration-tracker:${phaseId}`;
336
-
337
- try {
338
- const persistedState = await this.memory.getCoordination(key);
339
-
340
- if (!persistedState) {
341
- return false;
342
- }
343
-
344
- // Restore state
345
- this.phaseId = persistedState.phaseId;
346
- this.swarmId = persistedState.swarmId;
347
- this.loop2Counter = persistedState.counters.loop2;
348
- this.loop3Counter = persistedState.counters.loop3;
349
- this.loop2Max = persistedState.limits.loop2Max;
350
- this.loop3Max = persistedState.limits.loop3Max;
351
- this.stats = { ...persistedState.stats };
352
- this.lastUpdated = persistedState.lastUpdated;
353
- this.initialized = true;
354
-
355
- return true;
356
- } catch (error) {
357
- console.error(`Failed to load state for ${phaseId}:`, error.message);
358
- return false;
359
- }
360
- }
361
-
362
- /**
227
+ */ async loadState(phaseId) {
228
+ if (!this.memory) {
229
+ return false;
230
+ }
231
+ const key = `iteration-tracker:${phaseId}`;
232
+ try {
233
+ const persistedState = await this.memory.getCoordination(key);
234
+ if (!persistedState) {
235
+ return false;
236
+ }
237
+ // Restore state
238
+ this.phaseId = persistedState.phaseId;
239
+ this.swarmId = persistedState.swarmId;
240
+ this.loop2Counter = persistedState.counters.loop2;
241
+ this.loop3Counter = persistedState.counters.loop3;
242
+ this.loop2Max = persistedState.limits.loop2Max;
243
+ this.loop3Max = persistedState.limits.loop3Max;
244
+ this.stats = {
245
+ ...persistedState.stats
246
+ };
247
+ this.lastUpdated = persistedState.lastUpdated;
248
+ this.initialized = true;
249
+ return true;
250
+ } catch (error) {
251
+ console.error(`Failed to load state for ${phaseId}:`, error.message);
252
+ return false;
253
+ }
254
+ }
255
+ /**
363
256
  * Record an escalation event
364
257
  * @param {Object} escalation - Escalation details
365
258
  * @returns {Promise<Object>} Escalation record
366
- */
367
- async recordEscalation(escalation) {
368
- if (!this.initialized) {
369
- await this.initialize();
370
- }
371
-
372
- const escalationRecord = {
373
- timestamp: new Date().toISOString(),
374
- phaseId: this.phaseId,
375
- loop2Counter: this.loop2Counter,
376
- loop3Counter: this.loop3Counter,
377
- ...escalation,
378
- };
379
-
380
- this.escalationHistory.push(escalationRecord);
381
- this.stats.escalations++;
382
-
383
- // Persist escalation to memory
384
- const key = `escalation:${this.phaseId}:${Date.now()}`;
385
- await this.memory.storeCoordination(key, escalationRecord);
386
-
387
- // Update main state
388
- await this.persistState();
389
-
390
- return escalationRecord;
391
- }
392
-
393
- /**
259
+ */ async recordEscalation(escalation) {
260
+ if (!this.initialized) {
261
+ await this.initialize();
262
+ }
263
+ const escalationRecord = {
264
+ timestamp: new Date().toISOString(),
265
+ phaseId: this.phaseId,
266
+ loop2Counter: this.loop2Counter,
267
+ loop3Counter: this.loop3Counter,
268
+ ...escalation
269
+ };
270
+ this.escalationHistory.push(escalationRecord);
271
+ this.stats.escalations++;
272
+ // Persist escalation to memory
273
+ const key = `escalation:${this.phaseId}:${Date.now()}`;
274
+ await this.memory.storeCoordination(key, escalationRecord);
275
+ // Update main state
276
+ await this.persistState();
277
+ return escalationRecord;
278
+ }
279
+ /**
394
280
  * Get escalation history
395
281
  * @returns {Array} List of escalation records
396
- */
397
- getEscalationHistory() {
398
- return [...this.escalationHistory];
399
- }
400
-
401
- /**
282
+ */ getEscalationHistory() {
283
+ return [
284
+ ...this.escalationHistory
285
+ ];
286
+ }
287
+ /**
402
288
  * Reset all counters (use with caution - typically for new phase)
403
289
  * @param {string} reason - Reason for complete reset
404
290
  * @returns {Promise<Object>} Reset confirmation
405
- */
406
- async resetAll(reason = 'new_phase') {
407
- if (!this.initialized) {
408
- await this.initialize();
409
- }
410
-
411
- const previousState = this.getState();
412
-
413
- this.loop2Counter = 0;
414
- this.loop3Counter = 0;
415
- this.lastUpdated = new Date().toISOString();
416
-
417
- // Archive old state if needed
418
- if (reason === 'new_phase') {
419
- const archiveKey = `iteration-tracker-archive:${this.phaseId}:${Date.now()}`;
420
- await this.memory.storeCoordination(archiveKey, previousState);
421
- }
422
-
423
- // Persist reset state
424
- await this.persistState();
425
-
426
- return {
427
- success: true,
428
- reason,
429
- previousState,
430
- currentState: this.getState(),
431
- message: 'All counters reset',
432
- };
433
- }
434
-
435
- /**
291
+ */ async resetAll(reason = 'new_phase') {
292
+ if (!this.initialized) {
293
+ await this.initialize();
294
+ }
295
+ const previousState = this.getState();
296
+ this.loop2Counter = 0;
297
+ this.loop3Counter = 0;
298
+ this.lastUpdated = new Date().toISOString();
299
+ // Archive old state if needed
300
+ if (reason === 'new_phase') {
301
+ const archiveKey = `iteration-tracker-archive:${this.phaseId}:${Date.now()}`;
302
+ await this.memory.storeCoordination(archiveKey, previousState);
303
+ }
304
+ // Persist reset state
305
+ await this.persistState();
306
+ return {
307
+ success: true,
308
+ reason,
309
+ previousState,
310
+ currentState: this.getState(),
311
+ message: 'All counters reset'
312
+ };
313
+ }
314
+ /**
436
315
  * Get comprehensive statistics
437
316
  * @returns {Object} Detailed statistics
438
- */
439
- getStatistics() {
440
- return {
441
- phaseId: this.phaseId,
442
- current: {
443
- loop2: this.loop2Counter,
444
- loop3: this.loop3Counter,
445
- },
446
- limits: {
447
- loop2Max: this.loop2Max,
448
- loop3Max: this.loop3Max,
449
- },
450
- utilization: {
451
- loop2: (this.loop2Counter / this.loop2Max) * 100,
452
- loop3: (this.loop3Counter / this.loop3Max) * 100,
453
- },
454
- totals: {
455
- loop2Iterations: this.stats.totalLoop2Iterations,
456
- loop3Iterations: this.stats.totalLoop3Iterations,
457
- loop3Resets: this.stats.loop3Resets,
458
- escalations: this.stats.escalations,
459
- successfulGatePasses: this.stats.successfulGatePasses,
460
- },
461
- efficiency: {
462
- averageLoop3PerLoop2:
463
- this.stats.totalLoop2Iterations > 0
464
- ? this.stats.totalLoop3Iterations / this.stats.totalLoop2Iterations
465
- : 0,
466
- successRate:
467
- this.stats.totalLoop2Iterations > 0
468
- ? (this.stats.successfulGatePasses / this.stats.totalLoop2Iterations) * 100
469
- : 0,
470
- },
471
- lastUpdated: this.lastUpdated,
472
- };
473
- }
474
-
475
- /**
317
+ */ getStatistics() {
318
+ return {
319
+ phaseId: this.phaseId,
320
+ current: {
321
+ loop2: this.loop2Counter,
322
+ loop3: this.loop3Counter
323
+ },
324
+ limits: {
325
+ loop2Max: this.loop2Max,
326
+ loop3Max: this.loop3Max
327
+ },
328
+ utilization: {
329
+ loop2: this.loop2Counter / this.loop2Max * 100,
330
+ loop3: this.loop3Counter / this.loop3Max * 100
331
+ },
332
+ totals: {
333
+ loop2Iterations: this.stats.totalLoop2Iterations,
334
+ loop3Iterations: this.stats.totalLoop3Iterations,
335
+ loop3Resets: this.stats.loop3Resets,
336
+ escalations: this.stats.escalations,
337
+ successfulGatePasses: this.stats.successfulGatePasses
338
+ },
339
+ efficiency: {
340
+ averageLoop3PerLoop2: this.stats.totalLoop2Iterations > 0 ? this.stats.totalLoop3Iterations / this.stats.totalLoop2Iterations : 0,
341
+ successRate: this.stats.totalLoop2Iterations > 0 ? this.stats.successfulGatePasses / this.stats.totalLoop2Iterations * 100 : 0
342
+ },
343
+ lastUpdated: this.lastUpdated
344
+ };
345
+ }
346
+ /**
476
347
  * Export state for debugging or analysis
477
348
  * @returns {Object} Complete tracker state
478
- */
479
- export() {
480
- return {
481
- state: this.getState(),
482
- statistics: this.getStatistics(),
483
- escalationHistory: this.getEscalationHistory(),
484
- memoryNamespace: this.memoryNamespace,
485
- exportedAt: new Date().toISOString(),
486
- };
487
- }
488
- }
489
-
349
+ */ export() {
350
+ return {
351
+ state: this.getState(),
352
+ statistics: this.getStatistics(),
353
+ escalationHistory: this.getEscalationHistory(),
354
+ memoryNamespace: this.memoryNamespace,
355
+ exportedAt: new Date().toISOString()
356
+ };
357
+ }
358
+ /**
359
+ * Create an IterationTracker instance
360
+ * @param {Object} options - Configuration options
361
+ * @param {string} options.phaseId - Unique identifier for the current phase
362
+ * @param {string} options.swarmId - Swarm identifier for memory namespace
363
+ * @param {number} options.loop2Max - Custom Loop 2 max (default: 5)
364
+ * @param {number} options.loop3Max - Custom Loop 3 max (default: 10)
365
+ * @param {Object} options.memory - Optional SwarmMemory instance
366
+ */ constructor(options = {}){
367
+ this.phaseId = options.phaseId || `phase-${Date.now()}`;
368
+ this.swarmId = options.swarmId || 'default';
369
+ // Iteration limits with input validation
370
+ // Use nullish coalescing to properly handle 0 value
371
+ const loop2Max = options.loop2Max !== undefined ? options.loop2Max : ITERATION_LIMITS.LOOP2_MAX;
372
+ const loop3Max = options.loop3Max !== undefined ? options.loop3Max : ITERATION_LIMITS.LOOP3_MAX;
373
+ // SECURITY: Validate iteration limits (CVE-2025-001 fix)
374
+ // Prevent DoS attacks via excessive iteration limits
375
+ if (!Number.isInteger(loop2Max) || loop2Max < 1 || loop2Max > 100) {
376
+ throw new Error(`Invalid loop2Max: ${loop2Max}. Must be integer between 1 and 100`);
377
+ }
378
+ if (!Number.isInteger(loop3Max) || loop3Max < 1 || loop3Max > 100) {
379
+ throw new Error(`Invalid loop3Max: ${loop3Max}. Must be integer between 1 and 100`);
380
+ }
381
+ this.loop2Max = loop2Max;
382
+ this.loop3Max = loop3Max;
383
+ // Current iteration counters
384
+ this.loop2Counter = 0; // Phase-level iterations
385
+ this.loop3Counter = 0; // Swarm-level iterations
386
+ // State tracking
387
+ this.initialized = false;
388
+ this.lastUpdated = null;
389
+ this.escalationHistory = [];
390
+ // Memory persistence
391
+ this.memory = options.memory || null;
392
+ this.memoryNamespace = `cfn-loop/iterations/${this.phaseId}`;
393
+ // Statistics
394
+ this.stats = {
395
+ totalLoop2Iterations: 0,
396
+ totalLoop3Iterations: 0,
397
+ loop3Resets: 0,
398
+ escalations: 0,
399
+ successfulGatePasses: 0
400
+ };
401
+ }
402
+ }
490
403
  /**
491
404
  * Factory function for easy creation
492
405
  * @param {Object} options - Configuration options
493
406
  * @returns {IterationTracker} New IterationTracker instance
494
- */
495
- export function createIterationTracker(options = {}) {
496
- return new IterationTracker(options);
497
- }
498
-
407
+ */ export function createIterationTracker(options = {}) {
408
+ return new IterationTracker(options);
409
+ }
499
410
  /**
500
411
  * Export constants for external use
501
- */
502
- export { ITERATION_LIMITS, ESCALATION_STRATEGIES };
503
-
504
- export default IterationTracker;
412
+ */ export { ITERATION_LIMITS, ESCALATION_STRATEGIES };
413
+ export default IterationTracker;