tapps-agents 3.5.41__py3-none-any.whl → 3.6.0__py3-none-any.whl
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.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2337
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.41.dist-info/RECORD +0 -760
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,331 +1,331 @@
|
|
|
1
|
-
"""
|
|
2
|
-
State Persistence Configuration Management.
|
|
3
|
-
|
|
4
|
-
Epic 12: State Persistence and Resume - Story 12.6
|
|
5
|
-
Manages configuration for state persistence, checkpointing, and cleanup policies.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
from datetime import datetime, timedelta
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
from ..core.config import StatePersistenceConfig, load_config
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
# Configuration version for migration
|
|
20
|
-
CONFIG_VERSION = "1.0"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class StatePersistenceConfigManager:
|
|
24
|
-
"""
|
|
25
|
-
Manages state persistence configuration with validation, migration, and reload.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
def __init__(self, project_root: Path | None = None):
|
|
29
|
-
"""
|
|
30
|
-
Initialize configuration manager.
|
|
31
|
-
|
|
32
|
-
Args:
|
|
33
|
-
project_root: Project root directory
|
|
34
|
-
"""
|
|
35
|
-
self.project_root = project_root or Path.cwd()
|
|
36
|
-
self.config: StatePersistenceConfig | None = None
|
|
37
|
-
self.config_version: str = CONFIG_VERSION
|
|
38
|
-
self._config_file: Path | None = None
|
|
39
|
-
self._file_watcher: Any | None = None # For future file watching implementation
|
|
40
|
-
self._load_configuration() # Ignore return value on init - defaults are OK
|
|
41
|
-
|
|
42
|
-
def _load_configuration(self) -> bool:
|
|
43
|
-
"""Load configuration from project config.
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
True if config was loaded successfully, False if defaults were used or config is invalid
|
|
47
|
-
"""
|
|
48
|
-
try:
|
|
49
|
-
# Look for config file in project root
|
|
50
|
-
config_path = self.project_root / ".tapps-agents" / "config.yaml"
|
|
51
|
-
if config_path.exists():
|
|
52
|
-
project_config = load_config(config_path)
|
|
53
|
-
else:
|
|
54
|
-
project_config = load_config()
|
|
55
|
-
self.config = project_config.workflow.state_persistence
|
|
56
|
-
|
|
57
|
-
# Validate immediately after loading - if invalid, use defaults
|
|
58
|
-
# Note: We validate here to catch invalid values early
|
|
59
|
-
if not self.validate_configuration():
|
|
60
|
-
logger.warning(f"Loaded configuration is invalid (mode: {self.config.checkpoint.mode if self.config else 'None'}), using defaults")
|
|
61
|
-
from ..core.config import StatePersistenceConfig
|
|
62
|
-
self.config = StatePersistenceConfig()
|
|
63
|
-
return False
|
|
64
|
-
|
|
65
|
-
logger.info("State persistence configuration loaded")
|
|
66
|
-
return True
|
|
67
|
-
except Exception as e:
|
|
68
|
-
logger.warning(f"Failed to load state persistence config: {e}, using defaults")
|
|
69
|
-
from ..core.config import StatePersistenceConfig
|
|
70
|
-
self.config = StatePersistenceConfig()
|
|
71
|
-
return False
|
|
72
|
-
|
|
73
|
-
def reload_configuration(self) -> bool:
|
|
74
|
-
"""
|
|
75
|
-
Reload configuration from file.
|
|
76
|
-
|
|
77
|
-
Returns:
|
|
78
|
-
True if reload was successful, False otherwise
|
|
79
|
-
"""
|
|
80
|
-
try:
|
|
81
|
-
old_config = self.config
|
|
82
|
-
config_loaded = self._load_configuration()
|
|
83
|
-
|
|
84
|
-
# If we fell back to defaults or validation failed, that's a failure for reload
|
|
85
|
-
if not config_loaded:
|
|
86
|
-
logger.error("Failed to load or validate configuration, reverting to previous")
|
|
87
|
-
self.config = old_config
|
|
88
|
-
return False
|
|
89
|
-
|
|
90
|
-
logger.info("State persistence configuration reloaded successfully")
|
|
91
|
-
return True
|
|
92
|
-
except Exception as e:
|
|
93
|
-
logger.error(f"Failed to reload configuration: {e}")
|
|
94
|
-
if old_config:
|
|
95
|
-
self.config = old_config
|
|
96
|
-
return False
|
|
97
|
-
|
|
98
|
-
def validate_configuration(self) -> bool:
|
|
99
|
-
"""
|
|
100
|
-
Validate current configuration.
|
|
101
|
-
|
|
102
|
-
Returns:
|
|
103
|
-
True if configuration is valid
|
|
104
|
-
"""
|
|
105
|
-
if self.config is None:
|
|
106
|
-
return False
|
|
107
|
-
|
|
108
|
-
# Validate checkpoint frequency mode
|
|
109
|
-
valid_modes = ["every_step", "every_n_steps", "on_gates", "time_based", "manual"]
|
|
110
|
-
if self.config.checkpoint.mode not in valid_modes:
|
|
111
|
-
logger.error(f"Invalid checkpoint mode: {self.config.checkpoint.mode}")
|
|
112
|
-
return False
|
|
113
|
-
|
|
114
|
-
# Validate storage location is writable
|
|
115
|
-
storage_path = self.project_root / self.config.storage_location
|
|
116
|
-
try:
|
|
117
|
-
storage_path.mkdir(parents=True, exist_ok=True)
|
|
118
|
-
# Test write
|
|
119
|
-
test_file = storage_path / ".test_write"
|
|
120
|
-
test_file.write_text("test")
|
|
121
|
-
test_file.unlink()
|
|
122
|
-
except Exception as e:
|
|
123
|
-
logger.error(f"Storage location is not writable: {e}")
|
|
124
|
-
return False
|
|
125
|
-
|
|
126
|
-
# Validate cleanup schedule
|
|
127
|
-
valid_schedules = ["daily", "weekly", "monthly", "on_startup", "manual"]
|
|
128
|
-
if self.config.cleanup.cleanup_schedule not in valid_schedules:
|
|
129
|
-
logger.error(f"Invalid cleanup schedule: {self.config.cleanup.cleanup_schedule}")
|
|
130
|
-
return False
|
|
131
|
-
|
|
132
|
-
return True
|
|
133
|
-
|
|
134
|
-
def migrate_configuration(self, old_config: dict[str, Any]) -> StatePersistenceConfig:
|
|
135
|
-
"""
|
|
136
|
-
Migrate old configuration format to new format.
|
|
137
|
-
|
|
138
|
-
Args:
|
|
139
|
-
old_config: Old configuration dictionary
|
|
140
|
-
|
|
141
|
-
Returns:
|
|
142
|
-
Migrated StatePersistenceConfig
|
|
143
|
-
"""
|
|
144
|
-
from ..core.config import (
|
|
145
|
-
CheckpointFrequencyConfig,
|
|
146
|
-
StateCleanupPolicyConfig,
|
|
147
|
-
StatePersistenceConfig,
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
# Extract checkpoint config
|
|
151
|
-
checkpoint_mode = old_config.get("checkpoint_frequency", "every_step")
|
|
152
|
-
checkpoint_interval = old_config.get("checkpoint_interval", 1)
|
|
153
|
-
checkpoint_enabled = old_config.get("checkpoint_enabled", True)
|
|
154
|
-
|
|
155
|
-
checkpoint_config = CheckpointFrequencyConfig(
|
|
156
|
-
mode=checkpoint_mode,
|
|
157
|
-
interval=checkpoint_interval,
|
|
158
|
-
enabled=checkpoint_enabled,
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
# Extract cleanup config
|
|
162
|
-
cleanup_enabled = old_config.get("cleanup_enabled", True)
|
|
163
|
-
retention_days = old_config.get("retention_days")
|
|
164
|
-
max_size_mb = old_config.get("max_size_mb")
|
|
165
|
-
cleanup_schedule = old_config.get("cleanup_schedule", "daily")
|
|
166
|
-
keep_latest = old_config.get("keep_latest", 10)
|
|
167
|
-
|
|
168
|
-
cleanup_config = StateCleanupPolicyConfig(
|
|
169
|
-
enabled=cleanup_enabled,
|
|
170
|
-
retention_days=retention_days,
|
|
171
|
-
max_size_mb=max_size_mb,
|
|
172
|
-
cleanup_schedule=cleanup_schedule,
|
|
173
|
-
keep_latest=keep_latest,
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
# Build full config
|
|
177
|
-
return StatePersistenceConfig(
|
|
178
|
-
enabled=old_config.get("persistence_enabled", True),
|
|
179
|
-
storage_location=old_config.get("storage_location", ".tapps-agents/workflow-state"),
|
|
180
|
-
format=old_config.get("format", "json"),
|
|
181
|
-
compression=old_config.get("compression", False),
|
|
182
|
-
checkpoint=checkpoint_config,
|
|
183
|
-
cleanup=cleanup_config,
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
def get_storage_path(self) -> Path:
|
|
187
|
-
"""
|
|
188
|
-
Get the storage path for workflow state.
|
|
189
|
-
|
|
190
|
-
Returns:
|
|
191
|
-
Path to state storage directory
|
|
192
|
-
"""
|
|
193
|
-
if self.config is None:
|
|
194
|
-
path = self.project_root / ".tapps-agents" / "workflow-state"
|
|
195
|
-
else:
|
|
196
|
-
path = self.project_root / self.config.storage_location
|
|
197
|
-
|
|
198
|
-
# Ensure directory exists
|
|
199
|
-
path.mkdir(parents=True, exist_ok=True)
|
|
200
|
-
return path
|
|
201
|
-
|
|
202
|
-
def should_run_cleanup(self) -> bool:
|
|
203
|
-
"""
|
|
204
|
-
Check if cleanup should run based on schedule.
|
|
205
|
-
|
|
206
|
-
Returns:
|
|
207
|
-
True if cleanup should run
|
|
208
|
-
"""
|
|
209
|
-
if not self.config or not self.config.cleanup.enabled:
|
|
210
|
-
return False
|
|
211
|
-
|
|
212
|
-
schedule = self.config.cleanup.cleanup_schedule
|
|
213
|
-
if schedule == "manual":
|
|
214
|
-
return False
|
|
215
|
-
if schedule == "on_startup":
|
|
216
|
-
# This would be checked at startup, not here
|
|
217
|
-
return False
|
|
218
|
-
|
|
219
|
-
# For daily/weekly/monthly, we'd check last cleanup time
|
|
220
|
-
# For now, return True if schedule is not manual/on_startup
|
|
221
|
-
return schedule in ["daily", "weekly", "monthly"]
|
|
222
|
-
|
|
223
|
-
def execute_cleanup(self) -> dict[str, Any]:
|
|
224
|
-
"""
|
|
225
|
-
Execute state cleanup based on configured policies.
|
|
226
|
-
|
|
227
|
-
Returns:
|
|
228
|
-
Dictionary with cleanup results
|
|
229
|
-
"""
|
|
230
|
-
if not self.config or not self.config.cleanup.enabled:
|
|
231
|
-
return {"status": "disabled", "deleted": 0, "freed_mb": 0.0}
|
|
232
|
-
|
|
233
|
-
storage_path = self.get_storage_path()
|
|
234
|
-
if not storage_path.exists():
|
|
235
|
-
return {"status": "no_storage", "deleted": 0, "freed_mb": 0.0}
|
|
236
|
-
|
|
237
|
-
deleted_count = 0
|
|
238
|
-
freed_bytes = 0
|
|
239
|
-
|
|
240
|
-
# Get all state files
|
|
241
|
-
state_files = list(storage_path.glob("*.json")) + list(storage_path.glob("*.json.gz"))
|
|
242
|
-
state_files.sort(key=lambda p: p.stat().st_mtime, reverse=True) # Newest first
|
|
243
|
-
|
|
244
|
-
# Always keep latest N states
|
|
245
|
-
keep_count = self.config.cleanup.keep_latest
|
|
246
|
-
files_to_keep = set(state_files[:keep_count])
|
|
247
|
-
|
|
248
|
-
# Apply retention policy
|
|
249
|
-
if self.config.cleanup.retention_days:
|
|
250
|
-
cutoff_date = datetime.now() - timedelta(days=self.config.cleanup.retention_days)
|
|
251
|
-
for state_file in state_files:
|
|
252
|
-
if state_file in files_to_keep:
|
|
253
|
-
continue
|
|
254
|
-
file_mtime = datetime.fromtimestamp(state_file.stat().st_mtime)
|
|
255
|
-
if file_mtime < cutoff_date:
|
|
256
|
-
try:
|
|
257
|
-
file_size = state_file.stat().st_size
|
|
258
|
-
state_file.unlink()
|
|
259
|
-
deleted_count += 1
|
|
260
|
-
freed_bytes += file_size
|
|
261
|
-
logger.info(f"Deleted old state file: {state_file.name}")
|
|
262
|
-
except Exception as e:
|
|
263
|
-
logger.warning(f"Failed to delete {state_file}: {e}")
|
|
264
|
-
|
|
265
|
-
# Apply size limit policy
|
|
266
|
-
if self.config.cleanup.max_size_mb:
|
|
267
|
-
max_size_bytes = self.config.cleanup.max_size_mb * 1024 * 1024
|
|
268
|
-
total_size = sum(f.stat().st_size for f in state_files if f.exists())
|
|
269
|
-
|
|
270
|
-
# Delete oldest files until under limit
|
|
271
|
-
if total_size > max_size_bytes:
|
|
272
|
-
for state_file in reversed(state_files): # Oldest first
|
|
273
|
-
if state_file in files_to_keep:
|
|
274
|
-
continue
|
|
275
|
-
if total_size <= max_size_bytes:
|
|
276
|
-
break
|
|
277
|
-
try:
|
|
278
|
-
file_size = state_file.stat().st_size
|
|
279
|
-
state_file.unlink()
|
|
280
|
-
deleted_count += 1
|
|
281
|
-
freed_bytes += file_size
|
|
282
|
-
total_size -= file_size
|
|
283
|
-
logger.info(f"Deleted state file to free space: {state_file.name}")
|
|
284
|
-
except Exception as e:
|
|
285
|
-
logger.warning(f"Failed to delete {state_file}: {e}")
|
|
286
|
-
|
|
287
|
-
freed_mb = freed_bytes / (1024 * 1024)
|
|
288
|
-
|
|
289
|
-
result = {
|
|
290
|
-
"status": "success",
|
|
291
|
-
"deleted": deleted_count,
|
|
292
|
-
"freed_mb": round(freed_mb, 2),
|
|
293
|
-
"remaining_files": len([f for f in state_files if f.exists()]),
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
logger.info(
|
|
297
|
-
f"State cleanup completed: deleted {deleted_count} files, "
|
|
298
|
-
f"freed {freed_mb:.2f} MB"
|
|
299
|
-
)
|
|
300
|
-
|
|
301
|
-
return result
|
|
302
|
-
|
|
303
|
-
def get_config_summary(self) -> dict[str, Any]:
|
|
304
|
-
"""
|
|
305
|
-
Get a summary of current configuration.
|
|
306
|
-
|
|
307
|
-
Returns:
|
|
308
|
-
Dictionary with configuration summary
|
|
309
|
-
"""
|
|
310
|
-
if not self.config:
|
|
311
|
-
return {"status": "no_config"}
|
|
312
|
-
|
|
313
|
-
return {
|
|
314
|
-
"persistence_enabled": self.config.enabled,
|
|
315
|
-
"storage_location": str(self.get_storage_path()),
|
|
316
|
-
"format": self.config.format,
|
|
317
|
-
"compression": self.config.compression,
|
|
318
|
-
"checkpoint": {
|
|
319
|
-
"enabled": self.config.checkpoint.enabled,
|
|
320
|
-
"mode": self.config.checkpoint.mode,
|
|
321
|
-
"interval": self.config.checkpoint.interval,
|
|
322
|
-
},
|
|
323
|
-
"cleanup": {
|
|
324
|
-
"enabled": self.config.cleanup.enabled,
|
|
325
|
-
"retention_days": self.config.cleanup.retention_days,
|
|
326
|
-
"max_size_mb": self.config.cleanup.max_size_mb,
|
|
327
|
-
"cleanup_schedule": self.config.cleanup.cleanup_schedule,
|
|
328
|
-
"keep_latest": self.config.cleanup.keep_latest,
|
|
329
|
-
},
|
|
330
|
-
}
|
|
331
|
-
|
|
1
|
+
"""
|
|
2
|
+
State Persistence Configuration Management.
|
|
3
|
+
|
|
4
|
+
Epic 12: State Persistence and Resume - Story 12.6
|
|
5
|
+
Manages configuration for state persistence, checkpointing, and cleanup policies.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from datetime import datetime, timedelta
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from ..core.config import StatePersistenceConfig, load_config
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
# Configuration version for migration
|
|
20
|
+
CONFIG_VERSION = "1.0"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class StatePersistenceConfigManager:
|
|
24
|
+
"""
|
|
25
|
+
Manages state persistence configuration with validation, migration, and reload.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, project_root: Path | None = None):
|
|
29
|
+
"""
|
|
30
|
+
Initialize configuration manager.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
project_root: Project root directory
|
|
34
|
+
"""
|
|
35
|
+
self.project_root = project_root or Path.cwd()
|
|
36
|
+
self.config: StatePersistenceConfig | None = None
|
|
37
|
+
self.config_version: str = CONFIG_VERSION
|
|
38
|
+
self._config_file: Path | None = None
|
|
39
|
+
self._file_watcher: Any | None = None # For future file watching implementation
|
|
40
|
+
self._load_configuration() # Ignore return value on init - defaults are OK
|
|
41
|
+
|
|
42
|
+
def _load_configuration(self) -> bool:
|
|
43
|
+
"""Load configuration from project config.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
True if config was loaded successfully, False if defaults were used or config is invalid
|
|
47
|
+
"""
|
|
48
|
+
try:
|
|
49
|
+
# Look for config file in project root
|
|
50
|
+
config_path = self.project_root / ".tapps-agents" / "config.yaml"
|
|
51
|
+
if config_path.exists():
|
|
52
|
+
project_config = load_config(config_path)
|
|
53
|
+
else:
|
|
54
|
+
project_config = load_config()
|
|
55
|
+
self.config = project_config.workflow.state_persistence
|
|
56
|
+
|
|
57
|
+
# Validate immediately after loading - if invalid, use defaults
|
|
58
|
+
# Note: We validate here to catch invalid values early
|
|
59
|
+
if not self.validate_configuration():
|
|
60
|
+
logger.warning(f"Loaded configuration is invalid (mode: {self.config.checkpoint.mode if self.config else 'None'}), using defaults")
|
|
61
|
+
from ..core.config import StatePersistenceConfig
|
|
62
|
+
self.config = StatePersistenceConfig()
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
logger.info("State persistence configuration loaded")
|
|
66
|
+
return True
|
|
67
|
+
except Exception as e:
|
|
68
|
+
logger.warning(f"Failed to load state persistence config: {e}, using defaults")
|
|
69
|
+
from ..core.config import StatePersistenceConfig
|
|
70
|
+
self.config = StatePersistenceConfig()
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
def reload_configuration(self) -> bool:
|
|
74
|
+
"""
|
|
75
|
+
Reload configuration from file.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
True if reload was successful, False otherwise
|
|
79
|
+
"""
|
|
80
|
+
try:
|
|
81
|
+
old_config = self.config
|
|
82
|
+
config_loaded = self._load_configuration()
|
|
83
|
+
|
|
84
|
+
# If we fell back to defaults or validation failed, that's a failure for reload
|
|
85
|
+
if not config_loaded:
|
|
86
|
+
logger.error("Failed to load or validate configuration, reverting to previous")
|
|
87
|
+
self.config = old_config
|
|
88
|
+
return False
|
|
89
|
+
|
|
90
|
+
logger.info("State persistence configuration reloaded successfully")
|
|
91
|
+
return True
|
|
92
|
+
except Exception as e:
|
|
93
|
+
logger.error(f"Failed to reload configuration: {e}")
|
|
94
|
+
if old_config:
|
|
95
|
+
self.config = old_config
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
def validate_configuration(self) -> bool:
|
|
99
|
+
"""
|
|
100
|
+
Validate current configuration.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
True if configuration is valid
|
|
104
|
+
"""
|
|
105
|
+
if self.config is None:
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
# Validate checkpoint frequency mode
|
|
109
|
+
valid_modes = ["every_step", "every_n_steps", "on_gates", "time_based", "manual"]
|
|
110
|
+
if self.config.checkpoint.mode not in valid_modes:
|
|
111
|
+
logger.error(f"Invalid checkpoint mode: {self.config.checkpoint.mode}")
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
# Validate storage location is writable
|
|
115
|
+
storage_path = self.project_root / self.config.storage_location
|
|
116
|
+
try:
|
|
117
|
+
storage_path.mkdir(parents=True, exist_ok=True)
|
|
118
|
+
# Test write
|
|
119
|
+
test_file = storage_path / ".test_write"
|
|
120
|
+
test_file.write_text("test")
|
|
121
|
+
test_file.unlink()
|
|
122
|
+
except Exception as e:
|
|
123
|
+
logger.error(f"Storage location is not writable: {e}")
|
|
124
|
+
return False
|
|
125
|
+
|
|
126
|
+
# Validate cleanup schedule
|
|
127
|
+
valid_schedules = ["daily", "weekly", "monthly", "on_startup", "manual"]
|
|
128
|
+
if self.config.cleanup.cleanup_schedule not in valid_schedules:
|
|
129
|
+
logger.error(f"Invalid cleanup schedule: {self.config.cleanup.cleanup_schedule}")
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
return True
|
|
133
|
+
|
|
134
|
+
def migrate_configuration(self, old_config: dict[str, Any]) -> StatePersistenceConfig:
|
|
135
|
+
"""
|
|
136
|
+
Migrate old configuration format to new format.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
old_config: Old configuration dictionary
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
Migrated StatePersistenceConfig
|
|
143
|
+
"""
|
|
144
|
+
from ..core.config import (
|
|
145
|
+
CheckpointFrequencyConfig,
|
|
146
|
+
StateCleanupPolicyConfig,
|
|
147
|
+
StatePersistenceConfig,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Extract checkpoint config
|
|
151
|
+
checkpoint_mode = old_config.get("checkpoint_frequency", "every_step")
|
|
152
|
+
checkpoint_interval = old_config.get("checkpoint_interval", 1)
|
|
153
|
+
checkpoint_enabled = old_config.get("checkpoint_enabled", True)
|
|
154
|
+
|
|
155
|
+
checkpoint_config = CheckpointFrequencyConfig(
|
|
156
|
+
mode=checkpoint_mode,
|
|
157
|
+
interval=checkpoint_interval,
|
|
158
|
+
enabled=checkpoint_enabled,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Extract cleanup config
|
|
162
|
+
cleanup_enabled = old_config.get("cleanup_enabled", True)
|
|
163
|
+
retention_days = old_config.get("retention_days")
|
|
164
|
+
max_size_mb = old_config.get("max_size_mb")
|
|
165
|
+
cleanup_schedule = old_config.get("cleanup_schedule", "daily")
|
|
166
|
+
keep_latest = old_config.get("keep_latest", 10)
|
|
167
|
+
|
|
168
|
+
cleanup_config = StateCleanupPolicyConfig(
|
|
169
|
+
enabled=cleanup_enabled,
|
|
170
|
+
retention_days=retention_days,
|
|
171
|
+
max_size_mb=max_size_mb,
|
|
172
|
+
cleanup_schedule=cleanup_schedule,
|
|
173
|
+
keep_latest=keep_latest,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
# Build full config
|
|
177
|
+
return StatePersistenceConfig(
|
|
178
|
+
enabled=old_config.get("persistence_enabled", True),
|
|
179
|
+
storage_location=old_config.get("storage_location", ".tapps-agents/workflow-state"),
|
|
180
|
+
format=old_config.get("format", "json"),
|
|
181
|
+
compression=old_config.get("compression", False),
|
|
182
|
+
checkpoint=checkpoint_config,
|
|
183
|
+
cleanup=cleanup_config,
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
def get_storage_path(self) -> Path:
|
|
187
|
+
"""
|
|
188
|
+
Get the storage path for workflow state.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Path to state storage directory
|
|
192
|
+
"""
|
|
193
|
+
if self.config is None:
|
|
194
|
+
path = self.project_root / ".tapps-agents" / "workflow-state"
|
|
195
|
+
else:
|
|
196
|
+
path = self.project_root / self.config.storage_location
|
|
197
|
+
|
|
198
|
+
# Ensure directory exists
|
|
199
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
200
|
+
return path
|
|
201
|
+
|
|
202
|
+
def should_run_cleanup(self) -> bool:
|
|
203
|
+
"""
|
|
204
|
+
Check if cleanup should run based on schedule.
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
True if cleanup should run
|
|
208
|
+
"""
|
|
209
|
+
if not self.config or not self.config.cleanup.enabled:
|
|
210
|
+
return False
|
|
211
|
+
|
|
212
|
+
schedule = self.config.cleanup.cleanup_schedule
|
|
213
|
+
if schedule == "manual":
|
|
214
|
+
return False
|
|
215
|
+
if schedule == "on_startup":
|
|
216
|
+
# This would be checked at startup, not here
|
|
217
|
+
return False
|
|
218
|
+
|
|
219
|
+
# For daily/weekly/monthly, we'd check last cleanup time
|
|
220
|
+
# For now, return True if schedule is not manual/on_startup
|
|
221
|
+
return schedule in ["daily", "weekly", "monthly"]
|
|
222
|
+
|
|
223
|
+
def execute_cleanup(self) -> dict[str, Any]:
|
|
224
|
+
"""
|
|
225
|
+
Execute state cleanup based on configured policies.
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
Dictionary with cleanup results
|
|
229
|
+
"""
|
|
230
|
+
if not self.config or not self.config.cleanup.enabled:
|
|
231
|
+
return {"status": "disabled", "deleted": 0, "freed_mb": 0.0}
|
|
232
|
+
|
|
233
|
+
storage_path = self.get_storage_path()
|
|
234
|
+
if not storage_path.exists():
|
|
235
|
+
return {"status": "no_storage", "deleted": 0, "freed_mb": 0.0}
|
|
236
|
+
|
|
237
|
+
deleted_count = 0
|
|
238
|
+
freed_bytes = 0
|
|
239
|
+
|
|
240
|
+
# Get all state files
|
|
241
|
+
state_files = list(storage_path.glob("*.json")) + list(storage_path.glob("*.json.gz"))
|
|
242
|
+
state_files.sort(key=lambda p: p.stat().st_mtime, reverse=True) # Newest first
|
|
243
|
+
|
|
244
|
+
# Always keep latest N states
|
|
245
|
+
keep_count = self.config.cleanup.keep_latest
|
|
246
|
+
files_to_keep = set(state_files[:keep_count])
|
|
247
|
+
|
|
248
|
+
# Apply retention policy
|
|
249
|
+
if self.config.cleanup.retention_days:
|
|
250
|
+
cutoff_date = datetime.now() - timedelta(days=self.config.cleanup.retention_days)
|
|
251
|
+
for state_file in state_files:
|
|
252
|
+
if state_file in files_to_keep:
|
|
253
|
+
continue
|
|
254
|
+
file_mtime = datetime.fromtimestamp(state_file.stat().st_mtime)
|
|
255
|
+
if file_mtime < cutoff_date:
|
|
256
|
+
try:
|
|
257
|
+
file_size = state_file.stat().st_size
|
|
258
|
+
state_file.unlink()
|
|
259
|
+
deleted_count += 1
|
|
260
|
+
freed_bytes += file_size
|
|
261
|
+
logger.info(f"Deleted old state file: {state_file.name}")
|
|
262
|
+
except Exception as e:
|
|
263
|
+
logger.warning(f"Failed to delete {state_file}: {e}")
|
|
264
|
+
|
|
265
|
+
# Apply size limit policy
|
|
266
|
+
if self.config.cleanup.max_size_mb:
|
|
267
|
+
max_size_bytes = self.config.cleanup.max_size_mb * 1024 * 1024
|
|
268
|
+
total_size = sum(f.stat().st_size for f in state_files if f.exists())
|
|
269
|
+
|
|
270
|
+
# Delete oldest files until under limit
|
|
271
|
+
if total_size > max_size_bytes:
|
|
272
|
+
for state_file in reversed(state_files): # Oldest first
|
|
273
|
+
if state_file in files_to_keep:
|
|
274
|
+
continue
|
|
275
|
+
if total_size <= max_size_bytes:
|
|
276
|
+
break
|
|
277
|
+
try:
|
|
278
|
+
file_size = state_file.stat().st_size
|
|
279
|
+
state_file.unlink()
|
|
280
|
+
deleted_count += 1
|
|
281
|
+
freed_bytes += file_size
|
|
282
|
+
total_size -= file_size
|
|
283
|
+
logger.info(f"Deleted state file to free space: {state_file.name}")
|
|
284
|
+
except Exception as e:
|
|
285
|
+
logger.warning(f"Failed to delete {state_file}: {e}")
|
|
286
|
+
|
|
287
|
+
freed_mb = freed_bytes / (1024 * 1024)
|
|
288
|
+
|
|
289
|
+
result = {
|
|
290
|
+
"status": "success",
|
|
291
|
+
"deleted": deleted_count,
|
|
292
|
+
"freed_mb": round(freed_mb, 2),
|
|
293
|
+
"remaining_files": len([f for f in state_files if f.exists()]),
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
logger.info(
|
|
297
|
+
f"State cleanup completed: deleted {deleted_count} files, "
|
|
298
|
+
f"freed {freed_mb:.2f} MB"
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
return result
|
|
302
|
+
|
|
303
|
+
def get_config_summary(self) -> dict[str, Any]:
|
|
304
|
+
"""
|
|
305
|
+
Get a summary of current configuration.
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
Dictionary with configuration summary
|
|
309
|
+
"""
|
|
310
|
+
if not self.config:
|
|
311
|
+
return {"status": "no_config"}
|
|
312
|
+
|
|
313
|
+
return {
|
|
314
|
+
"persistence_enabled": self.config.enabled,
|
|
315
|
+
"storage_location": str(self.get_storage_path()),
|
|
316
|
+
"format": self.config.format,
|
|
317
|
+
"compression": self.config.compression,
|
|
318
|
+
"checkpoint": {
|
|
319
|
+
"enabled": self.config.checkpoint.enabled,
|
|
320
|
+
"mode": self.config.checkpoint.mode,
|
|
321
|
+
"interval": self.config.checkpoint.interval,
|
|
322
|
+
},
|
|
323
|
+
"cleanup": {
|
|
324
|
+
"enabled": self.config.cleanup.enabled,
|
|
325
|
+
"retention_days": self.config.cleanup.retention_days,
|
|
326
|
+
"max_size_mb": self.config.cleanup.max_size_mb,
|
|
327
|
+
"cleanup_schedule": self.config.cleanup.cleanup_schedule,
|
|
328
|
+
"keep_latest": self.config.cleanup.keep_latest,
|
|
329
|
+
},
|
|
330
|
+
}
|
|
331
|
+
|