@roxy-agent/agents 0.1.0

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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +306 -0
  3. package/dist/approvals.js +143 -0
  4. package/dist/approvals.js.map +1 -0
  5. package/dist/classifier.js +436 -0
  6. package/dist/classifier.js.map +1 -0
  7. package/dist/dashboard/client.js +2057 -0
  8. package/dist/dashboard/client.js.map +1 -0
  9. package/dist/dashboard/html.js +57 -0
  10. package/dist/dashboard/html.js.map +1 -0
  11. package/dist/dashboard/icons.js +18 -0
  12. package/dist/dashboard/icons.js.map +1 -0
  13. package/dist/dashboard/server.js +423 -0
  14. package/dist/dashboard/server.js.map +1 -0
  15. package/dist/dashboard/styles.js +1685 -0
  16. package/dist/dashboard/styles.js.map +1 -0
  17. package/dist/dashboard.js +2 -0
  18. package/dist/dashboard.js.map +1 -0
  19. package/dist/db.js +526 -0
  20. package/dist/db.js.map +1 -0
  21. package/dist/index.js +94 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/license.js +257 -0
  24. package/dist/license.js.map +1 -0
  25. package/dist/logger.js +44 -0
  26. package/dist/logger.js.map +1 -0
  27. package/dist/ml/bash-classifier.js +121 -0
  28. package/dist/ml/bash-classifier.js.map +1 -0
  29. package/dist/ml/embedder.js +79 -0
  30. package/dist/ml/embedder.js.map +1 -0
  31. package/dist/ml/prototypes.js +707 -0
  32. package/dist/ml/prototypes.js.map +1 -0
  33. package/dist/policies.js +289 -0
  34. package/dist/policies.js.map +1 -0
  35. package/dist/slack.js +149 -0
  36. package/dist/slack.js.map +1 -0
  37. package/dist/tools/bash.js +134 -0
  38. package/dist/tools/bash.js.map +1 -0
  39. package/dist/tools/conversation.js +36 -0
  40. package/dist/tools/conversation.js.map +1 -0
  41. package/dist/tools/filesystem.js +243 -0
  42. package/dist/tools/filesystem.js.map +1 -0
  43. package/dist/tools/introspect.js +187 -0
  44. package/dist/tools/introspect.js.map +1 -0
  45. package/dist/tools/network.js +152 -0
  46. package/dist/tools/network.js.map +1 -0
  47. package/dist/tools/policies.js +107 -0
  48. package/dist/tools/policies.js.map +1 -0
  49. package/package.json +61 -0
