souleyez 2.43.3__py3-none-any.whl → 2.43.11__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.
souleyez/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = '2.43.3'
1
+ __version__ = '2.43.11'
2
2
 
souleyez/docs/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.3
4
- **Last Updated:** January 11, 2026
3
+ **Version:** 2.43.11
4
+ **Last Updated:** January 12, 2026
5
5
  **Organization:** CyberSoul Security
6
6
 
7
7
  Welcome to the SoulEyez documentation! This documentation covers architecture, development, user guides, and operational information for the SoulEyez penetration testing platform.
@@ -2643,6 +2643,12 @@ def parse_nuclei_job(engagement_id: int, log_path: str, job: Dict[str, Any]) ->
2643
2643
  'info': parsed.get('info', 0)
2644
2644
  }
2645
2645
  except Exception as e:
2646
+ logger.error("parse_nuclei_job exception", extra={
2647
+ "error": str(e),
2648
+ "error_type": type(e).__name__,
2649
+ "target": job.get('target', ''),
2650
+ "job_id": job.get('id')
2651
+ })
2646
2652
  return {'error': str(e)}
2647
2653
 
2648
2654
 
@@ -3285,9 +3291,12 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
3285
3291
  # Get tool recommendations
3286
3292
  recommendations = get_tool_recommendations(parsed)
3287
3293
 
3288
- # Determine status
3294
+ # Determine status and build summary
3295
+ summary_parts = []
3296
+
3289
3297
  if parsed.get('error'):
3290
3298
  status = STATUS_ERROR
3299
+ summary_parts.append(f"Error: {parsed.get('error')}")
3291
3300
  elif parsed.get('managed_hosting') or parsed.get('waf') or parsed.get('cdn'):
3292
3301
  status = STATUS_DONE # Found useful info
3293
3302
  elif parsed.get('server'):
@@ -3295,11 +3304,31 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
3295
3304
  else:
3296
3305
  status = STATUS_NO_RESULTS
3297
3306
 
