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
@@ -1,5 +1,5 @@
1
1
  """Application configuration."""
2
2
 
3
- from knowledge_base.config.settings import Config, cfg
3
+ from src.config.settings import Config, cfg
4
4
 
5
5
  __all__ = ["Config", "cfg"]
@@ -0,0 +1,85 @@
1
+ """Loads policy_rules.yaml at startup. Singleton via get_policy()."""
2
+ from __future__ import annotations
3
+ import yaml
4
+ from dataclasses import dataclass, field
5
+ from pathlib import Path
6
+
7
+ _CONFIG_PATH = Path(__file__).parent / "policy_rules.yaml"
8
+
9
+ @dataclass(frozen=True)
10
+ class ConfidenceDimensions:
11
+ requirement_clarity: float = 0.25
12
+ evidence_quality: float = 0.20
13
+ business_rule_coverage: float = 0.15
14
+ traceability_coverage: float = 0.15
15
+ scenario_coverage: float = 0.15
16
+ structural_quality: float = 0.10
17
+
18
+ @dataclass(frozen=True)
19
+ class ConfidenceBands:
20
+ auto_approved: float = 0.80
21
+ qa_review: float = 0.60
22
+ sme_required: float = 0.40
23
+
24
+ @dataclass(frozen=True)
25
+ class PolicyConfig:
26
+ version: str = "1.0.0"
27
+ igel_os_version: str = "OS12"
28
+ max_prompt_chars: int = 30000
29
+ blocked_patterns: tuple[str, ...] = ()
30
+ confidence_dimensions: ConfidenceDimensions = field(default_factory=ConfidenceDimensions)
31
+ confidence_bands: ConfidenceBands = field(default_factory=ConfidenceBands)
32
+ top_k_chunks: int = 10
33
+ max_context_tokens: int = 8000
34
+ test_case_folder: str = "innominds/testcases"
35
+ automation_folder: str = "tests"
36
+
37
+ _policy: PolicyConfig | None = None
38
+
39
+ def get_policy() -> PolicyConfig:
40
+ global _policy
41
+ if _policy is None:
42
+ _policy = _load_policy()
43
+ return _policy
44
+
45
+ def _load_policy() -> PolicyConfig:
46
+ if not _CONFIG_PATH.exists():
47
+ return PolicyConfig()
48
+
49
+ with open(_CONFIG_PATH) as f:
50
+ raw = yaml.safe_load(f)
51
+
52
+ prompt_cfg = raw.get("prompt_policy", {})
53
+ conf_cfg = raw.get("confidence", {})
54
+ conf_dims = conf_cfg.get("dimensions", {})
55
+ conf_bands = conf_cfg.get("bands", {})
56
+ ctx_cfg = raw.get("context_engine", {})
57
+ folder_cfg = raw.get("folder_standards", {})
58
+
59
+ dims = ConfidenceDimensions(
60
+ requirement_clarity=conf_dims.get("requirement_clarity", 0.25),
61
+ evidence_quality=conf_dims.get("evidence_quality", 0.20),
62
+ business_rule_coverage=conf_dims.get("business_rule_coverage", 0.15),
63
+ traceability_coverage=conf_dims.get("traceability_coverage", 0.15),
64
+ scenario_coverage=conf_dims.get("scenario_coverage", 0.15),
65
+ structural_quality=conf_dims.get("structural_quality", 0.10)
66
+ )
67
+
68
+ bands = ConfidenceBands(
69
+ auto_approved=conf_bands.get("auto_approved", 0.80),
70
+ qa_review=conf_bands.get("qa_review", 0.60),
71
+ sme_required=conf_bands.get("sme_required", 0.40)
72
+ )
73
+
74
+ return PolicyConfig(
75
+ version=raw.get("version", "1.0.0"),
76
+ igel_os_version=raw.get("platform", {}).get("igel_os_version", "OS12"),
77
+ max_prompt_chars=prompt_cfg.get("max_prompt_chars", 30000),
78
+ blocked_patterns=tuple(prompt_cfg.get("blocked_patterns", [])),
79
+ confidence_dimensions=dims,
80
+ confidence_bands=bands,
81
+ top_k_chunks=ctx_cfg.get("top_k_chunks", 10),
82
+ max_context_tokens=ctx_cfg.get("max_context_tokens", 8000),
83
+ test_case_folder=folder_cfg.get("test_cases", "innominds/testcases"),
84
+ automation_folder=folder_cfg.get("automation_scripts", "tests")
85
+ )
@@ -0,0 +1,50 @@
1
+ version: "1.0.0"
2
+ platform:
3
+ igel_os_version: "OS12" # OS12 only. Never reference OS11.
4
+
5
+ prompt_policy:
6
+ max_prompt_chars: 30000
7
+ blocked_patterns:
8
+ - "ignore all previous instructions"
9
+ - "reveal system prompt"
10
+ - "BEGIN PRIVATE KEY"
11
+
12
+ confidence:
13
+ dimensions:
14
+ requirement_clarity: 0.25
15
+ evidence_quality: 0.20
16
+ business_rule_coverage: 0.15
17
+ traceability_coverage: 0.15
18
+ scenario_coverage: 0.15
19
+ structural_quality: 0.10
20
+ bands:
21
+ auto_approved: 0.80 # >= 80% → auto-approved, ready for QA review
22
+ qa_review: 0.60 # 60–79% → QA review recommended
23
+ sme_required: 0.40 # 40–59% → SME review required
24
+ # < 40% → rejected, not persisted
25
+
26
+ approval:
27
+ existing_code_requires_user_approval: true
28
+
29
+ context_engine:
30
+ top_k_chunks: 10
31
+ max_context_tokens: 8000
32
+ source_priority:
33
+ - jira
34
+ - xray
35
+ - confluence
36
+ - postgres_kb
37
+ - igel_os12_docs
38
+ - igel_community_docs
39
+
40
+ folder_standards:
41
+ test_cases: "innominds/testcases"
42
+ automation_scripts: "tests"
43
+
44
+ security:
45
+ never_expose:
46
+ - api_keys
47
+ - tokens
48
+ - passwords
49
+ - credentials
50
+ - internal_secrets
@@ -3,11 +3,6 @@ from __future__ import annotations
3
3
  import os
