averecion-lite 1.5.0 → 1.5.2

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.
@@ -345,15 +345,38 @@ body {
345
345
  }
346
346
 
347
347
  .dash-main {
348
- max-width: 800px;
348
+ max-width: 1400px;
349
349
  margin: 0 auto;
350
350
  padding: 2rem;
351
351
  }
352
352
 
353
+ .dash-columns {
354
+ display: grid;
355
+ grid-template-columns: 1fr 1fr;
356
+ gap: 2rem;
357
+ margin-top: 1rem;
358
+ }
359
+
360
+ .dash-col-left,
361
+ .dash-col-right {
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: 0;
365
+ }
366
+
353
367
  .dash-main section {
354
368
  margin-bottom: 2rem;
355
369
  }
356
370
 
371
+ @media (max-width: 1024px) {
372
+ .dash-columns {
373
+ grid-template-columns: 1fr;
374
+ }
375
+ .dash-main {
376
+ max-width: 800px;
377
+ }
378
+ }
379
+
357
380
  .dash-main h2 {
358
381
  font-size: 1.25rem;
359
382
  margin-bottom: 1rem;
@@ -1140,10 +1163,14 @@ body {
1140
1163
  .security-arch-grid {
1141
1164
  display: grid;
1142
1165
  grid-template-columns: repeat(2, 1fr);
1143
- gap: 1rem;
1166
+ gap: 0.75rem;
1144
1167
  margin-top: 1rem;
1145
1168
  }
1146
1169
 
1170
+ .dash-col-right .security-arch-grid {
1171
+ grid-template-columns: 1fr;
1172
+ }
1173
+
1147
1174
  .arch-item {
1148
1175
  background: var(--bg-card);
1149
1176
  border: 1px solid var(--border);
@@ -1271,13 +1298,48 @@ body {
1271
1298
  .threat-summary-badge.low { background: rgba(96, 165, 250, 0.2); color: #60a5fa; }
1272
1299
  .threat-summary-badge.passed { background: rgba(34, 197, 94, 0.2); color: var(--success); }
1273
1300
 
1301
+ .threat-findings-toggle {
1302
+ display: flex;
1303
+ align-items: center;
1304
+ gap: 0.5rem;
1305
+ margin-top: 0.75rem;
1306
+ padding: 0.5rem 0.75rem;
1307
+ background: var(--bg-card);
1308
+ border: 1px solid var(--border);
1309
+ border-radius: 8px;
1310
+ cursor: pointer;
1311
+ color: var(--text-secondary);
1312
+ font-size: 0.8rem;
1313
+ transition: all 0.2s;
1314
+ width: 100%;
1315
+ text-align: left;
1316
+ }
1317
+
1318
+ .threat-findings-toggle:hover {
1319
+ border-color: var(--primary, #7c3aed);
1320
+ color: var(--text-primary);
1321
+ }
1322
+
1323
+ .threat-findings-toggle .toggle-arrow {
1324
+ transition: transform 0.2s;
1325
+ font-size: 0.7rem;
1326
+ }
1327
+
1328
+ .threat-findings-toggle.expanded .toggle-arrow {
1329
+ transform: rotate(90deg);
1330
+ }
1331
+
1274
1332
  .threat-findings {
1275
- margin-top: 1rem;
1333
+ margin-top: 0.5rem;
1276
1334
  display: flex;
1277
1335
  flex-direction: column;
1278
1336
  gap: 0.5rem;
1279
1337
  }
1280
1338
 
1339
+ .threat-findings.collapsed {
1340
+ display: none;
1341
+ }
1342
+
1281
1343
  .threat-finding {
1282
1344
  background: var(--bg-card);
1283
1345
  border: 1px solid var(--border);
package/dashboard/dash.js CHANGED
@@ -977,7 +977,6 @@
977
977
 
978
978
  function renderThreatResults(data, scoreDisplay, findingsEl) {
979
979
  scoreDisplay.classList.remove("hidden");
980
- findingsEl.classList.remove("hidden");
981
980
 
982
981
  const gradeEl = document.getElementById("threat-grade");
983
982
  const scoreVal = document.getElementById("threat-score-value");
@@ -998,6 +997,30 @@
998
997
  const failed = data.findings.filter(f => !f.passed);
999
998
  const passed = data.findings.filter(f => f.passed);
1000
999
  const sorted = [...failed, ...passed];
1000
+ const failCount = failed.length;
1001
+
1002
+ let existingToggle = document.querySelector(".threat-findings-toggle");
1003
+ if (!existingToggle) {
1004
+ existingToggle = document.createElement("button");
1005
+ existingToggle.className = "threat-findings-toggle";
1006
+ existingToggle.setAttribute("data-testid", "btn-findings-toggle");
1007
+ findingsEl.parentNode.insertBefore(existingToggle, findingsEl);
1008
+ existingToggle.addEventListener("click", () => {
1009
+ const isCollapsed = findingsEl.classList.contains("collapsed");
1010
+ if (isCollapsed) {
1011
+ findingsEl.classList.remove("collapsed");
1012
+ existingToggle.classList.add("expanded");
1013
+ } else {
1014
+ findingsEl.classList.add("collapsed");
1015
+ existingToggle.classList.remove("expanded");
1016
+ }
1017
+ existingToggle.querySelector(".toggle-label").textContent =
1018
+ findingsEl.classList.contains("collapsed") ? `Show ${data.findings.length} findings (${failCount} issues)` : "Hide findings";
1019
+ });
1020
+ }
1021
+ existingToggle.innerHTML = `<span class="toggle-arrow">▶</span> <span class="toggle-label">Show ${data.findings.length} findings (${failCount} issues)</span>`;
1022
+ findingsEl.classList.add("collapsed");
1023
+ existingToggle.classList.remove("expanded");
1001
1024
 
1002
1025
  findingsEl.innerHTML = sorted.map(f => {
1003
1026
  const sevIcon = f.passed ? "✓" : (f.severity === "critical" ? "!!" : f.severity === "high" ? "!" : f.severity === "medium" ? "~" : "·");
@@ -148,200 +148,206 @@
148
148
  </div>
149
149
  </section>
150
150
 
151
- <section class="protection-section">
152
- <div class="protection-score" data-testid="protection-score">
153
- <div class="score-header">
154
- <span class="score-value" id="score-value">4/4</span>
155
- <span class="score-label">Protection Score</span>
156
- </div>
157
- <div class="score-bars">
158
- <div class="score-bar active" id="bar-local" data-tooltip="Dashboard only accessible from your computer">
159
- <span class="bar-icon">🏠</span>
160
- <span class="bar-label">Local Only</span>
161
- </div>
162
- <div class="score-bar active" id="bar-secret" data-tooltip="Your dashboard is protected by a secret key">
163
- <span class="bar-icon">🔑</span>
164
- <span class="bar-label">Secret Key</span>
165
- </div>
166
- <div class="score-bar active" id="bar-injection" data-tooltip="Detecting prompt injection attempts in real-time">
167
- <span class="bar-icon">🛡️</span>
168
- <span class="bar-label">Injection Detection</span>
169
- </div>
170
- <div class="score-bar active" id="bar-approval" data-tooltip="Real-time visibility into all agent activity">
171
- <span class="bar-icon">👁️</span>
172
- <span class="bar-label">Live Monitoring</span>
151
+ <div class="dash-columns">
152
+ <div class="dash-col-left">
153
+ <section class="bot-section">
154
+ <h2>Activity Summary</h2>
155
+ <div class="bot-card" data-testid="card-bot">
156
+ <div class="bot-avatar">🛡️</div>
157
+ <div class="bot-info">
158
+ <div class="bot-name">Clawguard</div>
159
+ <div class="bot-status online" id="clawguard-status">● Active</div>
160
+ </div>
161
+ <div class="bot-stats">
162
+ <div class="stat">
163
+ <span class="stat-value" id="stat-approved">0</span>
164
+ <span class="stat-label">Monitored</span>
165
+ </div>
166
+ <div class="stat">
167
+ <span class="stat-value warning" id="stat-blocked">0</span>
168
+ <span class="stat-label">Flagged</span>
169
+ </div>
170
+ <div class="stat">
171
+ <span class="stat-value attack" id="stat-manual">0</span>
172
+ <span class="stat-label">Attacks</span>
173
+ </div>
174
+ </div>
173
175
  </div>
174
- </div>
175
- </div>
176
- </section>
177
-
178
- <section class="safety-section">
179
- <h2>Safety Checks</h2>
180
- <div class="safety-grid">
181
- <div class="safety-item pass" id="check-local" data-testid="check-local">
182
- <span class="check-icon">✓</span>
183
- <span>Dashboard is local-only</span>
184
- <span class="legend-help" data-tooltip="Only you can see this dashboard - no remote access">?</span>
185
- </div>
186
- <div class="safety-item pass" id="check-secret" data-testid="check-secret">
187
- <span class="check-icon">✓</span>
188
- <span>Secret key protected</span>
189
- <span class="legend-help" data-tooltip="Your dashboard is locked with a secret key">?</span>
190
- </div>
191
- <div class="safety-item pass" id="check-injection" data-testid="check-injection">
192
- <span class="check-icon">✓</span>
193
- <span>Prompt injection detection active</span>
194
- <span class="legend-help" data-tooltip="Detecting hidden attack instructions in real-time">?</span>
195
- </div>
196
- </div>
197
- </section>
198
-
199
- <section class="security-arch-section">
200
- <h2>Dashboard Security <span class="legend-help" data-tooltip="Why your bot can never access or tamper with this dashboard">?</span></h2>
201
- <div class="security-arch-grid">
202
- <div class="arch-item">
203
- <div class="arch-icon">🔒</div>
204
- <div class="arch-title">Local-Only Binding</div>
205
- <div class="arch-desc">Dashboard listens on localhost only. No external network can reach it — even if your server is public.</div>
206
- </div>
207
- <div class="arch-item">
208
- <div class="arch-icon">🔑</div>
209
- <div class="arch-title">Secret Key Auth</div>
210
- <div class="arch-desc">Every request requires a secret key your bot never sees. Even local processes can't access data without it.</div>
211
- </div>
212
- <div class="arch-item">
213
- <div class="arch-icon">👁️</div>
214
- <div class="arch-title">Passive Monitoring</div>
215
- <div class="arch-desc">Clawguard only reads log files — it never writes to the bot, sends commands, or modifies any configuration.</div>
216
- </div>
217
- <div class="arch-item">
218
- <div class="arch-icon">🚫</div>
219
- <div class="arch-title">No Write-Back Path</div>
220
- <div class="arch-desc">There is no API, socket, or channel from the dashboard back to your bot. The connection is strictly one-way.</div>
221
- </div>
222
- </div>
223
- </section>
176
+ </section>
224
177
 
225
- <section class="threat-section" id="threat-section">
226
- <h2>Threat Assessment <span class="legend-help" data-tooltip="Holistic security scan of your server">?</span></h2>
227
- <div class="threat-header" id="threat-header">
228
- <button class="threat-scan-btn" id="btn-scan" data-testid="btn-scan">🔍 Run Security Scan</button>
229
- <div class="threat-score-display hidden" id="threat-score-display">
230
- <div class="threat-grade" id="threat-grade">-</div>
231
- <div class="threat-score-info">
232
- <span class="threat-score-value" id="threat-score-value">-/100</span>
233
- <span class="threat-score-label">Security Score</span>
178
+ <!-- Approvals section hidden in lite monitoring mode -->
179
+ <section class="approvals-section" id="approvals-section" style="display: none;">
180
+ <h2>Flagged for Review <span class="approval-count" id="approval-count">0</span></h2>
181
+ <div class="approvals-list" id="approvals-list" data-testid="list-approvals">
234
182
  </div>
235
- <div class="threat-summary" id="threat-summary"></div>
236
- </div>
237
- </div>
238
- <div class="threat-findings hidden" id="threat-findings" data-testid="threat-findings"></div>
239
- </section>
183
+ </section>
240
184
 
241
- <section class="extensions-section">
242
- <h2>ClawdBot Extensions <span class="extension-count" id="extension-count">0</span></h2>
243
- <div class="extensions-grid" id="extensions-grid" data-testid="grid-extensions">
244
- <div class="extension-card" data-type="skills">
245
- <div class="ext-icon">🎯</div>
246
- <div class="ext-info">
247
- <div class="ext-name">Skills</div>
248
- <div class="ext-status" id="skills-status">Not configured</div>
249
- </div>
250
- <div class="ext-count" id="skills-count">0</div>
251
- </div>
252
- <div class="extension-card" data-type="tools">
253
- <div class="ext-icon">🔧</div>
254
- <div class="ext-info">
255
- <div class="ext-name">MCP Tools</div>
256
- <div class="ext-status" id="tools-status">Not configured</div>
257
- </div>
258
- <div class="ext-count" id="tools-count">0</div>
259
- </div>
260
- <div class="extension-card" data-type="plugins">
261
- <div class="ext-icon">🔌</div>
262
- <div class="ext-info">
263
- <div class="ext-name">Plugins</div>
264
- <div class="ext-status" id="plugins-status">Not configured</div>
185
+ <section class="activity-section">
186
+ <h2>Recent Activity</h2>
187
+ <div class="activity-list" id="activity-list" data-testid="list-activity">
188
+ <div class="activity-empty">
189
+ <p>🦞 Your bot hasn't done anything yet. When it does, you'll see it here!</p>
190
+ </div>
265
191
  </div>
266
- <div class="ext-count" id="plugins-count">0</div>
267
- </div>
268
- <div class="extension-card" data-type="bash">
269
- <div class="ext-icon">💻</div>
270
- <div class="ext-info">
271
- <div class="ext-name">Bash/Shell</div>
272
- <div class="ext-status" id="bash-status">Monitoring</div>
192
+ </section>
193
+
194
+ <section class="chart-section">
195
+ <h2>Last 24 Hours</h2>
196
+ <div class="chart-container">
197
+ <canvas id="chart-timeline" height="120"></canvas>
273
198
  </div>
274
- <div class="ext-count" id="bash-count">✓</div>
275
- </div>
199
+ </section>
276
200
  </div>
277
- </section>
278
201
 
279
- <section class="bot-section">
280
- <h2>Activity Summary</h2>
281
- <div class="bot-card" data-testid="card-bot">
282
- <div class="bot-avatar">🛡️</div>
283
- <div class="bot-info">
284
- <div class="bot-name">Clawguard</div>
285
- <div class="bot-status online" id="clawguard-status">● Active</div>
286
- </div>
287
- <div class="bot-stats">
288
- <div class="stat">
289
- <span class="stat-value" id="stat-approved">0</span>
290
- <span class="stat-label">Monitored</span>
291
- </div>
292
- <div class="stat">
293
- <span class="stat-value warning" id="stat-blocked">0</span>
294
- <span class="stat-label">Flagged</span>
202
+ <div class="dash-col-right">
203
+ <section class="protection-section">
204
+ <div class="protection-score" data-testid="protection-score">
205
+ <div class="score-header">
206
+ <span class="score-value" id="score-value">4/4</span>
207
+ <span class="score-label">Protection Score</span>
208
+ </div>
209
+ <div class="score-bars">
210
+ <div class="score-bar active" id="bar-local" data-tooltip="Dashboard only accessible from your computer">
211
+ <span class="bar-icon">🏠</span>
212
+ <span class="bar-label">Local Only</span>
213
+ </div>
214
+ <div class="score-bar active" id="bar-secret" data-tooltip="Your dashboard is protected by a secret key">
215
+ <span class="bar-icon">🔑</span>
216
+ <span class="bar-label">Secret Key</span>
217
+ </div>
218
+ <div class="score-bar active" id="bar-injection" data-tooltip="Detecting prompt injection attempts in real-time">
219
+ <span class="bar-icon">🛡️</span>
220
+ <span class="bar-label">Injection Detection</span>
221
+ </div>
222
+ <div class="score-bar active" id="bar-approval" data-tooltip="Real-time visibility into all agent activity">
223
+ <span class="bar-icon">👁️</span>
224
+ <span class="bar-label">Live Monitoring</span>
225
+ </div>
226
+ </div>
295
227
  </div>
296
- <div class="stat">
297
- <span class="stat-value attack" id="stat-manual">0</span>
298
- <span class="stat-label">Attacks</span>
228
+ </section>
229
+
230
+ <section class="safety-section">
231
+ <h2>Safety Checks</h2>
232
+ <div class="safety-grid">
233
+ <div class="safety-item pass" id="check-local" data-testid="check-local">
234
+ <span class="check-icon">✓</span>
235
+ <span>Dashboard is local-only</span>
236
+ <span class="legend-help" data-tooltip="Only you can see this dashboard - no remote access">?</span>
237
+ </div>
238
+ <div class="safety-item pass" id="check-secret" data-testid="check-secret">
239
+ <span class="check-icon">✓</span>
240
+ <span>Secret key protected</span>
241
+ <span class="legend-help" data-tooltip="Your dashboard is locked with a secret key">?</span>
242
+ </div>
243
+ <div class="safety-item pass" id="check-injection" data-testid="check-injection">
244
+ <span class="check-icon">✓</span>
245
+ <span>Prompt injection detection active</span>
246
+ <span class="legend-help" data-tooltip="Detecting hidden attack instructions in real-time">?</span>
247
+ </div>
299
248
  </div>
300
- </div>
301
- </div>
302
- </section>
249
+ </section>
303
250
 
304
- <section class="control-section">
305
- <h2>Protection Level</h2>
306
- <div class="protection-toggle" data-testid="protection-toggle">
307
- <button class="toggle-btn" data-level="relaxed" data-testid="toggle-relaxed">
308
- <span class="toggle-emoji">😊</span>
309
- <span class="toggle-name">Relaxed</span>
310
- </button>
311
- <button class="toggle-btn active" data-level="balanced" data-testid="toggle-balanced">
312
- <span class="toggle-emoji">⚖️</span>
313
- <span class="toggle-name">Balanced</span>
314
- </button>
315
- <button class="toggle-btn" data-level="strict" data-testid="toggle-strict">
316
- <span class="toggle-emoji">🔒</span>
317
- <span class="toggle-name">Strict</span>
318
- </button>
319
- </div>
320
- <p class="control-hint" id="level-hint">Flag risky actions for review</p>
321
- </section>
251
+ <section class="security-arch-section">
252
+ <h2>Dashboard Security <span class="legend-help" data-tooltip="Why your bot can never access or tamper with this dashboard">?</span></h2>
253
+ <div class="security-arch-grid">
254
+ <div class="arch-item">
255
+ <div class="arch-icon">🔒</div>
256
+ <div class="arch-title">Local-Only Binding</div>
257
+ <div class="arch-desc">Dashboard listens on localhost only. No external network can reach it — even if your server is public.</div>
258
+ </div>
259
+ <div class="arch-item">
260
+ <div class="arch-icon">🔑</div>
261
+ <div class="arch-title">Secret Key Auth</div>
262
+ <div class="arch-desc">Every request requires a secret key your bot never sees. Even local processes can't access data without it.</div>
263
+ </div>
264
+ <div class="arch-item">
265
+ <div class="arch-icon">👁️</div>
266
+ <div class="arch-title">Passive Monitoring</div>
267
+ <div class="arch-desc">Clawguard only reads log files — it never writes to the bot, sends commands, or modifies any configuration.</div>
268
+ </div>
269
+ <div class="arch-item">
270
+ <div class="arch-icon">🚫</div>
271
+ <div class="arch-title">No Write-Back Path</div>
272
+ <div class="arch-desc">There is no API, socket, or channel from the dashboard back to your bot. The connection is strictly one-way.</div>
273
+ </div>
274
+ </div>
275
+ </section>
322
276
 
323
- <!-- Approvals section hidden in lite monitoring mode -->
324
- <section class="approvals-section" id="approvals-section" style="display: none;">
325
- <h2>Flagged for Review <span class="approval-count" id="approval-count">0</span></h2>
326
- <div class="approvals-list" id="approvals-list" data-testid="list-approvals">
327
- </div>
328
- </section>
277
+ <section class="threat-section" id="threat-section">
278
+ <h2>Threat Assessment <span class="legend-help" data-tooltip="Holistic security scan of your server">?</span></h2>
279
+ <div class="threat-header" id="threat-header">
280
+ <button class="threat-scan-btn" id="btn-scan" data-testid="btn-scan">🔍 Run Security Scan</button>
281
+ <div class="threat-score-display hidden" id="threat-score-display">
282
+ <div class="threat-grade" id="threat-grade">-</div>
283
+ <div class="threat-score-info">
284
+ <span class="threat-score-value" id="threat-score-value">-/100</span>
285
+ <span class="threat-score-label">Security Score</span>
286
+ </div>
287
+ <div class="threat-summary" id="threat-summary"></div>
288
+ </div>
289
+ </div>
290
+ <div class="threat-findings collapsed" id="threat-findings" data-testid="threat-findings"></div>
291
+ </section>
329
292
 
330
- <section class="activity-section">
331
- <h2>Recent Activity</h2>
332
- <div class="activity-list" id="activity-list" data-testid="list-activity">
333
- <div class="activity-empty">
334
- <p>🦞 Your bot hasn't done anything yet. When it does, you'll see it here!</p>
335
- </div>
336
- </div>
337
- </section>
293
+ <section class="control-section">
294
+ <h2>Protection Level</h2>
295
+ <div class="protection-toggle" data-testid="protection-toggle">
296
+ <button class="toggle-btn" data-level="relaxed" data-testid="toggle-relaxed">
297
+ <span class="toggle-emoji">😊</span>
298
+ <span class="toggle-name">Relaxed</span>
299
+ </button>
300
+ <button class="toggle-btn active" data-level="balanced" data-testid="toggle-balanced">
301
+ <span class="toggle-emoji">⚖️</span>
302
+ <span class="toggle-name">Balanced</span>
303
+ </button>
304
+ <button class="toggle-btn" data-level="strict" data-testid="toggle-strict">
305
+ <span class="toggle-emoji">🔒</span>
306
+ <span class="toggle-name">Strict</span>
307
+ </button>
308
+ </div>
309
+ <p class="control-hint" id="level-hint">Flag risky actions for review</p>
310
+ </section>
338
311
 
339
- <section class="chart-section">
340
- <h2>Last 24 Hours</h2>
341
- <div class="chart-container">
342
- <canvas id="chart-timeline" height="120"></canvas>
312
+ <section class="extensions-section">
313
+ <h2>ClawdBot Extensions <span class="extension-count" id="extension-count">0</span></h2>
314
+ <div class="extensions-grid" id="extensions-grid" data-testid="grid-extensions">
315
+ <div class="extension-card" data-type="skills">
316
+ <div class="ext-icon">🎯</div>
317
+ <div class="ext-info">
318
+ <div class="ext-name">Skills</div>
319
+ <div class="ext-status" id="skills-status">Not configured</div>
320
+ </div>
321
+ <div class="ext-count" id="skills-count">0</div>
322
+ </div>
323
+ <div class="extension-card" data-type="tools">
324
+ <div class="ext-icon">🔧</div>
325
+ <div class="ext-info">
326
+ <div class="ext-name">MCP Tools</div>
327
+ <div class="ext-status" id="tools-status">Not configured</div>
328
+ </div>
329
+ <div class="ext-count" id="tools-count">0</div>
330
+ </div>
331
+ <div class="extension-card" data-type="plugins">
332
+ <div class="ext-icon">🔌</div>
333
+ <div class="ext-info">
334
+ <div class="ext-name">Plugins</div>
335
+ <div class="ext-status" id="plugins-status">Not configured</div>
336
+ </div>
337
+ <div class="ext-count" id="plugins-count">0</div>
338
+ </div>
339
+ <div class="extension-card" data-type="bash">
340
+ <div class="ext-icon">💻</div>
341
+ <div class="ext-info">
342
+ <div class="ext-name">Bash/Shell</div>
343
+ <div class="ext-status" id="bash-status">Monitoring</div>
344
+ </div>
345
+ <div class="ext-count" id="bash-count">✓</div>
346
+ </div>
347
+ </div>
348
+ </section>
343
349
  </div>
344
- </section>
350
+ </div>
345
351
  </main>
346
352
 
347
353
  <footer class="dash-footer">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "averecion-lite",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "Real-time AI agent monitoring - watches logs, detects dangerous commands and prompt injection attempts",
5
5
  "author": "Averecion <hello@averecion.com>",
6
6
  "homepage": "https://github.com/averecion/clawguard#readme",