@urateam/dashboard 0.1.4 → 0.1.6

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 (115) hide show
  1. package/dist/__tests__/audit.test.d.ts +2 -0
  2. package/dist/__tests__/audit.test.d.ts.map +1 -0
  3. package/dist/__tests__/audit.test.js +219 -0
  4. package/dist/__tests__/audit.test.js.map +1 -0
  5. package/dist/__tests__/auth-routes.test.d.ts +2 -0
  6. package/dist/__tests__/auth-routes.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth-routes.test.js +116 -0
  8. package/dist/__tests__/auth-routes.test.js.map +1 -0
  9. package/dist/__tests__/bootstrap-integration.test.d.ts +2 -0
  10. package/dist/__tests__/bootstrap-integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/bootstrap-integration.test.js +75 -0
  12. package/dist/__tests__/bootstrap-integration.test.js.map +1 -0
  13. package/dist/__tests__/cost-chart.test.d.ts +2 -0
  14. package/dist/__tests__/cost-chart.test.d.ts.map +1 -0
  15. package/dist/__tests__/cost-chart.test.js +51 -0
  16. package/dist/__tests__/cost-chart.test.js.map +1 -0
  17. package/dist/__tests__/cost.test.d.ts +2 -0
  18. package/dist/__tests__/cost.test.d.ts.map +1 -0
  19. package/dist/__tests__/cost.test.js +197 -0
  20. package/dist/__tests__/cost.test.js.map +1 -0
  21. package/dist/__tests__/helpers/license.d.ts +8 -0
  22. package/dist/__tests__/helpers/license.d.ts.map +1 -0
  23. package/dist/__tests__/helpers/license.js +71 -0
  24. package/dist/__tests__/helpers/license.js.map +1 -0
  25. package/dist/__tests__/rbac-middleware.test.d.ts +2 -0
  26. package/dist/__tests__/rbac-middleware.test.d.ts.map +1 -0
  27. package/dist/__tests__/rbac-middleware.test.js +59 -0
  28. package/dist/__tests__/rbac-middleware.test.js.map +1 -0
  29. package/dist/__tests__/retry-route.test.d.ts +2 -0
  30. package/dist/__tests__/retry-route.test.d.ts.map +1 -0
  31. package/dist/__tests__/retry-route.test.js +115 -0
  32. package/dist/__tests__/retry-route.test.js.map +1 -0
  33. package/dist/__tests__/sso-integration.test.d.ts +2 -0
  34. package/dist/__tests__/sso-integration.test.d.ts.map +1 -0
  35. package/dist/__tests__/sso-integration.test.js +91 -0
  36. package/dist/__tests__/sso-integration.test.js.map +1 -0
  37. package/dist/__tests__/sso-middleware.test.d.ts +2 -0
  38. package/dist/__tests__/sso-middleware.test.d.ts.map +1 -0
  39. package/dist/__tests__/sso-middleware.test.js +66 -0
  40. package/dist/__tests__/sso-middleware.test.js.map +1 -0
  41. package/dist/__tests__/users-routes.test.d.ts +2 -0
  42. package/dist/__tests__/users-routes.test.d.ts.map +1 -0
  43. package/dist/__tests__/users-routes.test.js +127 -0
  44. package/dist/__tests__/users-routes.test.js.map +1 -0
  45. package/dist/middleware/rbac.d.ts +4 -0
  46. package/dist/middleware/rbac.d.ts.map +1 -0
  47. package/dist/middleware/rbac.js +21 -0
  48. package/dist/middleware/rbac.js.map +1 -0
  49. package/dist/middleware/sso.d.ts +9 -0
  50. package/dist/middleware/sso.d.ts.map +1 -0
  51. package/dist/middleware/sso.js +47 -0
  52. package/dist/middleware/sso.js.map +1 -0
  53. package/dist/routes/audit.d.ts +4 -0
  54. package/dist/routes/audit.d.ts.map +1 -0
  55. package/dist/routes/audit.js +123 -0
  56. package/dist/routes/audit.js.map +1 -0
  57. package/dist/routes/auth.d.ts +10 -0
  58. package/dist/routes/auth.d.ts.map +1 -0
  59. package/dist/routes/auth.js +105 -0
  60. package/dist/routes/auth.js.map +1 -0
  61. package/dist/routes/config.d.ts.map +1 -1
  62. package/dist/routes/config.js +4 -2
  63. package/dist/routes/config.js.map +1 -1
  64. package/dist/routes/coordination.d.ts.map +1 -1
  65. package/dist/routes/coordination.js +5 -3
  66. package/dist/routes/coordination.js.map +1 -1
  67. package/dist/routes/cost.d.ts +10 -0
  68. package/dist/routes/cost.d.ts.map +1 -0
  69. package/dist/routes/cost.js +104 -0
  70. package/dist/routes/cost.js.map +1 -0
  71. package/dist/routes/errors.d.ts.map +1 -1
  72. package/dist/routes/errors.js +4 -2
  73. package/dist/routes/errors.js.map +1 -1
  74. package/dist/routes/runs.d.ts +9 -1
  75. package/dist/routes/runs.d.ts.map +1 -1
  76. package/dist/routes/runs.js +82 -9
  77. package/dist/routes/runs.js.map +1 -1
  78. package/dist/routes/tokens.d.ts.map +1 -1
  79. package/dist/routes/tokens.js +4 -2
  80. package/dist/routes/tokens.js.map +1 -1
  81. package/dist/routes/users.d.ts +8 -0
  82. package/dist/routes/users.d.ts.map +1 -0
  83. package/dist/routes/users.js +64 -0
  84. package/dist/routes/users.js.map +1 -0
  85. package/dist/server.d.ts +13 -1
  86. package/dist/server.d.ts.map +1 -1
  87. package/dist/server.js +65 -7
  88. package/dist/server.js.map +1 -1
  89. package/dist/static/style.css +648 -0
  90. package/dist/views/audit.d.ts +29 -0
  91. package/dist/views/audit.d.ts.map +1 -0
  92. package/dist/views/audit.js +144 -0
  93. package/dist/views/audit.js.map +1 -0
  94. package/dist/views/cost.d.ts +28 -0
  95. package/dist/views/cost.d.ts.map +1 -0
  96. package/dist/views/cost.js +173 -0
  97. package/dist/views/cost.js.map +1 -0
  98. package/dist/views/forbidden.d.ts +7 -0
  99. package/dist/views/forbidden.d.ts.map +1 -0
  100. package/dist/views/forbidden.js +18 -0
  101. package/dist/views/forbidden.js.map +1 -0
  102. package/dist/views/layout.d.ts +11 -1
  103. package/dist/views/layout.d.ts.map +1 -1
  104. package/dist/views/layout.js +12 -18
  105. package/dist/views/layout.js.map +1 -1
  106. package/dist/views/run-detail.d.ts +1 -1
  107. package/dist/views/run-detail.d.ts.map +1 -1
  108. package/dist/views/run-detail.js +6 -1
  109. package/dist/views/run-detail.js.map +1 -1
  110. package/dist/views/users.d.ts +16 -0
  111. package/dist/views/users.d.ts.map +1 -0
  112. package/dist/views/users.js +44 -0
  113. package/dist/views/users.js.map +1 -0
  114. package/package.json +7 -5
  115. package/LICENSE +0 -27