4
4
  from pathlib import Path
5
5
 
6
- from dotenv import load_dotenv
7
-
8
- _ENV_PATH = Path(__file__).parent / ".env"
9
- load_dotenv(_ENV_PATH)
10
-
11
6
 
12
7
  def _truthy(raw: str | None, default: bool = False) -> bool:
13
8
  if raw is None or raw == "":
@@ -226,10 +221,54 @@ class Config:
226
221
  CONFLUENCE_USERNAME: str = os.getenv("CONFLUENCE_USERNAME", "")
227
222
  CONFLUENCE_API_TOKEN: str = os.getenv("CONFLUENCE_API_TOKEN", "")
228
223
 
224
+ # Jira OAuth2 client credentials (Atlassian OAuth 2.0 app)
225
+ JIRA_CLIENT_ID: str = os.getenv("JIRA_CLIENT_ID", "")
226
+ JIRA_CLIENT_SECRET: str = os.getenv("JIRA_CLIENT_SECRET", "")
227
+ JIRA_OAUTH_TOKEN_URL: str = os.getenv("JIRA_OAUTH_TOKEN_URL", "https://auth.atlassian.com/oauth/token")
228
+
229
+ # Confluence OAuth2 client credentials
230
+ CONFLUENCE_OAUTH_TOKEN: str = os.getenv("CONFLUENCE_OAUTH_TOKEN", "")
231
+ CONFLUENCE_CLIENT_ID: str = os.getenv("CONFLUENCE_CLIENT_ID", "")
232
+ CONFLUENCE_CLIENT_SECRET: str = os.getenv("CONFLUENCE_CLIENT_SECRET", "")
233
+
234
+ # Bitbucket
229
235
  BITBUCKET_ENABLED: bool = _truthy(os.getenv("BITBUCKET_ENABLED"), False)
