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,432 +1,432 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Adaptive Cache Configuration - Dynamically adjusts cache settings based on resource usage.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import logging
|
|
6
|
-
from dataclasses import asdict, dataclass
|
|
7
|
-
from datetime import UTC, datetime
|
|
8
|
-
from typing import Any
|
|
9
|
-
|
|
10
|
-
from .hardware_profiler import (
|
|
11
|
-
CacheOptimizationProfile,
|
|
12
|
-
HardwareProfile,
|
|
13
|
-
HardwareProfiler,
|
|
14
|
-
)
|
|
15
|
-
from .resource_monitor import ResourceMonitor
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class AdaptiveCacheSettings:
|
|
22
|
-
"""Current adaptive cache settings."""
|
|
23
|
-
|
|
24
|
-
# Tiered Context settings
|
|
25
|
-
tier1_ttl: int
|
|
26
|
-
tier2_ttl: int
|
|
27
|
-
tier3_ttl: int
|
|
28
|
-
max_in_memory_entries: int
|
|
29
|
-
hybrid_mode: bool
|
|
30
|
-
compression_enabled: bool
|
|
31
|
-
|
|
32
|
-
# Context7 KB settings
|
|
33
|
-
max_cache_size_mb: int
|
|
34
|
-
pre_populate: bool
|
|
35
|
-
auto_refresh: bool
|
|
36
|
-
|
|
37
|
-
# RAG Knowledge settings
|
|
38
|
-
index_on_startup: bool
|
|
39
|
-
max_knowledge_files: int
|
|
40
|
-
|
|
41
|
-
# Adaptive behavior flags
|
|
42
|
-
background_indexing_enabled: bool
|
|
43
|
-
cache_warming_enabled: bool
|
|
44
|
-
emergency_cleanup_active: bool
|
|
45
|
-
|
|
46
|
-
# Adaptive control settings (derived from hardware profile)
|
|
47
|
-
# Context7 best practice: make new adaptive knobs backward-compatible with safe defaults,
|
|
48
|
-
# then allow hardware profiles to override them (see UnifiedCache initialization).
|
|
49
|
-
resource_check_interval: int = 60
|
|
50
|
-
emergency_cleanup_threshold: float = 0.80 # Memory usage % to trigger cleanup
|
|
51
|
-
|
|
52
|
-
def to_dict(self) -> dict[str, Any]:
|
|
53
|
-
"""Convert to dictionary."""
|
|
54
|
-
return asdict(self)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@dataclass
|
|
58
|
-
class ConfigurationChange:
|
|
59
|
-
"""Record of a configuration change."""
|
|
60
|
-
|
|
61
|
-
timestamp: str
|
|
62
|
-
reason: str
|
|
63
|
-
old_settings: dict[str, Any]
|
|
64
|
-
new_settings: dict[str, Any]
|
|
65
|
-
resource_metrics: dict[str, Any]
|
|
66
|
-
|
|
67
|
-
def to_dict(self) -> dict[str, Any]:
|
|
68
|
-
"""Convert to dictionary."""
|
|
69
|
-
return asdict(self)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
class AdaptiveCacheConfig:
|
|
73
|
-
"""
|
|
74
|
-
Dynamically adjusts cache configuration based on resource usage.
|
|
75
|
-
|
|
76
|
-
Monitors CPU, memory, and disk usage and adjusts cache settings
|
|
77
|
-
to maintain optimal performance under resource constraints.
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
def __init__(
|
|
81
|
-
self,
|
|
82
|
-
resource_monitor: ResourceMonitor | None = None,
|
|
83
|
-
hardware_profiler: HardwareProfiler | None = None,
|
|
84
|
-
hardware_profile: HardwareProfile | None = None,
|
|
85
|
-
check_interval: int = 60,
|
|
86
|
-
enable_logging: bool = True,
|
|
87
|
-
):
|
|
88
|
-
"""
|
|
89
|
-
Initialize adaptive cache configuration.
|
|
90
|
-
|
|
91
|
-
Args:
|
|
92
|
-
resource_monitor: ResourceMonitor instance (creates default if not provided)
|
|
93
|
-
hardware_profiler: HardwareProfiler instance (creates default if not provided)
|
|
94
|
-
check_interval: Interval in seconds between resource checks
|
|
95
|
-
enable_logging: Whether to log configuration changes
|
|
96
|
-
"""
|
|
97
|
-
self.resource_monitor = resource_monitor or ResourceMonitor()
|
|
98
|
-
self.hardware_profiler = hardware_profiler or HardwareProfiler()
|
|
99
|
-
self.check_interval = check_interval
|
|
100
|
-
self.enable_logging = enable_logging
|
|
101
|
-
|
|
102
|
-
# Get base optimization profile from hardware
|
|
103
|
-
self.hardware_profile = (
|
|
104
|
-
hardware_profile or self.hardware_profiler.detect_profile()
|
|
105
|
-
)
|
|
106
|
-
self.base_profile = self.hardware_profiler.get_optimization_profile(
|
|
107
|
-
self.hardware_profile
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
# Current adaptive settings (initialized from base profile)
|
|
111
|
-
self.current_settings = self._create_settings_from_profile(self.base_profile)
|
|
112
|
-
|
|
113
|
-
# Track configuration changes
|
|
114
|
-
self.config_changes: list[ConfigurationChange] = []
|
|
115
|
-
self.last_check_time: datetime | None = None
|
|
116
|
-
|
|
117
|
-
# Thresholds for adaptive behavior
|
|
118
|
-
self.memory_warning_threshold = 80.0 # % memory usage
|
|
119
|
-
self.memory_critical_threshold = 90.0
|
|
120
|
-
self.memory_low_threshold = 60.0
|
|
121
|
-
|
|
122
|
-
self.cpu_warning_threshold = 70.0 # % CPU usage
|
|
123
|
-
self.cpu_critical_threshold = 85.0
|
|
124
|
-
|
|
125
|
-
self.disk_warning_threshold = 80.0 # % disk usage
|
|
126
|
-
self.disk_critical_threshold = 90.0
|
|
127
|
-
self.disk_free_warning_threshold = 20.0 # % free disk
|
|
128
|
-
self.disk_free_critical_threshold = 10.0
|
|
129
|
-
|
|
130
|
-
def _create_settings_from_profile(
|
|
131
|
-
self, profile: CacheOptimizationProfile
|
|
132
|
-
) -> AdaptiveCacheSettings:
|
|
133
|
-
"""Create adaptive settings from optimization profile."""
|
|
134
|
-
return AdaptiveCacheSettings(
|
|
135
|
-
tier1_ttl=profile.tier1_ttl,
|
|
136
|
-
tier2_ttl=profile.tier2_ttl,
|
|
137
|
-
tier3_ttl=profile.tier3_ttl,
|
|
138
|
-
max_in_memory_entries=profile.max_in_memory_entries,
|
|
139
|
-
hybrid_mode=profile.hybrid_mode,
|
|
140
|
-
compression_enabled=profile.compression_enabled,
|
|
141
|
-
max_cache_size_mb=profile.max_cache_size_mb,
|
|
142
|
-
pre_populate=profile.pre_populate,
|
|
143
|
-
auto_refresh=profile.auto_refresh,
|
|
144
|
-
index_on_startup=profile.index_on_startup,
|
|
145
|
-
max_knowledge_files=profile.max_knowledge_files,
|
|
146
|
-
background_indexing_enabled=True,
|
|
147
|
-
cache_warming_enabled=True,
|
|
148
|
-
emergency_cleanup_active=False,
|
|
149
|
-
resource_check_interval=profile.resource_check_interval,
|
|
150
|
-
emergency_cleanup_threshold=profile.emergency_cleanup_threshold,
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
def check_and_adjust(self) -> bool:
|
|
154
|
-
"""
|
|
155
|
-
Check resource usage and adjust configuration if needed.
|
|
156
|
-
|
|
157
|
-
Returns:
|
|
158
|
-
True if configuration was adjusted
|
|
159
|
-
"""
|
|
160
|
-
# Check if enough time has passed since last check
|
|
161
|
-
now = datetime.now(UTC)
|
|
162
|
-
if self.last_check_time:
|
|
163
|
-
elapsed = (now - self.last_check_time).total_seconds()
|
|
164
|
-
if elapsed < self.check_interval:
|
|
165
|
-
return False
|
|
166
|
-
|
|
167
|
-
# Get current resource metrics
|
|
168
|
-
metrics = self.resource_monitor.get_current_metrics()
|
|
169
|
-
self.last_check_time = now
|
|
170
|
-
|
|
171
|
-
# Store old settings
|
|
172
|
-
old_settings = self.current_settings.to_dict()
|
|
173
|
-
adjusted = False
|
|
174
|
-
reasons = []
|
|
175
|
-
|
|
176
|
-
# Adjust based on memory pressure
|
|
177
|
-
if metrics.memory_percent > self.memory_critical_threshold:
|
|
178
|
-
# Critical memory pressure - disable in-memory cache, enable compression
|
|
179
|
-
if self.current_settings.max_in_memory_entries > 0:
|
|
180
|
-
self.current_settings.max_in_memory_entries = 0
|
|
181
|
-
self.current_settings.hybrid_mode = False
|
|
182
|
-
adjusted = True
|
|
183
|
-
reasons.append(
|
|
184
|
-
f"Critical memory pressure ({metrics.memory_percent:.1f}%)"
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
if not self.current_settings.compression_enabled:
|
|
188
|
-
self.current_settings.compression_enabled = True
|
|
189
|
-
adjusted = True
|
|
190
|
-
reasons.append("Enabled compression due to memory pressure")
|
|
191
|
-
|
|
192
|
-
elif metrics.memory_percent > self.memory_warning_threshold:
|
|
193
|
-
# Warning memory pressure - reduce in-memory cache size
|
|
194
|
-
if self.current_settings.max_in_memory_entries > 0:
|
|
195
|
-
# Reduce to 50% of base profile
|
|
196
|
-
base_entries = self.base_profile.max_in_memory_entries
|
|
197
|
-
new_entries = max(10, int(base_entries * 0.5))
|
|
198
|
-
if self.current_settings.max_in_memory_entries != new_entries:
|
|
199
|
-
self.current_settings.max_in_memory_entries = new_entries
|
|
200
|
-
adjusted = True
|
|
201
|
-
reasons.append(
|
|
202
|
-
f"Reduced in-memory cache due to memory pressure ({metrics.memory_percent:.1f}%)"
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
elif metrics.memory_percent < self.memory_low_threshold:
|
|
206
|
-
# Low memory usage - restore to base profile
|
|
207
|
-
if (
|
|
208
|
-
self.current_settings.max_in_memory_entries
|
|
209
|
-
< self.base_profile.max_in_memory_entries
|
|
210
|
-
):
|
|
211
|
-
self.current_settings.max_in_memory_entries = (
|
|
212
|
-
self.base_profile.max_in_memory_entries
|
|
213
|
-
)
|
|
214
|
-
self.current_settings.hybrid_mode = self.base_profile.hybrid_mode
|
|
215
|
-
adjusted = True
|
|
216
|
-
reasons.append(
|
|
217
|
-
f"Restored cache settings (memory usage {metrics.memory_percent:.1f}%)"
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
# Adjust based on CPU pressure
|
|
221
|
-
if metrics.cpu_percent > self.cpu_critical_threshold:
|
|
222
|
-
# Critical CPU pressure - disable background operations
|
|
223
|
-
if self.current_settings.background_indexing_enabled:
|
|
224
|
-
self.current_settings.background_indexing_enabled = False
|
|
225
|
-
adjusted = True
|
|
226
|
-
reasons.append(
|
|
227
|
-
f"Disabled background indexing (CPU {metrics.cpu_percent:.1f}%)"
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
if self.current_settings.cache_warming_enabled:
|
|
231
|
-
self.current_settings.cache_warming_enabled = False
|
|
232
|
-
adjusted = True
|
|
233
|
-
reasons.append("Disabled cache warming due to CPU pressure")
|
|
234
|
-
|
|
235
|
-
# Increase TTL to reduce refresh frequency
|
|
236
|
-
if self.current_settings.tier1_ttl < self.base_profile.tier1_ttl * 1.5:
|
|
237
|
-
self.current_settings.tier1_ttl = int(self.base_profile.tier1_ttl * 1.5)
|
|
238
|
-
self.current_settings.tier2_ttl = int(self.base_profile.tier2_ttl * 1.5)
|
|
239
|
-
self.current_settings.tier3_ttl = int(self.base_profile.tier3_ttl * 1.5)
|
|
240
|
-
adjusted = True
|
|
241
|
-
reasons.append("Increased TTL to reduce refresh frequency")
|
|
242
|
-
|
|
243
|
-
elif metrics.cpu_percent > self.cpu_warning_threshold:
|
|
244
|
-
# Warning CPU pressure - reduce background operations
|
|
245
|
-
if self.current_settings.background_indexing_enabled:
|
|
246
|
-
self.current_settings.background_indexing_enabled = False
|
|
247
|
-
adjusted = True
|
|
248
|
-
reasons.append(
|
|
249
|
-
f"Disabled background indexing (CPU {metrics.cpu_percent:.1f}%)"
|
|
250
|
-
)
|
|
251
|
-
|
|
252
|
-
elif metrics.cpu_percent < 50.0:
|
|
253
|
-
# Low CPU usage - restore background operations
|
|
254
|
-
if not self.current_settings.background_indexing_enabled:
|
|
255
|
-
self.current_settings.background_indexing_enabled = True
|
|
256
|
-
adjusted = True
|
|
257
|
-
reasons.append("Restored background indexing (CPU usage low)")
|
|
258
|
-
|
|
259
|
-
if not self.current_settings.cache_warming_enabled:
|
|
260
|
-
self.current_settings.cache_warming_enabled = True
|
|
261
|
-
adjusted = True
|
|
262
|
-
reasons.append("Restored cache warming")
|
|
263
|
-
|
|
264
|
-
# Restore TTL to base values
|
|
265
|
-
if self.current_settings.tier1_ttl != self.base_profile.tier1_ttl:
|
|
266
|
-
self.current_settings.tier1_ttl = self.base_profile.tier1_ttl
|
|
267
|
-
self.current_settings.tier2_ttl = self.base_profile.tier2_ttl
|
|
268
|
-
self.current_settings.tier3_ttl = self.base_profile.tier3_ttl
|
|
269
|
-
adjusted = True
|
|
270
|
-
reasons.append("Restored TTL to base values")
|
|
271
|
-
|
|
272
|
-
# Adjust based on disk space
|
|
273
|
-
disk_free_percent = 100.0 - metrics.disk_percent
|
|
274
|
-
if disk_free_percent < self.disk_free_critical_threshold:
|
|
275
|
-
# Critical disk space - emergency cleanup, disable cache growth
|
|
276
|
-
if not self.current_settings.emergency_cleanup_active:
|
|
277
|
-
self.current_settings.emergency_cleanup_active = True
|
|
278
|
-
adjusted = True
|
|
279
|
-
reasons.append(
|
|
280
|
-
f"Emergency cleanup activated (disk {disk_free_percent:.1f}% free)"
|
|
281
|
-
)
|
|
282
|
-
|
|
283
|
-
# Reduce max cache size
|
|
284
|
-
if (
|
|
285
|
-
self.current_settings.max_cache_size_mb
|
|
286
|
-
> self.base_profile.max_cache_size_mb * 0.5
|
|
287
|
-
):
|
|
288
|
-
self.current_settings.max_cache_size_mb = int(
|
|
289
|
-
self.base_profile.max_cache_size_mb * 0.5
|
|
290
|
-
)
|
|
291
|
-
adjusted = True
|
|
292
|
-
reasons.append("Reduced max cache size due to disk pressure")
|
|
293
|
-
|
|
294
|
-
# Enable compression
|
|
295
|
-
if not self.current_settings.compression_enabled:
|
|
296
|
-
self.current_settings.compression_enabled = True
|
|
297
|
-
adjusted = True
|
|
298
|
-
reasons.append("Enabled compression due to disk pressure")
|
|
299
|
-
|
|
300
|
-
elif disk_free_percent < self.disk_free_warning_threshold:
|
|
301
|
-
# Warning disk space - aggressive cleanup, reduce cache size
|
|
302
|
-
if (
|
|
303
|
-
self.current_settings.max_cache_size_mb
|
|
304
|
-
> self.base_profile.max_cache_size_mb * 0.75
|
|
305
|
-
):
|
|
306
|
-
self.current_settings.max_cache_size_mb = int(
|
|
307
|
-
self.base_profile.max_cache_size_mb * 0.75
|
|
308
|
-
)
|
|
309
|
-
adjusted = True
|
|
310
|
-
reasons.append(
|
|
311
|
-
f"Reduced cache size (disk {disk_free_percent:.1f}% free)"
|
|
312
|
-
)
|
|
313
|
-
|
|
314
|
-
elif disk_free_percent > 30.0:
|
|
315
|
-
# Plenty of disk space - restore settings
|
|
316
|
-
if self.current_settings.emergency_cleanup_active:
|
|
317
|
-
self.current_settings.emergency_cleanup_active = False
|
|
318
|
-
adjusted = True
|
|
319
|
-
reasons.append("Deactivated emergency cleanup (disk space available)")
|
|
320
|
-
|
|
321
|
-
if (
|
|
322
|
-
self.current_settings.max_cache_size_mb
|
|
323
|
-
< self.base_profile.max_cache_size_mb
|
|
324
|
-
):
|
|
325
|
-
self.current_settings.max_cache_size_mb = (
|
|
326
|
-
self.base_profile.max_cache_size_mb
|
|
327
|
-
)
|
|
328
|
-
adjusted = True
|
|
329
|
-
reasons.append("Restored max cache size")
|
|
330
|
-
|
|
331
|
-
# Log configuration change if adjusted
|
|
332
|
-
if adjusted:
|
|
333
|
-
new_settings = self.current_settings.to_dict()
|
|
334
|
-
change = ConfigurationChange(
|
|
335
|
-
timestamp=now.isoformat(),
|
|
336
|
-
reason="; ".join(reasons),
|
|
337
|
-
old_settings=old_settings,
|
|
338
|
-
new_settings=new_settings,
|
|
339
|
-
resource_metrics={
|
|
340
|
-
"cpu_percent": metrics.cpu_percent,
|
|
341
|
-
"memory_percent": metrics.memory_percent,
|
|
342
|
-
"disk_percent": metrics.disk_percent,
|
|
343
|
-
"disk_free_percent": disk_free_percent,
|
|
344
|
-
},
|
|
345
|
-
)
|
|
346
|
-
self.config_changes.append(change)
|
|
347
|
-
|
|
348
|
-
# Keep only last 100 changes
|
|
349
|
-
if len(self.config_changes) > 100:
|
|
350
|
-
self.config_changes = self.config_changes[-100:]
|
|
351
|
-
|
|
352
|
-
if self.enable_logging:
|
|
353
|
-
logger.info(
|
|
354
|
-
f"Adaptive cache configuration adjusted: {change.reason}. "
|
|
355
|
-
f"CPU: {metrics.cpu_percent:.1f}%, Memory: {metrics.memory_percent:.1f}%, "
|
|
356
|
-
f"Disk: {disk_free_percent:.1f}% free"
|
|
357
|
-
)
|
|
358
|
-
|
|
359
|
-
return adjusted
|
|
360
|
-
|
|
361
|
-
def get_current_settings(self) -> AdaptiveCacheSettings:
|
|
362
|
-
"""Get current adaptive cache settings."""
|
|
363
|
-
return self.current_settings
|
|
364
|
-
|
|
365
|
-
def get_recent_changes(self, count: int = 10) -> list[ConfigurationChange]:
|
|
366
|
-
"""
|
|
367
|
-
Get recent configuration changes.
|
|
368
|
-
|
|
369
|
-
Args:
|
|
370
|
-
count: Number of changes to return
|
|
371
|
-
|
|
372
|
-
Returns:
|
|
373
|
-
List of recent configuration changes
|
|
374
|
-
"""
|
|
375
|
-
return self.config_changes[-count:]
|
|
376
|
-
|
|
377
|
-
def reset_to_base_profile(self):
|
|
378
|
-
"""Reset settings to base hardware profile."""
|
|
379
|
-
old_settings = self.current_settings.to_dict()
|
|
380
|
-
self.current_settings = self._create_settings_from_profile(self.base_profile)
|
|
381
|
-
new_settings = self.current_settings.to_dict()
|
|
382
|
-
|
|
383
|
-
change = ConfigurationChange(
|
|
384
|
-
timestamp=datetime.now(UTC).isoformat(),
|
|
385
|
-
reason="Manual reset to base profile",
|
|
386
|
-
old_settings=old_settings,
|
|
387
|
-
new_settings=new_settings,
|
|
388
|
-
resource_metrics={},
|
|
389
|
-
)
|
|
390
|
-
self.config_changes.append(change)
|
|
391
|
-
|
|
392
|
-
if self.enable_logging:
|
|
393
|
-
logger.info("Adaptive cache configuration reset to base profile")
|
|
394
|
-
|
|
395
|
-
def get_status(self) -> dict[str, Any]:
|
|
396
|
-
"""
|
|
397
|
-
Get current status of adaptive configuration.
|
|
398
|
-
|
|
399
|
-
Returns:
|
|
400
|
-
Dictionary with status information
|
|
401
|
-
"""
|
|
402
|
-
metrics = self.resource_monitor.get_current_metrics()
|
|
403
|
-
disk_free_percent = 100.0 - metrics.disk_percent
|
|
404
|
-
|
|
405
|
-
return {
|
|
406
|
-
"hardware_profile": self.hardware_profile.value,
|
|
407
|
-
"current_settings": self.current_settings.to_dict(),
|
|
408
|
-
"base_profile": {
|
|
409
|
-
"tier1_ttl": self.base_profile.tier1_ttl,
|
|
410
|
-
"tier2_ttl": self.base_profile.tier2_ttl,
|
|
411
|
-
"tier3_ttl": self.base_profile.tier3_ttl,
|
|
412
|
-
"max_in_memory_entries": self.base_profile.max_in_memory_entries,
|
|
413
|
-
"max_cache_size_mb": self.base_profile.max_cache_size_mb,
|
|
414
|
-
},
|
|
415
|
-
"resource_metrics": {
|
|
416
|
-
"cpu_percent": metrics.cpu_percent,
|
|
417
|
-
"memory_percent": metrics.memory_percent,
|
|
418
|
-
"disk_percent": metrics.disk_percent,
|
|
419
|
-
"disk_free_percent": disk_free_percent,
|
|
420
|
-
},
|
|
421
|
-
"adaptive_behavior": {
|
|
422
|
-
"memory_pressure": metrics.memory_percent
|
|
423
|
-
> self.memory_warning_threshold,
|
|
424
|
-
"cpu_pressure": metrics.cpu_percent > self.cpu_warning_threshold,
|
|
425
|
-
"disk_pressure": disk_free_percent < self.disk_free_warning_threshold,
|
|
426
|
-
"emergency_cleanup": self.current_settings.emergency_cleanup_active,
|
|
427
|
-
},
|
|
428
|
-
"total_changes": len(self.config_changes),
|
|
429
|
-
"last_check": (
|
|
430
|
-
self.last_check_time.isoformat() if self.last_check_time else None
|
|
431
|
-
),
|
|
432
|
-
}
|
|
1
|
+
"""
|
|
2
|
+
Adaptive Cache Configuration - Dynamically adjusts cache settings based on resource usage.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from dataclasses import asdict, dataclass
|
|
7
|
+
from datetime import UTC, datetime
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from .hardware_profiler import (
|
|
11
|
+
CacheOptimizationProfile,
|
|
12
|
+
HardwareProfile,
|
|
13
|
+
HardwareProfiler,
|
|
14
|
+
)
|
|
15
|
+
from .resource_monitor import ResourceMonitor
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class AdaptiveCacheSettings:
|
|
22
|
+
"""Current adaptive cache settings."""
|
|
23
|
+
|
|
24
|
+
# Tiered Context settings
|
|
25
|
+
tier1_ttl: int
|
|
26
|
+
tier2_ttl: int
|
|
27
|
+
tier3_ttl: int
|
|
28
|
+
max_in_memory_entries: int
|
|
29
|
+
hybrid_mode: bool
|
|
30
|
+
compression_enabled: bool
|
|
31
|
+
|
|
32
|
+
# Context7 KB settings
|
|
33
|
+
max_cache_size_mb: int
|
|
34
|
+
pre_populate: bool
|
|
35
|
+
auto_refresh: bool
|
|
36
|
+
|
|
37
|
+
# RAG Knowledge settings
|
|
38
|
+
index_on_startup: bool
|
|
39
|
+
max_knowledge_files: int
|
|
40
|
+
|
|
41
|
+
# Adaptive behavior flags
|
|
42
|
+
background_indexing_enabled: bool
|
|
43
|
+
cache_warming_enabled: bool
|
|
44
|
+
emergency_cleanup_active: bool
|
|
45
|
+
|
|
46
|
+
# Adaptive control settings (derived from hardware profile)
|
|
47
|
+
# Context7 best practice: make new adaptive knobs backward-compatible with safe defaults,
|
|
48
|
+
# then allow hardware profiles to override them (see UnifiedCache initialization).
|
|
49
|
+
resource_check_interval: int = 60
|
|
50
|
+
emergency_cleanup_threshold: float = 0.80 # Memory usage % to trigger cleanup
|
|
51
|
+
|
|
52
|
+
def to_dict(self) -> dict[str, Any]:
|
|
53
|
+
"""Convert to dictionary."""
|
|
54
|
+
return asdict(self)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class ConfigurationChange:
|
|
59
|
+
"""Record of a configuration change."""
|
|
60
|
+
|
|
61
|
+
timestamp: str
|
|
62
|
+
reason: str
|
|
63
|
+
old_settings: dict[str, Any]
|
|
64
|
+
new_settings: dict[str, Any]
|
|
65
|
+
resource_metrics: dict[str, Any]
|
|
66
|
+
|
|
67
|
+
def to_dict(self) -> dict[str, Any]:
|
|
68
|
+
"""Convert to dictionary."""
|
|
69
|
+
return asdict(self)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class AdaptiveCacheConfig:
|
|
73
|
+
"""
|
|
74
|
+
Dynamically adjusts cache configuration based on resource usage.
|
|
75
|
+
|
|
76
|
+
Monitors CPU, memory, and disk usage and adjusts cache settings
|
|
77
|
+
to maintain optimal performance under resource constraints.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
def __init__(
|
|
81
|
+
self,
|
|
82
|
+
resource_monitor: ResourceMonitor | None = None,
|
|
83
|
+
hardware_profiler: HardwareProfiler | None = None,
|
|
84
|
+
hardware_profile: HardwareProfile | None = None,
|
|
85
|
+
check_interval: int = 60,
|
|
86
|
+
enable_logging: bool = True,
|
|
87
|
+
):
|
|
88
|
+
"""
|
|
89
|
+
Initialize adaptive cache configuration.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
resource_monitor: ResourceMonitor instance (creates default if not provided)
|
|
93
|
+
hardware_profiler: HardwareProfiler instance (creates default if not provided)
|
|
94
|
+
check_interval: Interval in seconds between resource checks
|
|
95
|
+
enable_logging: Whether to log configuration changes
|
|
96
|
+
"""
|
|
97
|
+
self.resource_monitor = resource_monitor or ResourceMonitor()
|
|
98
|
+
self.hardware_profiler = hardware_profiler or HardwareProfiler()
|
|
99
|
+
self.check_interval = check_interval
|
|
100
|
+
self.enable_logging = enable_logging
|
|
101
|
+
|
|
102
|
+
# Get base optimization profile from hardware
|
|
103
|
+
self.hardware_profile = (
|
|
104
|
+
hardware_profile or self.hardware_profiler.detect_profile()
|
|
105
|
+
)
|
|
106
|
+
self.base_profile = self.hardware_profiler.get_optimization_profile(
|
|
107
|
+
self.hardware_profile
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Current adaptive settings (initialized from base profile)
|
|
111
|
+
self.current_settings = self._create_settings_from_profile(self.base_profile)
|
|
112
|
+
|
|
113
|
+
# Track configuration changes
|
|
114
|
+
self.config_changes: list[ConfigurationChange] = []
|
|
115
|
+
self.last_check_time: datetime | None = None
|
|
116
|
+
|
|
117
|
+
# Thresholds for adaptive behavior
|
|
118
|
+
self.memory_warning_threshold = 80.0 # % memory usage
|
|
119
|
+
self.memory_critical_threshold = 90.0
|
|
120
|
+
self.memory_low_threshold = 60.0
|
|
121
|
+
|
|
122
|
+
self.cpu_warning_threshold = 70.0 # % CPU usage
|
|
123
|
+
self.cpu_critical_threshold = 85.0
|
|
124
|
+
|
|
125
|
+
self.disk_warning_threshold = 80.0 # % disk usage
|
|
126
|
+
self.disk_critical_threshold = 90.0
|
|
127
|
+
self.disk_free_warning_threshold = 20.0 # % free disk
|
|
128
|
+
self.disk_free_critical_threshold = 10.0
|
|
129
|
+
|
|
130
|
+
def _create_settings_from_profile(
|
|
131
|
+
self, profile: CacheOptimizationProfile
|
|
132
|
+
) -> AdaptiveCacheSettings:
|
|
133
|
+
"""Create adaptive settings from optimization profile."""
|
|
134
|
+
return AdaptiveCacheSettings(
|
|
135
|
+
tier1_ttl=profile.tier1_ttl,
|
|
136
|
+
tier2_ttl=profile.tier2_ttl,
|
|
137
|
+
tier3_ttl=profile.tier3_ttl,
|
|
138
|
+
max_in_memory_entries=profile.max_in_memory_entries,
|
|
139
|
+
hybrid_mode=profile.hybrid_mode,
|
|
140
|
+
compression_enabled=profile.compression_enabled,
|
|
141
|
+
max_cache_size_mb=profile.max_cache_size_mb,
|
|
142
|
+
pre_populate=profile.pre_populate,
|
|
143
|
+
auto_refresh=profile.auto_refresh,
|
|
144
|
+
index_on_startup=profile.index_on_startup,
|
|
145
|
+
max_knowledge_files=profile.max_knowledge_files,
|
|
146
|
+
background_indexing_enabled=True,
|
|
147
|
+
cache_warming_enabled=True,
|
|
148
|
+
emergency_cleanup_active=False,
|
|
149
|
+
resource_check_interval=profile.resource_check_interval,
|
|
150
|
+
emergency_cleanup_threshold=profile.emergency_cleanup_threshold,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def check_and_adjust(self) -> bool:
|
|
154
|
+
"""
|
|
155
|
+
Check resource usage and adjust configuration if needed.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
True if configuration was adjusted
|
|
159
|
+
"""
|
|
160
|
+
# Check if enough time has passed since last check
|
|
161
|
+
now = datetime.now(UTC)
|
|
162
|
+
if self.last_check_time:
|
|
163
|
+
elapsed = (now - self.last_check_time).total_seconds()
|
|
164
|
+
if elapsed < self.check_interval:
|
|
165
|
+
return False
|
|
166
|
+
|
|
167
|
+
# Get current resource metrics
|
|
168
|
+
metrics = self.resource_monitor.get_current_metrics()
|
|
169
|
+
self.last_check_time = now
|
|
170
|
+
|
|
171
|
+
# Store old settings
|
|
172
|
+
old_settings = self.current_settings.to_dict()
|
|
173
|
+
adjusted = False
|
|
174
|
+
reasons = []
|
|
175
|
+
|
|
176
|
+
# Adjust based on memory pressure
|
|
177
|
+
if metrics.memory_percent > self.memory_critical_threshold:
|
|
178
|
+
# Critical memory pressure - disable in-memory cache, enable compression
|
|
179
|
+
if self.current_settings.max_in_memory_entries > 0:
|
|
180
|
+
self.current_settings.max_in_memory_entries = 0
|
|
181
|
+
self.current_settings.hybrid_mode = False
|
|
182
|
+
adjusted = True
|
|
183
|
+
reasons.append(
|
|
184
|
+
f"Critical memory pressure ({metrics.memory_percent:.1f}%)"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
if not self.current_settings.compression_enabled:
|
|
188
|
+
self.current_settings.compression_enabled = True
|
|
189
|
+
adjusted = True
|
|
190
|
+
reasons.append("Enabled compression due to memory pressure")
|
|
191
|
+
|
|
192
|
+
elif metrics.memory_percent > self.memory_warning_threshold:
|
|
193
|
+
# Warning memory pressure - reduce in-memory cache size
|
|
194
|
+
if self.current_settings.max_in_memory_entries > 0:
|
|
195
|
+
# Reduce to 50% of base profile
|
|
196
|
+
base_entries = self.base_profile.max_in_memory_entries
|
|
197
|
+
new_entries = max(10, int(base_entries * 0.5))
|
|
198
|
+
if self.current_settings.max_in_memory_entries != new_entries:
|
|
199
|
+
self.current_settings.max_in_memory_entries = new_entries
|
|
200
|
+
adjusted = True
|
|
201
|
+
reasons.append(
|
|
202
|
+
f"Reduced in-memory cache due to memory pressure ({metrics.memory_percent:.1f}%)"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
elif metrics.memory_percent < self.memory_low_threshold:
|
|
206
|
+
# Low memory usage - restore to base profile
|
|
207
|
+
if (
|
|
208
|
+
self.current_settings.max_in_memory_entries
|
|
209
|
+
< self.base_profile.max_in_memory_entries
|
|
210
|
+
):
|
|
211
|
+
self.current_settings.max_in_memory_entries = (
|
|
212
|
+
self.base_profile.max_in_memory_entries
|
|
213
|
+
)
|
|
214
|
+
self.current_settings.hybrid_mode = self.base_profile.hybrid_mode
|
|
215
|
+
adjusted = True
|
|
216
|
+
reasons.append(
|
|
217
|
+
f"Restored cache settings (memory usage {metrics.memory_percent:.1f}%)"
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# Adjust based on CPU pressure
|
|
221
|
+
if metrics.cpu_percent > self.cpu_critical_threshold:
|
|
222
|
+
# Critical CPU pressure - disable background operations
|
|
223
|
+
if self.current_settings.background_indexing_enabled:
|
|
224
|
+
self.current_settings.background_indexing_enabled = False
|
|
225
|
+
adjusted = True
|
|
226
|
+
reasons.append(
|
|
227
|
+
f"Disabled background indexing (CPU {metrics.cpu_percent:.1f}%)"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
if self.current_settings.cache_warming_enabled:
|
|
231
|
+
self.current_settings.cache_warming_enabled = False
|
|
232
|
+
adjusted = True
|
|
233
|
+
reasons.append("Disabled cache warming due to CPU pressure")
|
|
234
|
+
|
|
235
|
+
# Increase TTL to reduce refresh frequency
|
|
236
|
+
if self.current_settings.tier1_ttl < self.base_profile.tier1_ttl * 1.5:
|
|
237
|
+
self.current_settings.tier1_ttl = int(self.base_profile.tier1_ttl * 1.5)
|
|
238
|
+
self.current_settings.tier2_ttl = int(self.base_profile.tier2_ttl * 1.5)
|
|
239
|
+
self.current_settings.tier3_ttl = int(self.base_profile.tier3_ttl * 1.5)
|
|
240
|
+
adjusted = True
|
|
241
|
+
reasons.append("Increased TTL to reduce refresh frequency")
|
|
242
|
+
|
|
243
|
+
elif metrics.cpu_percent > self.cpu_warning_threshold:
|
|
244
|
+
# Warning CPU pressure - reduce background operations
|
|
245
|
+
if self.current_settings.background_indexing_enabled:
|
|
246
|
+
self.current_settings.background_indexing_enabled = False
|
|
247
|
+
adjusted = True
|
|
248
|
+
reasons.append(
|
|
249
|
+
f"Disabled background indexing (CPU {metrics.cpu_percent:.1f}%)"
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
elif metrics.cpu_percent < 50.0:
|
|
253
|
+
# Low CPU usage - restore background operations
|
|
254
|
+
if not self.current_settings.background_indexing_enabled:
|
|
255
|
+
self.current_settings.background_indexing_enabled = True
|
|
256
|
+
adjusted = True
|
|
257
|
+
reasons.append("Restored background indexing (CPU usage low)")
|
|
258
|
+
|
|
259
|
+
if not self.current_settings.cache_warming_enabled:
|
|
260
|
+
self.current_settings.cache_warming_enabled = True
|
|
261
|
+
adjusted = True
|
|
262
|
+
reasons.append("Restored cache warming")
|
|
263
|
+
|
|
264
|
+
# Restore TTL to base values
|
|
265
|
+
if self.current_settings.tier1_ttl != self.base_profile.tier1_ttl:
|
|
266
|
+
self.current_settings.tier1_ttl = self.base_profile.tier1_ttl
|
|
267
|
+
self.current_settings.tier2_ttl = self.base_profile.tier2_ttl
|
|
268
|
+
self.current_settings.tier3_ttl = self.base_profile.tier3_ttl
|
|
269
|
+
adjusted = True
|
|
270
|
+
reasons.append("Restored TTL to base values")
|
|
271
|
+
|
|
272
|
+
# Adjust based on disk space
|
|
273
|
+
disk_free_percent = 100.0 - metrics.disk_percent
|
|
274
|
+
if disk_free_percent < self.disk_free_critical_threshold:
|
|
275
|
+
# Critical disk space - emergency cleanup, disable cache growth
|
|
276
|
+
if not self.current_settings.emergency_cleanup_active:
|
|
277
|
+
self.current_settings.emergency_cleanup_active = True
|
|
278
|
+
adjusted = True
|
|
279
|
+
reasons.append(
|
|
280
|
+
f"Emergency cleanup activated (disk {disk_free_percent:.1f}% free)"
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Reduce max cache size
|
|
284
|
+
if (
|
|
285
|
+
self.current_settings.max_cache_size_mb
|
|
286
|
+
> self.base_profile.max_cache_size_mb * 0.5
|
|
287
|
+
):
|
|
288
|
+
self.current_settings.max_cache_size_mb = int(
|
|
289
|
+
self.base_profile.max_cache_size_mb * 0.5
|
|
290
|
+
)
|
|
291
|
+
adjusted = True
|
|
292
|
+
reasons.append("Reduced max cache size due to disk pressure")
|
|
293
|
+
|
|
294
|
+
# Enable compression
|
|
295
|
+
if not self.current_settings.compression_enabled:
|
|
296
|
+
self.current_settings.compression_enabled = True
|
|
297
|
+
adjusted = True
|
|
298
|
+
reasons.append("Enabled compression due to disk pressure")
|
|
299
|
+
|
|
300
|
+
elif disk_free_percent < self.disk_free_warning_threshold:
|
|
301
|
+
# Warning disk space - aggressive cleanup, reduce cache size
|
|
302
|
+
if (
|
|
303
|
+
self.current_settings.max_cache_size_mb
|
|
304
|
+
> self.base_profile.max_cache_size_mb * 0.75
|
|
305
|
+
):
|
|
306
|
+
self.current_settings.max_cache_size_mb = int(
|
|
307
|
+
self.base_profile.max_cache_size_mb * 0.75
|
|
308
|
+
)
|
|
309
|
+
adjusted = True
|
|
310
|
+
reasons.append(
|
|
311
|
+
f"Reduced cache size (disk {disk_free_percent:.1f}% free)"
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
elif disk_free_percent > 30.0:
|
|
315
|
+
# Plenty of disk space - restore settings
|
|
316
|
+
if self.current_settings.emergency_cleanup_active:
|
|
317
|
+
self.current_settings.emergency_cleanup_active = False
|
|
318
|
+
adjusted = True
|
|
319
|
+
reasons.append("Deactivated emergency cleanup (disk space available)")
|
|
320
|
+
|
|
321
|
+
if (
|
|
322
|
+
self.current_settings.max_cache_size_mb
|
|
323
|
+
< self.base_profile.max_cache_size_mb
|
|
324
|
+
):
|
|
325
|
+
self.current_settings.max_cache_size_mb = (
|
|
326
|
+
self.base_profile.max_cache_size_mb
|
|
327
|
+
)
|
|
328
|
+
adjusted = True
|
|
329
|
+
reasons.append("Restored max cache size")
|
|
330
|
+
|
|
331
|
+
# Log configuration change if adjusted
|
|
332
|
+
if adjusted:
|
|
333
|
+
new_settings = self.current_settings.to_dict()
|
|
334
|
+
change = ConfigurationChange(
|
|
335
|
+
timestamp=now.isoformat(),
|
|
336
|
+
reason="; ".join(reasons),
|
|
337
|
+
old_settings=old_settings,
|
|
338
|
+
new_settings=new_settings,
|
|
339
|
+
resource_metrics={
|
|
340
|
+
"cpu_percent": metrics.cpu_percent,
|
|
341
|
+
"memory_percent": metrics.memory_percent,
|
|
342
|
+
"disk_percent": metrics.disk_percent,
|
|
343
|
+
"disk_free_percent": disk_free_percent,
|
|
344
|
+
},
|
|
345
|
+
)
|
|
346
|
+
self.config_changes.append(change)
|
|
347
|
+
|
|
348
|
+
# Keep only last 100 changes
|
|
349
|
+
if len(self.config_changes) > 100:
|
|
350
|
+
self.config_changes = self.config_changes[-100:]
|
|
351
|
+
|
|
352
|
+
if self.enable_logging:
|
|
353
|
+
logger.info(
|
|
354
|
+
f"Adaptive cache configuration adjusted: {change.reason}. "
|
|
355
|
+
f"CPU: {metrics.cpu_percent:.1f}%, Memory: {metrics.memory_percent:.1f}%, "
|
|
356
|
+
f"Disk: {disk_free_percent:.1f}% free"
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
return adjusted
|
|
360
|
+
|
|
361
|
+
def get_current_settings(self) -> AdaptiveCacheSettings:
|
|
362
|
+
"""Get current adaptive cache settings."""
|
|
363
|
+
return self.current_settings
|
|
364
|
+
|
|
365
|
+
def get_recent_changes(self, count: int = 10) -> list[ConfigurationChange]:
|
|
366
|
+
"""
|
|
367
|
+
Get recent configuration changes.
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
count: Number of changes to return
|
|
371
|
+
|
|
372
|
+
Returns:
|
|
373
|
+
List of recent configuration changes
|
|
374
|
+
"""
|
|
375
|
+
return self.config_changes[-count:]
|
|
376
|
+
|
|
377
|
+
def reset_to_base_profile(self):
|
|
378
|
+
"""Reset settings to base hardware profile."""
|
|
379
|
+
old_settings = self.current_settings.to_dict()
|
|
380
|
+
self.current_settings = self._create_settings_from_profile(self.base_profile)
|
|
381
|
+
new_settings = self.current_settings.to_dict()
|
|
382
|
+
|
|
383
|
+
change = ConfigurationChange(
|
|
384
|
+
timestamp=datetime.now(UTC).isoformat(),
|
|
385
|
+
reason="Manual reset to base profile",
|
|
386
|
+
old_settings=old_settings,
|
|
387
|
+
new_settings=new_settings,
|
|
388
|
+
resource_metrics={},
|
|
389
|
+
)
|
|
390
|
+
self.config_changes.append(change)
|
|
391
|
+
|
|
392
|
+
if self.enable_logging:
|
|
393
|
+
logger.info("Adaptive cache configuration reset to base profile")
|
|
394
|
+
|
|
395
|
+
def get_status(self) -> dict[str, Any]:
|
|
396
|
+
"""
|
|
397
|
+
Get current status of adaptive configuration.
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
Dictionary with status information
|
|
401
|
+
"""
|
|
402
|
+
metrics = self.resource_monitor.get_current_metrics()
|
|
403
|
+
disk_free_percent = 100.0 - metrics.disk_percent
|
|
404
|
+
|
|
405
|
+
return {
|
|
406
|
+
"hardware_profile": self.hardware_profile.value,
|
|
407
|
+
"current_settings": self.current_settings.to_dict(),
|
|
408
|
+
"base_profile": {
|
|
409
|
+
"tier1_ttl": self.base_profile.tier1_ttl,
|
|
410
|
+
"tier2_ttl": self.base_profile.tier2_ttl,
|
|
411
|
+
"tier3_ttl": self.base_profile.tier3_ttl,
|
|
412
|
+
"max_in_memory_entries": self.base_profile.max_in_memory_entries,
|
|
413
|
+
"max_cache_size_mb": self.base_profile.max_cache_size_mb,
|
|
414
|
+
},
|
|
415
|
+
"resource_metrics": {
|
|
416
|
+
"cpu_percent": metrics.cpu_percent,
|
|
417
|
+
"memory_percent": metrics.memory_percent,
|
|
418
|
+
"disk_percent": metrics.disk_percent,
|
|
419
|
+
"disk_free_percent": disk_free_percent,
|
|
420
|
+
},
|
|
421
|
+
"adaptive_behavior": {
|
|
422
|
+
"memory_pressure": metrics.memory_percent
|
|
423
|
+
> self.memory_warning_threshold,
|
|
424
|
+
"cpu_pressure": metrics.cpu_percent > self.cpu_warning_threshold,
|
|
425
|
+
"disk_pressure": disk_free_percent < self.disk_free_warning_threshold,
|
|
426
|
+
"emergency_cleanup": self.current_settings.emergency_cleanup_active,
|
|
427
|
+
},
|
|
428
|
+
"total_changes": len(self.config_changes),
|
|
429
|
+
"last_check": (
|
|
430
|
+
self.last_check_time.isoformat() if self.last_check_time else None
|
|
431
|
+
),
|
|
432
|
+
}
|