site-agent-pro 1.0.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 (81) hide show
  1. package/README.md +689 -0
  2. package/dist/auth/credentialStore.js +62 -0
  3. package/dist/auth/inbox.js +193 -0
  4. package/dist/auth/profile.js +379 -0
  5. package/dist/auth/runner.js +1124 -0
  6. package/dist/backend/dashboardData.js +194 -0
  7. package/dist/backend/runArtifacts.js +48 -0
  8. package/dist/backend/runRepository.js +93 -0
  9. package/dist/bin.js +2 -0
  10. package/dist/cli/backfillSiteChecks.js +143 -0
  11. package/dist/cli/run.js +309 -0
  12. package/dist/cli/trade.js +69 -0
  13. package/dist/config.js +199 -0
  14. package/dist/core/agentProfiles.js +55 -0
  15. package/dist/core/aggregateReport.js +382 -0
  16. package/dist/core/audit.js +30 -0
  17. package/dist/core/customTaskSuite.js +148 -0
  18. package/dist/core/evaluator.js +217 -0
  19. package/dist/core/executor.js +788 -0
  20. package/dist/core/fallbackReport.js +335 -0
  21. package/dist/core/formHeuristics.js +411 -0
  22. package/dist/core/gameplaySummary.js +164 -0
  23. package/dist/core/interaction.js +202 -0
  24. package/dist/core/pageState.js +201 -0
  25. package/dist/core/planner.js +1669 -0
  26. package/dist/core/processSubmissionBatch.js +204 -0
  27. package/dist/core/runAuditJob.js +170 -0
  28. package/dist/core/runner.js +2352 -0
  29. package/dist/core/siteBrief.js +107 -0
  30. package/dist/core/siteChecks.js +1526 -0
  31. package/dist/core/taskDirectives.js +279 -0
  32. package/dist/core/taskHeuristics.js +263 -0
  33. package/dist/dashboard/client.js +1256 -0
  34. package/dist/dashboard/contracts.js +95 -0
  35. package/dist/dashboard/narrative.js +277 -0
  36. package/dist/dashboard/server.js +458 -0
  37. package/dist/dashboard/theme.js +888 -0
  38. package/dist/index.js +84 -0
  39. package/dist/llm/client.js +188 -0
  40. package/dist/paystack/account.js +123 -0
  41. package/dist/paystack/client.js +100 -0
  42. package/dist/paystack/index.js +13 -0
  43. package/dist/paystack/test-paystack.js +83 -0
  44. package/dist/paystack/transfer.js +138 -0
  45. package/dist/paystack/types.js +74 -0
  46. package/dist/paystack/webhook.js +121 -0
  47. package/dist/prompts/browserAgent.js +124 -0
  48. package/dist/prompts/reviewer.js +71 -0
  49. package/dist/reporting/clickReplay.js +290 -0
  50. package/dist/reporting/html.js +930 -0
  51. package/dist/reporting/markdown.js +238 -0
  52. package/dist/reporting/template.js +1141 -0
  53. package/dist/schemas/types.js +361 -0
  54. package/dist/submissions/customTasks.js +196 -0
  55. package/dist/submissions/html.js +770 -0
  56. package/dist/submissions/model.js +56 -0
  57. package/dist/submissions/publicUrl.js +76 -0
  58. package/dist/submissions/service.js +74 -0
  59. package/dist/submissions/store.js +37 -0
  60. package/dist/submissions/types.js +65 -0
  61. package/dist/trade/engine.js +241 -0
  62. package/dist/trade/evm/erc20.js +44 -0
  63. package/dist/trade/extractor.js +148 -0
  64. package/dist/trade/policy.js +35 -0
  65. package/dist/trade/session.js +31 -0
  66. package/dist/trade/types.js +107 -0
  67. package/dist/trade/validator.js +148 -0
  68. package/dist/utils/files.js +59 -0
  69. package/dist/utils/log.js +24 -0
  70. package/dist/utils/playwrightCompat.js +14 -0
  71. package/dist/utils/time.js +3 -0
  72. package/dist/wallet/provider.js +345 -0
  73. package/dist/wallet/relay.js +129 -0
  74. package/dist/wallet/wallet.js +178 -0
  75. package/docs/01-installation.md +134 -0
  76. package/docs/02-running-your-first-audit.md +136 -0
  77. package/docs/03-configuration.md +233 -0
  78. package/docs/04-how-the-agent-thinks.md +41 -0
  79. package/docs/05-extending-personas-and-tasks.md +42 -0
  80. package/docs/06-hardening-for-production.md +92 -0
  81. package/package.json +60 -0
