igel-qe-core 1.0.5 → 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.
Files changed (629) hide show
  1. package/dist/cli/index.js +638 -54
  2. package/dist/cli/platform.js +0 -12
  3. package/dist/mcp/server.js +183 -8
  4. package/package.json +4 -4
  5. package/src/__pycache__/__init__.cpython-311.pyc +0 -0
  6. package/src/agents/__pycache__/__init__.cpython-311.pyc +0 -0
  7. package/src/agents/__pycache__/automation_design_agent.cpython-311.pyc +0 -0
  8. package/{knowledge_base → src}/agents/__pycache__/automation_design_agent.cpython-313.pyc +0 -0
  9. package/src/agents/__pycache__/code_intelligence_agent.cpython-311.pyc +0 -0
  10. package/src/agents/__pycache__/code_intelligence_agent.cpython-313.pyc +0 -0
  11. package/src/agents/__pycache__/confidence_agent.cpython-311.pyc +0 -0
  12. package/src/agents/__pycache__/confidence_agent.cpython-313.pyc +0 -0
  13. package/src/agents/__pycache__/execution_validation_agent.cpython-311.pyc +0 -0
  14. package/{knowledge_base → src}/agents/__pycache__/execution_validation_agent.cpython-313.pyc +0 -0
  15. package/src/agents/__pycache__/framework_analyzer_agent.cpython-311.pyc +0 -0
  16. package/src/agents/__pycache__/framework_analyzer_agent.cpython-313.pyc +0 -0
  17. package/src/agents/__pycache__/intent_agent.cpython-313.pyc +0 -0
  18. package/src/agents/__pycache__/regression_agent.cpython-311.pyc +0 -0
  19. package/src/agents/__pycache__/regression_agent.cpython-313.pyc +0 -0
  20. package/src/agents/__pycache__/requirement_agent.cpython-311.pyc +0 -0
  21. package/src/agents/__pycache__/requirement_agent.cpython-313.pyc +0 -0
  22. package/src/agents/__pycache__/scenario_agent.cpython-311.pyc +0 -0
  23. package/{knowledge_base → src}/agents/__pycache__/scenario_agent.cpython-313.pyc +0 -0
  24. package/src/agents/__pycache__/script_generator_agent.cpython-311.pyc +0 -0
  25. package/{knowledge_base → src}/agents/__pycache__/script_generator_agent.cpython-313.pyc +0 -0
  26. package/src/agents/__pycache__/testcase_agent.cpython-311.pyc +0 -0
  27. package/src/agents/__pycache__/testcase_agent.cpython-313.pyc +0 -0
  28. package/src/agents/__pycache__/validation_agent.cpython-311.pyc +0 -0
  29. package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-313.pyc +0 -0
  30. package/src/agents/__pycache__/workflow_engine.cpython-311.pyc +0 -0
  31. package/src/agents/__pycache__/workflow_engine.cpython-313.pyc +0 -0
  32. package/{knowledge_base → src}/agents/automation_design_agent.py +13 -16
  33. package/{knowledge_base → src}/agents/code_intelligence_agent.py +2 -2
  34. package/src/agents/confidence_agent.py +114 -0
  35. package/{knowledge_base → src}/agents/execution_validation_agent.py +1 -1
  36. package/{knowledge_base → src}/agents/feedback_agent.py +36 -7
  37. package/src/agents/framework_analyzer_agent.py +43 -0
  38. package/{knowledge_base → src}/agents/fusion_agent.py +3 -3
  39. package/{knowledge_base → src}/agents/graph.py +10 -10
  40. package/{knowledge_base → src}/agents/healing_agent.py +4 -4
  41. package/src/agents/intent_agent.py +30 -0
  42. package/src/agents/internal/__init__.py +3 -0
  43. package/src/agents/internal/__pycache__/__init__.cpython-313.pyc +0 -0
  44. package/src/agents/internal/__pycache__/approval_manager.cpython-313.pyc +0 -0
  45. package/src/agents/internal/__pycache__/question_engine.cpython-313.pyc +0 -0
  46. package/src/agents/internal/approval_manager.py +111 -0
  47. package/src/agents/internal/question_engine.py +111 -0
  48. package/src/agents/internal/workflow_engine.py +28 -0
  49. package/{knowledge_base → src}/agents/kg_agent.py +3 -3
  50. package/{knowledge_base → src}/agents/memory_agent.py +4 -4
  51. package/src/agents/orchestrator/__init__.py +3 -0
  52. package/src/agents/orchestrator/__pycache__/__init__.cpython-313.pyc +0 -0
  53. package/src/agents/orchestrator/__pycache__/orchestrator.cpython-313.pyc +0 -0
  54. package/src/agents/orchestrator/orchestrator.py +63 -0
  55. package/{knowledge_base → src}/agents/rca_agent.py +4 -4
  56. package/{knowledge_base → src}/agents/reflection_agent.py +1 -1
  57. package/{knowledge_base → src}/agents/regression_agent.py +2 -2
  58. package/src/agents/requirement_agent.py +97 -0
  59. package/{knowledge_base → src}/agents/retrieval_agent.py +2 -2
  60. package/{knowledge_base → src}/agents/scenario_agent.py +11 -17
  61. package/{knowledge_base → src}/agents/script_agent.py +6 -6
  62. package/{knowledge_base → src}/agents/script_generator_agent.py +12 -10
  63. package/{knowledge_base → src}/agents/temporal_agent.py +3 -3
  64. package/src/agents/testcase_agent.py +163 -0
  65. package/{knowledge_base → src}/agents/validation_agent.py +1 -1
  66. package/src/agents/workflow_engine.py +109 -0
  67. package/{knowledge_base → src}/alembic/README.md +4 -4
  68. package/{knowledge_base → src}/alembic/env.py +1 -1
  69. package/{knowledge_base → src}/alembic/script.py.mako +1 -1
  70. package/{knowledge_base → src}/api/middleware.py +3 -3
  71. package/{knowledge_base → src}/api/server.py +28 -28
  72. package/{knowledge_base → src}/chunking/chunker.py +3 -3
  73. package/src/cli/__pycache__/__init__.cpython-311.pyc +0 -0
  74. package/src/cli/__pycache__/workflow_cli.cpython-311.pyc +0 -0
  75. package/src/cli/__pycache__/workflow_cli.cpython-313.pyc +0 -0
  76. package/{knowledge_base → src}/cli/feedback_cli.py +10 -10
  77. package/{knowledge_base → src}/cli/generate.py +11 -11
  78. package/src/cli/index.ts +704 -0
  79. package/src/cli/platform.ts +147 -0
  80. package/src/cli/workflow_cli.py +930 -0
  81. package/{knowledge_base → src}/config/__init__.py +1 -1
  82. package/src/config/__pycache__/__init__.cpython-311.pyc +0 -0
  83. package/src/config/__pycache__/__init__.cpython-313.pyc +0 -0
  84. package/src/config/__pycache__/policy_config.cpython-311.pyc +0 -0
  85. package/src/config/__pycache__/policy_config.cpython-313.pyc +0 -0
  86. package/src/config/__pycache__/settings.cpython-311.pyc +0 -0
  87. package/{knowledge_base → src}/config/__pycache__/settings.cpython-313.pyc +0 -0
  88. package/src/config/policy_config.py +85 -0
  89. package/src/config/policy_rules.yaml +50 -0
  90. package/{knowledge_base → src}/config/settings.py +51 -6
  91. package/{knowledge_base → src}/connectors/__init__.py +1 -1
  92. package/src/connectors/__pycache__/__init__.cpython-311.pyc +0 -0
  93. package/src/connectors/__pycache__/__init__.cpython-313.pyc +0 -0
  94. package/src/connectors/__pycache__/base.cpython-311.pyc +0 -0
  95. package/src/connectors/__pycache__/jira_connector.cpython-311.pyc +0 -0
  96. package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-313.pyc +0 -0
  97. package/src/connectors/__pycache__/query_bridge.cpython-313.pyc +0 -0
  98. package/src/connectors/bitbucket_connector.py +334 -0
  99. package/{knowledge_base → src}/connectors/community_connector.py +6 -6
  100. package/{knowledge_base → src}/connectors/confluence_connector.py +4 -4
  101. package/{knowledge_base → src}/connectors/jira_connector.py +6 -6
  102. package/{knowledge_base → src}/connectors/kb_igel_connector.py +6 -6
  103. package/{knowledge_base → src}/connectors/query_bridge.py +11 -11
  104. package/{knowledge_base → src}/connectors/search_backends.py +1 -1
  105. package/{knowledge_base → src}/connectors/serviceNow_connector.py +2 -2
  106. package/{knowledge_base → src}/connectors/sync_scheduler.py +12 -10
  107. package/{knowledge_base → src}/connectors/teamcity_connector.py +2 -2
  108. package/{knowledge_base → src}/connectors/testRail_connector.py +2 -2
  109. package/{knowledge_base → src}/connectors/web_fetcher.py +1 -1
  110. package/src/connectors/xray_connector.py +337 -0
  111. package/{knowledge_base → src}/core/__init__.py +1 -1
  112. package/src/core/__pycache__/__init__.cpython-311.pyc +0 -0
  113. package/src/core/__pycache__/__init__.cpython-313.pyc +0 -0
  114. package/src/core/__pycache__/circuit_breaker.cpython-313.pyc +0 -0
  115. package/src/core/__pycache__/confidence.cpython-311.pyc +0 -0
  116. package/src/core/__pycache__/confidence.cpython-313.pyc +0 -0
  117. package/src/core/__pycache__/context_engine.cpython-311.pyc +0 -0
  118. package/src/core/__pycache__/context_engine.cpython-313.pyc +0 -0
  119. package/src/core/__pycache__/evidence_resolver.cpython-311.pyc +0 -0
  120. package/src/core/__pycache__/evidence_resolver.cpython-313.pyc +0 -0
  121. package/src/core/__pycache__/guardrails.cpython-311.pyc +0 -0
  122. package/src/core/__pycache__/guardrails.cpython-313.pyc +0 -0
  123. package/src/core/__pycache__/hooks.cpython-311.pyc +0 -0
  124. package/src/core/__pycache__/hooks.cpython-313.pyc +0 -0
  125. package/src/core/__pycache__/intent_service.cpython-313.pyc +0 -0
  126. package/src/core/__pycache__/llm_executor.cpython-311.pyc +0 -0
  127. package/src/core/__pycache__/llm_executor.cpython-313.pyc +0 -0
  128. package/src/core/__pycache__/model_router.cpython-311.pyc +0 -0
  129. package/src/core/__pycache__/model_router.cpython-313.pyc +0 -0
  130. package/src/core/__pycache__/orchestration_contracts.cpython-311.pyc +0 -0
  131. package/src/core/__pycache__/orchestration_contracts.cpython-313.pyc +0 -0
  132. package/src/core/__pycache__/precedence.cpython-311.pyc +0 -0
  133. package/src/core/__pycache__/precedence.cpython-313.pyc +0 -0
  134. package/src/core/__pycache__/prompt_builder.cpython-311.pyc +0 -0
  135. package/src/core/__pycache__/prompt_builder.cpython-313.pyc +0 -0
  136. package/src/core/__pycache__/prompt_policy_engine.cpython-311.pyc +0 -0
  137. package/src/core/__pycache__/prompt_policy_engine.cpython-313.pyc +0 -0
  138. package/{knowledge_base → src}/core/cache.py +2 -2
  139. package/{knowledge_base → src}/core/confidence.py +2 -2
  140. package/src/core/context_engine.py +138 -0
  141. package/src/core/evidence_resolver.py +72 -0
  142. package/src/core/guardrails.py +22 -0
  143. package/src/core/hooks.py +57 -0
  144. package/src/core/intent_service.py +74 -0
  145. package/src/core/llm_executor.py +138 -0
  146. package/{knowledge_base → src}/core/logging_setup.py +1 -1
  147. package/src/core/model_router.py +246 -0
  148. package/src/core/orchestration_contracts.py +66 -0
  149. package/src/core/persistence_engine.py +159 -0
  150. package/src/core/prompt_builder.py +49 -0
  151. package/src/core/prompt_policy_engine.py +35 -0
  152. package/src/core/traceability_engine.py +56 -0
  153. package/src/db/__pycache__/__init__.cpython-311.pyc +0 -0
  154. package/src/db/__pycache__/client.cpython-311.pyc +0 -0
  155. package/{knowledge_base → src}/db/__pycache__/client.cpython-313.pyc +0 -0
  156. package/src/db/__pycache__/igel_schema.cpython-311.pyc +0 -0
  157. package/{knowledge_base → src}/db/__pycache__/igel_schema.cpython-313.pyc +0 -0
  158. package/src/db/__pycache__/kg_introspect.cpython-311.pyc +0 -0
  159. package/src/db/__pycache__/kg_introspect.cpython-313.pyc +0 -0
  160. package/{knowledge_base → src}/db/client.py +1 -1
  161. package/{knowledge_base → src}/db/connector_sync.py +1 -1
  162. package/{knowledge_base → src}/db/feedback_schema.py +2 -2
  163. package/{knowledge_base → src}/db/igel_schema.py +28 -3
  164. package/{knowledge_base → src}/db/kg_introspect.py +1 -1
  165. package/src/db/migrations.py +237 -0
  166. package/{knowledge_base → src}/db/schema.py +6 -6
  167. package/{knowledge_base → src}/deploy/Dockerfile +3 -3
  168. package/{knowledge_base → src}/deploy/feedback_automation.sh +3 -3
  169. package/{knowledge_base → src}/deploy/firecrawl-docker.sh +4 -4
  170. package/{knowledge_base → src}/deploy/igel-testgen.service +2 -2
  171. package/{knowledge_base → src}/deploy/install_reranker.sh +1 -1
  172. package/{knowledge_base → src}/deploy/requirements.txt +1 -2
  173. package/{knowledge_base → src}/deploy/run_server.sh +1 -1
  174. package/{knowledge_base → src}/docs/TEST_GENERATION_GUIDE.md +15 -15
  175. package/src/embeddings/__pycache__/__init__.cpython-311.pyc +0 -0
  176. package/src/embeddings/__pycache__/azure_embedder.cpython-311.pyc +0 -0
  177. package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-313.pyc +0 -0
  178. package/{knowledge_base → src}/embeddings/azure_embedder.py +10 -1
  179. package/{knowledge_base → src}/eval/__init__.py +3 -3
  180. package/{knowledge_base → src}/eval/__main__.py +7 -7
  181. package/src/eval/__pycache__/__init__.cpython-311.pyc +0 -0
  182. package/src/eval/__pycache__/__init__.cpython-313.pyc +0 -0
  183. package/src/eval/__pycache__/baseline.cpython-311.pyc +0 -0
  184. package/src/eval/__pycache__/baseline.cpython-313.pyc +0 -0
  185. package/src/eval/__pycache__/harness.cpython-311.pyc +0 -0
  186. package/src/eval/__pycache__/harness.cpython-313.pyc +0 -0
  187. package/src/eval/__pycache__/scorers.cpython-311.pyc +0 -0
  188. package/src/eval/__pycache__/scorers.cpython-313.pyc +0 -0
  189. package/{knowledge_base → src}/eval/harness.py +6 -6
  190. package/{knowledge_base → src}/feedback/__init__.py +1 -1
  191. package/{knowledge_base → src}/feedback/analytics.py +1 -1
  192. package/{knowledge_base → src}/feedback/applier.py +4 -4
  193. package/{knowledge_base → src}/feedback/curator.py +2 -2
  194. package/{knowledge_base → src}/feedback/handler.py +1 -1
  195. package/src/generation/__pycache__/__init__.cpython-313.pyc +0 -0
  196. package/src/generation/__pycache__/input_classifier.cpython-313.pyc +0 -0
  197. package/src/generation/__pycache__/manual_tc_parser.cpython-313.pyc +0 -0
  198. package/src/generation/__pycache__/prompts.cpython-313.pyc +0 -0
  199. package/src/generation/__pycache__/test_generator.cpython-313.pyc +0 -0
  200. package/{knowledge_base → src}/generation/input_classifier.py +1 -1
  201. package/{knowledge_base → src}/generation/prompts.py +1 -1
  202. package/{knowledge_base → src}/generation/tc_transformer.py +10 -10
  203. package/{knowledge_base → src}/generation/test_generator.py +56 -10
  204. package/{knowledge_base → src}/graph_db/__init__.py +1 -1
  205. package/{knowledge_base → src}/graph_db/graphiti_client.py +2 -2
  206. package/{knowledge_base → src}/graph_db/kg_traversal.py +3 -3
  207. package/{knowledge_base → src}/graph_db/migrate_kg.py +4 -4
  208. package/{knowledge_base → src}/graph_db/neo4j_client.py +1 -1
  209. package/{knowledge_base → src}/graph_db/temporal_ingest.py +1 -1
  210. package/{knowledge_base → src}/ingestion/kg_extractor.py +6 -6
  211. package/{knowledge_base → src}/ingestion/web_ingest.py +6 -6
  212. package/src/intelligence/__pycache__/__init__.cpython-311.pyc +0 -0
  213. package/src/intelligence/__pycache__/__init__.cpython-313.pyc +0 -0
  214. package/src/intelligence/__pycache__/diff_analyzer.cpython-311.pyc +0 -0
  215. package/src/intelligence/__pycache__/diff_analyzer.cpython-313.pyc +0 -0
  216. package/src/intelligence/__pycache__/routing_engine.cpython-311.pyc +0 -0
  217. package/src/intelligence/__pycache__/routing_engine.cpython-313.pyc +0 -0
  218. package/src/intelligence/diff_analyzer.py +109 -0
  219. package/{knowledge_base → src}/intelligence/execution_ingest.py +3 -3
  220. package/src/intelligence/routing_engine.py +74 -0
  221. package/src/mcp/server.ts +384 -0
  222. package/src/memory/__init__.py +6 -0
  223. package/{knowledge_base → src}/memory/cognee_client.py +3 -3
  224. package/src/models/__pycache__/test_requirement.cpython-311.pyc +0 -0
  225. package/{knowledge_base → src}/models/__pycache__/test_requirement.cpython-313.pyc +0 -0
  226. package/{knowledge_base → src}/models/test_requirement.py +9 -7
  227. package/{knowledge_base → src}/parsers/csv_parser.py +1 -1
  228. package/{knowledge_base → src}/parsers/doc_parser.py +1 -1
  229. package/{knowledge_base → src}/parsers/html_parser.py +1 -1
  230. package/{knowledge_base → src}/parsers/pdf_parser.py +1 -1
  231. package/src/project/__pycache__/__init__.cpython-311.pyc +0 -0
  232. package/src/project/__pycache__/__init__.cpython-313.pyc +0 -0
  233. package/src/project/__pycache__/ai_folder.cpython-311.pyc +0 -0
  234. package/src/project/__pycache__/ai_folder.cpython-313.pyc +0 -0
  235. package/src/project/__pycache__/context_enricher.cpython-313.pyc +0 -0
  236. package/src/project/__pycache__/context_projection_builder.cpython-311.pyc +0 -0
  237. package/src/project/__pycache__/context_projection_builder.cpython-313.pyc +0 -0
  238. package/src/project/__pycache__/context_requirement_sync.cpython-311.pyc +0 -0
  239. package/src/project/__pycache__/context_requirement_sync.cpython-313.pyc +0 -0
  240. package/src/project/ai_folder.py +602 -0
  241. package/src/project/context_enricher.py +333 -0
  242. package/src/project/context_projection_builder.py +167 -0
  243. package/src/project/context_requirement_sync.py +205 -0
  244. package/src/project/init_check.py +214 -0
  245. package/src/prompts/__pycache__/prompt_loader.cpython-313.pyc +0 -0
  246. package/src/prompts/automation_design.md +12 -0
  247. package/src/prompts/policies/automation_generation_policy.md +11 -0
  248. package/src/prompts/policies/generation_instructions.md +24 -0
  249. package/src/prompts/policies/guardrails.md +6 -0
  250. package/src/prompts/policies/traceability_policy.md +9 -0
  251. package/src/prompts/prompt_loader.py +56 -0
  252. package/src/prompts/requirement_understanding.md +17 -0
  253. package/src/prompts/scenario_generator.md +17 -0
  254. package/src/prompts/script_generator.md +13 -0
  255. package/src/prompts/test_case_generator.md +23 -0
  256. package/src/retrieval/__pycache__/__init__.cpython-311.pyc +0 -0
  257. package/src/retrieval/__pycache__/__init__.cpython-313.pyc +0 -0
  258. package/src/retrieval/__pycache__/knowledge_graph.cpython-311.pyc +0 -0
  259. package/src/retrieval/__pycache__/knowledge_graph.cpython-313.pyc +0 -0
  260. package/src/retrieval/__pycache__/retriever.cpython-311.pyc +0 -0
  261. package/src/retrieval/__pycache__/retriever.cpython-313.pyc +0 -0
  262. package/src/retrieval/__pycache__/unified_query.cpython-313.pyc +0 -0
  263. package/{knowledge_base → src}/retrieval/context_fusion.py +3 -3
  264. package/{knowledge_base → src}/retrieval/knowledge_graph.py +4 -4
  265. package/{knowledge_base → src}/retrieval/reranker.py +2 -2
  266. package/{knowledge_base → src}/retrieval/retriever.py +11 -11
  267. package/{knowledge_base → src}/retrieval/unified_query.py +7 -7
  268. package/{knowledge_base → src}/retrieval/web_retriever.py +6 -6
  269. package/{knowledge_base → src}/validators/step_fidelity.py +1 -1
  270. package/src/vision/__init__.py +0 -0
  271. package/{knowledge_base → src}/vision/image_describer.py +1 -1
  272. package/knowledge_base/agents/__pycache__/confidence_agent.cpython-313.pyc +0 -0
  273. package/knowledge_base/agents/__pycache__/requirement_agent.cpython-313.pyc +0 -0
  274. package/knowledge_base/agents/__pycache__/testcase_agent.cpython-313.pyc +0 -0
  275. package/knowledge_base/agents/__pycache__/workflow_engine.cpython-313.pyc +0 -0
  276. package/knowledge_base/agents/confidence_agent.py +0 -95
  277. package/knowledge_base/agents/intent_agent.py +0 -76
  278. package/knowledge_base/agents/requirement_agent.py +0 -71
  279. package/knowledge_base/agents/testcase_agent.py +0 -111
  280. package/knowledge_base/agents/workflow_engine.py +0 -87
  281. package/knowledge_base/cli/__pycache__/workflow_cli.cpython-313.pyc +0 -0
  282. package/knowledge_base/cli/generate_qcapps134.py +0 -391
  283. package/knowledge_base/cli/workflow_cli.py +0 -189
  284. package/knowledge_base/config/.env +0 -100
  285. package/knowledge_base/config/.env.example +0 -75
  286. package/knowledge_base/config/__pycache__/__init__.cpython-313.pyc +0 -0
  287. package/knowledge_base/connectors/__pycache__/__init__.cpython-313.pyc +0 -0
  288. package/knowledge_base/connectors/bitbucket_connector.py +0 -25
  289. package/knowledge_base/db/migrations.py +0 -22
  290. package/knowledge_base/ingestion/ingest.py +0 -346
  291. package/knowledge_base/ingestion/ingest_images.py +0 -330
  292. package/knowledge_base/memory/__init__.py +0 -6
  293. package/knowledge_base/memory/ingest_memory.py +0 -60
  294. /package/{knowledge_base → src}/__init__.py +0 -0
  295. /package/{knowledge_base → src}/__pycache__/__init__.cpython-313.pyc +0 -0
  296. /package/{knowledge_base → src}/__pycache__/__init__.cpython-314.pyc +0 -0
  297. /package/{knowledge_base → src}/__pycache__/__init__.cpython-37.pyc +0 -0
  298. /package/{knowledge_base → src}/__pycache__/__init__.cpython-38.pyc +0 -0
  299. /package/{knowledge_base → src}/__pycache__/confidence.cpython-37.pyc +0 -0
  300. /package/{knowledge_base → src}/__pycache__/config.cpython-314.pyc +0 -0
  301. /package/{knowledge_base → src}/__pycache__/config.cpython-37.pyc +0 -0
  302. /package/{knowledge_base → src}/__pycache__/config.cpython-38.pyc +0 -0
  303. /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-314.pyc +0 -0
  304. /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-37.pyc +0 -0
  305. /package/{knowledge_base → src}/__pycache__/feedback_analytics.cpython-37.pyc +0 -0
  306. /package/{knowledge_base → src}/__pycache__/feedback_applier.cpython-37.pyc +0 -0
  307. /package/{knowledge_base → src}/__pycache__/feedback_cli.cpython-37.pyc +0 -0
  308. /package/{knowledge_base → src}/__pycache__/feedback_curator.cpython-37.pyc +0 -0
  309. /package/{knowledge_base → src}/__pycache__/feedback_handler.cpython-37.pyc +0 -0
  310. /package/{knowledge_base → src}/__pycache__/generate.cpython-37.pyc +0 -0
  311. /package/{knowledge_base → src}/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
  312. /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-314.pyc +0 -0
  313. /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-37.pyc +0 -0
  314. /package/{knowledge_base → src}/__pycache__/kg_extractor.cpython-37.pyc +0 -0
  315. /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
  316. /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
  317. /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-314.pyc +0 -0
  318. /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
  319. /package/{knowledge_base → src}/__pycache__/precedence.cpython-37.pyc +0 -0
  320. /package/{knowledge_base → src}/__pycache__/prompts.cpython-314.pyc +0 -0
  321. /package/{knowledge_base → src}/__pycache__/prompts.cpython-37.pyc +0 -0
  322. /package/{knowledge_base → src}/__pycache__/reranker.cpython-314.pyc +0 -0
  323. /package/{knowledge_base → src}/__pycache__/reranker.cpython-37.pyc +0 -0
  324. /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-314.pyc +0 -0
  325. /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
  326. /package/{knowledge_base → src}/__pycache__/retriever.cpython-314.pyc +0 -0
  327. /package/{knowledge_base → src}/__pycache__/retriever.cpython-37.pyc +0 -0
  328. /package/{knowledge_base → src}/__pycache__/server.cpython-37.pyc +0 -0
  329. /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-314.pyc +0 -0
  330. /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-37.pyc +0 -0
  331. /package/{knowledge_base → src}/__pycache__/test_generator.cpython-314.pyc +0 -0
  332. /package/{knowledge_base → src}/__pycache__/test_generator.cpython-37.pyc +0 -0
  333. /package/{knowledge_base → src}/agents/__init__.py +0 -0
  334. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-313.pyc +0 -0
  335. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  336. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-37.pyc +0 -0
  337. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-38.pyc +0 -0
  338. /package/{knowledge_base → src}/agents/__pycache__/automation_design_agent.cpython-314.pyc +0 -0
  339. /package/{knowledge_base → src}/agents/__pycache__/confidence_agent.cpython-314.pyc +0 -0
  340. /package/{knowledge_base → src}/agents/__pycache__/execution_validation_agent.cpython-314.pyc +0 -0
  341. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-314.pyc +0 -0
  342. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-37.pyc +0 -0
  343. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-38.pyc +0 -0
  344. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-314.pyc +0 -0
  345. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-37.pyc +0 -0
  346. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-38.pyc +0 -0
  347. /package/{knowledge_base → src}/agents/__pycache__/healing_agent.cpython-37.pyc +0 -0
  348. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-314.pyc +0 -0
  349. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-37.pyc +0 -0
  350. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-38.pyc +0 -0
  351. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-314.pyc +0 -0
  352. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-37.pyc +0 -0
  353. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-38.pyc +0 -0
  354. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-314.pyc +0 -0
  355. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-37.pyc +0 -0
  356. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-38.pyc +0 -0
  357. /package/{knowledge_base → src}/agents/__pycache__/rca_agent.cpython-37.pyc +0 -0
  358. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-314.pyc +0 -0
  359. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-37.pyc +0 -0
  360. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-38.pyc +0 -0
  361. /package/{knowledge_base → src}/agents/__pycache__/regression_agent.cpython-37.pyc +0 -0
  362. /package/{knowledge_base → src}/agents/__pycache__/requirement_agent.cpython-314.pyc +0 -0
  363. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-314.pyc +0 -0
  364. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-37.pyc +0 -0
  365. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-38.pyc +0 -0
  366. /package/{knowledge_base → src}/agents/__pycache__/scenario_agent.cpython-314.pyc +0 -0
  367. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-314.pyc +0 -0
  368. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-37.pyc +0 -0
  369. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-38.pyc +0 -0
  370. /package/{knowledge_base → src}/agents/__pycache__/script_generator_agent.cpython-314.pyc +0 -0
  371. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-314.pyc +0 -0
  372. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-37.pyc +0 -0
  373. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-38.pyc +0 -0
  374. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-314.pyc +0 -0
  375. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-37.pyc +0 -0
  376. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-38.pyc +0 -0
  377. /package/{knowledge_base → src}/agents/__pycache__/testcase_agent.cpython-314.pyc +0 -0
  378. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-314.pyc +0 -0
  379. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-37.pyc +0 -0
  380. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-38.pyc +0 -0
  381. /package/{knowledge_base → src}/agents/__pycache__/workflow_engine.cpython-314.pyc +0 -0
  382. /package/{knowledge_base → src}/agents/state.py +0 -0
  383. /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-37.pyc +0 -0
  384. /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-38.pyc +0 -0
  385. /package/{knowledge_base → src}/alembic/versions/.gitkeep +0 -0
  386. /package/{knowledge_base → src}/alembic/versions/001_phase0_feedback.py +0 -0
  387. /package/{knowledge_base → src}/alembic/versions/002_feedback_promotions.py +0 -0
  388. /package/{knowledge_base → src}/alembic/versions/003_enterprise_hardening.py +0 -0
  389. /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-37.pyc +0 -0
  390. /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-38.pyc +0 -0
  391. /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-37.pyc +0 -0
  392. /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-38.pyc +0 -0
  393. /package/{knowledge_base → src}/api/__init__.py +0 -0
  394. /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-37.pyc +0 -0
  395. /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-38.pyc +0 -0
  396. /package/{knowledge_base → src}/api/__pycache__/middleware.cpython-38.pyc +0 -0
  397. /package/{knowledge_base → src}/api/__pycache__/server.cpython-37.pyc +0 -0
  398. /package/{knowledge_base → src}/api/__pycache__/server.cpython-38.pyc +0 -0
  399. /package/{knowledge_base → src}/chunking/__init__.py +0 -0
  400. /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-37.pyc +0 -0
  401. /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-38.pyc +0 -0
  402. /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-37.pyc +0 -0
  403. /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-38.pyc +0 -0
  404. /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-37.pyc +0 -0
  405. /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-38.pyc +0 -0
  406. /package/{knowledge_base → src}/chunking/validators.py +0 -0
  407. /package/{knowledge_base → src}/cli/__init__.py +0 -0
  408. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  409. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-314.pyc +0 -0
  410. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-37.pyc +0 -0
  411. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-38.pyc +0 -0
  412. /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-37.pyc +0 -0
  413. /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-38.pyc +0 -0
  414. /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-37.pyc +0 -0
  415. /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-38.pyc +0 -0
  416. /package/{knowledge_base → src}/cli/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
  417. /package/{knowledge_base → src}/cli/__pycache__/workflow_cli.cpython-314.pyc +0 -0
  418. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-314.pyc +0 -0
  419. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-37.pyc +0 -0
  420. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-38.pyc +0 -0
  421. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-314.pyc +0 -0
  422. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-37.pyc +0 -0
  423. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-38.pyc +0 -0
  424. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-314.pyc +0 -0
  425. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-37.pyc +0 -0
  426. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-38.pyc +0 -0
  427. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-313.pyc +0 -0
  428. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-314.pyc +0 -0
  429. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-37.pyc +0 -0
  430. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-38.pyc +0 -0
  431. /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-37.pyc +0 -0
  432. /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-38.pyc +0 -0
  433. /package/{knowledge_base → src}/connectors/__pycache__/community_connector.cpython-38.pyc +0 -0
  434. /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-37.pyc +0 -0
  435. /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-38.pyc +0 -0
  436. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-314.pyc +0 -0
  437. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-37.pyc +0 -0
  438. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-38.pyc +0 -0
  439. /package/{knowledge_base → src}/connectors/__pycache__/kb_igel_connector.cpython-38.pyc +0 -0
  440. /package/{knowledge_base → src}/connectors/__pycache__/playwright_fetcher.cpython-38.pyc +0 -0
  441. /package/{knowledge_base → src}/connectors/__pycache__/query_bridge.cpython-314.pyc +0 -0
  442. /package/{knowledge_base → src}/connectors/__pycache__/query_bridge.cpython-38.pyc +0 -0
  443. /package/{knowledge_base → src}/connectors/__pycache__/search_backends.cpython-38.pyc +0 -0
  444. /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-37.pyc +0 -0
  445. /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-38.pyc +0 -0
  446. /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-37.pyc +0 -0
  447. /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-38.pyc +0 -0
  448. /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-37.pyc +0 -0
  449. /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-38.pyc +0 -0
  450. /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-37.pyc +0 -0
  451. /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-38.pyc +0 -0
  452. /package/{knowledge_base → src}/connectors/__pycache__/web_fetcher.cpython-38.pyc +0 -0
  453. /package/{knowledge_base → src}/connectors/base.py +0 -0
  454. /package/{knowledge_base → src}/connectors/playwright_fetcher.py +0 -0
  455. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-314.pyc +0 -0
  456. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-37.pyc +0 -0
  457. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-38.pyc +0 -0
  458. /package/{knowledge_base → src}/core/__pycache__/cache.cpython-38.pyc +0 -0
  459. /package/{knowledge_base → src}/core/__pycache__/circuit_breaker.cpython-314.pyc +0 -0
  460. /package/{knowledge_base → src}/core/__pycache__/circuit_breaker.cpython-38.pyc +0 -0
  461. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-314.pyc +0 -0
  462. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-37.pyc +0 -0
  463. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-38.pyc +0 -0
  464. /package/{knowledge_base → src}/core/__pycache__/logging_setup.cpython-38.pyc +0 -0
  465. /package/{knowledge_base → src}/core/__pycache__/metrics.cpython-38.pyc +0 -0
  466. /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-37.pyc +0 -0
  467. /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-38.pyc +0 -0
  468. /package/{knowledge_base → src}/core/__pycache__/request_context.cpython-38.pyc +0 -0
  469. /package/{knowledge_base → src}/core/circuit_breaker.py +0 -0
  470. /package/{knowledge_base → src}/core/metrics.py +0 -0
  471. /package/{knowledge_base → src}/core/precedence.py +0 -0
  472. /package/{knowledge_base → src}/core/request_context.py +0 -0
  473. /package/{knowledge_base → src}/db/__init__.py +0 -0
  474. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-313.pyc +0 -0
  475. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-314.pyc +0 -0
  476. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-37.pyc +0 -0
  477. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-38.pyc +0 -0
  478. /package/{knowledge_base → src}/db/__pycache__/client.cpython-314.pyc +0 -0
  479. /package/{knowledge_base → src}/db/__pycache__/client.cpython-37.pyc +0 -0
  480. /package/{knowledge_base → src}/db/__pycache__/client.cpython-38.pyc +0 -0
  481. /package/{knowledge_base → src}/db/__pycache__/connector_sync.cpython-38.pyc +0 -0
  482. /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-37.pyc +0 -0
  483. /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-38.pyc +0 -0
  484. /package/{knowledge_base → src}/db/__pycache__/igel_schema.cpython-314.pyc +0 -0
  485. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-314.pyc +0 -0
  486. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-37.pyc +0 -0
  487. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-38.pyc +0 -0
  488. /package/{knowledge_base → src}/db/__pycache__/schema.cpython-37.pyc +0 -0
  489. /package/{knowledge_base → src}/db/__pycache__/schema.cpython-38.pyc +0 -0
  490. /package/{knowledge_base → src}/embeddings/__init__.py +0 -0
  491. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-313.pyc +0 -0
  492. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-314.pyc +0 -0
  493. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-37.pyc +0 -0
  494. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-38.pyc +0 -0
  495. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-314.pyc +0 -0
  496. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-37.pyc +0 -0
  497. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-38.pyc +0 -0
  498. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-314.pyc +0 -0
  499. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-37.pyc +0 -0
  500. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-38.pyc +0 -0
  501. /package/{knowledge_base → src}/eval/__pycache__/__main__.cpython-37.pyc +0 -0
  502. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-314.pyc +0 -0
  503. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-37.pyc +0 -0
  504. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-38.pyc +0 -0
  505. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-314.pyc +0 -0
  506. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-37.pyc +0 -0
  507. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-38.pyc +0 -0
  508. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-314.pyc +0 -0
  509. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-37.pyc +0 -0
  510. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-38.pyc +0 -0
  511. /package/{knowledge_base → src}/eval/baseline.py +0 -0
  512. /package/{knowledge_base → src}/eval/queries_50.json +0 -0
  513. /package/{knowledge_base → src}/eval/scorers.py +0 -0
  514. /package/{knowledge_base → src}/exemplars/README.md +0 -0
  515. /package/{knowledge_base → src}/exemplars/__pycache__/pytest_reference_snippet.cpython-37.pyc +0 -0
  516. /package/{knowledge_base → src}/exemplars/gold_manual_concise_snippet.md +0 -0
  517. /package/{knowledge_base → src}/exemplars/gold_manual_detailed_snippet.md +0 -0
  518. /package/{knowledge_base → src}/exemplars/pytest_reference_snippet.py +0 -0
  519. /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-37.pyc +0 -0
  520. /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-38.pyc +0 -0
  521. /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-37.pyc +0 -0
  522. /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-38.pyc +0 -0
  523. /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-37.pyc +0 -0
  524. /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-38.pyc +0 -0
  525. /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-37.pyc +0 -0
  526. /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-38.pyc +0 -0
  527. /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-37.pyc +0 -0
  528. /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-38.pyc +0 -0
  529. /package/{knowledge_base → src}/generation/__init__.py +0 -0
  530. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-314.pyc +0 -0
  531. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-37.pyc +0 -0
  532. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-38.pyc +0 -0
  533. /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-37.pyc +0 -0
  534. /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-38.pyc +0 -0
  535. /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
  536. /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-38.pyc +0 -0
  537. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-314.pyc +0 -0
  538. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-37.pyc +0 -0
  539. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-38.pyc +0 -0
  540. /package/{knowledge_base → src}/generation/__pycache__/tc_transformer.cpython-37.pyc +0 -0
  541. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-314.pyc +0 -0
  542. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-37.pyc +0 -0
  543. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-38.pyc +0 -0
  544. /package/{knowledge_base → src}/generation/manual_tc_parser.py +0 -0
  545. /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-37.pyc +0 -0
  546. /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-38.pyc +0 -0
  547. /package/{knowledge_base → src}/graph_db/__pycache__/graphiti_client.cpython-37.pyc +0 -0
  548. /package/{knowledge_base → src}/graph_db/__pycache__/kg_traversal.cpython-37.pyc +0 -0
  549. /package/{knowledge_base → src}/graph_db/__pycache__/migrate_kg.cpython-37.pyc +0 -0
  550. /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-37.pyc +0 -0
  551. /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-38.pyc +0 -0
  552. /package/{knowledge_base → src}/graph_db/__pycache__/schema.cpython-37.pyc +0 -0
  553. /package/{knowledge_base → src}/graph_db/__pycache__/temporal_ingest.cpython-37.pyc +0 -0
  554. /package/{knowledge_base → src}/graph_db/schema.py +0 -0
  555. /package/{knowledge_base → src}/ingestion/__init__.py +0 -0
  556. /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-37.pyc +0 -0
  557. /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-38.pyc +0 -0
  558. /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-37.pyc +0 -0
  559. /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-38.pyc +0 -0
  560. /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-37.pyc +0 -0
  561. /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-38.pyc +0 -0
  562. /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-37.pyc +0 -0
  563. /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-38.pyc +0 -0
  564. /package/{knowledge_base → src}/ingestion/__pycache__/web_ingest.cpython-38.pyc +0 -0
  565. /package/{knowledge_base → src}/intelligence/__init__.py +0 -0
  566. /package/{knowledge_base → src}/intelligence/__pycache__/__init__.cpython-37.pyc +0 -0
  567. /package/{knowledge_base → src}/intelligence/__pycache__/execution_ingest.cpython-37.pyc +0 -0
  568. /package/{knowledge_base → src}/intelligence/__pycache__/predictive_engine.cpython-37.pyc +0 -0
  569. /package/{knowledge_base → src}/intelligence/__pycache__/risk_scorer.cpython-37.pyc +0 -0
  570. /package/{knowledge_base → src}/intelligence/predictive_engine.py +0 -0
  571. /package/{knowledge_base → src}/intelligence/risk_scorer.py +0 -0
  572. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  573. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-37.pyc +0 -0
  574. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-38.pyc +0 -0
  575. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-314.pyc +0 -0
  576. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-37.pyc +0 -0
  577. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-38.pyc +0 -0
  578. /package/{knowledge_base → src}/memory/__pycache__/ingest_memory.cpython-37.pyc +0 -0
  579. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-314.pyc +0 -0
  580. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-37.pyc +0 -0
  581. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-38.pyc +0 -0
  582. /package/{knowledge_base → src}/memory/memory_types.py +0 -0
  583. /package/{knowledge_base → src}/models/__pycache__/test_requirement.cpython-314.pyc +0 -0
  584. /package/{knowledge_base → src}/parsers/__init__.py +0 -0
  585. /package/{knowledge_base → src}/parsers/__pycache__/__init__.cpython-37.pyc +0 -0
  586. /package/{knowledge_base → src}/parsers/__pycache__/__init__.cpython-38.pyc +0 -0
  587. /package/{knowledge_base → src}/parsers/__pycache__/csv_parser.cpython-37.pyc +0 -0
  588. /package/{knowledge_base → src}/parsers/__pycache__/csv_parser.cpython-38.pyc +0 -0
  589. /package/{knowledge_base → src}/parsers/__pycache__/doc_parser.cpython-37.pyc +0 -0
  590. /package/{knowledge_base → src}/parsers/__pycache__/doc_parser.cpython-38.pyc +0 -0
  591. /package/{knowledge_base → src}/parsers/__pycache__/html_parser.cpython-38.pyc +0 -0
  592. /package/{knowledge_base → src}/parsers/__pycache__/image_extractor.cpython-37.pyc +0 -0
  593. /package/{knowledge_base → src}/parsers/__pycache__/image_extractor.cpython-38.pyc +0 -0
  594. /package/{knowledge_base → src}/parsers/__pycache__/markdown_parser.cpython-37.pyc +0 -0
  595. /package/{knowledge_base → src}/parsers/__pycache__/markdown_parser.cpython-38.pyc +0 -0
  596. /package/{knowledge_base → src}/parsers/__pycache__/pdf_parser.cpython-37.pyc +0 -0
  597. /package/{knowledge_base → src}/parsers/__pycache__/pdf_parser.cpython-38.pyc +0 -0
  598. /package/{knowledge_base → src}/parsers/image_extractor.py +0 -0
  599. /package/{knowledge_base → src}/parsers/markdown_parser.py +0 -0
  600. /package/{knowledge_base/vision → src/project}/__init__.py +0 -0
  601. /package/{knowledge_base → src}/retrieval/__init__.py +0 -0
  602. /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-314.pyc +0 -0
  603. /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-37.pyc +0 -0
  604. /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-38.pyc +0 -0
  605. /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-37.pyc +0 -0
  606. /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-38.pyc +0 -0
  607. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
  608. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
  609. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-38.pyc +0 -0
  610. /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-37.pyc +0 -0
  611. /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-38.pyc +0 -0
  612. /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
  613. /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-38.pyc +0 -0
  614. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-314.pyc +0 -0
  615. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-37.pyc +0 -0
  616. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-38.pyc +0 -0
  617. /package/{knowledge_base → src}/retrieval/__pycache__/unified_query.cpython-314.pyc +0 -0
  618. /package/{knowledge_base → src}/retrieval/__pycache__/unified_query.cpython-38.pyc +0 -0
  619. /package/{knowledge_base → src}/retrieval/__pycache__/web_retriever.cpython-38.pyc +0 -0
  620. /package/{knowledge_base → src}/retrieval/retrieval_debug.py +0 -0
  621. /package/{knowledge_base → src}/validators/__init__.py +0 -0
  622. /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  623. /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-37.pyc +0 -0
  624. /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-314.pyc +0 -0
  625. /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-37.pyc +0 -0
  626. /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-37.pyc +0 -0
  627. /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-38.pyc +0 -0
  628. /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-37.pyc +0 -0
  629. /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-38.pyc +0 -0
@@ -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 knowledge_base.core.confidence import score_generation
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 knowledge_base.eval.scorers import (
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
@@ -7,7 +7,7 @@ import logging
7
7
  import sys
8
8
  from datetime import datetime, timezone
9
9
 
10
- from knowledge_base.core.request_context import get_request_id
10
+ from src.core.request_context import get_request_id
11
11
 
12
12
 
13
13
  class JsonFormatter(logging.Formatter):