souleyez 2.43.1__py3-none-any.whl → 2.43.8__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.

Potentially problematic release.


This version of souleyez might be problematic. Click here for more details.

souleyez/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = '2.43.1'
1
+ __version__ = '2.43.8'
2
2
 
souleyez/docs/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.1
4
- **Last Updated:** January 11, 2026
3
+ **Version:** 2.43.8
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.
@@ -3285,9 +3285,12 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
3285
3285
  # Get tool recommendations
3286
3286
  recommendations = get_tool_recommendations(parsed)
3287
3287
 
3288
- # Determine status
3288
+ # Determine status and build summary
3289
+ summary_parts = []
3290
+
3289
3291
  if parsed.get('error'):
3290
3292
  status = STATUS_ERROR
3293
+ summary_parts.append(f"Error: {parsed.get('error')}")
3291
3294
  elif parsed.get('managed_hosting') or parsed.get('waf') or parsed.get('cdn'):
3292
3295
  status = STATUS_DONE # Found useful info
3293
3296
  elif parsed.get('server'):
@@ -3295,11 +3298,31 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
3295
3298
  else:
3296
3299
  status = STATUS_NO_RESULTS
3297
3300
 
3301
+ # Build summary for successful scans
3302
+ if not parsed.get('error'):
3303
+ if parsed.get('server'):
3304
+ summary_parts.append(f"Server: {parsed.get('server')}")
3305
+ if parsed.get('managed_hosting'):
3306
+ summary_parts.append(f"Platform: {parsed.get('managed_hosting')}")
3307
+ if parsed.get('waf'):
3308
+ summary_parts.append(f"WAF: {', '.join(parsed.get('waf', []))}")
3309
+ if parsed.get('cdn'):
3310
+ summary_parts.append(f"CDN: {', '.join(parsed.get('cdn', []))}")
3311
+ if parsed.get('technologies'):
3312
+ techs = parsed.get('technologies', [])
3313
+ if len(techs) <= 3:
3314
+ summary_parts.append(f"Tech: {', '.join(techs)}")
3315
+ else:
3316
+ summary_parts.append(f"Tech: {', '.join(techs[:3])} +{len(techs)-3} more")
3317
+
3318
+ summary = ' | '.join(summary_parts) if summary_parts else 'No fingerprint data detected'
3319
+
3298
3320
  return {
3299
3321
  'tool': 'http_fingerprint',
3300
3322
  'status': status,
3301
3323
  'target': target,
3302
3324
  'target_host': target_host,
3325
+ 'summary': summary,
3303
3326
  # Core fingerprint data
3304
3327
  'server': parsed.get('server'),
3305
3328
  '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.1')
176
+ @click.version_option(version='2.43.8')
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
 
@@ -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
@@ -3955,19 +3956,29 @@ def launch_job(job_params: Dict[str, Any]) -> Optional[int]:
3955
3956
  click.echo()
3956
3957
 
3957
3958
  job_ids = []
3959
+ blocked_targets = []
3958
3960
  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'))
3961
+ try:
3962
+ job_id = enqueue_job(
3963
+ tool=tool_name,
3964
+ target=t,
3965
+ args=args,
3966
+ label=label,
3967
+ metadata=metadata if metadata else None
3968
+ )
3969
+ job_ids.append(job_id)
3970
+ click.echo(click.style(f"✓ Job #{job_id} enqueued for {t}", fg='green'))
3971
+ except ScopeViolationError:
3972
+ blocked_targets.append(t)
3973
+ click.echo(click.style(f"✗ BLOCKED (out of scope): {t}", fg='red', bold=True))
3968
3974
 
3969
3975
  click.echo()
3970
- click.echo(click.style(f"✓ {len(job_ids)} jobs enqueued successfully!", fg='green', bold=True))
3976
+ if blocked_targets:
3977
+ click.echo(click.style(f"⚠ {len(blocked_targets)} targets blocked (out of scope)", fg='yellow', bold=True))
3978
+ if job_ids:
3979
+ click.echo(click.style(f"✓ {len(job_ids)} jobs enqueued successfully!", fg='green', bold=True))
3980
+ else:
3981
+ click.echo(click.style("✗ No jobs created - all targets blocked", fg='red', bold=True))
3971
3982
  click.echo(f"Tool: {tool_name}")