236
+ BITBUCKET_URL: str = os.getenv("BITBUCKET_URL", "https://bitbucket.org")
237
+ BITBUCKET_WORKSPACE: str = os.getenv("BITBUCKET_WORKSPACE", "")
238
+ BITBUCKET_REPO_SLUG: str = os.getenv("BITBUCKET_REPO_SLUG", "")
239
+ BITBUCKET_USERNAME: str = os.getenv("BITBUCKET_USERNAME", "")
240
+ BITBUCKET_APP_PASSWORD: str = os.getenv("BITBUCKET_APP_PASSWORD", "")
241
+ BITBUCKET_ACCESS_TOKEN: str = os.getenv("BITBUCKET_ACCESS_TOKEN", "")
242
+ BITBUCKET_CLIENT_ID: str = os.getenv("BITBUCKET_CLIENT_ID", "")
243
+ BITBUCKET_CLIENT_SECRET: str = os.getenv("BITBUCKET_CLIENT_SECRET", "")
244
+ BITBUCKET_WEBHOOK_SECRET: str = os.getenv("BITBUCKET_WEBHOOK_SECRET", "")
245
+ BITBUCKET_REPO_PATH: str = os.getenv("BITBUCKET_REPO_PATH", ".")
246
+
247
+ # Xray (Cloud: client_id/secret; Server/DC: api_token)
248
+ XRAY_ENABLED: bool = _truthy(os.getenv("XRAY_ENABLED"), False)
249
+ XRAY_CLIENT_ID: str = os.getenv("XRAY_CLIENT_ID", "")
250
+ XRAY_CLIENT_SECRET: str = os.getenv("XRAY_CLIENT_SECRET", "")
251
+ XRAY_API_TOKEN: str = os.getenv("XRAY_API_TOKEN", "")
252
+ XRAY_CLOUD_AUTH_URL: str = os.getenv(
253
+ "XRAY_CLOUD_AUTH_URL", "https://xray.cloud.getxray.app/api/v2/authenticate"
254
+ )
255
+ XRAY_CLOUD_BASE_URL: str = os.getenv(
256
+ "XRAY_CLOUD_BASE_URL", "https://xray.cloud.getxray.app/api/v2"
257
+ )
258
+
230
259
  TEAMCITY_ENABLED: bool = _truthy(os.getenv("TEAMCITY_ENABLED"), False)
260
+ TEAMCITY_URL: str = os.getenv("TEAMCITY_URL", "")
261
+ TEAMCITY_TOKEN: str = os.getenv("TEAMCITY_TOKEN", "")
262
+
231
263
  TESTRAIL_ENABLED: bool = _truthy(os.getenv("TESTRAIL_ENABLED"), False)
264
+ TESTRAIL_URL: str = os.getenv("TESTRAIL_URL", "")
265
+ TESTRAIL_USERNAME: str = os.getenv("TESTRAIL_USERNAME", "")
266
+ TESTRAIL_API_KEY: str = os.getenv("TESTRAIL_API_KEY", "")
267
+
232
268
  SERVICENOW_ENABLED: bool = _truthy(os.getenv("SERVICENOW_ENABLED"), False)
269
+ SERVICENOW_URL: str = os.getenv("SERVICENOW_URL", "")
270
+ SERVICENOW_USERNAME: str = os.getenv("SERVICENOW_USERNAME", "")
271
+ SERVICENOW_PASSWORD: str = os.getenv("SERVICENOW_PASSWORD", "")
233
272
 
234
273
  # ── Operational memory (Phase 4) ─────────────────────────────────────────
235
274
  COGNEE_ENABLED: bool = _truthy(os.getenv("COGNEE_ENABLED"), True)
@@ -262,9 +301,15 @@ class Config:
262
301
  # ── Generation modes (Phase I) ───────────────────────────────────────────
263
302
  DEFAULT_GENERATION_MODE: str = os.getenv("DEFAULT_GENERATION_MODE", "pipeline")
264
303
 