@@ -0,0 +1,888 @@
1
+ export const DASHBOARD_HEAD_TAGS = `
2
+ <link rel="preconnect" href="https://fonts.googleapis.com">
3
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
4
+ <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Syne:wght@400;500;700&display=swap" rel="stylesheet">
5
+ `;
6
+ export const DASHBOARD_CSS = String.raw `
7
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
8
+
9
+ :root {
10
+ color-scheme: dark;
11
+ --bg: #0c0c10;
12
+ --surface: #13131a;
13
+ --surface2: #1a1a24;
14
+ --surface3: #22222d;
15
+ --border: rgba(255,255,255,0.07);
16
+ --border2: rgba(255,255,255,0.12);
17
+ --text: #e8e8f0;
18
+ --muted: #6b6b80;
19
+ --accent: #00d4aa;
20
+ --accent-dim: rgba(0,212,170,0.12);
21
+ --accent-glow: rgba(0,212,170,0.25);
22
+ --blue: #4d9fff;
23
+ --blue-dim: rgba(77,159,255,0.12);
24
+ --amber: #f5a623;
25
+ --amber-dim: rgba(245,166,35,0.12);
26
+ --red: #ff5555;
27
+ --red-dim: rgba(255,85,85,0.12);
28
+ --font-sans: "Syne", sans-serif;
29
+ --font-mono: "IBM Plex Mono", monospace;
30
+ }
31
+
32
+ html, body {
33
+ min-height: 100%;
34
+ background: var(--bg);
35
+ color: var(--text);
36
+ font-family: var(--font-sans);
37
+ font-size: 15px;
38
+ line-height: 1.6;
39
+ }
40
+
41
+ body { overflow: hidden; }
42
+ a { color: inherit; text-decoration: none; }
43
+ button, input, select, textarea { font: inherit; }
44
+ .muted { color: var(--muted); }
45
+ code {
46
+ font-family: var(--font-mono);
47
+ font-size: 0.92em;
48
+ padding: 0.12rem 0.36rem;
49
+ border-radius: 999px;
50
+ background: rgba(255,255,255,0.06);
51
+ }
52
+
53
+ .app {
54
+ display: flex;
55
+ height: 100vh;
56
+ background:
57
+ radial-gradient(circle at top left, rgba(0,212,170,0.07), transparent 22%),
58
+ radial-gradient(circle at bottom right, rgba(77,159,255,0.08), transparent 24%),
59
+ var(--bg);
60
+ }
61
+
62
+ .sidebar {
63
+ width: 260px;
64
+ min-width: 0;
65
+ flex-shrink: 0;
66
+ background: var(--surface);
67
+ border-right: 1px solid var(--border);
68
+ display: flex;
69
+ flex-direction: column;
70
+ padding: 20px 0;
71
+ overflow-y: auto;
72
+ transition:
73
+ width 180ms ease,
74
+ padding 180ms ease,
75
+ border-color 180ms ease,
76
+ opacity 140ms ease;
77
+ }
78
+
79
+ .app.sidebar-collapsed .sidebar {
80
+ width: 0;
81
+ padding: 0;
82
+ border-right-color: transparent;
83
+ opacity: 0;
84
+ overflow: hidden;
85
+ pointer-events: none;
86
+ }
87
+
88
+ .logo {
89
+ padding: 0 16px 20px;
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 10px;
93
+ border-bottom: 1px solid var(--border);
94
+ margin-bottom: 16px;
95
+ }
96
+ .logo-mark {
97
+ width: 30px;
98
+ height: 30px;
99
+ border-radius: 8px;
100
+ background: var(--accent);
101
+ position: relative;
102
+ flex-shrink: 0;
103
+ }
104
+ .logo-mark::after {
105
+ content: "";
106
+ position: absolute;
107
+ inset: 10px;
108
+ border-radius: 50%;
109
+ background: var(--bg);
110
+ animation: dash-ping 2s infinite;
111
+ }
112
+ @keyframes dash-ping {
113
+ 0%,100% { transform: scale(1); opacity: 1; }
114
+ 50% { transform: scale(0.6); opacity: 0.45; }
115
+ }
116
+ .logo-name { font-size: 15px; font-weight: 700; letter-spacing: -0.02em; color: var(--text); }
117
+ .logo-beta {
118
+ margin-left: auto;
119
+ font-family: var(--font-mono);
120
+ font-size: 9px;
121
+ background: var(--accent-dim);
122
+ color: var(--accent);
123
+ padding: 2px 5px;
124
+ border-radius: 4px;
125
+ }
126
+
127
+ .nav-section { padding: 0 10px; margin-bottom: 20px; }
128
+ .nav-label {
129
+ font-family: var(--font-mono);
130
+ font-size: 9px;
131
+ color: var(--muted);
132
+ text-transform: uppercase;
133
+ letter-spacing: 0.1em;
134
+ padding: 0 6px;
135
+ margin-bottom: 6px;
136
+ }
137
+ .nav-item {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 8px;
141
+ padding: 8px 10px;
142
+ border-radius: 8px;
143
+ color: var(--muted);
144
+ font-size: 13px;
145
+ font-weight: 500;
146
+ transition: all 0.15s ease;
147
+ margin-bottom: 2px;
148
+ }
149
+ .nav-item:hover { background: var(--surface2); color: var(--text); }
150
+ .nav-item.active { background: var(--accent-dim); color: var(--accent); }
151
+ .nav-icon { font-size: 14px; width: 16px; text-align: center; }
152
+ .nav-badge {
153
+ margin-left: auto;
154
+ font-family: var(--font-mono);
155
+ font-size: 10px;
156
+ background: var(--accent-dim);
157
+ color: var(--accent);
158
+ padding: 1px 6px;
159
+ border-radius: 10px;
160
+ }
161
+
162
+ .run-list-shell { padding: 0 10px; display: grid; gap: 8px; }
163
+ .run-list { display: grid; gap: 8px; }
164
+ .run-button, .run-link {
165
+ width: 100%;
166
+ display: block;
167
+ text-align: left;
168
+ cursor: pointer;
169
+ border: 1px solid var(--border);
170
+ border-radius: 10px;
171
+ padding: 12px;
172
+ background: var(--surface2);
173
+ transition: all 0.18s ease;
174
+ }
175
+ .run-button:hover, .run-button:focus-visible, .run-link:hover, .run-link:focus-visible {
176
+ border-color: var(--border2);
177
+ transform: translateY(-1px);
178
+ outline: none;
179
+ }
180
+ .run-button--active, .run-link--active {
181
+ border-color: var(--accent);
182
+ box-shadow: 0 0 0 1px var(--accent-dim);
183
+ }
184
+ .run-topline, .section-heading, .task-card__header, .history-head, .panel-topline {
185
+ display: flex;
186
+ align-items: flex-start;
187
+ justify-content: space-between;
188
+ gap: 12px;
189
+ }
190
+ .run-host { font-size: 14px; font-weight: 600; color: var(--text); }
191
+ .run-summary {
192
+ margin-top: 8px;
193
+ color: rgba(232, 232, 240, 0.82);
194
+ font-size: 13px;
195
+ line-height: 1.65;
196
+ display: -webkit-box;
197
+ overflow: hidden;
198
+ -webkit-line-clamp: 3;
199
+ -webkit-box-orient: vertical;
200
+ }
201
+
202
+ .mini-meta, .helper-row, .task-meta, .history-meta {
203
+ display: flex;
204
+ flex-wrap: wrap;
205
+ gap: 6px;
206
+ margin-top: 10px;
207
+ }
208
+ .mini-meta span, .helper-row span, .task-meta span, .history-meta span {
209
+ display: inline-flex;
210
+ align-items: center;
211
+ gap: 6px;
212
+ padding: 4px 10px;
213
+ border-radius: 20px;
214
+ border: 1px solid var(--border);
215
+ color: var(--muted);
216
+ font-size: 11px;
217
+ font-family: var(--font-mono);
218
+ }
219
+
220
+ .sidebar-footer {
221
+ margin-top: auto;
222
+ padding: 16px;
223
+ border-top: 1px solid var(--border);
224
+ }
225
+ .workspace {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: 8px;
229
+ cursor: pointer;
230
+ padding: 6px 8px;
231
+ border-radius: 8px;
232
+ transition: background 0.15s ease;
233
+ }
234
+ .workspace:hover { background: var(--surface2); }
235
+ .ws-avatar {
236
+ width: 28px;
237
+ height: 28px;
238
+ border-radius: 8px;
239
+ background: linear-gradient(135deg, #4d9fff, #00d4aa);
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ font-size: 11px;
244
+ font-weight: 700;
245
+ color: #fff;
246
+ flex-shrink: 0;
247
+ }
248
+ .ws-name { font-size: 12px; font-weight: 500; }
249
+ .ws-plan { font-size: 10px; color: var(--muted); font-family: var(--font-mono); }
250
+
251
+ .main {
252
+ flex: 1;
253
+ overflow-y: auto;
254
+ overflow-x: hidden;
255
+ display: flex;
256
+ flex-direction: column;
257
+ }
258
+
259
+ .topbar {
260
+ position: sticky;
261
+ top: 0;
262
+ z-index: 10;
263
+ background: rgba(12,12,16,0.85);
264
+ backdrop-filter: blur(12px);
265
+ border-bottom: 1px solid var(--border);
266
+ padding: 12px 24px;
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 16px;
270
+ }
271
+ .topbar-left {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 12px;
275
+ min-width: 0;
276
+ }
277
+ .page-title { font-size: 16px; font-weight: 700; }
278
+ .page-sub { font-size: 12px; color: var(--muted); margin-left: 4px; }
279
+ .topbar-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
280
+
281
+ .btn {
282
+ display: inline-flex;
283
+ align-items: center;
284
+ justify-content: center;
285
+ gap: 6px;
286
+ padding: 8px 16px;
287
+ border-radius: 8px;
288
+ font-size: 13px;
289
+ font-weight: 500;
290
+ border: none;
291
+ transition: all 0.15s ease;
292
+ }
293
+ .btn-primary { background: var(--accent); color: #0c0c10; }
294
+ .btn-primary:hover { filter: brightness(1.08); }
295
+ .btn-ghost {
296
+ background: var(--surface2);
297
+ color: var(--text);
298
+ border: 1px solid var(--border2);
299
+ }
300
+ .btn-ghost:hover { background: var(--surface3); }
301
+ .sidebar-toggle {
302
+ padding-inline: 12px;
303
+ white-space: nowrap;
304
+ }
305
+ .sidebar-toggle-label {
306
+ display: inline-block;
307
+ }
308
+ .summary-toggle {
309
+ min-width: 0;
310
+ white-space: nowrap;
311
+ }
312
+ .summary-toggle-label {
313
+ display: inline-block;
314
+ }
315
+
316
+ .content {
317
+ padding: 24px;
318
+ flex: 1;
319
+ display: flex;
320
+ flex-direction: column;
321
+ gap: 16px;
322
+ }
323
+
324
+ .metrics-grid {
325
+ display: grid;
326
+ grid-template-columns: repeat(4, 1fr);
327
+ gap: 12px;
328
+ }
329
+ .metric-card {
330
+ background: var(--surface);
331
+ border: 1px solid var(--border);
332
+ border-radius: 12px;
333
+ padding: 16px 20px;
334
+ transition: border-color 0.2s ease;
335
+ }
336
+ .metric-card:hover { border-color: var(--border2); }
337
+ .metric-label {
338
+ font-family: var(--font-mono);
339
+ font-size: 10px;
340
+ color: var(--muted);
341
+ text-transform: uppercase;
342
+ letter-spacing: 0.08em;
343
+ margin-bottom: 8px;
344
+ }
345
+ .metric-val { font-size: 28px; font-weight: 700; line-height: 1; margin-bottom: 6px; }
346
+ .metric-delta { font-size: 11px; font-family: var(--font-mono); color: var(--muted); }
347
+ .delta-up { color: var(--accent); }
348
+ .delta-down { color: var(--red); }
349
+
350
+ .new-test-card {
351
+ background: var(--surface);
352
+ border: 1px solid var(--border);
353
+ border-radius: 12px;
354
+ padding: 20px;
355
+ }
356
+ .card-title, .ss-label {
357
+ font-size: 12px;
358
+ font-family: var(--font-mono);
359
+ color: var(--muted);
360
+ text-transform: uppercase;
361
+ letter-spacing: 0.08em;
362
+ margin-bottom: 14px;
363
+ }
364
+ .url-row { display: flex; gap: 10px; margin-bottom: 14px; }
365
+ .url-input {
366
+ flex: 1;
367
+ background: var(--surface2);
368
+ border: 1px solid var(--border2);
369
+ border-radius: 8px;
370
+ padding: 10px 14px;
371
+ font-family: var(--font-mono);
372
+ font-size: 13px;
373
+ color: var(--text);
374
+ outline: none;
375
+ }
376
+ .url-input:focus { border-color: var(--accent); }
377
+ .task-intro {
378
+ margin-bottom: 12px;
379
+ color: var(--muted);
380
+ font-size: 13px;
381
+ }
382
+ .instruction-panel {
383
+ display: grid;
384
+ gap: 10px;
385
+ margin-bottom: 14px;
386
+ }
387
+ .instruction-label {
388
+ font-family: var(--font-mono);
389
+ font-size: 11px;
390
+ color: var(--muted);
391
+ text-transform: uppercase;
392
+ letter-spacing: 0.06em;
393
+ }
394
+ .instruction-input {
395
+ min-height: 190px;
396
+ resize: vertical;
397
+ background: var(--surface2);
398
+ border: 1px solid var(--border2);
399
+ border-radius: 8px;
400
+ padding: 12px 12px;
401
+ font-size: 13px;
402
+ line-height: 1.6;
403
+ color: var(--text);
404
+ outline: none;
405
+ }
406
+ .instruction-input:focus { border-color: var(--accent); }
407
+ .file-input-row {
408
+ display: grid;
409
+ gap: 6px;
410
+ margin-bottom: 14px;
411
+ }
412
+ .file-input {
413
+ background: var(--surface2);
414
+ border: 1px solid var(--border2);
415
+ border-radius: 8px;
416
+ padding: 10px 12px;
417
+ color: var(--text);
418
+ }
419
+ .file-input::file-selector-button {
420
+ margin-right: 10px;
421
+ border: 1px solid var(--border2);
422
+ border-radius: 999px;
423
+ background: var(--surface3);
424
+ color: var(--text);
425
+ padding: 6px 10px;
426
+ cursor: pointer;
427
+ }
428
+ .task-entry-grid {
429
+ display: grid;
430
+ grid-template-columns: repeat(2, minmax(0, 1fr));
431
+ gap: 10px;
432
+ margin-bottom: 14px;
433
+ }
434
+ .task-entry {
435
+ display: grid;
436
+ gap: 6px;
437
+ }
438
+ .task-entry__label {
439
+ font-family: var(--font-mono);
440
+ font-size: 11px;
441
+ color: var(--muted);
442
+ text-transform: uppercase;
443
+ letter-spacing: 0.06em;
444
+ }
445
+ .task-entry__input {
446
+ min-height: 88px;
447
+ resize: vertical;
448
+ background: var(--surface2);
449
+ border: 1px solid var(--border2);
450
+ border-radius: 8px;
451
+ padding: 10px 12px;
452
+ font-size: 13px;
453
+ line-height: 1.55;
454
+ color: var(--text);
455
+ outline: none;
456
+ }
457
+ .task-entry__input:focus { border-color: var(--accent); }
458
+ .config-row { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
459
+ .config-select {
460
+ background: var(--surface2);
461
+ border: 1px solid var(--border);
462
+ border-radius: 8px;
463
+ padding: 6px 12px;
464
+ font-family: var(--font-mono);
465
+ font-size: 12px;
466
+ color: var(--text);
467
+ outline: none;
468
+ }
469
+ .tag {
470
+ font-family: var(--font-mono);
471
+ font-size: 11px;
472
+ padding: 4px 10px;
473
+ border-radius: 20px;
474
+ border: 1px solid var(--border);
475
+ color: var(--muted);
476
+ }
477
+ .tag.on { border-color: var(--accent); color: var(--accent); background: var(--accent-dim); }
478
+
479
+ .two-col { display: grid; grid-template-columns: minmax(0, 1fr) 380px; gap: 18px; align-items: start; }
480
+ .two-col.summary-rail-collapsed { grid-template-columns: minmax(0, 1fr) 120px; }
481
+ .stack { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
482
+
483
+ .panel, .task-card, .history-card, .violation-card {
484
+ background: var(--surface);
485
+ border: 1px solid var(--border);
486
+ border-radius: 12px;
487
+ overflow: hidden;
488
+ }
489
+ .panel-head {
490
+ padding: 14px 18px;
491
+ border-bottom: 1px solid var(--border);
492
+ display: flex;
493
+ align-items: center;
494
+ gap: 10px;
495
+ }
496
+ .panel-body, .summary-section, .task-card, .history-card, .violation-card { padding: 16px; }
497
+ .panel-title { font-size: 16px; font-weight: 600; }
498
+ .panel-sub { font-size: 13px; color: var(--muted); font-family: var(--font-mono); }
499
+ .panel-actions { margin-left: auto; display: flex; gap: 8px; }
500
+ .icon-btn {
501
+ background: none;
502
+ border: 1px solid var(--border);
503
+ border-radius: 6px;
504
+ padding: 5px 10px;
505
+ font-size: 12px;
506
+ color: var(--muted);
507
+ cursor: pointer;
508
+ transition: all 0.15s ease;
509
+ }
510
+ .icon-btn:hover { border-color: var(--border2); color: var(--text); }
511
+
512
+ .live-badge {
513
+ display: inline-flex;
514
+ align-items: center;
515
+ gap: 6px;
516
+ font-family: var(--font-mono);
517
+ font-size: 10px;
518
+ color: var(--accent);
519
+ background: var(--accent-dim);
520
+ padding: 3px 8px;
521
+ border-radius: 20px;
522
+ }
523
+ .live-badge.warning { color: var(--amber); background: var(--amber-dim); }
524
+ .live-badge.danger { color: var(--red); background: var(--red-dim); }
525
+ .live-dot {
526
+ width: 6px;
527
+ height: 6px;
528
+ border-radius: 50%;
529
+ background: currentColor;
530
+ animation: dash-ping 1.6s infinite;
531
+ }
532
+ .live-dot.warning { background: var(--amber); }
533
+
534
+ .agents-grid {
535
+ display: grid;
536
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
537
+ gap: 10px;
538
+ padding: 16px;
539
+ }
540
+ .agent-card {
541
+ background: var(--surface2);
542
+ border: 1px solid var(--border);
543
+ border-radius: 10px;
544
+ padding: 12px;
545
+ transition: all 0.18s ease;
546
+ position: relative;
547
+ overflow: hidden;
548
+ }
549
+ .agent-card[data-run-id] { cursor: pointer; }
550
+ .agent-card::before {
551
+ content: "";
552
+ position: absolute;
553
+ top: 0;
554
+ left: 0;
555
+ right: 0;
556
+ height: 2px;
557
+ opacity: 1;
558
+ }
559
+ .agent-card.st-done::before { background: var(--accent); }
560
+ .agent-card.st-active::before { background: var(--blue); }
561
+ .agent-card.st-error::before { background: var(--amber); }
562
+ .agent-card.st-idle::before { background: var(--border2); }
563
+ .agent-card:hover { border-color: var(--border2); transform: translateY(-1px); }
564
+ .agent-card.selected { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent-dim); }
565
+ .agent-num {
566
+ font-family: var(--font-mono);
567
+ font-size: 10px;
568
+ color: var(--muted);
569
+ margin-bottom: 4px;
570
+ display: flex;
571
+ justify-content: space-between;
572
+ align-items: center;
573
+ }
574
+ .status-pip {
575
+ width: 6px;
576
+ height: 6px;
577
+ border-radius: 50%;
578
+ flex-shrink: 0;
579
+ }
580
+ .pip-green { background: var(--accent); }
581
+ .pip-blue { background: var(--blue); animation: dash-ping 1.4s infinite; }
582
+ .pip-amber { background: var(--amber); }
583
+ .pip-gray { background: var(--muted); }
584
+ .agent-persona { font-size: 13px; font-weight: 600; margin-bottom: 4px; }
585
+ .agent-doing {
586
+ font-size: 12px;
587
+ font-family: var(--font-sans);
588
+ color: var(--muted);
589
+ margin-bottom: 8px;
590
+ line-height: 1.55;
591
+ min-height: 58px;
592
+ }
593
+ .agent-score { font-size: 20px; font-weight: 700; margin-bottom: 6px; }
594
+ .score-green { color: var(--accent); }
595
+ .score-amber { color: var(--amber); }
596
+ .score-red { color: var(--red); }
597
+ .score-muted { color: var(--muted); }
598
+ .prog-track { height: 2px; background: var(--border); border-radius: 2px; overflow: hidden; }
599
+ .prog-fill { height: 100%; border-radius: 2px; }
600
+ .prog-green { background: var(--accent); }
601
+ .prog-blue { background: var(--blue); }
602
+ .prog-amber { background: var(--amber); }
603
+
604
+ .feedback-list {
605
+ padding: 0 16px 16px;
606
+ display: flex;
607
+ flex-direction: column;
608
+ gap: 8px;
609
+ max-height: 320px;
610
+ overflow-y: auto;
611
+ }
612
+ .fb-item {
613
+ background: var(--surface2);
614
+ border: 1px solid var(--border);
615
+ border-radius: 8px;
616
+ padding: 10px 12px;
617
+ transition: border-color 0.15s ease;
618
+ }
619
+ .fb-item:hover { border-color: var(--border2); }
620
+ .fb-top {
621
+ display: flex;
622
+ justify-content: space-between;
623
+ align-items: center;
624
+ gap: 12px;
625
+ margin-bottom: 5px;
626
+ }
627
+ .fb-agent { font-family: var(--font-mono); font-size: 11px; color: var(--muted); }
628
+ .fb-tag {
629
+ font-family: var(--font-mono);
630
+ font-size: 10px;
631
+ padding: 2px 8px;
632
+ border-radius: 20px;
633
+ }
634
+ .tag-bug { background: var(--red-dim); color: var(--red); }
635
+ .tag-ux { background: var(--amber-dim); color: var(--amber); }
636
+ .tag-pos { background: var(--accent-dim); color: var(--accent); }
637
+ .tag-perf { background: var(--blue-dim); color: var(--blue); }
638
+ .fb-text { font-size: 14px; color: var(--text); line-height: 1.65; }
639
+
640
+ .summary-section { border-bottom: 1px solid var(--border); }
641
+ .summary-section:last-child { border-bottom: none; }
642
+ .summary-rail--collapsed .panel-head {
643
+ flex-direction: column;
644
+ align-items: stretch;
645
+ padding: 12px;
646
+ }
647
+ .summary-rail--collapsed .panel-title {
648
+ font-size: 11px;
649
+ text-align: center;
650
+ color: var(--muted);
651
+ font-family: var(--font-mono);
652
+ text-transform: uppercase;
653
+ letter-spacing: 0.08em;
654
+ }
655
+ .summary-rail--collapsed .panel-actions {
656
+ margin-left: 0;
657
+ width: 100%;
658
+ justify-content: center;
659
+ }
660
+ .summary-rail--collapsed [data-summary-share],
661
+ .summary-rail--collapsed .summary-rail-body { display: none; }
662
+ .summary-rail--collapsed .summary-toggle { width: 100%; }
663
+ .big-score { font-size: 48px; font-weight: 700; color: var(--accent); line-height: 1; }
664
+ .score-dim { font-size: 20px; color: var(--muted); }
665
+ .score-bars { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
666
+ .sb-row { display: flex; align-items: center; gap: 8px; font-size: 12px; }
667
+ .sb-name { color: var(--muted); width: 86px; font-family: var(--font-mono); }
668
+ .sb-track { flex: 1; height: 4px; background: var(--border); border-radius: 2px; overflow: hidden; }
669
+ .sb-fill { height: 100%; border-radius: 2px; }
670
+ .sb-val { font-family: var(--font-mono); font-size: 12px; width: 32px; text-align: right; }
671
+
672
+ .issue-list { display: flex; flex-direction: column; gap: 6px; }
673
+ .issue-row {
674
+ display: flex;
675
+ align-items: flex-start;
676
+ gap: 8px;
677
+ font-size: 13px;
678
+ padding: 8px 10px;
679
+ border-radius: 6px;
680
+ transition: background 0.15s ease;
681
+ }
682
+ .issue-row:hover { background: var(--surface2); }
683
+ .issue-icon {
684
+ width: 18px;
685
+ height: 18px;
686
+ border-radius: 5px;
687
+ display: flex;
688
+ align-items: center;
689
+ justify-content: center;
690
+ font-size: 9px;
691
+ font-weight: 700;
692
+ flex-shrink: 0;
693
+ margin-top: 1px;
694
+ }
695
+ .i-bug { background: var(--red-dim); color: var(--red); }
696
+ .i-ux { background: var(--amber-dim); color: var(--amber); }
697
+ .i-info { background: var(--blue-dim); color: var(--blue); }
698
+ .issue-text { color: var(--text); line-height: 1.55; flex: 1; }
699
+ .issue-cnt { font-family: var(--font-mono); font-size: 11px; color: var(--muted); flex-shrink: 0; }
700
+
701
+ .persona-chips { display: flex; flex-wrap: wrap; gap: 5px; }
702
+ .p-chip {
703
+ font-family: var(--font-mono);
704
+ font-size: 11px;
705
+ padding: 3px 8px;
706
+ border-radius: 20px;
707
+ border: 1px solid var(--border);
708
+ color: var(--muted);
709
+ }
710
+
711
+ .activity-log { display: flex; flex-direction: column; gap: 0; }
712
+ .al-row {
713
+ display: flex;
714
+ gap: 10px;
715
+ padding: 8px 0;
716
+ border-bottom: 1px solid var(--border);
717
+ font-size: 12px;
718
+ }
719
+ .al-row:last-child { border-bottom: none; }
720
+ .al-time { font-family: var(--font-mono); color: var(--muted); width: 52px; flex-shrink: 0; }
721
+ .al-text { color: var(--text); line-height: 1.55; }
722
+ .al-id { font-family: var(--font-mono); color: var(--blue); }
723
+
724
+ .list-grid, .task-stack, .accessibility-grid, .history-grid {
725
+ display: grid;
726
+ gap: 12px;
727
+ }
728
+ .list-grid { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
729
+ .accessibility-grid, .history-grid { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
730
+ .prose-list, .evidence-list {
731
+ margin-top: 12px;
732
+ padding-left: 18px;
733
+ display: grid;
734
+ gap: 10px;
735
+ }
736
+ .prose-list li, .evidence-list li {
737
+ font-size: 14px;
738
+ line-height: 1.7;
739
+ color: rgba(232, 232, 240, 0.88);
740
+ }
741
+
742
+ .task-card, .history-card, .violation-card { padding: 16px; }
743
+ .task-card__reason, .history-card p, .violation-card p {
744
+ margin-top: 8px;
745
+ color: var(--muted);
746
+ font-size: 14px;
747
+ line-height: 1.72;
748
+ }
749
+ .step-proof {
750
+ display: grid;
751
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
752
+ gap: 10px;
753
+ margin-top: 12px;
754
+ }
755
+ .proof-shot {
756
+ margin: 0;
757
+ display: grid;
758
+ gap: 6px;
759
+ }
760
+ .proof-shot a {
761
+ display: block;
762
+ border: 1px solid var(--border);
763
+ border-radius: 10px;
764
+ overflow: hidden;
765
+ background: var(--surface2);
766
+ }
767
+ .proof-shot img {
768
+ width: 100%;
769
+ height: 160px;
770
+ object-fit: cover;
771
+ display: block;
772
+ }
773
+ .proof-shot figcaption {
774
+ color: var(--muted);
775
+ font-size: 11px;
776
+ font-family: var(--font-mono);
777
+ text-transform: uppercase;
778
+ letter-spacing: 0.06em;
779
+ }
780
+ .visit-recap__line {
781
+ margin-top: 8px;
782
+ color: rgba(232, 232, 240, 0.92);
783
+ font-size: 16px;
784
+ line-height: 1.82;
785
+ }
786
+ .task-details {
787
+ margin-top: 14px;
788
+ border-top: 1px solid var(--border);
789
+ padding-top: 14px;
790
+ }
791
+ .task-details > summary {
792
+ cursor: pointer;
793
+ color: var(--text);
794
+ font-size: 13px;
795
+ font-family: var(--font-mono);
796
+ text-transform: uppercase;
797
+ letter-spacing: 0.08em;
798
+ }
799
+ .visit-recap { display: grid; gap: 10px; }
800
+
801
+ .pill {
802
+ display: inline-flex;
803
+ align-items: center;
804
+ gap: 6px;
805
+ padding: 3px 9px;
806
+ border-radius: 20px;
807
+ font-family: var(--font-mono);
808
+ font-size: 10px;
809
+ }
810
+ .pill--score-high, .pill--status-success, .pill--status-completed, .pill--friction-none {
811
+ color: var(--accent);
812
+ background: var(--accent-dim);
813
+ }
814
+ .pill--score-mid, .pill--status-partial_success, .pill--status-queued, .pill--status-running, .pill--friction-low, .pill--friction-medium {
815
+ color: var(--amber);
816
+ background: var(--amber-dim);
817
+ }
818
+ .pill--score-low, .pill--status-failed, .pill--friction-high {
819
+ color: var(--red);
820
+ background: var(--red-dim);
821
+ }
822
+
823
+ .link-row {
824
+ display: flex;
825
+ flex-wrap: wrap;
826
+ gap: 10px;
827
+ margin-top: 10px;
828
+ }
829
+ .inline-link {
830
+ color: var(--accent);
831
+ font-size: 12px;
832
+ font-weight: 500;
833
+ }
834
+ .inline-link:hover { text-decoration: underline; }
835
+
836
+ .warning-note, .empty-stack {
837
+ border: 1px dashed var(--border2);
838
+ border-radius: 12px;
839
+ padding: 14px;
840
+ background: var(--surface2);
841
+ color: var(--muted);
842
+ }
843
+ .empty-stack {
844
+ text-align: center;
845
+ min-height: 220px;
846
+ display: grid;
847
+ place-items: center;
848
+ }
849
+
850
+ @media (max-width: 1200px) {
851
+ .metrics-grid { grid-template-columns: repeat(2, 1fr); }
852
+ .two-col { grid-template-columns: 1fr; }
853
+ .two-col.summary-rail-collapsed { grid-template-columns: 1fr; }
854
+ }
855
+
856
+ @media (max-width: 900px) {
857
+ body { overflow: auto; }
858
+ .app { display: block; height: auto; min-height: 100vh; }
859
+ .sidebar {
860
+ width: auto;
861
+ border-right: 0;
862
+ border-bottom: 1px solid var(--border);
863
+ max-height: none;
864
+ }
865
+ .app.sidebar-collapsed .sidebar {
866
+ width: auto;
867
+ max-height: 0;
868
+ padding: 0;
869
+ border-bottom-color: transparent;
870
+ }
871
+ .main { min-height: auto; }
872
+ }
873
+
874
+ @media (max-width: 720px) {
875
+ .content, .topbar { padding: 16px; }
876
+ .topbar { flex-wrap: wrap; }
877
+ .topbar-left { width: 100%; }
878
+ .topbar-right { width: 100%; margin-left: 0; }
879
+ .topbar-right .btn { flex: 1; }
880
+ .sidebar-toggle { width: 100%; }
881
+ .sidebar-toggle-label { flex: 1; text-align: center; }
882
+ .metrics-grid { grid-template-columns: 1fr; }
883
+ .url-row { flex-direction: column; }
884
+ .task-entry-grid { grid-template-columns: 1fr; }
885
+ .agents-grid { grid-template-columns: 1fr; }
886
+ .list-grid, .accessibility-grid, .history-grid { grid-template-columns: 1fr; }
887
+ }
888
+ `;