3972
3983
  if label:
3973
3984
  click.echo(f"Label: {label}")
@@ -3998,6 +4009,15 @@ def launch_job(job_params: Dict[str, Any]) -> Optional[int]:
3998
4009
 
3999
4010
  return job_id # Return the job_id
4000
4011
 
4012
+ except ScopeViolationError as e:
4013
+ click.echo()
4014
+ click.echo(click.style("✗ JOB BLOCKED - OUT OF SCOPE", fg='red', bold=True))
4015
+ click.echo(click.style(f" Target: {job_params.get('target', 'unknown')}", fg='red'))
4016
+ click.echo(click.style(f" Reason: {e}", fg='yellow'))
4017
+ click.echo()
4018
+ click.echo(click.style(" Scope enforcement is set to 'block' for this engagement.", fg='cyan'))
4019
+ click.echo(click.style(" Use 'souleyez scope' to view or modify scope settings.", fg='cyan'))
4020
+ return None
4001
4021
  except Exception as e:
4002
4022
  click.echo(click.style(f"✗ Error enqueueing job: {e}", fg='red'))
4003
4023
  return None
@@ -4599,6 +4619,12 @@ def view_jobs_menu():
4599
4619
  rule_id = job.get('rule_id') or job.get('metadata', {}).get('rule_id')
4600
4620
  rule_display = f"#{rule_id}" if rule_id else '-'
4601
4621
 
4622
+ # Check for scope warnings
4623
+ job_warnings = job.get('metadata', {}).get('warnings', [])
4624
+ scope_warning = any('SCOPE' in w for w in job_warnings)
4625
+ if scope_warning:
4626
+ target = f"[yellow]⚠[/yellow] {target}"
4627
+
4602
4628
  # Checkbox based on selection
4603
4629
  checkbox = '●' if job_id_int in selected_jobs else '○'
4604
4630
  table.add_row(checkbox, jid, status_display, tool, target, label, parent_display, rule_display)
@@ -5048,6 +5074,7 @@ def _view_ai_suggestions(engagement_id: int):
5048
5074
  # Accept all suggestions
5049
5075
  if click.confirm(f" Queue all {len(suggestions)} AI suggestions?", default=True):
5050
5076
  queued = 0
5077
+ blocked = 0
5051
5078
  for sug in suggestions:
5052
5079
  try:
5053
5080
  job_id = enqueue_job(
@@ -5059,12 +5086,17 @@ def _view_ai_suggestions(engagement_id: int):
5059
5086
  )
5060
5087
  if job_id:
5061
5088
  queued += 1
5089
+ except ScopeViolationError:
5090
+ blocked += 1
5091
+ click.echo(click.style(f" ✗ BLOCKED: {sug['target']} (out of scope)", fg='red'))
5062
5092
  except Exception as e:
5063
5093
  pass
5064
5094
 
5065
5095
  # Mark all as approved
5066
5096
  _mark_suggestions_approved(engagement_id, [s for s in suggestions])
5067
- click.echo(click.style(f"\n ✓ Queued {queued} job(s)", fg='green'))
5097
+ if blocked:
5098
+ click.echo(click.style(f"\n ⚠ {blocked} job(s) blocked (out of scope)", fg='yellow'))
5099
+ click.echo(click.style(f" ✓ Queued {queued} job(s)", fg='green'))
5068
5100
  click.pause()
5069
5101
  return
5070
5102
  continue
@@ -5147,6 +5179,11 @@ def _view_suggestion_detail(engagement_id: int, suggestion: dict, all_suggestion
5147
5179
  )
5148
5180
  _mark_suggestions_approved(engagement_id, [suggestion])
5149
5181
  click.echo(click.style(f"\n ✓ Queued job #{job_id}", fg='green'))
5182
+ except ScopeViolationError as e:
5183
+ click.echo()
5184
+ click.echo(click.style(" ✗ JOB BLOCKED - OUT OF SCOPE", fg='red', bold=True))
5185
+ click.echo(click.style(f" Target: {suggestion['target']}", fg='red'))
5186
+ click.echo(click.style(f" Reason: {e}", fg='yellow'))
5150
5187
  except Exception as e:
5151
5188
  click.echo(click.style(f"\n ✗ Failed to queue: {e}", fg='red'))
5152
5189
  click.pause()
