empathy-framework 3.7.0__py3-none-any.whl → 3.7.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. coach_wizards/code_reviewer_README.md +60 -0
  2. coach_wizards/code_reviewer_wizard.py +180 -0
  3. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/METADATA +20 -2
  4. empathy_framework-3.7.1.dist-info/RECORD +327 -0
  5. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/top_level.txt +5 -1
  6. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  7. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  8. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  9. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  10. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  11. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  12. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  13. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  14. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  15. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  16. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  17. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  18. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  19. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  20. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  21. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  22. empathy_llm_toolkit/agent_factory/base.py +305 -0
  23. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  24. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  25. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  26. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  27. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  28. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  29. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  30. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  31. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  32. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  33. empathy_llm_toolkit/cli/__init__.py +8 -0
  34. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  35. empathy_llm_toolkit/code_health.py +150 -3
  36. empathy_llm_toolkit/config/__init__.py +29 -0
  37. empathy_llm_toolkit/config/unified.py +295 -0
  38. empathy_llm_toolkit/routing/__init__.py +32 -0
  39. empathy_llm_toolkit/routing/model_router.py +362 -0
  40. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  41. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  42. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  43. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  44. empathy_llm_toolkit/security/README.md +262 -0
  45. empathy_llm_toolkit/security/__init__.py +62 -0
  46. empathy_llm_toolkit/security/audit_logger.py +929 -0
  47. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  48. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  49. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  50. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  51. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  52. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  53. empathy_llm_toolkit/wizards/__init__.py +38 -0
  54. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  55. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  56. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  57. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  58. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  59. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  60. empathy_os/__init__.py +52 -52
  61. empathy_os/adaptive/__init__.py +13 -0
  62. empathy_os/adaptive/task_complexity.py +127 -0
  63. empathy_os/cli.py +118 -8
  64. empathy_os/cli_unified.py +121 -1
  65. empathy_os/config/__init__.py +63 -0
  66. empathy_os/config/xml_config.py +239 -0
  67. empathy_os/dashboard/__init__.py +15 -0
  68. empathy_os/dashboard/server.py +743 -0
  69. empathy_os/memory/__init__.py +195 -0
  70. empathy_os/memory/claude_memory.py +466 -0
  71. empathy_os/memory/config.py +224 -0
  72. empathy_os/memory/control_panel.py +1298 -0
  73. empathy_os/memory/edges.py +179 -0
  74. empathy_os/memory/graph.py +567 -0
  75. empathy_os/memory/long_term.py +1193 -0
  76. empathy_os/memory/nodes.py +179 -0
  77. empathy_os/memory/redis_bootstrap.py +540 -0
  78. empathy_os/memory/security/__init__.py +31 -0
  79. empathy_os/memory/security/audit_logger.py +930 -0
  80. empathy_os/memory/security/pii_scrubber.py +640 -0
  81. empathy_os/memory/security/secrets_detector.py +678 -0
  82. empathy_os/memory/short_term.py +2119 -0
  83. empathy_os/memory/storage/__init__.py +15 -0
  84. empathy_os/memory/summary_index.py +583 -0
  85. empathy_os/memory/unified.py +619 -0
  86. empathy_os/metrics/__init__.py +12 -0
  87. empathy_os/metrics/prompt_metrics.py +190 -0
  88. empathy_os/models/__init__.py +136 -0
  89. empathy_os/models/__main__.py +13 -0
  90. empathy_os/models/cli.py +655 -0
  91. empathy_os/models/empathy_executor.py +354 -0
  92. empathy_os/models/executor.py +252 -0
  93. empathy_os/models/fallback.py +671 -0
  94. empathy_os/models/provider_config.py +563 -0
  95. empathy_os/models/registry.py +382 -0
  96. empathy_os/models/tasks.py +302 -0
  97. empathy_os/models/telemetry.py +548 -0
  98. empathy_os/models/token_estimator.py +378 -0
  99. empathy_os/models/validation.py +274 -0
  100. empathy_os/monitoring/__init__.py +52 -0
  101. empathy_os/monitoring/alerts.py +23 -0
  102. empathy_os/monitoring/alerts_cli.py +268 -0
  103. empathy_os/monitoring/multi_backend.py +271 -0
  104. empathy_os/monitoring/otel_backend.py +363 -0
  105. empathy_os/optimization/__init__.py +19 -0
  106. empathy_os/optimization/context_optimizer.py +272 -0
  107. empathy_os/plugins/__init__.py +28 -0
  108. empathy_os/plugins/base.py +361 -0
  109. empathy_os/plugins/registry.py +268 -0
  110. empathy_os/project_index/__init__.py +30 -0
  111. empathy_os/project_index/cli.py +335 -0
  112. empathy_os/project_index/crew_integration.py +430 -0
  113. empathy_os/project_index/index.py +425 -0
  114. empathy_os/project_index/models.py +501 -0
  115. empathy_os/project_index/reports.py +473 -0
  116. empathy_os/project_index/scanner.py +538 -0
  117. empathy_os/prompts/__init__.py +61 -0
  118. empathy_os/prompts/config.py +77 -0
  119. empathy_os/prompts/context.py +177 -0
  120. empathy_os/prompts/parser.py +285 -0
  121. empathy_os/prompts/registry.py +313 -0
  122. empathy_os/prompts/templates.py +208 -0
  123. empathy_os/resilience/__init__.py +56 -0
  124. empathy_os/resilience/circuit_breaker.py +256 -0
  125. empathy_os/resilience/fallback.py +179 -0
  126. empathy_os/resilience/health.py +300 -0
  127. empathy_os/resilience/retry.py +209 -0
  128. empathy_os/resilience/timeout.py +135 -0
  129. empathy_os/routing/__init__.py +43 -0
  130. empathy_os/routing/chain_executor.py +433 -0
  131. empathy_os/routing/classifier.py +217 -0
  132. empathy_os/routing/smart_router.py +234 -0
  133. empathy_os/routing/wizard_registry.py +307 -0
  134. empathy_os/trust/__init__.py +28 -0
  135. empathy_os/trust/circuit_breaker.py +579 -0
  136. empathy_os/validation/__init__.py +19 -0
  137. empathy_os/validation/xml_validator.py +281 -0
  138. empathy_os/wizard_factory_cli.py +170 -0
  139. empathy_os/workflows/__init__.py +360 -0
  140. empathy_os/workflows/base.py +1530 -0
  141. empathy_os/workflows/bug_predict.py +962 -0
  142. empathy_os/workflows/code_review.py +960 -0
  143. empathy_os/workflows/code_review_adapters.py +310 -0
  144. empathy_os/workflows/code_review_pipeline.py +720 -0
  145. empathy_os/workflows/config.py +600 -0
  146. empathy_os/workflows/dependency_check.py +648 -0
  147. empathy_os/workflows/document_gen.py +1069 -0
  148. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  149. empathy_os/workflows/health_check.py +679 -0
  150. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  151. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  152. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  153. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  154. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  155. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  156. empathy_os/workflows/manage_documentation.py +804 -0
  157. empathy_os/workflows/new_sample_workflow1.py +146 -0
  158. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  159. empathy_os/workflows/perf_audit.py +687 -0
  160. empathy_os/workflows/pr_review.py +748 -0
  161. empathy_os/workflows/progress.py +445 -0
  162. empathy_os/workflows/progress_server.py +322 -0
  163. empathy_os/workflows/refactor_plan.py +691 -0
  164. empathy_os/workflows/release_prep.py +808 -0
  165. empathy_os/workflows/research_synthesis.py +404 -0
  166. empathy_os/workflows/secure_release.py +585 -0
  167. empathy_os/workflows/security_adapters.py +297 -0
  168. empathy_os/workflows/security_audit.py +1050 -0
  169. empathy_os/workflows/step_config.py +234 -0
  170. empathy_os/workflows/test5.py +125 -0
  171. empathy_os/workflows/test5_README.md +158 -0
  172. empathy_os/workflows/test_gen.py +1855 -0
  173. empathy_os/workflows/test_lifecycle.py +526 -0
  174. empathy_os/workflows/test_maintenance.py +626 -0
  175. empathy_os/workflows/test_maintenance_cli.py +590 -0
  176. empathy_os/workflows/test_maintenance_crew.py +821 -0
  177. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  178. empathy_software_plugin/cli/__init__.py +120 -0
  179. empathy_software_plugin/cli/inspect.py +362 -0
  180. empathy_software_plugin/cli.py +3 -1
  181. empathy_software_plugin/wizards/__init__.py +42 -0
  182. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  183. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  184. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  185. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  186. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  187. empathy_software_plugin/wizards/base_wizard.py +288 -0
  188. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  189. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  190. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  191. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  192. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  193. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  194. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  195. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  196. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  197. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  198. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  199. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  200. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  201. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  202. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  203. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  204. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  205. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  206. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  207. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  208. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  209. empathy_software_plugin/wizards/security/__init__.py +32 -0
  210. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  211. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  212. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  213. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  214. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  215. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  216. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  217. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  218. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  219. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  220. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  221. hot_reload/README.md +473 -0
  222. hot_reload/__init__.py +62 -0
  223. hot_reload/config.py +84 -0
  224. hot_reload/integration.py +228 -0
  225. hot_reload/reloader.py +298 -0
  226. hot_reload/watcher.py +179 -0
  227. hot_reload/websocket.py +176 -0
  228. scaffolding/README.md +589 -0
  229. scaffolding/__init__.py +35 -0
  230. scaffolding/__main__.py +14 -0
  231. scaffolding/cli.py +240 -0
  232. test_generator/__init__.py +38 -0
  233. test_generator/__main__.py +14 -0
  234. test_generator/cli.py +226 -0
  235. test_generator/generator.py +325 -0
  236. test_generator/risk_analyzer.py +216 -0
  237. workflow_patterns/__init__.py +33 -0
  238. workflow_patterns/behavior.py +249 -0
  239. workflow_patterns/core.py +76 -0
  240. workflow_patterns/output.py +99 -0
  241. workflow_patterns/registry.py +255 -0
  242. workflow_patterns/structural.py +288 -0
  243. workflow_scaffolding/__init__.py +11 -0
  244. workflow_scaffolding/__main__.py +12 -0
  245. workflow_scaffolding/cli.py +206 -0
  246. workflow_scaffolding/generator.py +265 -0
  247. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  248. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  249. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  250. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  251. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  252. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  253. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  254. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  255. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  256. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  257. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  258. agents/compliance_anticipation_agent.py +0 -1422
  259. agents/compliance_db.py +0 -339
  260. agents/epic_integration_wizard.py +0 -530
  261. agents/notifications.py +0 -291
  262. agents/trust_building_behaviors.py +0 -872
  263. empathy_framework-3.7.0.dist-info/RECORD +0 -105
  264. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/WHEEL +0 -0
  265. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/entry_points.txt +0 -0
  266. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/licenses/LICENSE +0 -0
  267. /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
