File size: 5,040 Bytes
c8d30bc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | <!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="ThreatHunter Checkpoint Dashboard β Pipeline ε―θ§ζΈ¬ζ§ε―©θ¨ε葨ζΏ" />
<title>ThreatHunter β Checkpoint Dashboard</title>
<link rel="stylesheet" href="/static/style.css" />
<link rel="stylesheet" href="/static/checkpoint.css" />
</head>
<body>
<div id="app">
<!-- ββ Header ββββββββββββββββββββββββββββββββββββββββ -->
<header class="th-header">
<span class="th-logo">π‘οΈ</span>
<div>
<div class="th-title">ThreatHunter <span class="cp-badge">CHECKPOINT</span></div>
<div class="th-subtitle">PIPELINE OBSERVABILITY DASHBOARD</div>
</div>
<nav class="cp-nav">
<a href="/" class="cp-nav-link">β Main Dashboard</a>
</nav>
</header>
<main class="cp-main">
<!-- ββ Scan Selector Bar ββββββββββββββββββββββββββββββ -->
<div class="cp-toolbar">
<div class="cp-toolbar-left">
<label class="cp-label">ζζη΄ι</label>
<select id="scanSelector" class="cp-select" style="min-width:420px">
<option value="">Loading scans...</option>
</select>
<button id="refreshBtn" class="cp-btn cp-btn-ghost" title="Refresh">β³</button>
</div>
<div class="cp-toolbar-right">
<div class="cp-filter-group">
<label class="cp-label">EVENT</label>
<select id="eventFilter" class="cp-select cp-select-sm">
<option value="">All Events</option>
<option value="SCAN_START">SCAN_START</option>
<option value="SCAN_END">SCAN_END</option>
<option value="STAGE_ENTER">STAGE_ENTER</option>
<option value="STAGE_EXIT">STAGE_EXIT</option>
<option value="LLM_CALL">LLM_CALL</option>
<option value="LLM_RESULT">LLM_RESULT</option>
<option value="LLM_RETRY">LLM_RETRY</option>
<option value="LLM_ERROR">LLM_ERROR</option>
<option value="TOOL_CALL">TOOL_CALL</option>
<option value="HARNESS_CHECK">HARNESS_CHECK</option>
<option value="DEGRADATION">DEGRADATION</option>
</select>
</div>
<div class="cp-filter-group">
<label class="cp-label">AGENT</label>
<select id="agentFilter" class="cp-select cp-select-sm">
<option value="">All Agents</option>
</select>
</div>
<div class="cp-filter-group">
<label class="cp-label">SEARCH</label>
<input id="searchInput" class="cp-input" type="text" placeholder="Search..." />
</div>
</div>
</div>
<!-- ββ Stats Row ββββββββββββββββββββββββββββββββββββββ -->
<div class="cp-stats-row">
<div class="cp-stat-card" id="statTotal">
<div class="cp-stat-value">β</div>
<div class="cp-stat-label">TOTAL EVENTS</div>
</div>
<div class="cp-stat-card cp-stat-llm" id="statLLM">
<div class="cp-stat-value">β</div>
<div class="cp-stat-label">LLM CALLS</div>
</div>
<div class="cp-stat-card cp-stat-error" id="statErrors">
<div class="cp-stat-value">β</div>
<div class="cp-stat-label">ERRORS / RETRIES</div>
</div>
<div class="cp-stat-card cp-stat-duration" id="statDuration">
<div class="cp-stat-value">β</div>
<div class="cp-stat-label">DURATION</div>
</div>
<div class="cp-stat-card cp-stat-agents" id="statAgents">
<div class="cp-stat-value">β</div>
<div class="cp-stat-label">AGENTS</div>
</div>
</div>
<!-- ββ Timeline βββββββββββββββββββββββββββββββββββββββ -->
<div class="cp-timeline-container">
<div class="cp-timeline-header">
<span class="section-title">βΈ EVENT TIMELINE</span>
<span id="filteredCount" class="cp-filtered-count"></span>
</div>
<div id="timeline" class="cp-timeline">
<div class="cp-empty-state">
<div class="cp-empty-icon">π‘</div>
<div class="cp-empty-text">Select a scan file to view checkpoint events</div>
</div>
</div>
</div>
<!-- ββ Detail Panel (hidden by default) βββββββββββββββ -->
<div id="detailPanel" class="cp-detail-panel cp-hidden">
<div class="cp-detail-header">
<span class="cp-detail-title" id="detailTitle">Event Detail</span>
<button id="closeDetail" class="cp-btn cp-btn-ghost">β</button>
</div>
<div id="detailContent" class="cp-detail-content"></div>
</div>
</main>
</div>
<script src="/static/checkpoint.js"></script>
</body>
</html>
|