@@ -5435,6 +5472,13 @@ def view_job_detail(job_id: int):
5435
5472
  else:
5436
5473
  click.echo(f"Reason: Manual (created by user)")
5437
5474
 
5475
+ # Show scope warnings if any
5476
+ warnings = metadata.get('warnings', [])
5477
+ if warnings:
5478
+ click.echo()
5479
+ for warning in warnings:
5480
+ click.echo(click.style(f" ⚠ {warning}", fg='yellow', bold=True))
5481
+
5438
5482
  if job.get('pid'):
5439
5483
  click.echo(f"PID: {click.style(str(job['pid']), fg='cyan')}")
5440
5484
 
souleyez/ui/tool_setup.py CHANGED
@@ -797,22 +797,87 @@ def _install_snap_tool(console, tool: Dict) -> bool:
797
797
 
798
798
  def _install_git_tool(console, tool: Dict) -> bool:
799
799
  """Install a tool from git (requires sudo for /opt)."""
800
+ import re
801
+
800
802
  name = tool['name']
801
803
  cmd = tool['install']
802
804
 
803
- console.print(f" {name}...", end=" ")
805
+ console.print(f" {name}...")
806
+
807
+ # Parse the command to handle existing directories properly
808
+ # Commands are typically: git clone <url> <dir> && pip install ... && ln -sf ...
809
+ commands = [c.strip() for c in cmd.split('&&')]
810
+
811
+ clone_cmd = None
812
+ post_clone_cmds = []
813
+ target_dir = None
814
+
815
+ for i, c in enumerate(commands):
816
+ if 'git clone' in c:
817
+ clone_cmd = c
818
+ post_clone_cmds = commands[i + 1:]
819
+ # Extract target directory from clone command
820
+ # Pattern: git clone <url> <directory>
821
+ match = re.search(r'git clone\s+\S+\s+(\S+)', c)
822
+ if match:
823
+ target_dir = match.group(1)
824
+ break
825
+
826
+ # If we found a git clone command and target directory
827
+ if clone_cmd and target_dir:
828
+ dir_exists = Path(target_dir).exists()
829
+
830
+ if dir_exists:
831
+ console.print(f" [dim]Directory {target_dir} exists, updating...[/dim]")
832
+ # Try to update with git pull
833
+ pull_cmd = f"sudo git -C {target_dir} pull"
834
+ success, _, stderr = _run_command(pull_cmd, console, capture=True)
835
+
836
+ if not success and "not a git repository" in stderr.lower():
837
+ # Directory exists but isn't a git repo - remove and re-clone
838
+ console.print(f" [dim]Not a git repo, re-cloning...[/dim]")
839
+ rm_cmd = f"sudo rm -rf {target_dir}"
840
+ _run_command(rm_cmd, console, capture=True)
841
+ success, _, stderr = _run_command(clone_cmd, console, capture=True)
842
+ if not success:
843
+ console.print(f"[red]✗[/red]")
844
+ if stderr:
845
+ console.print(f" [dim]{stderr[:80]}[/dim]")
846
+ return False
847
+ elif not success:
848
+ # Pull failed for other reasons, try to continue anyway
849
+ console.print(f" [yellow]⚠ git pull failed, continuing with existing files[/yellow]")
850
+ else:
851
+ # Directory doesn't exist, run the clone
852
+ success, _, stderr = _run_command(clone_cmd, console, capture=True)
853
+ if not success:
854
+ console.print(f"[red]✗[/red]")
855
+ if stderr:
856
+ console.print(f" [dim]{stderr[:80]}[/dim]")
857
+ return False
858
+
859
+ # Run post-clone commands (pip install, symlink, etc.)
860
+ for post_cmd in post_clone_cmds:
861
+ post_cmd = post_cmd.strip()
862
+ if not post_cmd:
863
+ continue
864
+ success, _, stderr = _run_command(post_cmd, console, capture=True)
865
+ if not success:
866
+ console.print(f"[red]✗[/red]")
867
+ if stderr:
868
+ console.print(f" [dim]{stderr[:80]}[/dim]")
869
+ return False
870
+
871
+ console.print(f" [green]✓[/green]")
872
+ return True
804
873
 
805
- # These typically clone to /opt and need sudo
874
+ # Fallback: run the full command as-is (no git clone detected)
806
875
  success, _, stderr = _run_command(cmd, console, capture=True)
