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:
2026-02-23 14:35:49 -05:00
parent 5a2ad8ec1c
commit 13bd9ec9e0
4 changed files with 31 additions and 14 deletions

26
.gitignore vendored
View File

@@ -1,4 +1,4 @@
# ── Python ──────────────────────────────────── # ── Python ────────────────────────────────────
__pycache__/ __pycache__/
*.py[cod] *.py[cod]
*$py.class *$py.class
@@ -8,34 +8,34 @@ build/
*.egg *.egg
.eggs/ .eggs/
# ── Virtual environments ───────────────────── # ── Virtual environments ─────────────────────
venv/ venv/
.venv/ .venv/
env/ env/
# ── IDE / Editor ───────────────────────────── # ── IDE / Editor ─────────────────────────────
.vscode/ .vscode/
.idea/ .idea/
*.swp *.swp
*.swo *.swo
*~ *~
# ── OS ──────────────────────────────────────── # ── OS ────────────────────────────────────────
.DS_Store .DS_Store
Thumbs.db Thumbs.db
# ── Environment / Secrets ──────────────────── # ── Environment / Secrets ────────────────────
.env .env
*.env.local *.env.local
# ── Database ───────────────────────────────── # ── Database ─────────────────────────────────
*.db *.db
*.sqlite3 *.sqlite3
# ── Uploads ────────────────────────────────── # ── Uploads ──────────────────────────────────
uploads/ uploads/
# ── Node / Frontend ────────────────────────── # ── Node / Frontend ──────────────────────────
node_modules/ node_modules/
frontend/build/ frontend/build/
frontend/.env.local frontend/.env.local
@@ -43,14 +43,18 @@ npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
# ── Docker ─────────────────────────────────── # ── Docker ───────────────────────────────────
docker-compose.override.yml docker-compose.override.yml
# ── Test / Coverage ────────────────────────── # ── Test / Coverage ──────────────────────────
.coverage .coverage
htmlcov/ htmlcov/
.pytest_cache/ .pytest_cache/
.mypy_cache/ .mypy_cache/
# ── Alembic ────────────────────────────────── # ── Alembic ──────────────────────────────────
alembic/versions/*.pyc alembic/versions/*.pyc
*.db-wal
*.db-shm

View File

@@ -196,3 +196,12 @@ async def root():
"openwebui": settings.OPENWEBUI_URL, "openwebui": settings.OPENWEBUI_URL,
}, },
} }
@app.get("/health", tags=["health"])
async def health():
return {
"service": "ThreatHunt API",
"version": settings.APP_VERSION,
"status": "ok",
}

4
scripts/dev-up.cmd Normal file
View File

@@ -0,0 +1,4 @@
@echo off
setlocal
powershell -ExecutionPolicy Bypass -File "%~dp0dev-up.ps1" %*
exit /b %errorlevel%

View File

@@ -37,11 +37,11 @@ Write-Step 'Container status'
docker compose ps docker compose ps
Write-Step 'Health checks' Write-Step 'Health checks'
$backendOk = Wait-Http200 -url 'http://localhost:8000/openapi.json' -timeoutSeconds $HealthTimeoutSeconds $backendOk = Wait-Http200 -url 'http://localhost:8000/health' -timeoutSeconds $HealthTimeoutSeconds
$frontendOk = if ($BackendOnly) { $true } else { Wait-Http200 -url 'http://localhost:3000/' -timeoutSeconds $HealthTimeoutSeconds } $frontendOk = if ($BackendOnly) { $true } else { Wait-Http200 -url 'http://localhost:3000/' -timeoutSeconds $HealthTimeoutSeconds }
if (-not $backendOk) { if (-not $backendOk) {
Write-Error 'Backend health check failed: http://localhost:8000/openapi.json did not return HTTP 200 in time.' Write-Error 'Backend health check failed: http://localhost:8000/health did not return HTTP 200 in time.'
exit 1 exit 1
} }
if (-not $frontendOk) { if (-not $frontendOk) {
@@ -50,7 +50,7 @@ if (-not $frontendOk) {
} }
Write-Step 'All good' Write-Step 'All good'
Write-Host 'Backend: http://localhost:8000/openapi.json (OK)' -ForegroundColor Green Write-Host 'Backend: http://localhost:8000/health (OK)' -ForegroundColor Green
if (-not $BackendOnly) { if (-not $BackendOnly) {
Write-Host 'Frontend: http://localhost:3000/ (OK)' -ForegroundColor Green Write-Host 'Frontend: http://localhost:3000/ (OK)' -ForegroundColor Green
} }