tapps-agents 3.5.40__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 -219
- 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 -2196
- 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 -111
- 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.40.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.40.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.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,449 +1,449 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Resource-Aware Executor for Long-Duration Operations
|
|
3
|
-
|
|
4
|
-
Executes tasks with resource awareness, auto-pause, and graceful degradation.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import logging
|
|
8
|
-
import threading
|
|
9
|
-
import time
|
|
10
|
-
from collections.abc import Callable
|
|
11
|
-
from dataclasses import dataclass, field
|
|
12
|
-
from datetime import UTC, datetime
|
|
13
|
-
from enum import Enum
|
|
14
|
-
from typing import Any
|
|
15
|
-
|
|
16
|
-
from .hardware_profiler import HardwareProfile, HardwareProfiler
|
|
17
|
-
from .resource_monitor import ResourceMetrics, ResourceMonitor
|
|
18
|
-
from .session_manager import SessionManager, SessionState
|
|
19
|
-
|
|
20
|
-
logger = logging.getLogger(__name__)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class ExecutionMode(Enum):
|
|
24
|
-
"""Execution mode based on resource availability."""
|
|
25
|
-
|
|
26
|
-
NORMAL = "normal"
|
|
27
|
-
DEGRADED = "degraded"
|
|
28
|
-
PAUSED = "paused"
|
|
29
|
-
SUSPENDED = "suspended"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@dataclass
|
|
33
|
-
class ExecutionConfig:
|
|
34
|
-
"""Configuration for resource-aware execution."""
|
|
35
|
-
|
|
36
|
-
# Monitoring
|
|
37
|
-
monitor_interval: float = 30.0 # seconds
|
|
38
|
-
cpu_threshold: float = 80.0 # %
|
|
39
|
-
memory_threshold: float = 85.0 # %
|
|
40
|
-
disk_threshold: float = 90.0 # %
|
|
41
|
-
|
|
42
|
-
# Auto-pause
|
|
43
|
-
auto_pause_enabled: bool = True
|
|
44
|
-
pause_cpu_threshold: float = 90.0 # %
|
|
45
|
-
pause_memory_threshold: float = 95.0 # %
|
|
46
|
-
pause_disk_threshold: float = 95.0 # %
|
|
47
|
-
|
|
48
|
-
# Graceful degradation
|
|
49
|
-
degradation_enabled: bool = True
|
|
50
|
-
degrade_cpu_threshold: float = 70.0 # %
|
|
51
|
-
degrade_memory_threshold: float = 75.0 # %
|
|
52
|
-
|
|
53
|
-
# Recovery
|
|
54
|
-
recovery_check_interval: float = 60.0 # seconds
|
|
55
|
-
recovery_cpu_threshold: float = 50.0 # %
|
|
56
|
-
recovery_memory_threshold: float = 60.0 # %
|
|
57
|
-
|
|
58
|
-
# Hardware-aware adjustments
|
|
59
|
-
hardware_profile: HardwareProfile | None = None
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
@dataclass
|
|
63
|
-
class ExecutionState:
|
|
64
|
-
"""Current execution state."""
|
|
65
|
-
|
|
66
|
-
mode: ExecutionMode = ExecutionMode.NORMAL
|
|
67
|
-
start_time: datetime = field(default_factory=lambda: datetime.now(UTC))
|
|
68
|
-
last_check: datetime = field(default_factory=lambda: datetime.now(UTC))
|
|
69
|
-
pause_count: int = 0
|
|
70
|
-
degradation_count: int = 0
|
|
71
|
-
resource_history: list[ResourceMetrics] = field(default_factory=list)
|
|
72
|
-
alerts: list[str] = field(default_factory=list)
|
|
73
|
-
|
|
74
|
-
def add_alert(self, message: str):
|
|
75
|
-
"""Add an alert message."""
|
|
76
|
-
self.alerts.append(f"{datetime.now(UTC).isoformat()}: {message}")
|
|
77
|
-
if len(self.alerts) > 100: # Keep last 100 alerts
|
|
78
|
-
self.alerts = self.alerts[-100:]
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class AutoPause:
|
|
82
|
-
"""Automatic pause mechanism based on resource constraints."""
|
|
83
|
-
|
|
84
|
-
def __init__(self, config: ExecutionConfig):
|
|
85
|
-
"""
|
|
86
|
-
Initialize auto-pause.
|
|
87
|
-
|
|
88
|
-
Args:
|
|
89
|
-
config: Execution configuration
|
|
90
|
-
"""
|
|
91
|
-
self.config = config
|
|
92
|
-
self.is_paused = False
|
|
93
|
-
self.pause_reason: str | None = None
|
|
94
|
-
|
|
95
|
-
def should_pause(self, metrics: ResourceMetrics) -> tuple[bool, str | None]:
|
|
96
|
-
"""
|
|
97
|
-
Check if execution should be paused.
|
|
98
|
-
|
|
99
|
-
Args:
|
|
100
|
-
metrics: Current resource metrics
|
|
101
|
-
|
|
102
|
-
Returns:
|
|
103
|
-
Tuple of (should_pause, reason)
|
|
104
|
-
"""
|
|
105
|
-
if not self.config.auto_pause_enabled:
|
|
106
|
-
return False, None
|
|
107
|
-
|
|
108
|
-
# Check CPU
|
|
109
|
-
if metrics.cpu_percent > self.config.pause_cpu_threshold:
|
|
110
|
-
return (
|
|
111
|
-
True,
|
|
112
|
-
f"CPU usage {metrics.cpu_percent:.1f}% exceeds threshold {self.config.pause_cpu_threshold}%",
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
# Check memory
|
|
116
|
-
if metrics.memory_percent > self.config.pause_memory_threshold:
|
|
117
|
-
return (
|
|
118
|
-
True,
|
|
119
|
-
f"Memory usage {metrics.memory_percent:.1f}% exceeds threshold {self.config.pause_memory_threshold}%",
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
# Check disk
|
|
123
|
-
if metrics.disk_percent > self.config.pause_disk_threshold:
|
|
124
|
-
return (
|
|
125
|
-
True,
|
|
126
|
-
f"Disk usage {metrics.disk_percent:.1f}% exceeds threshold {self.config.pause_disk_threshold}%",
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
return False, None
|
|
130
|
-
|
|
131
|
-
def should_resume(self, metrics: ResourceMetrics) -> bool:
|
|
132
|
-
"""
|
|
133
|
-
Check if execution should resume.
|
|
134
|
-
|
|
135
|
-
Args:
|
|
136
|
-
metrics: Current resource metrics
|
|
137
|
-
|
|
138
|
-
Returns:
|
|
139
|
-
True if should resume
|
|
140
|
-
"""
|
|
141
|
-
if not self.is_paused:
|
|
142
|
-
return False
|
|
143
|
-
|
|
144
|
-
# Resume if resources are below recovery thresholds
|
|
145
|
-
return (
|
|
146
|
-
metrics.cpu_percent < self.config.recovery_cpu_threshold
|
|
147
|
-
and metrics.memory_percent < self.config.recovery_memory_threshold
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
class ResourceOptimizer:
|
|
152
|
-
"""Optimizes resource usage based on current conditions."""
|
|
153
|
-
|
|
154
|
-
def __init__(self, config: ExecutionConfig):
|
|
155
|
-
"""
|
|
156
|
-
Initialize resource optimizer.
|
|
157
|
-
|
|
158
|
-
Args:
|
|
159
|
-
config: Execution configuration
|
|
160
|
-
"""
|
|
161
|
-
self.config = config
|
|
162
|
-
self.hardware_profiler = HardwareProfiler()
|
|
163
|
-
|
|
164
|
-
def get_optimization_suggestions(self, metrics: ResourceMetrics) -> list[str]:
|
|
165
|
-
"""
|
|
166
|
-
Get optimization suggestions based on current metrics.
|
|
167
|
-
|
|
168
|
-
Args:
|
|
169
|
-
metrics: Current resource metrics
|
|
170
|
-
|
|
171
|
-
Returns:
|
|
172
|
-
List of optimization suggestions
|
|
173
|
-
"""
|
|
174
|
-
suggestions = []
|
|
175
|
-
|
|
176
|
-
# CPU optimization
|
|
177
|
-
if metrics.cpu_percent > 60:
|
|
178
|
-
suggestions.append("Reduce concurrent operations")
|
|
179
|
-
suggestions.append("Increase checkpoint intervals")
|
|
180
|
-
|
|
181
|
-
# Memory optimization
|
|
182
|
-
if metrics.memory_percent > 70:
|
|
183
|
-
suggestions.append("Clear unused caches")
|
|
184
|
-
suggestions.append("Reduce in-memory data structures")
|
|
185
|
-
suggestions.append("Enable compression")
|
|
186
|
-
|
|
187
|
-
# Disk optimization
|
|
188
|
-
if metrics.disk_percent > 80:
|
|
189
|
-
suggestions.append("Clean up temporary files")
|
|
190
|
-
suggestions.append("Reduce cache sizes")
|
|
191
|
-
suggestions.append("Archive old checkpoints")
|
|
192
|
-
|
|
193
|
-
return suggestions
|
|
194
|
-
|
|
195
|
-
def should_degrade(self, metrics: ResourceMetrics) -> tuple[bool, str | None]:
|
|
196
|
-
"""
|
|
197
|
-
Check if execution should degrade.
|
|
198
|
-
|
|
199
|
-
Args:
|
|
200
|
-
metrics: Current resource metrics
|
|
201
|
-
|
|
202
|
-
Returns:
|
|
203
|
-
Tuple of (should_degrade, reason)
|
|
204
|
-
"""
|
|
205
|
-
if not self.config.degradation_enabled:
|
|
206
|
-
return False, None
|
|
207
|
-
|
|
208
|
-
# Check CPU
|
|
209
|
-
if metrics.cpu_percent > self.config.degrade_cpu_threshold:
|
|
210
|
-
return (
|
|
211
|
-
True,
|
|
212
|
-
f"CPU usage {metrics.cpu_percent:.1f}% exceeds degradation threshold {self.config.degrade_cpu_threshold}%",
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
# Check memory
|
|
216
|
-
if metrics.memory_percent > self.config.degrade_memory_threshold:
|
|
217
|
-
return (
|
|
218
|
-
True,
|
|
219
|
-
f"Memory usage {metrics.memory_percent:.1f}% exceeds degradation threshold {self.config.degrade_memory_threshold}%",
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
return False, None
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
class ResourceAwareExecutor:
|
|
226
|
-
"""Executes tasks with resource awareness and auto-pause."""
|
|
227
|
-
|
|
228
|
-
def __init__(
|
|
229
|
-
self,
|
|
230
|
-
session_manager: SessionManager | None = None,
|
|
231
|
-
config: ExecutionConfig | None = None,
|
|
232
|
-
):
|
|
233
|
-
"""
|
|
234
|
-
Initialize resource-aware executor.
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
session_manager: Optional session manager for session integration
|
|
238
|
-
config: Execution configuration
|
|
239
|
-
"""
|
|
240
|
-
self.session_manager = session_manager
|
|
241
|
-
self.config = config or ExecutionConfig()
|
|
242
|
-
self.resource_monitor = ResourceMonitor(
|
|
243
|
-
cpu_threshold=self.config.cpu_threshold,
|
|
244
|
-
memory_threshold=self.config.memory_threshold,
|
|
245
|
-
disk_threshold=self.config.disk_threshold,
|
|
246
|
-
)
|
|
247
|
-
self.auto_pause = AutoPause(self.config)
|
|
248
|
-
self.optimizer = ResourceOptimizer(self.config)
|
|
249
|
-
self.execution_state = ExecutionState()
|
|
250
|
-
|
|
251
|
-
# Hardware-aware adjustments
|
|
252
|
-
if not self.config.hardware_profile:
|
|
253
|
-
hardware_profiler = HardwareProfiler()
|
|
254
|
-
self.config.hardware_profile = hardware_profiler.detect_profile()
|
|
255
|
-
|
|
256
|
-
self._apply_hardware_profile()
|
|
257
|
-
|
|
258
|
-
# Monitoring thread
|
|
259
|
-
self._monitoring_thread: threading.Thread | None = None
|
|
260
|
-
self._monitoring_active = False
|
|
261
|
-
self._lock = threading.Lock()
|
|
262
|
-
|
|
263
|
-
def _apply_hardware_profile(self):
|
|
264
|
-
"""No-op: hardware taxonomy removed; use ExecutionConfig defaults."""
|
|
265
|
-
|
|
266
|
-
def start_monitoring(self):
|
|
267
|
-
"""Start continuous resource monitoring."""
|
|
268
|
-
if self._monitoring_active:
|
|
269
|
-
return
|
|
270
|
-
|
|
271
|
-
self._monitoring_active = True
|
|
272
|
-
self._monitoring_thread = threading.Thread(
|
|
273
|
-
target=self._monitoring_loop, daemon=True
|
|
274
|
-
)
|
|
275
|
-
self._monitoring_thread.start()
|
|
276
|
-
logger.info("Resource monitoring started")
|
|
277
|
-
|
|
278
|
-
def stop_monitoring(self):
|
|
279
|
-
"""Stop resource monitoring."""
|
|
280
|
-
self._monitoring_active = False
|
|
281
|
-
if self._monitoring_thread:
|
|
282
|
-
self._monitoring_thread.join(timeout=5.0)
|
|
283
|
-
logger.info("Resource monitoring stopped")
|
|
284
|
-
|
|
285
|
-
def _monitoring_loop(self):
|
|
286
|
-
"""Continuous monitoring loop."""
|
|
287
|
-
while self._monitoring_active:
|
|
288
|
-
try:
|
|
289
|
-
metrics = self.resource_monitor.get_current_metrics()
|
|
290
|
-
self._check_resources(metrics)
|
|
291
|
-
time.sleep(self.config.monitor_interval)
|
|
292
|
-
except Exception as e:
|
|
293
|
-
logger.error(f"Error in monitoring loop: {e}", exc_info=True)
|
|
294
|
-
time.sleep(self.config.monitor_interval)
|
|
295
|
-
|
|
296
|
-
def _check_resources(self, metrics: ResourceMetrics):
|
|
297
|
-
"""Check resources and adjust execution mode."""
|
|
298
|
-
with self._lock:
|
|
299
|
-
self.execution_state.last_check = datetime.now(UTC)
|
|
300
|
-
self.execution_state.resource_history.append(metrics)
|
|
301
|
-
if len(self.execution_state.resource_history) > 100:
|
|
302
|
-
self.execution_state.resource_history = (
|
|
303
|
-
self.execution_state.resource_history[-100:]
|
|
304
|
-
)
|
|
305
|
-
|
|
306
|
-
# Check for auto-pause
|
|
307
|
-
should_pause, pause_reason = self.auto_pause.should_pause(metrics)
|
|
308
|
-
if should_pause and not self.auto_pause.is_paused:
|
|
309
|
-
self._pause_execution(pause_reason or "Resource limits exceeded")
|
|
310
|
-
elif self.auto_pause.should_resume(metrics) and self.auto_pause.is_paused:
|
|
311
|
-
self._resume_execution()
|
|
312
|
-
|
|
313
|
-
# Check for degradation
|
|
314
|
-
should_degrade, degrade_reason = self.optimizer.should_degrade(metrics)
|
|
315
|
-
if should_degrade and self.execution_state.mode == ExecutionMode.NORMAL:
|
|
316
|
-
self._degrade_execution(degrade_reason or "Resource pressure detected")
|
|
317
|
-
elif (
|
|
318
|
-
not should_degrade
|
|
319
|
-
and self.execution_state.mode == ExecutionMode.DEGRADED
|
|
320
|
-
):
|
|
321
|
-
self._restore_normal_execution()
|
|
322
|
-
|
|
323
|
-
def _pause_execution(self, reason: str):
|
|
324
|
-
"""Pause execution due to resource constraints."""
|
|
325
|
-
logger.warning(f"Pausing execution: {reason}")
|
|
326
|
-
self.auto_pause.is_paused = True
|
|
327
|
-
self.auto_pause.pause_reason = reason
|
|
328
|
-
self.execution_state.mode = ExecutionMode.PAUSED
|
|
329
|
-
self.execution_state.pause_count += 1
|
|
330
|
-
self.execution_state.add_alert(f"PAUSED: {reason}")
|
|
331
|
-
|
|
332
|
-
# Pause session if available
|
|
333
|
-
if self.session_manager:
|
|
334
|
-
try:
|
|
335
|
-
sessions = self.session_manager.get_active_sessions()
|
|
336
|
-
for session in sessions:
|
|
337
|
-
self.session_manager.pause_session(session.session_id, reason)
|
|
338
|
-
except Exception as e:
|
|
339
|
-
logger.error(f"Error pausing sessions: {e}", exc_info=True)
|
|
340
|
-
|
|
341
|
-
def _resume_execution(self, reason: str | None = None):
|
|
342
|
-
"""Resume execution after resource recovery."""
|
|
343
|
-
resume_reason = reason or "Resources recovered"
|
|
344
|
-
logger.info(f"Resuming execution: {resume_reason}")
|
|
345
|
-
self.auto_pause.is_paused = False
|
|
346
|
-
self.auto_pause.pause_reason = None
|
|
347
|
-
self.execution_state.mode = ExecutionMode.NORMAL
|
|
348
|
-
self.execution_state.add_alert(f"RESUMED: {resume_reason}")
|
|
349
|
-
|
|
350
|
-
# Resume session if available
|
|
351
|
-
if self.session_manager:
|
|
352
|
-
try:
|
|
353
|
-
sessions = self.session_manager.list_sessions(state=SessionState.PAUSED)
|
|
354
|
-
for session in sessions:
|
|
355
|
-
self.session_manager.resume_session(session.session_id)
|
|
356
|
-
except Exception as e:
|
|
357
|
-
logger.error(f"Error resuming sessions: {e}", exc_info=True)
|
|
358
|
-
|
|
359
|
-
def _degrade_execution(self, reason: str):
|
|
360
|
-
"""Degrade execution quality due to resource constraints."""
|
|
361
|
-
logger.warning(f"Degrading execution: {reason}")
|
|
362
|
-
self.execution_state.mode = ExecutionMode.DEGRADED
|
|
363
|
-
self.execution_state.degradation_count += 1
|
|
364
|
-
self.execution_state.add_alert(f"DEGRADED: {reason}")
|
|
365
|
-
|
|
366
|
-
def _restore_normal_execution(self):
|
|
367
|
-
"""Restore normal execution mode."""
|
|
368
|
-
logger.info("Restoring normal execution mode")
|
|
369
|
-
self.execution_state.mode = ExecutionMode.NORMAL
|
|
370
|
-
self.execution_state.add_alert("RESTORED: Normal execution mode")
|
|
371
|
-
|
|
372
|
-
def execute(
|
|
373
|
-
self,
|
|
374
|
-
task: Callable[[], Any],
|
|
375
|
-
task_name: str = "task",
|
|
376
|
-
check_resources: bool = True,
|
|
377
|
-
) -> Any:
|
|
378
|
-
"""
|
|
379
|
-
Execute a task with resource awareness.
|
|
380
|
-
|
|
381
|
-
Args:
|
|
382
|
-
task: Task function to execute
|
|
383
|
-
task_name: Name of the task
|
|
384
|
-
check_resources: Whether to check resources before execution
|
|
385
|
-
|
|
386
|
-
Returns:
|
|
387
|
-
Task result
|
|
388
|
-
|
|
389
|
-
Raises:
|
|
390
|
-
RuntimeError: If execution is paused or suspended
|
|
391
|
-
"""
|
|
392
|
-
# Check if execution is paused
|
|
393
|
-
if self.auto_pause.is_paused:
|
|
394
|
-
raise RuntimeError(
|
|
395
|
-
f"Execution is paused: {self.auto_pause.pause_reason}. "
|
|
396
|
-
"Wait for resources to recover or manually resume."
|
|
397
|
-
)
|
|
398
|
-
|
|
399
|
-
# Check resources before execution
|
|
400
|
-
if check_resources:
|
|
401
|
-
metrics = self.resource_monitor.get_current_metrics()
|
|
402
|
-
should_pause, pause_reason = self.auto_pause.should_pause(metrics)
|
|
403
|
-
if should_pause:
|
|
404
|
-
self._pause_execution(pause_reason or "Resource limits exceeded")
|
|
405
|
-
raise RuntimeError(f"Execution paused: {pause_reason}")
|
|
406
|
-
|
|
407
|
-
# Execute task
|
|
408
|
-
try:
|
|
409
|
-
logger.info(
|
|
410
|
-
f"Executing task: {task_name} (mode: {self.execution_state.mode.value})"
|
|
411
|
-
)
|
|
412
|
-
result = task()
|
|
413
|
-
return result
|
|
414
|
-
except Exception as e:
|
|
415
|
-
logger.error(f"Task execution failed: {e}", exc_info=True)
|
|
416
|
-
raise
|
|
417
|
-
|
|
418
|
-
def get_execution_state(self) -> ExecutionState:
|
|
419
|
-
"""Get current execution state."""
|
|
420
|
-
with self._lock:
|
|
421
|
-
return self.execution_state
|
|
422
|
-
|
|
423
|
-
def get_current_metrics(self) -> ResourceMetrics:
|
|
424
|
-
"""Get current resource metrics."""
|
|
425
|
-
return self.resource_monitor.get_current_metrics()
|
|
426
|
-
|
|
427
|
-
def get_optimization_suggestions(self) -> list[str]:
|
|
428
|
-
"""Get optimization suggestions based on current metrics."""
|
|
429
|
-
metrics = self.resource_monitor.get_current_metrics()
|
|
430
|
-
return self.optimizer.get_optimization_suggestions(metrics)
|
|
431
|
-
|
|
432
|
-
def force_resume(self):
|
|
433
|
-
"""Force resume execution (use with caution)."""
|
|
434
|
-
logger.warning("Force resuming execution")
|
|
435
|
-
self._resume_execution("Force resume requested")
|
|
436
|
-
|
|
437
|
-
def force_pause(self, reason: str = "Manual pause"):
|
|
438
|
-
"""Force pause execution."""
|
|
439
|
-
logger.warning(f"Force pausing execution: {reason}")
|
|
440
|
-
self._pause_execution(reason)
|
|
441
|
-
|
|
442
|
-
def __enter__(self):
|
|
443
|
-
"""Context manager entry."""
|
|
444
|
-
self.start_monitoring()
|
|
445
|
-
return self
|
|
446
|
-
|
|
447
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
448
|
-
"""Context manager exit."""
|
|
449
|
-
self.stop_monitoring()
|
|
1
|
+
"""
|
|
2
|
+
Resource-Aware Executor for Long-Duration Operations
|
|
3
|
+
|
|
4
|
+
Executes tasks with resource awareness, auto-pause, and graceful degradation.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import threading
|
|
9
|
+
import time
|
|
10
|
+
from collections.abc import Callable
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from datetime import UTC, datetime
|
|
13
|
+
from enum import Enum
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from .hardware_profiler import HardwareProfile, HardwareProfiler
|
|
17
|
+
from .resource_monitor import ResourceMetrics, ResourceMonitor
|
|
18
|
+
from .session_manager import SessionManager, SessionState
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ExecutionMode(Enum):
|
|
24
|
+
"""Execution mode based on resource availability."""
|
|
25
|
+
|
|
26
|
+
NORMAL = "normal"
|
|
27
|
+
DEGRADED = "degraded"
|
|
28
|
+
PAUSED = "paused"
|
|
29
|
+
SUSPENDED = "suspended"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class ExecutionConfig:
|
|
34
|
+
"""Configuration for resource-aware execution."""
|
|
35
|
+
|
|
36
|
+
# Monitoring
|
|
37
|
+
monitor_interval: float = 30.0 # seconds
|
|
38
|
+
cpu_threshold: float = 80.0 # %
|
|
39
|
+
memory_threshold: float = 85.0 # %
|
|
40
|
+
disk_threshold: float = 90.0 # %
|
|
41
|
+
|
|
42
|
+
# Auto-pause
|
|
43
|
+
auto_pause_enabled: bool = True
|
|
44
|
+
pause_cpu_threshold: float = 90.0 # %
|
|
45
|
+
pause_memory_threshold: float = 95.0 # %
|
|
46
|
+
pause_disk_threshold: float = 95.0 # %
|
|
47
|
+
|
|
48
|
+
# Graceful degradation
|
|
49
|
+
degradation_enabled: bool = True
|
|
50
|
+
degrade_cpu_threshold: float = 70.0 # %
|
|
51
|
+
degrade_memory_threshold: float = 75.0 # %
|
|
52
|
+
|
|
53
|
+
# Recovery
|
|
54
|
+
recovery_check_interval: float = 60.0 # seconds
|
|
55
|
+
recovery_cpu_threshold: float = 50.0 # %
|
|
56
|
+
recovery_memory_threshold: float = 60.0 # %
|
|
57
|
+
|
|
58
|
+
# Hardware-aware adjustments
|
|
59
|
+
hardware_profile: HardwareProfile | None = None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class ExecutionState:
|
|
64
|
+
"""Current execution state."""
|
|
65
|
+
|
|
66
|
+
mode: ExecutionMode = ExecutionMode.NORMAL
|
|
67
|
+
start_time: datetime = field(default_factory=lambda: datetime.now(UTC))
|
|
68
|
+
last_check: datetime = field(default_factory=lambda: datetime.now(UTC))
|
|
69
|
+
pause_count: int = 0
|
|
70
|
+
degradation_count: int = 0
|
|
71
|
+
resource_history: list[ResourceMetrics] = field(default_factory=list)
|
|
72
|
+
alerts: list[str] = field(default_factory=list)
|
|
73
|
+
|
|
74
|
+
def add_alert(self, message: str):
|
|
75
|
+
"""Add an alert message."""
|
|
76
|
+
self.alerts.append(f"{datetime.now(UTC).isoformat()}: {message}")
|
|
77
|
+
if len(self.alerts) > 100: # Keep last 100 alerts
|
|
78
|
+
self.alerts = self.alerts[-100:]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class AutoPause:
|
|
82
|
+
"""Automatic pause mechanism based on resource constraints."""
|
|
83
|
+
|
|
84
|
+
def __init__(self, config: ExecutionConfig):
|
|
85
|
+
"""
|
|
86
|
+
Initialize auto-pause.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
config: Execution configuration
|
|
90
|
+
"""
|
|
91
|
+
self.config = config
|
|
92
|
+
self.is_paused = False
|
|
93
|
+
self.pause_reason: str | None = None
|
|
94
|
+
|
|
95
|
+
def should_pause(self, metrics: ResourceMetrics) -> tuple[bool, str | None]:
|
|
96
|
+
"""
|
|
97
|
+
Check if execution should be paused.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
metrics: Current resource metrics
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
Tuple of (should_pause, reason)
|
|
104
|
+
"""
|
|
105
|
+
if not self.config.auto_pause_enabled:
|
|
106
|
+
return False, None
|
|
107
|
+
|
|
108
|
+
# Check CPU
|
|
109
|
+
if metrics.cpu_percent > self.config.pause_cpu_threshold:
|
|
110
|
+
return (
|
|
111
|
+
True,
|
|
112
|
+
f"CPU usage {metrics.cpu_percent:.1f}% exceeds threshold {self.config.pause_cpu_threshold}%",
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Check memory
|
|
116
|
+
if metrics.memory_percent > self.config.pause_memory_threshold:
|
|
117
|
+
return (
|
|
118
|
+
True,
|
|
119
|
+
f"Memory usage {metrics.memory_percent:.1f}% exceeds threshold {self.config.pause_memory_threshold}%",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Check disk
|
|
123
|
+
if metrics.disk_percent > self.config.pause_disk_threshold:
|
|
124
|
+
return (
|
|
125
|
+
True,
|
|
126
|
+
f"Disk usage {metrics.disk_percent:.1f}% exceeds threshold {self.config.pause_disk_threshold}%",
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
return False, None
|
|
130
|
+
|
|
131
|
+
def should_resume(self, metrics: ResourceMetrics) -> bool:
|
|
132
|
+
"""
|
|
133
|
+
Check if execution should resume.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
metrics: Current resource metrics
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
True if should resume
|
|
140
|
+
"""
|
|
141
|
+
if not self.is_paused:
|
|
142
|
+
return False
|
|
143
|
+
|
|
144
|
+
# Resume if resources are below recovery thresholds
|
|
145
|
+
return (
|
|
146
|
+
metrics.cpu_percent < self.config.recovery_cpu_threshold
|
|
147
|
+
and metrics.memory_percent < self.config.recovery_memory_threshold
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class ResourceOptimizer:
|
|
152
|
+
"""Optimizes resource usage based on current conditions."""
|
|
153
|
+
|
|
154
|
+
def __init__(self, config: ExecutionConfig):
|
|
155
|
+
"""
|
|
156
|
+
Initialize resource optimizer.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
config: Execution configuration
|
|
160
|
+
"""
|
|
161
|
+
self.config = config
|
|
162
|
+
self.hardware_profiler = HardwareProfiler()
|
|
163
|
+
|
|
164
|
+
def get_optimization_suggestions(self, metrics: ResourceMetrics) -> list[str]:
|
|
165
|
+
"""
|
|
166
|
+
Get optimization suggestions based on current metrics.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
metrics: Current resource metrics
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
List of optimization suggestions
|
|
173
|
+
"""
|
|
174
|
+
suggestions = []
|
|
175
|
+
|
|
176
|
+
# CPU optimization
|
|
177
|
+
if metrics.cpu_percent > 60:
|
|
178
|
+
suggestions.append("Reduce concurrent operations")
|
|
179
|
+
suggestions.append("Increase checkpoint intervals")
|
|
180
|
+
|
|
181
|
+
# Memory optimization
|
|
182
|
+
if metrics.memory_percent > 70:
|
|
183
|
+
suggestions.append("Clear unused caches")
|
|
184
|
+
suggestions.append("Reduce in-memory data structures")
|
|
185
|
+
suggestions.append("Enable compression")
|
|
186
|
+
|
|
187
|
+
# Disk optimization
|
|
188
|
+
if metrics.disk_percent > 80:
|
|
189
|
+
suggestions.append("Clean up temporary files")
|
|
190
|
+
suggestions.append("Reduce cache sizes")
|
|
191
|
+
suggestions.append("Archive old checkpoints")
|
|
192
|
+
|
|
193
|
+
return suggestions
|
|
194
|
+
|
|
195
|
+
def should_degrade(self, metrics: ResourceMetrics) -> tuple[bool, str | None]:
|
|
196
|
+
"""
|
|
197
|
+
Check if execution should degrade.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
metrics: Current resource metrics
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Tuple of (should_degrade, reason)
|
|
204
|
+
"""
|
|
205
|
+
if not self.config.degradation_enabled:
|
|
206
|
+
return False, None
|
|
207
|
+
|
|
208
|
+
# Check CPU
|
|
209
|
+
if metrics.cpu_percent > self.config.degrade_cpu_threshold:
|
|
210
|
+
return (
|
|
211
|
+
True,
|
|
212
|
+
f"CPU usage {metrics.cpu_percent:.1f}% exceeds degradation threshold {self.config.degrade_cpu_threshold}%",
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
# Check memory
|
|
216
|
+
if metrics.memory_percent > self.config.degrade_memory_threshold:
|
|
217
|
+
return (
|
|
218
|
+
True,
|
|
219
|
+
f"Memory usage {metrics.memory_percent:.1f}% exceeds degradation threshold {self.config.degrade_memory_threshold}%",
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
return False, None
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
class ResourceAwareExecutor:
|
|
226
|
+
"""Executes tasks with resource awareness and auto-pause."""
|
|
227
|
+
|
|
228
|
+
def __init__(
|
|
229
|
+
self,
|
|
230
|
+
session_manager: SessionManager | None = None,
|
|
231
|
+
config: ExecutionConfig | None = None,
|
|
232
|
+
):
|
|
233
|
+
"""
|
|
234
|
+
Initialize resource-aware executor.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
session_manager: Optional session manager for session integration
|
|
238
|
+
config: Execution configuration
|
|
239
|
+
"""
|
|
240
|
+
self.session_manager = session_manager
|
|
241
|
+
self.config = config or ExecutionConfig()
|
|
242
|
+
self.resource_monitor = ResourceMonitor(
|
|
243
|
+
cpu_threshold=self.config.cpu_threshold,
|
|
244
|
+
memory_threshold=self.config.memory_threshold,
|
|
245
|
+
disk_threshold=self.config.disk_threshold,
|
|
246
|
+
)
|
|
247
|
+
self.auto_pause = AutoPause(self.config)
|
|
248
|
+
self.optimizer = ResourceOptimizer(self.config)
|
|
249
|
+
self.execution_state = ExecutionState()
|
|
250
|
+
|
|
251
|
+
# Hardware-aware adjustments
|
|
252
|
+
if not self.config.hardware_profile:
|
|
253
|
+
hardware_profiler = HardwareProfiler()
|
|
254
|
+
self.config.hardware_profile = hardware_profiler.detect_profile()
|
|
255
|
+
|
|
256
|
+
self._apply_hardware_profile()
|
|
257
|
+
|
|
258
|
+
# Monitoring thread
|
|
259
|
+
self._monitoring_thread: threading.Thread | None = None
|
|
260
|
+
self._monitoring_active = False
|
|
261
|
+
self._lock = threading.Lock()
|
|
262
|
+
|
|
263
|
+
def _apply_hardware_profile(self):
|
|
264
|
+
"""No-op: hardware taxonomy removed; use ExecutionConfig defaults."""
|
|
265
|
+
|
|
266
|
+
def start_monitoring(self):
|
|
267
|
+
"""Start continuous resource monitoring."""
|
|
268
|
+
if self._monitoring_active:
|
|
269
|
+
return
|
|
270
|
+
|
|
271
|
+
self._monitoring_active = True
|
|
272
|
+
self._monitoring_thread = threading.Thread(
|
|
273
|
+
target=self._monitoring_loop, daemon=True
|
|
274
|
+
)
|
|
275
|
+
self._monitoring_thread.start()
|
|
276
|
+
logger.info("Resource monitoring started")
|
|
277
|
+
|
|
278
|
+
def stop_monitoring(self):
|
|
279
|
+
"""Stop resource monitoring."""
|
|
280
|
+
self._monitoring_active = False
|
|
281
|
+
if self._monitoring_thread:
|
|
282
|
+
self._monitoring_thread.join(timeout=5.0)
|
|
283
|
+
logger.info("Resource monitoring stopped")
|
|
284
|
+
|
|
285
|
+
def _monitoring_loop(self):
|
|
286
|
+
"""Continuous monitoring loop."""
|
|
287
|
+
while self._monitoring_active:
|
|
288
|
+
try:
|
|
289
|
+
metrics = self.resource_monitor.get_current_metrics()
|
|
290
|
+
self._check_resources(metrics)
|
|
291
|
+
time.sleep(self.config.monitor_interval)
|
|
292
|
+
except Exception as e:
|
|
293
|
+
logger.error(f"Error in monitoring loop: {e}", exc_info=True)
|
|
294
|
+
time.sleep(self.config.monitor_interval)
|
|
295
|
+
|
|
296
|
+
def _check_resources(self, metrics: ResourceMetrics):
|
|
297
|
+
"""Check resources and adjust execution mode."""
|
|
298
|
+
with self._lock:
|
|
299
|
+
self.execution_state.last_check = datetime.now(UTC)
|
|
300
|
+
self.execution_state.resource_history.append(metrics)
|
|
301
|
+
if len(self.execution_state.resource_history) > 100:
|
|
302
|
+
self.execution_state.resource_history = (
|
|
303
|
+
self.execution_state.resource_history[-100:]
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
# Check for auto-pause
|
|
307
|
+
should_pause, pause_reason = self.auto_pause.should_pause(metrics)
|
|
308
|
+
if should_pause and not self.auto_pause.is_paused:
|
|
309
|
+
self._pause_execution(pause_reason or "Resource limits exceeded")
|
|
310
|
+
elif self.auto_pause.should_resume(metrics) and self.auto_pause.is_paused:
|
|
311
|
+
self._resume_execution()
|
|
312
|
+
|
|
313
|
+
# Check for degradation
|
|
314
|
+
should_degrade, degrade_reason = self.optimizer.should_degrade(metrics)
|
|
315
|
+
if should_degrade and self.execution_state.mode == ExecutionMode.NORMAL:
|
|
316
|
+
self._degrade_execution(degrade_reason or "Resource pressure detected")
|
|
317
|
+
elif (
|
|
318
|
+
not should_degrade
|
|
319
|
+
and self.execution_state.mode == ExecutionMode.DEGRADED
|
|
320
|
+
):
|
|
321
|
+
self._restore_normal_execution()
|
|
322
|
+
|
|
323
|
+
def _pause_execution(self, reason: str):
|
|
324
|
+
"""Pause execution due to resource constraints."""
|
|
325
|
+
logger.warning(f"Pausing execution: {reason}")
|
|
326
|
+
self.auto_pause.is_paused = True
|
|
327
|
+
self.auto_pause.pause_reason = reason
|
|
328
|
+
self.execution_state.mode = ExecutionMode.PAUSED
|
|
329
|
+
self.execution_state.pause_count += 1
|
|
330
|
+
self.execution_state.add_alert(f"PAUSED: {reason}")
|
|
331
|
+
|
|
332
|
+
# Pause session if available
|
|
333
|
+
if self.session_manager:
|
|
334
|
+
try:
|
|
335
|
+
sessions = self.session_manager.get_active_sessions()
|
|
336
|
+
for session in sessions:
|
|
337
|
+
self.session_manager.pause_session(session.session_id, reason)
|
|
338
|
+
except Exception as e:
|
|
339
|
+
logger.error(f"Error pausing sessions: {e}", exc_info=True)
|
|
340
|
+
|
|
341
|
+
def _resume_execution(self, reason: str | None = None):
|
|
342
|
+
"""Resume execution after resource recovery."""
|
|
343
|
+
resume_reason = reason or "Resources recovered"
|
|
344
|
+
logger.info(f"Resuming execution: {resume_reason}")
|
|
345
|
+
self.auto_pause.is_paused = False
|
|
346
|
+
self.auto_pause.pause_reason = None
|
|
347
|
+
self.execution_state.mode = ExecutionMode.NORMAL
|
|
348
|
+
self.execution_state.add_alert(f"RESUMED: {resume_reason}")
|
|
349
|
+
|
|
350
|
+
# Resume session if available
|
|
351
|
+
if self.session_manager:
|
|
352
|
+
try:
|
|
353
|
+
sessions = self.session_manager.list_sessions(state=SessionState.PAUSED)
|
|
354
|
+
for session in sessions:
|
|
355
|
+
self.session_manager.resume_session(session.session_id)
|
|
356
|
+
except Exception as e:
|
|
357
|
+
logger.error(f"Error resuming sessions: {e}", exc_info=True)
|
|
358
|
+
|
|
359
|
+
def _degrade_execution(self, reason: str):
|
|
360
|
+
"""Degrade execution quality due to resource constraints."""
|
|
361
|
+
logger.warning(f"Degrading execution: {reason}")
|
|
362
|
+
self.execution_state.mode = ExecutionMode.DEGRADED
|
|
363
|
+
self.execution_state.degradation_count += 1
|
|
364
|
+
self.execution_state.add_alert(f"DEGRADED: {reason}")
|
|
365
|
+
|
|
366
|
+
def _restore_normal_execution(self):
|
|
367
|
+
"""Restore normal execution mode."""
|
|
368
|
+
logger.info("Restoring normal execution mode")
|
|
369
|
+
self.execution_state.mode = ExecutionMode.NORMAL
|
|
370
|
+
self.execution_state.add_alert("RESTORED: Normal execution mode")
|
|
371
|
+
|
|
372
|
+
def execute(
|
|
373
|
+
self,
|
|
374
|
+
task: Callable[[], Any],
|
|
375
|
+
task_name: str = "task",
|
|
376
|
+
check_resources: bool = True,
|
|
377
|
+
) -> Any:
|
|
378
|
+
"""
|
|
379
|
+
Execute a task with resource awareness.
|
|
380
|
+
|
|
381
|
+
Args:
|
|
382
|
+
task: Task function to execute
|
|
383
|
+
task_name: Name of the task
|
|
384
|
+
check_resources: Whether to check resources before execution
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
Task result
|
|
388
|
+
|
|
389
|
+
Raises:
|
|
390
|
+
RuntimeError: If execution is paused or suspended
|
|
391
|
+
"""
|
|
392
|
+
# Check if execution is paused
|
|
393
|
+
if self.auto_pause.is_paused:
|
|
394
|
+
raise RuntimeError(
|
|
395
|
+
f"Execution is paused: {self.auto_pause.pause_reason}. "
|
|
396
|
+
"Wait for resources to recover or manually resume."
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
# Check resources before execution
|
|
400
|
+
if check_resources:
|
|
401
|
+
metrics = self.resource_monitor.get_current_metrics()
|
|
402
|
+
should_pause, pause_reason = self.auto_pause.should_pause(metrics)
|
|
403
|
+
if should_pause:
|
|
404
|
+
self._pause_execution(pause_reason or "Resource limits exceeded")
|
|
405
|
+
raise RuntimeError(f"Execution paused: {pause_reason}")
|
|
406
|
+
|
|
407
|
+
# Execute task
|
|
408
|
+
try:
|
|
409
|
+
logger.info(
|
|
410
|
+
f"Executing task: {task_name} (mode: {self.execution_state.mode.value})"
|
|
411
|
+
)
|
|
412
|
+
result = task()
|
|
413
|
+
return result
|
|
414
|
+
except Exception as e:
|
|
415
|
+
logger.error(f"Task execution failed: {e}", exc_info=True)
|
|
416
|
+
raise
|
|
417
|
+
|
|
418
|
+
def get_execution_state(self) -> ExecutionState:
|
|
419
|
+
"""Get current execution state."""
|
|
420
|
+
with self._lock:
|
|
421
|
+
return self.execution_state
|
|
422
|
+
|
|
423
|
+
def get_current_metrics(self) -> ResourceMetrics:
|
|
424
|
+
"""Get current resource metrics."""
|
|
425
|
+
return self.resource_monitor.get_current_metrics()
|
|
426
|
+
|
|
427
|
+
def get_optimization_suggestions(self) -> list[str]:
|
|
428
|
+
"""Get optimization suggestions based on current metrics."""
|
|
429
|
+
metrics = self.resource_monitor.get_current_metrics()
|
|
430
|
+
return self.optimizer.get_optimization_suggestions(metrics)
|
|
431
|
+
|
|
432
|
+
def force_resume(self):
|
|
433
|
+
"""Force resume execution (use with caution)."""
|
|
434
|
+
logger.warning("Force resuming execution")
|
|
435
|
+
self._resume_execution("Force resume requested")
|
|
436
|
+
|
|
437
|
+
def force_pause(self, reason: str = "Manual pause"):
|
|
438
|
+
"""Force pause execution."""
|
|
439
|
+
logger.warning(f"Force pausing execution: {reason}")
|
|
440
|
+
self._pause_execution(reason)
|
|
441
|
+
|
|
442
|
+
def __enter__(self):
|
|
443
|
+
"""Context manager entry."""
|
|
444
|
+
self.start_monitoring()
|
|
445
|
+
return self
|
|
446
|
+
|
|
447
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
448
|
+
"""Context manager exit."""
|
|
449
|
+
self.stop_monitoring()
|