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,354 +1,354 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Vector RAG - FAISS-based semantic search for expert knowledge bases.
|
|
3
|
-
|
|
4
|
-
Provides semantic search capabilities with automatic fallback to SimpleKnowledgeBase
|
|
5
|
-
when vector dependencies are unavailable.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import importlib.util
|
|
9
|
-
import logging
|
|
10
|
-
import time
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
|
|
13
|
-
from .rag_chunker import Chunk, Chunker
|
|
14
|
-
from .rag_embedder import Embedder, create_embedder
|
|
15
|
-
from .rag_index import VectorIndex
|
|
16
|
-
from .rag_safety import create_safety_handler
|
|
17
|
-
from .simple_rag import KnowledgeChunk, SimpleKnowledgeBase
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
# Try to check if FAISS is available
|
|
22
|
-
FAISS_AVAILABLE = importlib.util.find_spec("faiss") is not None
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class VectorKnowledgeBase:
|
|
26
|
-
"""
|
|
27
|
-
FAISS-based vector knowledge base for semantic search.
|
|
28
|
-
|
|
29
|
-
Features:
|
|
30
|
-
- Semantic similarity search using embeddings
|
|
31
|
-
- Automatic index building and caching
|
|
32
|
-
- Fallback to SimpleKnowledgeBase if dependencies unavailable
|
|
33
|
-
- Time-bounded queries (<2s target)
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
def __init__(
|
|
37
|
-
self,
|
|
38
|
-
knowledge_dir: Path,
|
|
39
|
-
domain: str | None = None,
|
|
40
|
-
chunk_size: int = 512,
|
|
41
|
-
overlap: int = 50,
|
|
42
|
-
embedding_model: str = "all-MiniLM-L6-v2",
|
|
43
|
-
similarity_threshold: float = 0.7,
|
|
44
|
-
index_dir: Path | None = None,
|
|
45
|
-
):
|
|
46
|
-
"""
|
|
47
|
-
Initialize vector knowledge base.
|
|
48
|
-
|
|
49
|
-
Args:
|
|
50
|
-
knowledge_dir: Directory containing knowledge files (markdown)
|
|
51
|
-
domain: Optional domain filter
|
|
52
|
-
chunk_size: Target tokens per chunk (default: 512)
|
|
53
|
-
overlap: Overlap tokens between chunks (default: 50)
|
|
54
|
-
embedding_model: Sentence-transformers model name
|
|
55
|
-
similarity_threshold: Minimum similarity for results (0.0-1.0)
|
|
56
|
-
index_dir: Optional custom index directory (default: .tapps-agents/rag_index/<domain>)
|
|
57
|
-
"""
|
|
58
|
-
self.knowledge_dir = Path(knowledge_dir)
|
|
59
|
-
self.domain = domain
|
|
60
|
-
self.chunk_size = chunk_size
|
|
61
|
-
self.overlap = overlap
|
|
62
|
-
self.embedding_model = embedding_model
|
|
63
|
-
self.similarity_threshold = similarity_threshold
|
|
64
|
-
|
|
65
|
-
# Determine index directory
|
|
66
|
-
if index_dir:
|
|
67
|
-
self.index_dir = Path(index_dir)
|
|
68
|
-
else:
|
|
69
|
-
# Default: .tapps-agents/rag_index/<domain> or .tapps-agents/rag_index/general
|
|
70
|
-
base_dir = self.knowledge_dir.parent / ".tapps-agents" / "rag_index"
|
|
71
|
-
self.index_dir = base_dir / (domain or "general")
|
|
72
|
-
|
|
73
|
-
# Initialize components
|
|
74
|
-
self.chunker = Chunker(target_tokens=chunk_size, overlap_tokens=overlap)
|
|
75
|
-
self.embedder: Embedder | None = None
|
|
76
|
-
self.index: VectorIndex | None = None
|
|
77
|
-
self.fallback_kb: SimpleKnowledgeBase | None = None
|
|
78
|
-
|
|
79
|
-
# Track backend selection
|
|
80
|
-
self._backend_type: str | None = None
|
|
81
|
-
self._initialized = False
|
|
82
|
-
|
|
83
|
-
# Initialize safety handler
|
|
84
|
-
self.safety_handler = create_safety_handler(
|
|
85
|
-
enable_injection_detection=True,
|
|
86
|
-
enable_sanitization=True,
|
|
87
|
-
require_citations=True,
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
def _initialize(self) -> None:
|
|
91
|
-
"""Initialize vector backend or fallback."""
|
|
92
|
-
if self._initialized:
|
|
93
|
-
return
|
|
94
|
-
|
|
95
|
-
# Try to initialize vector backend
|
|
96
|
-
if FAISS_AVAILABLE:
|
|
97
|
-
try:
|
|
98
|
-
self.embedder = create_embedder(model_name=self.embedding_model)
|
|
99
|
-
if self.embedder:
|
|
100
|
-
self._backend_type = "vector"
|
|
101
|
-
self._build_or_load_index()
|
|
102
|
-
logger.info(f"Vector RAG initialized: {self.embedding_model}")
|
|
103
|
-
self._initialized = True
|
|
104
|
-
return
|
|
105
|
-
except Exception as e:
|
|
106
|
-
logger.warning(f"Failed to initialize vector RAG: {e}. Falling back to SimpleKnowledgeBase.")
|
|
107
|
-
|
|
108
|
-
# Fallback to SimpleKnowledgeBase
|
|
109
|
-
self.fallback_kb = SimpleKnowledgeBase(self.knowledge_dir, domain=self.domain)
|
|
110
|
-
self._backend_type = "simple"
|
|
111
|
-
logger.info("Using SimpleKnowledgeBase fallback (vector dependencies unavailable)")
|
|
112
|
-
self._initialized = True
|
|
113
|
-
|
|
114
|
-
def _build_or_load_index(self) -> None:
|
|
115
|
-
"""Build new index or load existing one."""
|
|
116
|
-
if not self.embedder:
|
|
117
|
-
return
|
|
118
|
-
|
|
119
|
-
# Check if index exists and is valid
|
|
120
|
-
if self._index_exists() and self._index_is_valid():
|
|
121
|
-
try:
|
|
122
|
-
self.index = VectorIndex.load(self.index_dir, embedder=self.embedder)
|
|
123
|
-
logger.info(f"Loaded existing index from {self.index_dir}")
|
|
124
|
-
return
|
|
125
|
-
except Exception as e:
|
|
126
|
-
logger.warning(f"Failed to load existing index: {e}. Rebuilding...")
|
|
127
|
-
|
|
128
|
-
# Build new index
|
|
129
|
-
self._build_index()
|
|
130
|
-
|
|
131
|
-
def _index_exists(self) -> bool:
|
|
132
|
-
"""Check if index files exist."""
|
|
133
|
-
return (
|
|
134
|
-
(self.index_dir / "index.faiss").exists()
|
|
135
|
-
and (self.index_dir / "chunks.json").exists()
|
|
136
|
-
and (self.index_dir / "metadata.json").exists()
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
def _index_is_valid(self) -> bool:
|
|
140
|
-
"""Check if existing index is valid (matches current sources)."""
|
|
141
|
-
try:
|
|
142
|
-
import json
|
|
143
|
-
|
|
144
|
-
metadata_path = self.index_dir / "metadata.json"
|
|
145
|
-
if not metadata_path.exists():
|
|
146
|
-
return False
|
|
147
|
-
|
|
148
|
-
with open(metadata_path, encoding="utf-8") as f:
|
|
149
|
-
metadata = json.load(f)
|
|
150
|
-
|
|
151
|
-
# Check schema version
|
|
152
|
-
if metadata.get("schema_version") != "1.0":
|
|
153
|
-
return False
|
|
154
|
-
|
|
155
|
-
# TODO: Could check source fingerprint for more validation
|
|
156
|
-
return True
|
|
157
|
-
except Exception:
|
|
158
|
-
return False
|
|
159
|
-
|
|
160
|
-
def _build_index(self) -> None:
|
|
161
|
-
"""Build FAISS index from knowledge files."""
|
|
162
|
-
if not self.embedder:
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
logger.info(f"Building vector index from {self.knowledge_dir}...")
|
|
166
|
-
start_time = time.time()
|
|
167
|
-
|
|
168
|
-
# Load and chunk all markdown files
|
|
169
|
-
all_chunks: list[Chunk] = []
|
|
170
|
-
for md_file in self.knowledge_dir.rglob("*.md"):
|
|
171
|
-
# Filter by domain if specified
|
|
172
|
-
if self.domain:
|
|
173
|
-
if (
|
|
174
|
-
self.domain.lower() not in md_file.stem.lower()
|
|
175
|
-
and self.domain.lower() not in str(md_file).lower()
|
|
176
|
-
):
|
|
177
|
-
continue
|
|
178
|
-
|
|
179
|
-
try:
|
|
180
|
-
content = md_file.read_text(encoding="utf-8")
|
|
181
|
-
file_chunks = self.chunker.chunk_file(md_file, content)
|
|
182
|
-
all_chunks.extend(file_chunks)
|
|
183
|
-
except Exception as e:
|
|
184
|
-
logger.warning(f"Failed to process {md_file}: {e}")
|
|
185
|
-
continue
|
|
186
|
-
|
|
187
|
-
if not all_chunks:
|
|
188
|
-
logger.warning(f"No chunks found in {self.knowledge_dir}")
|
|
189
|
-
return
|
|
190
|
-
|
|
191
|
-
# Build index
|
|
192
|
-
self.index = VectorIndex(embedder=self.embedder)
|
|
193
|
-
self.index.build(
|
|
194
|
-
all_chunks,
|
|
195
|
-
chunk_params={
|
|
196
|
-
"target_tokens": self.chunk_size,
|
|
197
|
-
"overlap_tokens": self.overlap,
|
|
198
|
-
},
|
|
199
|
-
)
|
|
200
|
-
|
|
201
|
-
# Save index
|
|
202
|
-
self.index.save(self.index_dir)
|
|
203
|
-
|
|
204
|
-
elapsed = time.time() - start_time
|
|
205
|
-
logger.info(f"Index built in {elapsed:.2f}s: {len(all_chunks)} chunks")
|
|
206
|
-
|
|
207
|
-
def search(
|
|
208
|
-
self, query: str, max_results: int = 5, context_lines: int = 10
|
|
209
|
-
) -> list[KnowledgeChunk]:
|
|
210
|
-
"""
|
|
211
|
-
Search knowledge base for relevant chunks.
|
|
212
|
-
|
|
213
|
-
Args:
|
|
214
|
-
query: Search query
|
|
215
|
-
max_results: Maximum number of results
|
|
216
|
-
context_lines: Unused (kept for compatibility with SimpleKnowledgeBase API)
|
|
217
|
-
|
|
218
|
-
Returns:
|
|
219
|
-
List of KnowledgeChunk objects (compatible with SimpleKnowledgeBase format)
|
|
220
|
-
"""
|
|
221
|
-
self._initialize()
|
|
222
|
-
|
|
223
|
-
# Use fallback if vector backend not available
|
|
224
|
-
if self._backend_type == "simple" and self.fallback_kb:
|
|
225
|
-
return self.fallback_kb.search(query, max_results=max_results, context_lines=context_lines)
|
|
226
|
-
|
|
227
|
-
# Use vector search
|
|
228
|
-
if not self.index:
|
|
229
|
-
logger.warning("Index not available, falling back to SimpleKnowledgeBase")
|
|
230
|
-
if not self.fallback_kb:
|
|
231
|
-
self.fallback_kb = SimpleKnowledgeBase(self.knowledge_dir, domain=self.domain)
|
|
232
|
-
return self.fallback_kb.search(query, max_results=max_results, context_lines=context_lines)
|
|
233
|
-
|
|
234
|
-
# Perform semantic search with timeout
|
|
235
|
-
start_time = time.time()
|
|
236
|
-
try:
|
|
237
|
-
results = self.index.search(
|
|
238
|
-
query_text=query,
|
|
239
|
-
top_k=max_results,
|
|
240
|
-
similarity_threshold=self.similarity_threshold,
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
# Convert to KnowledgeChunk format with safety sanitization
|
|
244
|
-
knowledge_chunks: list[KnowledgeChunk] = []
|
|
245
|
-
for chunk, similarity in results:
|
|
246
|
-
# Sanitize retrieved content
|
|
247
|
-
sanitized_content, is_safe = self.safety_handler.sanitize_retrieved_content(
|
|
248
|
-
chunk.content, str(chunk.source_file)
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
# Log warning if unsafe content detected
|
|
252
|
-
if not is_safe:
|
|
253
|
-
logger.warning(
|
|
254
|
-
f"Unsafe content detected in chunk from {chunk.source_file}. "
|
|
255
|
-
"Content has been sanitized."
|
|
256
|
-
)
|
|
257
|
-
|
|
258
|
-
knowledge_chunk = KnowledgeChunk(
|
|
259
|
-
content=sanitized_content,
|
|
260
|
-
source_file=chunk.source_file,
|
|
261
|
-
line_start=chunk.line_start,
|
|
262
|
-
line_end=chunk.line_end,
|
|
263
|
-
score=similarity, # Use similarity as score
|
|
264
|
-
)
|
|
265
|
-
knowledge_chunks.append(knowledge_chunk)
|
|
266
|
-
|
|
267
|
-
elapsed = time.time() - start_time
|
|
268
|
-
if elapsed > 2.0:
|
|
269
|
-
logger.warning(f"Query took {elapsed:.2f}s (target: <2s)")
|
|
270
|
-
|
|
271
|
-
return knowledge_chunks
|
|
272
|
-
except Exception as e:
|
|
273
|
-
logger.error(f"Vector search failed: {e}. Falling back to SimpleKnowledgeBase.", exc_info=True)
|
|
274
|
-
if not self.fallback_kb:
|
|
275
|
-
self.fallback_kb = SimpleKnowledgeBase(self.knowledge_dir, domain=self.domain)
|
|
276
|
-
return self.fallback_kb.search(query, max_results=max_results, context_lines=context_lines)
|
|
277
|
-
|
|
278
|
-
def get_context(self, query: str, max_length: int = 2000) -> str:
|
|
279
|
-
"""
|
|
280
|
-
Get formatted context string for a query with safety handling.
|
|
281
|
-
|
|
282
|
-
Args:
|
|
283
|
-
query: Search query
|
|
284
|
-
max_length: Maximum character length of context
|
|
285
|
-
|
|
286
|
-
Returns:
|
|
287
|
-
Formatted context string with sources and safety labels
|
|
288
|
-
"""
|
|
289
|
-
chunks = self.search(query, max_results=5)
|
|
290
|
-
|
|
291
|
-
if not chunks:
|
|
292
|
-
return "No relevant knowledge found in knowledge base."
|
|
293
|
-
|
|
294
|
-
# Format with safety handler
|
|
295
|
-
chunk_tuples = [
|
|
296
|
-
(chunk.content, chunk.score, str(chunk.source_file)) for chunk in chunks
|
|
297
|
-
]
|
|
298
|
-
formatted_context, sources, all_safe = self.safety_handler.format_retrieved_context(
|
|
299
|
-
chunk_tuples, max_length=max_length, min_similarity=self.similarity_threshold
|
|
300
|
-
)
|
|
301
|
-
|
|
302
|
-
# Add citations if required
|
|
303
|
-
if self.safety_handler.require_citations and sources:
|
|
304
|
-
formatted_context = self.safety_handler.add_citation_headers(
|
|
305
|
-
formatted_context, sources
|
|
306
|
-
)
|
|
307
|
-
|
|
308
|
-
return formatted_context
|
|
309
|
-
|
|
310
|
-
def get_sources(self, query: str, max_results: int = 5) -> list[str]:
|
|
311
|
-
"""
|
|
312
|
-
Get source file paths for a query.
|
|
313
|
-
|
|
314
|
-
Args:
|
|
315
|
-
query: Search query
|
|
316
|
-
max_results: Maximum number of sources to return
|
|
317
|
-
|
|
318
|
-
Returns:
|
|
319
|
-
List of source file paths (relative to knowledge_dir)
|
|
320
|
-
"""
|
|
321
|
-
chunks = self.search(query, max_results=max_results)
|
|
322
|
-
|
|
323
|
-
# Get unique source files
|
|
324
|
-
sources = set()
|
|
325
|
-
for chunk in chunks:
|
|
326
|
-
try:
|
|
327
|
-
rel_path = chunk.source_file.relative_to(self.knowledge_dir)
|
|
328
|
-
sources.add(str(rel_path))
|
|
329
|
-
except ValueError:
|
|
330
|
-
sources.add(str(chunk.source_file))
|
|
331
|
-
|
|
332
|
-
return list(sources)
|
|
333
|
-
|
|
334
|
-
def list_all_files(self) -> list[str]:
|
|
335
|
-
"""List all knowledge files in the knowledge base."""
|
|
336
|
-
self._initialize()
|
|
337
|
-
|
|
338
|
-
if self._backend_type == "simple" and self.fallback_kb:
|
|
339
|
-
return self.fallback_kb.list_all_files()
|
|
340
|
-
|
|
341
|
-
# For vector backend, list from knowledge_dir
|
|
342
|
-
return [
|
|
343
|
-
(
|
|
344
|
-
str(f.relative_to(self.knowledge_dir))
|
|
345
|
-
if self.knowledge_dir in f.parents
|
|
346
|
-
else str(f)
|
|
347
|
-
)
|
|
348
|
-
for f in self.knowledge_dir.rglob("*.md")
|
|
349
|
-
]
|
|
350
|
-
|
|
351
|
-
def get_backend_type(self) -> str:
|
|
352
|
-
"""Get the backend type being used ('vector' or 'simple')."""
|
|
353
|
-
self._initialize()
|
|
354
|
-
return self._backend_type or "unknown"
|
|
1
|
+
"""
|
|
2
|
+
Vector RAG - FAISS-based semantic search for expert knowledge bases.
|
|
3
|
+
|
|
4
|
+
Provides semantic search capabilities with automatic fallback to SimpleKnowledgeBase
|
|
5
|
+
when vector dependencies are unavailable.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import importlib.util
|
|
9
|
+
import logging
|
|
10
|
+
import time
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from .rag_chunker import Chunk, Chunker
|
|
14
|
+
from .rag_embedder import Embedder, create_embedder
|
|
15
|
+
from .rag_index import VectorIndex
|
|
16
|
+
from .rag_safety import create_safety_handler
|
|
17
|
+
from .simple_rag import KnowledgeChunk, SimpleKnowledgeBase
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
# Try to check if FAISS is available
|
|
22
|
+
FAISS_AVAILABLE = importlib.util.find_spec("faiss") is not None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class VectorKnowledgeBase:
|
|
26
|
+
"""
|
|
27
|
+
FAISS-based vector knowledge base for semantic search.
|
|
28
|
+
|
|
29
|
+
Features:
|
|
30
|
+
- Semantic similarity search using embeddings
|
|
31
|
+
- Automatic index building and caching
|
|
32
|
+
- Fallback to SimpleKnowledgeBase if dependencies unavailable
|
|
33
|
+
- Time-bounded queries (<2s target)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
knowledge_dir: Path,
|
|
39
|
+
domain: str | None = None,
|
|
40
|
+
chunk_size: int = 512,
|
|
41
|
+
overlap: int = 50,
|
|
42
|
+
embedding_model: str = "all-MiniLM-L6-v2",
|
|
43
|
+
similarity_threshold: float = 0.7,
|
|
44
|
+
index_dir: Path | None = None,
|
|
45
|
+
):
|
|
46
|
+
"""
|
|
47
|
+
Initialize vector knowledge base.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
knowledge_dir: Directory containing knowledge files (markdown)
|
|
51
|
+
domain: Optional domain filter
|
|
52
|
+
chunk_size: Target tokens per chunk (default: 512)
|
|
53
|
+
overlap: Overlap tokens between chunks (default: 50)
|
|
54
|
+
embedding_model: Sentence-transformers model name
|
|
55
|
+
similarity_threshold: Minimum similarity for results (0.0-1.0)
|
|
56
|
+
index_dir: Optional custom index directory (default: .tapps-agents/rag_index/<domain>)
|
|
57
|
+
"""
|
|
58
|
+
self.knowledge_dir = Path(knowledge_dir)
|
|
59
|
+
self.domain = domain
|
|
60
|
+
self.chunk_size = chunk_size
|
|
61
|
+
self.overlap = overlap
|
|
62
|
+
self.embedding_model = embedding_model
|
|
63
|
+
self.similarity_threshold = similarity_threshold
|
|
64
|
+
|
|
65
|
+
# Determine index directory
|
|
66
|
+
if index_dir:
|
|
67
|
+
self.index_dir = Path(index_dir)
|
|
68
|
+
else:
|
|
69
|
+
# Default: .tapps-agents/rag_index/<domain> or .tapps-agents/rag_index/general
|
|
70
|
+
base_dir = self.knowledge_dir.parent / ".tapps-agents" / "rag_index"
|
|
71
|
+
self.index_dir = base_dir / (domain or "general")
|
|
72
|
+
|
|
73
|
+
# Initialize components
|
|
74
|
+
self.chunker = Chunker(target_tokens=chunk_size, overlap_tokens=overlap)
|
|
75
|
+
self.embedder: Embedder | None = None
|
|
76
|
+
self.index: VectorIndex | None = None
|
|
77
|
+
self.fallback_kb: SimpleKnowledgeBase | None = None
|
|
78
|
+
|
|
79
|
+
# Track backend selection
|
|
80
|
+
self._backend_type: str | None = None
|
|
81
|
+
self._initialized = False
|
|
82
|
+
|
|
83
|
+
# Initialize safety handler
|
|
84
|
+
self.safety_handler = create_safety_handler(
|
|
85
|
+
enable_injection_detection=True,
|
|
86
|
+
enable_sanitization=True,
|
|
87
|
+
require_citations=True,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def _initialize(self) -> None:
|
|
91
|
+
"""Initialize vector backend or fallback."""
|
|
92
|
+
if self._initialized:
|
|
93
|
+
return
|
|
94
|
+
|
|
95
|
+
# Try to initialize vector backend
|
|
96
|
+
if FAISS_AVAILABLE:
|
|
97
|
+
try:
|
|
98
|
+
self.embedder = create_embedder(model_name=self.embedding_model)
|
|
99
|
+
if self.embedder:
|
|
100
|
+
self._backend_type = "vector"
|
|
101
|
+
self._build_or_load_index()
|
|
102
|
+
logger.info(f"Vector RAG initialized: {self.embedding_model}")
|
|
103
|
+
self._initialized = True
|
|
104
|
+
return
|
|
105
|
+
except Exception as e:
|
|
106
|
+
logger.warning(f"Failed to initialize vector RAG: {e}. Falling back to SimpleKnowledgeBase.")
|
|
107
|
+
|
|
108
|
+
# Fallback to SimpleKnowledgeBase
|
|
109
|
+
self.fallback_kb = SimpleKnowledgeBase(self.knowledge_dir, domain=self.domain)
|
|
110
|
+
self._backend_type = "simple"
|
|
111
|
+
logger.info("Using SimpleKnowledgeBase fallback (vector dependencies unavailable)")
|
|
112
|
+
self._initialized = True
|
|
113
|
+
|
|
114
|
+
def _build_or_load_index(self) -> None:
|
|
115
|
+
"""Build new index or load existing one."""
|
|
116
|
+
if not self.embedder:
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
# Check if index exists and is valid
|
|
120
|
+
if self._index_exists() and self._index_is_valid():
|
|
121
|
+
try:
|
|
122
|
+
self.index = VectorIndex.load(self.index_dir, embedder=self.embedder)
|
|
123
|
+
logger.info(f"Loaded existing index from {self.index_dir}")
|
|
124
|
+
return
|
|
125
|
+
except Exception as e:
|
|
126
|
+
logger.warning(f"Failed to load existing index: {e}. Rebuilding...")
|
|
127
|
+
|
|
128
|
+
# Build new index
|
|
129
|
+
self._build_index()
|
|
130
|
+
|
|
131
|
+
def _index_exists(self) -> bool:
|
|
132
|
+
"""Check if index files exist."""
|
|
133
|
+
return (
|
|
134
|
+
(self.index_dir / "index.faiss").exists()
|
|
135
|
+
and (self.index_dir / "chunks.json").exists()
|
|
136
|
+
and (self.index_dir / "metadata.json").exists()
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
def _index_is_valid(self) -> bool:
|
|
140
|
+
"""Check if existing index is valid (matches current sources)."""
|
|
141
|
+
try:
|
|
142
|
+
import json
|
|
143
|
+
|
|
144
|
+
metadata_path = self.index_dir / "metadata.json"
|
|
145
|
+
if not metadata_path.exists():
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
with open(metadata_path, encoding="utf-8") as f:
|
|
149
|
+
metadata = json.load(f)
|
|
150
|
+
|
|
151
|
+
# Check schema version
|
|
152
|
+
if metadata.get("schema_version") != "1.0":
|
|
153
|
+
return False
|
|
154
|
+
|
|
155
|
+
# TODO: Could check source fingerprint for more validation
|
|
156
|
+
return True
|
|
157
|
+
except Exception:
|
|
158
|
+
return False
|
|
159
|
+
|
|
160
|
+
def _build_index(self) -> None:
|
|
161
|
+
"""Build FAISS index from knowledge files."""
|
|
162
|
+
if not self.embedder:
|
|
163
|
+
return
|
|
164
|
+
|
|
165
|
+
logger.info(f"Building vector index from {self.knowledge_dir}...")
|
|
166
|
+
start_time = time.time()
|
|
167
|
+
|
|
168
|
+
# Load and chunk all markdown files
|
|
169
|
+
all_chunks: list[Chunk] = []
|
|
170
|
+
for md_file in self.knowledge_dir.rglob("*.md"):
|
|
171
|
+
# Filter by domain if specified
|
|
172
|
+
if self.domain:
|
|
173
|
+
if (
|
|
174
|
+
self.domain.lower() not in md_file.stem.lower()
|
|
175
|
+
and self.domain.lower() not in str(md_file).lower()
|
|
176
|
+
):
|
|
177
|
+
continue
|
|
178
|
+
|
|
179
|
+
try:
|
|
180
|
+
content = md_file.read_text(encoding="utf-8")
|
|
181
|
+
file_chunks = self.chunker.chunk_file(md_file, content)
|
|
182
|
+
all_chunks.extend(file_chunks)
|
|
183
|
+
except Exception as e:
|
|
184
|
+
logger.warning(f"Failed to process {md_file}: {e}")
|
|
185
|
+
continue
|
|
186
|
+
|
|
187
|
+
if not all_chunks:
|
|
188
|
+
logger.warning(f"No chunks found in {self.knowledge_dir}")
|
|
189
|
+
return
|
|
190
|
+
|
|
191
|
+
# Build index
|
|
192
|
+
self.index = VectorIndex(embedder=self.embedder)
|
|
193
|
+
self.index.build(
|
|
194
|
+
all_chunks,
|
|
195
|
+
chunk_params={
|
|
196
|
+
"target_tokens": self.chunk_size,
|
|
197
|
+
"overlap_tokens": self.overlap,
|
|
198
|
+
},
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# Save index
|
|
202
|
+
self.index.save(self.index_dir)
|
|
203
|
+
|
|
204
|
+
elapsed = time.time() - start_time
|
|
205
|
+
logger.info(f"Index built in {elapsed:.2f}s: {len(all_chunks)} chunks")
|
|
206
|
+
|
|
207
|
+
def search(
|
|
208
|
+
self, query: str, max_results: int = 5, context_lines: int = 10
|
|
209
|
+
) -> list[KnowledgeChunk]:
|
|
210
|
+
"""
|
|
211
|
+
Search knowledge base for relevant chunks.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
query: Search query
|
|
215
|
+
max_results: Maximum number of results
|
|
216
|
+
context_lines: Unused (kept for compatibility with SimpleKnowledgeBase API)
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
List of KnowledgeChunk objects (compatible with SimpleKnowledgeBase format)
|
|
220
|
+
"""
|
|
221
|
+
self._initialize()
|
|
222
|
+
|
|
223
|
+
# Use fallback if vector backend not available
|
|
224
|
+
if self._backend_type == "simple" and self.fallback_kb:
|
|
225
|
+
return self.fallback_kb.search(query, max_results=max_results, context_lines=context_lines)
|
|
226
|
+
|
|
227
|
+
# Use vector search
|
|
228
|
+
if not self.index:
|
|
229
|
+
logger.warning("Index not available, falling back to SimpleKnowledgeBase")
|
|
230
|
+
if not self.fallback_kb:
|
|
231
|
+
self.fallback_kb = SimpleKnowledgeBase(self.knowledge_dir, domain=self.domain)
|
|
232
|
+
return self.fallback_kb.search(query, max_results=max_results, context_lines=context_lines)
|
|
233
|
+
|
|
234
|
+
# Perform semantic search with timeout
|
|
235
|
+
start_time = time.time()
|
|
236
|
+
try:
|
|
237
|
+
results = self.index.search(
|
|
238
|
+
query_text=query,
|
|
239
|
+
top_k=max_results,
|
|
240
|
+
similarity_threshold=self.similarity_threshold,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
# Convert to KnowledgeChunk format with safety sanitization
|
|
244
|
+
knowledge_chunks: list[KnowledgeChunk] = []
|
|
245
|
+
for chunk, similarity in results:
|
|
246
|
+
# Sanitize retrieved content
|
|
247
|
+
sanitized_content, is_safe = self.safety_handler.sanitize_retrieved_content(
|
|
248
|
+
chunk.content, str(chunk.source_file)
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
# Log warning if unsafe content detected
|
|
252
|
+
if not is_safe:
|
|
253
|
+
logger.warning(
|
|
254
|
+
f"Unsafe content detected in chunk from {chunk.source_file}. "
|
|
255
|
+
"Content has been sanitized."
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
knowledge_chunk = KnowledgeChunk(
|
|
259
|
+
content=sanitized_content,
|
|
260
|
+
source_file=chunk.source_file,
|
|
261
|
+
line_start=chunk.line_start,
|
|
262
|
+
line_end=chunk.line_end,
|
|
263
|
+
score=similarity, # Use similarity as score
|
|
264
|
+
)
|
|
265
|
+
knowledge_chunks.append(knowledge_chunk)
|
|
266
|
+
|
|
267
|
+
elapsed = time.time() - start_time
|
|
268
|
+
if elapsed > 2.0:
|
|
269
|
+
logger.warning(f"Query took {elapsed:.2f}s (target: <2s)")
|
|
270
|
+
|
|
271
|
+
return knowledge_chunks
|
|
272
|
+
except Exception as e:
|
|
273
|
+
logger.error(f"Vector search failed: {e}. Falling back to SimpleKnowledgeBase.", exc_info=True)
|
|
274
|
+
if not self.fallback_kb:
|
|
275
|
+
self.fallback_kb = SimpleKnowledgeBase(self.knowledge_dir, domain=self.domain)
|
|
276
|
+
return self.fallback_kb.search(query, max_results=max_results, context_lines=context_lines)
|
|
277
|
+
|
|
278
|
+
def get_context(self, query: str, max_length: int = 2000) -> str:
|
|
279
|
+
"""
|
|
280
|
+
Get formatted context string for a query with safety handling.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
query: Search query
|
|
284
|
+
max_length: Maximum character length of context
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
Formatted context string with sources and safety labels
|
|
288
|
+
"""
|
|
289
|
+
chunks = self.search(query, max_results=5)
|
|
290
|
+
|
|
291
|
+
if not chunks:
|
|
292
|
+
return "No relevant knowledge found in knowledge base."
|
|
293
|
+
|
|
294
|
+
# Format with safety handler
|
|
295
|
+
chunk_tuples = [
|
|
296
|
+
(chunk.content, chunk.score, str(chunk.source_file)) for chunk in chunks
|
|
297
|
+
]
|
|
298
|
+
formatted_context, sources, all_safe = self.safety_handler.format_retrieved_context(
|
|
299
|
+
chunk_tuples, max_length=max_length, min_similarity=self.similarity_threshold
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
# Add citations if required
|
|
303
|
+
if self.safety_handler.require_citations and sources:
|
|
304
|
+
formatted_context = self.safety_handler.add_citation_headers(
|
|
305
|
+
formatted_context, sources
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
return formatted_context
|
|
309
|
+
|
|
310
|
+
def get_sources(self, query: str, max_results: int = 5) -> list[str]:
|
|
311
|
+
"""
|
|
312
|
+
Get source file paths for a query.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
query: Search query
|
|
316
|
+
max_results: Maximum number of sources to return
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
List of source file paths (relative to knowledge_dir)
|
|
320
|
+
"""
|
|
321
|
+
chunks = self.search(query, max_results=max_results)
|
|
322
|
+
|
|
323
|
+
# Get unique source files
|
|
324
|
+
sources = set()
|
|
325
|
+
for chunk in chunks:
|
|
326
|
+
try:
|
|
327
|
+
rel_path = chunk.source_file.relative_to(self.knowledge_dir)
|
|
328
|
+
sources.add(str(rel_path))
|
|
329
|
+
except ValueError:
|
|
330
|
+
sources.add(str(chunk.source_file))
|
|
331
|
+
|
|
332
|
+
return list(sources)
|
|
333
|
+
|
|
334
|
+
def list_all_files(self) -> list[str]:
|
|
335
|
+
"""List all knowledge files in the knowledge base."""
|
|
336
|
+
self._initialize()
|
|
337
|
+
|
|
338
|
+
if self._backend_type == "simple" and self.fallback_kb:
|
|
339
|
+
return self.fallback_kb.list_all_files()
|
|
340
|
+
|
|
341
|
+
# For vector backend, list from knowledge_dir
|
|
342
|
+
return [
|
|
343
|
+
(
|
|
344
|
+
str(f.relative_to(self.knowledge_dir))
|
|
345
|
+
if self.knowledge_dir in f.parents
|
|
346
|
+
else str(f)
|
|
347
|
+
)
|
|
348
|
+
for f in self.knowledge_dir.rglob("*.md")
|
|
349
|
+
]
|
|
350
|
+
|
|
351
|
+
def get_backend_type(self) -> str:
|
|
352
|
+
"""Get the backend type being used ('vector' or 'simple')."""
|
|
353
|
+
self._initialize()
|
|
354
|
+
return self._backend_type or "unknown"
|