igel-qe-core 1.0.3 → 1.0.7
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.
- package/dist/cli/index.js +638 -54
- package/dist/cli/platform.js +115 -72
- package/dist/mcp/server.js +258 -17
- package/package.json +4 -4
- package/src/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/agents/__init__.py +3 -0
- package/src/agents/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/automation_design_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/automation_design_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/automation_design_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/code_intelligence_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/code_intelligence_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/confidence_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/confidence_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/confidence_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/execution_validation_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/execution_validation_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/execution_validation_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/framework_analyzer_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/framework_analyzer_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/fusion_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/graph.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/intent_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/intent_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/kg_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/memory_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/reflection_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/regression_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/regression_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/requirement_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/requirement_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/requirement_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/retrieval_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/scenario_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/scenario_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/scenario_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/script_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/script_generator_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/script_generator_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/script_generator_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/state.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/temporal_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/testcase_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/testcase_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/testcase_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/validation_agent.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/validation_agent.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/validation_agent.cpython-314.pyc +0 -0
- package/src/agents/__pycache__/workflow_engine.cpython-311.pyc +0 -0
- package/src/agents/__pycache__/workflow_engine.cpython-313.pyc +0 -0
- package/src/agents/__pycache__/workflow_engine.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/agents/automation_design_agent.py +14 -17
- package/{knowledge_base → src}/agents/code_intelligence_agent.py +2 -2
- package/src/agents/confidence_agent.py +114 -0
- package/{knowledge_base → src}/agents/execution_validation_agent.py +1 -1
- package/src/agents/feedback_agent.py +89 -0
- package/src/agents/framework_analyzer_agent.py +43 -0
- package/{knowledge_base → src}/agents/fusion_agent.py +3 -3
- package/{knowledge_base → src}/agents/graph.py +10 -10
- package/{knowledge_base → src}/agents/healing_agent.py +4 -4
- package/src/agents/intent_agent.py +30 -0
- package/src/agents/internal/__init__.py +3 -0
- package/src/agents/internal/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/agents/internal/__pycache__/approval_manager.cpython-313.pyc +0 -0
- package/src/agents/internal/__pycache__/question_engine.cpython-313.pyc +0 -0
- package/src/agents/internal/approval_manager.py +111 -0
- package/src/agents/internal/question_engine.py +111 -0
- package/src/agents/internal/workflow_engine.py +28 -0
- package/{knowledge_base → src}/agents/kg_agent.py +3 -3
- package/{knowledge_base → src}/agents/memory_agent.py +4 -4
- package/src/agents/orchestrator/__init__.py +3 -0
- package/src/agents/orchestrator/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/agents/orchestrator/__pycache__/orchestrator.cpython-313.pyc +0 -0
- package/src/agents/orchestrator/orchestrator.py +63 -0
- package/{knowledge_base → src}/agents/rca_agent.py +4 -4
- package/{knowledge_base → src}/agents/reflection_agent.py +1 -1
- package/{knowledge_base → src}/agents/regression_agent.py +2 -2
- package/src/agents/requirement_agent.py +97 -0
- package/{knowledge_base → src}/agents/retrieval_agent.py +2 -2
- package/{knowledge_base → src}/agents/scenario_agent.py +11 -17
- package/{knowledge_base → src}/agents/script_agent.py +6 -6
- package/{knowledge_base → src}/agents/script_generator_agent.py +12 -10
- package/{knowledge_base → src}/agents/temporal_agent.py +3 -3
- package/src/agents/testcase_agent.py +163 -0
- package/{knowledge_base → src}/agents/validation_agent.py +1 -1
- package/src/agents/workflow_engine.py +109 -0
- package/{knowledge_base → src}/alembic/README.md +4 -4
- package/{knowledge_base → src}/alembic/env.py +1 -1
- package/{knowledge_base → src}/alembic/script.py.mako +1 -1
- package/{knowledge_base → src}/api/middleware.py +3 -3
- package/{knowledge_base → src}/api/server.py +28 -28
- package/{knowledge_base → src}/chunking/chunker.py +3 -3
- package/src/cli/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/cli/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/cli/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/cli/__pycache__/workflow_cli.cpython-311.pyc +0 -0
- package/src/cli/__pycache__/workflow_cli.cpython-313.pyc +0 -0
- package/src/cli/__pycache__/workflow_cli.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/cli/feedback_cli.py +10 -10
- package/{knowledge_base → src}/cli/generate.py +11 -11
- package/src/cli/index.ts +704 -0
- package/src/cli/platform.ts +147 -0
- package/src/cli/workflow_cli.py +930 -0
- package/{knowledge_base → src}/config/__init__.py +1 -1
- package/src/config/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/config/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/config/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/config/__pycache__/policy_config.cpython-311.pyc +0 -0
- package/src/config/__pycache__/policy_config.cpython-313.pyc +0 -0
- package/src/config/__pycache__/settings.cpython-311.pyc +0 -0
- package/src/config/__pycache__/settings.cpython-313.pyc +0 -0
- package/src/config/__pycache__/settings.cpython-314.pyc +0 -0
- package/src/config/policy_config.py +85 -0
- package/src/config/policy_rules.yaml +50 -0
- package/{knowledge_base → src}/config/settings.py +51 -6
- package/{knowledge_base → src}/connectors/__init__.py +1 -1
- package/src/connectors/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/connectors/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/connectors/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/connectors/__pycache__/base.cpython-311.pyc +0 -0
- package/src/connectors/__pycache__/base.cpython-313.pyc +0 -0
- package/src/connectors/__pycache__/base.cpython-314.pyc +0 -0
- package/src/connectors/__pycache__/jira_connector.cpython-311.pyc +0 -0
- package/src/connectors/__pycache__/jira_connector.cpython-313.pyc +0 -0
- package/src/connectors/__pycache__/jira_connector.cpython-314.pyc +0 -0
- package/src/connectors/__pycache__/query_bridge.cpython-313.pyc +0 -0
- package/src/connectors/__pycache__/query_bridge.cpython-314.pyc +0 -0
- package/src/connectors/bitbucket_connector.py +334 -0
- package/{knowledge_base → src}/connectors/community_connector.py +6 -6
- package/{knowledge_base → src}/connectors/confluence_connector.py +4 -4
- package/{knowledge_base → src}/connectors/jira_connector.py +7 -11
- package/{knowledge_base → src}/connectors/kb_igel_connector.py +6 -6
- package/{knowledge_base → src}/connectors/query_bridge.py +11 -11
- package/{knowledge_base → src}/connectors/search_backends.py +1 -1
- package/{knowledge_base → src}/connectors/serviceNow_connector.py +2 -2
- package/{knowledge_base → src}/connectors/sync_scheduler.py +12 -10
- package/{knowledge_base → src}/connectors/teamcity_connector.py +2 -2
- package/{knowledge_base → src}/connectors/testRail_connector.py +2 -2
- package/{knowledge_base → src}/connectors/web_fetcher.py +1 -1
- package/src/connectors/xray_connector.py +337 -0
- package/{knowledge_base → src}/core/__init__.py +1 -1
- package/src/core/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/core/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/core/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/core/__pycache__/circuit_breaker.cpython-313.pyc +0 -0
- package/src/core/__pycache__/circuit_breaker.cpython-314.pyc +0 -0
- package/src/core/__pycache__/confidence.cpython-311.pyc +0 -0
- package/src/core/__pycache__/confidence.cpython-313.pyc +0 -0
- package/src/core/__pycache__/confidence.cpython-314.pyc +0 -0
- package/src/core/__pycache__/context_engine.cpython-311.pyc +0 -0
- package/src/core/__pycache__/context_engine.cpython-313.pyc +0 -0
- package/src/core/__pycache__/evidence_resolver.cpython-311.pyc +0 -0
- package/src/core/__pycache__/evidence_resolver.cpython-313.pyc +0 -0
- package/src/core/__pycache__/guardrails.cpython-311.pyc +0 -0
- package/src/core/__pycache__/guardrails.cpython-313.pyc +0 -0
- package/src/core/__pycache__/hooks.cpython-311.pyc +0 -0
- package/src/core/__pycache__/hooks.cpython-313.pyc +0 -0
- package/src/core/__pycache__/intent_service.cpython-313.pyc +0 -0
- package/src/core/__pycache__/llm_executor.cpython-311.pyc +0 -0
- package/src/core/__pycache__/llm_executor.cpython-313.pyc +0 -0
- package/src/core/__pycache__/model_router.cpython-311.pyc +0 -0
- package/src/core/__pycache__/model_router.cpython-313.pyc +0 -0
- package/src/core/__pycache__/orchestration_contracts.cpython-311.pyc +0 -0
- package/src/core/__pycache__/orchestration_contracts.cpython-313.pyc +0 -0
- package/src/core/__pycache__/precedence.cpython-311.pyc +0 -0
- package/src/core/__pycache__/precedence.cpython-313.pyc +0 -0
- package/src/core/__pycache__/prompt_builder.cpython-311.pyc +0 -0
- package/src/core/__pycache__/prompt_builder.cpython-313.pyc +0 -0
- package/src/core/__pycache__/prompt_policy_engine.cpython-311.pyc +0 -0
- package/src/core/__pycache__/prompt_policy_engine.cpython-313.pyc +0 -0
- package/{knowledge_base → src}/core/cache.py +2 -2
- package/{knowledge_base → src}/core/confidence.py +2 -2
- package/src/core/context_engine.py +138 -0
- package/src/core/evidence_resolver.py +72 -0
- package/src/core/guardrails.py +22 -0
- package/src/core/hooks.py +57 -0
- package/src/core/intent_service.py +74 -0
- package/src/core/llm_executor.py +138 -0
- package/{knowledge_base → src}/core/logging_setup.py +1 -1
- package/src/core/model_router.py +246 -0
- package/src/core/orchestration_contracts.py +66 -0
- package/src/core/persistence_engine.py +159 -0
- package/src/core/prompt_builder.py +49 -0
- package/src/core/prompt_policy_engine.py +35 -0
- package/src/core/traceability_engine.py +56 -0
- package/src/db/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/db/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/db/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/db/__pycache__/client.cpython-311.pyc +0 -0
- package/src/db/__pycache__/client.cpython-313.pyc +0 -0
- package/src/db/__pycache__/client.cpython-314.pyc +0 -0
- package/src/db/__pycache__/igel_schema.cpython-311.pyc +0 -0
- package/src/db/__pycache__/igel_schema.cpython-313.pyc +0 -0
- package/src/db/__pycache__/igel_schema.cpython-314.pyc +0 -0
- package/src/db/__pycache__/kg_introspect.cpython-311.pyc +0 -0
- package/src/db/__pycache__/kg_introspect.cpython-313.pyc +0 -0
- package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/db/client.py +1 -1
- package/{knowledge_base → src}/db/connector_sync.py +1 -1
- package/{knowledge_base → src}/db/feedback_schema.py +2 -2
- package/{knowledge_base → src}/db/igel_schema.py +29 -4
- package/{knowledge_base → src}/db/kg_introspect.py +1 -1
- package/src/db/migrations.py +237 -0
- package/{knowledge_base → src}/db/schema.py +6 -6
- package/{knowledge_base → src}/deploy/Dockerfile +3 -3
- package/{knowledge_base → src}/deploy/feedback_automation.sh +3 -3
- package/{knowledge_base → src}/deploy/firecrawl-docker.sh +4 -4
- package/{knowledge_base → src}/deploy/igel-testgen.service +2 -2
- package/{knowledge_base → src}/deploy/install_reranker.sh +1 -1
- package/{knowledge_base → src}/deploy/requirements.txt +1 -2
- package/{knowledge_base → src}/deploy/run_server.sh +1 -1
- package/{knowledge_base → src}/docs/TEST_GENERATION_GUIDE.md +15 -15
- package/src/embeddings/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/embeddings/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/embeddings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/embeddings/__pycache__/azure_embedder.cpython-311.pyc +0 -0
- package/src/embeddings/__pycache__/azure_embedder.cpython-313.pyc +0 -0
- package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/embeddings/azure_embedder.py +10 -1
- package/{knowledge_base → src}/eval/__init__.py +3 -3
- package/{knowledge_base → src}/eval/__main__.py +7 -7
- package/src/eval/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/eval/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/eval/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/eval/__pycache__/baseline.cpython-311.pyc +0 -0
- package/src/eval/__pycache__/baseline.cpython-313.pyc +0 -0
- package/src/eval/__pycache__/baseline.cpython-314.pyc +0 -0
- package/src/eval/__pycache__/harness.cpython-311.pyc +0 -0
- package/src/eval/__pycache__/harness.cpython-313.pyc +0 -0
- package/src/eval/__pycache__/harness.cpython-314.pyc +0 -0
- package/src/eval/__pycache__/scorers.cpython-311.pyc +0 -0
- package/src/eval/__pycache__/scorers.cpython-313.pyc +0 -0
- package/src/eval/__pycache__/scorers.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/eval/harness.py +6 -6
- package/{knowledge_base → src}/feedback/__init__.py +1 -1
- package/{knowledge_base → src}/feedback/analytics.py +1 -1
- package/{knowledge_base → src}/feedback/applier.py +4 -4
- package/{knowledge_base → src}/feedback/curator.py +2 -2
- package/{knowledge_base → src}/feedback/handler.py +1 -1
- package/src/generation/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/generation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/generation/__pycache__/input_classifier.cpython-313.pyc +0 -0
- package/src/generation/__pycache__/manual_tc_parser.cpython-313.pyc +0 -0
- package/src/generation/__pycache__/prompts.cpython-313.pyc +0 -0
- package/src/generation/__pycache__/prompts.cpython-314.pyc +0 -0
- package/src/generation/__pycache__/test_generator.cpython-313.pyc +0 -0
- package/src/generation/__pycache__/test_generator.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/generation/input_classifier.py +1 -1
- package/{knowledge_base → src}/generation/prompts.py +1 -1
- package/{knowledge_base → src}/generation/tc_transformer.py +10 -10
- package/{knowledge_base → src}/generation/test_generator.py +56 -10
- package/{knowledge_base → src}/graph_db/__init__.py +1 -1
- package/{knowledge_base → src}/graph_db/graphiti_client.py +2 -2
- package/{knowledge_base → src}/graph_db/kg_traversal.py +3 -3
- package/{knowledge_base → src}/graph_db/migrate_kg.py +4 -4
- package/{knowledge_base → src}/graph_db/neo4j_client.py +1 -1
- package/{knowledge_base → src}/graph_db/temporal_ingest.py +1 -1
- package/{knowledge_base → src}/ingestion/kg_extractor.py +6 -6
- package/{knowledge_base → src}/ingestion/web_ingest.py +6 -6
- package/src/intelligence/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/intelligence/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/intelligence/__pycache__/diff_analyzer.cpython-311.pyc +0 -0
- package/src/intelligence/__pycache__/diff_analyzer.cpython-313.pyc +0 -0
- package/src/intelligence/__pycache__/routing_engine.cpython-311.pyc +0 -0
- package/src/intelligence/__pycache__/routing_engine.cpython-313.pyc +0 -0
- package/src/intelligence/diff_analyzer.py +109 -0
- package/{knowledge_base → src}/intelligence/execution_ingest.py +3 -3
- package/src/intelligence/routing_engine.py +74 -0
- package/src/mcp/server.ts +384 -0
- package/src/memory/__init__.py +6 -0
- package/src/memory/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/memory/__pycache__/cognee_client.cpython-314.pyc +0 -0
- package/src/memory/__pycache__/memory_types.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/memory/cognee_client.py +3 -3
- package/src/models/__pycache__/test_requirement.cpython-311.pyc +0 -0
- package/src/models/__pycache__/test_requirement.cpython-313.pyc +0 -0
- package/src/models/__pycache__/test_requirement.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/models/test_requirement.py +12 -7
- package/{knowledge_base → src}/parsers/csv_parser.py +1 -1
- package/{knowledge_base → src}/parsers/doc_parser.py +1 -1
- package/{knowledge_base → src}/parsers/html_parser.py +1 -1
- package/{knowledge_base → src}/parsers/pdf_parser.py +1 -1
- package/src/project/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/project/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/project/__pycache__/ai_folder.cpython-311.pyc +0 -0
- package/src/project/__pycache__/ai_folder.cpython-313.pyc +0 -0
- package/src/project/__pycache__/context_enricher.cpython-313.pyc +0 -0
- package/src/project/__pycache__/context_projection_builder.cpython-311.pyc +0 -0
- package/src/project/__pycache__/context_projection_builder.cpython-313.pyc +0 -0
- package/src/project/__pycache__/context_requirement_sync.cpython-311.pyc +0 -0
- package/src/project/__pycache__/context_requirement_sync.cpython-313.pyc +0 -0
- package/src/project/ai_folder.py +602 -0
- package/src/project/context_enricher.py +333 -0
- package/src/project/context_projection_builder.py +167 -0
- package/src/project/context_requirement_sync.py +205 -0
- package/src/project/init_check.py +214 -0
- package/src/prompts/__pycache__/prompt_loader.cpython-313.pyc +0 -0
- package/src/prompts/automation_design.md +12 -0
- package/src/prompts/policies/automation_generation_policy.md +11 -0
- package/src/prompts/policies/generation_instructions.md +24 -0
- package/src/prompts/policies/guardrails.md +6 -0
- package/src/prompts/policies/traceability_policy.md +9 -0
- package/src/prompts/prompt_loader.py +56 -0
- package/src/prompts/requirement_understanding.md +17 -0
- package/src/prompts/scenario_generator.md +17 -0
- package/src/prompts/script_generator.md +13 -0
- package/src/prompts/test_case_generator.md +23 -0
- package/src/retrieval/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/retrieval/__pycache__/__init__.cpython-313.pyc +0 -0
- package/src/retrieval/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/retrieval/__pycache__/knowledge_graph.cpython-311.pyc +0 -0
- package/src/retrieval/__pycache__/knowledge_graph.cpython-313.pyc +0 -0
- package/src/retrieval/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
- package/src/retrieval/__pycache__/retriever.cpython-311.pyc +0 -0
- package/src/retrieval/__pycache__/retriever.cpython-313.pyc +0 -0
- package/src/retrieval/__pycache__/retriever.cpython-314.pyc +0 -0
- package/src/retrieval/__pycache__/unified_query.cpython-313.pyc +0 -0
- package/src/retrieval/__pycache__/unified_query.cpython-314.pyc +0 -0
- package/{knowledge_base → src}/retrieval/context_fusion.py +3 -3
- package/{knowledge_base → src}/retrieval/knowledge_graph.py +4 -4
- package/{knowledge_base → src}/retrieval/reranker.py +2 -2
- package/{knowledge_base → src}/retrieval/retriever.py +11 -11
- package/{knowledge_base → src}/retrieval/unified_query.py +7 -7
- package/{knowledge_base → src}/retrieval/web_retriever.py +6 -6
- package/{knowledge_base → src}/validators/step_fidelity.py +1 -1
- package/src/vision/__init__.py +0 -0
- package/{knowledge_base → src}/vision/image_describer.py +1 -1
- package/knowledge_base/__pycache__/__init__.cpython-314.pyc +0 -0
- package/knowledge_base/agents/__init__.py +0 -6
- package/knowledge_base/agents/confidence_agent.py +0 -94
- package/knowledge_base/agents/feedback_agent.py +0 -56
- package/knowledge_base/agents/intent_agent.py +0 -76
- package/knowledge_base/agents/requirement_agent.py +0 -71
- package/knowledge_base/agents/testcase_agent.py +0 -111
- package/knowledge_base/agents/workflow_engine.py +0 -87
- package/knowledge_base/cli/generate_qcapps134.py +0 -391
- package/knowledge_base/cli/workflow_cli.py +0 -93
- package/knowledge_base/config/.env +0 -100
- package/knowledge_base/config/.env.example +0 -75
- package/knowledge_base/connectors/bitbucket_connector.py +0 -25
- package/knowledge_base/db/__pycache__/__init__.cpython-314.pyc +0 -0
- package/knowledge_base/db/__pycache__/client.cpython-314.pyc +0 -0
- package/knowledge_base/db/migrations.py +0 -22
- package/knowledge_base/embeddings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/knowledge_base/ingestion/ingest.py +0 -346
- package/knowledge_base/ingestion/ingest_images.py +0 -330
- package/knowledge_base/memory/__init__.py +0 -6
- package/knowledge_base/memory/ingest_memory.py +0 -60
- /package/{knowledge_base → src}/__init__.py +0 -0
- /package/{knowledge_base → src}/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/confidence.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/config.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/config.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/config.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/feedback_analytics.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/feedback_applier.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/feedback_cli.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/feedback_curator.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/feedback_handler.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/generate.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/kg_extractor.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/precedence.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/prompts.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/prompts.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/reranker.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/reranker.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/retriever.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/retriever.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/server.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/test_generator.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/__pycache__/test_generator.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/healing_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/rca_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/regression_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/state.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/state.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/agents/state.py +0 -0
- /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/alembic/versions/.gitkeep +0 -0
- /package/{knowledge_base → src}/alembic/versions/001_phase0_feedback.py +0 -0
- /package/{knowledge_base → src}/alembic/versions/002_feedback_promotions.py +0 -0
- /package/{knowledge_base → src}/alembic/versions/003_enterprise_hardening.py +0 -0
- /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/api/__init__.py +0 -0
- /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/api/__pycache__/middleware.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/api/__pycache__/server.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/api/__pycache__/server.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/chunking/__init__.py +0 -0
- /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/chunking/validators.py +0 -0
- /package/{knowledge_base → src}/cli/__init__.py +0 -0
- /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/cli/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/config/__pycache__/settings.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/config/__pycache__/settings.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/community_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/kb_igel_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/playwright_fetcher.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/query_bridge.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/search_backends.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/__pycache__/web_fetcher.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/connectors/base.py +0 -0
- /package/{knowledge_base → src}/connectors/playwright_fetcher.py +0 -0
- /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/cache.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/circuit_breaker.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/logging_setup.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/metrics.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/__pycache__/request_context.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/core/circuit_breaker.py +0 -0
- /package/{knowledge_base → src}/core/metrics.py +0 -0
- /package/{knowledge_base → src}/core/precedence.py +0 -0
- /package/{knowledge_base → src}/core/request_context.py +0 -0
- /package/{knowledge_base → src}/db/__init__.py +0 -0
- /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/client.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/client.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/connector_sync.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/schema.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/db/__pycache__/schema.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/embeddings/__init__.py +0 -0
- /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/__main__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/eval/baseline.py +0 -0
- /package/{knowledge_base → src}/eval/queries_50.json +0 -0
- /package/{knowledge_base → src}/eval/scorers.py +0 -0
- /package/{knowledge_base → src}/exemplars/README.md +0 -0
- /package/{knowledge_base → src}/exemplars/__pycache__/pytest_reference_snippet.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/exemplars/gold_manual_concise_snippet.md +0 -0
- /package/{knowledge_base → src}/exemplars/gold_manual_detailed_snippet.md +0 -0
- /package/{knowledge_base → src}/exemplars/pytest_reference_snippet.py +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/generation/__init__.py +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/tc_transformer.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/generation/manual_tc_parser.py +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/graphiti_client.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/kg_traversal.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/migrate_kg.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/schema.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/__pycache__/temporal_ingest.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/graph_db/schema.py +0 -0
- /package/{knowledge_base → src}/ingestion/__init__.py +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/ingestion/__pycache__/web_ingest.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/intelligence/__init__.py +0 -0
- /package/{knowledge_base → src}/intelligence/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/intelligence/__pycache__/execution_ingest.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/intelligence/__pycache__/predictive_engine.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/intelligence/__pycache__/risk_scorer.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/intelligence/predictive_engine.py +0 -0
- /package/{knowledge_base → src}/intelligence/risk_scorer.py +0 -0
- /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/memory/__pycache__/ingest_memory.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/memory/memory_types.py +0 -0
- /package/{knowledge_base → src}/parsers/__init__.py +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/csv_parser.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/csv_parser.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/doc_parser.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/doc_parser.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/html_parser.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/image_extractor.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/image_extractor.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/markdown_parser.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/markdown_parser.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/pdf_parser.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/parsers/__pycache__/pdf_parser.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/parsers/image_extractor.py +0 -0
- /package/{knowledge_base → src}/parsers/markdown_parser.py +0 -0
- /package/{knowledge_base/vision → src/project}/__init__.py +0 -0
- /package/{knowledge_base → src}/retrieval/__init__.py +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/unified_query.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/__pycache__/web_retriever.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/retrieval/retrieval_debug.py +0 -0
- /package/{knowledge_base → src}/validators/__init__.py +0 -0
- /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-314.pyc +0 -0
- /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-38.pyc +0 -0
- /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-37.pyc +0 -0
- /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-38.pyc +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -23,7 +23,7 @@ def _redis():
|
|
|
23
23
|
if _redis_client is not None:
|
|
24
24
|
return _redis_client
|
|
25
25
|
try:
|
|
26
|
-
from
|
|
26
|
+
from src.config import cfg
|
|
27
27
|
if not getattr(cfg, "REDIS_URL", ""):
|
|
28
28
|
return None
|
|
29
29
|
import redis
|
|
@@ -70,7 +70,7 @@ def store_embedding_cache(query: str, vector: list[float]) -> None:
|
|
|
70
70
|
embed_query_cached.cache_clear()
|
|
71
71
|
# LRU handled by caller storing in Redis for cross-process
|
|
72
72
|
payload = json.dumps(vector)
|
|
73
|
-
from
|
|
73
|
+
from src.config import cfg
|
|
74
74
|
cache_set("embed", query.strip().lower(), payload, getattr(cfg, "EMBED_CACHE_TTL", 3600))
|
|
75
75
|
|
|
76
76
|
|
|
@@ -4,7 +4,7 @@ Confidence Scoring for Generated Test Cases
|
|
|
4
4
|
Adds 5-dimensional confidence scores to every test case generation.
|
|
5
5
|
|
|
6
6
|
Usage:
|
|
7
|
-
from
|
|
7
|
+
from src.core.confidence import score_generation
|
|
8
8
|
|
|
9
9
|
confidence = score_generation(
|
|
10
10
|
query=query,
|
|
@@ -20,7 +20,7 @@ from __future__ import annotations
|
|
|
20
20
|
|
|
21
21
|
from typing import Any
|
|
22
22
|
|
|
23
|
-
from
|
|
23
|
+
from src.eval.scorers import (
|
|
24
24
|
DomainScorer,
|
|
25
25
|
ExecutabilityScorer,
|
|
26
26
|
PublishScorer,
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from typing import List
|
|
6
|
+
|
|
7
|
+
from src.retrieval.retriever import retrieve, SearchResult
|
|
8
|
+
from src.core.precedence import (
|
|
9
|
+
RankedChunk,
|
|
10
|
+
apply_precedence_filter,
|
|
11
|
+
detect_precedence_conflicts,
|
|
12
|
+
)
|
|
13
|
+
from src.config.policy_config import get_policy
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class SourceReport:
|
|
20
|
+
"""What each source contributed to the context."""
|
|
21
|
+
jira_found: bool = False
|
|
22
|
+
jira_chunks: int = 0
|
|
23
|
+
confluence_found: bool = False
|
|
24
|
+
confluence_chunks: int = 0
|
|
25
|
+
postgres_kb_found: bool = False
|
|
26
|
+
postgres_kb_chunks: int = 0
|
|
27
|
+
igel_os12_docs_found: bool = False
|
|
28
|
+
igel_os12_docs_chunks: int = 0
|
|
29
|
+
community_docs_found: bool = False
|
|
30
|
+
community_docs_chunks: int = 0
|
|
31
|
+
conflicts: list[dict] = field(default_factory=list)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class UnifiedContext:
|
|
36
|
+
jira_key: str
|
|
37
|
+
ranked_chunks: list[RankedChunk]
|
|
38
|
+
source_report: SourceReport
|
|
39
|
+
source_attribution: dict
|
|
40
|
+
total_estimated_tokens: int
|
|
41
|
+
retrieval_quality_score: float
|
|
42
|
+
os_version: str = "OS12"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ContextEngine:
|
|
46
|
+
def build(self, jira_key: str, query: str) -> UnifiedContext:
|
|
47
|
+
policy = get_policy()
|
|
48
|
+
|
|
49
|
+
# 1. Retrieve from all sources
|
|
50
|
+
raw_results = retrieve(query, top_k=policy.top_k_chunks * 2)
|
|
51
|
+
|
|
52
|
+
# 2. Filter for OS12 content only
|
|
53
|
+
# We check product/metadata or assume it's valid if no 'OS11' explicit flag.
|
|
54
|
+
# Strict filter: if chunk content or metadata explicitly mentions OS11 and not OS12, drop it.
|
|
55
|
+
# Here we just blindly filter text if it heavily implies OS11.
|
|
56
|
+
os12_results = []
|
|
57
|
+
for r in raw_results:
|
|
58
|
+
text = (r.child_content + " " + r.parent_content).lower()
|
|
59
|
+
if "os11" in text and "os12" not in text:
|
|
60
|
+
continue
|
|
61
|
+
os12_results.append(r)
|
|
62
|
+
|
|
63
|
+
# 3. Compute retrieval_quality_score
|
|
64
|
+
quality_score = 0.0
|
|
65
|
+
if os12_results:
|
|
66
|
+
quality_score = max(r.rerank_score or r.rrf_score or 0.0 for r in os12_results)
|
|
67
|
+
|
|
68
|
+
# Optional: if quality_score < threshold, we might want to log it for the reviewer
|
|
69
|
+
if quality_score < 0.1:
|
|
70
|
+
logger.warning(f"Retrieval quality score {quality_score} is very low for query: {query}")
|
|
71
|
+
|
|
72
|
+
# 4. Rank by precedence
|
|
73
|
+
# Retriever returned SearchResult objects, we can pass them to precedence as chunks
|
|
74
|
+
# since apply_precedence_filter expects objects with .metadata and .content
|
|
75
|
+
scores = {str(r.child_chunk_id): (r.rerank_score or r.rrf_score or 0.0) for r in os12_results}
|
|
76
|
+
|
|
77
|
+
# We need to map SearchResult to a mock chunk object or just ensure it has what precedence needs
|
|
78
|
+
# SearchResult has .metadata, .parent_content
|
|
79
|
+
for r in os12_results:
|
|
80
|
+
if not hasattr(r, 'content'):
|
|
81
|
+
r.content = r.parent_content
|
|
82
|
+
if not hasattr(r, 'id'):
|
|
83
|
+
r.id = r.child_chunk_id
|
|
84
|
+
|
|
85
|
+
filtered_chunks, attribution = apply_precedence_filter(
|
|
86
|
+
os12_results,
|
|
87
|
+
top_k=policy.top_k_chunks,
|
|
88
|
+
retrieval_scores=scores
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Also let's re-run rank_chunks_by_precedence to get RankedChunk objects
|
|
92
|
+
from src.core.precedence import rank_chunks_by_precedence
|
|
93
|
+
ranked_chunks = rank_chunks_by_precedence(filtered_chunks, scores)
|
|
94
|
+
|
|
95
|
+
# 5. Build SourceReport
|
|
96
|
+
report = SourceReport()
|
|
97
|
+
for rc in ranked_chunks:
|
|
98
|
+
stype = rc.source_type.name
|
|
99
|
+
if stype == "jira_tc":
|
|
100
|
+
report.jira_found = True
|
|
101
|
+
report.jira_chunks += 1
|
|
102
|
+
elif stype == "confluence":
|
|
103
|
+
report.confluence_found = True
|
|
104
|
+
report.confluence_chunks += 1
|
|
105
|
+
elif stype == "igel_docs" or stype == "kb_web":
|
|
106
|
+
report.igel_os12_docs_found = True
|
|
107
|
+
report.igel_os12_docs_chunks += 1
|
|
108
|
+
elif stype == "community":
|
|
109
|
+
report.community_docs_found = True
|
|
110
|
+
report.community_docs_chunks += 1
|
|
111
|
+
# Postgres KB might be mapped as gold_tc or other custom
|
|
112
|
+
elif stype == "gold_tc":
|
|
113
|
+
report.postgres_kb_found = True
|
|
114
|
+
report.postgres_kb_chunks += 1
|
|
115
|
+
|
|
116
|
+
# 6. Detect conflicts
|
|
117
|
+
report.conflicts = detect_precedence_conflicts(filtered_chunks)
|
|
118
|
+
|
|
119
|
+
# 7. Enforce max_context_tokens
|
|
120
|
+
# roughly 1 token = 4 chars
|
|
121
|
+
total_tokens = 0
|
|
122
|
+
final_ranked = []
|
|
123
|
+
for rc in ranked_chunks:
|
|
124
|
+
est_tokens = len(rc.content) // 4
|
|
125
|
+
if total_tokens + est_tokens > policy.max_context_tokens:
|
|
126
|
+
break
|
|
127
|
+
total_tokens += est_tokens
|
|
128
|
+
final_ranked.append(rc)
|
|
129
|
+
|
|
130
|
+
return UnifiedContext(
|
|
131
|
+
jira_key=jira_key,
|
|
132
|
+
ranked_chunks=final_ranked,
|
|
133
|
+
source_report=report,
|
|
134
|
+
source_attribution=attribution,
|
|
135
|
+
total_estimated_tokens=total_tokens,
|
|
136
|
+
retrieval_quality_score=quality_score,
|
|
137
|
+
os_version=policy.igel_os_version
|
|
138
|
+
)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from src.core.context_engine import UnifiedContext
|
|
8
|
+
from src.core.precedence import resolve_conflict, RankedChunk
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class ResolvedContext:
|
|
15
|
+
chosen_truth: str
|
|
16
|
+
source: str
|
|
17
|
+
conflicting_sources: list[str]
|
|
18
|
+
resolution_rationale: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class EvidenceResolver:
|
|
22
|
+
"""Resolves conflicting information before feeding context to Generation engines."""
|
|
23
|
+
|
|
24
|
+
def resolve(self, unified_context: UnifiedContext) -> ResolvedContext:
|
|
25
|
+
"""
|
|
26
|
+
Takes a UnifiedContext (which contains ranked_chunks and conflicts)
|
|
27
|
+
and outputs a single resolved truth.
|
|
28
|
+
"""
|
|
29
|
+
if not unified_context.ranked_chunks:
|
|
30
|
+
return ResolvedContext(
|
|
31
|
+
chosen_truth="",
|
|
32
|
+
source="none",
|
|
33
|
+
conflicting_sources=[],
|
|
34
|
+
resolution_rationale="No chunks found."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# The primary truth is simply the highest-precedence chunk's content,
|
|
38
|
+
# since `ranked_chunks` is already sorted by composite_rank.
|
|
39
|
+
primary_chunk: RankedChunk = unified_context.ranked_chunks[0]
|
|
40
|
+
|
|
41
|
+
chosen_truth = primary_chunk.content
|
|
42
|
+
source = primary_chunk.source_type.name
|
|
43
|
+
|
|
44
|
+
conflicting_sources = []
|
|
45
|
+
|
|
46
|
+
# If there are conflicts reported by context engine
|
|
47
|
+
if unified_context.source_report.conflicts:
|
|
48
|
+
for conflict in unified_context.source_report.conflicts:
|
|
49
|
+
s1 = conflict.get("source_1")
|
|
50
|
+
s2 = conflict.get("source_2")
|
|
51
|
+
if s1 and s1 not in conflicting_sources:
|
|
52
|
+
conflicting_sources.append(s1)
|
|
53
|
+
if s2 and s2 not in conflicting_sources:
|
|
54
|
+
conflicting_sources.append(s2)
|
|
55
|
+
|
|
56
|
+
# Ensure the primary source itself isn't listed as conflicting against itself
|
|
57
|
+
if source in conflicting_sources:
|
|
58
|
+
conflicting_sources.remove(source)
|
|
59
|
+
|
|
60
|
+
rationale = (
|
|
61
|
+
f"Resolved {len(unified_context.source_report.conflicts)} conflicts. "
|
|
62
|
+
f"Preferred {source} due to higher precedence over {', '.join(conflicting_sources)}."
|
|
63
|
+
)
|
|
64
|
+
else:
|
|
65
|
+
rationale = f"No precedence conflicts detected. Used {source} as primary truth."
|
|
66
|
+
|
|
67
|
+
return ResolvedContext(
|
|
68
|
+
chosen_truth=chosen_truth,
|
|
69
|
+
source=source,
|
|
70
|
+
conflicting_sources=conflicting_sources,
|
|
71
|
+
resolution_rationale=rationale
|
|
72
|
+
)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Agent-level guardrails with additive-only restrictions."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from src.core.orchestration_contracts import GuardrailDecision, LLMRequest
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AgentGuardrails:
|
|
8
|
+
def evaluate(self, request: LLMRequest) -> GuardrailDecision:
|
|
9
|
+
# Agent-specific minimal checks, additive to policy checks.
|
|
10
|
+
if request.task_type == "script_generation" and "pytest" not in request.user_prompt.lower():
|
|
11
|
+
return GuardrailDecision(
|
|
12
|
+
verdict="review",
|
|
13
|
+
reason="Script generation prompt missing explicit pytest intent",
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
if request.task_type == "requirement_understanding" and not request.context.jira_key:
|
|
17
|
+
return GuardrailDecision(
|
|
18
|
+
verdict="review",
|
|
19
|
+
reason="Missing jira_key in requirement context",
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
return GuardrailDecision(verdict="allow", reason="Guardrail checks passed")
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Pre/post hook interfaces for orchestration chain."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Protocol
|
|
6
|
+
|
|
7
|
+
from src.core.orchestration_contracts import GenerationContext, HookTrace, LLMRequest
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PreHook(Protocol):
|
|
11
|
+
name: str
|
|
12
|
+
|
|
13
|
+
def run(self, request: LLMRequest) -> HookTrace:
|
|
14
|
+
...
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class PostHook(Protocol):
|
|
18
|
+
name: str
|
|
19
|
+
|
|
20
|
+
def run(self, context: GenerationContext, content: str) -> HookTrace:
|
|
21
|
+
...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class BasicPreHook:
|
|
26
|
+
name: str = "basic_pre_hook"
|
|
27
|
+
|
|
28
|
+
def run(self, request: LLMRequest) -> HookTrace:
|
|
29
|
+
if not request.user_prompt.strip():
|
|
30
|
+
return HookTrace(stage="pre_hook", name=self.name, status="error", message="Empty user prompt")
|
|
31
|
+
return HookTrace(stage="pre_hook", name=self.name, status="ok")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class BasicPostHook:
|
|
36
|
+
name: str = "basic_post_hook"
|
|
37
|
+
|
|
38
|
+
def run(self, context: GenerationContext, content: str) -> HookTrace:
|
|
39
|
+
if not content.strip():
|
|
40
|
+
return HookTrace(stage="post_hook", name=self.name, status="error", message="Empty LLM content")
|
|
41
|
+
return HookTrace(stage="post_hook", name=self.name, status="ok", details={"chars": len(content)})
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class PreHookManager:
|
|
45
|
+
def __init__(self, hooks: list[PreHook] | None = None) -> None:
|
|
46
|
+
self.hooks = hooks or [BasicPreHook()]
|
|
47
|
+
|
|
48
|
+
def run(self, request: LLMRequest) -> list[HookTrace]:
|
|
49
|
+
return [h.run(request) for h in self.hooks]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class PostHookManager:
|
|
53
|
+
def __init__(self, hooks: list[PostHook] | None = None) -> None:
|
|
54
|
+
self.hooks = hooks or [BasicPostHook()]
|
|
55
|
+
|
|
56
|
+
def run(self, context: GenerationContext, content: str) -> list[HookTrace]:
|
|
57
|
+
return [h.run(context, content) for h in self.hooks]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Unified intent service used by both pipeline and agentic flows."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
|
|
6
|
+
from src.generation.input_classifier import classify_input
|
|
7
|
+
|
|
8
|
+
_FEATURE_MAP = {
|
|
9
|
+
"entra": "Entra ID SSO",
|
|
10
|
+
"sso": "Entra ID SSO",
|
|
11
|
+
"mfa": "Entra ID MFA",
|
|
12
|
+
"wifi": "Network WiFi 802.1x",
|
|
13
|
+
"802.1": "Network WiFi 802.1x",
|
|
14
|
+
"icg": "ICG Certificate Management",
|
|
15
|
+
"certificate": "ICG Certificate Management",
|
|
16
|
+
"chromium": "Chromium Browser",
|
|
17
|
+
"ums": "UMS Administration",
|
|
18
|
+
"profile": "UMS Profile Assignment",
|
|
19
|
+
"amd": "AMD Driver Integration",
|
|
20
|
+
"hub": "Device Onboarding IGEL Hub",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
_VERSIONS = ("12.8", "12.9", "12.10")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class IntentResult:
|
|
28
|
+
intent: str
|
|
29
|
+
feature_area: str
|
|
30
|
+
version_scope: str
|
|
31
|
+
query_categories: list[str] = field(default_factory=list)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class IntentService:
|
|
35
|
+
def classify(self, query: str, source_tc: str | None = None) -> IntentResult:
|
|
36
|
+
q = (query or "").strip()
|
|
37
|
+
low = q.lower()
|
|
38
|
+
|
|
39
|
+
cls = classify_input(q, source_tc)
|
|
40
|
+
intent = cls.mode.value
|
|
41
|
+
|
|
42
|
+
feature = "Unknown"
|
|
43
|
+
for kw, name in _FEATURE_MAP.items():
|
|
44
|
+
if kw in low:
|
|
45
|
+
feature = name
|
|
46
|
+
break
|
|
47
|
+
|
|
48
|
+
version_scope = "unspecified"
|
|
49
|
+
categories: list[str] = []
|
|
50
|
+
for v in _VERSIONS:
|
|
51
|
+
if v in q or f"os {v}" in low:
|
|
52
|
+
version_scope = v
|
|
53
|
+
categories.append("version_specific")
|
|
54
|
+
break
|
|
55
|
+
if version_scope == "unspecified":
|
|
56
|
+
categories.append("version_unspecified")
|
|
57
|
+
|
|
58
|
+
if any(w in low for w in ("fail", "error", "negative", "boundary")):
|
|
59
|
+
categories.append("negative_case")
|
|
60
|
+
if any(w in low for w in ("regression", "release", "change impact")):
|
|
61
|
+
categories.append("regression")
|
|
62
|
+
if any(w in low for w in ("debug", "troubleshoot", "root cause")):
|
|
63
|
+
categories.append("troubleshooting")
|
|
64
|
+
if any(w in low for w in ("registry", "profile", "configure", "setting")):
|
|
65
|
+
categories.append("configuration")
|
|
66
|
+
if intent == "synthesize" and feature == "Unknown":
|
|
67
|
+
categories.append("feature_unclear")
|
|
68
|
+
|
|
69
|
+
return IntentResult(
|
|
70
|
+
intent=intent,
|
|
71
|
+
feature_area=feature,
|
|
72
|
+
version_scope=version_scope,
|
|
73
|
+
query_categories=categories,
|
|
74
|
+
)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""Single mandatory LLM execution path.
|
|
2
|
+
|
|
3
|
+
Execution order:
|
|
4
|
+
pre-hooks -> policy -> guardrails -> Azure OpenAI call -> post-hooks
|
|
5
|
+
|
|
6
|
+
Precedence:
|
|
7
|
+
policy reject always wins.
|
|
8
|
+
guardrail may add restrictions but cannot override policy reject.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
import os
|
|
14
|
+
import time
|
|
15
|
+
|
|
16
|
+
from openai import APIConnectionError, APITimeoutError, AzureOpenAI, RateLimitError
|
|
17
|
+
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential
|
|
18
|
+
|
|
19
|
+
from src.config import cfg
|
|
20
|
+
from src.core.guardrails import AgentGuardrails
|
|
21
|
+
from src.core.hooks import PostHookManager, PreHookManager
|
|
22
|
+
from src.core.orchestration_contracts import HookTrace, LLMRequest, LLMResult
|
|
23
|
+
from src.core.prompt_policy_engine import PromptPolicyEngine
|
|
24
|
+
from src.core.model_router import ModelRouter
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class LLMExecutor:
|
|
30
|
+
def __init__(self) -> None:
|
|
31
|
+
self._client: AzureOpenAI | None = None
|
|
32
|
+
self.pre_hooks = PreHookManager()
|
|
33
|
+
self.post_hooks = PostHookManager()
|
|
34
|
+
self.policy = PromptPolicyEngine()
|
|
35
|
+
self.guardrails = AgentGuardrails()
|
|
36
|
+
|
|
37
|
+
def _get_client(self) -> AzureOpenAI:
|
|
38
|
+
if self._client is None:
|
|
39
|
+
self._client = AzureOpenAI(
|
|
40
|
+
api_key=cfg.AZURE_API_KEY,
|
|
41
|
+
azure_endpoint=cfg.AZURE_ENDPOINT,
|
|
42
|
+
api_version=cfg.AZURE_API_VERSION,
|
|
43
|
+
)
|
|
44
|
+
return self._client
|
|
45
|
+
|
|
46
|
+
@retry(
|
|
47
|
+
retry=retry_if_exception_type((RateLimitError, APIConnectionError, APITimeoutError)),
|
|
48
|
+
wait=wait_exponential(multiplier=1, min=2, max=30),
|
|
49
|
+
stop=stop_after_attempt(3),
|
|
50
|
+
reraise=True,
|
|
51
|
+
)
|
|
52
|
+
def _dispatch(self, request: LLMRequest) -> tuple[str, int, int]:
|
|
53
|
+
client = self._get_client()
|
|
54
|
+
kwargs = {
|
|
55
|
+
"model": request.deployment or cfg.AZURE_DEPLOYMENT,
|
|
56
|
+
"messages": [
|
|
57
|
+
{"role": "system", "content": request.system_prompt},
|
|
58
|
+
{"role": "user", "content": request.user_prompt},
|
|
59
|
+
],
|
|
60
|
+
"max_tokens": request.max_tokens,
|
|
61
|
+
"temperature": request.temperature,
|
|
62
|
+
}
|
|
63
|
+
if request.response_format:
|
|
64
|
+
kwargs["response_format"] = request.response_format
|
|
65
|
+
response = client.chat.completions.create(**kwargs)
|
|
66
|
+
content = response.choices[0].message.content or ""
|
|
67
|
+
tokens_in = response.usage.prompt_tokens if response.usage else 0
|
|
68
|
+
tokens_out = response.usage.completion_tokens if response.usage else 0
|
|
69
|
+
return content, tokens_in, tokens_out
|
|
70
|
+
|
|
71
|
+
def execute(self, request: LLMRequest) -> LLMResult:
|
|
72
|
+
traces: list[HookTrace] = []
|
|
73
|
+
|
|
74
|
+
pre = self.pre_hooks.run(request)
|
|
75
|
+
traces.extend(pre)
|
|
76
|
+
if any(t.status == "error" for t in pre):
|
|
77
|
+
raise ValueError("Pre-hook validation failed")
|
|
78
|
+
|
|
79
|
+
policy = self.policy.evaluate(request)
|
|
80
|
+
traces.append(HookTrace(stage="policy", name="prompt_policy_engine", status="ok" if policy.verdict != "reject" else "error", message=policy.reason))
|
|
81
|
+
if policy.verdict == "reject":
|
|
82
|
+
raise ValueError(f"Policy rejection: {policy.reason}")
|
|
83
|
+
|
|
84
|
+
guard = self.guardrails.evaluate(request)
|
|
85
|
+
traces.append(HookTrace(stage="guardrail", name="agent_guardrails", status="ok" if guard.verdict == "allow" else "warn", message=guard.reason))
|
|
86
|
+
if guard.verdict == "reject":
|
|
87
|
+
raise ValueError(f"Guardrail rejection: {guard.reason}")
|
|
88
|
+
|
|
89
|
+
start_t = time.time()
|
|
90
|
+
content, tokens_in, tokens_out = self._dispatch(request)
|
|
91
|
+
duration_ms = int((time.time() - start_t) * 1000)
|
|
92
|
+
|
|
93
|
+
router = ModelRouter()
|
|
94
|
+
router.record(
|
|
95
|
+
jira_key=request.context.jira_key or "unknown",
|
|
96
|
+
action=request.context.intent or "unknown",
|
|
97
|
+
model_used=request.deployment or cfg.AZURE_DEPLOYMENT,
|
|
98
|
+
task_type=request.task_type,
|
|
99
|
+
tokens_in=tokens_in,
|
|
100
|
+
tokens_out=tokens_out,
|
|
101
|
+
duration_ms=duration_ms,
|
|
102
|
+
quality_score=None,
|
|
103
|
+
routed_by="executor"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
post = self.post_hooks.run(request.context, content)
|
|
107
|
+
traces.extend(post)
|
|
108
|
+
if any(t.status == "error" for t in post):
|
|
109
|
+
raise ValueError("Post-hook validation failed")
|
|
110
|
+
|
|
111
|
+
return LLMResult(
|
|
112
|
+
content=content,
|
|
113
|
+
model=request.deployment or cfg.AZURE_DEPLOYMENT,
|
|
114
|
+
traces=traces,
|
|
115
|
+
policy=policy,
|
|
116
|
+
guardrail=guard,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
_executor: LLMExecutor | None = None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def get_executor() -> LLMExecutor:
|
|
124
|
+
global _executor
|
|
125
|
+
if _executor is None:
|
|
126
|
+
_executor = LLMExecutor()
|
|
127
|
+
return _executor
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def executor_enabled_for(agent_name: str) -> bool:
|
|
131
|
+
"""Canary gate for executor rollout.
|
|
132
|
+
|
|
133
|
+
Env var ORCH_EXECUTOR_ENABLED_AGENTS contains comma-separated agent names.
|
|
134
|
+
Defaults to TestCaseAgent + RequirementAgent.
|
|
135
|
+
"""
|
|
136
|
+
raw = os.getenv("ORCH_EXECUTOR_ENABLED_AGENTS", "TestCaseAgent,RequirementAgent")
|
|
137
|
+
allowed = {a.strip() for a in raw.split(",") if a.strip()}
|
|
138
|
+
return agent_name in allowed
|