@@ -0,0 +1,648 @@
1
+ /* Linear Agent Dashboard — Modern Refreshed CSS */
2
+
3
+ /* ── Variables ────────────────────────────────────────────────── */
4
+ :root {
5
+ /* Palette — light */
6
+ --color-bg: #f8fafc;
7
+ --color-surface: #ffffff;
8
+ --color-border: #e2e8f0;
9
+ --color-text: #0f172a;
10
+ --color-text-muted: #64748b;
11
+ --color-green: #22c55e;
12
+ --color-red: #ef4444;
13
+ --color-yellow: #eab308;
14
+ --color-gray: #9ca3af;
15
+ --color-blue: #3b82f6;
16
+ --color-orange: #f97316;
17
+ --color-purple: #8b5cf6;
18
+
19
+ /* Nav */
20
+ --color-nav-bg: #0f172a;
21
+ --color-nav-text: #f1f5f9;
22
+ --color-nav-accent: #38bdf8;
23
+
24
+ /* Elevation */
25
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
26
+ --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
27
+
28
+ /* Shape */
29
+ --radius: 8px;
30
+ --radius-sm: 4px;
31
+ --radius-xs: 2px;
32
+ }
33
+
34
+ /* ── Dark mode ────────────────────────────────────────────────── */
35
+ @media (prefers-color-scheme: dark) {
36
+ :root {
37
+ --color-bg: #0f172a;
38
+ --color-surface: #1e293b;
39
+ --color-border: #334155;
40
+ --color-text: #f1f5f9;
41
+ --color-text-muted: #94a3b8;
42
+ --color-nav-bg: #020617;
43
+ --color-nav-text: #f1f5f9;
44
+ }
45
+ }
46
+
47
+ /* ── Reset ────────────────────────────────────────────────────── */
48
+ *, *::before, *::after {
49
+ margin: 0;
50
+ padding: 0;
51
+ box-sizing: border-box;
52
+ }
53
+
54
+ /* ── Base typography ──────────────────────────────────────────── */
55
+ body {
56
+ font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont,
57
+ 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
58
+ background: var(--color-bg);
59
+ color: var(--color-text);
60
+ line-height: 1.6;
61
+ font-size: 0.9375rem;
62
+ -webkit-font-smoothing: antialiased;
63
+ }
64
+
65
+ /* ── Sticky navigation ────────────────────────────────────────── */
66
+ nav {
67
+ position: sticky;
68
+ top: 0;
69
+ z-index: 100;
70
+ background: var(--color-nav-bg);
71
+ color: var(--color-nav-text);
72
+ padding: 0 1.5rem;
73
+ display: flex;
74
+ align-items: center;
75
+ gap: 0.125rem;
76
+ height: 3.5rem;
77
+ box-shadow: 0 1px 4px rgb(0 0 0 / 0.4);
78
+ }
79
+
80
+ nav .brand {
81
+ font-weight: 700;
82
+ font-size: 1rem;
83
+ letter-spacing: -0.01em;
84
+ margin-right: 1.5rem;
85
+ color: var(--color-nav-accent);
86
+ text-decoration: none;
87
+ }
88
+
89
+ nav a {
90
+ color: var(--color-nav-text);
91
+ text-decoration: none;
92
+ font-size: 0.875rem;
93
+ font-weight: 500;
94
+ padding: 0.375rem 0.75rem;
95
+ border-radius: var(--radius-sm);
96
+ opacity: 0.75;
97
+ transition: opacity 0.15s ease, background-color 0.15s ease;
98
+ }
99
+
100
+ nav a:hover {
101
+ opacity: 1;
102
+ background: rgb(255 255 255 / 0.1);
103
+ text-decoration: none;
104
+ }
105
+
106
+ nav a:focus-visible {
107
+ outline: 2px solid var(--color-nav-accent);
108
+ outline-offset: 2px;
109
+ opacity: 1;
110
+ }
111
+
112
+ /* ── Page layout ──────────────────────────────────────────────── */
113
+ main {
114
+ max-width: 72rem;
115
+ margin: 2rem auto;
116
+ padding: 0 1.5rem;
117
+ }
118
+
119
+ h1 {
120
+ font-size: 1.5rem;
121
+ font-weight: 700;
122
+ letter-spacing: -0.02em;
123
+ margin-bottom: 1.5rem;
124
+ }
125
+
126
+ h2 {
127
+ font-size: 1.125rem;
128
+ font-weight: 600;
129
+ letter-spacing: -0.01em;
130
+ margin-bottom: 0.75rem;
131
+ }
132
+
133
+ h3 {
134
+ font-size: 0.9375rem;
135
+ font-weight: 600;
136
+ margin-bottom: 0.5rem;
137
+ }
138
+
139
+ /* ── Responsive table wrapper ─────────────────────────────────── */
140
+ .table-wrapper {
141
+ overflow-x: auto;
142
+ -webkit-overflow-scrolling: touch;
143
+ border-radius: var(--radius);
144
+ border: 1px solid var(--color-border);
145
+ box-shadow: var(--shadow-sm);
146
+ }
147
+
148
+ /* ── Tables ───────────────────────────────────────────────────── */
149
+ table {
150
+ width: 100%;
151
+ border-collapse: collapse;
152
+ background: var(--color-surface);
153
+ font-size: 0.875rem;
154
+ }
155
+
156
+ th, td {
157
+ padding: 0.625rem 1rem;
158
+ text-align: left;
159
+ border-bottom: 1px solid var(--color-border);
160
+ }
161
+
162
+ th {
163
+ background: var(--color-bg);
164
+ font-weight: 600;
165
+ font-size: 0.6875rem;
166
+ text-transform: uppercase;
167
+ letter-spacing: 0.07em;
168
+ color: var(--color-text-muted);
169
+ white-space: nowrap;
170
+ }
171
+
172
+ tr:last-child td {
173
+ border-bottom: none;
174
+ }
175
+
176
+ tbody tr {
177
+ transition: background-color 0.1s ease;
178
+ }
179
+
180
+ tbody tr:hover td {
181
+ background: color-mix(in srgb, var(--color-blue) 5%, var(--color-surface));
182
+ }
183
+
184
+ /* ── Status badges ────────────────────────────────────────────── */
185
+ .badge {
186
+ display: inline-flex;
187
+ align-items: center;
188
+ gap: 0.3rem;
189
+ padding: 0.2rem 0.625rem;
190
+ border-radius: 9999px;
191
+ font-size: 0.6875rem;
192
+ font-weight: 700;
193
+ text-transform: uppercase;
194
+ letter-spacing: 0.05em;
195
+ white-space: nowrap;
196
+ }
197
+
198
+ /* Light-mode badge colors */
199
+ .badge-completed { background: #dcfce7; color: #166534; }
200
+ .badge-failed { background: #fee2e2; color: #991b1b; }
201
+ .badge-running { background: #fef9c3; color: #854d0e; }
202
+ .badge-queued { background: #dbeafe; color: #1e40af; }
203
+ .badge-aborted { background: #fce7f3; color: #9d174d; }
204
+ .badge-paused { background: #e0e7ff; color: #3730a3; }
205
+ .badge-skipped { background: #f3f4f6; color: #6b7280; }
206
+ .badge-retriable { background: #ffedd5; color: #9a3412; }
207
+ .badge-draft { background: #f3f4f6; color: #6b7280; }
208
+ .badge-stage { background: var(--color-border); color: var(--color-text-muted); }
209
+
210
+ /* Dark-mode badge overrides */
211
+ @media (prefers-color-scheme: dark) {
212
+ .badge-completed { background: #14532d; color: #86efac; }
213
+ .badge-failed { background: #7f1d1d; color: #fca5a5; }
214
+ .badge-running { background: #713f12; color: #fde047; }
215
+ .badge-queued { background: #1e3a5f; color: #93c5fd; }
216
+ .badge-aborted { background: #500724; color: #f9a8d4; }
217
+ .badge-paused { background: #1e1b4b; color: #a5b4fc; }
218
+ .badge-skipped { background: #1f2937; color: #9ca3af; }
219
+ .badge-retriable { background: #431407; color: #fdba74; }
220
+ .badge-draft { background: #1f2937; color: #9ca3af; }
221
+ .badge-stage { background: #334155; color: #94a3b8; }
222
+ }
223
+
224
+ /* Animated dot for running / in-flight statuses */
225
+ .badge-running::after {
226
+ content: '';
227
+ display: inline-block;
228
+ width: 6px;
229
+ height: 6px;
230
+ border-radius: 50%;
231
+ background: currentColor;
232
+ animation: badge-pulse 1.5s ease-in-out infinite;
233
+ flex-shrink: 0;
234
+ }
235
+
236
+ @keyframes badge-pulse {
237
+ 0%, 100% { opacity: 1; transform: scale(1); }
238
+ 50% { opacity: 0.3; transform: scale(0.75); }
239
+ }
240
+
241
+ /* ── Cards ────────────────────────────────────────────────────── */
242
+ .card {
243
+ background: var(--color-surface);
244
+ border: 1px solid var(--color-border);
245
+ border-radius: var(--radius);
246
+ padding: 1.25rem 1.5rem;
247
+ margin-bottom: 1rem;
248
+ box-shadow: var(--shadow-sm);
249
+ }
250
+
251
+ .card > h2 {
252
+ padding-bottom: 0.625rem;
253
+ border-bottom: 1px solid var(--color-border);
254
+ margin-bottom: 1rem;
255
+ }
256
+
257
+ /* ── Duration badge ───────────────────────────────────────────── */
258
+ .duration-badge {
259
+ display: inline-flex;
260
+ align-items: center;
261
+ gap: 0.375rem;
262
+ padding: 0.25rem 0.75rem;
263
+ background: var(--color-bg);
264
+ border: 1px solid var(--color-border);
265
+ border-radius: var(--radius-sm);
266
+ font-size: 0.875rem;
267
+ font-weight: 600;
268
+ color: var(--color-text);
269
+ }
270
+
271
+ /* ── Meta / description list grid ────────────────────────────── */
272
+ .meta {
273
+ display: grid;
274
+ grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
275
+ gap: 0.875rem 1.25rem;
276
+ margin-bottom: 0.5rem;
277
+ font-size: 0.875rem;
278
+ }
279
+
280
+ .meta dt {
281
+ color: var(--color-text-muted);
282
+ font-size: 0.6875rem;
283
+ text-transform: uppercase;
284
+ letter-spacing: 0.07em;
285
+ font-weight: 600;
286
+ margin-bottom: 0.1875rem;
287
+ }
288
+
289
+ .meta dd {
290
+ font-weight: 500;
291
+ word-break: break-word;
292
+ }
293
+
294
+ /* ── Bar charts (tokens) ──────────────────────────────────────── */
295
+ .bar-chart {
296
+ margin-bottom: 0.5rem;
297
+ }
298
+
299
+ .bar-row {
300
+ display: flex;
301
+ align-items: center;
302
+ gap: 0.5rem;
303
+ margin-bottom: 0.4375rem;
304
+ font-size: 0.8125rem;
305
+ }
306
+
307
+ .bar-label {
308
+ min-width: 9rem;
309
+ max-width: 9rem;
310
+ text-align: right;
311
+ color: var(--color-text-muted);
312
+ font-size: 0.75rem;
313
+ white-space: nowrap;
314
+ overflow: hidden;
315
+ text-overflow: ellipsis;
316
+ }
317
+
318
+ .bar-track {
319
+ flex: 1;
320
+ background: var(--color-border);
321
+ border-radius: var(--radius-xs);
322
+ height: 1.125rem;
323
+ overflow: hidden;
324
+ min-width: 60px;
325
+ }
326
+
327
+ .bar-fill {
328
+ height: 100%;
329
+ border-radius: var(--radius-xs);
330
+ min-width: 1px;
331
+ transition: width 0.4s ease;
332
+ }
333
+
334
+ .bar-fill-input { background: var(--color-blue); }
335
+ .bar-fill-output { background: var(--color-purple); }
336
+
337
+ .bar-value {
338
+ min-width: 6.5rem;
339
+ font-size: 0.75rem;
340
+ color: var(--color-text-muted);
341
+ white-space: nowrap;
342
+ }
343
+
344
+ /* ── Collapsible details ──────────────────────────────────────── */
345
+ details {
346
+ margin-bottom: 0.5rem;
347
+ border: 1px solid var(--color-border);
348
+ border-radius: var(--radius-sm);
349
+ overflow: hidden;
350
+ }
351
+
352
+ details summary {
353
+ cursor: pointer;
354
+ font-weight: 600;
355
+ font-size: 0.875rem;
356
+ padding: 0.625rem 0.875rem;
357
+ background: var(--color-bg);
358
+ user-select: none;
359
+ list-style: none;
360
+ display: flex;
361
+ align-items: center;
362
+ gap: 0.5rem;
363
+ transition: background-color 0.12s ease;
364
+ }
365
+
366
+ details summary::-webkit-details-marker { display: none; }
367
+
368
+ details summary::before {
369
+ content: '▶';
370
+ font-size: 0.5625rem;
371
+ opacity: 0.55;
372
+ transition: transform 0.15s ease;
373
+ flex-shrink: 0;
374
+ }
375
+
376
+ details[open] summary::before {
377
+ transform: rotate(90deg);
378
+ }
379
+
380
+ details summary:hover {
381
+ background: color-mix(in srgb, var(--color-blue) 6%, var(--color-bg));
382
+ }
383
+
384
+ details summary:focus-visible {
385
+ outline: 2px solid var(--color-blue);
386
+ outline-offset: -2px;
387
+ }
388
+
389
+ details > :not(summary) {
390
+ padding: 0.75rem 0.875rem;
391
+ border-top: 1px solid var(--color-border);
392
+ }
393
+
394
+ /* Log section (large collapsible) */
395
+ .log-section {
396
+ border: 1px solid var(--color-border);
397
+ border-radius: var(--radius);
398
+ overflow: hidden;
399
+ }
400
+
401
+ .log-section > summary {
402
+ font-size: 0.9375rem;
403
+ padding: 0.75rem 1.25rem;
404
+ background: var(--color-bg);
405
+ }
406
+
407
+ .log-entries {
408
+ max-height: 32rem;
409
+ overflow-y: auto;
410
+ padding: 0.25rem 0;
411
+ }
412
+
413
+ /* ── Pre / Code ───────────────────────────────────────────────── */
414
+ pre {
415
+ background: #f1f5f9;
416
+ border: 1px solid var(--color-border);
417
+ border-radius: var(--radius-sm);
418
+ padding: 0.875rem 1rem;
419
+ overflow-x: auto;
420
+ font-size: 0.8125rem;
421
+ line-height: 1.6;
422
+ max-height: 20rem;
423
+ overflow-y: auto;
424
+ margin: 0;
425
+ }
426
+
427
+ @media (prefers-color-scheme: dark) {
428
+ pre { background: #0f172a; }
429
+ }
430
+
431
+ code {
432
+ font-family: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, Consolas,
433
+ 'Liberation Mono', monospace;
434
+ font-size: 0.8125rem;
435
+ }
436
+
437
+ /* ── Links ────────────────────────────────────────────────────── */
438
+ a {
439
+ color: var(--color-blue);
440
+ text-decoration: none;
441
+ }
442
+
443
+ a:hover {
444
+ text-decoration: underline;
445
+ }
446
+
447
+ a:focus-visible {
448
+ outline: 2px solid var(--color-blue);
449
+ outline-offset: 2px;
450
+ border-radius: 2px;
451
+ }
452
+
453
+ /* ── Pagination ───────────────────────────────────────────────── */
454
+ .pagination {
455
+ display: flex;
456
+ flex-wrap: wrap;
457
+ gap: 0.375rem;
458
+ margin-top: 1rem;
459
+ font-size: 0.875rem;
460
+ }
461
+
462
+ .pagination a,
463
+ .pagination span {
464
+ padding: 0.25rem 0.75rem;
465
+ border: 1px solid var(--color-border);
466
+ border-radius: var(--radius-sm);
467
+ transition: background-color 0.1s ease;
468
+ }
469
+
470
+ .pagination a:hover {
471
+ background: var(--color-bg);
472
+ text-decoration: none;
473
+ }
474
+
475
+ .pagination span {
476
+ background: var(--color-blue);
477
+ color: #fff;
478
+ border-color: var(--color-blue);
479
+ }
480
+
481
+ /* ── Stage timeline ───────────────────────────────────────────── */
482
+ .timeline {
483
+ position: relative;
484
+ padding-left: 2rem;
485
+ }
486
+
487
+ .timeline::before {
488
+ content: '';
489
+ position: absolute;
490
+ left: 0.6875rem;
491
+ top: 0.75rem;
492
+ bottom: 0.75rem;
493
+ width: 2px;
494
+ background: var(--color-border);
495
+ }
496
+
497
+ .timeline-item {
498
+ position: relative;
499
+ margin-bottom: 0.875rem;
500
+ padding: 0.75rem 1rem;
501
+ background: var(--color-surface);
502
+ border: 1px solid var(--color-border);
503
+ border-radius: var(--radius);
504
+ box-shadow: var(--shadow-sm);
505
+ }
506
+
507
+ .timeline-item::before {
508
+ content: '';
509
+ position: absolute;
510
+ left: -1.5rem;
511
+ top: 1rem;
512
+ width: 0.6875rem;
513
+ height: 0.6875rem;
514
+ border-radius: 50%;
515
+ background: var(--color-gray);
516
+ border: 2px solid var(--color-surface);
517
+ box-shadow: 0 0 0 2px var(--color-border);
518
+ }
519
+
520
+ .timeline-item.completed::before {
521
+ background: var(--color-green);
522
+ box-shadow: 0 0 0 2px #dcfce7;
523
+ }
524
+ .timeline-item.failed::before {
525
+ background: var(--color-red);
526
+ box-shadow: 0 0 0 2px #fee2e2;
527
+ }
528
+ .timeline-item.running::before {
529
+ background: var(--color-yellow);
530
+ box-shadow: 0 0 0 2px #fef9c3;
531
+ animation: pulse-dot 1.5s ease-in-out infinite;
532
+ }
533
+ .timeline-item.skipped::before {
534
+ background: var(--color-gray);
535
+ }
536
+
537
+ @keyframes pulse-dot {
538
+ 0%, 100% { box-shadow: 0 0 0 2px #fef9c3; }
539
+ 50% { box-shadow: 0 0 0 4px #fef9c3; }
540
+ }
541
+
542
+ .timeline-meta {
543
+ font-size: 0.8125rem;
544
+ color: var(--color-text-muted);
545
+ margin-top: 0.375rem;
546
+ display: flex;
547
+ flex-wrap: wrap;
548
+ gap: 0.75rem;
549
+ align-items: center;
550
+ }
551
+
552
+ /* ── Log entries ──────────────────────────────────────────────── */
553
+ .log-entry {
554
+ padding: 0.3125rem 1rem;
555
+ border-bottom: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
556
+ font-size: 0.8125rem;
557
+ font-family: 'SF Mono', 'Fira Code', Menlo, Consolas, monospace;
558
+ line-height: 1.45;
559
+ word-break: break-word;
560
+ }
561
+
562
+ .log-entry:last-child {
563
+ border-bottom: none;
564
+ }
565
+
566
+ .log-entry .log-time {
567
+ color: var(--color-text-muted);
568
+ margin-right: 0.5rem;
569
+ font-size: 0.75rem;
570
+ }
571
+
572
+ .log-entry .log-type {
573
+ font-weight: 700;
574
+ margin-right: 0.5rem;
575
+ }
576
+
577
+ .log-type-error { color: var(--color-red); }
578
+ .log-type-tool_call { color: var(--color-blue); }
579
+ .log-type-tool_result { color: var(--color-green); }
580
+ .log-type-message { color: var(--color-text-muted); }
581
+
582
+ /* ── Error groups ─────────────────────────────────────────────── */
583
+ .error-group {
584
+ margin-bottom: 1.5rem;
585
+ }
586
+
587
+ /* ── Empty state ──────────────────────────────────────────────── */
588
+ .empty {
589
+ padding: 3rem 1rem;
590
+ text-align: center;
591
+ color: var(--color-text-muted);
592
+ font-size: 0.9375rem;
593
+ }
594
+
595
+ /* ── Responsive — tablet / mobile ────────────────────────────── */
596
+ @media (max-width: 768px) {
597
+ main {
598
+ padding: 0 1rem;
599
+ margin: 1rem auto;
600
+ }
601
+
602
+ nav {
603
+ padding: 0 1rem;
604
+ gap: 0;
605
+ }
606
+
607
+ nav .brand {
608
+ margin-right: 0.75rem;
609
+ font-size: 0.875rem;
610
+ }
611
+
612
+ nav a {
613
+ padding: 0.3125rem 0.5rem;
614
+ font-size: 0.8125rem;
615
+ }
616
+
617
+ h1 {
618
+ font-size: 1.25rem;
619
+ margin-bottom: 1rem;
620
+ }
621
+
622
+ .card {
623
+ padding: 1rem;
624
+ }
625
+
626
+ .meta {
627
+ grid-template-columns: 1fr 1fr;
628
+ }
629
+
630
+ .bar-label {
631
+ min-width: 5rem;
632
+ max-width: 5rem;
633
+ }
634
+
635
+ .bar-value {
636
+ display: none;
637
+ }
638
+ }
639
+
640
+ @media (max-width: 480px) {
641
+ .meta {
642
+ grid-template-columns: 1fr;
643
+ }
644
+
645
+ nav a span {
646
+ display: none;
647
+ }
648
+ }
@@ -0,0 +1,29 @@
1
+ import type { AuditEvent } from "@urateam/core";
2
+ export interface AuditFilters {
3
+ from?: string;
4
+ to?: string;
5
+ scope?: string;
6
+ eventType?: string;
7
+ actor?: string;
8
+ runId?: string;
9
+ issueId?: string;
10
+ q?: string;
11
+ }
12
+ export interface RenderAuditPageArgs {
13
+ events: AuditEvent[];
14
+ nextCursor: string | null;
15
+ filters: AuditFilters;
16
+ /** When true, render only the table + load-more marker (HTMX partial). */
17
+ partial?: boolean;
18
+ }
19
+ /**
20
+ * Render a detail row inserted via HTMX after a row. Shows the full formatted
21
+ * payload plus any fields truncated in the compact row (timestamp, tokens).
22
+ */
23
+ export declare function renderEventDetailRow(e: AuditEvent): string;
24
+ /**
25
+ * Render the audit log page. When `partial` is true, emits only the table
26
+ * body rows + load-more marker so HTMX can swap into the tbody.
27
+ */
28
+ export declare function renderAuditPage(args: RenderAuditPageArgs): string;
29
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/views/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgDD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAqB1D;AAWD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CA0DjE"}