3307
+ # Build summary for successful scans
3308
+ if not parsed.get('error'):
3309
+ if parsed.get('server'):
3310
+ summary_parts.append(f"Server: {parsed.get('server')}")
3311
+ if parsed.get('managed_hosting'):
3312
+ summary_parts.append(f"Platform: {parsed.get('managed_hosting')}")
3313
+ if parsed.get('waf'):
3314
+ summary_parts.append(f"WAF: {', '.join(parsed.get('waf', []))}")
3315
+ if parsed.get('cdn'):
3316
+ summary_parts.append(f"CDN: {', '.join(parsed.get('cdn', []))}")
3317
+ if parsed.get('technologies'):
3318
+ techs = parsed.get('technologies', [])
3319
+ if len(techs) <= 3:
3320
+ summary_parts.append(f"Tech: {', '.join(techs)}")
3321
+ else:
3322
+ summary_parts.append(f"Tech: {', '.join(techs[:3])} +{len(techs)-3} more")
3323
+
3324
+ summary = ' | '.join(summary_parts) if summary_parts else 'No fingerprint data detected'
3325
+
3298
3326
  return {
3299
3327
  'tool': 'http_fingerprint',
3300
3328
  'status': status,
3301
3329
  'target': target,
3302
3330
  'target_host': target_host,
3331
+ 'summary': summary,
3303
3332
  # Core fingerprint data
3304
3333
  'server': parsed.get('server'),
3305
3334
  'managed_hosting': parsed.get('managed_hosting'),
souleyez/main.py CHANGED
@@ -173,7 +173,7 @@ def _check_privileged_tools():
173
173
 
174
174
 
175
175
  @click.group()
176
- @click.version_option(version='2.43.3')
176
+ @click.version_option(version='2.43.11')
177
177
  def cli():
178
178
  """SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
179
179
  from souleyez.log_config import init_logging
@@ -125,8 +125,12 @@ class EngagementManager:
125
125
  # File contains invalid data, reset to default
126
126
  pass
127
127
 
128
- # Reset to default engagement
129
- default_id = self.create("default", "Default engagement")
128
+ # Reset to default engagement - use existing or create new
129
+ default_eng = self.get("default")
130
+ if default_eng:
131
+ default_id = default_eng['id']
132
+ else:
133
+ default_id = self.create("default", "Default engagement")
130
134
  self.set_current("default")
131
135
  return self.get_by_id(default_id)
132
136
 
souleyez/ui/dashboard.py CHANGED
@@ -1392,9 +1392,20 @@ def render_active_jobs(width: int, engagement_id: Optional[int] = None):
1392
1392
  if engagement_id is not None and job_eng_id != engagement_id:
1393
1393
  warning = click.style(" [!other]", fg='red')
1394
1394
 
1395
- job_line = f" [{jid:>3}] {tool:<10} {target:<30} {status_str:<18} {elapsed}{warning}"
1395
+ # Check for scope warnings
1396
+ job_warnings = job.get('metadata', {}).get('warnings', [])
1397
+ scope_warning = any('SCOPE' in w for w in job_warnings)
1398
+ scope_indicator = click.style("⚠ ", fg='yellow') if scope_warning else ""
1399
+
1400
+ job_line = f" [{jid:>3}] {scope_indicator}{tool:<10} {target:<30} {status_str:<18} {elapsed}{warning}"
1396
1401
  lines.append(job_line)
1397
1402
 
1403
+ # Show scope warning details on next line if present
1404
+ if scope_warning:
1405
+ for w in job_warnings:
1406
+ if 'SCOPE' in w:
1407
+ lines.append(click.style(f" └─ {w}", fg='yellow'))
1408
+
1398
1409
  return lines
1399
1410
 
1400
1411
 
@@ -3333,14 +3344,14 @@ def _show_dashboard_menu(engagement_id: int) -> str:
3333
3344
  click.echo(click.style(" 📋 DOCUMENTATION", bold=True, fg='yellow'))
3334
3345
  click.echo(" " + "─" * 76)
3335
3346
  click.echo(" " + click.style("[e]", fg='yellow', bold=True) + " or " +
3336
- click.style("[6]", fg='yellow') + " 📦 Evidence & Artifacts - Screenshots, files, exports")
3347
+ click.style("[5]", fg='yellow') + " 📦 Evidence & Artifacts - Screenshots, files, exports")
3337
3348
  click.echo(" " + click.style("[d]", fg='yellow', bold=True) + " or " +
3338
- click.style("[7]", fg='yellow') + " ✅ Deliverables - Progress tracking, checklists")
3349
+ click.style("[6]", fg='yellow') + " ✅ Deliverables - Progress tracking, checklists")
3339
3350
 
3340
3351
  # Reports - Pro feature (show to all with appropriate badge)
3341
3352
  pro_badge_yellow = click.style("💎", fg='yellow') if is_pro_user else click.style("🔒 PRO", fg='yellow')
3342
3353
  click.echo(" " + click.style("[r]", fg='yellow', bold=True) + " or " +
3343
- click.style("[8]", fg='yellow') + " 📄 Reports " +
3354
+ click.style("[7]", fg='yellow') + " 📄 Reports " +
3344
3355
  pro_badge_yellow + " - Generate & export reports")
3345
3356
  click.echo()
3346
3357
 
@@ -3348,30 +3359,30 @@ def _show_dashboard_menu(engagement_id: int) -> str:
3348
3359
  click.echo(click.style(" 📊 DATA MANAGEMENT (Deep Dive)", bold=True, fg='green'))
3349
3360
  click.echo(" " + "─" * 76)
3350
3361
  click.echo(" " + click.style("[h]", fg='cyan', bold=True) + " or " +
3351
- click.style("[9]", fg='cyan') + " 🎯 Hosts - Discovered hosts, tags, filtering")
3362
+ click.style("[8]", fg='cyan') + " 🎯 Hosts - Discovered hosts, tags, filtering")
3352
3363
  click.echo(" " + click.style("[v]", fg='cyan', bold=True) + " or " +
3353
- click.style("[10]", fg='cyan') + " 🔌 Services - Open ports, service enumeration")
3364
+ click.style("[9]", fg='cyan') + " 🔌 Services - Open ports, service enumeration")
3354
3365
  click.echo(" " + click.style("[f]", fg='cyan', bold=True) + " or " +
3355
- click.style("[11]", fg='cyan') + " 🔍 Findings - All vulnerabilities (detailed view)")
3366
+ click.style("[10]", fg='cyan') + " 🔍 Findings - All vulnerabilities (detailed view)")
3356
3367
  click.echo(" " + click.style("[c]", fg='cyan', bold=True) + " or " +
3357
- click.style("[12]", fg='cyan') + " 🔑 Credentials - Discovered users, passwords, hashes")
3368
+ click.style("[11]", fg='cyan') + " 🔑 Credentials - Discovered users, passwords, hashes")
3358
3369
  click.echo()
3359
3370
  click.echo(" " + click.style("[b]", fg='cyan', bold=True) + " or " +
3360
- click.style("[13]", fg='cyan') + " 🌐 Web Paths - Directory enumeration results")
3371
+ click.style("[12]", fg='cyan') + " 🌐 Web Paths - Directory enumeration results")
3361
3372
  click.echo(" " + click.style("[n]", fg='cyan', bold=True) + " or " +
3362
- click.style("[14]", fg='cyan') + " 📁 SMB Shares - SMB enumeration, accessible shares")
3373
+ click.style("[13]", fg='cyan') + " 📁 SMB Shares - SMB enumeration, accessible shares")
3363
3374
  click.echo(" " + click.style("[l]", fg='cyan', bold=True) + " or " +
3364
- click.style("[15]", fg='cyan') + " 💉 SQLMap Intelligence - Deduplicated injections, high-value tables")
3375
+ click.style("[14]", fg='cyan') + " 💉 SQLMap Intelligence - Deduplicated injections, high-value tables")
3365
3376
  click.echo(" " + click.style("[p]", fg='cyan', bold=True) + " or " +
3366
- click.style("[16]", fg='cyan') + " 🔌 WordPress Data - WPScan vulnerabilities")
3377
+ click.style("[15]", fg='cyan') + " 🔌 WordPress Data - WPScan vulnerabilities")
3367
3378
  click.echo(" " + click.style("[o]", fg='cyan', bold=True) + " or " +
3368
- click.style("[17]", fg='cyan') + " 💣 Exploits - SearchSploit exploit database")
3379
+ click.style("[16]", fg='cyan') + " 💣 Exploits - SearchSploit exploit database")
3369
3380
  click.echo(" " + click.style("[t]", fg='cyan', bold=True) + " or " +
3370
- click.style("[18]", fg='cyan') + " 🔍 OSINT/Discovery - DNS, WHOIS, emails, infrastructure")
3381
+ click.style("[17]", fg='cyan') + " 🔍 OSINT/Discovery - DNS, WHOIS, emails, infrastructure")
3371
3382
  click.echo()
3372
3383
 
3373
3384
  click.echo(" " + click.style("[q]", fg='red', bold=True) + " or " +
3374
- click.style("[19]", fg='red') + " ← Return to Command Center")
3385
+ click.style("[18]", fg='red') + " ← Return to Command Center")
3375
3386
  click.echo()
3376
3387
 
3377
3388
  # Footer instructions
@@ -3414,6 +3425,11 @@ def _show_dashboard_menu(engagement_id: int) -> str:
3414
3425
 
3415
3426
  # Intelligence Section (Consolidated - 3 items)
3416
3427
  elif action == 'intelligence_hub':
3428
+ # Pro feature - check tier
3429
+ if not is_pro_user:
3430
+ from souleyez.ui.interactive import _show_upgrade_prompt
3431
+ _show_upgrade_prompt("Intelligence Hub")
3432
+ continue
3417
3433
  # Unified Intelligence Hub (was Attack Correlation)
3418
3434
  from souleyez.ui.attack_surface import view_attack_surface
3419
3435
  view_attack_surface(engagement_id)
@@ -17,6 +17,7 @@ from rich.table import Table
17
17
  from souleyez.ui.design_system import DesignSystem
18
18
  from souleyez.engine.loader import discover_plugins
19
19
  from souleyez.engine.background import enqueue_job, list_jobs, get_job
20
+ from souleyez.security.scope_validator import ScopeViolationError
20
21
  from souleyez.storage.engagements import EngagementManager
21
22
  from souleyez.storage.hosts import HostManager
22
23
  from souleyez.storage.findings import FindingsManager
@@ -199,10 +200,11 @@ def _show_upgrade_prompt(feature_name: str):
199
200
  f"Unlock all Pro features:\n"
200
201
  f" • Intelligence Hub - Exploit suggestions & attack surface\n"
201
202
  f" • Auto-Chaining - Automatic follow-up scans\n"
202
- f" • AI Execute - Autonomous exploitation\n"
203
+ f" • AI Settings - Configure Ollama, Claude API providers\n"
204
+ f" • SIEM Integration - Wazuh, Splunk, Elastic, Sentinel\n"
203
205
  f" • MSF Integration - Metasploit attack chains\n"
204
206
  f" • Reports & Export - Professional deliverables\n"
205
- f" • Team Dashboard - Collaboration & activity tracking\n\n"
207
+ f" • Team Dashboard - Collaboration & task assignment\n\n"
206
208
  f"[cyan]Visit: https://www.cybersoulsecurity.com/souleyez[/cyan]",
207
209
  title="🔒 Upgrade Required",
208
210
  border_style="yellow"
@@ -3955,19 +3957,29 @@ def launch_job(job_params: Dict[str, Any]) -> Optional[int]:
3955
3957
  click.echo()
3956
3958
 
3957
3959
  job_ids = []
3960
+ blocked_targets = []
3958
3961
  for t in targets:
3959
- job_id = enqueue_job(
3960
- tool=tool_name,
3961
- target=t,
3962
- args=args,
3963
- label=label,
3964
- metadata=metadata if metadata else None
3965
- )
3966
- job_ids.append(job_id)
3967
- click.echo(click.style(f"✓ Job #{job_id} enqueued for {t}", fg='green'))
3962
+ try:
3963
+ job_id = enqueue_job(
3964
+ tool=tool_name,
3965
+ target=t,
3966
+ args=args,
3967
+ label=label,
3968
+ metadata=metadata if metadata else None
3969
+ )
3970
+ job_ids.append(job_id)
3971
+ click.echo(click.style(f"✓ Job #{job_id} enqueued for {t}", fg='green'))
3972
+ except ScopeViolationError:
3973
+ blocked_targets.append(t)
3974
+ click.echo(click.style(f"✗ BLOCKED (out of scope): {t}", fg='red', bold=True))
3968
3975
 
3969
3976
  click.echo()
3970
- click.echo(click.style(f"✓ {len(job_ids)} jobs enqueued successfully!", fg='green', bold=True))
3977
+ if blocked_targets:
3978
+ click.echo(click.style(f"⚠ {len(blocked_targets)} targets blocked (out of scope)", fg='yellow', bold=True))
3979
+ if job_ids:
3980
+ click.echo(click.style(f"✓ {len(job_ids)} jobs enqueued successfully!", fg='green', bold=True))
3981
+ else:
3982
+ click.echo(click.style("✗ No jobs created - all targets blocked", fg='red', bold=True))
3971
3983
  click.echo(f"Tool: {tool_name}")
3972
3984
  if label:
3973
3985
  click.echo(f"Label: {label}")
@@ -3998,6 +4010,15 @@ def launch_job(job_params: Dict[str, Any]) -> Optional[int]:
3998
4010
 
3999
4011
  return job_id # Return the job_id
4000
4012
 
4013
+ except ScopeViolationError as e:
4014
+ click.echo()
4015
+ click.echo(click.style("✗ JOB BLOCKED - OUT OF SCOPE", fg='red', bold=True))
4016
+ click.echo(click.style(f" Target: {job_params.get('target', 'unknown')}", fg='red'))
4017
+ click.echo(click.style(f" Reason: {e}", fg='yellow'))
4018
+ click.echo()
4019
+ click.echo(click.style(" Scope enforcement is set to 'block' for this engagement.", fg='cyan'))
4020
+ click.echo(click.style(" Use 'souleyez scope' to view or modify scope settings.", fg='cyan'))
4021
+ return None
4001
4022
  except Exception as e:
4002
4023
  click.echo(click.style(f"✗ Error enqueueing job: {e}", fg='red'))
4003
4024
  return None
@@ -4599,6 +4620,12 @@ def view_jobs_menu():
4599
4620
  rule_id = job.get('rule_id') or job.get('metadata', {}).get('rule_id')
4600
4621
  rule_display = f"#{rule_id}" if rule_id else '-'
4601
4622
 
4623
+ # Check for scope warnings
4624
+ job_warnings = job.get('metadata', {}).get('warnings', [])
4625
+ scope_warning = any('SCOPE' in w for w in job_warnings)
4626
+ if scope_warning:
4627
+ target = f"[yellow]⚠[/yellow] {target}"
4628
+
4602
4629
  # Checkbox based on selection
4603
4630
  checkbox = '●' if job_id_int in selected_jobs else '○'
4604
4631
  table.add_row(checkbox, jid, status_display, tool, target, label, parent_display, rule_display)
@@ -5048,6 +5075,7 @@ def _view_ai_suggestions(engagement_id: int):
5048
5075
  # Accept all suggestions
5049
5076
  if click.confirm(f" Queue all {len(suggestions)} AI suggestions?", default=True):
5050
5077
  queued = 0
5078
+ blocked = 0
5051
5079
  for sug in suggestions:
5052
5080
  try:
5053
5081
  job_id = enqueue_job(
@@ -5059,12 +5087,17 @@ def _view_ai_suggestions(engagement_id: int):
5059
5087
  )
5060
5088
  if job_id:
5061
5089
  queued += 1
5090
+ except ScopeViolationError:
5091
+ blocked += 1
5092
+ click.echo(click.style(f" ✗ BLOCKED: {sug['target']} (out of scope)", fg='red'))
5062
5093
  except Exception as e:
5063
5094
  pass
5064
5095
 
5065
5096
  # Mark all as approved
5066
5097
  _mark_suggestions_approved(engagement_id, [s for s in suggestions])
5067
- click.echo(click.style(f"\n ✓ Queued {queued} job(s)", fg='green'))
5098
+ if blocked:
5099
+ click.echo(click.style(f"\n ⚠ {blocked} job(s) blocked (out of scope)", fg='yellow'))
5100
+ click.echo(click.style(f" ✓ Queued {queued} job(s)", fg='green'))
5068
5101
  click.pause()
5069
5102
  return
5070
5103
  continue
@@ -5147,6 +5180,11 @@ def _view_suggestion_detail(engagement_id: int, suggestion: dict, all_suggestion
5147
5180
  )
5148
5181
  _mark_suggestions_approved(engagement_id, [suggestion])
5149
5182
  click.echo(click.style(f"\n ✓ Queued job #{job_id}", fg='green'))
5183
+ except ScopeViolationError as e:
5184
+ click.echo()
5185
+ click.echo(click.style(" ✗ JOB BLOCKED - OUT OF SCOPE", fg='red', bold=True))
5186
+ click.echo(click.style(f" Target: {suggestion['target']}", fg='red'))
5187
+ click.echo(click.style(f" Reason: {e}", fg='yellow'))
5150
5188
  except Exception as e:
5151
5189
  click.echo(click.style(f"\n ✗ Failed to queue: {e}", fg='red'))
5152
5190
  click.pause()
@@ -5435,6 +5473,13 @@ def view_job_detail(job_id: int):
5435
5473
  else:
5436
5474
  click.echo(f"Reason: Manual (created by user)")
5437
5475
 
5476
+ # Show scope warnings if any
5477
+ warnings = metadata.get('warnings', [])
5478
+ if warnings:
5479
+ click.echo()
5480
+ for warning in warnings:
5481
+ click.echo(click.style(f" ⚠ {warning}", fg='yellow', bold=True))
5482
+
5438
5483
  if job.get('pid'):
5439
5484
  click.echo(f"PID: {click.style(str(job['pid']), fg='cyan')}")
5440
5485
 
souleyez/ui/tutorial.py CHANGED
@@ -355,14 +355,15 @@ def _cleanup_tutorial_data():
355
355
  except Exception:
356
356
  pass
357
357
 
358
- # Delete the engagement if it exists
358
+ # Reset current engagement BEFORE deleting tutorial engagement
359
+ # (otherwise get_current() will fail trying to load deleted engagement)
359
360
  if tutorial_eng:
360
- em.delete("Tutorial Engagement")
361
+ current = em.get_current()
362
+ if current and current.get('id') == tutorial_eng['id']:
363
+ em.set_current("default")
361
364
 
362
- # Clear current engagement if it was the tutorial
363
- current = em.get_current()
364
- if current and current.get('name') == 'Tutorial Engagement':
365
- em.set_current(None)
365
+ # Now safe to delete the tutorial engagement
366
+ em.delete("Tutorial Engagement")
366
367
 
367
368
  except Exception as e:
368
369
  click.echo(click.style(f" Note: Could not fully clean up: {e}", fg='yellow'))
@@ -320,8 +320,8 @@ EXTERNAL_TOOLS = {
320
320
  },
321
321
  'responder': {
322
322
  'command': 'responder',
323
- 'install_kali': 'sudo apt install responder && sudo pip install --break-system-packages aioquic',
324
- 'install_ubuntu': 'sudo git clone https://github.com/lgandx/Responder.git /opt/Responder && sudo pip install --break-system-packages -r /opt/Responder/requirements.txt aioquic && sudo ln -sf /opt/Responder/Responder.py /usr/local/bin/responder',
323
+ 'install_kali': 'sudo apt install responder && sudo pip install --break-system-packages --ignore-installed aioquic',
324
+ 'install_ubuntu': 'sudo git clone https://github.com/lgandx/Responder.git /opt/Responder && sudo pip install --break-system-packages --ignore-installed -r /opt/Responder/requirements.txt aioquic && sudo ln -sf /opt/Responder/Responder.py /usr/local/bin/responder',
325
325
  'install_method': 'kali_only',
326
326
  'description': 'LLMNR, NBT-NS and MDNS poisoner',
327
327
  'needs_sudo': True # Required for network poisoning
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.43.3
3
+ Version: 2.43.11
4
4
  Summary: AI-Powered Penetration Testing Platform with 40+ integrated tools
5
5
  Author-email: CyberSoul Security <contact@cybersoulsecurity.com>
6
6
  Maintainer-email: CyberSoul Security <contact@cybersoulsecurity.com>
@@ -1,10 +1,10 @@
1
- souleyez/__init__.py,sha256=hQfhNFZmys4vpRUV0tekkwul1bHV-z9AHclh8q4E4WQ,24
1
+ souleyez/__init__.py,sha256=I4B_wvr7ZkBdzHTJ1C1cbfONbQvc9vr87_vW5Waa8eE,25
2
2
  souleyez/config.py,sha256=av357I3GYRWAklv8Dto-9-5Db699Wq5znez7zo7241Q,11595
3
3
  souleyez/devtools.py,sha256=rptmUY4a5eVvYjdEc6273MSagL-D9xibPOFgohVqUno,3508
4
4
  souleyez/feature_flags.py,sha256=mo6YAq07lc6sR3lEFKmIwTKxXZ2JPxwa5X97uR_mu50,4642
5
5
  souleyez/history.py,sha256=gzs5I_j-3OigIP6yfmBChdqxaFmyUIxvTpzWUPe_Q6c,2853
6
6
  souleyez/log_config.py,sha256=MMhPAJOqgXDfuE-xm5g0RxAfWndcmbhFHvIEMm1a_Wo,5830
7
- souleyez/main.py,sha256=eQpWyYeCz8IvNFBJmqOqFv6x05FT8gOtUC62M_a-0UI,129100
7
+ souleyez/main.py,sha256=9oF2-NPp-jve01_HqbuObmGUli4irgJbESdJBkf6yWk,129101
8
8
  souleyez/scanner.py,sha256=U3IWHRrJ5aQ32dSHiVAHB60w1R_z0E0QxfM99msYNlw,3124
9
9
  souleyez/security.py,sha256=S84m1QmnKz_6NgH2I6IBIAorMHxRPNYVFSnks5xjihQ,2479
10
10
  souleyez/ui.py,sha256=15pfsqoDPnojAqr5S0TZHJE2ZkSHzkHpNVfVvsRj66A,34301
@@ -104,7 +104,7 @@ souleyez/detection/__init__.py,sha256=QIhvXjFdjrquQ6A0VQ7GZQkK_EXB59t8Dv9PKXhEUe
104
104
  souleyez/detection/attack_signatures.py,sha256=akgWwiIkh6WYnghCuLhRV0y6FS0SQ0caGF8tZUc49oA,6965
105
105
  souleyez/detection/mitre_mappings.py,sha256=xejE80YK-g8kKaeQoo-vBl8P3t8RTTItbfN0NaVZw6s,20558
106
106
  souleyez/detection/validator.py,sha256=-AJ7QSJ3-6jFKLnPG_Rc34IXyF4JPyI82BFUgTA9zw0,15641
107
- souleyez/docs/README.md,sha256=yY6yvWMHZZXVEQC2JeQ8Tui0TyXKbWNabPlh0X5BdO8,7187
107
+ souleyez/docs/README.md,sha256=SmQbiTNYTKW03oV1aXcdCFlWK9e3_Enpp6viJtqPGb4,7188
108
108
  souleyez/docs/api-reference/cli-commands.md,sha256=lTLFnILN3YRVdqCaag7WgsYXfDGglb1TuPexkxDsVdE,12917
109
109
  souleyez/docs/api-reference/engagement-api.md,sha256=nd-EvQMtiJrobg2bzFEADp853HP1Uhb9dmgok0_-neE,11672
110
110
  souleyez/docs/api-reference/integration-guide.md,sha256=c96uX79ukHyYotLa54wZ20Kx-EUZnrKegTeGkfLD-pw,16285
@@ -152,7 +152,7 @@ souleyez/engine/job_status.py,sha256=OAEf2rAzapm55m4tc3PSilotdA5ONX15JavUMLre0is
152
152
  souleyez/engine/loader.py,sha256=ke6QQVVWozDnqGNBotajC3RBYOa2_DZmv5DAnDZVgIc,2769
153
153
  souleyez/engine/log_sanitizer.py,sha256=QHF6zSms-wHo6SbL6fHXIh1GG-8G34lE7kl45nbPn70,7130
154
154
  souleyez/engine/manager.py,sha256=aBQMoib-VWNXtIp5Qn34tRj1P1jiLpwAIoo1fexAaLU,3629
155
- souleyez/engine/result_handler.py,sha256=vFWKydlWMhE8jjvVI29ZzRODMX2o3jtrreqKqAVkIT4,141198
155
+ souleyez/engine/result_handler.py,sha256=eD5fqGAlnG0pr1gxhKB40HBw_uyzsFJZpFaTDeMXc1g,142535
156
156
  souleyez/engine/worker_manager.py,sha256=B7b8RbkKTNofmiIyHTNgdikoZCLXpB-iIl1S4-U3q9o,6127
157
157
  souleyez/export/__init__.py,sha256=2kFHftSqqrRUG6PhtfhCyhnkpkjc-8Zb4utGo-Nb6B4,61
158
158
  souleyez/export/evidence_bundle.py,sha256=hqPn_h2CidhL-1VAT0qraZ8r1yfnUTnLZ3RfPPCK5Ds,9966
@@ -282,7 +282,7 @@ souleyez/storage/deliverable_evidence.py,sha256=XRagZV6Ol3SySZjk9joc8elvaqBwvi1s
282
282
  souleyez/storage/deliverable_exporter.py,sha256=2c7CHiuCo40Z9WRfzjujSkdZCjKSJmk_BzxsJPswELM,16320
283
283
  souleyez/storage/deliverable_templates.py,sha256=DxsIqkUd54qr7nFByFmF9st6btteKV9bLM2RbgL7MHk,10875
284
284
  souleyez/storage/deliverables.py,sha256=AR2hIRjXIhf3NxzQouh38zZrH5-RIx6Yo0d8i16oHxo,11976
285
- souleyez/storage/engagements.py,sha256=y4PoKJp28nEsFTpcj1cR13r-0UPfYae_Bp96GHao_I0,10263
285
+ souleyez/storage/engagements.py,sha256=0w6P2AVDoXPkakIZ3sgN2tWW-OiIiqOe6E_R_WSxAJ0,10419
286
286
  souleyez/storage/evidence.py,sha256=mG4stROZL3hjA1EJNpGpW_ytbMbyOpLfPT3WgSAPvR4,11643
287
287
  souleyez/storage/execution_log.py,sha256=HiU44zk5txbwJvGVuGFrzrEHjTOfEvKUuaSyOvnsS1M,4049
288
288
  souleyez/storage/exploit_attempts.py,sha256=1ygYOuvmmRq2FASUinEZh_JYgdItu06Kf-GM1HbJgkc,10188
@@ -336,7 +336,7 @@ souleyez/ui/ai_quotes.py,sha256=Ho2QCYIFfks6tPIRFwVUKpvfGChUduWLMpmIDJV4xh0,5489
336
336
  souleyez/ui/attack_surface.py,sha256=PMClCqiw1fIFFpYTghGKnXykamWFWgvraEBQzkiyuF8,196226
337
337
  souleyez/ui/chain_rules_view.py,sha256=BZ7I3UnQEDtt9AWVqufdu1soZLkBn3cMu5lfArnx9aI,63228
338
338
  souleyez/ui/correlation_view.py,sha256=BxJytk8Zq2-MhrMFgf4ZgN5G0-xU3ZdxqNWdRqMghxU,24674
339
- souleyez/ui/dashboard.py,sha256=zIRVFaRsx-AO1VXXpoKhs0_qmseyf71F2PtNPNheDn0,178462
339
+ souleyez/ui/dashboard.py,sha256=xjyhC35CdK9QHSR2ZvJd3HiiBbrIEdH7EP2rsNcfJnA,179250
340
340
  souleyez/ui/deliverables_view.py,sha256=hxYCwcZNzT0loZMSQXODRuZXDNZFrHZ8FTKwcwuZdoI,9604
341
341
  souleyez/ui/design_system.py,sha256=wyI73gwBGQDzo3L_JYn7DiEGXWByFkRjlDkp5MEpZ3s,3415
342
342
  souleyez/ui/errors.py,sha256=vk4gMP5UyLd3W-Gfz06C2B_v4ra8qcie6NFmz1VjY8o,10645
@@ -347,7 +347,7 @@ souleyez/ui/export_view.py,sha256=0nQvVsKk7FU4uRzSfJ_qBZh_Lfn8hgGA2rbJ5bNg5-Y,65
347
347
  souleyez/ui/gap_analysis_view.py,sha256=AytAOEBq010wwo9hne1TE-uJpY_xicjLrFANbvN3r3w,30727
348
348
  souleyez/ui/help_system.py,sha256=nKGxLaMi-TKYs6xudTyw_tZqBb1cGFEuYYh6N-MAsJE,16648
349
349
  souleyez/ui/intelligence_view.py,sha256=VeAQ-3mANRnLIVpRqocL3JV0HUmJtADdxDeC5lzQhE0,32168
350
- souleyez/ui/interactive.py,sha256=RxfZ3yOfCnpWV0K1ta5Op3hP82eYGN0UYV8ME-41fuY,1406653
350
+ souleyez/ui/interactive.py,sha256=XqaN0Jnh-qRud24yAP5U-NViLM2G70sfCaAbcGC65i4,1409179
351
351
  souleyez/ui/interactive_selector.py,sha256=6A51fgmFRnemBY0aCPHIhK2Rpba16NjSGKLzC0Q5vI8,16407
352
352
  souleyez/ui/log_formatter.py,sha256=akhIkYoO_cCaKxS1V5N3iPmIrHzgsU7pmsedx70s9TI,3845
353
353
  souleyez/ui/menu_components.py,sha256=N8zq2QXGmfaLJ08l53MMYt1y-5LRWgpZH6r8nXHonj8,3519
@@ -365,14 +365,14 @@ souleyez/ui/template_selector.py,sha256=qQJkFNnVjYctb-toeYlupP_U1asGrJWYi5-HR89A
365
365
  souleyez/ui/terminal.py,sha256=Sw9ma1-DZclJE1sENjTZ3Q7r-Ct1NiB3Lpmv-RZW5tE,2372
366
366
  souleyez/ui/timeline_view.py,sha256=Ze8Mev9VE4_ECdNFEJwZK2V42EBguR83uCCdwAbJqmc,11111
367
367
  souleyez/ui/tool_setup.py,sha256=HkRTjzN7FHUs_XKtNYnphkdXb5kC4P6ghpI8TeCuEjU,36375
368
- souleyez/ui/tutorial.py,sha256=XxF06vNVbuzHjkbHbft6fDPj6RSH0tqr4FZ3K8DPSrY,14800
368
+ souleyez/ui/tutorial.py,sha256=efDF6nWRek6fySppjmq3qMQ3J2WfW89LOcaeltqnWH4,14917
369
369
  souleyez/ui/tutorial_state.py,sha256=Thf7_qCj4VKjG7UqgJqa9kjIqiFUU-7Q7kG4v-u2B4A,8123
370
370
  souleyez/ui/wazuh_vulns_view.py,sha256=3vJJEmrjgS2wD6EDB7ZV7WxgytBHTm-1WqNDjp7lVEI,21830
371
371
  souleyez/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
372
- souleyez/utils/tool_checker.py,sha256=YZjEeHudjglvJk_MA-iQLzqEItFybhCy6PfaPoBANtE,30830
373
- souleyez-2.43.3.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
374
- souleyez-2.43.3.dist-info/METADATA,sha256=SgqKTr7vd8TI_8YKA8yOHU1-QJez9VJH8HlFr9cAJvU,10425
375
- souleyez-2.43.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
376
- souleyez-2.43.3.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
377
- souleyez-2.43.3.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
378
- souleyez-2.43.3.dist-info/RECORD,,
372
+ souleyez/utils/tool_checker.py,sha256=YzNajZpFyKJA5fp0Kq_gQ0YnKb7J1BaKJSZ8vP-IWj8,30868
373
+ souleyez-2.43.11.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
374
+ souleyez-2.43.11.dist-info/METADATA,sha256=zebGSczpR2dVjmQwhwV9MBb0XcSFgF4iVSIZ0sziUrs,10426
375
+ souleyez-2.43.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
376
+ souleyez-2.43.11.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
377
+ souleyez-2.43.11.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
378
+ souleyez-2.43.11.dist-info/RECORD,,