@@ -0,0 +1,1685 @@
1
+ // Dashboard CSS. Kept as a template string because the dashboard is served
2
+ // directly by Express without a frontend build step.
3
+ export const DASHBOARD_CSS = String.raw `
4
+ @font-face {
5
+ font-family: 'Geist';
6
+ src: url('/static/fonts/geist-sans/Geist-Variable.woff2') format('woff2');
7
+ font-weight: 100 900;
8
+ font-style: normal;
9
+ font-display: swap;
10
+ }
11
+ @font-face {
12
+ font-family: 'Geist Mono';
13
+ src: url('/static/fonts/geist-mono/GeistMono-Variable.woff2') format('woff2');
14
+ font-weight: 100 900;
15
+ font-style: normal;
16
+ font-display: swap;
17
+ }
18
+
19
+ :root {
20
+ --bg: #fbfbfa;
21
+ --surface: #ffffff;
22
+ --surface-2: #f6f6f5;
23
+ --line: #ececea;
24
+ --line-2: #dcdcd9;
25
+ --text: #16181d;
26
+ --muted: #6b6f76;
27
+ --dim: #9aa0a6;
28
+
29
+ --accent: #16181d;
30
+ --accent-on: #ffffff;
31
+
32
+ --green: #2f8f5b;
33
+ --amber: #b16a1a;
34
+ --red: #c0392b;
35
+
36
+ --sans: 'Geist', -apple-system, system-ui, sans-serif;
37
+ --mono: 'Geist Mono', 'SF Mono', Menlo, monospace;
38
+
39
+ --radius: 2px;
40
+
41
+ --rail: 200px;
42
+ }
43
+
44
+ * { box-sizing: border-box; margin: 0; padding: 0; }
45
+
46
+ html, body { background: var(--bg); }
47
+ body {
48
+ color: var(--text);
49
+ font-family: var(--sans);
50
+ font-size: 13.5px;
51
+ line-height: 1.5;
52
+ -webkit-font-smoothing: antialiased;
53
+ min-height: 100vh;
54
+ }
55
+
56
+ ::selection { background: rgba(22,24,29,0.14); color: var(--text); }
57
+
58
+ a, button { font-family: inherit; cursor: pointer; }
59
+ a { color: inherit; text-decoration: none; }
60
+ input, textarea, select, button { font: inherit; color: inherit; }
61
+ input, textarea, select { background: transparent; border: 0; outline: 0; }
62
+
63
+ .svg-icon {
64
+ display: inline-block;
65
+ width: 14px;
66
+ height: 14px;
67
+ flex: 0 0 auto;
68
+ vertical-align: -0.16em;
69
+ }
70
+
71
+ /* ── Sidebar ─────────────────────────────────────────────────────────── */
72
+ .appbar {
73
+ position: fixed;
74
+ inset: 0 auto 0 0;
75
+ width: var(--rail);
76
+ height: 100vh;
77
+ background: var(--bg);
78
+ border-right: 1px solid var(--line);
79
+ display: flex;
80
+ flex-direction: column;
81
+ z-index: 20;
82
+ padding: 18px 12px;
83
+ }
84
+ .brand {
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 8px;
88
+ padding: 4px 8px 18px;
89
+ user-select: none;
90
+ }
91
+ .brand .logo { display: inline-flex; color: var(--text); }
92
+ .brand .logo .svg-icon { width: 16px; height: 16px; }
93
+ .brand .name {
94
+ font-size: 14px;
95
+ font-weight: 600;
96
+ letter-spacing: -0.01em;
97
+ color: var(--text);
98
+ }
99
+ .brand .name .dim { color: var(--dim); font-weight: 400; margin: 0 1px; }
100
+
101
+ nav.tabs {
102
+ display: flex;
103
+ flex-direction: column;
104
+ gap: 1px;
105
+ }
106
+ nav.tabs.sidebar-foot {
107
+ padding-top: 12px;
108
+ border-top: 1px solid var(--line);
109
+ }
110
+ .sidebar-usage {
111
+ display: block;
112
+ margin-top: auto;
113
+ padding: 10px;
114
+ border: 1px solid var(--line);
115
+ border-radius: 2px;
116
+ background: var(--surface);
117
+ color: inherit;
118
+ text-decoration: none;
119
+ transition: border-color 100ms, background 100ms;
120
+ }
121
+ .sidebar-usage[hidden] { display: none; }
122
+ .sidebar-usage:hover { border-color: var(--line-2); background: var(--surface-2); }
123
+ .sidebar-usage .label {
124
+ display: flex;
125
+ justify-content: space-between;
126
+ align-items: baseline;
127
+ font-size: 10.5px;
128
+ font-family: var(--mono);
129
+ color: var(--dim);
130
+ margin-bottom: 6px;
131
+ }
132
+ .sidebar-usage .label .plan { color: var(--text); text-transform: capitalize; }
133
+ .sidebar-usage .num {
134
+ font-size: 13px;
135
+ font-weight: 550;
136
+ color: var(--text);
137
+ font-feature-settings: 'tnum';
138
+ margin-bottom: 6px;
139
+ letter-spacing: -0.01em;
140
+ }
141
+ .sidebar-usage .num .of { color: var(--dim); font-weight: 400; }
142
+ .sidebar-usage .bar {
143
+ height: 4px;
144
+ background: var(--surface-2);
145
+ border-radius: 2px;
146
+ overflow: hidden;
147
+ }
148
+ .sidebar-usage .bar > span {
149
+ display: block;
150
+ height: 100%;
151
+ background: var(--accent);
152
+ transition: width 200ms ease;
153
+ }
154
+ .sidebar-usage.warn .bar > span { background: var(--amber); }
155
+ .sidebar-usage.over .bar > span { background: var(--red); }
156
+ .sidebar-usage.over .num { color: var(--red); }
157
+ nav.tabs a {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 9px;
161
+ padding: 7px 10px;
162
+ font-size: 13px;
163
+ font-weight: 450;
164
+ color: var(--muted);
165
+ border-radius: 2px;
166
+ transition: color 100ms, background 100ms;
167
+ }
168
+ nav.tabs a .nav-icon { color: var(--dim); }
169
+ nav.tabs a:hover { color: var(--text); background: var(--surface-2); }
170
+ nav.tabs a:hover .nav-icon { color: var(--text); }
171
+ nav.tabs a.active {
172
+ color: var(--text);
173
+ background: var(--surface-2);
174
+ font-weight: 500;
175
+ }
176
+ nav.tabs a.active .nav-icon { color: var(--text); }
177
+ nav.tabs a .nav-badge {
178
+ margin-left: auto;
179
+ font-family: var(--mono);
180
+ font-size: 10px;
181
+ font-weight: 600;
182
+ letter-spacing: 0.02em;
183
+ background: var(--amber);
184
+ color: #fff;
185
+ border-radius: 999px;
186
+ padding: 1px 6px;
187
+ line-height: 1.5;
188
+ }
189
+
190
+ /* ── Layout ──────────────────────────────────────────────────────────── */
191
+ .page {
192
+ margin-left: var(--rail);
193
+ padding: 28px 36px 64px;
194
+ }
195
+
196
+ .page-head {
197
+ display: flex;
198
+ align-items: baseline;
199
+ justify-content: space-between;
200
+ gap: 20px;
201
+ margin-bottom: 22px;
202
+ }
203
+ .page-head h1 {
204
+ font-size: 22px;
205
+ font-weight: 600;
206
+ letter-spacing: -0.02em;
207
+ color: var(--text);
208
+ }
209
+ .page-head .subtitle { display: none; }
210
+ .page-head .actions {
211
+ display: inline-flex;
212
+ align-items: center;
213
+ gap: 10px;
214
+ font-family: var(--mono);
215
+ font-size: 11px;
216
+ color: var(--dim);
217
+ }
218
+ .page-head .actions .muted-stat {
219
+ font-family: var(--mono);
220
+ font-size: 11px;
221
+ color: var(--muted);
222
+ }
223
+
224
+ /* ── Range picker ────────────────────────────────────────────────────── */
225
+ .range-picker {
226
+ display: inline-flex;
227
+ align-items: stretch;
228
+ border: 1px solid var(--line);
229
+ border-radius: var(--radius);
230
+ background: var(--surface);
231
+ overflow: hidden;
232
+ height: 28px;
233
+ }
234
+ .range-pill {
235
+ appearance: none;
236
+ border: 0;
237
+ background: transparent;
238
+ color: var(--muted);
239
+ font-family: var(--mono);
240
+ font-size: 11px;
241
+ font-weight: 500;
242
+ letter-spacing: 0.02em;
243
+ padding: 0 10px;
244
+ cursor: pointer;
245
+ border-right: 1px solid var(--line);
246
+ transition: background 100ms ease, color 100ms ease;
247
+ }
248
+ .range-pill:last-child { border-right: none; }
249
+ .range-pill:hover { background: var(--surface-2); color: var(--text); }
250
+ .range-pill.active {
251
+ background: var(--accent);
252
+ color: var(--accent-on);
253
+ }
254
+ .range-pill.active:hover { background: var(--accent); color: var(--accent-on); }
255
+
256
+ @media (max-width: 720px) {
257
+ .range-picker { height: 26px; }
258
+ .range-pill { padding: 0 8px; font-size: 10.5px; }
259
+ }
260
+
261
+ /* ── Buttons ─────────────────────────────────────────────────────────── */
262
+ .btn {
263
+ display: inline-flex;
264
+ align-items: center;
265
+ gap: 6px;
266
+ padding: 6px 12px;
267
+ border-radius: 2px;
268
+ border: 1px solid var(--line-2);
269
+ background: var(--surface);
270
+ color: var(--text);
271
+ font-size: 12.5px;
272
+ font-weight: 500;
273
+ white-space: nowrap;
274
+ transition: background 100ms, border-color 100ms;
275
+ }
276
+ .btn:hover { background: var(--surface-2); }
277
+ .btn.primary {
278
+ background: var(--accent);
279
+ color: var(--accent-on);
280
+ border-color: var(--accent);
281
+ }
282
+ .btn.primary:hover { filter: brightness(1.15); }
283
+ .btn.primary:disabled { opacity: 0.5; cursor: wait; }
284
+ .btn.ghost { background: transparent; border-color: transparent; color: var(--muted); }
285
+ .btn.ghost:hover { color: var(--text); background: var(--surface-2); }
286
+ .btn.danger { color: var(--red); border-color: transparent; background: transparent; }
287
+ .btn.danger:hover { background: rgba(192,57,43,0.08); }
288
+ .btn.icon-btn {
289
+ width: 28px;
290
+ height: 28px;
291
+ justify-content: center;
292
+ padding: 0;
293
+ }
294
+ .btn.icon-btn .svg-icon { width: 13px; height: 13px; }
295
+
296
+ /* ── Cards ───────────────────────────────────────────────────────────── */
297
+ .card {
298
+ background: var(--surface);
299
+ border: 1px solid var(--line);
300
+ border-radius: var(--radius);
301
+ overflow: hidden;
302
+ }
303
+ .card .head {
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: space-between;
307
+ padding: 12px 16px;
308
+ border-bottom: 1px solid var(--line);
309
+ }
310
+ .card .head h3 {
311
+ font-size: 12.5px;
312
+ font-weight: 550;
313
+ color: var(--text);
314
+ letter-spacing: -0.005em;
315
+ }
316
+ .card .head .meta {
317
+ font-family: var(--mono);
318
+ font-size: 10.5px;
319
+ color: var(--dim);
320
+ }
321
+ .card .head a.meta { transition: color 100ms; }
322
+ .card .head a.meta:hover { color: var(--text); }
323
+ .link-with-icon { display: inline-flex; align-items: center; gap: 4px; }
324
+ .link-with-icon .svg-icon { width: 11px; height: 11px; }
325
+
326
+ .card .body { padding: 16px; }
327
+ .card .body.flush { padding: 0; }
328
+
329
+ /* ── KPI strip ───────────────────────────────────────────────────────── */
330
+ .kpi-grid {
331
+ display: grid;
332
+ grid-template-columns: repeat(4, 1fr);
333
+ gap: 0;
334
+ margin-bottom: 18px;
335
+ background: var(--surface);
336
+ border: 1px solid var(--line);
337
+ border-radius: var(--radius);
338
+ overflow: hidden;
339
+ }
340
+ .kpi-grid.five { grid-template-columns: repeat(5, 1fr); }
341
+ .kpi {
342
+ position: relative;
343
+ padding: 14px 18px;
344
+ border-right: 1px solid var(--line);
345
+ }
346
+ .kpi:last-child { border-right: none; }
347
+ .kpi .corner { display: none; }
348
+ .kpi .label {
349
+ font-size: 11.5px;
350
+ color: var(--muted);
351
+ font-weight: 450;
352
+ }
353
+ .kpi .num {
354
+ font-size: 22px;
355
+ font-weight: 600;
356
+ letter-spacing: -0.025em;
357
+ color: var(--text);
358
+ margin-top: 6px;
359
+ font-feature-settings: 'tnum';
360
+ }
361
+ .kpi .num.warn,
362
+ .kpi .num.danger,
363
+ .kpi .num.accent { color: var(--text); }
364
+ .kpi .delta {
365
+ font-family: var(--mono);
366
+ font-size: 10.5px;
367
+ color: var(--dim);
368
+ margin-top: 4px;
369
+ }
370
+ a.kpi-link {
371
+ display: block;
372
+ text-decoration: none;
373
+ color: inherit;
374
+ transition: background 100ms;
375
+ }
376
+ a.kpi-link:hover { background: var(--surface-2); }
377
+ a.kpi-link.alert {
378
+ background: rgba(217, 119, 6, 0.06);
379
+ }
380
+ a.kpi-link.alert .num { color: var(--amber); }
381
+ a.kpi-link.alert .delta { color: var(--amber); }
382
+ a.kpi-link.alert:hover { background: rgba(217, 119, 6, 0.10); }
383
+
384
+ /* ── Grids ───────────────────────────────────────────────────────────── */
385
+ .two-col {
386
+ display: grid;
387
+ grid-template-columns: 1.4fr 1fr;
388
+ gap: 14px;
389
+ margin-bottom: 14px;
390
+ }
391
+ .three-col {
392
+ display: grid;
393
+ grid-template-columns: 1fr 1fr 1fr;
394
+ gap: 14px;
395
+ margin-bottom: 14px;
396
+ }
397
+
398
+ /* ── Toolbar / search ────────────────────────────────────────────────── */
399
+ .toolbar {
400
+ display: flex;
401
+ align-items: center;
402
+ gap: 8px;
403
+ margin-bottom: 12px;
404
+ }
405
+ .toolbar .input-wrap {
406
+ flex: 1;
407
+ position: relative;
408
+ }
409
+ .toolbar input.search,
410
+ .run-search input.search {
411
+ width: 100%;
412
+ background: var(--surface);
413
+ border: 1px solid var(--line-2);
414
+ border-radius: 2px;
415
+ color: var(--text);
416
+ font-size: 13px;
417
+ padding: 8px 12px 8px 32px;
418
+ outline: none;
419
+ transition: border-color 100ms;
420
+ }
421
+ .toolbar input.search:focus,
422
+ .run-search input.search:focus { border-color: var(--accent); }
423
+ .toolbar input.search::placeholder,
424
+ .run-search input.search::placeholder { color: var(--dim); }
425
+ .toolbar .search-icon {
426
+ position: absolute;
427
+ left: 11px;
428
+ top: 50%;
429
+ transform: translateY(-50%);
430
+ color: var(--dim);
431
+ pointer-events: none;
432
+ }
433
+ .toolbar .input-wrap .kbd-hint,
434
+ .run-search .kbd-hint {
435
+ position: absolute;
436
+ right: 10px;
437
+ top: 50%;
438
+ transform: translateY(-50%);
439
+ font-family: var(--mono);
440
+ font-size: 10px;
441
+ color: var(--dim);
442
+ border: 1px solid var(--line-2);
443
+ border-radius: 2px;
444
+ padding: 1px 5px;
445
+ pointer-events: none;
446
+ }
447
+
448
+ .run-search {
449
+ margin-bottom: 12px;
450
+ background: var(--surface);
451
+ border: 1px solid var(--line);
452
+ border-radius: var(--radius);
453
+ overflow: visible;
454
+ }
455
+ .run-search-row {
456
+ display: grid;
457
+ grid-template-columns: 42px 1fr 34px;
458
+ align-items: stretch;
459
+ min-height: 54px;
460
+ border-bottom: 1px solid var(--line);
461
+ }
462
+ .condition-joiner {
463
+ display: inline-flex;
464
+ align-items: center;
465
+ justify-content: center;
466
+ color: var(--text);
467
+ font-family: var(--mono);
468
+ font-size: 10px;
469
+ font-weight: 650;
470
+ letter-spacing: 0.08em;
471
+ border-right: 1px solid var(--line);
472
+ }
473
+ .run-search-controls {
474
+ display: grid;
475
+ grid-template-columns: 180px 118px minmax(180px, 1fr);
476
+ align-items: center;
477
+ gap: 8px;
478
+ padding: 9px 10px;
479
+ }
480
+ .run-search .custom-select { min-width: 0; }
481
+ .run-search .custom-select-trigger,
482
+ .run-search input.search {
483
+ min-height: 34px;
484
+ background: var(--surface);
485
+ border: 1px solid var(--line);
486
+ border-radius: 0;
487
+ color: var(--text);
488
+ font-family: var(--sans);
489
+ font-size: 12px;
490
+ letter-spacing: 0;
491
+ text-transform: none;
492
+ width: 100%;
493
+ }
494
+ .run-search .custom-select-trigger { padding: 8px 10px; }
495
+ .run-search input.search {
496
+ padding: 8px 11px;
497
+ outline: none;
498
+ }
499
+ .run-search input.search:focus,
500
+ .run-search .custom-select-trigger:hover,
501
+ .run-search .custom-select.open .custom-select-trigger {
502
+ border-color: var(--line-2);
503
+ background: var(--surface);
504
+ }
505
+ .run-search input.search::placeholder { color: var(--muted); }
506
+ .run-search-clear {
507
+ display: inline-flex;
508
+ align-items: center;
509
+ justify-content: center;
510
+ background: transparent;
511
+ border: 0;
512
+ border-left: 1px solid var(--line);
513
+ color: var(--muted);
514
+ font-size: 20px;
515
+ line-height: 1;
516
+ cursor: pointer;
517
+ }
518
+ .run-search-clear:hover { color: var(--text); background: var(--surface-2); }
519
+ .run-search-footer {
520
+ display: flex;
521
+ align-items: center;
522
+ justify-content: space-between;
523
+ min-height: 40px;
524
+ }
525
+ .add-condition,
526
+ .run-search-submit {
527
+ min-height: 40px;
528
+ display: inline-flex;
529
+ align-items: center;
530
+ gap: 8px;
531
+ background: transparent;
532
+ border: 0;
533
+ color: var(--text);
534
+ font-size: 12px;
535
+ font-weight: 560;
536
+ cursor: pointer;
537
+ }
538
+ .add-condition { padding: 0 14px 0 54px; }
539
+ .run-search-submit {
540
+ align-self: stretch;
541
+ padding: 0 18px;
542
+ border-left: 1px solid var(--line);
543
+ }
544
+ .run-search-submit .svg-icon { width: 15px; height: 15px; }
545
+ .add-condition:hover,
546
+ .run-search-submit:hover { background: var(--surface-2); }
547
+
548
+ /* ── Pills ───────────────────────────────────────────────────────────── */
549
+ .pills { display: flex; gap: 4px; }
550
+ .pill {
551
+ display: inline-flex;
552
+ align-items: center;
553
+ gap: 6px;
554
+ font-size: 12px;
555
+ color: var(--muted);
556
+ padding: 5px 10px;
557
+ background: var(--surface);
558
+ border: 1px solid var(--line-2);
559
+ border-radius: 2px;
560
+ cursor: pointer;
561
+ user-select: none;
562
+ transition: color 100ms, background 100ms;
563
+ }
564
+ .pill:hover { color: var(--text); background: var(--surface-2); }
565
+ .pill.active { color: var(--accent-on); background: var(--accent); border-color: var(--accent); }
566
+
567
+ /* ── Activity table ──────────────────────────────────────────────────── */
568
+ table.events {
569
+ width: 100%;
570
+ border-collapse: collapse;
571
+ font-size: 13px;
572
+ table-layout: fixed;
573
+ }
574
+ table.events thead th {
575
+ text-align: left;
576
+ color: var(--dim);
577
+ font-weight: 500;
578
+ font-size: 11px;
579
+ padding: 10px 14px;
580
+ border-bottom: 1px solid var(--line);
581
+ background: var(--surface);
582
+ position: sticky;
583
+ top: 0;
584
+ z-index: 1;
585
+ }
586
+ table.events tbody td {
587
+ padding: 10px 14px;
588
+ border-bottom: 1px solid var(--line);
589
+ vertical-align: middle;
590
+ color: var(--muted);
591
+ font-size: 12.5px;
592
+ font-feature-settings: 'tnum';
593
+ }
594
+ table.events tbody tr { transition: background 100ms; cursor: pointer; }
595
+ table.events tbody tr:hover { background: var(--surface-2); }
596
+ table.events tbody tr:last-child td { border-bottom: none; }
597
+ table.events tbody tr.flash td { background: rgba(22,24,29,0.04); }
598
+
599
+ table.events th.time, table.events td.time { width: 92px; color: var(--text); white-space: nowrap; font-family: var(--mono); font-size: 12px; }
600
+ table.events th.session, table.events td.session { width: 80px; color: var(--dim); font-family: var(--mono); font-size: 11.5px; }
601
+ table.events th.tool, table.events td.tool { width: 90px; font-family: var(--mono); font-size: 11px; color: var(--muted); }
602
+ table.events td.summary { color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--mono); font-size: 12px; }
603
+ table.events th.dur, table.events td.dur { width: 56px; text-align: right; font-family: var(--mono); font-size: 11.5px; color: var(--dim); }
604
+ table.events td.verdict-cell { width: 110px; }
605
+ table.events tr.denied td.summary { color: var(--red); }
606
+
607
+ .verdict {
608
+ display: inline-flex;
609
+ align-items: center;
610
+ gap: 6px;
611
+ font-size: 11.5px;
612
+ }
613
+ .verdict .risk-dot {
614
+ width: 6px;
615
+ height: 6px;
616
+ border-radius: 50%;
617
+ background: var(--green);
618
+ flex-shrink: 0;
619
+ }
620
+ .verdict .risk-dot.medium { background: var(--amber); }
621
+ .verdict .risk-dot.high { background: var(--red); }
622
+ .verdict .dec { color: var(--muted); }
623
+ .verdict .dec.allowed { color: var(--text); }
624
+ .verdict .dec.flagged { color: var(--amber); }
625
+ .verdict .dec.denied { color: var(--red); }
626
+ .verdict .dec.pending_approval { color: var(--amber); }
627
+ .verdict .dec.pending_approval::before { content: '⏳ '; }
628
+
629
+ /* ── Empty state ─────────────────────────────────────────────────────── */
630
+ .empty {
631
+ padding: 56px 20px;
632
+ text-align: center;
633
+ color: var(--dim);
634
+ }
635
+ .empty h4 {
636
+ font-size: 14px;
637
+ font-weight: 550;
638
+ color: var(--muted);
639
+ margin-bottom: 6px;
640
+ }
641
+ .empty p { font-size: 12.5px; max-width: 380px; margin: 0 auto; line-height: 1.55; }
642
+ .empty p code { font-family: var(--mono); color: var(--text); background: var(--surface-2); padding: 1px 5px; border-radius: 2px; }
643
+
644
+ /* ── Drawer ──────────────────────────────────────────────────────────── */
645
+ .scrim {
646
+ position: fixed; inset: 0;
647
+ background: rgba(15,17,23,0.18);
648
+ opacity: 0;
649
+ pointer-events: none;
650
+ transition: opacity 160ms;
651
+ z-index: 9;
652
+ }
653
+ .scrim.open { opacity: 1; pointer-events: auto; }
654
+
655
+ .drawer {
656
+ position: fixed;
657
+ top: 0; right: 0;
658
+ height: 100vh;
659
+ width: min(560px, 92vw);
660
+ background: var(--surface);
661
+ border-left: 1px solid var(--line);
662
+ transform: translateX(100%);
663
+ transition: transform 200ms cubic-bezier(0.32, 0.72, 0, 1);
664
+ display: flex;
665
+ flex-direction: column;
666
+ z-index: 10;
667
+ }
668
+ .drawer.open { transform: translateX(0); }
669
+ .drawer-head {
670
+ padding: 16px 20px;
671
+ border-bottom: 1px solid var(--line);
672
+ display: flex;
673
+ justify-content: space-between;
674
+ align-items: center;
675
+ }
676
+ .drawer-head .title {
677
+ font-size: 13.5px;
678
+ font-weight: 550;
679
+ letter-spacing: -0.01em;
680
+ }
681
+ .drawer-head .id { font-family: var(--mono); color: var(--dim); font-size: 11px; margin-left: 4px; }
682
+ .drawer-close {
683
+ background: transparent;
684
+ border: 1px solid var(--line-2);
685
+ color: var(--muted);
686
+ font-size: 11px;
687
+ font-family: var(--mono);
688
+ padding: 4px 8px;
689
+ border-radius: 2px;
690
+ }
691
+ .drawer-close:hover { color: var(--text); }
692
+ .drawer-body { padding: 18px 20px 60px; overflow: auto; flex: 1; }
693
+ .drawer .field { margin-bottom: 14px; }
694
+ .drawer .field-label {
695
+ font-size: 11px;
696
+ color: var(--dim);
697
+ margin-bottom: 5px;
698
+ }
699
+ .drawer .field-value {
700
+ font-size: 12.5px;
701
+ color: var(--text);
702
+ background: var(--surface-2);
703
+ border: 1px solid var(--line);
704
+ border-radius: 2px;
705
+ padding: 9px 11px;
706
+ word-break: break-word;
707
+ white-space: pre-wrap;
708
+ }
709
+ .drawer .field-value.mono { font-family: var(--mono); font-size: 11.5px; line-height: 1.55; }
710
+ .drawer .session-mini { display: flex; flex-direction: column; }
711
+ .drawer .session-mini .row {
712
+ display: grid;
713
+ grid-template-columns: 64px 70px 1fr auto;
714
+ gap: 10px;
715
+ font-family: var(--mono);
716
+ font-size: 11px;
717
+ align-items: baseline;
718
+ padding: 6px 0;
719
+ border-bottom: 1px solid var(--line);
720
+ }
721
+ .drawer .session-mini .row:last-child { border: none; }
722
+ .drawer .session-mini .row.current { color: var(--text); font-weight: 500; }
723
+ .drawer .session-mini .row .summary { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--muted); }
724
+
725
+ /* ── Policies ────────────────────────────────────────────────────────── */
726
+ .policy-form {
727
+ display: grid;
728
+ grid-template-columns: auto auto 1fr auto;
729
+ gap: 8px;
730
+ align-items: center;
731
+ padding: 10px;
732
+ background: var(--surface);
733
+ border: 1px solid var(--line);
734
+ border-radius: var(--radius);
735
+ margin-bottom: 14px;
736
+ }
737
+ .policy-form input[type=text] {
738
+ background: var(--surface);
739
+ border: 1px solid var(--line-2);
740
+ border-radius: 2px;
741
+ padding: 7px 11px;
742
+ color: var(--text);
743
+ font-size: 13px;
744
+ outline: none;
745
+ transition: border-color 100ms;
746
+ }
747
+ .policy-form input[type=text]:focus { border-color: var(--accent); }
748
+ .policy-form input[type=text]::placeholder { color: var(--dim); }
749
+
750
+ .custom-select { min-width: 100px; position: relative; }
751
+ .custom-select.compact { min-width: 88px; }
752
+ .custom-select-trigger {
753
+ width: 100%;
754
+ display: inline-flex;
755
+ align-items: center;
756
+ justify-content: space-between;
757
+ gap: 8px;
758
+ background: var(--surface);
759
+ border: 1px solid var(--line-2);
760
+ border-radius: 2px;
761
+ color: var(--text);
762
+ font-size: 12.5px;
763
+ padding: 7px 10px;
764
+ min-height: 32px;
765
+ font-family: var(--sans);
766
+ }
767
+ .custom-select-trigger:hover,
768
+ .custom-select.open .custom-select-trigger { background: var(--surface-2); }
769
+ .custom-select.open .custom-select-trigger { border-color: var(--accent); }
770
+ .custom-select-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
771
+ .select-chevron { width: 12px; height: 12px; color: var(--dim); transition: transform 120ms ease; }
772
+ .custom-select.open .select-chevron { transform: rotate(180deg); }
773
+ .custom-select-menu {
774
+ position: absolute;
775
+ top: calc(100% + 4px);
776
+ left: 0;
777
+ z-index: 30;
778
+ min-width: 100%;
779
+ display: none;
780
+ overflow: hidden;
781
+ background: var(--surface);
782
+ border: 1px solid var(--line-2);
783
+ border-radius: 2px;
784
+ box-shadow: 0 8px 24px rgba(15,17,23,0.10);
785
+ }
786
+ .custom-select.open .custom-select-menu { display: block; }
787
+ .custom-select-menu button {
788
+ width: 100%;
789
+ display: block;
790
+ padding: 7px 10px;
791
+ background: transparent;
792
+ border: 0;
793
+ color: var(--muted);
794
+ font-size: 12.5px;
795
+ text-align: left;
796
+ white-space: nowrap;
797
+ }
798
+ .custom-select-menu button:hover,
799
+ .custom-select-menu button[aria-selected="true"] {
800
+ background: var(--surface-2);
801
+ color: var(--text);
802
+ }
803
+
804
+ .policy-split {
805
+ display: grid;
806
+ grid-template-columns: 1fr 1fr;
807
+ gap: 14px;
808
+ }
809
+ .policy-split.three { grid-template-columns: 1fr 1fr 1fr; }
810
+ @media (max-width: 1100px) {
811
+ .policy-split.three { grid-template-columns: 1fr; }
812
+ }
813
+ .policy-row {
814
+ display: grid;
815
+ grid-template-columns: 60px minmax(0, 1fr) auto auto auto auto;
816
+ align-items: center;
817
+ gap: 12px;
818
+ padding: 11px 16px;
819
+ border-bottom: 1px solid var(--line);
820
+ transition: background 100ms;
821
+ }
822
+ .policy-row:hover { background: var(--surface-2); }
823
+ .policy-row:last-child { border-bottom: none; }
824
+ .policy-row.disabled { opacity: 0.5; }
825
+
826
+ .tag {
827
+ display: inline-flex;
828
+ align-items: center;
829
+ font-family: var(--mono);
830
+ font-size: 10.5px;
831
+ font-weight: 500;
832
+ padding: 2px 7px;
833
+ border-radius: 2px;
834
+ border: 1px solid var(--line-2);
835
+ background: var(--surface-2);
836
+ color: var(--muted);
837
+ width: fit-content;
838
+ }
839
+ .tag.allow { color: var(--green); }
840
+ .tag.block { color: var(--red); }
841
+ .tag.approve { color: var(--amber); }
842
+ .tag.bash { color: var(--text); }
843
+ .tag.filesystem { color: var(--text); }
844
+ .tag.network { color: var(--text); }
845
+ .tag.all { color: var(--muted); }
846
+
847
+ .policy-row .desc { color: var(--text); font-size: 13px; }
848
+ .policy-row .desc small {
849
+ color: var(--dim);
850
+ font-family: var(--mono);
851
+ font-size: 10.5px;
852
+ display: block;
853
+ margin-top: 2px;
854
+ }
855
+ .policy-row .hits { font-family: var(--mono); font-size: 11px; color: var(--muted); }
856
+ .policy-row .hits b { color: var(--text); font-weight: 500; font-feature-settings: 'tnum'; }
857
+
858
+ .switch {
859
+ width: 28px;
860
+ height: 16px;
861
+ background: var(--line-2);
862
+ border-radius: 999px;
863
+ position: relative;
864
+ cursor: pointer;
865
+ transition: background 120ms;
866
+ flex-shrink: 0;
867
+ }
868
+ .switch::after {
869
+ content: '';
870
+ position: absolute;
871
+ top: 2px;
872
+ left: 2px;
873
+ width: 12px;
874
+ height: 12px;
875
+ background: var(--surface);
876
+ border-radius: 50%;
877
+ transition: transform 120ms ease;
878
+ box-shadow: 0 1px 2px rgba(15,17,23,0.18);
879
+ }
880
+ .policy-row:not(.disabled) .switch { background: var(--accent); }
881
+ .policy-row:not(.disabled) .switch::after { transform: translateX(12px); }
882
+
883
+ /* ── Built-in guardrails ─────────────────────────────────────────────── */
884
+ .builtin-card .body.flush { padding: 0; }
885
+ .builtin-section { border-bottom: 1px solid var(--line); }
886
+ .builtin-section:last-child { border-bottom: none; }
887
+ .builtin-section-head {
888
+ width: 100%;
889
+ display: grid;
890
+ grid-template-columns: 18px 1fr auto;
891
+ align-items: center;
892
+ gap: 12px;
893
+ padding: 12px 16px;
894
+ background: transparent;
895
+ border: 0;
896
+ cursor: pointer;
897
+ text-align: left;
898
+ font-family: inherit;
899
+ color: var(--text);
900
+ }
901
+ .builtin-section-head:hover { background: var(--surface-2); }
902
+ .builtin-chevron {
903
+ display: inline-flex;
904
+ align-items: center;
905
+ justify-content: center;
906
+ color: var(--muted);
907
+ transition: transform 120ms ease;
908
+ }
909
+ .builtin-section.open .builtin-chevron { transform: rotate(180deg); }
910
+ .builtin-section-title {
911
+ display: flex;
912
+ align-items: center;
913
+ gap: 10px;
914
+ min-width: 0;
915
+ }
916
+ .builtin-section-note {
917
+ color: var(--dim);
918
+ font-size: 12px;
919
+ white-space: nowrap;
920
+ overflow: hidden;
921
+ text-overflow: ellipsis;
922
+ }
923
+ .builtin-section-count {
924
+ font-family: var(--mono);
925
+ font-size: 11px;
926
+ color: var(--muted);
927
+ font-feature-settings: 'tnum';
928
+ }
929
+ .builtin-rows { border-top: 1px solid var(--line); background: var(--surface-2); }
930
+ .builtin-row {
931
+ display: grid;
932
+ grid-template-columns: 1fr auto;
933
+ align-items: center;
934
+ gap: 12px;
935
+ padding: 10px 16px 10px 46px;
936
+ border-bottom: 1px solid var(--line);
937
+ background: var(--surface);
938
+ }
939
+ .builtin-row:last-child { border-bottom: none; }
940
+ .builtin-row.disabled { opacity: 0.45; }
941
+ .builtin-row-main { min-width: 0; }
942
+ .builtin-row-reason {
943
+ color: var(--text);
944
+ font-size: 13px;
945
+ margin-bottom: 3px;
946
+ }
947
+ .builtin-row-pattern {
948
+ display: inline-block;
949
+ font-family: var(--mono);
950
+ font-size: 10.5px;
951
+ color: var(--dim);
952
+ background: var(--surface-2);
953
+ border: 1px solid var(--line);
954
+ border-radius: var(--radius);
955
+ padding: 2px 6px;
956
+ max-width: 100%;
957
+ overflow: hidden;
958
+ text-overflow: ellipsis;
959
+ white-space: nowrap;
960
+ vertical-align: middle;
961
+ }
962
+ .builtin-row:not(.disabled) .switch { background: var(--accent); }
963
+ .builtin-row:not(.disabled) .switch::after { transform: translateX(12px); }
964
+
965
+ /* ── Approvals ───────────────────────────────────────────────────────── */
966
+ .approval-row {
967
+ display: grid;
968
+ grid-template-columns: minmax(0, 1fr) auto;
969
+ align-items: center;
970
+ gap: 16px;
971
+ padding: 14px 16px;
972
+ border-bottom: 1px solid var(--line);
973
+ }
974
+ .approval-row:last-child { border-bottom: none; }
975
+ .approval-row.pending { background: rgba(217, 119, 6, 0.04); }
976
+ .approval-row.approved { opacity: 0.7; }
977
+ .approval-row.denied { opacity: 0.5; }
978
+ .approval-row.timeout { opacity: 0.5; }
979
+ .approval-main { min-width: 0; display: flex; flex-direction: column; gap: 6px; }
980
+ .approval-title {
981
+ display: flex;
982
+ align-items: center;
983
+ gap: 10px;
984
+ flex-wrap: wrap;
985
+ }
986
+ .approval-tool {
987
+ font-family: var(--mono);
988
+ font-size: 11px;
989
+ font-weight: 600;
990
+ color: var(--muted);
991
+ letter-spacing: 0.02em;
992
+ text-transform: uppercase;
993
+ }
994
+ .approval-reason {
995
+ color: var(--text);
996
+ font-size: 13px;
997
+ }
998
+ .approval-summary {
999
+ display: block;
1000
+ font-family: var(--mono);
1001
+ font-size: 11.5px;
1002
+ color: var(--text);
1003
+ background: var(--surface-2);
1004
+ border: 1px solid var(--line);
1005
+ border-radius: var(--radius);
1006
+ padding: 6px 9px;
1007
+ white-space: pre-wrap;
1008
+ word-break: break-word;
1009
+ max-height: 90px;
1010
+ overflow: auto;
1011
+ }
1012
+ .approval-meta {
1013
+ font-family: var(--mono);
1014
+ font-size: 10.5px;
1015
+ color: var(--dim);
1016
+ }
1017
+ .approval-actions {
1018
+ display: flex;
1019
+ gap: 8px;
1020
+ flex-shrink: 0;
1021
+ }
1022
+ .approval-row.compact {
1023
+ padding: 10px 14px;
1024
+ gap: 10px;
1025
+ }
1026
+ .approval-row.compact .approval-main { gap: 4px; }
1027
+ .approval-row.compact .approval-title { gap: 8px; }
1028
+ .approval-row.compact .approval-reason { font-size: 12.5px; }
1029
+ .approval-summary.one-line {
1030
+ white-space: nowrap;
1031
+ overflow: hidden;
1032
+ text-overflow: ellipsis;
1033
+ max-height: none;
1034
+ padding: 4px 7px;
1035
+ font-size: 11px;
1036
+ }
1037
+ .btn.sm { padding: 4px 10px; font-size: 11.5px; }
1038
+
1039
+ /* ── Banner / inline notice ──────────────────────────────────────────── */
1040
+ .banner {
1041
+ display: flex;
1042
+ align-items: flex-start;
1043
+ gap: 12px;
1044
+ padding: 12px 14px;
1045
+ border: 1px solid var(--line);
1046
+ border-radius: var(--radius);
1047
+ background: var(--surface);
1048
+ font-size: 13px;
1049
+ color: var(--text);
1050
+ }
1051
+ .banner.subtle { background: var(--surface-2); }
1052
+ .banner .link { color: var(--accent); text-decoration: underline; }
1053
+
1054
+ /* ── Slack badge ─────────────────────────────────────────────────────── */
1055
+ .badge.slack {
1056
+ display: inline-flex;
1057
+ align-items: center;
1058
+ gap: 4px;
1059
+ font-family: var(--mono);
1060
+ font-size: 10.5px;
1061
+ font-weight: 600;
1062
+ letter-spacing: 0.02em;
1063
+ padding: 3px 7px;
1064
+ border: 1px solid var(--line);
1065
+ border-radius: var(--radius);
1066
+ color: var(--muted);
1067
+ text-transform: uppercase;
1068
+ }
1069
+ .badge.slack.ok {
1070
+ color: var(--green);
1071
+ border-color: color-mix(in srgb, var(--green) 35%, var(--line));
1072
+ background: color-mix(in srgb, var(--green) 6%, transparent);
1073
+ }
1074
+ a.badge.slack:hover { color: var(--text); background: var(--surface-2); }
1075
+
1076
+ /* ── Checkbox row ────────────────────────────────────────────────────── */
1077
+ .checkbox-row {
1078
+ display: flex;
1079
+ align-items: center;
1080
+ gap: 10px;
1081
+ font-size: 13px;
1082
+ color: var(--text);
1083
+ }
1084
+ .checkbox-row input[type="checkbox"] {
1085
+ width: 14px;
1086
+ height: 14px;
1087
+ accent-color: var(--accent);
1088
+ }
1089
+
1090
+ /* ── HITL settings form ──────────────────────────────────────────────── */
1091
+ .hitl-form {
1092
+ display: flex;
1093
+ flex-direction: column;
1094
+ gap: 16px;
1095
+ }
1096
+ .hitl-field { display: flex; flex-direction: column; gap: 6px; }
1097
+ .hitl-field label {
1098
+ font-size: 11.5px;
1099
+ color: var(--muted);
1100
+ font-family: var(--mono);
1101
+ text-transform: uppercase;
1102
+ letter-spacing: 0.04em;
1103
+ }
1104
+ .hitl-field input {
1105
+ background: var(--surface);
1106
+ border: 1px solid var(--line-2);
1107
+ border-radius: 2px;
1108
+ padding: 8px 11px;
1109
+ color: var(--text);
1110
+ font-family: var(--mono);
1111
+ font-size: 12.5px;
1112
+ outline: none;
1113
+ width: 100%;
1114
+ max-width: 560px;
1115
+ }
1116
+ .hitl-field input:focus { border-color: var(--accent); }
1117
+
1118
+ .hitl-toggle {
1119
+ display: grid;
1120
+ grid-template-columns: auto 1fr;
1121
+ gap: 12px;
1122
+ align-items: start;
1123
+ padding: 12px 14px;
1124
+ border: 1px solid var(--line);
1125
+ border-radius: var(--radius);
1126
+ background: var(--surface-2);
1127
+ cursor: pointer;
1128
+ max-width: 560px;
1129
+ transition: border-color 100ms, background 100ms;
1130
+ }
1131
+ .hitl-toggle:hover { border-color: var(--line-2); }
1132
+ .hitl-toggle input[type="checkbox"] {
1133
+ width: 15px;
1134
+ height: 15px;
1135
+ margin-top: 2px;
1136
+ accent-color: var(--accent);
1137
+ cursor: pointer;
1138
+ }
1139
+ .hitl-toggle-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
1140
+ .hitl-toggle-title {
1141
+ font-size: 13px;
1142
+ font-weight: 500;
1143
+ color: var(--text);
1144
+ }
1145
+ .hitl-toggle-sub {
1146
+ font-size: 11.5px;
1147
+ color: var(--dim);
1148
+ line-height: 1.5;
1149
+ }
1150
+ .hitl-toggle-sub code {
1151
+ font-family: var(--mono);
1152
+ font-size: 11px;
1153
+ background: var(--surface);
1154
+ border: 1px solid var(--line);
1155
+ border-radius: 2px;
1156
+ padding: 0 4px;
1157
+ color: var(--muted);
1158
+ }
1159
+
1160
+ .hitl-actions {
1161
+ display: flex;
1162
+ align-items: center;
1163
+ flex-wrap: wrap;
1164
+ gap: 10px 14px;
1165
+ margin-top: 4px;
1166
+ }
1167
+ .hitl-help {
1168
+ font-size: 11.5px;
1169
+ color: var(--dim);
1170
+ line-height: 1.55;
1171
+ flex: 1 1 240px;
1172
+ }
1173
+ .hitl-help a { color: var(--accent); }
1174
+ .hitl-help a:hover { text-decoration: underline; }
1175
+
1176
+ /* ── Tester ──────────────────────────────────────────────────────────── */
1177
+ .tester {
1178
+ margin-top: 14px;
1179
+ background: var(--surface);
1180
+ border: 1px solid var(--line);
1181
+ border-radius: var(--radius);
1182
+ overflow: hidden;
1183
+ }
1184
+ .tester .head {
1185
+ display: flex;
1186
+ align-items: center;
1187
+ justify-content: space-between;
1188
+ padding: 12px 16px;
1189
+ border-bottom: 1px solid var(--line);
1190
+ }
1191
+ .tester .head h3 {
1192
+ font-size: 12.5px;
1193
+ font-weight: 550;
1194
+ color: var(--text);
1195
+ }
1196
+ .tester .head .meta { font-family: var(--mono); font-size: 10.5px; color: var(--dim); }
1197
+ .tester .form {
1198
+ padding: 12px;
1199
+ display: grid;
1200
+ grid-template-columns: 1fr auto auto;
1201
+ gap: 8px;
1202
+ border-bottom: 1px solid var(--line);
1203
+ }
1204
+ .tester .form input {
1205
+ background: var(--surface);
1206
+ border: 1px solid var(--line-2);
1207
+ border-radius: 2px;
1208
+ color: var(--text);
1209
+ font-family: var(--mono);
1210
+ font-size: 12.5px;
1211
+ padding: 7px 11px;
1212
+ outline: none;
1213
+ }
1214
+ .tester .form input:focus { border-color: var(--accent); }
1215
+ .tester-results { padding: 8px 6px; }
1216
+ .tester-result-row {
1217
+ display: grid;
1218
+ grid-template-columns: 64px 80px 1fr 80px;
1219
+ gap: 12px;
1220
+ padding: 8px 12px;
1221
+ align-items: center;
1222
+ font-family: var(--mono);
1223
+ font-size: 12px;
1224
+ color: var(--muted);
1225
+ border-radius: 2px;
1226
+ }
1227
+ .tester-result-row .sim { color: var(--text); font-feature-settings: 'tnum'; font-weight: 500; }
1228
+ .tester-result-row .sim-bar {
1229
+ height: 4px;
1230
+ background: var(--surface-2);
1231
+ border-radius: 2px;
1232
+ overflow: hidden;
1233
+ position: relative;
1234
+ }
1235
+ .tester-result-row .sim-bar::after {
1236
+ content: '';
1237
+ position: absolute;
1238
+ inset: 0 auto 0 0;
1239
+ background: var(--dim);
1240
+ width: var(--w, 0%);
1241
+ border-radius: 2px;
1242
+ }
1243
+ .tester-result-row .desc { color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-family: var(--sans); }
1244
+ .tester-result-row .verdict-pill {
1245
+ font-size: 10px;
1246
+ padding: 2px 7px;
1247
+ border-radius: 2px;
1248
+ text-align: center;
1249
+ border: 1px solid var(--line-2);
1250
+ color: var(--dim);
1251
+ background: var(--surface-2);
1252
+ }
1253
+ .tester-result-row.match.block .verdict-pill {
1254
+ color: var(--red);
1255
+ border-color: rgba(192,57,43,0.3);
1256
+ background: rgba(192,57,43,0.06);
1257
+ }
1258
+ .tester-result-row.match.allow .verdict-pill {
1259
+ color: var(--green);
1260
+ border-color: rgba(47,143,91,0.3);
1261
+ background: rgba(47,143,91,0.06);
1262
+ }
1263
+ .tester-result-row.match.block .sim-bar::after { background: var(--red); }
1264
+ .tester-result-row.match.allow .sim-bar::after { background: var(--green); }
1265
+
1266
+ /* ── Charts ──────────────────────────────────────────────────────────── */
1267
+ .echart { width: 100%; height: 220px; }
1268
+ .echart.compact { height: 180px; }
1269
+ .echart.mini { height: 130px; }
1270
+
1271
+ /* ── Distribution + ranking lists ────────────────────────────────────── */
1272
+ .dist-list { display: flex; flex-direction: column; gap: 10px; }
1273
+ .dist-row {
1274
+ display: grid;
1275
+ grid-template-columns: 90px 1fr 50px;
1276
+ gap: 12px;
1277
+ align-items: center;
1278
+ }
1279
+ .dist-row .label { font-family: var(--mono); font-size: 11px; color: var(--muted); }
1280
+ .dist-row .bar {
1281
+ height: 6px;
1282
+ background: var(--surface-2);
1283
+ border-radius: 999px;
1284
+ overflow: hidden;
1285
+ }
1286
+ .dist-row .bar > span { display: block; height: 100%; background: var(--accent); width: var(--w, 0%); }
1287
+ .dist-row .num { text-align: right; font-family: var(--mono); font-size: 11.5px; color: var(--text); font-feature-settings: 'tnum'; }
1288
+
1289
+ .action-list { display: flex; flex-direction: column; }
1290
+ .action-item {
1291
+ display: grid;
1292
+ grid-template-columns: 22px 1fr 50px;
1293
+ align-items: center;
1294
+ gap: 12px;
1295
+ padding: 10px 16px;
1296
+ border-bottom: 1px solid var(--line);
1297
+ cursor: pointer;
1298
+ transition: background 100ms;
1299
+ }
1300
+ .action-item:hover { background: var(--surface-2); }
1301
+ .action-item:last-child { border-bottom: none; }
1302
+ .action-item .rank { font-family: var(--mono); font-size: 10.5px; color: var(--dim); }
1303
+ .action-item .cmd {
1304
+ font-family: var(--mono);
1305
+ font-size: 12px;
1306
+ color: var(--text);
1307
+ white-space: nowrap;
1308
+ overflow: hidden;
1309
+ text-overflow: ellipsis;
1310
+ }
1311
+ .action-item .cmd small { color: var(--dim); font-size: 10.5px; margin-left: 6px; }
1312
+ .action-item .count { text-align: right; font-family: var(--mono); font-size: 11.5px; color: var(--text); }
1313
+ .action-item.session-item { grid-template-columns: 80px minmax(0, 1fr) 18px; }
1314
+ .action-item.session-item .rank { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1315
+ .action-item.session-item .count { display: flex; justify-content: flex-end; color: var(--dim); }
1316
+ .action-item.session-item .count .svg-icon { width: 12px; height: 12px; }
1317
+
1318
+ /* ── Recent runs (overview) ──────────────────────────────────────────── */
1319
+ .recent-list { display: flex; flex-direction: column; }
1320
+ .recent-item {
1321
+ display: grid;
1322
+ grid-template-columns: 78px 78px 1fr 100px;
1323
+ align-items: center;
1324
+ gap: 14px;
1325
+ padding: 9px 16px;
1326
+ border-bottom: 1px solid var(--line);
1327
+ cursor: pointer;
1328
+ transition: background 100ms;
1329
+ font-size: 12.5px;
1330
+ font-feature-settings: 'tnum';
1331
+ }
1332
+ .recent-item:hover { background: var(--surface-2); }
1333
+ .recent-item:last-child { border-bottom: none; }
1334
+ .recent-item .time { color: var(--text); font-family: var(--mono); font-size: 11.5px; }
1335
+ .recent-item .tool { font-family: var(--mono); font-size: 11px; color: var(--muted); }
1336
+ .recent-item .summary {
1337
+ color: var(--text);
1338
+ font-family: var(--mono);
1339
+ font-size: 12px;
1340
+ white-space: nowrap;
1341
+ overflow: hidden;
1342
+ text-overflow: ellipsis;
1343
+ }
1344
+ .recent-item.denied .summary { color: var(--red); }
1345
+ .recent-item .verdict { justify-self: end; }
1346
+
1347
+ /* ── Docs ────────────────────────────────────────────────────────────── */
1348
+ .docs-layout {
1349
+ display: grid;
1350
+ grid-template-columns: minmax(0, 1fr) 300px;
1351
+ gap: 16px;
1352
+ align-items: start;
1353
+ }
1354
+ .docs-main { display: flex; flex-direction: column; gap: 12px; }
1355
+ .docs-aside { display: flex; flex-direction: column; gap: 12px; position: sticky; top: 20px; }
1356
+ .doc-card {
1357
+ background: var(--surface);
1358
+ border: 1px solid var(--line);
1359
+ border-radius: var(--radius);
1360
+ padding: 18px;
1361
+ }
1362
+ .doc-card.compact { padding: 14px; }
1363
+ .doc-eyebrow {
1364
+ color: var(--dim);
1365
+ font-family: var(--mono);
1366
+ font-size: 10.5px;
1367
+ margin-bottom: 6px;
1368
+ }
1369
+ .doc-card h2,
1370
+ .doc-card h3 {
1371
+ color: var(--text);
1372
+ font-size: 15px;
1373
+ font-weight: 600;
1374
+ letter-spacing: -0.015em;
1375
+ line-height: 1.3;
1376
+ margin-bottom: 6px;
1377
+ }
1378
+ .doc-card h3 { font-size: 13px; }
1379
+ .doc-card p { color: var(--muted); font-size: 12.5px; max-width: 720px; }
1380
+ .doc-card code {
1381
+ color: var(--text);
1382
+ background: var(--surface-2);
1383
+ border: 1px solid var(--line);
1384
+ border-radius: 2px;
1385
+ font-family: var(--mono);
1386
+ font-size: 0.92em;
1387
+ padding: 1px 5px;
1388
+ }
1389
+ .doc-card pre {
1390
+ background: var(--surface-2);
1391
+ border: 1px solid var(--line);
1392
+ border-radius: 2px;
1393
+ color: var(--text);
1394
+ margin-top: 10px;
1395
+ overflow: auto;
1396
+ padding: 12px;
1397
+ }
1398
+ .doc-card pre code {
1399
+ background: transparent;
1400
+ border: 0;
1401
+ color: inherit;
1402
+ display: block;
1403
+ font-size: 11.5px;
1404
+ line-height: 1.6;
1405
+ padding: 0;
1406
+ }
1407
+ .doc-note { margin-top: 10px; }
1408
+ .tool-grid {
1409
+ display: grid;
1410
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1411
+ gap: 8px;
1412
+ margin-top: 12px;
1413
+ }
1414
+ .tool-chip {
1415
+ background: var(--surface-2);
1416
+ border: 1px solid var(--line);
1417
+ border-radius: 2px;
1418
+ padding: 9px 11px;
1419
+ }
1420
+ .tool-chip code { display: inline-block; margin-bottom: 3px; }
1421
+ .tool-chip span { color: var(--muted); display: block; font-size: 11.5px; line-height: 1.45; }
1422
+ .env-list { display: flex; flex-direction: column; gap: 8px; }
1423
+ .env-list dt { color: var(--text); font-family: var(--mono); font-size: 11px; font-weight: 500; }
1424
+ .env-list dd { color: var(--muted); font-size: 11.5px; line-height: 1.45; }
1425
+
1426
+ /* ── Usage chip + Settings ───────────────────────────────────────────── */
1427
+ .usage-chip {
1428
+ display: inline-flex;
1429
+ align-items: center;
1430
+ gap: 8px;
1431
+ padding: 4px 8px;
1432
+ border: 1px solid var(--line);
1433
+ border-radius: 2px;
1434
+ background: var(--surface);
1435
+ color: var(--muted);
1436
+ font-family: var(--mono);
1437
+ font-size: 11px;
1438
+ transition: border-color 100ms, color 100ms;
1439
+ }
1440
+ .usage-chip:hover { border-color: var(--line-2); color: var(--text); }
1441
+ .usage-chip .bar {
1442
+ display: block;
1443
+ width: 60px;
1444
+ height: 4px;
1445
+ background: var(--surface-2);
1446
+ border-radius: 2px;
1447
+ overflow: hidden;
1448
+ }
1449
+ .usage-chip .bar > span {
1450
+ display: block;
1451
+ height: 100%;
1452
+ background: var(--accent);
1453
+ }
1454
+ .usage-chip.warn .bar > span { background: var(--amber); }
1455
+ .usage-chip.over .bar > span { background: var(--red); }
1456
+ .usage-chip.over { color: var(--red); border-color: rgba(192,57,43,0.4); }
1457
+ .usage-chip .num { color: var(--text); font-feature-settings: 'tnum'; }
1458
+
1459
+ .usage-large .row {
1460
+ display: flex;
1461
+ justify-content: space-between;
1462
+ align-items: flex-end;
1463
+ gap: 24px;
1464
+ margin-bottom: 14px;
1465
+ }
1466
+ .usage-large .num {
1467
+ font-size: 38px;
1468
+ font-weight: 600;
1469
+ letter-spacing: -0.03em;
1470
+ color: var(--text);
1471
+ font-feature-settings: 'tnum';
1472
+ line-height: 1;
1473
+ }
1474
+ .usage-large .num .of { color: var(--dim); font-weight: 400; font-size: 22px; }
1475
+ .usage-large .meta { text-align: right; color: var(--muted); font-size: 12px; }
1476
+ .usage-large .plan-tag {
1477
+ display: inline-block;
1478
+ padding: 2px 8px;
1479
+ border: 1px solid var(--line-2);
1480
+ border-radius: 2px;
1481
+ font-family: var(--mono);
1482
+ font-size: 10.5px;
1483
+ color: var(--text);
1484
+ margin-bottom: 4px;
1485
+ }
1486
+ .usage-bar {
1487
+ height: 8px;
1488
+ background: var(--surface-2);
1489
+ border-radius: 2px;
1490
+ overflow: hidden;
1491
+ }
1492
+ .usage-bar > span {
1493
+ display: block;
1494
+ height: 100%;
1495
+ background: var(--accent);
1496
+ transition: width 200ms ease;
1497
+ }
1498
+ .usage-bar.warn > span { background: var(--amber); }
1499
+ .usage-bar.over > span { background: var(--red); }
1500
+ .usage-large .footnote,
1501
+ .settings-form ~ .footnote,
1502
+ .card .body .footnote {
1503
+ display: block;
1504
+ margin-top: 12px;
1505
+ font-size: 11.5px;
1506
+ color: var(--dim);
1507
+ line-height: 1.55;
1508
+ }
1509
+ .footnote code {
1510
+ background: var(--surface-2);
1511
+ border: 1px solid var(--line);
1512
+ padding: 1px 5px;
1513
+ border-radius: 2px;
1514
+ font-family: var(--mono);
1515
+ font-size: 0.92em;
1516
+ }
1517
+
1518
+ dl.kv {
1519
+ display: grid;
1520
+ grid-template-columns: 90px 1fr;
1521
+ row-gap: 8px;
1522
+ column-gap: 12px;
1523
+ margin-bottom: 14px;
1524
+ }
1525
+ dl.kv dt {
1526
+ color: var(--dim);
1527
+ font-size: 11.5px;
1528
+ font-family: var(--mono);
1529
+ }
1530
+ dl.kv dd { color: var(--text); font-size: 12.5px; }
1531
+ dl.kv dd.mono { font-family: var(--mono); font-size: 11.5px; }
1532
+
1533
+ .settings-actions {
1534
+ display: flex;
1535
+ flex-wrap: wrap;
1536
+ gap: 8px;
1537
+ }
1538
+ .settings-form {
1539
+ display: grid;
1540
+ grid-template-columns: 1fr auto;
1541
+ gap: 8px;
1542
+ align-items: end;
1543
+ }
1544
+ .settings-form label {
1545
+ display: flex;
1546
+ flex-direction: column;
1547
+ gap: 4px;
1548
+ font-size: 11.5px;
1549
+ color: var(--muted);
1550
+ font-family: var(--mono);
1551
+ }
1552
+ .settings-form input {
1553
+ background: var(--surface);
1554
+ border: 1px solid var(--line-2);
1555
+ border-radius: 2px;
1556
+ padding: 7px 10px;
1557
+ color: var(--text);
1558
+ font-family: var(--mono);
1559
+ font-size: 12.5px;
1560
+ outline: none;
1561
+ transition: border-color 100ms;
1562
+ }
1563
+ .settings-form input:focus { border-color: var(--accent); }
1564
+
1565
+ table.kv-table {
1566
+ width: 100%;
1567
+ border-collapse: collapse;
1568
+ font-size: 12.5px;
1569
+ }
1570
+ table.kv-table thead th {
1571
+ text-align: left;
1572
+ color: var(--dim);
1573
+ font-weight: 500;
1574
+ font-size: 11px;
1575
+ padding: 10px 14px;
1576
+ border-bottom: 1px solid var(--line);
1577
+ background: var(--surface);
1578
+ }
1579
+ table.kv-table tbody td {
1580
+ padding: 9px 14px;
1581
+ border-bottom: 1px solid var(--line);
1582
+ color: var(--text);
1583
+ font-family: var(--mono);
1584
+ font-size: 12px;
1585
+ font-feature-settings: 'tnum';
1586
+ }
1587
+ table.kv-table tbody td.num { font-weight: 500; }
1588
+ table.kv-table tbody td.dim { color: var(--dim); }
1589
+ table.kv-table tbody tr:last-child td { border-bottom: none; }
1590
+
1591
+ /* ── Command palette ─────────────────────────────────────────────────── */
1592
+ .palette-scrim {
1593
+ position: fixed; inset: 0;
1594
+ background: rgba(15,17,23,0.20);
1595
+ z-index: 20;
1596
+ display: none;
1597
+ }
1598
+ .palette-scrim.open { display: flex; align-items: flex-start; justify-content: center; padding-top: 14vh; }
1599
+ .palette {
1600
+ width: min(520px, 90vw);
1601
+ background: var(--surface);
1602
+ border: 1px solid var(--line-2);
1603
+ border-radius: 2px;
1604
+ overflow: hidden;
1605
+ box-shadow: 0 18px 48px rgba(15,17,23,0.18);
1606
+ }
1607
+ .palette input {
1608
+ width: 100%;
1609
+ padding: 14px 18px;
1610
+ background: transparent;
1611
+ border: none;
1612
+ border-bottom: 1px solid var(--line);
1613
+ color: var(--text);
1614
+ font-size: 14px;
1615
+ outline: none;
1616
+ }
1617
+ .palette input::placeholder { color: var(--dim); }
1618
+ .palette ul { list-style: none; max-height: 320px; overflow: auto; }
1619
+ .palette li {
1620
+ padding: 9px 18px;
1621
+ font-size: 13px;
1622
+ color: var(--muted);
1623
+ cursor: pointer;
1624
+ display: flex;
1625
+ justify-content: space-between;
1626
+ align-items: center;
1627
+ }
1628
+ .palette li:hover, .palette li.active { background: var(--surface-2); color: var(--text); }
1629
+ .palette li .nav { font-family: var(--mono); font-size: 10px; color: var(--dim); }
1630
+
1631
+ /* ── Responsive ──────────────────────────────────────────────────────── */
1632
+ @media (max-width: 1180px) {
1633
+ .kpi-grid.five { grid-template-columns: repeat(3, 1fr); }
1634
+ .kpi-grid.five .kpi:nth-child(3n) { border-right: none; }
1635
+ .kpi-grid.five .kpi:nth-child(-n+3) { border-bottom: 1px solid var(--line); }
1636
+ }
1637
+ @media (max-width: 980px) {
1638
+ .kpi-grid,
1639
+ .kpi-grid.five { grid-template-columns: repeat(2, 1fr); }
1640
+ .kpi { border-right: none; border-bottom: 1px solid var(--line); }
1641
+ .kpi:nth-child(2n) { border-right: none; }
1642
+ .kpi:nth-last-child(-n+2) { border-bottom: none; }
1643
+ .two-col, .three-col, .docs-layout, .policy-split { grid-template-columns: 1fr; }
1644
+ .docs-aside { position: static; }
1645
+ .tool-grid { grid-template-columns: 1fr; }
1646
+ .policy-form { grid-template-columns: 1fr 1fr; }
1647
+ .policy-form input[type=text] { grid-column: 1 / -1; }
1648
+ .policy-form .btn { grid-column: 1 / -1; }
1649
+ .policy-row { grid-template-columns: 70px 1fr auto auto; row-gap: 6px; }
1650
+ .policy-row .hits, .policy-row .desc { grid-column: 1 / -1; }
1651
+ table.events td.session, table.events th.session { display: none; }
1652
+ .appbar {
1653
+ position: sticky;
1654
+ top: 0;
1655
+ width: auto;
1656
+ height: auto;
1657
+ flex-direction: row;
1658
+ align-items: center;
1659
+ padding: 10px 14px;
1660
+ gap: 10px;
1661
+ border-right: none;
1662
+ border-bottom: 1px solid var(--line);
1663
+ }
1664
+ .brand { padding: 0; }
1665
+ nav.tabs {
1666
+ flex-direction: row;
1667
+ overflow-x: auto;
1668
+ flex: 1;
1669
+ }
1670
+ nav.tabs.sidebar-foot {
1671
+ flex: 0 0 auto;
1672
+ margin-top: 0;
1673
+ padding-top: 0;
1674
+ border-top: 0;
1675
+ border-left: 1px solid var(--line);
1676
+ padding-left: 8px;
1677
+ }
1678
+ .sidebar-usage { display: none !important; }
1679
+ nav.tabs a { padding: 6px 10px; }
1680
+ .page { margin-left: 0; padding: 22px 18px 60px; }
1681
+ .recent-item { grid-template-columns: 64px 1fr 90px; }
1682
+ .recent-item .tool { display: none; }
1683
+ }
1684
+ `;
1685
+ //# sourceMappingURL=styles.js.map