empathy-framework 4.6.6__py3-none-any.whl → 4.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
  2. empathy_framework-4.7.0.dist-info/RECORD +354 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -2
  4. empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
  5. empathy_llm_toolkit/agent_factory/__init__.py +6 -6
  6. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
  7. empathy_llm_toolkit/agents_md/__init__.py +22 -0
  8. empathy_llm_toolkit/agents_md/loader.py +218 -0
  9. empathy_llm_toolkit/agents_md/parser.py +271 -0
  10. empathy_llm_toolkit/agents_md/registry.py +307 -0
  11. empathy_llm_toolkit/commands/__init__.py +51 -0
  12. empathy_llm_toolkit/commands/context.py +375 -0
  13. empathy_llm_toolkit/commands/loader.py +301 -0
  14. empathy_llm_toolkit/commands/models.py +231 -0
  15. empathy_llm_toolkit/commands/parser.py +371 -0
  16. empathy_llm_toolkit/commands/registry.py +429 -0
  17. empathy_llm_toolkit/config/__init__.py +8 -8
  18. empathy_llm_toolkit/config/unified.py +3 -7
  19. empathy_llm_toolkit/context/__init__.py +22 -0
  20. empathy_llm_toolkit/context/compaction.py +455 -0
  21. empathy_llm_toolkit/context/manager.py +434 -0
  22. empathy_llm_toolkit/hooks/__init__.py +24 -0
  23. empathy_llm_toolkit/hooks/config.py +306 -0
  24. empathy_llm_toolkit/hooks/executor.py +289 -0
  25. empathy_llm_toolkit/hooks/registry.py +302 -0
  26. empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
  27. empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
  28. empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
  29. empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
  30. empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
  31. empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
  32. empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
  33. empathy_llm_toolkit/learning/__init__.py +30 -0
  34. empathy_llm_toolkit/learning/evaluator.py +438 -0
  35. empathy_llm_toolkit/learning/extractor.py +514 -0
  36. empathy_llm_toolkit/learning/storage.py +560 -0
  37. empathy_llm_toolkit/providers.py +4 -11
  38. empathy_llm_toolkit/security/__init__.py +17 -17
  39. empathy_llm_toolkit/utils/tokens.py +2 -5
  40. empathy_os/__init__.py +202 -70
  41. empathy_os/cache_monitor.py +5 -3
  42. empathy_os/cli/__init__.py +11 -55
  43. empathy_os/cli/__main__.py +29 -15
  44. empathy_os/cli/commands/inspection.py +21 -12
  45. empathy_os/cli/commands/memory.py +4 -12
  46. empathy_os/cli/commands/profiling.py +198 -0
  47. empathy_os/cli/commands/utilities.py +27 -7
  48. empathy_os/cli.py +28 -57
  49. empathy_os/cli_unified.py +525 -1164
  50. empathy_os/cost_tracker.py +9 -3
  51. empathy_os/dashboard/server.py +200 -2
  52. empathy_os/hot_reload/__init__.py +7 -7
  53. empathy_os/hot_reload/config.py +6 -7
  54. empathy_os/hot_reload/integration.py +35 -35
  55. empathy_os/hot_reload/reloader.py +57 -57
  56. empathy_os/hot_reload/watcher.py +28 -28
  57. empathy_os/hot_reload/websocket.py +2 -2
  58. empathy_os/memory/__init__.py +11 -4
  59. empathy_os/memory/claude_memory.py +1 -1
  60. empathy_os/memory/cross_session.py +8 -12
  61. empathy_os/memory/edges.py +6 -6
  62. empathy_os/memory/file_session.py +770 -0
  63. empathy_os/memory/graph.py +30 -30
  64. empathy_os/memory/nodes.py +6 -6
  65. empathy_os/memory/short_term.py +15 -9
  66. empathy_os/memory/unified.py +606 -140
  67. empathy_os/meta_workflows/agent_creator.py +3 -9
  68. empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
  69. empathy_os/meta_workflows/form_engine.py +6 -18
  70. empathy_os/meta_workflows/intent_detector.py +64 -24
  71. empathy_os/meta_workflows/models.py +3 -1
  72. empathy_os/meta_workflows/pattern_learner.py +13 -31
  73. empathy_os/meta_workflows/plan_generator.py +55 -47
  74. empathy_os/meta_workflows/session_context.py +2 -3
  75. empathy_os/meta_workflows/workflow.py +20 -51
  76. empathy_os/models/cli.py +2 -2
  77. empathy_os/models/tasks.py +1 -2
  78. empathy_os/models/telemetry.py +4 -1
  79. empathy_os/models/token_estimator.py +3 -1
  80. empathy_os/monitoring/alerts.py +938 -9
  81. empathy_os/monitoring/alerts_cli.py +346 -183
  82. empathy_os/orchestration/execution_strategies.py +12 -29
  83. empathy_os/orchestration/pattern_learner.py +20 -26
  84. empathy_os/orchestration/real_tools.py +6 -15
  85. empathy_os/platform_utils.py +2 -1
  86. empathy_os/plugins/__init__.py +2 -2
  87. empathy_os/plugins/base.py +64 -64
  88. empathy_os/plugins/registry.py +32 -32
  89. empathy_os/project_index/index.py +49 -15
  90. empathy_os/project_index/models.py +1 -2
  91. empathy_os/project_index/reports.py +1 -1
  92. empathy_os/project_index/scanner.py +1 -0
  93. empathy_os/redis_memory.py +10 -7
  94. empathy_os/resilience/__init__.py +1 -1
  95. empathy_os/resilience/health.py +10 -10
  96. empathy_os/routing/__init__.py +7 -7
  97. empathy_os/routing/chain_executor.py +37 -37
  98. empathy_os/routing/classifier.py +36 -36
  99. empathy_os/routing/smart_router.py +40 -40
  100. empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
  101. empathy_os/scaffolding/__init__.py +8 -8
  102. empathy_os/scaffolding/__main__.py +1 -1
  103. empathy_os/scaffolding/cli.py +28 -28
  104. empathy_os/socratic/__init__.py +3 -19
  105. empathy_os/socratic/ab_testing.py +25 -36
  106. empathy_os/socratic/blueprint.py +38 -38
  107. empathy_os/socratic/cli.py +34 -20
  108. empathy_os/socratic/collaboration.py +30 -28
  109. empathy_os/socratic/domain_templates.py +9 -1
  110. empathy_os/socratic/embeddings.py +17 -13
  111. empathy_os/socratic/engine.py +135 -70
  112. empathy_os/socratic/explainer.py +70 -60
  113. empathy_os/socratic/feedback.py +24 -19
  114. empathy_os/socratic/forms.py +15 -10
  115. empathy_os/socratic/generator.py +51 -35
  116. empathy_os/socratic/llm_analyzer.py +25 -23
  117. empathy_os/socratic/mcp_server.py +99 -159
  118. empathy_os/socratic/session.py +19 -13
  119. empathy_os/socratic/storage.py +98 -67
  120. empathy_os/socratic/success.py +38 -27
  121. empathy_os/socratic/visual_editor.py +51 -39
  122. empathy_os/socratic/web_ui.py +99 -66
  123. empathy_os/telemetry/cli.py +3 -1
  124. empathy_os/telemetry/usage_tracker.py +1 -3
  125. empathy_os/test_generator/__init__.py +3 -3
  126. empathy_os/test_generator/cli.py +28 -28
  127. empathy_os/test_generator/generator.py +64 -66
  128. empathy_os/test_generator/risk_analyzer.py +11 -11
  129. empathy_os/vscode_bridge.py +173 -0
  130. empathy_os/workflows/__init__.py +212 -120
  131. empathy_os/workflows/batch_processing.py +8 -24
  132. empathy_os/workflows/bug_predict.py +1 -1
  133. empathy_os/workflows/code_review.py +20 -5
  134. empathy_os/workflows/code_review_pipeline.py +13 -8
  135. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  136. empathy_os/workflows/manage_documentation.py +1 -0
  137. empathy_os/workflows/orchestrated_health_check.py +6 -11
  138. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  139. empathy_os/workflows/pr_review.py +18 -10
  140. empathy_os/workflows/progressive/__init__.py +2 -12
  141. empathy_os/workflows/progressive/cli.py +14 -37
  142. empathy_os/workflows/progressive/core.py +12 -12
  143. empathy_os/workflows/progressive/orchestrator.py +166 -144
  144. empathy_os/workflows/progressive/reports.py +22 -31
  145. empathy_os/workflows/progressive/telemetry.py +8 -14
  146. empathy_os/workflows/progressive/test_gen.py +29 -48
  147. empathy_os/workflows/progressive/workflow.py +31 -70
  148. empathy_os/workflows/release_prep.py +21 -6
  149. empathy_os/workflows/release_prep_crew.py +1 -0
  150. empathy_os/workflows/secure_release.py +13 -6
  151. empathy_os/workflows/security_audit.py +8 -3
  152. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  153. empathy_os/workflows/test_maintenance_crew.py +1 -0
  154. empathy_os/workflows/test_runner.py +16 -12
  155. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  156. empathy_software_plugin/cli.py +0 -122
  157. coach_wizards/__init__.py +0 -45
  158. coach_wizards/accessibility_wizard.py +0 -91
  159. coach_wizards/api_wizard.py +0 -91
  160. coach_wizards/base_wizard.py +0 -209
  161. coach_wizards/cicd_wizard.py +0 -91
  162. coach_wizards/code_reviewer_README.md +0 -60
  163. coach_wizards/code_reviewer_wizard.py +0 -180
  164. coach_wizards/compliance_wizard.py +0 -91
  165. coach_wizards/database_wizard.py +0 -91
  166. coach_wizards/debugging_wizard.py +0 -91
  167. coach_wizards/documentation_wizard.py +0 -91
  168. coach_wizards/generate_wizards.py +0 -347
  169. coach_wizards/localization_wizard.py +0 -173
  170. coach_wizards/migration_wizard.py +0 -91
  171. coach_wizards/monitoring_wizard.py +0 -91
  172. coach_wizards/observability_wizard.py +0 -91
  173. coach_wizards/performance_wizard.py +0 -91
  174. coach_wizards/prompt_engineering_wizard.py +0 -661
  175. coach_wizards/refactoring_wizard.py +0 -91
  176. coach_wizards/scaling_wizard.py +0 -90
  177. coach_wizards/security_wizard.py +0 -92
  178. coach_wizards/testing_wizard.py +0 -91
  179. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  180. empathy_llm_toolkit/wizards/__init__.py +0 -43
  181. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  182. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  183. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  184. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  185. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  186. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  187. empathy_os/wizard_factory_cli.py +0 -170
  188. empathy_software_plugin/wizards/__init__.py +0 -42
  189. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  190. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  191. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  192. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  193. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  194. empathy_software_plugin/wizards/base_wizard.py +0 -288
  195. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  196. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  197. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  198. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  199. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  200. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  201. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  202. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  203. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  204. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  205. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  206. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  207. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  208. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  209. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  210. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  211. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  212. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  213. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  214. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  215. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  216. empathy_software_plugin/wizards/security/__init__.py +0 -32
  217. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  218. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  219. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  220. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  221. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  222. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  223. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  224. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  225. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  226. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  227. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  228. wizards/__init__.py +0 -82
  229. wizards/admission_assessment_wizard.py +0 -644
  230. wizards/care_plan.py +0 -321
  231. wizards/clinical_assessment.py +0 -769
  232. wizards/discharge_planning.py +0 -77
  233. wizards/discharge_summary_wizard.py +0 -468
  234. wizards/dosage_calculation.py +0 -497
  235. wizards/incident_report_wizard.py +0 -454
  236. wizards/medication_reconciliation.py +0 -85
  237. wizards/nursing_assessment.py +0 -171
  238. wizards/patient_education.py +0 -654
  239. wizards/quality_improvement.py +0 -705
  240. wizards/sbar_report.py +0 -324
  241. wizards/sbar_wizard.py +0 -608
  242. wizards/shift_handoff_wizard.py +0 -535
  243. wizards/soap_note_wizard.py +0 -679
  244. wizards/treatment_plan.py +0 -15
  245. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
  246. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
  247. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,322 +0,0 @@
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: dict[str, int] = {}
172
-
173
- for vuln in vulnerabilities:
174
- category: str = str(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