@@ -0,0 +1,322 @@
1
+ """Security Analysis Wizard (Level 4)
2
+
3
+ Predicts which security vulnerabilities are actually exploitable.
4
+
5
+ Level 4: Anticipatory - identifies real security risks, not just theoretical ones.
6
+
7
+ Copyright 2025 Smart AI Memory, LLC
8
+ Licensed under Fair Source 0.9
9
+ """
10
+
11
+ import logging
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from .base_wizard import BaseWizard
16
+ from .security.exploit_analyzer import ExploitabilityAssessment, ExploitAnalyzer
17
+ from .security.owasp_patterns import OWASPPatternDetector
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class SecurityAnalysisWizard(BaseWizard):
23
+ """Security Analysis Wizard - Level 4
24
+
25
+ Beyond finding vulnerabilities:
26
+ - Predicts which are actually exploitable
27
+ - Assesses real-world attack likelihood
28
+ - Prioritizes by actual risk (not just CVSS)
29
+ - Experience-based recommendations
30
+ """
31
+
32
+ @property
33
+ def name(self) -> str:
34
+ return "Security Analysis Wizard"
35
+
36
+ @property
37
+ def level(self) -> int:
38
+ return 4
39
+
40
+ def __init__(self):
41
+ super().__init__()
42
+
43
+ self.pattern_detector = OWASPPatternDetector()
44
+ self.exploit_analyzer = ExploitAnalyzer()
45
+
46
+ async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
47
+ """Analyze code for security vulnerabilities.
48
+
49
+ Context expects:
50
+ - source_files: List of source file paths to scan
51
+ - project_path: Project root (optional)
52
+ - endpoint_config: Endpoint exposure info (optional)
53
+ - exclude_patterns: Patterns to exclude (optional)
54
+
55
+ Returns:
56
+ Analysis with vulnerabilities, exploitability, predictions
57
+
58
+ """
59
+ source_files = context.get("source_files", [])
60
+ project_path = context.get("project_path", ".")
61
+ endpoint_config = context.get("endpoint_config", {})
62
+ exclude_patterns = context.get("exclude_patterns", [])
63
+
64
+ if not source_files:
65
+ source_files = self._discover_source_files(project_path, exclude_patterns)
66
+
67
+ # Phase 1: Detect vulnerabilities
68
+ all_vulnerabilities = []
69
+
70
+ for source_file in source_files[:100]: # Limit for performance
71
+ try:
72
+ with open(source_file) as f:
73
+ code = f.read()
74
+
75
+ vulns = self.pattern_detector.detect_vulnerabilities(code, source_file)
76
+
77
+ all_vulnerabilities.extend(vulns)
78
+
79
+ except Exception as e:
80
+ logger.warning(f"Could not scan {source_file}: {e}")
81
+
82
+ # Phase 2: Assess exploitability (Level 4)
83
+ exploitability_assessments = []
84
+
85
+ for vuln in all_vulnerabilities:
86
+ # Get endpoint context if available
87
+ file_path = vuln.get("file_path", "")
88
+ endpoint_context = endpoint_config.get(file_path, {})
89
+
90
+ assessment = self.exploit_analyzer.assess_exploitability(vuln, endpoint_context)
91
+
92
+ exploitability_assessments.append(assessment)
93
+
94
+ # Sort by exploitability
95
+ exploitability_assessments.sort(
96
+ key=lambda a: (
97
+ {"CRITICAL": 0, "HIGH": 1, "MEDIUM": 2, "LOW": 3}.get(a.exploitability, 4),
98
+ -a.exploit_likelihood,
99
+ ),
100
+ )
101
+
102
+ # Phase 3: Generate insights
103
+ insights = self._generate_insights(all_vulnerabilities, exploitability_assessments)
104
+
105
+ # Phase 4: Predictions (Level 4)
106
+ predictions = self._generate_predictions(exploitability_assessments, insights)
107
+
108
+ # Phase 5: Recommendations
109
+ recommendations = self._generate_recommendations(exploitability_assessments, insights)
110
+
111
+ return {
112
+ "vulnerabilities_found": len(all_vulnerabilities),
113
+ "by_severity": self._group_by_severity(all_vulnerabilities),
114
+ "by_category": self._group_by_category(all_vulnerabilities),
115
+ "exploitability_assessments": [
116
+ {
117
+ "vulnerability": a.vulnerability,
118
+ "exploitability": a.exploitability,
119
+ "accessibility": a.accessibility,
120
+ "attack_complexity": a.attack_complexity,
121
+ "exploit_likelihood": a.exploit_likelihood,
122
+ "reasoning": a.reasoning,
123
+ "mitigation_urgency": a.mitigation_urgency,
124
+ }
125
+ for a in exploitability_assessments
126
+ ],
127
+ "insights": insights,
128
+ # Standard wizard outputs
129
+ "predictions": predictions,
130
+ "recommendations": recommendations,
131
+ "confidence": 0.85,
132
+ }
133
+
134
+ def _discover_source_files(self, project_path: str, exclude_patterns: list[str]) -> list[str]:
135
+ """Discover source files to scan"""
136
+ source_files = []
137
+ project = Path(project_path)
138
+
139
+ # Common source file extensions
140
+ extensions = ["*.py", "*.js", "*.ts", "*.jsx", "*.tsx", "*.java", "*.go", "*.rb"]
141
+
142
+ for ext in extensions:
143
+ for file in project.rglob(ext):
144
+ # Skip excluded patterns
145
+ if any(pattern in str(file) for pattern in exclude_patterns):
146
+ continue
147
+
148
+ # Skip test files and dependencies
149
+ if any(
150
+ p in str(file) for p in ["/test/", "/tests/", "node_modules", "venv", ".git"]
151
+ ):
152
+ continue
153
+
154
+ source_files.append(str(file))
155
+
156
+ return source_files[:200] # Limit for performance
157
+
158
+ def _group_by_severity(self, vulnerabilities: list[dict[str, Any]]) -> dict[str, int]:
159
+ """Group vulnerabilities by severity"""
160
+ by_severity = {"CRITICAL": 0, "HIGH": 0, "MEDIUM": 0, "LOW": 0}
161
+
162
+ for vuln in vulnerabilities:
163
+ severity = vuln.get("severity", "MEDIUM")
164
+ if severity in by_severity:
165
+ by_severity[severity] += 1
166
+
167
+ return by_severity
168
+
169
+ def _group_by_category(self, vulnerabilities: list[dict[str, Any]]) -> dict[str, int]:
170
+ """Group vulnerabilities by OWASP category"""
171
+ by_category = {}
172
+
173
+ for vuln in vulnerabilities:
174
+ category = vuln.get("category", "unknown")
175
+ by_category[category] = by_category.get(category, 0) + 1
176
+
177
+ return by_category
178
+
179
+ def _generate_insights(
180
+ self,
181
+ vulnerabilities: list[dict[str, Any]],
182
+ assessments: list[ExploitabilityAssessment],
183
+ ) -> dict[str, Any]:
184
+ """Generate security insights"""
185
+ # Most common vulnerability type
186
+ by_category = self._group_by_category(vulnerabilities)
187
+ most_common = max(by_category.items(), key=lambda x: x[1])[0] if by_category else "none"
188
+
189
+ # Percentage actually exploitable
190
+ critical_exploitable = sum(1 for a in assessments if a.exploitability == "CRITICAL")
191
+ high_exploitable = sum(1 for a in assessments if a.exploitability == "HIGH")
192
+
193
+ total = len(assessments)
194
+ exploitable_percent = (
195
+ ((critical_exploitable + high_exploitable) / total * 100) if total > 0 else 0
196
+ )
197
+
198
+ return {
199
+ "most_common_category": most_common,
200
+ "critical_exploitable": critical_exploitable,
201
+ "high_exploitable": high_exploitable,
202
+ "exploitable_percent": exploitable_percent,
203
+ "public_exposure": sum(1 for a in assessments if a.accessibility == "public"),
204
+ "immediate_action_required": sum(
205
+ 1 for a in assessments if "IMMEDIATE" in a.mitigation_urgency
206
+ ),
207
+ }
208
+
209
+ def _generate_predictions(
210
+ self,
211
+ assessments: list[ExploitabilityAssessment],
212
+ insights: dict[str, Any],
213
+ ) -> list[dict[str, Any]]:
214
+ """Generate Level 4 predictions"""
215
+ predictions = []
216
+
217
+ # Prediction 1: Imminent exploitation risk
218
+ immediate_risks = [a for a in assessments if "IMMEDIATE" in a.mitigation_urgency]
219
+ if immediate_risks:
220
+ predictions.append(
221
+ {
222
+ "type": "imminent_exploitation_risk",
223
+ "severity": "critical",
224
+ "description": (
225
+ f"{len(immediate_risks)} vulnerabilities have IMMEDIATE exploitation risk. "
226
+ f"In our experience, {immediate_risks[0].vulnerability['name']} "
227
+ f"is actively scanned by automated tools."
228
+ ),
229
+ "affected_files": [a.vulnerability["file_path"] for a in immediate_risks[:3]],
230
+ "prevention_steps": [
231
+ a.vulnerability.get("example_safe", "Fix vulnerability")
232
+ for a in immediate_risks[:3]
233
+ ],
234
+ },
235
+ )
236
+
237
+ # Prediction 2: Public exposure risk
238
+ public_critical = [
239
+ a
240
+ for a in assessments
241
+ if a.accessibility == "public" and a.exploitability in ["CRITICAL", "HIGH"]
242
+ ]
243
+ if public_critical:
244
+ predictions.append(
245
+ {
246
+ "type": "public_exposure_risk",
247
+ "severity": "high",
248
+ "description": (
249
+ f"{len(public_critical)} publicly accessible vulnerabilities detected. "
250
+ "In our experience, public endpoints are scanned within hours of deployment."
251
+ ),
252
+ "prevention_steps": [
253
+ "Add authentication to sensitive endpoints",
254
+ "Implement rate limiting",
255
+ "Add input validation",
256
+ ],
257
+ },
258
+ )
259
+
260
+ # Prediction 3: Attack pattern concentration
261
+ if insights["most_common_category"] in ["injection", "broken_authentication"]:
262
+ predictions.append(
263
+ {
264
+ "type": "attack_pattern_concentration",
265
+ "severity": "high",
266
+ "description": (
267
+ f"Multiple {insights['most_common_category']} vulnerabilities detected. "
268
+ "In our experience, clustered vulnerabilities indicate systematic issues."
269
+ ),
270
+ "prevention_steps": [
271
+ "Review coding standards",
272
+ "Add automated security scanning to CI/CD",
273
+ "Conduct security training",
274
+ ],
275
+ },
276
+ )
277
+
278
+ return predictions
279
+
280
+ def _generate_recommendations(
281
+ self,
282
+ assessments: list[ExploitabilityAssessment],
283
+ insights: dict[str, Any],
284
+ ) -> list[str]:
285
+ """Generate actionable recommendations"""
286
+ recommendations = []
287
+
288
+ # Immediate actions
289
+ if insights["immediate_action_required"] > 0:
290
+ recommendations.append(
291
+ f"🚨 CRITICAL: Fix {insights['immediate_action_required']} "
292
+ "vulnerabilities BEFORE next deployment",
293
+ )
294
+
295
+ # Category-specific recommendations
296
+ if insights["most_common_category"] == "injection":
297
+ recommendations.append("Use parameterized queries for ALL database operations")
298
+ recommendations.append("Add input validation library (e.g., validator.js, bleach)")
299
+
300
+ if insights["most_common_category"] == "cross_site_scripting":
301
+ recommendations.append("Use textContent instead of innerHTML")
302
+ recommendations.append("Implement Content Security Policy (CSP) headers")
303
+
304
+ # Public exposure recommendations
305
+ if insights["public_exposure"] > 0:
306
+ recommendations.append(
307
+ f"{insights['public_exposure']} publicly exposed endpoints - "
308
+ "Add authentication and rate limiting",
309
+ )
310
+
311
+ # Top priority fixes
312
+ for assessment in assessments[:3]:
313
+ if assessment.exploitability in ["CRITICAL", "HIGH"]:
314
+ vuln = assessment.vulnerability
315
+ recommendations.append(
316
+ f"{assessment.exploitability}: {vuln['name']} in {Path(vuln['file_path']).name}:{vuln['line_number']}",
317
+ )
318
+
319
+ # General best practices
320
+ recommendations.append("Add pre-commit security scanning (e.g., bandit, safety, npm audit)")
321
+
322
+ return recommendations