807
876
 
808
877
  if success:
809
878
  console.print("[green]✓[/green]")
810
879
  return True
811
880
  else:
812
- # Check if directory already exists
813
- if "already exists" in stderr:
814
- console.print("[green]✓ (already installed)[/green]")
815
- return True
816
881
  console.print(f"[red]✗[/red]")
817
882
  if stderr:
818
883
  console.print(f" [dim]{stderr[:80]}[/dim]")
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 aioquic',
324
- 'install_ubuntu': 'sudo git clone https://github.com/lgandx/Responder.git /opt/Responder && sudo pip install -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.1
3
+ Version: 2.43.8
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=DJ8p496pzHrV1rC5NT4HTGE6R5GEybXzpIr4MXWUPN8,24
1
+ souleyez/__init__.py,sha256=Ik_sQ3aj5yrqnHIFTdhRKvESiPg5lT1RwJDJhI4sfHI,24
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=JxMzeX2Le-LlKZpI9Zevn_Tp4DT-8v71sd7oE7HJRqI,129100
7
+ souleyez/main.py,sha256=skDRnYRjaB7t_6KkMMCITyQqCoq5Ta5n6qupas7TIdg,129100
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=QV_P1kFEzxR7Ht2B1dtPpc4bjBssJRWy2VDb2cm0slc,7187
107
+ souleyez/docs/README.md,sha256=-eCQcjyhWcq2_E14G7DlTWGAdJLYe0qBGoUJXC-qr_8,7187
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=iJBGy9apzYYp8nQn70wnqd09iYieGeB8GNm9ESkBFag,142311
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=36XIGCMULMpzU7mhZMaUNof9Q5A0YdlZGrQRipc57kI,179004
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=3WUuQMTNvVjcklkKbxmZCSFL0PqcQEeiaONTDtl4duU,1409094
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
@@ -364,15 +364,15 @@ souleyez/ui/team_dashboard.py,sha256=ejM_44nbJbEIPxxxdEK7SCPcqQtcuJLjoO-C53qED2Y
364
364
  souleyez/ui/template_selector.py,sha256=qQJkFNnVjYctb-toeYlupP_U1asGrJWYi5-HR89Ab9g,19103
365
365
  souleyez/ui/terminal.py,sha256=Sw9ma1-DZclJE1sENjTZ3Q7r-Ct1NiB3Lpmv-RZW5tE,2372
366
366
  souleyez/ui/timeline_view.py,sha256=Ze8Mev9VE4_ECdNFEJwZK2V42EBguR83uCCdwAbJqmc,11111
367
- souleyez/ui/tool_setup.py,sha256=Ah-EfuAZm6POJc9I6KSkMVPBD4LafEeXOqBzvcemvfs,33669
368
- souleyez/ui/tutorial.py,sha256=XxF06vNVbuzHjkbHbft6fDPj6RSH0tqr4FZ3K8DPSrY,14800
367
+ souleyez/ui/tool_setup.py,sha256=HkRTjzN7FHUs_XKtNYnphkdXb5kC4P6ghpI8TeCuEjU,36375
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=kQcXJVY5NiO-orQAUnpHhpQvR5UOBNHJ0PaT0fBxYoQ,30782
373
- souleyez-2.43.1.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
374
- souleyez-2.43.1.dist-info/METADATA,sha256=_QPUwJB_nRPuYIWH-QfIff98oyWrg2e_vH6Obn4Taic,10425
375
- souleyez-2.43.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
376
- souleyez-2.43.1.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
377
- souleyez-2.43.1.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
378
- souleyez-2.43.1.dist-info/RECORD,,
372
+ souleyez/utils/tool_checker.py,sha256=YzNajZpFyKJA5fp0Kq_gQ0YnKb7J1BaKJSZ8vP-IWj8,30868
373
+ souleyez-2.43.8.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
374
+ souleyez-2.43.8.dist-info/METADATA,sha256=7gYfKwNQcehNCgKHrpSM_Tc4HLHOJfQNfrsRa2HY_d8,10425
375
+ souleyez-2.43.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
376
+ souleyez-2.43.8.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
377
+ souleyez-2.43.8.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
378
+ souleyez-2.43.8.dist-info/RECORD,,