empathy-framework 4.6.6__py3-none-any.whl → 4.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 (273) hide show
  1. empathy_framework-4.7.1.dist-info/METADATA +690 -0
  2. empathy_framework-4.7.1.dist-info/RECORD +379 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -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 2.py +173 -0
  130. empathy_os/vscode_bridge.py +173 -0
  131. empathy_os/workflows/__init__.py +212 -120
  132. empathy_os/workflows/batch_processing.py +8 -24
  133. empathy_os/workflows/bug_predict.py +1 -1
  134. empathy_os/workflows/code_review.py +20 -5
  135. empathy_os/workflows/code_review_pipeline.py +13 -8
  136. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  137. empathy_os/workflows/manage_documentation.py +1 -0
  138. empathy_os/workflows/orchestrated_health_check.py +6 -11
  139. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  140. empathy_os/workflows/pr_review.py +18 -10
  141. empathy_os/workflows/progressive/README 2.md +454 -0
  142. empathy_os/workflows/progressive/__init__ 2.py +92 -0
  143. empathy_os/workflows/progressive/__init__.py +2 -12
  144. empathy_os/workflows/progressive/cli 2.py +242 -0
  145. empathy_os/workflows/progressive/cli.py +14 -37
  146. empathy_os/workflows/progressive/core 2.py +488 -0
  147. empathy_os/workflows/progressive/core.py +12 -12
  148. empathy_os/workflows/progressive/orchestrator 2.py +701 -0
  149. empathy_os/workflows/progressive/orchestrator.py +166 -144
  150. empathy_os/workflows/progressive/reports 2.py +528 -0
  151. empathy_os/workflows/progressive/reports.py +22 -31
  152. empathy_os/workflows/progressive/telemetry 2.py +280 -0
  153. empathy_os/workflows/progressive/telemetry.py +8 -14
  154. empathy_os/workflows/progressive/test_gen 2.py +514 -0
  155. empathy_os/workflows/progressive/test_gen.py +29 -48
  156. empathy_os/workflows/progressive/workflow 2.py +628 -0
  157. empathy_os/workflows/progressive/workflow.py +31 -70
  158. empathy_os/workflows/release_prep.py +21 -6
  159. empathy_os/workflows/release_prep_crew.py +1 -0
  160. empathy_os/workflows/secure_release.py +13 -6
  161. empathy_os/workflows/security_audit.py +8 -3
  162. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  163. empathy_os/workflows/test_maintenance_crew.py +1 -0
  164. empathy_os/workflows/test_runner.py +16 -12
  165. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  166. empathy_software_plugin/cli.py +0 -122
  167. patterns/README.md +119 -0
  168. patterns/__init__.py +95 -0
  169. patterns/behavior.py +298 -0
  170. patterns/code_review_memory.json +441 -0
  171. patterns/core.py +97 -0
  172. patterns/debugging.json +3763 -0
  173. patterns/empathy.py +268 -0
  174. patterns/health_check_memory.json +505 -0
  175. patterns/input.py +161 -0
  176. patterns/memory_graph.json +8 -0
  177. patterns/refactoring_memory.json +1113 -0
  178. patterns/registry.py +663 -0
  179. patterns/security_memory.json +8 -0
  180. patterns/structural.py +415 -0
  181. patterns/validation.py +194 -0
  182. coach_wizards/__init__.py +0 -45
  183. coach_wizards/accessibility_wizard.py +0 -91
  184. coach_wizards/api_wizard.py +0 -91
  185. coach_wizards/base_wizard.py +0 -209
  186. coach_wizards/cicd_wizard.py +0 -91
  187. coach_wizards/code_reviewer_README.md +0 -60
  188. coach_wizards/code_reviewer_wizard.py +0 -180
  189. coach_wizards/compliance_wizard.py +0 -91
  190. coach_wizards/database_wizard.py +0 -91
  191. coach_wizards/debugging_wizard.py +0 -91
  192. coach_wizards/documentation_wizard.py +0 -91
  193. coach_wizards/generate_wizards.py +0 -347
  194. coach_wizards/localization_wizard.py +0 -173
  195. coach_wizards/migration_wizard.py +0 -91
  196. coach_wizards/monitoring_wizard.py +0 -91
  197. coach_wizards/observability_wizard.py +0 -91
  198. coach_wizards/performance_wizard.py +0 -91
  199. coach_wizards/prompt_engineering_wizard.py +0 -661
  200. coach_wizards/refactoring_wizard.py +0 -91
  201. coach_wizards/scaling_wizard.py +0 -90
  202. coach_wizards/security_wizard.py +0 -92
  203. coach_wizards/testing_wizard.py +0 -91
  204. empathy_framework-4.6.6.dist-info/METADATA +0 -1597
  205. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  206. empathy_llm_toolkit/wizards/__init__.py +0 -43
  207. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  208. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  209. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  210. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  211. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  212. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  213. empathy_os/wizard_factory_cli.py +0 -170
  214. empathy_software_plugin/wizards/__init__.py +0 -42
  215. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  216. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  217. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  218. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  219. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  220. empathy_software_plugin/wizards/base_wizard.py +0 -288
  221. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  222. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  223. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  224. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  225. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  226. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  227. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  228. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  229. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  230. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  231. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  232. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  233. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  234. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  235. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  236. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  237. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  238. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  239. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  240. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  241. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  242. empathy_software_plugin/wizards/security/__init__.py +0 -32
  243. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  244. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  245. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  246. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  247. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  248. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  249. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  250. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  251. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  252. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  253. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  254. wizards/__init__.py +0 -82
  255. wizards/admission_assessment_wizard.py +0 -644
  256. wizards/care_plan.py +0 -321
  257. wizards/clinical_assessment.py +0 -769
  258. wizards/discharge_planning.py +0 -77
  259. wizards/discharge_summary_wizard.py +0 -468
  260. wizards/dosage_calculation.py +0 -497
  261. wizards/incident_report_wizard.py +0 -454
  262. wizards/medication_reconciliation.py +0 -85
  263. wizards/nursing_assessment.py +0 -171
  264. wizards/patient_education.py +0 -654
  265. wizards/quality_improvement.py +0 -705
  266. wizards/sbar_report.py +0 -324
  267. wizards/sbar_wizard.py +0 -608
  268. wizards/shift_handoff_wizard.py +0 -535
  269. wizards/soap_note_wizard.py +0 -679
  270. wizards/treatment_plan.py +0 -15
  271. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
  272. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
  273. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.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