304
+ # ── V2 Orchestrator and governance flags ─────────────────────────────────
305
+ V2_ORCHESTRATOR_ENABLED: bool = _truthy(os.getenv("V2_ORCHESTRATOR_ENABLED"), False)
306
+ V2_GOVERNANCE_ENFORCED: bool = _truthy(os.getenv("V2_GOVERNANCE_ENFORCED"), False)
307
+ V2_QUESTION_ENGINE_ENABLED: bool = _truthy(os.getenv("V2_QUESTION_ENGINE_ENABLED"), False)
308
+ V2_APPROVAL_MANAGER_ENABLED: bool = _truthy(os.getenv("V2_APPROVAL_MANAGER_ENABLED"), False)
309
+
265
310
  @property
266
311
  def api_key_map(self) -> dict[str, str]:
267
- from knowledge_base.core.request_context import parse_api_keys
312
+ from src.core.request_context import parse_api_keys
268
313
  keys = parse_api_keys(self.API_KEYS)
269
314
  if self.API_KEY and self.API_KEY not in keys:
270
315
  keys[self.API_KEY] = "admin"
@@ -1,5 +1,5 @@
1
1
  """Connector package — Phase 8 (stubbed, config-driven)."""
2
2
 
3
- from knowledge_base.connectors.base import BaseConnector
3
+ from src.connectors.base import BaseConnector
4
4
 
5
5
  __all__ = ["BaseConnector"]
