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.
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
- empathy_framework-4.7.0.dist-info/RECORD +354 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
- {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
|