mirror of
https://github.com/mblanke/ThreatHunt.git
synced 2026-03-01 05:50:21 -05:00
feat: Add Playbook Manager, Saved Searches, and Timeline View components
- Implemented PlaybookManager for creating and managing investigation playbooks with templates. - Added SavedSearches component for managing bookmarked queries and recurring scans. - Introduced TimelineView for visualizing forensic event timelines with zoomable charts. - Enhanced backend processing with auto-queued jobs for dataset uploads and improved database concurrency. - Updated frontend components for better user experience and performance optimizations. - Documented changes in update log for future reference.
This commit is contained in:
36
_edit_client.py
Normal file
36
_edit_client.py
Normal file
@@ -0,0 +1,36 @@
|
||||
from pathlib import Path
|
||||
import re
|
||||
p=Path(r'd:/Projects/Dev/ThreatHunt/frontend/src/api/client.ts')
|
||||
t=p.read_text(encoding='utf-8')
|
||||
# Add HuntProgress interface after Hunt interface
|
||||
if 'export interface HuntProgress' not in t:
|
||||
insert = '''export interface HuntProgress {
|
||||
hunt_id: string;
|
||||
status: 'idle' | 'processing' | 'ready';
|
||||
progress_percent: number;
|
||||
dataset_total: number;
|
||||
dataset_completed: number;
|
||||
dataset_processing: number;
|
||||
dataset_errors: number;
|
||||
active_jobs: number;
|
||||
queued_jobs: number;
|
||||
network_status: 'none' | 'building' | 'ready';
|
||||
stages: Record<string, any>;
|
||||
}
|
||||
|
||||
'''
|
||||
t=t.replace('export interface Hunt {\n id: string; name: string; description: string | null; status: string;\n owner_id: string | null; created_at: string; updated_at: string;\n dataset_count: number; hypothesis_count: number;\n}\n\n', 'export interface Hunt {\n id: string; name: string; description: string | null; status: string;\n owner_id: string | null; created_at: string; updated_at: string;\n dataset_count: number; hypothesis_count: number;\n}\n\n'+insert)
|
||||
|
||||
# Add hunts.progress method
|
||||
if 'progress: (id: string)' not in t:
|
||||
t=t.replace(" delete: (id: string) => api(`/api/hunts/${id}`, { method: 'DELETE' }),\n};", " delete: (id: string) => api(`/api/hunts/${id}`, { method: 'DELETE' }),\n progress: (id: string) => api<HuntProgress>(`/api/hunts/${id}/progress`),\n};")
|
||||
|
||||
# Extend ScanResponse
|
||||
if 'cache_used?: boolean' not in t:
|
||||
t=t.replace('export interface ScanResponse {\n total_hits: number; hits: ScanHit[]; themes_scanned: number;\n keywords_scanned: number; rows_scanned: number;\n}\n', 'export interface ScanResponse {\n total_hits: number; hits: ScanHit[]; themes_scanned: number;\n keywords_scanned: number; rows_scanned: number;\n cache_used?: boolean; cache_status?: string; cached_at?: string | null;\n}\n')
|
||||
|
||||
# Extend keywords.scan opts
|
||||
t=t.replace(' scan_hunts?: boolean; scan_annotations?: boolean; scan_messages?: boolean;\n }) =>', ' scan_hunts?: boolean; scan_annotations?: boolean; scan_messages?: boolean;\n prefer_cache?: boolean; force_rescan?: boolean;\n }) =>')
|
||||
|
||||
p.write_text(t,encoding='utf-8')
|
||||
print('updated client.ts')
|
||||
Reference in New Issue
Block a user