@@ -0,0 +1,334 @@
1
+ """Bitbucket connector — full implementation with OAuth2 client credentials,
2
+ Basic Auth (App Password), and pull/push event webhook processing.
3
+
4
+ Supports:
5
+ - Bitbucket Cloud: OAuth2 consumer (BITBUCKET_CLIENT_ID + BITBUCKET_CLIENT_SECRET)
6
+ - Bitbucket Server/DC: App Password (BITBUCKET_USERNAME + BITBUCKET_APP_PASSWORD)
7
+ or Bearer token (BITBUCKET_ACCESS_TOKEN)
8
+ - Background pull sync: indexes changed file paths + LOC into DB on every push event
9
+ """
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import hmac
14
+ import logging
15
+ import time
16
+ from datetime import datetime
17
+ from pathlib import Path
18
+
19
+ import httpx
20
+
21
+ from src.config import cfg
22
+ from src.connectors.base import BaseConnector
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+ _BITBUCKET_CLOUD_TOKEN_URL = "https://bitbucket.org/site/oauth2/access_token"
27
+
28
+
29
+ class BitbucketConnector(BaseConnector):
30
+ """Full Bitbucket connector with webhook-driven pull sync → Asset Registry."""
31
+
32
+ name = "bitbucket"
33
+ enabled = cfg.BITBUCKET_ENABLED
34
+ supports_sync = True
35
+
36
+ def __init__(self) -> None:
37
+ super().__init__()
38
+ self._token: str | None = None
39
+ self._token_expiry: float = 0.0
40
+ self._use_oauth2 = bool(
41
+ getattr(cfg, "BITBUCKET_CLIENT_ID", "")
42
+ and getattr(cfg, "BITBUCKET_CLIENT_SECRET", "")
43
+ )
44
+ self._use_bearer = bool(getattr(cfg, "BITBUCKET_ACCESS_TOKEN", ""))
45
+ self._base_url = (getattr(cfg, "BITBUCKET_URL", "https://bitbucket.org") or "https://bitbucket.org").rstrip("/")
46
+ self._workspace = getattr(cfg, "BITBUCKET_WORKSPACE", "")
47
+
48
+ # ── Authentication ─────────────────────────────────────────────────
49
+
50
+ def _fetch_oauth2_token(self) -> str | None:
51
+ """Fetch access token via OAuth2 client credentials (Bitbucket Cloud)."""
52
+ client_id = getattr(cfg, "BITBUCKET_CLIENT_ID", "")
53
+ client_secret = getattr(cfg, "BITBUCKET_CLIENT_SECRET", "")
54
+ try:
55
+ with httpx.Client(timeout=15.0) as client:
56
+ resp = client.post(
57
+ _BITBUCKET_CLOUD_TOKEN_URL,
58
+ data={"grant_type": "client_credentials"},
59
+ auth=(client_id, client_secret),
60
+ )
61
+ resp.raise_for_status()
62
+ data = resp.json()
63
+ self._token = data["access_token"]
64
+ self._token_expiry = time.time() + int(data.get("expires_in", 7200)) - 60
65
+ logger.info("Bitbucket OAuth2 token obtained (expires in %ss)", data.get("expires_in"))
66
+ return self._token
67
+ except Exception as e:
68
+ logger.error("Bitbucket OAuth2 token fetch failed: %s", e)
69
+ return None
70
+
71
+ def _get_auth(self) -> dict:
72
+ """Return httpx kwargs for the current auth mode."""
73
+ if self._use_oauth2:
74
+ if not self._token or time.time() >= self._token_expiry:
75
+ self._fetch_oauth2_token()
76
+ if self._token:
77
+ return {"headers": {"Authorization": f"Bearer {self._token}"}}
78
+ if self._use_bearer:
79
+ return {"headers": {"Authorization": f"Bearer {getattr(cfg, 'BITBUCKET_ACCESS_TOKEN', '')}"}}
80
+ username = getattr(cfg, "BITBUCKET_USERNAME", "")
81
+ password = getattr(cfg, "BITBUCKET_APP_PASSWORD", "")
82
+ if username and password:
83
+ return {"auth": (username, password)}
84
+ return {}
85
+
86
+ def connect(self) -> bool:
87
+ if not self.enabled:
88
+ return False
89
+ if not self._use_oauth2 and not self._use_bearer:
90
+ if not (getattr(cfg, "BITBUCKET_USERNAME", "") and getattr(cfg, "BITBUCKET_APP_PASSWORD", "")):
91
+ logger.warning("Bitbucket: no credentials configured")
92
+ return False
93
+ return True
94
+
95
+ # ── Webhook Signature Validation ───────────────────────────────────
96
+
97
+ def validate_webhook_signature(self, body: bytes, signature_header: str) -> bool:
98
+ """Validate Bitbucket webhook HMAC-SHA256 signature.
99
+
100
+ Header format: "sha256=<hex_digest>"
101
+ Set BITBUCKET_WEBHOOK_SECRET in your environment.
102
+ """
103
+ secret = getattr(cfg, "BITBUCKET_WEBHOOK_SECRET", "")
104
+ if not secret:
105
+ logger.warning("BITBUCKET_WEBHOOK_SECRET not set; skipping signature validation")
106
+ return True
107
+ try:
108
+ expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
109
+ received = signature_header.replace("sha256=", "")
110
+ return hmac.compare_digest(expected, received)
111
+ except Exception as e:
112
+ logger.error("Webhook signature validation error: %s", e)
113
+ return False
114
+
115
+ # ── Pull / Push Event Processing (Background Sync) ─────────────────
116
+
117
+ def sync_pull_event(self, payload: dict) -> dict:
118
+ """Process a Bitbucket push/PR-merge webhook payload.
119
+
120
+ Background process triggered when users pull/push to Bitbucket:
121
+ 1. Extracts changed file paths from the push payload
122
+ 2. Stores file_path + LOC metadata in igel_bitbucket_file_locs
123
+ 3. Runs CodeIntelligenceAgent delta-sync on changed Python files
124
+ 4. Runs RegressionAgent impact analysis
125
+ 5. Returns a summary dict
126
+
127
+ Bitbucket Cloud push event payload shape:
128
+ { "repository": {"slug": "...", "workspace": {"slug": "..."}},
129
+ "push": {"changes": [{"commits": [{"hash": "...", "date": "...",
130
+ "author": {"raw": "..."}}]}]} }
131
+ """
132
+ if not self.enabled:
133
+ return {"status": "disabled", "files_indexed": 0}
134
+
135
+ repo_info = payload.get("repository") or {}
136
+ repo_slug = repo_info.get("slug", "")
137
+ workspace_info = repo_info.get("workspace", {})
138
+ workspace = (workspace_info.get("slug") if isinstance(workspace_info, dict) else workspace_info) or self._workspace
139
+
140
+ changed_files_info: list[dict] = []
141
+ changes = (payload.get("push") or {}).get("changes") or []
142
+ for change in changes:
143
+ for commit in (change.get("commits") or []):
144
+ commit_hash = commit.get("hash", "")
145
+ if not commit_hash:
146
+ continue
147
+ files = self._fetch_commit_diff_files(workspace, repo_slug, commit_hash)
148
+ for f in files:
149
+ f["commit"] = commit_hash
150
+ f["author"] = (commit.get("author") or {}).get("raw", "")
151
+ f["commit_date"] = commit.get("date", "")
152
+ changed_files_info.extend(files)
153
+
154
+ # Deduplicate by path (keep latest)
155
+ seen: dict[str, dict] = {}
156
+ for f in changed_files_info:
157
+ seen[f["file_path"]] = f
158
+ unique_files = list(seen.values())
159
+
160
+ # Persist file LOC data
161
+ self._store_file_locs(unique_files, repo_slug, workspace)
162
+
163
+ # Delta-sync automation assets (Python files only)
164
+ from src.agents.regression_agent import BitbucketSyncAgent, RegressionAgent
165
+ repo_path = Path(getattr(cfg, "BITBUCKET_REPO_PATH", "."))
166
+
167
+ files_indexed = 0
168
+ try:
169
+ sync_agent = BitbucketSyncAgent(repo_path)
170
+ local_changed = [repo_path / f["file_path"] for f in unique_files if (repo_path / f["file_path"]).exists()]
171
+ files_indexed = sync_agent.sync_changed_files(local_changed)
172
+ except Exception as e:
173
+ logger.error("BitbucketSyncAgent failed: %s", e)
174
+
175
+ # Impact analysis
176
+ impact: dict = {}
177
+ try:
178
+ changed_paths = [Path(f["file_path"]) for f in unique_files]
179
+ reg_agent = RegressionAgent()
180
+ impact = reg_agent.analyze_impact(changed_paths, repo_path)
181
+ except Exception as e:
182
+ logger.error("RegressionAgent failed: %s", e)
183
+
184
+ return {
185
+ "status": "complete",
186
+ "repo": f"{workspace}/{repo_slug}",
187
+ "files_changed": len(unique_files),
188
+ "files_indexed": files_indexed,
189
+ "affected_requirements": impact.get("affected_requirements", []),
190
+ "affected_scripts": impact.get("affected_scripts", []),
191
+ "affected_assets": impact.get("affected_assets", []),
192
+ }
193
+
194
+ def _fetch_commit_diff_files(self, workspace: str, repo_slug: str, commit_hash: str) -> list[dict]:
195
+ """Fetch file diffs for a commit via Bitbucket diffstat API."""
196
+ if not workspace or not repo_slug or not commit_hash:
197
+ return []
198
+ auth = self._get_auth()
199
+ results: list[dict] = []
200
+ try:
201
+ with httpx.Client(timeout=20.0, **auth) as client:
202
+ url = f"{self._base_url}/2.0/repositories/{workspace}/{repo_slug}/diffstat/{commit_hash}"
203
+ while url:
204
+ resp = client.get(url, params={"pagelen": 50})
205
+ resp.raise_for_status()
206
+ data = resp.json()
207
+ for item in data.get("values") or []:
208
+ status = item.get("status", "modified")
209
+ new_path = (item.get("new") or {}).get("path") or ""
210
+ old_path = (item.get("old") or {}).get("path") or ""
211
+ file_path = new_path or old_path
212
+ if file_path:
213
+ results.append({
214
+ "file_path": file_path,
215
+ "status": status,
216
+ "lines_added": item.get("lines_added", 0),
217
+ "lines_removed": item.get("lines_removed", 0),
218
+ })
219
+ url = data.get("next")
220
+ except Exception as e:
221
+ logger.warning("Failed to fetch diffstat for %s@%s: %s", repo_slug, commit_hash[:8], e)
222
+ return results
223
+
224
+ def _store_file_locs(self, files: list[dict], repo_slug: str, workspace: str) -> None:
225
+ """Persist file path + LOC data to igel_bitbucket_file_locs table."""
226
+ if not files:
227
+ return
228
+ try:
229
+ from src.db.client import get_conn
230
+ with get_conn() as conn:
231
+ with conn.cursor() as cur:
232
+ cur.execute("""
233
+ CREATE TABLE IF NOT EXISTS igel_bitbucket_file_locs (
234
+ id BIGSERIAL PRIMARY KEY,
235
+ workspace TEXT NOT NULL,
236
+ repo_slug TEXT NOT NULL,
237
+ file_path TEXT NOT NULL,
238
+ status TEXT,
239
+ lines_added INT DEFAULT 0,
240
+ lines_removed INT DEFAULT 0,
241
+ commit_hash TEXT,
242
+ author TEXT,
243
+ commit_date TIMESTAMPTZ,
244
+ recorded_at TIMESTAMPTZ DEFAULT NOW(),
245
+ UNIQUE (workspace, repo_slug, file_path, commit_hash)
246
+ )
247
+ """)
248
+ cur.execute("""
249
+ CREATE INDEX IF NOT EXISTS bb_file_locs_repo_idx
250
+ ON igel_bitbucket_file_locs(workspace, repo_slug)
251
+ """)
252
+ cur.execute("""
253
+ CREATE INDEX IF NOT EXISTS bb_file_locs_path_idx
254
+ ON igel_bitbucket_file_locs(file_path)
255
+ """)
256
+ for f in files:
257
+ commit_date = None
258
+ raw_date = f.get("commit_date")
259
+ if raw_date:
260
+ try:
261
+ from dateutil import parser as dateparser
262
+ commit_date = dateparser.parse(raw_date)
263
+ except Exception:
264
+ pass
265
+ cur.execute("""
266
+ INSERT INTO igel_bitbucket_file_locs
267
+ (workspace, repo_slug, file_path, status, lines_added,
268
+ lines_removed, commit_hash, author, commit_date)
269
+ VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
270
+ ON CONFLICT (workspace, repo_slug, file_path, commit_hash)
271
+ DO UPDATE SET
272
+ lines_added = EXCLUDED.lines_added,
273
+ lines_removed = EXCLUDED.lines_removed,
274
+ status = EXCLUDED.status,
275
+ recorded_at = NOW()
276
+ """, (
277
+ workspace, repo_slug,
278
+ f["file_path"], f.get("status", "modified"),
279
+ f.get("lines_added", 0), f.get("lines_removed", 0),
280
+ f.get("commit", ""), f.get("author", ""), commit_date,
281
+ ))
282
+ conn.commit()
283
+ logger.info("Stored LOC data for %d files in igel_bitbucket_file_locs", len(files))
284
+ except Exception as e:
285
+ logger.error("Failed to store file LOC data: %s", e)
286
+
287
+ # ── File LOC Retrieval ─────────────────────────────────────────────
288
+
289
+ def fetch_file_locs(self, repo_slug: str, commit: str, workspace: str = "") -> list[dict]:
290
+ """Fetch file LOC data for a specific commit via Bitbucket API."""
291
+ ws = workspace or self._workspace
292
+ return self._fetch_commit_diff_files(ws, repo_slug, commit)
293
+
294
+ def get_stored_file_locs(self, repo_slug: str, workspace: str = "", limit: int = 100) -> list[dict]:
295
+ """Query DB for recently recorded file LOC data."""
296
+ ws = workspace or self._workspace
297
+ try:
298
+ from src.db.client import get_conn
299
+ with get_conn() as conn:
300
+ with conn.cursor() as cur:
301
+ cur.execute("""
302
+ SELECT file_path, status, lines_added, lines_removed,
303
+ commit_hash, author, commit_date, recorded_at
304
+ FROM igel_bitbucket_file_locs
305
+ WHERE workspace = %s AND repo_slug = %s
306
+ ORDER BY recorded_at DESC
307
+ LIMIT %s
308
+ """, (ws, repo_slug, limit))
309
+ cols = ["file_path", "status", "lines_added", "lines_removed",
310
+ "commit_hash", "author", "commit_date", "recorded_at"]
311
+ return [dict(zip(cols, row)) for row in cur.fetchall()]
312
+ except Exception as e:
313
+ logger.error("Failed to query file LOC data: %s", e)
314
+ return []
315
+
316
+ # ── BaseConnector interface ────────────────────────────────────────
317
+
318
+ def sync(self, since: datetime | None = None) -> list[dict]:
319
+ """Returns recently stored file LOC records for configured repo."""
320
+ if not self.enabled or not self._workspace:
321
+ return []
322
+ repo_slug = getattr(cfg, "BITBUCKET_REPO_SLUG", "")
323
+ if not repo_slug:
324
+ return []
325
+ return self.get_stored_file_locs(repo_slug, self._workspace)
326
+
327
+ def ingest_to_kg(self, items: list[dict]) -> int:
328
+ return 0
329
+
330
+ def ingest_to_rag(self, items: list[dict]) -> int:
331
+ return 0
332
+
333
+ def search(self, query: str, limit: int = 5, timeout: float | None = None) -> list[str]:
334
+ return []
@@ -7,10 +7,10 @@ from datetime import datetime
7
7
  from typing import Any
