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.
- package/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- 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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
};
|
|
19
|
-
|
|
11
|
+
*/ const ITERATION_LIMITS = {
|
|
12
|
+
LOOP2_MAX: 5,
|
|
13
|
+
LOOP3_MAX: 10
|
|
14
|
+
};
|
|
20
15
|
/**
|
|
21
16
|
* Escalation strategies
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
}
|
|
357
|
-
|
|
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
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
398
|
-
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
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
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
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
|
-
|
|
496
|
-
|
|
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
|
|
503
|
-
|
|
504
|
-
export default IterationTracker;
|
|
412
|
+
*/ export { ITERATION_LIMITS, ESCALATION_STRATEGIES };
|
|
413
|
+
export default IterationTracker;
|