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,404 +1,404 @@
|
|
|
1
|
-
"""
|
|
2
|
-
KB Cache - Main cache manager for Context7 knowledge base.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
|
|
7
|
-
import re
|
|
8
|
-
from dataclasses import dataclass
|
|
9
|
-
from datetime import UTC, datetime
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
|
|
12
|
-
from .cache_locking import cache_lock, get_cache_lock_file
|
|
13
|
-
from .cache_structure import CacheStructure
|
|
14
|
-
from .metadata import MetadataManager
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@dataclass
|
|
18
|
-
class CacheEntry:
|
|
19
|
-
"""Represents a cached documentation entry."""
|
|
20
|
-
|
|
21
|
-
library: str
|
|
22
|
-
topic: str
|
|
23
|
-
content: str
|
|
24
|
-
context7_id: str | None = None
|
|
25
|
-
trust_score: float | None = None
|
|
26
|
-
snippet_count: int = 0
|
|
27
|
-
token_count: int = 0
|
|
28
|
-
cached_at: str | None = None
|
|
29
|
-
cache_hits: int = 0
|
|
30
|
-
|
|
31
|
-
def to_dict(self) -> dict:
|
|
32
|
-
"""Convert cache entry to dictionary."""
|
|
33
|
-
return {
|
|
34
|
-
"library": self.library,
|
|
35
|
-
"topic": self.topic,
|
|
36
|
-
"content": self.content,
|
|
37
|
-
"context7_id": self.context7_id,
|
|
38
|
-
"trust_score": self.trust_score,
|
|
39
|
-
"snippet_count": self.snippet_count,
|
|
40
|
-
"token_count": self.token_count,
|
|
41
|
-
"cached_at": self.cached_at,
|
|
42
|
-
"cache_hits": self.cache_hits,
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
def to_markdown(self) -> str:
|
|
46
|
-
"""Convert cache entry to markdown format."""
|
|
47
|
-
lines = [
|
|
48
|
-
f"# {self.library} - {self.topic}",
|
|
49
|
-
"",
|
|
50
|
-
f"**Source**: {self.context7_id or 'Unknown'} (Trust Score: {self.trust_score or 'N/A'})",
|
|
51
|
-
f"**Snippets**: {self.snippet_count} | **Tokens**: {self.token_count}",
|
|
52
|
-
f"**Last Updated**: {self.cached_at or datetime.now(UTC).isoformat() + 'Z'} | **Cache Hits**: {self.cache_hits}",
|
|
53
|
-
"",
|
|
54
|
-
"---",
|
|
55
|
-
"",
|
|
56
|
-
self.content,
|
|
57
|
-
"",
|
|
58
|
-
"---",
|
|
59
|
-
"",
|
|
60
|
-
"<!-- KB Metadata -->",
|
|
61
|
-
f"<!-- Library: {self.library} -->",
|
|
62
|
-
f"<!-- Topic: {self.topic} -->",
|
|
63
|
-
f"<!-- Context7 ID: {self.context7_id or 'Unknown'} -->",
|
|
64
|
-
f"<!-- Trust Score: {self.trust_score or 'N/A'} -->",
|
|
65
|
-
f"<!-- Snippet Count: {self.snippet_count} -->",
|
|
66
|
-
f"<!-- Last Updated: {self.cached_at or datetime.now(UTC).isoformat() + 'Z'} -->",
|
|
67
|
-
f"<!-- Cache Hits: {self.cache_hits} -->",
|
|
68
|
-
f"<!-- Token Count: {self.token_count} -->",
|
|
69
|
-
]
|
|
70
|
-
return "\n".join(lines)
|
|
71
|
-
|
|
72
|
-
@classmethod
|
|
73
|
-
def from_markdown(
|
|
74
|
-
cls, library: str, topic: str, markdown_content: str
|
|
75
|
-
) -> CacheEntry:
|
|
76
|
-
"""Parse cache entry from markdown file."""
|
|
77
|
-
lines = markdown_content.split("\n")
|
|
78
|
-
|
|
79
|
-
# Extract metadata from HTML comments
|
|
80
|
-
metadata = {}
|
|
81
|
-
for line in lines:
|
|
82
|
-
if line.strip().startswith("<!--") and "-->" in line:
|
|
83
|
-
comment = line.strip()[4:-3].strip()
|
|
84
|
-
if ": " in comment:
|
|
85
|
-
key, value = comment.split(": ", 1)
|
|
86
|
-
# Normalize key (e.g., "Context7 ID" -> "context7_id")
|
|
87
|
-
key_normalized = key.lower().replace(" ", "_")
|
|
88
|
-
metadata[key_normalized] = value
|
|
89
|
-
|
|
90
|
-
# Extract header information
|
|
91
|
-
# Match "**Source**: /path/to/lib (Trust Score: 0.95)" or "**Source**: /path/to/lib"
|
|
92
|
-
# Use more explicit pattern that stops before " (" or end of line
|
|
93
|
-
source_line_match = re.search(r"\*\*Source\*\*: ([^\n]+)", markdown_content)
|
|
94
|
-
if source_line_match:
|
|
95
|
-
source_line = source_line_match.group(1).strip()
|
|
96
|
-
# Split on " (" to separate context7_id from trust score
|
|
97
|
-
if " (Trust Score:" in source_line:
|
|
98
|
-
parts = source_line.split(" (Trust Score:", 1)
|
|
99
|
-
context7_id = parts[0].strip()
|
|
100
|
-
trust_score_match = re.search(r"([\d.]+)\)", parts[1])
|
|
101
|
-
trust_score = (
|
|
102
|
-
float(trust_score_match.group(1)) if trust_score_match else None
|
|
103
|
-
)
|
|
104
|
-
else:
|
|
105
|
-
context7_id = source_line
|
|
106
|
-
trust_score = None
|
|
107
|
-
else:
|
|
108
|
-
context7_id = None
|
|
109
|
-
trust_score = None
|
|
110
|
-
|
|
111
|
-
snippets_match = re.search(r"\*\*Snippets\*\*: (\d+)", markdown_content)
|
|
112
|
-
snippet_count = int(snippets_match.group(1)) if snippets_match else 0
|
|
113
|
-
|
|
114
|
-
tokens_match = re.search(r"\*\*Tokens\*\*: (\d+)", markdown_content)
|
|
115
|
-
token_count = int(tokens_match.group(1)) if tokens_match else 0
|
|
116
|
-
|
|
117
|
-
hits_match = re.search(r"\*\*Cache Hits\*\*: (\d+)", markdown_content)
|
|
118
|
-
cache_hits = int(hits_match.group(1)) if hits_match else 0
|
|
119
|
-
|
|
120
|
-
# Extract content (between header and metadata comments)
|
|
121
|
-
content_start = markdown_content.find("---\n\n") + 5
|
|
122
|
-
content_end = markdown_content.rfind("\n---\n\n<!-- KB Metadata -->")
|
|
123
|
-
if content_end == -1:
|
|
124
|
-
content_end = markdown_content.rfind("<!-- KB Metadata -->")
|
|
125
|
-
content = (
|
|
126
|
-
markdown_content[content_start:content_end].strip()
|
|
127
|
-
if content_end > content_start
|
|
128
|
-
else markdown_content
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
return cls(
|
|
132
|
-
library=library,
|
|
133
|
-
topic=topic,
|
|
134
|
-
content=content,
|
|
135
|
-
context7_id=context7_id or metadata.get("context7_id"),
|
|
136
|
-
trust_score=trust_score
|
|
137
|
-
or (
|
|
138
|
-
float(metadata.get("trust score", 0))
|
|
139
|
-
if metadata.get("trust score") and metadata.get("trust score") != "N/A"
|
|
140
|
-
else None
|
|
141
|
-
),
|
|
142
|
-
snippet_count=snippet_count or int(metadata.get("snippet count", 0)),
|
|
143
|
-
token_count=token_count or int(metadata.get("token count", 0)),
|
|
144
|
-
cached_at=metadata.get("last updated")
|
|
145
|
-
or datetime.now(UTC).isoformat() + "Z",
|
|
146
|
-
cache_hits=cache_hits or int(metadata.get("cache hits", 0)),
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
class KBCache:
|
|
151
|
-
"""Main KB cache manager for Context7 documentation."""
|
|
152
|
-
|
|
153
|
-
def __init__(
|
|
154
|
-
self,
|
|
155
|
-
cache_root: Path | None = None,
|
|
156
|
-
cache_dir: Path | None = None,
|
|
157
|
-
metadata_manager: MetadataManager | None = None,
|
|
158
|
-
):
|
|
159
|
-
"""
|
|
160
|
-
Initialize KB cache manager.
|
|
161
|
-
|
|
162
|
-
Args:
|
|
163
|
-
cache_root: Root directory for KB cache (preferred parameter name)
|
|
164
|
-
cache_dir: Alternative parameter name for cache_root (for backward compatibility)
|
|
165
|
-
metadata_manager: Optional MetadataManager instance (creates new one if not provided)
|
|
166
|
-
"""
|
|
167
|
-
# Support both cache_root and cache_dir for backward compatibility
|
|
168
|
-
root = cache_root or cache_dir
|
|
169
|
-
if root is None:
|
|
170
|
-
# Default to current directory if neither provided
|
|
171
|
-
from pathlib import Path as P
|
|
172
|
-
root = P.cwd() / ".tapps-agents" / "kb" / "context7-cache"
|
|
173
|
-
else:
|
|
174
|
-
root = Path(root)
|
|
175
|
-
|
|
176
|
-
self.cache_root = root
|
|
177
|
-
self.cache_dir = root # Alias for backward compatibility
|
|
178
|
-
try:
|
|
179
|
-
self.cache_structure = CacheStructure(root)
|
|
180
|
-
self.metadata_manager = metadata_manager or MetadataManager(
|
|
181
|
-
self.cache_structure
|
|
182
|
-
)
|
|
183
|
-
self.cache_structure.initialize()
|
|
184
|
-
except Exception as e:
|
|
185
|
-
import logging
|
|
186
|
-
logger = logging.getLogger(__name__)
|
|
187
|
-
logger.warning(
|
|
188
|
-
f"Failed to initialize KBCache at {root}: {e}. "
|
|
189
|
-
f"KBCache will not be available."
|
|
190
|
-
)
|
|
191
|
-
# Set minimal attributes to prevent AttributeError
|
|
192
|
-
self.cache_structure = None
|
|
193
|
-
self.metadata_manager = metadata_manager
|
|
194
|
-
raise
|
|
195
|
-
|
|
196
|
-
def get(self, library: str, topic: str) -> CacheEntry | None:
|
|
197
|
-
"""
|
|
198
|
-
Retrieve cached entry.
|
|
199
|
-
|
|
200
|
-
Args:
|
|
201
|
-
library: Library name
|
|
202
|
-
topic: Topic name
|
|
203
|
-
|
|
204
|
-
Returns:
|
|
205
|
-
CacheEntry if found, None otherwise
|
|
206
|
-
"""
|
|
207
|
-
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
208
|
-
if not doc_file.exists():
|
|
209
|
-
return None
|
|
210
|
-
|
|
211
|
-
try:
|
|
212
|
-
content = doc_file.read_text(encoding="utf-8")
|
|
213
|
-
entry = CacheEntry.from_markdown(library, topic, content)
|
|
214
|
-
|
|
215
|
-
# Update metadata (increment hits, update last accessed)
|
|
216
|
-
self.metadata_manager.update_library_metadata(
|
|
217
|
-
library, topic=topic, increment_hits=True
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
return entry
|
|
221
|
-
except Exception:
|
|
222
|
-
return None
|
|
223
|
-
|
|
224
|
-
def store(
|
|
225
|
-
self,
|
|
226
|
-
library: str | CacheEntry,
|
|
227
|
-
topic: str | None = None,
|
|
228
|
-
content: str | None = None,
|
|
229
|
-
context7_id: str | None = None,
|
|
230
|
-
trust_score: float | None = None,
|
|
231
|
-
snippet_count: int | None = None,
|
|
232
|
-
) -> CacheEntry:
|
|
233
|
-
"""
|
|
234
|
-
Store entry in cache.
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
library: Library name, or CacheEntry instance (if entry is provided, other params ignored)
|
|
238
|
-
topic: Topic name (required if library is a string)
|
|
239
|
-
content: Documentation content (required if library is a string)
|
|
240
|
-
context7_id: Optional Context7 ID
|
|
241
|
-
trust_score: Optional trust score
|
|
242
|
-
snippet_count: Optional snippet count
|
|
243
|
-
|
|
244
|
-
Returns:
|
|
245
|
-
CacheEntry instance
|
|
246
|
-
"""
|
|
247
|
-
# Support both CacheEntry object and individual parameters
|
|
248
|
-
if isinstance(library, CacheEntry):
|
|
249
|
-
entry = library
|
|
250
|
-
library = entry.library
|
|
251
|
-
topic = entry.topic
|
|
252
|
-
content = entry.content
|
|
253
|
-
context7_id = entry.context7_id or context7_id
|
|
254
|
-
trust_score = entry.trust_score if entry.trust_score is not None else trust_score
|
|
255
|
-
snippet_count = entry.snippet_count if entry.snippet_count else snippet_count
|
|
256
|
-
else:
|
|
257
|
-
if topic is None or content is None:
|
|
258
|
-
raise ValueError("topic and content are required when library is a string")
|
|
259
|
-
# Estimate token count (rough approximation: 1 token ≈ 4 characters)
|
|
260
|
-
token_count = len(content) // 4
|
|
261
|
-
|
|
262
|
-
entry = CacheEntry(
|
|
263
|
-
library=library,
|
|
264
|
-
topic=topic,
|
|
265
|
-
content=content,
|
|
266
|
-
context7_id=context7_id,
|
|
267
|
-
trust_score=trust_score,
|
|
268
|
-
snippet_count=snippet_count or 0,
|
|
269
|
-
token_count=token_count,
|
|
270
|
-
cached_at=datetime.now(UTC).isoformat() + "Z",
|
|
271
|
-
cache_hits=0,
|
|
272
|
-
)
|
|
273
|
-
|
|
274
|
-
# Update cached_at if not set
|
|
275
|
-
if not entry.cached_at:
|
|
276
|
-
entry.cached_at = datetime.now(UTC).isoformat() + "Z"
|
|
277
|
-
|
|
278
|
-
# Use file locking for atomic writes (with short timeout for faster fail)
|
|
279
|
-
lock_file = get_cache_lock_file(self.cache_root, library=library)
|
|
280
|
-
try:
|
|
281
|
-
with cache_lock(lock_file, timeout=3.0): # Short timeout - fail fast
|
|
282
|
-
# Ensure library directory exists
|
|
283
|
-
self.cache_structure.ensure_library_dir(library)
|
|
284
|
-
|
|
285
|
-
# Write markdown file
|
|
286
|
-
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
287
|
-
doc_file.write_text(entry.to_markdown(), encoding="utf-8")
|
|
288
|
-
|
|
289
|
-
# Update metadata (non-critical, continue if fails)
|
|
290
|
-
try:
|
|
291
|
-
self.metadata_manager.update_library_metadata(
|
|
292
|
-
library, context7_id=context7_id, topic=topic
|
|
293
|
-
)
|
|
294
|
-
except Exception as e:
|
|
295
|
-
import logging
|
|
296
|
-
logger = logging.getLogger(__name__)
|
|
297
|
-
logger.debug(f"Failed to update library metadata: {e}")
|
|
298
|
-
|
|
299
|
-
# Update cache index (non-critical, continue if fails)
|
|
300
|
-
try:
|
|
301
|
-
self.metadata_manager.update_cache_index(
|
|
302
|
-
library, topic, context7_id=context7_id
|
|
303
|
-
)
|
|
304
|
-
except Exception as e:
|
|
305
|
-
import logging
|
|
306
|
-
logger = logging.getLogger(__name__)
|
|
307
|
-
logger.debug(f"Failed to update cache index: {e}")
|
|
308
|
-
except RuntimeError as e:
|
|
309
|
-
# Cache lock acquisition failed - log and continue without caching
|
|
310
|
-
# This allows the operation to continue even if cache write fails
|
|
311
|
-
import logging
|
|
312
|
-
logger = logging.getLogger(__name__)
|
|
313
|
-
logger.warning(
|
|
314
|
-
f"Failed to acquire cache lock for {library}/{topic}: {e}. "
|
|
315
|
-
f"Continuing without caching."
|
|
316
|
-
)
|
|
317
|
-
# Don't raise - allow operation to continue without cache
|
|
318
|
-
except (OSError, PermissionError) as e:
|
|
319
|
-
import logging
|
|
320
|
-
logger = logging.getLogger(__name__)
|
|
321
|
-
logger.warning(f"Failed to store cache entry for {library}/{topic}: {e}")
|
|
322
|
-
# Don't raise - allow operation to continue without cache
|
|
323
|
-
|
|
324
|
-
return entry
|
|
325
|
-
|
|
326
|
-
def exists(self, library: str, topic: str) -> bool:
|
|
327
|
-
"""
|
|
328
|
-
Check if entry exists in cache.
|
|
329
|
-
|
|
330
|
-
Args:
|
|
331
|
-
library: Library name
|
|
332
|
-
topic: Topic name
|
|
333
|
-
|
|
334
|
-
Returns:
|
|
335
|
-
True if entry exists
|
|
336
|
-
"""
|
|
337
|
-
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
338
|
-
return doc_file.exists()
|
|
339
|
-
|
|
340
|
-
def delete(self, library: str, topic: str | None = None) -> bool:
|
|
341
|
-
"""
|
|
342
|
-
Delete entry or entire library from cache.
|
|
343
|
-
|
|
344
|
-
Args:
|
|
345
|
-
library: Library name
|
|
346
|
-
topic: Optional topic name (if None, deletes entire library)
|
|
347
|
-
|
|
348
|
-
Returns:
|
|
349
|
-
True if deletion was successful, False otherwise
|
|
350
|
-
"""
|
|
351
|
-
if topic:
|
|
352
|
-
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
353
|
-
if doc_file.exists():
|
|
354
|
-
doc_file.unlink()
|
|
355
|
-
self.metadata_manager.update_cache_index(library, topic, remove=True)
|
|
356
|
-
return True
|
|
357
|
-
return False
|
|
358
|
-
else:
|
|
359
|
-
lib_dir = self.cache_structure.get_library_dir(library)
|
|
360
|
-
if lib_dir.exists():
|
|
361
|
-
import shutil
|
|
362
|
-
|
|
363
|
-
shutil.rmtree(lib_dir)
|
|
364
|
-
|
|
365
|
-
# Remove from index
|
|
366
|
-
index = self.metadata_manager.load_cache_index()
|
|
367
|
-
if library in index.libraries:
|
|
368
|
-
del index.libraries[library]
|
|
369
|
-
self.metadata_manager.save_cache_index(index)
|
|
370
|
-
return True
|
|
371
|
-
return False
|
|
372
|
-
|
|
373
|
-
def list_entries(self) -> list[CacheEntry]:
|
|
374
|
-
"""
|
|
375
|
-
List all cache entries.
|
|
376
|
-
|
|
377
|
-
Returns:
|
|
378
|
-
List of CacheEntry instances
|
|
379
|
-
"""
|
|
380
|
-
entries = []
|
|
381
|
-
index = self.metadata_manager.load_cache_index()
|
|
382
|
-
for library_name, library_info in index.libraries.items():
|
|
383
|
-
for topic_name in library_info.get("topics", {}):
|
|
384
|
-
entry = self.get(library_name, topic_name)
|
|
385
|
-
if entry:
|
|
386
|
-
entries.append(entry)
|
|
387
|
-
return entries
|
|
388
|
-
|
|
389
|
-
def clear(self) -> None:
|
|
390
|
-
"""
|
|
391
|
-
Clear all cache entries.
|
|
392
|
-
"""
|
|
393
|
-
import shutil
|
|
394
|
-
|
|
395
|
-
# Delete all library directories
|
|
396
|
-
for library_dir in self.cache_structure.cache_root.iterdir():
|
|
397
|
-
if library_dir.is_dir() and library_dir.name != "metadata":
|
|
398
|
-
shutil.rmtree(library_dir)
|
|
399
|
-
|
|
400
|
-
# Reset index
|
|
401
|
-
from .cache_structure import CacheIndex
|
|
402
|
-
|
|
403
|
-
index = CacheIndex(version="1.0", last_updated=None, total_entries=0, libraries={})
|
|
404
|
-
self.metadata_manager.save_cache_index(index)
|
|
1
|
+
"""
|
|
2
|
+
KB Cache - Main cache manager for Context7 knowledge base.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from datetime import UTC, datetime
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from .cache_locking import cache_lock, get_cache_lock_file
|
|
13
|
+
from .cache_structure import CacheStructure
|
|
14
|
+
from .metadata import MetadataManager
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class CacheEntry:
|
|
19
|
+
"""Represents a cached documentation entry."""
|
|
20
|
+
|
|
21
|
+
library: str
|
|
22
|
+
topic: str
|
|
23
|
+
content: str
|
|
24
|
+
context7_id: str | None = None
|
|
25
|
+
trust_score: float | None = None
|
|
26
|
+
snippet_count: int = 0
|
|
27
|
+
token_count: int = 0
|
|
28
|
+
cached_at: str | None = None
|
|
29
|
+
cache_hits: int = 0
|
|
30
|
+
|
|
31
|
+
def to_dict(self) -> dict:
|
|
32
|
+
"""Convert cache entry to dictionary."""
|
|
33
|
+
return {
|
|
34
|
+
"library": self.library,
|
|
35
|
+
"topic": self.topic,
|
|
36
|
+
"content": self.content,
|
|
37
|
+
"context7_id": self.context7_id,
|
|
38
|
+
"trust_score": self.trust_score,
|
|
39
|
+
"snippet_count": self.snippet_count,
|
|
40
|
+
"token_count": self.token_count,
|
|
41
|
+
"cached_at": self.cached_at,
|
|
42
|
+
"cache_hits": self.cache_hits,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
def to_markdown(self) -> str:
|
|
46
|
+
"""Convert cache entry to markdown format."""
|
|
47
|
+
lines = [
|
|
48
|
+
f"# {self.library} - {self.topic}",
|
|
49
|
+
"",
|
|
50
|
+
f"**Source**: {self.context7_id or 'Unknown'} (Trust Score: {self.trust_score or 'N/A'})",
|
|
51
|
+
f"**Snippets**: {self.snippet_count} | **Tokens**: {self.token_count}",
|
|
52
|
+
f"**Last Updated**: {self.cached_at or datetime.now(UTC).isoformat() + 'Z'} | **Cache Hits**: {self.cache_hits}",
|
|
53
|
+
"",
|
|
54
|
+
"---",
|
|
55
|
+
"",
|
|
56
|
+
self.content,
|
|
57
|
+
"",
|
|
58
|
+
"---",
|
|
59
|
+
"",
|
|
60
|
+
"<!-- KB Metadata -->",
|
|
61
|
+
f"<!-- Library: {self.library} -->",
|
|
62
|
+
f"<!-- Topic: {self.topic} -->",
|
|
63
|
+
f"<!-- Context7 ID: {self.context7_id or 'Unknown'} -->",
|
|
64
|
+
f"<!-- Trust Score: {self.trust_score or 'N/A'} -->",
|
|
65
|
+
f"<!-- Snippet Count: {self.snippet_count} -->",
|
|
66
|
+
f"<!-- Last Updated: {self.cached_at or datetime.now(UTC).isoformat() + 'Z'} -->",
|
|
67
|
+
f"<!-- Cache Hits: {self.cache_hits} -->",
|
|
68
|
+
f"<!-- Token Count: {self.token_count} -->",
|
|
69
|
+
]
|
|
70
|
+
return "\n".join(lines)
|
|
71
|
+
|
|
72
|
+
@classmethod
|
|
73
|
+
def from_markdown(
|
|
74
|
+
cls, library: str, topic: str, markdown_content: str
|
|
75
|
+
) -> CacheEntry:
|
|
76
|
+
"""Parse cache entry from markdown file."""
|
|
77
|
+
lines = markdown_content.split("\n")
|
|
78
|
+
|
|
79
|
+
# Extract metadata from HTML comments
|
|
80
|
+
metadata = {}
|
|
81
|
+
for line in lines:
|
|
82
|
+
if line.strip().startswith("<!--") and "-->" in line:
|
|
83
|
+
comment = line.strip()[4:-3].strip()
|
|
84
|
+
if ": " in comment:
|
|
85
|
+
key, value = comment.split(": ", 1)
|
|
86
|
+
# Normalize key (e.g., "Context7 ID" -> "context7_id")
|
|
87
|
+
key_normalized = key.lower().replace(" ", "_")
|
|
88
|
+
metadata[key_normalized] = value
|
|
89
|
+
|
|
90
|
+
# Extract header information
|
|
91
|
+
# Match "**Source**: /path/to/lib (Trust Score: 0.95)" or "**Source**: /path/to/lib"
|
|
92
|
+
# Use more explicit pattern that stops before " (" or end of line
|
|
93
|
+
source_line_match = re.search(r"\*\*Source\*\*: ([^\n]+)", markdown_content)
|
|
94
|
+
if source_line_match:
|
|
95
|
+
source_line = source_line_match.group(1).strip()
|
|
96
|
+
# Split on " (" to separate context7_id from trust score
|
|
97
|
+
if " (Trust Score:" in source_line:
|
|
98
|
+
parts = source_line.split(" (Trust Score:", 1)
|
|
99
|
+
context7_id = parts[0].strip()
|
|
100
|
+
trust_score_match = re.search(r"([\d.]+)\)", parts[1])
|
|
101
|
+
trust_score = (
|
|
102
|
+
float(trust_score_match.group(1)) if trust_score_match else None
|
|
103
|
+
)
|
|
104
|
+
else:
|
|
105
|
+
context7_id = source_line
|
|
106
|
+
trust_score = None
|
|
107
|
+
else:
|
|
108
|
+
context7_id = None
|
|
109
|
+
trust_score = None
|
|
110
|
+
|
|
111
|
+
snippets_match = re.search(r"\*\*Snippets\*\*: (\d+)", markdown_content)
|
|
112
|
+
snippet_count = int(snippets_match.group(1)) if snippets_match else 0
|
|
113
|
+
|
|
114
|
+
tokens_match = re.search(r"\*\*Tokens\*\*: (\d+)", markdown_content)
|
|
115
|
+
token_count = int(tokens_match.group(1)) if tokens_match else 0
|
|
116
|
+
|
|
117
|
+
hits_match = re.search(r"\*\*Cache Hits\*\*: (\d+)", markdown_content)
|
|
118
|
+
cache_hits = int(hits_match.group(1)) if hits_match else 0
|
|
119
|
+
|
|
120
|
+
# Extract content (between header and metadata comments)
|
|
121
|
+
content_start = markdown_content.find("---\n\n") + 5
|
|
122
|
+
content_end = markdown_content.rfind("\n---\n\n<!-- KB Metadata -->")
|
|
123
|
+
if content_end == -1:
|
|
124
|
+
content_end = markdown_content.rfind("<!-- KB Metadata -->")
|
|
125
|
+
content = (
|
|
126
|
+
markdown_content[content_start:content_end].strip()
|
|
127
|
+
if content_end > content_start
|
|
128
|
+
else markdown_content
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
return cls(
|
|
132
|
+
library=library,
|
|
133
|
+
topic=topic,
|
|
134
|
+
content=content,
|
|
135
|
+
context7_id=context7_id or metadata.get("context7_id"),
|
|
136
|
+
trust_score=trust_score
|
|
137
|
+
or (
|
|
138
|
+
float(metadata.get("trust score", 0))
|
|
139
|
+
if metadata.get("trust score") and metadata.get("trust score") != "N/A"
|
|
140
|
+
else None
|
|
141
|
+
),
|
|
142
|
+
snippet_count=snippet_count or int(metadata.get("snippet count", 0)),
|
|
143
|
+
token_count=token_count or int(metadata.get("token count", 0)),
|
|
144
|
+
cached_at=metadata.get("last updated")
|
|
145
|
+
or datetime.now(UTC).isoformat() + "Z",
|
|
146
|
+
cache_hits=cache_hits or int(metadata.get("cache hits", 0)),
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class KBCache:
|
|
151
|
+
"""Main KB cache manager for Context7 documentation."""
|
|
152
|
+
|
|
153
|
+
def __init__(
|
|
154
|
+
self,
|
|
155
|
+
cache_root: Path | None = None,
|
|
156
|
+
cache_dir: Path | None = None,
|
|
157
|
+
metadata_manager: MetadataManager | None = None,
|
|
158
|
+
):
|
|
159
|
+
"""
|
|
160
|
+
Initialize KB cache manager.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
cache_root: Root directory for KB cache (preferred parameter name)
|
|
164
|
+
cache_dir: Alternative parameter name for cache_root (for backward compatibility)
|
|
165
|
+
metadata_manager: Optional MetadataManager instance (creates new one if not provided)
|
|
166
|
+
"""
|
|
167
|
+
# Support both cache_root and cache_dir for backward compatibility
|
|
168
|
+
root = cache_root or cache_dir
|
|
169
|
+
if root is None:
|
|
170
|
+
# Default to current directory if neither provided
|
|
171
|
+
from pathlib import Path as P
|
|
172
|
+
root = P.cwd() / ".tapps-agents" / "kb" / "context7-cache"
|
|
173
|
+
else:
|
|
174
|
+
root = Path(root)
|
|
175
|
+
|
|
176
|
+
self.cache_root = root
|
|
177
|
+
self.cache_dir = root # Alias for backward compatibility
|
|
178
|
+
try:
|
|
179
|
+
self.cache_structure = CacheStructure(root)
|
|
180
|
+
self.metadata_manager = metadata_manager or MetadataManager(
|
|
181
|
+
self.cache_structure
|
|
182
|
+
)
|
|
183
|
+
self.cache_structure.initialize()
|
|
184
|
+
except Exception as e:
|
|
185
|
+
import logging
|
|
186
|
+
logger = logging.getLogger(__name__)
|
|
187
|
+
logger.warning(
|
|
188
|
+
f"Failed to initialize KBCache at {root}: {e}. "
|
|
189
|
+
f"KBCache will not be available."
|
|
190
|
+
)
|
|
191
|
+
# Set minimal attributes to prevent AttributeError
|
|
192
|
+
self.cache_structure = None
|
|
193
|
+
self.metadata_manager = metadata_manager
|
|
194
|
+
raise
|
|
195
|
+
|
|
196
|
+
def get(self, library: str, topic: str) -> CacheEntry | None:
|
|
197
|
+
"""
|
|
198
|
+
Retrieve cached entry.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
library: Library name
|
|
202
|
+
topic: Topic name
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
CacheEntry if found, None otherwise
|
|
206
|
+
"""
|
|
207
|
+
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
208
|
+
if not doc_file.exists():
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
try:
|
|
212
|
+
content = doc_file.read_text(encoding="utf-8")
|
|
213
|
+
entry = CacheEntry.from_markdown(library, topic, content)
|
|
214
|
+
|
|
215
|
+
# Update metadata (increment hits, update last accessed)
|
|
216
|
+
self.metadata_manager.update_library_metadata(
|
|
217
|
+
library, topic=topic, increment_hits=True
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
return entry
|
|
221
|
+
except Exception:
|
|
222
|
+
return None
|
|
223
|
+
|
|
224
|
+
def store(
|
|
225
|
+
self,
|
|
226
|
+
library: str | CacheEntry,
|
|
227
|
+
topic: str | None = None,
|
|
228
|
+
content: str | None = None,
|
|
229
|
+
context7_id: str | None = None,
|
|
230
|
+
trust_score: float | None = None,
|
|
231
|
+
snippet_count: int | None = None,
|
|
232
|
+
) -> CacheEntry:
|
|
233
|
+
"""
|
|
234
|
+
Store entry in cache.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
library: Library name, or CacheEntry instance (if entry is provided, other params ignored)
|
|
238
|
+
topic: Topic name (required if library is a string)
|
|
239
|
+
content: Documentation content (required if library is a string)
|
|
240
|
+
context7_id: Optional Context7 ID
|
|
241
|
+
trust_score: Optional trust score
|
|
242
|
+
snippet_count: Optional snippet count
|
|
243
|
+
|
|
244
|
+
Returns:
|
|
245
|
+
CacheEntry instance
|
|
246
|
+
"""
|
|
247
|
+
# Support both CacheEntry object and individual parameters
|
|
248
|
+
if isinstance(library, CacheEntry):
|
|
249
|
+
entry = library
|
|
250
|
+
library = entry.library
|
|
251
|
+
topic = entry.topic
|
|
252
|
+
content = entry.content
|
|
253
|
+
context7_id = entry.context7_id or context7_id
|
|
254
|
+
trust_score = entry.trust_score if entry.trust_score is not None else trust_score
|
|
255
|
+
snippet_count = entry.snippet_count if entry.snippet_count else snippet_count
|
|
256
|
+
else:
|
|
257
|
+
if topic is None or content is None:
|
|
258
|
+
raise ValueError("topic and content are required when library is a string")
|
|
259
|
+
# Estimate token count (rough approximation: 1 token ≈ 4 characters)
|
|
260
|
+
token_count = len(content) // 4
|
|
261
|
+
|
|
262
|
+
entry = CacheEntry(
|
|
263
|
+
library=library,
|
|
264
|
+
topic=topic,
|
|
265
|
+
content=content,
|
|
266
|
+
context7_id=context7_id,
|
|
267
|
+
trust_score=trust_score,
|
|
268
|
+
snippet_count=snippet_count or 0,
|
|
269
|
+
token_count=token_count,
|
|
270
|
+
cached_at=datetime.now(UTC).isoformat() + "Z",
|
|
271
|
+
cache_hits=0,
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
# Update cached_at if not set
|
|
275
|
+
if not entry.cached_at:
|
|
276
|
+
entry.cached_at = datetime.now(UTC).isoformat() + "Z"
|
|
277
|
+
|
|
278
|
+
# Use file locking for atomic writes (with short timeout for faster fail)
|
|
279
|
+
lock_file = get_cache_lock_file(self.cache_root, library=library)
|
|
280
|
+
try:
|
|
281
|
+
with cache_lock(lock_file, timeout=3.0): # Short timeout - fail fast
|
|
282
|
+
# Ensure library directory exists
|
|
283
|
+
self.cache_structure.ensure_library_dir(library)
|
|
284
|
+
|
|
285
|
+
# Write markdown file
|
|
286
|
+
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
287
|
+
doc_file.write_text(entry.to_markdown(), encoding="utf-8")
|
|
288
|
+
|
|
289
|
+
# Update metadata (non-critical, continue if fails)
|
|
290
|
+
try:
|
|
291
|
+
self.metadata_manager.update_library_metadata(
|
|
292
|
+
library, context7_id=context7_id, topic=topic
|
|
293
|
+
)
|
|
294
|
+
except Exception as e:
|
|
295
|
+
import logging
|
|
296
|
+
logger = logging.getLogger(__name__)
|
|
297
|
+
logger.debug(f"Failed to update library metadata: {e}")
|
|
298
|
+
|
|
299
|
+
# Update cache index (non-critical, continue if fails)
|
|
300
|
+
try:
|
|
301
|
+
self.metadata_manager.update_cache_index(
|
|
302
|
+
library, topic, context7_id=context7_id
|
|
303
|
+
)
|
|
304
|
+
except Exception as e:
|
|
305
|
+
import logging
|
|
306
|
+
logger = logging.getLogger(__name__)
|
|
307
|
+
logger.debug(f"Failed to update cache index: {e}")
|
|
308
|
+
except RuntimeError as e:
|
|
309
|
+
# Cache lock acquisition failed - log and continue without caching
|
|
310
|
+
# This allows the operation to continue even if cache write fails
|
|
311
|
+
import logging
|
|
312
|
+
logger = logging.getLogger(__name__)
|
|
313
|
+
logger.warning(
|
|
314
|
+
f"Failed to acquire cache lock for {library}/{topic}: {e}. "
|
|
315
|
+
f"Continuing without caching."
|
|
316
|
+
)
|
|
317
|
+
# Don't raise - allow operation to continue without cache
|
|
318
|
+
except (OSError, PermissionError) as e:
|
|
319
|
+
import logging
|
|
320
|
+
logger = logging.getLogger(__name__)
|
|
321
|
+
logger.warning(f"Failed to store cache entry for {library}/{topic}: {e}")
|
|
322
|
+
# Don't raise - allow operation to continue without cache
|
|
323
|
+
|
|
324
|
+
return entry
|
|
325
|
+
|
|
326
|
+
def exists(self, library: str, topic: str) -> bool:
|
|
327
|
+
"""
|
|
328
|
+
Check if entry exists in cache.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
library: Library name
|
|
332
|
+
topic: Topic name
|
|
333
|
+
|
|
334
|
+
Returns:
|
|
335
|
+
True if entry exists
|
|
336
|
+
"""
|
|
337
|
+
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
338
|
+
return doc_file.exists()
|
|
339
|
+
|
|
340
|
+
def delete(self, library: str, topic: str | None = None) -> bool:
|
|
341
|
+
"""
|
|
342
|
+
Delete entry or entire library from cache.
|
|
343
|
+
|
|
344
|
+
Args:
|
|
345
|
+
library: Library name
|
|
346
|
+
topic: Optional topic name (if None, deletes entire library)
|
|
347
|
+
|
|
348
|
+
Returns:
|
|
349
|
+
True if deletion was successful, False otherwise
|
|
350
|
+
"""
|
|
351
|
+
if topic:
|
|
352
|
+
doc_file = self.cache_structure.get_library_doc_file(library, topic)
|
|
353
|
+
if doc_file.exists():
|
|
354
|
+
doc_file.unlink()
|
|
355
|
+
self.metadata_manager.update_cache_index(library, topic, remove=True)
|
|
356
|
+
return True
|
|
357
|
+
return False
|
|
358
|
+
else:
|
|
359
|
+
lib_dir = self.cache_structure.get_library_dir(library)
|
|
360
|
+
if lib_dir.exists():
|
|
361
|
+
import shutil
|
|
362
|
+
|
|
363
|
+
shutil.rmtree(lib_dir)
|
|
364
|
+
|
|
365
|
+
# Remove from index
|
|
366
|
+
index = self.metadata_manager.load_cache_index()
|
|
367
|
+
if library in index.libraries:
|
|
368
|
+
del index.libraries[library]
|
|
369
|
+
self.metadata_manager.save_cache_index(index)
|
|
370
|
+
return True
|
|
371
|
+
return False
|
|
372
|
+
|
|
373
|
+
def list_entries(self) -> list[CacheEntry]:
|
|
374
|
+
"""
|
|
375
|
+
List all cache entries.
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
List of CacheEntry instances
|
|
379
|
+
"""
|
|
380
|
+
entries = []
|
|
381
|
+
index = self.metadata_manager.load_cache_index()
|
|
382
|
+
for library_name, library_info in index.libraries.items():
|
|
383
|
+
for topic_name in library_info.get("topics", {}):
|
|
384
|
+
entry = self.get(library_name, topic_name)
|
|
385
|
+
if entry:
|
|
386
|
+
entries.append(entry)
|
|
387
|
+
return entries
|
|
388
|
+
|
|
389
|
+
def clear(self) -> None:
|
|
390
|
+
"""
|
|
391
|
+
Clear all cache entries.
|
|
392
|
+
"""
|
|
393
|
+
import shutil
|
|
394
|
+
|
|
395
|
+
# Delete all library directories
|
|
396
|
+
for library_dir in self.cache_structure.cache_root.iterdir():
|
|
397
|
+
if library_dir.is_dir() and library_dir.name != "metadata":
|
|
398
|
+
shutil.rmtree(library_dir)
|
|
399
|
+
|
|
400
|
+
# Reset index
|
|
401
|
+
from .cache_structure import CacheIndex
|
|
402
|
+
|
|
403
|
+
index = CacheIndex(version="1.0", last_updated=None, total_entries=0, libraries={})
|
|
404
|
+
self.metadata_manager.save_cache_index(index)
|