8
8
  from urllib.parse import quote_plus
9
9
 
10
- from knowledge_base.config import cfg
11
- from knowledge_base.connectors.base import BaseConnector
12
- from knowledge_base.connectors.web_fetcher import fetch_url, search_confluence_site
13
- from knowledge_base.parsers.html_parser import parse_html_page
10
+ from src.config import cfg
11
+ from src.connectors.base import BaseConnector
12
+ from src.connectors.web_fetcher import fetch_url, search_confluence_site
13
+ from src.parsers.html_parser import parse_html_page
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
@@ -84,7 +84,7 @@ class CommunityConnector(BaseConnector):
84
84
  def ingest_to_kg(self, items: list[dict]) -> int:
85
85
  if not items:
86
86
  return 0
87
- from knowledge_base.db.client import get_conn
87
+ from src.db.client import get_conn
88
88
  import json
89
89
  count = 0
90
90
  with get_conn() as conn:
@@ -107,6 +107,6 @@ class CommunityConnector(BaseConnector):
107
107
  return count
108
108
 
109
109
  def ingest_to_rag(self, items: list[dict]) -> int:
110
- from knowledge_base.ingestion.web_ingest import ingest_web_items
110
+ from src.ingestion.web_ingest import ingest_web_items
111
111
 
112
112
  return ingest_web_items(items, source_label="community.igel.com")
@@ -8,8 +8,8 @@ from urllib.parse import unquote_plus
8
8
 
9
9
  import httpx
10
10
 
11
- from knowledge_base.config import cfg
12
- from knowledge_base.connectors.base import BaseConnector
11
+ from src.config import cfg
12
+ from src.connectors.base import BaseConnector
13
13
 
14
14
  logger = logging.getLogger(__name__)
15
15
 
@@ -140,7 +140,7 @@ class ConfluenceConnector(BaseConnector):
140
140
  def ingest_to_kg(self, items: list[dict]) -> int:
141
141
  if not items:
142
142
  return 0
143
- from knowledge_base.db.client import get_conn
143
+ from src.db.client import get_conn
144
144
  import json
145
145
  count = 0
146
146
  with get_conn() as conn:
@@ -161,5 +161,5 @@ class ConfluenceConnector(BaseConnector):
161
161
  return count
162
162
 
163
163
  def ingest_to_rag(self, items: list[dict]) -> int:
164
- from knowledge_base.ingestion.web_ingest import ingest_web_items
164
+ from src.ingestion.web_ingest import ingest_web_items
165
165
  return ingest_web_items(items, source_label="confluence")