loki-mode 5.52.3 → 5.53.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.
- package/README.md +1 -1
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/dashboard/__init__.py +1 -1
- package/dashboard/static/index.html +404 -377
- package/docs/INSTALLATION.md +1 -1
- package/mcp/__init__.py +1 -1
- package/package.json +38 -10
|
@@ -4,89 +4,108 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<meta name="description" content="Loki Mode Dashboard - Self-contained autonomous AI system monitor">
|
|
7
|
-
<meta name="theme-color" content="#
|
|
7
|
+
<meta name="theme-color" content="#553DE9">
|
|
8
8
|
<title>Loki Mode Dashboard</title>
|
|
9
|
-
<link rel="
|
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
12
|
+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' width='32' height='32'><path d='M16 6C8 6 2 16 2 16s6 10 14 10 14-10 14-10S24 6 16 6z' fill='none' stroke='%23553DE9' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/><circle cx='16' cy='16' r='5' fill='%23553DE9'/><circle cx='16' cy='16' r='2' fill='%23fff'/></svg>">
|
|
10
13
|
<style>
|
|
11
|
-
/*
|
|
14
|
+
/* Loki Mode Design Language */
|
|
12
15
|
:root {
|
|
13
|
-
/* Light theme (default) */
|
|
14
|
-
--loki-bg-primary: #
|
|
15
|
-
--loki-bg-secondary: #
|
|
16
|
-
--loki-bg-tertiary: #
|
|
17
|
-
--loki-bg-card:
|
|
18
|
-
--loki-bg-hover: #
|
|
19
|
-
--loki-text-primary: #
|
|
20
|
-
--loki-text-secondary: #
|
|
21
|
-
--loki-text-muted: #
|
|
22
|
-
--loki-accent: #
|
|
23
|
-
--loki-accent-hover: #
|
|
24
|
-
--loki-
|
|
25
|
-
--loki-border
|
|
26
|
-
--loki-
|
|
27
|
-
--loki-
|
|
28
|
-
--loki-
|
|
29
|
-
--loki-
|
|
16
|
+
/* Light theme (default - cream/editorial) */
|
|
17
|
+
--loki-bg-primary: #FAFAF7;
|
|
18
|
+
--loki-bg-secondary: #F2F0EB;
|
|
19
|
+
--loki-bg-tertiary: #E8E5DE;
|
|
20
|
+
--loki-bg-card: rgba(255, 255, 255, 0.72);
|
|
21
|
+
--loki-bg-hover: #EDEAE4;
|
|
22
|
+
--loki-text-primary: #1A1614;
|
|
23
|
+
--loki-text-secondary: #4A4640;
|
|
24
|
+
--loki-text-muted: #8A857C;
|
|
25
|
+
--loki-accent: #553DE9;
|
|
26
|
+
--loki-accent-hover: #4432c4;
|
|
27
|
+
--loki-accent-glow: rgba(85, 61, 233, 0.15);
|
|
28
|
+
--loki-border: rgba(0, 0, 0, 0.08);
|
|
29
|
+
--loki-border-light: rgba(0, 0, 0, 0.05);
|
|
30
|
+
--loki-success: #1AAF95;
|
|
31
|
+
--loki-warning: #C4922E;
|
|
32
|
+
--loki-error: #C04848;
|
|
33
|
+
--loki-info: #2F71E3;
|
|
34
|
+
--loki-glass-bg: rgba(255, 255, 255, 0.55);
|
|
35
|
+
--loki-glass-border: rgba(255, 255, 255, 0.35);
|
|
36
|
+
--loki-glass-shadow: 0 4px 24px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
30
37
|
--loki-transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
31
38
|
}
|
|
32
39
|
|
|
33
40
|
@media (prefers-color-scheme: dark) {
|
|
34
41
|
:root {
|
|
35
|
-
--loki-bg-primary: #
|
|
36
|
-
--loki-bg-secondary: #
|
|
37
|
-
--loki-bg-tertiary: #
|
|
38
|
-
--loki-bg-card:
|
|
39
|
-
--loki-bg-hover: #
|
|
40
|
-
--loki-text-primary: #
|
|
41
|
-
--loki-text-secondary: #
|
|
42
|
-
--loki-text-muted: #
|
|
43
|
-
--loki-accent: #
|
|
44
|
-
--loki-accent-hover: #
|
|
45
|
-
--loki-
|
|
46
|
-
--loki-border
|
|
47
|
-
--loki-
|
|
48
|
-
--loki-
|
|
49
|
-
--loki-
|
|
50
|
-
--loki-
|
|
42
|
+
--loki-bg-primary: #0F0B1A;
|
|
43
|
+
--loki-bg-secondary: #150F24;
|
|
44
|
+
--loki-bg-tertiary: #1E1533;
|
|
45
|
+
--loki-bg-card: rgba(30, 21, 51, 0.72);
|
|
46
|
+
--loki-bg-hover: #251C3D;
|
|
47
|
+
--loki-text-primary: #F0ECF8;
|
|
48
|
+
--loki-text-secondary: #B8B0C8;
|
|
49
|
+
--loki-text-muted: #7B6FA0;
|
|
50
|
+
--loki-accent: #7B6BF0;
|
|
51
|
+
--loki-accent-hover: #9488F5;
|
|
52
|
+
--loki-accent-glow: rgba(123, 107, 240, 0.2);
|
|
53
|
+
--loki-border: rgba(255, 255, 255, 0.08);
|
|
54
|
+
--loki-border-light: rgba(255, 255, 255, 0.04);
|
|
55
|
+
--loki-success: #2ED8B6;
|
|
56
|
+
--loki-warning: #E8B84A;
|
|
57
|
+
--loki-error: #E07070;
|
|
58
|
+
--loki-info: #5A9CF5;
|
|
59
|
+
--loki-glass-bg: rgba(20, 14, 38, 0.65);
|
|
60
|
+
--loki-glass-border: rgba(255, 255, 255, 0.08);
|
|
61
|
+
--loki-glass-shadow: 0 4px 24px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.12);
|
|
51
62
|
}
|
|
52
63
|
}
|
|
53
64
|
|
|
54
65
|
[data-loki-theme="light"] {
|
|
55
|
-
--loki-bg-primary: #
|
|
56
|
-
--loki-bg-secondary: #
|
|
57
|
-
--loki-bg-tertiary: #
|
|
58
|
-
--loki-bg-card:
|
|
59
|
-
--loki-bg-hover: #
|
|
60
|
-
--loki-text-primary: #
|
|
61
|
-
--loki-text-secondary: #
|
|
62
|
-
--loki-text-muted: #
|
|
63
|
-
--loki-accent: #
|
|
64
|
-
--loki-accent-hover: #
|
|
65
|
-
--loki-
|
|
66
|
-
--loki-border
|
|
67
|
-
--loki-
|
|
68
|
-
--loki-
|
|
69
|
-
--loki-
|
|
70
|
-
--loki-
|
|
66
|
+
--loki-bg-primary: #FAFAF7;
|
|
67
|
+
--loki-bg-secondary: #F2F0EB;
|
|
68
|
+
--loki-bg-tertiary: #E8E5DE;
|
|
69
|
+
--loki-bg-card: rgba(255, 255, 255, 0.72);
|
|
70
|
+
--loki-bg-hover: #EDEAE4;
|
|
71
|
+
--loki-text-primary: #1A1614;
|
|
72
|
+
--loki-text-secondary: #4A4640;
|
|
73
|
+
--loki-text-muted: #8A857C;
|
|
74
|
+
--loki-accent: #553DE9;
|
|
75
|
+
--loki-accent-hover: #4432c4;
|
|
76
|
+
--loki-accent-glow: rgba(85, 61, 233, 0.15);
|
|
77
|
+
--loki-border: rgba(0, 0, 0, 0.08);
|
|
78
|
+
--loki-border-light: rgba(0, 0, 0, 0.05);
|
|
79
|
+
--loki-success: #1AAF95;
|
|
80
|
+
--loki-warning: #C4922E;
|
|
81
|
+
--loki-error: #C04848;
|
|
82
|
+
--loki-info: #2F71E3;
|
|
83
|
+
--loki-glass-bg: rgba(255, 255, 255, 0.55);
|
|
84
|
+
--loki-glass-border: rgba(255, 255, 255, 0.35);
|
|
85
|
+
--loki-glass-shadow: 0 4px 24px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
71
86
|
}
|
|
72
87
|
|
|
73
88
|
[data-loki-theme="dark"] {
|
|
74
|
-
--loki-bg-primary: #
|
|
75
|
-
--loki-bg-secondary: #
|
|
76
|
-
--loki-bg-tertiary: #
|
|
77
|
-
--loki-bg-card:
|
|
78
|
-
--loki-bg-hover: #
|
|
79
|
-
--loki-text-primary: #
|
|
80
|
-
--loki-text-secondary: #
|
|
81
|
-
--loki-text-muted: #
|
|
82
|
-
--loki-accent: #
|
|
83
|
-
--loki-accent-hover: #
|
|
84
|
-
--loki-
|
|
85
|
-
--loki-border
|
|
86
|
-
--loki-
|
|
87
|
-
--loki-
|
|
88
|
-
--loki-
|
|
89
|
-
--loki-
|
|
89
|
+
--loki-bg-primary: #0F0B1A;
|
|
90
|
+
--loki-bg-secondary: #150F24;
|
|
91
|
+
--loki-bg-tertiary: #1E1533;
|
|
92
|
+
--loki-bg-card: rgba(30, 21, 51, 0.72);
|
|
93
|
+
--loki-bg-hover: #251C3D;
|
|
94
|
+
--loki-text-primary: #F0ECF8;
|
|
95
|
+
--loki-text-secondary: #B8B0C8;
|
|
96
|
+
--loki-text-muted: #7B6FA0;
|
|
97
|
+
--loki-accent: #7B6BF0;
|
|
98
|
+
--loki-accent-hover: #9488F5;
|
|
99
|
+
--loki-accent-glow: rgba(123, 107, 240, 0.2);
|
|
100
|
+
--loki-border: rgba(255, 255, 255, 0.08);
|
|
101
|
+
--loki-border-light: rgba(255, 255, 255, 0.04);
|
|
102
|
+
--loki-success: #2ED8B6;
|
|
103
|
+
--loki-warning: #E8B84A;
|
|
104
|
+
--loki-error: #E07070;
|
|
105
|
+
--loki-info: #5A9CF5;
|
|
106
|
+
--loki-glass-bg: rgba(20, 14, 38, 0.65);
|
|
107
|
+
--loki-glass-border: rgba(255, 255, 255, 0.08);
|
|
108
|
+
--loki-glass-shadow: 0 4px 24px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.12);
|
|
90
109
|
}
|
|
91
110
|
|
|
92
111
|
* {
|
|
@@ -95,8 +114,13 @@
|
|
|
95
114
|
box-sizing: border-box;
|
|
96
115
|
}
|
|
97
116
|
|
|
117
|
+
::selection {
|
|
118
|
+
background: rgba(85, 61, 233, 0.18);
|
|
119
|
+
color: var(--loki-text-primary);
|
|
120
|
+
}
|
|
121
|
+
|
|
98
122
|
body {
|
|
99
|
-
font-family: 'Inter', -apple-system,
|
|
123
|
+
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
|
100
124
|
background: var(--loki-bg-primary);
|
|
101
125
|
color: var(--loki-text-primary);
|
|
102
126
|
min-height: 100vh;
|
|
@@ -104,6 +128,7 @@
|
|
|
104
128
|
-webkit-font-smoothing: antialiased;
|
|
105
129
|
-moz-osx-font-smoothing: grayscale;
|
|
106
130
|
transition: background var(--loki-transition), color var(--loki-transition);
|
|
131
|
+
font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
|
|
107
132
|
}
|
|
108
133
|
|
|
109
134
|
/* Dashboard Layout */
|
|
@@ -128,39 +153,40 @@
|
|
|
128
153
|
}
|
|
129
154
|
}
|
|
130
155
|
|
|
131
|
-
/* Sidebar */
|
|
156
|
+
/* Sidebar - glass effect */
|
|
132
157
|
.sidebar {
|
|
133
158
|
display: flex;
|
|
134
159
|
flex-direction: column;
|
|
135
|
-
background: var(--loki-bg
|
|
136
|
-
|
|
160
|
+
background: var(--loki-glass-bg);
|
|
161
|
+
backdrop-filter: blur(16px) saturate(1.4);
|
|
162
|
+
-webkit-backdrop-filter: blur(16px) saturate(1.4);
|
|
163
|
+
border-right: 1px solid var(--loki-glass-border);
|
|
137
164
|
overflow-y: auto;
|
|
138
165
|
}
|
|
139
166
|
|
|
140
167
|
.sidebar-logo {
|
|
141
168
|
display: flex;
|
|
142
|
-
|
|
143
|
-
gap:
|
|
169
|
+
flex-direction: column;
|
|
170
|
+
gap: 2px;
|
|
144
171
|
padding: 20px 16px 16px;
|
|
145
172
|
}
|
|
146
173
|
|
|
147
|
-
.logo-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
justify-content: center;
|
|
155
|
-
font-weight: 700;
|
|
156
|
-
font-size: 12px;
|
|
157
|
-
color: white;
|
|
174
|
+
.logo-brand {
|
|
175
|
+
font-family: 'DM Serif Display', Georgia, serif;
|
|
176
|
+
font-size: 22px;
|
|
177
|
+
font-weight: 400;
|
|
178
|
+
color: var(--loki-text-primary);
|
|
179
|
+
letter-spacing: -0.02em;
|
|
180
|
+
line-height: 1.1;
|
|
158
181
|
}
|
|
159
182
|
|
|
160
|
-
.logo-
|
|
161
|
-
font-
|
|
162
|
-
font-
|
|
163
|
-
color: var(--loki-text-
|
|
183
|
+
.logo-subtitle {
|
|
184
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
185
|
+
font-size: 9px;
|
|
186
|
+
color: var(--loki-text-muted);
|
|
187
|
+
text-transform: uppercase;
|
|
188
|
+
letter-spacing: 0.08em;
|
|
189
|
+
font-weight: 500;
|
|
164
190
|
}
|
|
165
191
|
|
|
166
192
|
/* Navigation */
|
|
@@ -176,7 +202,7 @@
|
|
|
176
202
|
display: flex;
|
|
177
203
|
align-items: center;
|
|
178
204
|
gap: 10px;
|
|
179
|
-
padding:
|
|
205
|
+
padding: 9px 12px;
|
|
180
206
|
border-radius: 8px;
|
|
181
207
|
font-size: 13px;
|
|
182
208
|
font-weight: 500;
|
|
@@ -197,8 +223,9 @@
|
|
|
197
223
|
|
|
198
224
|
.nav-link.active {
|
|
199
225
|
color: var(--loki-accent);
|
|
200
|
-
background:
|
|
201
|
-
border-color: rgba(
|
|
226
|
+
background: var(--loki-accent-glow);
|
|
227
|
+
border-color: rgba(85, 61, 233, 0.12);
|
|
228
|
+
box-shadow: 0 0 0 1px var(--loki-accent-glow);
|
|
202
229
|
}
|
|
203
230
|
|
|
204
231
|
.nav-link svg {
|
|
@@ -242,7 +269,7 @@
|
|
|
242
269
|
|
|
243
270
|
.api-url-input {
|
|
244
271
|
padding: 5px 8px;
|
|
245
|
-
background: var(--loki-bg-
|
|
272
|
+
background: var(--loki-bg-primary);
|
|
246
273
|
border: 1px solid var(--loki-border);
|
|
247
274
|
border-radius: 6px;
|
|
248
275
|
font-size: 11px;
|
|
@@ -255,33 +282,46 @@
|
|
|
255
282
|
.api-url-input:focus {
|
|
256
283
|
outline: none;
|
|
257
284
|
border-color: var(--loki-accent);
|
|
285
|
+
box-shadow: 0 0 0 3px var(--loki-accent-glow);
|
|
258
286
|
}
|
|
259
287
|
|
|
260
288
|
/* Main Content */
|
|
261
289
|
.main-content {
|
|
262
|
-
padding:
|
|
290
|
+
padding: 28px 32px;
|
|
263
291
|
overflow-y: auto;
|
|
264
292
|
height: 100vh;
|
|
265
|
-
scroll-behavior: smooth;
|
|
266
293
|
}
|
|
267
294
|
|
|
268
|
-
/* Section pages */
|
|
295
|
+
/* Section pages - show/hide navigation */
|
|
269
296
|
.section-page {
|
|
297
|
+
display: none;
|
|
270
298
|
padding-bottom: 32px;
|
|
299
|
+
animation: fadeIn 0.2s ease-out;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.section-page.active {
|
|
303
|
+
display: block;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
@keyframes fadeIn {
|
|
307
|
+
from { opacity: 0; transform: translateY(6px); }
|
|
308
|
+
to { opacity: 1; transform: translateY(0); }
|
|
271
309
|
}
|
|
272
310
|
|
|
273
311
|
.section-page-header {
|
|
274
312
|
display: flex;
|
|
275
313
|
justify-content: space-between;
|
|
276
314
|
align-items: center;
|
|
277
|
-
margin-bottom:
|
|
315
|
+
margin-bottom: 24px;
|
|
278
316
|
padding-top: 4px;
|
|
279
317
|
}
|
|
280
318
|
|
|
281
319
|
.section-page-title {
|
|
282
|
-
font-
|
|
283
|
-
font-
|
|
320
|
+
font-family: 'DM Serif Display', Georgia, serif;
|
|
321
|
+
font-size: 1.8rem;
|
|
322
|
+
font-weight: 400;
|
|
284
323
|
color: var(--loki-text-primary);
|
|
324
|
+
letter-spacing: -0.02em;
|
|
285
325
|
}
|
|
286
326
|
|
|
287
327
|
/* Overview handled by <loki-overview> shadow DOM */
|
|
@@ -293,7 +333,7 @@
|
|
|
293
333
|
left: 0;
|
|
294
334
|
right: 0;
|
|
295
335
|
background: var(--loki-warning);
|
|
296
|
-
color: #
|
|
336
|
+
color: #201515;
|
|
297
337
|
padding: 8px 16px;
|
|
298
338
|
text-align: center;
|
|
299
339
|
font-size: 13px;
|
|
@@ -368,15 +408,17 @@
|
|
|
368
408
|
}
|
|
369
409
|
|
|
370
410
|
.shortcuts-dialog {
|
|
371
|
-
background: var(--loki-bg
|
|
372
|
-
|
|
411
|
+
background: var(--loki-glass-bg);
|
|
412
|
+
backdrop-filter: blur(20px) saturate(1.4);
|
|
413
|
+
-webkit-backdrop-filter: blur(20px) saturate(1.4);
|
|
414
|
+
border: 1px solid var(--loki-glass-border);
|
|
373
415
|
border-radius: 12px;
|
|
374
416
|
padding: 24px;
|
|
375
417
|
max-width: 480px;
|
|
376
418
|
width: 90%;
|
|
377
419
|
max-height: 80vh;
|
|
378
420
|
overflow-y: auto;
|
|
379
|
-
box-shadow:
|
|
421
|
+
box-shadow: var(--loki-glass-shadow);
|
|
380
422
|
}
|
|
381
423
|
|
|
382
424
|
.shortcuts-header {
|
|
@@ -414,9 +456,9 @@
|
|
|
414
456
|
|
|
415
457
|
.shortcuts-group-title {
|
|
416
458
|
font-size: 11px;
|
|
417
|
-
font-weight:
|
|
459
|
+
font-weight: 500;
|
|
418
460
|
text-transform: uppercase;
|
|
419
|
-
letter-spacing: 0.
|
|
461
|
+
letter-spacing: 0.05em;
|
|
420
462
|
color: var(--loki-text-muted);
|
|
421
463
|
margin-bottom: 8px;
|
|
422
464
|
}
|
|
@@ -438,7 +480,7 @@
|
|
|
438
480
|
padding: 2px 8px;
|
|
439
481
|
background: var(--loki-bg-tertiary);
|
|
440
482
|
border: 1px solid var(--loki-border);
|
|
441
|
-
border-radius:
|
|
483
|
+
border-radius: 6px;
|
|
442
484
|
font-size: 12px;
|
|
443
485
|
font-family: 'JetBrains Mono', monospace;
|
|
444
486
|
color: var(--loki-text-primary);
|
|
@@ -470,8 +512,8 @@
|
|
|
470
512
|
<line x1="3" y1="18" x2="21" y2="18"/>
|
|
471
513
|
</svg>
|
|
472
514
|
</button>
|
|
473
|
-
<
|
|
474
|
-
<span class="logo-
|
|
515
|
+
<span class="logo-brand">Loki Mode</span>
|
|
516
|
+
<span class="logo-subtitle">powered by Autonomi</span>
|
|
475
517
|
</div>
|
|
476
518
|
|
|
477
519
|
<nav class="nav-links">
|
|
@@ -479,21 +521,9 @@
|
|
|
479
521
|
<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
|
|
480
522
|
Overview
|
|
481
523
|
</button>
|
|
482
|
-
<button class="nav-link" data-section="
|
|
483
|
-
<svg viewBox="0 0 24 24"><
|
|
484
|
-
|
|
485
|
-
</button>
|
|
486
|
-
<button class="nav-link" data-section="logs" id="nav-logs">
|
|
487
|
-
<svg viewBox="0 0 24 24"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>
|
|
488
|
-
Logs
|
|
489
|
-
</button>
|
|
490
|
-
<button class="nav-link" data-section="memory" id="nav-memory">
|
|
491
|
-
<svg viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg>
|
|
492
|
-
Memory
|
|
493
|
-
</button>
|
|
494
|
-
<button class="nav-link" data-section="learning" id="nav-learning">
|
|
495
|
-
<svg viewBox="0 0 24 24"><path d="M12 20V10"/><path d="M18 20V4"/><path d="M6 20v-4"/></svg>
|
|
496
|
-
Learning
|
|
524
|
+
<button class="nav-link" data-section="insights" id="nav-insights">
|
|
525
|
+
<svg viewBox="0 0 24 24"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
|
|
526
|
+
Insights
|
|
497
527
|
</button>
|
|
498
528
|
<button class="nav-link" data-section="prd-checklist" id="nav-prd-checklist">
|
|
499
529
|
<svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"/></svg>
|
|
@@ -542,41 +572,36 @@
|
|
|
542
572
|
|
|
543
573
|
<!-- Main Content -->
|
|
544
574
|
<main class="main-content" id="main-content">
|
|
545
|
-
<!-- Overview (
|
|
546
|
-
<div class="section-page" id="page-overview">
|
|
575
|
+
<!-- Overview + Tasks (combined) -->
|
|
576
|
+
<div class="section-page active" id="page-overview">
|
|
547
577
|
<loki-overview id="overview"></loki-overview>
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
<h2 class="section-page-title">Tasks</h2>
|
|
554
|
-
</div>
|
|
555
|
-
<loki-task-board id="task-board"></loki-task-board>
|
|
556
|
-
</div>
|
|
557
|
-
|
|
558
|
-
<!-- Log Stream -->
|
|
559
|
-
<div class="section-page" id="page-logs">
|
|
560
|
-
<div class="section-page-header">
|
|
561
|
-
<h2 class="section-page-title">Logs</h2>
|
|
578
|
+
<div style="margin-top: 28px;">
|
|
579
|
+
<div class="section-page-header">
|
|
580
|
+
<h2 class="section-page-title">Tasks</h2>
|
|
581
|
+
</div>
|
|
582
|
+
<loki-task-board id="task-board"></loki-task-board>
|
|
562
583
|
</div>
|
|
563
|
-
<loki-log-stream id="log-stream" auto-scroll max-lines="500"></loki-log-stream>
|
|
564
584
|
</div>
|
|
565
585
|
|
|
566
|
-
<!-- Memory
|
|
567
|
-
<div class="section-page" id="page-
|
|
586
|
+
<!-- Insights: Logs + Memory + Learning (combined) -->
|
|
587
|
+
<div class="section-page" id="page-insights">
|
|
568
588
|
<div class="section-page-header">
|
|
569
|
-
<h2 class="section-page-title">
|
|
589
|
+
<h2 class="section-page-title">Insights</h2>
|
|
570
590
|
</div>
|
|
571
|
-
<
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
591
|
+
<div style="display: grid; gap: 24px;">
|
|
592
|
+
<div>
|
|
593
|
+
<h3 style="font-family: 'DM Serif Display', Georgia, serif; font-size: 1.15rem; font-weight: 400; color: var(--loki-text-primary); margin-bottom: 12px;">Logs</h3>
|
|
594
|
+
<loki-log-stream id="log-stream" auto-scroll max-lines="500"></loki-log-stream>
|
|
595
|
+
</div>
|
|
596
|
+
<div>
|
|
597
|
+
<h3 style="font-family: 'DM Serif Display', Georgia, serif; font-size: 1.15rem; font-weight: 400; color: var(--loki-text-primary); margin-bottom: 12px;">Memory</h3>
|
|
598
|
+
<loki-memory-browser id="memory-browser" tab="summary"></loki-memory-browser>
|
|
599
|
+
</div>
|
|
600
|
+
<div>
|
|
601
|
+
<h3 style="font-family: 'DM Serif Display', Georgia, serif; font-size: 1.15rem; font-weight: 400; color: var(--loki-text-primary); margin-bottom: 12px;">Learning Metrics</h3>
|
|
602
|
+
<loki-learning-dashboard id="learning-dashboard" time-range="7d"></loki-learning-dashboard>
|
|
603
|
+
</div>
|
|
578
604
|
</div>
|
|
579
|
-
<loki-learning-dashboard id="learning-dashboard" time-range="7d"></loki-learning-dashboard>
|
|
580
605
|
</div>
|
|
581
606
|
|
|
582
607
|
<!-- PRD Checklist -->
|
|
@@ -647,14 +672,14 @@
|
|
|
647
672
|
<div class="shortcuts-group">
|
|
648
673
|
<div class="shortcuts-group-title">Navigation</div>
|
|
649
674
|
<div class="shortcut-row"><span class="shortcut-desc">Overview</span><span class="shortcut-keys"><kbd class="shortcut-key">1</kbd></span></div>
|
|
650
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
651
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
652
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
653
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
654
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
655
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
656
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
657
|
-
<div class="shortcut-row"><span class="shortcut-desc">
|
|
675
|
+
<div class="shortcut-row"><span class="shortcut-desc">Insights</span><span class="shortcut-keys"><kbd class="shortcut-key">2</kbd></span></div>
|
|
676
|
+
<div class="shortcut-row"><span class="shortcut-desc">PRD Checklist</span><span class="shortcut-keys"><kbd class="shortcut-key">3</kbd></span></div>
|
|
677
|
+
<div class="shortcut-row"><span class="shortcut-desc">App Runner</span><span class="shortcut-keys"><kbd class="shortcut-key">4</kbd></span></div>
|
|
678
|
+
<div class="shortcut-row"><span class="shortcut-desc">Council</span><span class="shortcut-keys"><kbd class="shortcut-key">5</kbd></span></div>
|
|
679
|
+
<div class="shortcut-row"><span class="shortcut-desc">Cost</span><span class="shortcut-keys"><kbd class="shortcut-key">6</kbd></span></div>
|
|
680
|
+
<div class="shortcut-row"><span class="shortcut-desc">Checkpoints</span><span class="shortcut-keys"><kbd class="shortcut-key">7</kbd></span></div>
|
|
681
|
+
<div class="shortcut-row"><span class="shortcut-desc">Context</span><span class="shortcut-keys"><kbd class="shortcut-key">8</kbd></span></div>
|
|
682
|
+
<div class="shortcut-row"><span class="shortcut-desc">Notifications</span><span class="shortcut-keys"><kbd class="shortcut-key">9</kbd></span></div>
|
|
658
683
|
</div>
|
|
659
684
|
<div class="shortcuts-group">
|
|
660
685
|
<div class="shortcuts-group-title">Session</div>
|
|
@@ -674,7 +699,7 @@
|
|
|
674
699
|
|
|
675
700
|
<!-- Inlined JavaScript Bundle -->
|
|
676
701
|
<script>
|
|
677
|
-
var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnPropertyDescriptor;var vt=Object.getOwnPropertyNames;var mt=Object.prototype.hasOwnProperty;var bt=(d,t,e)=>t in d?X(d,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):d[t]=e;var ft=(d,t)=>{for(var e in t)X(d,e,{get:t[e],enumerable:!0})},kt=(d,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of vt(t))!mt.call(d,i)&&i!==e&&X(d,i,{get:()=>t[i],enumerable:!(a=gt(t,i))||a.enumerable});return d};var _t=d=>kt(X({},"__esModule",{value:!0}),d);var f=(d,t,e)=>bt(d,typeof t!="symbol"?t+"":t,e);var It={};ft(It,{ANIMATION:()=>$,ARIA_PATTERNS:()=>tt,ApiEvents:()=>n,BASE_STYLES:()=>M,BREAKPOINTS:()=>Z,COMMON_STYLES:()=>ot,KEYBOARD_SHORTCUTS:()=>Q,KeyboardHandler:()=>I,LokiApiClient:()=>D,LokiAppStatus:()=>J,LokiChecklistViewer:()=>G,LokiCheckpointViewer:()=>V,LokiContextTracker:()=>Y,LokiCostDashboard:()=>K,LokiCouncilDashboard:()=>q,LokiElement:()=>c,LokiLearningDashboard:()=>N,LokiLogStream:()=>F,LokiMemoryBrowser:()=>O,LokiNotificationCenter:()=>W,LokiOverview:()=>B,LokiSessionControl:()=>j,LokiState:()=>z,LokiTaskBoard:()=>U,LokiTheme:()=>A,RADIUS:()=>w,SPACING:()=>_,STATE_CHANGE_EVENT:()=>it,THEMES:()=>b,THEME_VARIABLES:()=>et,TYPOGRAPHY:()=>v,UnifiedThemeManager:()=>g,VERSION:()=>At,Z_INDEX:()=>T,createApiClient:()=>dt,createStore:()=>ct,generateThemeCSS:()=>m,generateTokensCSS:()=>H,getApiClient:()=>u,getState:()=>L,init:()=>Lt});var b={light:{"--loki-bg-primary":"#fafafa","--loki-bg-secondary":"#f4f4f5","--loki-bg-tertiary":"#e4e4e7","--loki-bg-card":"#ffffff","--loki-bg-hover":"#f0f0f3","--loki-bg-active":"#e8e8ec","--loki-bg-overlay":"rgba(0, 0, 0, 0.5)","--loki-accent":"#7c3aed","--loki-accent-hover":"#6d28d9","--loki-accent-active":"#5b21b6","--loki-accent-light":"#8b5cf6","--loki-accent-muted":"rgba(124, 58, 237, 0.12)","--loki-text-primary":"#18181b","--loki-text-secondary":"#52525b","--loki-text-muted":"#a1a1aa","--loki-text-disabled":"#d4d4d8","--loki-text-inverse":"#ffffff","--loki-border":"#e4e4e7","--loki-border-light":"#d4d4d8","--loki-border-focus":"#7c3aed","--loki-success":"#16a34a","--loki-success-muted":"rgba(22, 163, 74, 0.12)","--loki-warning":"#ca8a04","--loki-warning-muted":"rgba(202, 138, 4, 0.12)","--loki-error":"#dc2626","--loki-error-muted":"rgba(220, 38, 38, 0.12)","--loki-info":"#2563eb","--loki-info-muted":"rgba(37, 99, 235, 0.12)","--loki-green":"#16a34a","--loki-green-muted":"rgba(22, 163, 74, 0.12)","--loki-yellow":"#ca8a04","--loki-yellow-muted":"rgba(202, 138, 4, 0.12)","--loki-red":"#dc2626","--loki-red-muted":"rgba(220, 38, 38, 0.12)","--loki-blue":"#2563eb","--loki-blue-muted":"rgba(37, 99, 235, 0.12)","--loki-purple":"#9333ea","--loki-purple-muted":"rgba(147, 51, 234, 0.12)","--loki-opus":"#d97706","--loki-sonnet":"#4f46e5","--loki-haiku":"#059669","--loki-shadow-sm":"0 1px 2px rgba(0, 0, 0, 0.05)","--loki-shadow-md":"0 4px 6px rgba(0, 0, 0, 0.07)","--loki-shadow-lg":"0 10px 15px rgba(0, 0, 0, 0.1)","--loki-shadow-focus":"0 0 0 3px rgba(124, 58, 237, 0.3)"},dark:{"--loki-bg-primary":"#09090b","--loki-bg-secondary":"#0c0c0f","--loki-bg-tertiary":"#111114","--loki-bg-card":"#18181b","--loki-bg-hover":"#1f1f23","--loki-bg-active":"#27272a","--loki-bg-overlay":"rgba(0, 0, 0, 0.8)","--loki-accent":"#8b5cf6","--loki-accent-hover":"#a78bfa","--loki-accent-active":"#7c3aed","--loki-accent-light":"#a78bfa","--loki-accent-muted":"rgba(139, 92, 246, 0.15)","--loki-text-primary":"#fafafa","--loki-text-secondary":"#a1a1aa","--loki-text-muted":"#52525b","--loki-text-disabled":"#3f3f46","--loki-text-inverse":"#09090b","--loki-border":"rgba(255, 255, 255, 0.06)","--loki-border-light":"rgba(255, 255, 255, 0.1)","--loki-border-focus":"#8b5cf6","--loki-success":"#22c55e","--loki-success-muted":"rgba(34, 197, 94, 0.15)","--loki-warning":"#eab308","--loki-warning-muted":"rgba(234, 179, 8, 0.15)","--loki-error":"#ef4444","--loki-error-muted":"rgba(239, 68, 68, 0.15)","--loki-info":"#3b82f6","--loki-info-muted":"rgba(59, 130, 246, 0.15)","--loki-green":"#22c55e","--loki-green-muted":"rgba(34, 197, 94, 0.15)","--loki-yellow":"#eab308","--loki-yellow-muted":"rgba(234, 179, 8, 0.15)","--loki-red":"#ef4444","--loki-red-muted":"rgba(239, 68, 68, 0.15)","--loki-blue":"#3b82f6","--loki-blue-muted":"rgba(59, 130, 246, 0.15)","--loki-purple":"#a78bfa","--loki-purple-muted":"rgba(167, 139, 250, 0.15)","--loki-opus":"#f59e0b","--loki-sonnet":"#818cf8","--loki-haiku":"#34d399","--loki-shadow-sm":"0 1px 2px rgba(0, 0, 0, 0.4)","--loki-shadow-md":"0 4px 12px rgba(0, 0, 0, 0.5)","--loki-shadow-lg":"0 10px 25px rgba(0, 0, 0, 0.6)","--loki-shadow-focus":"0 0 0 3px rgba(139, 92, 246, 0.25)"},"high-contrast":{"--loki-bg-primary":"#000000","--loki-bg-secondary":"#0a0a0a","--loki-bg-tertiary":"#141414","--loki-bg-card":"#0a0a0a","--loki-bg-hover":"#1a1a1a","--loki-bg-active":"#242424","--loki-bg-overlay":"rgba(0, 0, 0, 0.9)","--loki-accent":"#c084fc","--loki-accent-hover":"#d8b4fe","--loki-accent-active":"#e9d5ff","--loki-accent-light":"#d8b4fe","--loki-accent-muted":"rgba(192, 132, 252, 0.25)","--loki-text-primary":"#ffffff","--loki-text-secondary":"#e0e0e0","--loki-text-muted":"#b0b0b0","--loki-text-disabled":"#666666","--loki-text-inverse":"#000000","--loki-border":"#ffffff","--loki-border-light":"#cccccc","--loki-border-focus":"#c084fc","--loki-success":"#4ade80","--loki-success-muted":"rgba(74, 222, 128, 0.25)","--loki-warning":"#fde047","--loki-warning-muted":"rgba(253, 224, 71, 0.25)","--loki-error":"#f87171","--loki-error-muted":"rgba(248, 113, 113, 0.25)","--loki-info":"#60a5fa","--loki-info-muted":"rgba(96, 165, 250, 0.25)","--loki-green":"#4ade80","--loki-green-muted":"rgba(74, 222, 128, 0.25)","--loki-yellow":"#fde047","--loki-yellow-muted":"rgba(253, 224, 71, 0.25)","--loki-red":"#f87171","--loki-red-muted":"rgba(248, 113, 113, 0.25)","--loki-blue":"#60a5fa","--loki-blue-muted":"rgba(96, 165, 250, 0.25)","--loki-purple":"#c084fc","--loki-purple-muted":"rgba(192, 132, 252, 0.25)","--loki-opus":"#fbbf24","--loki-sonnet":"#818cf8","--loki-haiku":"#34d399","--loki-shadow-sm":"none","--loki-shadow-md":"none","--loki-shadow-lg":"none","--loki-shadow-focus":"0 0 0 3px #c084fc"},"vscode-light":{"--loki-bg-primary":"var(--vscode-editor-background, #ffffff)","--loki-bg-secondary":"var(--vscode-sideBar-background, #f3f3f3)","--loki-bg-tertiary":"var(--vscode-input-background, #ffffff)","--loki-bg-card":"var(--vscode-editor-background, #ffffff)","--loki-bg-hover":"var(--vscode-list-hoverBackground, #e8e8e8)","--loki-bg-active":"var(--vscode-list-activeSelectionBackground, #0060c0)","--loki-bg-overlay":"rgba(0, 0, 0, 0.4)","--loki-accent":"var(--vscode-focusBorder, #0066cc)","--loki-accent-hover":"var(--vscode-button-hoverBackground, #0055aa)","--loki-accent-active":"var(--vscode-button-background, #007acc)","--loki-accent-light":"var(--vscode-focusBorder, #0066cc)","--loki-accent-muted":"var(--vscode-editor-selectionBackground, rgba(0, 102, 204, 0.2))","--loki-text-primary":"var(--vscode-foreground, #333333)","--loki-text-secondary":"var(--vscode-descriptionForeground, #717171)","--loki-text-muted":"var(--vscode-disabledForeground, #a0a0a0)","--loki-text-disabled":"var(--vscode-disabledForeground, #cccccc)","--loki-text-inverse":"var(--vscode-button-foreground, #ffffff)","--loki-border":"var(--vscode-widget-border, #c8c8c8)","--loki-border-light":"var(--vscode-widget-border, #e0e0e0)","--loki-border-focus":"var(--vscode-focusBorder, #0066cc)","--loki-success":"var(--vscode-testing-iconPassed, #388a34)","--loki-success-muted":"rgba(56, 138, 52, 0.15)","--loki-warning":"var(--vscode-editorWarning-foreground, #bf8803)","--loki-warning-muted":"rgba(191, 136, 3, 0.15)","--loki-error":"var(--vscode-errorForeground, #e51400)","--loki-error-muted":"rgba(229, 20, 0, 0.15)","--loki-info":"var(--vscode-editorInfo-foreground, #1a85ff)","--loki-info-muted":"rgba(26, 133, 255, 0.15)","--loki-green":"var(--vscode-testing-iconPassed, #388a34)","--loki-green-muted":"rgba(56, 138, 52, 0.15)","--loki-yellow":"var(--vscode-editorWarning-foreground, #bf8803)","--loki-yellow-muted":"rgba(191, 136, 3, 0.15)","--loki-red":"var(--vscode-errorForeground, #e51400)","--loki-red-muted":"rgba(229, 20, 0, 0.15)","--loki-blue":"var(--vscode-editorInfo-foreground, #1a85ff)","--loki-blue-muted":"rgba(26, 133, 255, 0.15)","--loki-purple":"#9333ea","--loki-purple-muted":"rgba(147, 51, 234, 0.15)","--loki-opus":"#d97706","--loki-sonnet":"#4f46e5","--loki-haiku":"#059669","--loki-shadow-sm":"0 1px 2px rgba(0, 0, 0, 0.05)","--loki-shadow-md":"0 2px 4px rgba(0, 0, 0, 0.1)","--loki-shadow-lg":"0 4px 8px rgba(0, 0, 0, 0.15)","--loki-shadow-focus":"0 0 0 2px var(--vscode-focusBorder, #0066cc)"},"vscode-dark":{"--loki-bg-primary":"var(--vscode-editor-background, #1e1e1e)","--loki-bg-secondary":"var(--vscode-sideBar-background, #252526)","--loki-bg-tertiary":"var(--vscode-input-background, #3c3c3c)","--loki-bg-card":"var(--vscode-editor-background, #1e1e1e)","--loki-bg-hover":"var(--vscode-list-hoverBackground, #2a2d2e)","--loki-bg-active":"var(--vscode-list-activeSelectionBackground, #094771)","--loki-bg-overlay":"rgba(0, 0, 0, 0.6)","--loki-accent":"var(--vscode-focusBorder, #007fd4)","--loki-accent-hover":"var(--vscode-button-hoverBackground, #1177bb)","--loki-accent-active":"var(--vscode-button-background, #0e639c)","--loki-accent-light":"var(--vscode-focusBorder, #007fd4)","--loki-accent-muted":"var(--vscode-editor-selectionBackground, rgba(0, 127, 212, 0.25))","--loki-text-primary":"var(--vscode-foreground, #cccccc)","--loki-text-secondary":"var(--vscode-descriptionForeground, #9d9d9d)","--loki-text-muted":"var(--vscode-disabledForeground, #6b6b6b)","--loki-text-disabled":"var(--vscode-disabledForeground, #4d4d4d)","--loki-text-inverse":"var(--vscode-button-foreground, #ffffff)","--loki-border":"var(--vscode-widget-border, #454545)","--loki-border-light":"var(--vscode-widget-border, #5a5a5a)","--loki-border-focus":"var(--vscode-focusBorder, #007fd4)","--loki-success":"var(--vscode-testing-iconPassed, #89d185)","--loki-success-muted":"rgba(137, 209, 133, 0.2)","--loki-warning":"var(--vscode-editorWarning-foreground, #cca700)","--loki-warning-muted":"rgba(204, 167, 0, 0.2)","--loki-error":"var(--vscode-errorForeground, #f48771)","--loki-error-muted":"rgba(244, 135, 113, 0.2)","--loki-info":"var(--vscode-editorInfo-foreground, #75beff)","--loki-info-muted":"rgba(117, 190, 255, 0.2)","--loki-green":"var(--vscode-testing-iconPassed, #89d185)","--loki-green-muted":"rgba(137, 209, 133, 0.2)","--loki-yellow":"var(--vscode-editorWarning-foreground, #cca700)","--loki-yellow-muted":"rgba(204, 167, 0, 0.2)","--loki-red":"var(--vscode-errorForeground, #f48771)","--loki-red-muted":"rgba(244, 135, 113, 0.2)","--loki-blue":"var(--vscode-editorInfo-foreground, #75beff)","--loki-blue-muted":"rgba(117, 190, 255, 0.2)","--loki-purple":"#c084fc","--loki-purple-muted":"rgba(192, 132, 252, 0.2)","--loki-opus":"#f59e0b","--loki-sonnet":"#818cf8","--loki-haiku":"#34d399","--loki-shadow-sm":"0 1px 2px rgba(0, 0, 0, 0.3)","--loki-shadow-md":"0 2px 4px rgba(0, 0, 0, 0.4)","--loki-shadow-lg":"0 4px 8px rgba(0, 0, 0, 0.5)","--loki-shadow-focus":"0 0 0 2px var(--vscode-focusBorder, #007fd4)"}},_={xs:"4px",sm:"8px",md:"12px",lg:"16px",xl:"24px","2xl":"32px","3xl":"48px"},w={none:"0",sm:"4px",md:"6px",lg:"8px",xl:"10px",full:"9999px"},v={fontFamily:{sans:"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",mono:"'JetBrains Mono', 'Fira Code', 'SF Mono', Menlo, monospace"},fontSize:{xs:"10px",sm:"11px",base:"12px",md:"13px",lg:"14px",xl:"16px","2xl":"18px","3xl":"24px"},fontWeight:{normal:"400",medium:"500",semibold:"600",bold:"700"},lineHeight:{tight:"1.25",normal:"1.5",relaxed:"1.75"}},$={duration:{fast:"100ms",normal:"200ms",slow:"300ms",slower:"500ms"},easing:{default:"cubic-bezier(0.4, 0, 0.2, 1)",in:"cubic-bezier(0.4, 0, 1, 1)",out:"cubic-bezier(0, 0, 0.2, 1)",bounce:"cubic-bezier(0.68, -0.55, 0.265, 1.55)"}},Z={sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"},T={base:"0",dropdown:"100",sticky:"200",modal:"300",popover:"400",tooltip:"500",toast:"600"},Q={"navigation.nextItem":{key:"ArrowDown",modifiers:[]},"navigation.prevItem":{key:"ArrowUp",modifiers:[]},"navigation.nextSection":{key:"Tab",modifiers:[]},"navigation.prevSection":{key:"Tab",modifiers:["Shift"]},"navigation.confirm":{key:"Enter",modifiers:[]},"navigation.cancel":{key:"Escape",modifiers:[]},"action.refresh":{key:"r",modifiers:["Meta"]},"action.search":{key:"k",modifiers:["Meta"]},"action.save":{key:"s",modifiers:["Meta"]},"action.close":{key:"w",modifiers:["Meta"]},"theme.toggle":{key:"d",modifiers:["Meta","Shift"]},"task.create":{key:"n",modifiers:["Meta"]},"task.complete":{key:"Enter",modifiers:["Meta"]},"view.toggleLogs":{key:"l",modifiers:["Meta","Shift"]},"view.toggleMemory":{key:"m",modifiers:["Meta","Shift"]}},tt={button:{role:"button",tabIndex:0},tablist:{role:"tablist"},tab:{role:"tab",ariaSelected:!1,tabIndex:-1},tabpanel:{role:"tabpanel",tabIndex:0},list:{role:"list"},listitem:{role:"listitem"},livePolite:{ariaLive:"polite",ariaAtomic:!0},liveAssertive:{ariaLive:"assertive",ariaAtomic:!0},dialog:{role:"dialog",ariaModal:!0},alertdialog:{role:"alertdialog",ariaModal:!0},status:{role:"status",ariaLive:"polite"},alert:{role:"alert",ariaLive:"assertive"},log:{role:"log",ariaLive:"polite",ariaRelevant:"additions"}};function m(d){let t=b[d];return t?Object.entries(t).map(([e,a])=>`${e}: ${a};`).join(`
|
|
702
|
+
var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnPropertyDescriptor;var vt=Object.getOwnPropertyNames;var mt=Object.prototype.hasOwnProperty;var bt=(d,t,e)=>t in d?X(d,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):d[t]=e;var kt=(d,t)=>{for(var e in t)X(d,e,{get:t[e],enumerable:!0})},ft=(d,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of vt(t))!mt.call(d,i)&&i!==e&&X(d,i,{get:()=>t[i],enumerable:!(a=gt(t,i))||a.enumerable});return d};var _t=d=>ft(X({},"__esModule",{value:!0}),d);var k=(d,t,e)=>bt(d,typeof t!="symbol"?t+"":t,e);var Dt={};kt(Dt,{ANIMATION:()=>$,ARIA_PATTERNS:()=>tt,ApiEvents:()=>n,BASE_STYLES:()=>B,BREAKPOINTS:()=>Z,COMMON_STYLES:()=>ot,KEYBOARD_SHORTCUTS:()=>Q,KeyboardHandler:()=>D,LokiApiClient:()=>I,LokiAppStatus:()=>J,LokiChecklistViewer:()=>G,LokiCheckpointViewer:()=>V,LokiContextTracker:()=>Y,LokiCostDashboard:()=>K,LokiCouncilDashboard:()=>q,LokiElement:()=>c,LokiLearningDashboard:()=>N,LokiLogStream:()=>j,LokiMemoryBrowser:()=>O,LokiNotificationCenter:()=>W,LokiOverview:()=>F,LokiSessionControl:()=>U,LokiState:()=>M,LokiTaskBoard:()=>z,LokiTheme:()=>A,RADIUS:()=>w,SPACING:()=>_,STATE_CHANGE_EVENT:()=>it,THEMES:()=>b,THEME_VARIABLES:()=>et,TYPOGRAPHY:()=>v,UnifiedThemeManager:()=>g,VERSION:()=>At,Z_INDEX:()=>E,createApiClient:()=>dt,createStore:()=>ct,generateThemeCSS:()=>m,generateTokensCSS:()=>H,getApiClient:()=>u,getState:()=>L,init:()=>Lt});var b={light:{"--loki-bg-primary":"#FFFEFB","--loki-bg-secondary":"#F8F4F0","--loki-bg-tertiary":"#ECEAE3","--loki-bg-card":"#ffffff","--loki-bg-hover":"#F3EFE9","--loki-bg-active":"#E6E2DA","--loki-bg-overlay":"rgba(32, 21, 21, 0.5)","--loki-accent":"#553DE9","--loki-accent-hover":"#4432c4","--loki-accent-active":"#3828a0","--loki-accent-light":"#7B6BF0","--loki-accent-muted":"rgba(85, 61, 233, 0.10)","--loki-text-primary":"#201515","--loki-text-secondary":"#36342E","--loki-text-muted":"#939084","--loki-text-disabled":"#C5C0B1","--loki-text-inverse":"#ffffff","--loki-border":"#ECEAE3","--loki-border-light":"#C5C0B1","--loki-border-focus":"#553DE9","--loki-success":"#1FC5A8","--loki-success-muted":"rgba(31, 197, 168, 0.12)","--loki-warning":"#D4A03C","--loki-warning-muted":"rgba(212, 160, 60, 0.12)","--loki-error":"#C45B5B","--loki-error-muted":"rgba(196, 91, 91, 0.12)","--loki-info":"#2F71E3","--loki-info-muted":"rgba(47, 113, 227, 0.12)","--loki-green":"#1FC5A8","--loki-green-muted":"rgba(31, 197, 168, 0.12)","--loki-yellow":"#D4A03C","--loki-yellow-muted":"rgba(212, 160, 60, 0.12)","--loki-red":"#C45B5B","--loki-red-muted":"rgba(196, 91, 91, 0.12)","--loki-blue":"#2F71E3","--loki-blue-muted":"rgba(47, 113, 227, 0.12)","--loki-purple":"#553DE9","--loki-purple-muted":"rgba(85, 61, 233, 0.10)","--loki-opus":"#d97706","--loki-sonnet":"#553DE9","--loki-haiku":"#1FC5A8","--loki-shadow-sm":"0 1px 2px rgba(32, 21, 21, 0.04)","--loki-shadow-md":"0 4px 6px rgba(32, 21, 21, 0.06)","--loki-shadow-lg":"0 10px 15px rgba(32, 21, 21, 0.08)","--loki-shadow-focus":"0 0 0 3px rgba(85, 61, 233, 0.25)"},dark:{"--loki-bg-primary":"#1A0F2E","--loki-bg-secondary":"#140B24","--loki-bg-tertiary":"#251842","--loki-bg-card":"#1F1338","--loki-bg-hover":"#2A1F4A","--loki-bg-active":"#352A55","--loki-bg-overlay":"rgba(20, 11, 36, 0.85)","--loki-accent":"#7B6BF0","--loki-accent-hover":"#9488F5","--loki-accent-active":"#6258D0","--loki-accent-light":"#9488F5","--loki-accent-muted":"rgba(123, 107, 240, 0.18)","--loki-text-primary":"#F0ECF8","--loki-text-secondary":"#C0B8D0","--loki-text-muted":"#8B7FA8","--loki-text-disabled":"#5A4E78","--loki-text-inverse":"#1A0F2E","--loki-border":"#2A1F3E","--loki-border-light":"#3D3060","--loki-border-focus":"#7B6BF0","--loki-success":"#2ED8B6","--loki-success-muted":"rgba(46, 216, 182, 0.18)","--loki-warning":"#E8B84A","--loki-warning-muted":"rgba(232, 184, 74, 0.18)","--loki-error":"#E07070","--loki-error-muted":"rgba(224, 112, 112, 0.18)","--loki-info":"#5A9CF5","--loki-info-muted":"rgba(90, 156, 245, 0.18)","--loki-green":"#2ED8B6","--loki-green-muted":"rgba(46, 216, 182, 0.18)","--loki-yellow":"#E8B84A","--loki-yellow-muted":"rgba(232, 184, 74, 0.18)","--loki-red":"#E07070","--loki-red-muted":"rgba(224, 112, 112, 0.18)","--loki-blue":"#5A9CF5","--loki-blue-muted":"rgba(90, 156, 245, 0.18)","--loki-purple":"#9488F5","--loki-purple-muted":"rgba(148, 136, 245, 0.18)","--loki-opus":"#f59e0b","--loki-sonnet":"#7B6BF0","--loki-haiku":"#2ED8B6","--loki-shadow-sm":"0 1px 2px rgba(0, 0, 0, 0.4)","--loki-shadow-md":"0 4px 12px rgba(0, 0, 0, 0.5)","--loki-shadow-lg":"0 10px 25px rgba(0, 0, 0, 0.6)","--loki-shadow-focus":"0 0 0 3px rgba(123, 107, 240, 0.30)"},"high-contrast":{"--loki-bg-primary":"#000000","--loki-bg-secondary":"#0a0a0a","--loki-bg-tertiary":"#141414","--loki-bg-card":"#0a0a0a","--loki-bg-hover":"#1a1a1a","--loki-bg-active":"#242424","--loki-bg-overlay":"rgba(0, 0, 0, 0.9)","--loki-accent":"#c084fc","--loki-accent-hover":"#d8b4fe","--loki-accent-active":"#e9d5ff","--loki-accent-light":"#d8b4fe","--loki-accent-muted":"rgba(192, 132, 252, 0.25)","--loki-text-primary":"#ffffff","--loki-text-secondary":"#e0e0e0","--loki-text-muted":"#b0b0b0","--loki-text-disabled":"#666666","--loki-text-inverse":"#000000","--loki-border":"#ffffff","--loki-border-light":"#cccccc","--loki-border-focus":"#c084fc","--loki-success":"#4ade80","--loki-success-muted":"rgba(74, 222, 128, 0.25)","--loki-warning":"#fde047","--loki-warning-muted":"rgba(253, 224, 71, 0.25)","--loki-error":"#f87171","--loki-error-muted":"rgba(248, 113, 113, 0.25)","--loki-info":"#60a5fa","--loki-info-muted":"rgba(96, 165, 250, 0.25)","--loki-green":"#4ade80","--loki-green-muted":"rgba(74, 222, 128, 0.25)","--loki-yellow":"#fde047","--loki-yellow-muted":"rgba(253, 224, 71, 0.25)","--loki-red":"#f87171","--loki-red-muted":"rgba(248, 113, 113, 0.25)","--loki-blue":"#60a5fa","--loki-blue-muted":"rgba(96, 165, 250, 0.25)","--loki-purple":"#c084fc","--loki-purple-muted":"rgba(192, 132, 252, 0.25)","--loki-opus":"#fbbf24","--loki-sonnet":"#818cf8","--loki-haiku":"#34d399","--loki-shadow-sm":"none","--loki-shadow-md":"none","--loki-shadow-lg":"none","--loki-shadow-focus":"0 0 0 3px #c084fc"},"vscode-light":{"--loki-bg-primary":"var(--vscode-editor-background, #ffffff)","--loki-bg-secondary":"var(--vscode-sideBar-background, #f3f3f3)","--loki-bg-tertiary":"var(--vscode-input-background, #ffffff)","--loki-bg-card":"var(--vscode-editor-background, #ffffff)","--loki-bg-hover":"var(--vscode-list-hoverBackground, #e8e8e8)","--loki-bg-active":"var(--vscode-list-activeSelectionBackground, #0060c0)","--loki-bg-overlay":"rgba(0, 0, 0, 0.4)","--loki-accent":"var(--vscode-focusBorder, #0066cc)","--loki-accent-hover":"var(--vscode-button-hoverBackground, #0055aa)","--loki-accent-active":"var(--vscode-button-background, #007acc)","--loki-accent-light":"var(--vscode-focusBorder, #0066cc)","--loki-accent-muted":"var(--vscode-editor-selectionBackground, rgba(0, 102, 204, 0.2))","--loki-text-primary":"var(--vscode-foreground, #333333)","--loki-text-secondary":"var(--vscode-descriptionForeground, #717171)","--loki-text-muted":"var(--vscode-disabledForeground, #a0a0a0)","--loki-text-disabled":"var(--vscode-disabledForeground, #cccccc)","--loki-text-inverse":"var(--vscode-button-foreground, #ffffff)","--loki-border":"var(--vscode-widget-border, #c8c8c8)","--loki-border-light":"var(--vscode-widget-border, #e0e0e0)","--loki-border-focus":"var(--vscode-focusBorder, #0066cc)","--loki-success":"var(--vscode-testing-iconPassed, #388a34)","--loki-success-muted":"rgba(56, 138, 52, 0.15)","--loki-warning":"var(--vscode-editorWarning-foreground, #bf8803)","--loki-warning-muted":"rgba(191, 136, 3, 0.15)","--loki-error":"var(--vscode-errorForeground, #e51400)","--loki-error-muted":"rgba(229, 20, 0, 0.15)","--loki-info":"var(--vscode-editorInfo-foreground, #1a85ff)","--loki-info-muted":"rgba(26, 133, 255, 0.15)","--loki-green":"var(--vscode-testing-iconPassed, #388a34)","--loki-green-muted":"rgba(56, 138, 52, 0.15)","--loki-yellow":"var(--vscode-editorWarning-foreground, #bf8803)","--loki-yellow-muted":"rgba(191, 136, 3, 0.15)","--loki-red":"var(--vscode-errorForeground, #e51400)","--loki-red-muted":"rgba(229, 20, 0, 0.15)","--loki-blue":"var(--vscode-editorInfo-foreground, #1a85ff)","--loki-blue-muted":"rgba(26, 133, 255, 0.15)","--loki-purple":"#9333ea","--loki-purple-muted":"rgba(147, 51, 234, 0.15)","--loki-opus":"#d97706","--loki-sonnet":"#4f46e5","--loki-haiku":"#059669","--loki-shadow-sm":"0 1px 2px rgba(0, 0, 0, 0.05)","--loki-shadow-md":"0 2px 4px rgba(0, 0, 0, 0.1)","--loki-shadow-lg":"0 4px 8px rgba(0, 0, 0, 0.15)","--loki-shadow-focus":"0 0 0 2px var(--vscode-focusBorder, #0066cc)"},"vscode-dark":{"--loki-bg-primary":"var(--vscode-editor-background, #1e1e1e)","--loki-bg-secondary":"var(--vscode-sideBar-background, #252526)","--loki-bg-tertiary":"var(--vscode-input-background, #3c3c3c)","--loki-bg-card":"var(--vscode-editor-background, #1e1e1e)","--loki-bg-hover":"var(--vscode-list-hoverBackground, #2a2d2e)","--loki-bg-active":"var(--vscode-list-activeSelectionBackground, #094771)","--loki-bg-overlay":"rgba(0, 0, 0, 0.6)","--loki-accent":"var(--vscode-focusBorder, #007fd4)","--loki-accent-hover":"var(--vscode-button-hoverBackground, #1177bb)","--loki-accent-active":"var(--vscode-button-background, #0e639c)","--loki-accent-light":"var(--vscode-focusBorder, #007fd4)","--loki-accent-muted":"var(--vscode-editor-selectionBackground, rgba(0, 127, 212, 0.25))","--loki-text-primary":"var(--vscode-foreground, #cccccc)","--loki-text-secondary":"var(--vscode-descriptionForeground, #9d9d9d)","--loki-text-muted":"var(--vscode-disabledForeground, #6b6b6b)","--loki-text-disabled":"var(--vscode-disabledForeground, #4d4d4d)","--loki-text-inverse":"var(--vscode-button-foreground, #ffffff)","--loki-border":"var(--vscode-widget-border, #454545)","--loki-border-light":"var(--vscode-widget-border, #5a5a5a)","--loki-border-focus":"var(--vscode-focusBorder, #007fd4)","--loki-success":"var(--vscode-testing-iconPassed, #89d185)","--loki-success-muted":"rgba(137, 209, 133, 0.2)","--loki-warning":"var(--vscode-editorWarning-foreground, #cca700)","--loki-warning-muted":"rgba(204, 167, 0, 0.2)","--loki-error":"var(--vscode-errorForeground, #f48771)","--loki-error-muted":"rgba(244, 135, 113, 0.2)","--loki-info":"var(--vscode-editorInfo-foreground, #75beff)","--loki-info-muted":"rgba(117, 190, 255, 0.2)","--loki-green":"var(--vscode-testing-iconPassed, #89d185)","--loki-green-muted":"rgba(137, 209, 133, 0.2)","--loki-yellow":"var(--vscode-editorWarning-foreground, #cca700)","--loki-yellow-muted":"rgba(204, 167, 0, 0.2)","--loki-red":"var(--vscode-errorForeground, #f48771)","--loki-red-muted":"rgba(244, 135, 113, 0.2)","--loki-blue":"var(--vscode-editorInfo-foreground, #75beff)","--loki-blue-muted":"rgba(117, 190, 255, 0.2)","--loki-purple":"#c084fc","--loki-purple-muted":"rgba(192, 132, 252, 0.2)","--loki-opus":"#f59e0b","--loki-sonnet":"#818cf8","--loki-haiku":"#34d399","--loki-shadow-sm":"0 1px 2px rgba(0, 0, 0, 0.3)","--loki-shadow-md":"0 2px 4px rgba(0, 0, 0, 0.4)","--loki-shadow-lg":"0 4px 8px rgba(0, 0, 0, 0.5)","--loki-shadow-focus":"0 0 0 2px var(--vscode-focusBorder, #007fd4)"}},_={xs:"4px",sm:"8px",md:"12px",lg:"16px",xl:"24px","2xl":"32px","3xl":"48px"},w={none:"0",sm:"2px",md:"4px",lg:"5px",xl:"5px",full:"9999px"},v={fontFamily:{sans:"'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif",serif:"'DM Serif Display', Georgia, 'Times New Roman', serif",mono:"'JetBrains Mono', 'Fira Code', 'SF Mono', Menlo, monospace"},fontSize:{xs:"10px",sm:"11px",base:"12px",md:"13px",lg:"14px",xl:"16px","2xl":"18px","3xl":"24px"},fontWeight:{normal:"400",medium:"500",semibold:"600",bold:"700"},lineHeight:{tight:"1.25",normal:"1.5",relaxed:"1.75"}},$={duration:{fast:"100ms",normal:"200ms",slow:"300ms",slower:"500ms"},easing:{default:"cubic-bezier(0.4, 0, 0.2, 1)",in:"cubic-bezier(0.4, 0, 1, 1)",out:"cubic-bezier(0, 0, 0.2, 1)",bounce:"cubic-bezier(0.68, -0.55, 0.265, 1.55)"}},Z={sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"},E={base:"0",dropdown:"100",sticky:"200",modal:"300",popover:"400",tooltip:"500",toast:"600"},Q={"navigation.nextItem":{key:"ArrowDown",modifiers:[]},"navigation.prevItem":{key:"ArrowUp",modifiers:[]},"navigation.nextSection":{key:"Tab",modifiers:[]},"navigation.prevSection":{key:"Tab",modifiers:["Shift"]},"navigation.confirm":{key:"Enter",modifiers:[]},"navigation.cancel":{key:"Escape",modifiers:[]},"action.refresh":{key:"r",modifiers:["Meta"]},"action.search":{key:"k",modifiers:["Meta"]},"action.save":{key:"s",modifiers:["Meta"]},"action.close":{key:"w",modifiers:["Meta"]},"theme.toggle":{key:"d",modifiers:["Meta","Shift"]},"task.create":{key:"n",modifiers:["Meta"]},"task.complete":{key:"Enter",modifiers:["Meta"]},"view.toggleLogs":{key:"l",modifiers:["Meta","Shift"]},"view.toggleMemory":{key:"m",modifiers:["Meta","Shift"]}},tt={button:{role:"button",tabIndex:0},tablist:{role:"tablist"},tab:{role:"tab",ariaSelected:!1,tabIndex:-1},tabpanel:{role:"tabpanel",tabIndex:0},list:{role:"list"},listitem:{role:"listitem"},livePolite:{ariaLive:"polite",ariaAtomic:!0},liveAssertive:{ariaLive:"assertive",ariaAtomic:!0},dialog:{role:"dialog",ariaModal:!0},alertdialog:{role:"alertdialog",ariaModal:!0},status:{role:"status",ariaLive:"polite"},alert:{role:"alert",ariaLive:"assertive"},log:{role:"log",ariaLive:"polite",ariaRelevant:"additions"}};function m(d){let t=b[d];return t?Object.entries(t).map(([e,a])=>`${e}: ${a};`).join(`
|
|
678
703
|
`):""}function H(){return`
|
|
679
704
|
/* Spacing */
|
|
680
705
|
--loki-space-xs: ${_.xs};
|
|
@@ -695,6 +720,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
695
720
|
|
|
696
721
|
/* Typography */
|
|
697
722
|
--loki-font-sans: ${v.fontFamily.sans};
|
|
723
|
+
--loki-font-serif: ${v.fontFamily.serif};
|
|
698
724
|
--loki-font-mono: ${v.fontFamily.mono};
|
|
699
725
|
--loki-text-xs: ${v.fontSize.xs};
|
|
700
726
|
--loki-text-sm: ${v.fontSize.sm};
|
|
@@ -713,18 +739,18 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
713
739
|
--loki-transition: ${$.duration.normal} ${$.easing.default};
|
|
714
740
|
|
|
715
741
|
/* Z-Index */
|
|
716
|
-
--loki-z-dropdown: ${
|
|
717
|
-
--loki-z-sticky: ${
|
|
718
|
-
--loki-z-modal: ${
|
|
719
|
-
--loki-z-popover: ${
|
|
720
|
-
--loki-z-tooltip: ${
|
|
721
|
-
--loki-z-toast: ${
|
|
742
|
+
--loki-z-dropdown: ${E.dropdown};
|
|
743
|
+
--loki-z-sticky: ${E.sticky};
|
|
744
|
+
--loki-z-modal: ${E.modal};
|
|
745
|
+
--loki-z-popover: ${E.popover};
|
|
746
|
+
--loki-z-tooltip: ${E.tooltip};
|
|
747
|
+
--loki-z-toast: ${E.toast};
|
|
722
748
|
|
|
723
749
|
/* Glass effect */
|
|
724
750
|
--loki-glass-bg: rgba(255, 255, 255, 0.03);
|
|
725
751
|
--loki-glass-border: rgba(255, 255, 255, 0.06);
|
|
726
752
|
--loki-glass-blur: blur(12px);
|
|
727
|
-
`}var
|
|
753
|
+
`}var B=`
|
|
728
754
|
/* Reset and base */
|
|
729
755
|
:host {
|
|
730
756
|
font-family: var(--loki-font-sans);
|
|
@@ -831,11 +857,11 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
831
857
|
font-size: var(--loki-text-lg);
|
|
832
858
|
}
|
|
833
859
|
|
|
834
|
-
/* Status indicators */
|
|
860
|
+
/* Status indicators (rectangle style) */
|
|
835
861
|
.status-dot {
|
|
836
|
-
width:
|
|
837
|
-
height:
|
|
838
|
-
border-radius:
|
|
862
|
+
width: 12px;
|
|
863
|
+
height: 6px;
|
|
864
|
+
border-radius: 2px;
|
|
839
865
|
flex-shrink: 0;
|
|
840
866
|
}
|
|
841
867
|
|
|
@@ -1012,10 +1038,10 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1012
1038
|
${m(e)}
|
|
1013
1039
|
${H()}
|
|
1014
1040
|
}
|
|
1015
|
-
${
|
|
1016
|
-
`}static init(){let t=h.getTheme();document.documentElement.setAttribute("data-loki-theme",t),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{localStorage.getItem(h.STORAGE_KEY)||h.setTheme(h.getTheme())}),h.detectContext()==="vscode"&&new MutationObserver(()=>{let a=h.getTheme();document.documentElement.setAttribute("data-loki-theme",a),window.dispatchEvent(new CustomEvent("loki-theme-change",{detail:{theme:a,context:"vscode"}}))}).observe(document.body,{attributes:!0,attributeFilter:["class"]})}};
|
|
1041
|
+
${B}
|
|
1042
|
+
`}static init(){let t=h.getTheme();document.documentElement.setAttribute("data-loki-theme",t),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{localStorage.getItem(h.STORAGE_KEY)||h.setTheme(h.getTheme())}),h.detectContext()==="vscode"&&new MutationObserver(()=>{let a=h.getTheme();document.documentElement.setAttribute("data-loki-theme",a),window.dispatchEvent(new CustomEvent("loki-theme-change",{detail:{theme:a,context:"vscode"}}))}).observe(document.body,{attributes:!0,attributeFilter:["class"]})}};k(h,"STORAGE_KEY","loki-theme"),k(h,"CONTEXT_KEY","loki-context");var g=h,D=class{constructor(){this._handlers=new Map,this._enabled=!0}register(t,e){let a=Q[t];if(!a){console.warn(`Unknown keyboard action: ${t}`);return}this._handlers.set(t,{shortcut:a,handler:e})}unregister(t){this._handlers.delete(t)}setEnabled(t){this._enabled=t}handleEvent(t){if(!this._enabled)return!1;for(let[e,{shortcut:a,handler:i}]of this._handlers)if(this._matchesShortcut(t,a))return t.preventDefault(),t.stopPropagation(),i(t),!0;return!1}_matchesShortcut(t,e){let a=t.key.toLowerCase(),i=e.modifiers||[];if(a!==e.key.toLowerCase())return!1;let s=i.includes("Ctrl")||i.includes("Meta"),r=i.includes("Shift"),o=i.includes("Alt"),l=(t.ctrlKey||t.metaKey)===s,p=t.shiftKey===r,y=t.altKey===o;return l&&p&&y}attach(t){this._boundHandler||(this._boundHandler=e=>this.handleEvent(e)),t.addEventListener("keydown",this._boundHandler)}detach(t){this._boundHandler&&t.removeEventListener("keydown",this._boundHandler)}};var et={light:{"--loki-bg-primary":"#FFFEFB","--loki-bg-secondary":"#F8F4F0","--loki-bg-tertiary":"#ECEAE3","--loki-bg-card":"#ffffff","--loki-bg-hover":"#F3EFE9","--loki-accent":"#553DE9","--loki-accent-light":"#7B6BF0","--loki-accent-muted":"rgba(85, 61, 233, 0.10)","--loki-text-primary":"#201515","--loki-text-secondary":"#36342E","--loki-text-muted":"#939084","--loki-border":"#ECEAE3","--loki-border-light":"#C5C0B1","--loki-green":"#1FC5A8","--loki-green-muted":"rgba(31, 197, 168, 0.12)","--loki-yellow":"#D4A03C","--loki-yellow-muted":"rgba(212, 160, 60, 0.12)","--loki-red":"#C45B5B","--loki-red-muted":"rgba(196, 91, 91, 0.12)","--loki-blue":"#2F71E3","--loki-blue-muted":"rgba(47, 113, 227, 0.12)","--loki-purple":"#553DE9","--loki-purple-muted":"rgba(85, 61, 233, 0.10)","--loki-opus":"#d97706","--loki-sonnet":"#553DE9","--loki-haiku":"#1FC5A8","--loki-transition":"0.2s cubic-bezier(0.4, 0, 0.2, 1)"},dark:{"--loki-bg-primary":"#1A0F2E","--loki-bg-secondary":"#140B24","--loki-bg-tertiary":"#251842","--loki-bg-card":"#1F1338","--loki-bg-hover":"#2A1F4A","--loki-accent":"#7B6BF0","--loki-accent-light":"#9488F5","--loki-accent-muted":"rgba(123, 107, 240, 0.18)","--loki-text-primary":"#F0ECF8","--loki-text-secondary":"#C0B8D0","--loki-text-muted":"#8B7FA8","--loki-border":"#2A1F3E","--loki-border-light":"#3D3060","--loki-green":"#2ED8B6","--loki-green-muted":"rgba(46, 216, 182, 0.18)","--loki-yellow":"#E8B84A","--loki-yellow-muted":"rgba(232, 184, 74, 0.18)","--loki-red":"#E07070","--loki-red-muted":"rgba(224, 112, 112, 0.18)","--loki-blue":"#5A9CF5","--loki-blue-muted":"rgba(90, 156, 245, 0.18)","--loki-purple":"#9488F5","--loki-purple-muted":"rgba(148, 136, 245, 0.18)","--loki-opus":"#f59e0b","--loki-sonnet":"#7B6BF0","--loki-haiku":"#2ED8B6","--loki-transition":"0.2s cubic-bezier(0.4, 0, 0.2, 1)"}},ot=`
|
|
1017
1043
|
:host {
|
|
1018
|
-
font-family: 'Inter', -apple-system,
|
|
1044
|
+
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
|
1019
1045
|
line-height: 1.5;
|
|
1020
1046
|
-webkit-font-smoothing: antialiased;
|
|
1021
1047
|
box-sizing: border-box;
|
|
@@ -1032,7 +1058,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1032
1058
|
/* Button base styles */
|
|
1033
1059
|
.btn {
|
|
1034
1060
|
padding: 8px 14px;
|
|
1035
|
-
border-radius:
|
|
1061
|
+
border-radius: 4px;
|
|
1036
1062
|
font-size: 13px;
|
|
1037
1063
|
font-weight: 500;
|
|
1038
1064
|
cursor: pointer;
|
|
@@ -1062,11 +1088,11 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1062
1088
|
background: var(--loki-bg-hover);
|
|
1063
1089
|
}
|
|
1064
1090
|
|
|
1065
|
-
/* Status
|
|
1091
|
+
/* Status indicator (rectangle) */
|
|
1066
1092
|
.status-dot {
|
|
1067
|
-
width:
|
|
1068
|
-
height:
|
|
1069
|
-
border-radius:
|
|
1093
|
+
width: 12px;
|
|
1094
|
+
height: 6px;
|
|
1095
|
+
border-radius: 2px;
|
|
1070
1096
|
}
|
|
1071
1097
|
|
|
1072
1098
|
.status-dot.active {
|
|
@@ -1087,7 +1113,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1087
1113
|
.card {
|
|
1088
1114
|
background: var(--loki-bg-card);
|
|
1089
1115
|
border: 1px solid var(--loki-border);
|
|
1090
|
-
border-radius:
|
|
1116
|
+
border-radius: 5px;
|
|
1091
1117
|
padding: 16px;
|
|
1092
1118
|
transition: all var(--loki-transition);
|
|
1093
1119
|
}
|
|
@@ -1109,8 +1135,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1109
1135
|
::-webkit-scrollbar-track { background: var(--loki-bg-primary); }
|
|
1110
1136
|
::-webkit-scrollbar-thumb { background: var(--loki-border); border-radius: 3px; }
|
|
1111
1137
|
::-webkit-scrollbar-thumb:hover { background: var(--loki-border-light); }
|
|
1112
|
-
`,
|
|
1113
|
-
`)}static applyToElement(t,e=null){let a=
|
|
1138
|
+
`,S=class S{static getTheme(){return g.getTheme()}static setTheme(t){g.setTheme(t)}static toggle(){return g.toggle()}static getVariables(t=null){let e=t||S.getTheme();return b[e]||et[e]||et.light}static toCSSString(t=null){let e=t||S.getTheme();if(b[e])return m(e);let a=S.getVariables(e);return Object.entries(a).map(([i,s])=>`${i}: ${s};`).join(`
|
|
1139
|
+
`)}static applyToElement(t,e=null){let a=S.getVariables(e);for(let[i,s]of Object.entries(a))t.style.setProperty(i,s)}static init(){g.init()}static detectContext(){return g.detectContext()}static getAvailableThemes(){return Object.keys(b)}};k(S,"STORAGE_KEY","loki-theme");var A=S,c=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}),this._theme=A.getTheme(),this._themeChangeHandler=this._onThemeChange.bind(this),this._keyboardHandler=new D}connectedCallback(){window.addEventListener("loki-theme-change",this._themeChangeHandler),this._applyTheme(),this._setupKeyboardHandling(),this.render()}disconnectedCallback(){window.removeEventListener("loki-theme-change",this._themeChangeHandler),this._keyboardHandler.detach(this)}_onThemeChange(t){this._theme=t.detail.theme,this._applyTheme(),this.onThemeChange&&this.onThemeChange(this._theme)}_applyTheme(){A.applyToElement(this.shadowRoot.host,this._theme),this.setAttribute("data-loki-theme",this._theme)}_setupKeyboardHandling(){this._keyboardHandler.attach(this)}registerShortcut(t,e){this._keyboardHandler.register(t,e)}getBaseStyles(){return`
|
|
1114
1140
|
/* Design tokens */
|
|
1115
1141
|
:host {
|
|
1116
1142
|
${H()}
|
|
@@ -1165,8 +1191,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1165
1191
|
}
|
|
1166
1192
|
}
|
|
1167
1193
|
|
|
1168
|
-
${
|
|
1169
|
-
`}getAriaPattern(t){return tt[t]||{}}applyAriaPattern(t,e){let a=this.getAriaPattern(e);for(let[i,s]of Object.entries(a))if(i==="role")t.setAttribute("role",s);else{let r=i.replace(/([A-Z])/g,"-$1").toLowerCase();t.setAttribute(r,s)}}render(){}};var E={realtime:1e3,normal:2e3,background:5e3,offline:1e4},nt={vscode:E.normal,browser:E.realtime,cli:E.background},lt={baseUrl:typeof window<"u"?window.location.origin:"http://localhost:57374",wsUrl:typeof window<"u"?`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`:"ws://localhost:57374/ws",pollInterval:2e3,timeout:1e4,retryAttempts:3,retryDelay:1e3},n={CONNECTED:"api:connected",DISCONNECTED:"api:disconnected",ERROR:"api:error",STATUS_UPDATE:"api:status-update",TASK_CREATED:"api:task-created",TASK_UPDATED:"api:task-updated",TASK_DELETED:"api:task-deleted",PROJECT_CREATED:"api:project-created",PROJECT_UPDATED:"api:project-updated",AGENT_UPDATE:"api:agent-update",LOG_MESSAGE:"api:log-message",MEMORY_UPDATE:"api:memory-update",CHECKLIST_UPDATE:"api:checklist-update"},x=class x extends EventTarget{static getInstance(t={}){let e=t.baseUrl||lt.baseUrl;return x._instances.has(e)||x._instances.set(e,new x(t)),x._instances.get(e)}static clearInstances(){x._instances.forEach(t=>t.disconnect()),x._instances.clear()}constructor(t={}){super(),this.config={...lt,...t},this._ws=null,this._connected=!1,this._pollInterval=null,this._reconnectTimeout=null,this._cache=new Map,this._cacheTimeout=5e3,this._vscodeApi=null,this._context=this._detectContext(),this._currentPollInterval=nt[this._context]||E.normal,this._visibilityChangeHandler=null,this._messageHandler=null,this._setupAdaptivePolling(),this._setupVSCodeBridge()}_detectContext(){return typeof acquireVsCodeApi<"u"?"vscode":typeof window<"u"&&window.location?"browser":"cli"}get context(){return this._context}static get POLL_INTERVALS(){return E}_setupAdaptivePolling(){typeof document>"u"||(this._visibilityChangeHandler=()=>{document.hidden?this._setPollInterval(E.background):this._setPollInterval(nt[this._context]||E.normal)},document.addEventListener("visibilitychange",this._visibilityChangeHandler))}_setPollInterval(t){this._currentPollInterval=t,this._pollInterval&&(this.stopPolling(),this.startPolling(null,t))}setPollMode(t){let e=E[t];e&&this._setPollInterval(e)}_setupVSCodeBridge(){if(!(typeof acquireVsCodeApi>"u")){try{this._vscodeApi=acquireVsCodeApi()}catch{console.warn("VS Code API already acquired or unavailable");return}this._messageHandler=t=>{let e=t.data;if(!(!e||!e.type))switch(e.type){case"updateStatus":this._emit(n.STATUS_UPDATE,e.data);break;case"updateTasks":this._emit(n.TASK_UPDATED,e.data);break;case"taskCreated":this._emit(n.TASK_CREATED,e.data);break;case"taskDeleted":this._emit(n.TASK_DELETED,e.data);break;case"projectCreated":this._emit(n.PROJECT_CREATED,e.data);break;case"projectUpdated":this._emit(n.PROJECT_UPDATED,e.data);break;case"agentUpdate":this._emit(n.AGENT_UPDATE,e.data);break;case"logMessage":this._emit(n.LOG_MESSAGE,e.data);break;case"memoryUpdate":this._emit(n.MEMORY_UPDATE,e.data);break;case"connected":this._connected=!0,this._emit(n.CONNECTED,e.data);break;case"disconnected":this._connected=!1,this._emit(n.DISCONNECTED,e.data);break;case"error":this._emit(n.ERROR,e.data);break;case"setPollMode":this.setPollMode(e.data.mode);break;default:this._emit(`api:${e.type}`,e.data)}},window.addEventListener("message",this._messageHandler)}}get isVSCode(){return this._context==="vscode"}postToVSCode(t,e={}){this._vscodeApi&&this._vscodeApi.postMessage({type:t,data:e})}requestRefresh(){this.postToVSCode("requestRefresh")}notifyVSCode(t,e={}){this.postToVSCode("userAction",{action:t,...e})}get baseUrl(){return this.config.baseUrl}set baseUrl(t){this.config.baseUrl=t,this.config.wsUrl=t.replace(/^http/,"ws")+"/ws"}get isConnected(){return this._connected}async connect(){if(!(this._ws&&this._ws.readyState===WebSocket.OPEN))return new Promise((t,e)=>{try{this._ws=new WebSocket(this.config.wsUrl),this._ws.onopen=()=>{this._connected=!0,this._emit(n.CONNECTED),t()},this._ws.onclose=()=>{this._connected=!1,this._emit(n.DISCONNECTED),this._scheduleReconnect()},this._ws.onerror=a=>{this._emit(n.ERROR,{error:a}),e(a)},this._ws.onmessage=a=>{try{let i=JSON.parse(a.data);this._handleMessage(i)}catch(i){console.error("Failed to parse WebSocket message:",i)}}}catch(a){e(a)}})}disconnect(){this._ws&&(this._ws.close(),this._ws=null),this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null),this._reconnectTimeout&&(clearTimeout(this._reconnectTimeout),this._reconnectTimeout=null),this._connected=!1,this._cleanupGlobalListeners()}_cleanupGlobalListeners(){this._visibilityChangeHandler&&typeof document<"u"&&(document.removeEventListener("visibilitychange",this._visibilityChangeHandler),this._visibilityChangeHandler=null),this._messageHandler&&typeof window<"u"&&(window.removeEventListener("message",this._messageHandler),this._messageHandler=null)}destroy(){this.disconnect()}_scheduleReconnect(){this._reconnectTimeout||(this._reconnectTimeout=setTimeout(()=>{this._reconnectTimeout=null,this.connect().catch(()=>{})},this.config.retryDelay))}_handleMessage(t){let a={connected:n.CONNECTED,status_update:n.STATUS_UPDATE,task_created:n.TASK_CREATED,task_updated:n.TASK_UPDATED,task_deleted:n.TASK_DELETED,task_moved:n.TASK_UPDATED,project_created:n.PROJECT_CREATED,project_updated:n.PROJECT_UPDATED,agent_update:n.AGENT_UPDATE,log:n.LOG_MESSAGE}[t.type]||`api:${t.type}`;this._emit(a,t.data)}_emit(t,e={}){this.dispatchEvent(new CustomEvent(t,{detail:e}))}async _request(t,e={}){let a=`${this.config.baseUrl}${t}`,i=new AbortController,s=setTimeout(()=>i.abort(),this.config.timeout);try{let r=await fetch(a,{...e,signal:i.signal,headers:{"Content-Type":"application/json",...e.headers}});if(clearTimeout(s),!r.ok){let o=await r.json().catch(()=>({detail:r.statusText}));throw new Error(o.detail||`HTTP ${r.status}`)}return r.status===204?null:await r.json()}catch(r){throw clearTimeout(s),r.name==="AbortError"?new Error("Request timeout"):r}}async _get(t,e=!1){if(e&&this._cache.has(t)){let i=this._cache.get(t);if(Date.now()-i.timestamp<this._cacheTimeout)return i.data}let a=await this._request(t);return e&&this._cache.set(t,{data:a,timestamp:Date.now()}),a}async _post(t,e){return this._request(t,{method:"POST",body:JSON.stringify(e)})}async _put(t,e){return this._request(t,{method:"PUT",body:JSON.stringify(e)})}async _delete(t){return this._request(t,{method:"DELETE"})}async getStatus(){return this._get("/api/status")}async healthCheck(){return this._get("/health")}async listProjects(t=null){let e=t?`?status=${t}`:"";return this._get(`/api/projects${e}`)}async getProject(t){return this._get(`/api/projects/${t}`)}async createProject(t){return this._post("/api/projects",t)}async updateProject(t,e){return this._put(`/api/projects/${t}`,e)}async deleteProject(t){return this._delete(`/api/projects/${t}`)}async listTasks(t={}){let e=new URLSearchParams;t.projectId&&e.append("project_id",t.projectId),t.status&&e.append("status",t.status),t.priority&&e.append("priority",t.priority);let a=e.toString()?`?${e}`:"";return this._get(`/api/tasks${a}`)}async getTask(t){return this._get(`/api/tasks/${t}`)}async createTask(t){return this._post("/api/tasks",t)}async updateTask(t,e){return this._put(`/api/tasks/${t}`,e)}async moveTask(t,e,a){return this._post(`/api/tasks/${t}/move`,{status:e,position:a})}async deleteTask(t){return this._delete(`/api/tasks/${t}`)}async getMemorySummary(){return this._get("/api/memory/summary",!0)}async getMemoryIndex(){return this._get("/api/memory/index",!0)}async getMemoryTimeline(){return this._get("/api/memory/timeline")}async listEpisodes(t={}){let e=new URLSearchParams(t).toString();return this._get(`/api/memory/episodes${e?"?"+e:""}`)}async getEpisode(t){return this._get(`/api/memory/episodes/${t}`)}async listPatterns(t={}){let e=new URLSearchParams(t).toString();return this._get(`/api/memory/patterns${e?"?"+e:""}`)}async getPattern(t){return this._get(`/api/memory/patterns/${t}`)}async listSkills(){return this._get("/api/memory/skills")}async getSkill(t){return this._get(`/api/memory/skills/${t}`)}async retrieveMemories(t,e=null,a=5){return this._post("/api/memory/retrieve",{query:t,taskType:e,topK:a})}async consolidateMemory(t=24){return this._post("/api/memory/consolidate",{sinceHours:t})}async getTokenEconomics(){return this._get("/api/memory/economics")}async listRegisteredProjects(t=!1){return this._get(`/api/registry/projects?include_inactive=${t}`)}async registerProject(t,e=null,a=null){return this._post("/api/registry/projects",{path:t,name:e,alias:a})}async discoverProjects(t=3){return this._get(`/api/registry/discover?max_depth=${t}`)}async syncRegistry(){return this._post("/api/registry/sync",{})}async getCrossProjectTasks(t=null){let e=t?`?project_ids=${t.join(",")}`:"";return this._get(`/api/registry/tasks${e}`)}async getLearningMetrics(t={}){let e=new URLSearchParams;t.timeRange&&e.append("timeRange",t.timeRange),t.signalType&&e.append("signalType",t.signalType),t.source&&e.append("source",t.source);let a=e.toString()?`?${e}`:"";return this._get(`/api/learning/metrics${a}`)}async getLearningTrends(t={}){let e=new URLSearchParams;t.timeRange&&e.append("timeRange",t.timeRange),t.signalType&&e.append("signalType",t.signalType),t.source&&e.append("source",t.source);let a=e.toString()?`?${e}`:"";return this._get(`/api/learning/trends${a}`)}async getLearningSignals(t={}){let e=new URLSearchParams;t.timeRange&&e.append("timeRange",t.timeRange),t.signalType&&e.append("signalType",t.signalType),t.source&&e.append("source",t.source),t.limit&&e.append("limit",String(t.limit)),t.offset&&e.append("offset",String(t.offset));let a=e.toString()?`?${e}`:"";return this._get(`/api/learning/signals${a}`)}async getLatestAggregation(){return this._get("/api/learning/aggregation")}async triggerAggregation(t={}){return this._post("/api/learning/aggregate",t)}async getAggregatedPreferences(t=20){return this._get(`/api/learning/preferences?limit=${t}`)}async getAggregatedErrors(t=20){return this._get(`/api/learning/errors?limit=${t}`)}async getAggregatedSuccessPatterns(t=20){return this._get(`/api/learning/success?limit=${t}`)}async getToolEfficiency(t=20){return this._get(`/api/learning/tools?limit=${t}`)}async getCost(){return this._get("/api/cost")}async getPricing(){return this._get("/api/pricing")}async getCouncilState(){return this._get("/api/council/state")}async getCouncilVerdicts(t=20){return this._get(`/api/council/verdicts?limit=${t}`)}async getCouncilConvergence(){return this._get("/api/council/convergence")}async getCouncilReport(){return this._get("/api/council/report")}async forceCouncilReview(){return this._post("/api/council/force-review",{})}async getContext(){return this._get("/api/context")}async getNotifications(t,e){let a=new URLSearchParams;t&&a.set("severity",t),e&&a.set("unread_only","true");let i=a.toString();return this._get("/api/notifications"+(i?"?"+i:""))}async getNotificationTriggers(){return this._get("/api/notifications/triggers")}async updateNotificationTriggers(t){return this._put("/api/notifications/triggers",{triggers:t})}async acknowledgeNotification(t){return this._post("/api/notifications/"+encodeURIComponent(t)+"/acknowledge",{})}async pauseSession(){return this._post("/api/control/pause",{})}async resumeSession(){return this._post("/api/control/resume",{})}async stopSession(){return this._post("/api/control/stop",{})}async getLogs(t=100){return this._get(`/api/logs?lines=${t}`)}async getChecklist(){return this._get("/api/checklist")}async getChecklistSummary(){return this._get("/api/checklist/summary")}async getPrdObservations(){let t=await fetch(`${this.baseUrl}/api/prd-observations`);if(!t.ok)throw new Error(`HTTP ${t.status}`);return t.text()}async getChecklistWaivers(){return this._get("/api/checklist/waivers")}async addChecklistWaiver(t,e,a="dashboard"){return this._post("/api/checklist/waivers",{item_id:t,reason:e,waived_by:a})}async removeChecklistWaiver(t){return this._delete(`/api/checklist/waivers/${encodeURIComponent(t)}`)}async getCouncilGate(){return this._get("/api/council/gate")}async getAppRunnerStatus(){return this._get("/api/app-runner/status")}async getAppRunnerLogs(t=100){return this._get(`/api/app-runner/logs?lines=${t}`)}async restartApp(){return this._post("/api/control/app-restart",{})}async stopApp(){return this._post("/api/control/app-stop",{})}async getPlaywrightResults(){return this._get("/api/playwright/results")}async getPlaywrightScreenshot(){return this._get("/api/playwright/screenshot")}startPolling(t,e=null){if(this._pollInterval)return;this._pollCallback=t;let a=async()=>{try{let s=await this.getStatus();this._connected=!0,this._pollCallback&&this._pollCallback(s),this._emit(n.STATUS_UPDATE,s),this._vscodeApi&&this.postToVSCode("pollSuccess",{timestamp:Date.now()})}catch(s){this._connected=!1,this._emit(n.ERROR,{error:s}),this._vscodeApi&&this.postToVSCode("pollError",{error:s.message})}};a();let i=e||this._currentPollInterval||this.config.pollInterval;this._pollInterval=setInterval(a,i)}stopPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null)}};f(x,"_instances",new Map);var D=x;function dt(d={}){return new D(d)}function u(d={}){return D.getInstance(d)}var it="loki-state-change",at={ui:{theme:"light",sidebarCollapsed:!1,activeSection:"kanban",terminalAutoScroll:!0},session:{connected:!1,lastSync:null,mode:"offline",phase:null,iteration:null},localTasks:[],cache:{projects:[],tasks:[],agents:[],memory:null,lastFetch:null},preferences:{pollInterval:2e3,notifications:!0,soundEnabled:!1}},k=class k extends EventTarget{static getInstance(){return k._instance||(k._instance=new k),k._instance}constructor(){super(),this._state=this._loadState(),this._subscribers=new Map,this._batchUpdates=[],this._batchTimeout=null}_loadState(){try{let t=localStorage.getItem(k.STORAGE_KEY);if(t){let e=JSON.parse(t);return this._mergeState(at,e)}}catch(t){console.warn("Failed to load state from localStorage:",t)}return{...at}}_mergeState(t,e){let a={...t};for(let i of Object.keys(e))i in t&&typeof t[i]=="object"&&!Array.isArray(t[i])?a[i]=this._mergeState(t[i],e[i]):a[i]=e[i];return a}_saveState(){try{let t={ui:this._state.ui,localTasks:this._state.localTasks,preferences:this._state.preferences};localStorage.setItem(k.STORAGE_KEY,JSON.stringify(t))}catch(t){console.warn("Failed to save state to localStorage:",t)}}get(t=null){if(!t)return{...this._state};let e=t.split("."),a=this._state;for(let i of e){if(a==null)return;a=a[i]}return a}set(t,e,a=!0){let i=t.split("."),s=i.pop(),r=this._state;for(let l of i)l in r||(r[l]={}),r=r[l];let o=r[s];r[s]=e,a&&this._saveState(),this._notifyChange(t,e,o)}update(t,e=!0){let a=[];for(let[i,s]of Object.entries(t)){let r=this.get(i);this.set(i,s,!1),a.push({path:i,value:s,oldValue:r})}e&&this._saveState();for(let i of a)this._notifyChange(i.path,i.value,i.oldValue)}_notifyChange(t,e,a){this.dispatchEvent(new CustomEvent(it,{detail:{path:t,value:e,oldValue:a}}));let i=this._subscribers.get(t)||[];for(let r of i)try{r(e,a,t)}catch(o){console.error("State subscriber error:",o)}let s=t.split(".");for(;s.length>1;){s.pop();let r=s.join("."),o=this._subscribers.get(r)||[];for(let l of o)try{l(this.get(r),null,r)}catch(p){console.error("State subscriber error:",p)}}}subscribe(t,e){return this._subscribers.has(t)||this._subscribers.set(t,[]),this._subscribers.get(t).push(e),()=>{let a=this._subscribers.get(t),i=a.indexOf(e);i>-1&&a.splice(i,1)}}reset(t=null){if(t){let e=t.split("."),a=at;for(let i of e)a=a?.[i];this.set(t,a)}else this._state={...at},this._saveState(),this.dispatchEvent(new CustomEvent(it,{detail:{path:null,value:this._state,oldValue:null}}))}addLocalTask(t){let e=this.get("localTasks")||[],a={id:`local-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,createdAt:new Date().toISOString(),status:"pending",...t};return this.set("localTasks",[...e,a]),a}updateLocalTask(t,e){let a=this.get("localTasks")||[],i=a.findIndex(r=>r.id===t);if(i===-1)return null;let s={...a[i],...e,updatedAt:new Date().toISOString()};return a[i]=s,this.set("localTasks",[...a]),s}deleteLocalTask(t){let e=this.get("localTasks")||[];this.set("localTasks",e.filter(a=>a.id!==t))}moveLocalTask(t,e,a=null){let s=(this.get("localTasks")||[]).find(r=>r.id===t);return s?this.updateLocalTask(t,{status:e,position:a??s.position}):null}updateSession(t){this.update(Object.fromEntries(Object.entries(t).map(([e,a])=>[`session.${e}`,a])),!1)}updateCache(t){this.update({"cache.projects":t.projects??this.get("cache.projects"),"cache.tasks":t.tasks??this.get("cache.tasks"),"cache.agents":t.agents??this.get("cache.agents"),"cache.memory":t.memory??this.get("cache.memory"),"cache.lastFetch":new Date().toISOString()},!1)}getMergedTasks(){let t=this.get("cache.tasks")||[],a=(this.get("localTasks")||[]).map(i=>({...i,isLocal:!0}));return[...t,...a]}getTasksByStatus(t){return this.getMergedTasks().filter(e=>e.status===t)}};f(k,"STORAGE_KEY","loki-dashboard-state"),f(k,"_instance",null);var z=k;function L(){return z.getInstance()}function ct(d){let t=L();return{get:()=>t.get(d),set:e=>t.set(d,e),subscribe:e=>t.subscribe(d,e)}}var B=class extends c{static get observedAttributes(){return["api-url","theme"]}constructor(){super(),this._data={status:"offline",phase:null,iteration:null,provider:null,running_agents:0,pending_tasks:null,uptime_seconds:0,complexity:null,connected:!1},this._api=null,this._pollInterval=null,this._statusUpdateHandler=null,this._connectedHandler=null,this._disconnectedHandler=null,this._checklistSummary=null,this._appRunnerStatus=null,this._playwrightResults=null,this._gateStatus=null}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadStatus(),this._startPolling()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling(),this._api&&(this._statusUpdateHandler&&this._api.removeEventListener(n.STATUS_UPDATE,this._statusUpdateHandler),this._connectedHandler&&this._api.removeEventListener(n.CONNECTED,this._connectedHandler),this._disconnectedHandler&&this._api.removeEventListener(n.DISCONNECTED,this._disconnectedHandler))}attributeChangedCallback(t,e,a){e!==a&&(t==="api-url"&&this._api&&(this._api.baseUrl=a,this._loadStatus()),t==="theme"&&this._applyTheme())}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t}),this._statusUpdateHandler=e=>this._updateFromStatus(e.detail),this._connectedHandler=()=>{this._data.connected=!0,this.render()},this._disconnectedHandler=()=>{this._data.connected=!1,this._data.status="offline",this.render()},this._api.addEventListener(n.STATUS_UPDATE,this._statusUpdateHandler),this._api.addEventListener(n.CONNECTED,this._connectedHandler),this._api.addEventListener(n.DISCONNECTED,this._disconnectedHandler)}async _loadStatus(){try{let[t,e,a,i,s]=await Promise.allSettled([this._api.getStatus(),this._api.getChecklistSummary(),this._api.getAppRunnerStatus(),this._api.getPlaywrightResults(),this._api.getCouncilGate()]);t.status==="fulfilled"?this._updateFromStatus(t.value):(this._data.connected=!1,this._data.status="offline"),e.status==="fulfilled"&&(this._checklistSummary=e.value?.summary||null),a.status==="fulfilled"&&(this._appRunnerStatus=a.value),i.status==="fulfilled"&&(this._playwrightResults=i.value),s.status==="fulfilled"&&(this._gateStatus=s.value),this.render()}catch{this._data.connected=!1,this._data.status="offline",this.render()}}_updateFromStatus(t){t&&(this._data={...this._data,connected:!0,status:t.status||"offline",phase:t.phase||null,iteration:t.iteration!=null?t.iteration:null,provider:t.provider||null,running_agents:t.running_agents||0,pending_tasks:t.pending_tasks!=null?t.pending_tasks:null,uptime_seconds:t.uptime_seconds||0,complexity:t.complexity||null})}_startPolling(){this._pollInterval=setInterval(async()=>{try{await this._loadStatus()}catch{this._data.connected=!1,this._data.status="offline",this.render()}},5e3)}_stopPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null)}_formatUptime(t){if(!t||t<0)return"--";let e=Math.floor(t/3600),a=Math.floor(t%3600/60),i=Math.floor(t%60);return e>0?`${e}h ${a}m`:a>0?`${a}m ${i}s`:`${i}s`}_getStatusDotClass(){switch(this._data.status){case"running":case"autonomous":return"active";case"paused":return"paused";case"stopped":return"stopped";case"error":return"error";default:return"offline"}}_escapeHtml(t){return t?String(t).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}_renderAppRunnerCard(){let t=this._appRunnerStatus;if(!t||t.status==="not_initialized")return`
|
|
1194
|
+
${B}
|
|
1195
|
+
`}getAriaPattern(t){return tt[t]||{}}applyAriaPattern(t,e){let a=this.getAriaPattern(e);for(let[i,s]of Object.entries(a))if(i==="role")t.setAttribute("role",s);else{let r=i.replace(/([A-Z])/g,"-$1").toLowerCase();t.setAttribute(r,s)}}render(){}};var C={realtime:1e3,normal:2e3,background:5e3,offline:1e4},nt={vscode:C.normal,browser:C.realtime,cli:C.background},lt={baseUrl:typeof window<"u"?window.location.origin:"http://localhost:57374",wsUrl:typeof window<"u"?`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`:"ws://localhost:57374/ws",pollInterval:2e3,timeout:1e4,retryAttempts:3,retryDelay:1e3},n={CONNECTED:"api:connected",DISCONNECTED:"api:disconnected",ERROR:"api:error",STATUS_UPDATE:"api:status-update",TASK_CREATED:"api:task-created",TASK_UPDATED:"api:task-updated",TASK_DELETED:"api:task-deleted",PROJECT_CREATED:"api:project-created",PROJECT_UPDATED:"api:project-updated",AGENT_UPDATE:"api:agent-update",LOG_MESSAGE:"api:log-message",MEMORY_UPDATE:"api:memory-update",CHECKLIST_UPDATE:"api:checklist-update"},x=class x extends EventTarget{static getInstance(t={}){let e=t.baseUrl||lt.baseUrl;return x._instances.has(e)||x._instances.set(e,new x(t)),x._instances.get(e)}static clearInstances(){x._instances.forEach(t=>t.disconnect()),x._instances.clear()}constructor(t={}){super(),this.config={...lt,...t},this._ws=null,this._connected=!1,this._pollInterval=null,this._reconnectTimeout=null,this._cache=new Map,this._cacheTimeout=5e3,this._vscodeApi=null,this._context=this._detectContext(),this._currentPollInterval=nt[this._context]||C.normal,this._visibilityChangeHandler=null,this._messageHandler=null,this._setupAdaptivePolling(),this._setupVSCodeBridge()}_detectContext(){return typeof acquireVsCodeApi<"u"?"vscode":typeof window<"u"&&window.location?"browser":"cli"}get context(){return this._context}static get POLL_INTERVALS(){return C}_setupAdaptivePolling(){typeof document>"u"||(this._visibilityChangeHandler=()=>{document.hidden?this._setPollInterval(C.background):this._setPollInterval(nt[this._context]||C.normal)},document.addEventListener("visibilitychange",this._visibilityChangeHandler))}_setPollInterval(t){this._currentPollInterval=t,this._pollInterval&&(this.stopPolling(),this.startPolling(null,t))}setPollMode(t){let e=C[t];e&&this._setPollInterval(e)}_setupVSCodeBridge(){if(!(typeof acquireVsCodeApi>"u")){try{this._vscodeApi=acquireVsCodeApi()}catch{console.warn("VS Code API already acquired or unavailable");return}this._messageHandler=t=>{let e=t.data;if(!(!e||!e.type))switch(e.type){case"updateStatus":this._emit(n.STATUS_UPDATE,e.data);break;case"updateTasks":this._emit(n.TASK_UPDATED,e.data);break;case"taskCreated":this._emit(n.TASK_CREATED,e.data);break;case"taskDeleted":this._emit(n.TASK_DELETED,e.data);break;case"projectCreated":this._emit(n.PROJECT_CREATED,e.data);break;case"projectUpdated":this._emit(n.PROJECT_UPDATED,e.data);break;case"agentUpdate":this._emit(n.AGENT_UPDATE,e.data);break;case"logMessage":this._emit(n.LOG_MESSAGE,e.data);break;case"memoryUpdate":this._emit(n.MEMORY_UPDATE,e.data);break;case"connected":this._connected=!0,this._emit(n.CONNECTED,e.data);break;case"disconnected":this._connected=!1,this._emit(n.DISCONNECTED,e.data);break;case"error":this._emit(n.ERROR,e.data);break;case"setPollMode":this.setPollMode(e.data.mode);break;default:this._emit(`api:${e.type}`,e.data)}},window.addEventListener("message",this._messageHandler)}}get isVSCode(){return this._context==="vscode"}postToVSCode(t,e={}){this._vscodeApi&&this._vscodeApi.postMessage({type:t,data:e})}requestRefresh(){this.postToVSCode("requestRefresh")}notifyVSCode(t,e={}){this.postToVSCode("userAction",{action:t,...e})}get baseUrl(){return this.config.baseUrl}set baseUrl(t){this.config.baseUrl=t,this.config.wsUrl=t.replace(/^http/,"ws")+"/ws"}get isConnected(){return this._connected}async connect(){if(!(this._ws&&this._ws.readyState===WebSocket.OPEN))return new Promise((t,e)=>{try{this._ws=new WebSocket(this.config.wsUrl),this._ws.onopen=()=>{this._connected=!0,this._emit(n.CONNECTED),t()},this._ws.onclose=()=>{this._connected=!1,this._emit(n.DISCONNECTED),this._scheduleReconnect()},this._ws.onerror=a=>{this._emit(n.ERROR,{error:a}),e(a)},this._ws.onmessage=a=>{try{let i=JSON.parse(a.data);this._handleMessage(i)}catch(i){console.error("Failed to parse WebSocket message:",i)}}}catch(a){e(a)}})}disconnect(){this._ws&&(this._ws.close(),this._ws=null),this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null),this._reconnectTimeout&&(clearTimeout(this._reconnectTimeout),this._reconnectTimeout=null),this._connected=!1,this._cleanupGlobalListeners()}_cleanupGlobalListeners(){this._visibilityChangeHandler&&typeof document<"u"&&(document.removeEventListener("visibilitychange",this._visibilityChangeHandler),this._visibilityChangeHandler=null),this._messageHandler&&typeof window<"u"&&(window.removeEventListener("message",this._messageHandler),this._messageHandler=null)}destroy(){this.disconnect()}_scheduleReconnect(){this._reconnectTimeout||(this._reconnectTimeout=setTimeout(()=>{this._reconnectTimeout=null,this.connect().catch(()=>{})},this.config.retryDelay))}_handleMessage(t){let a={connected:n.CONNECTED,status_update:n.STATUS_UPDATE,task_created:n.TASK_CREATED,task_updated:n.TASK_UPDATED,task_deleted:n.TASK_DELETED,task_moved:n.TASK_UPDATED,project_created:n.PROJECT_CREATED,project_updated:n.PROJECT_UPDATED,agent_update:n.AGENT_UPDATE,log:n.LOG_MESSAGE}[t.type]||`api:${t.type}`;this._emit(a,t.data)}_emit(t,e={}){this.dispatchEvent(new CustomEvent(t,{detail:e}))}async _request(t,e={}){let a=`${this.config.baseUrl}${t}`,i=new AbortController,s=setTimeout(()=>i.abort(),this.config.timeout);try{let r=await fetch(a,{...e,signal:i.signal,headers:{"Content-Type":"application/json",...e.headers}});if(clearTimeout(s),!r.ok){let o=await r.json().catch(()=>({detail:r.statusText}));throw new Error(o.detail||`HTTP ${r.status}`)}return r.status===204?null:await r.json()}catch(r){throw clearTimeout(s),r.name==="AbortError"?new Error("Request timeout"):r}}async _get(t,e=!1){if(e&&this._cache.has(t)){let i=this._cache.get(t);if(Date.now()-i.timestamp<this._cacheTimeout)return i.data}let a=await this._request(t);return e&&this._cache.set(t,{data:a,timestamp:Date.now()}),a}async _post(t,e){return this._request(t,{method:"POST",body:JSON.stringify(e)})}async _put(t,e){return this._request(t,{method:"PUT",body:JSON.stringify(e)})}async _delete(t){return this._request(t,{method:"DELETE"})}async getStatus(){return this._get("/api/status")}async healthCheck(){return this._get("/health")}async listProjects(t=null){let e=t?`?status=${t}`:"";return this._get(`/api/projects${e}`)}async getProject(t){return this._get(`/api/projects/${t}`)}async createProject(t){return this._post("/api/projects",t)}async updateProject(t,e){return this._put(`/api/projects/${t}`,e)}async deleteProject(t){return this._delete(`/api/projects/${t}`)}async listTasks(t={}){let e=new URLSearchParams;t.projectId&&e.append("project_id",t.projectId),t.status&&e.append("status",t.status),t.priority&&e.append("priority",t.priority);let a=e.toString()?`?${e}`:"";return this._get(`/api/tasks${a}`)}async getTask(t){return this._get(`/api/tasks/${t}`)}async createTask(t){return this._post("/api/tasks",t)}async updateTask(t,e){return this._put(`/api/tasks/${t}`,e)}async moveTask(t,e,a){return this._post(`/api/tasks/${t}/move`,{status:e,position:a})}async deleteTask(t){return this._delete(`/api/tasks/${t}`)}async getMemorySummary(){return this._get("/api/memory/summary",!0)}async getMemoryIndex(){return this._get("/api/memory/index",!0)}async getMemoryTimeline(){return this._get("/api/memory/timeline")}async listEpisodes(t={}){let e=new URLSearchParams(t).toString();return this._get(`/api/memory/episodes${e?"?"+e:""}`)}async getEpisode(t){return this._get(`/api/memory/episodes/${t}`)}async listPatterns(t={}){let e=new URLSearchParams(t).toString();return this._get(`/api/memory/patterns${e?"?"+e:""}`)}async getPattern(t){return this._get(`/api/memory/patterns/${t}`)}async listSkills(){return this._get("/api/memory/skills")}async getSkill(t){return this._get(`/api/memory/skills/${t}`)}async retrieveMemories(t,e=null,a=5){return this._post("/api/memory/retrieve",{query:t,taskType:e,topK:a})}async consolidateMemory(t=24){return this._post("/api/memory/consolidate",{sinceHours:t})}async getTokenEconomics(){return this._get("/api/memory/economics")}async listRegisteredProjects(t=!1){return this._get(`/api/registry/projects?include_inactive=${t}`)}async registerProject(t,e=null,a=null){return this._post("/api/registry/projects",{path:t,name:e,alias:a})}async discoverProjects(t=3){return this._get(`/api/registry/discover?max_depth=${t}`)}async syncRegistry(){return this._post("/api/registry/sync",{})}async getCrossProjectTasks(t=null){let e=t?`?project_ids=${t.join(",")}`:"";return this._get(`/api/registry/tasks${e}`)}async getLearningMetrics(t={}){let e=new URLSearchParams;t.timeRange&&e.append("timeRange",t.timeRange),t.signalType&&e.append("signalType",t.signalType),t.source&&e.append("source",t.source);let a=e.toString()?`?${e}`:"";return this._get(`/api/learning/metrics${a}`)}async getLearningTrends(t={}){let e=new URLSearchParams;t.timeRange&&e.append("timeRange",t.timeRange),t.signalType&&e.append("signalType",t.signalType),t.source&&e.append("source",t.source);let a=e.toString()?`?${e}`:"";return this._get(`/api/learning/trends${a}`)}async getLearningSignals(t={}){let e=new URLSearchParams;t.timeRange&&e.append("timeRange",t.timeRange),t.signalType&&e.append("signalType",t.signalType),t.source&&e.append("source",t.source),t.limit&&e.append("limit",String(t.limit)),t.offset&&e.append("offset",String(t.offset));let a=e.toString()?`?${e}`:"";return this._get(`/api/learning/signals${a}`)}async getLatestAggregation(){return this._get("/api/learning/aggregation")}async triggerAggregation(t={}){return this._post("/api/learning/aggregate",t)}async getAggregatedPreferences(t=20){return this._get(`/api/learning/preferences?limit=${t}`)}async getAggregatedErrors(t=20){return this._get(`/api/learning/errors?limit=${t}`)}async getAggregatedSuccessPatterns(t=20){return this._get(`/api/learning/success?limit=${t}`)}async getToolEfficiency(t=20){return this._get(`/api/learning/tools?limit=${t}`)}async getCost(){return this._get("/api/cost")}async getPricing(){return this._get("/api/pricing")}async getCouncilState(){return this._get("/api/council/state")}async getCouncilVerdicts(t=20){return this._get(`/api/council/verdicts?limit=${t}`)}async getCouncilConvergence(){return this._get("/api/council/convergence")}async getCouncilReport(){return this._get("/api/council/report")}async forceCouncilReview(){return this._post("/api/council/force-review",{})}async getContext(){return this._get("/api/context")}async getNotifications(t,e){let a=new URLSearchParams;t&&a.set("severity",t),e&&a.set("unread_only","true");let i=a.toString();return this._get("/api/notifications"+(i?"?"+i:""))}async getNotificationTriggers(){return this._get("/api/notifications/triggers")}async updateNotificationTriggers(t){return this._put("/api/notifications/triggers",{triggers:t})}async acknowledgeNotification(t){return this._post("/api/notifications/"+encodeURIComponent(t)+"/acknowledge",{})}async pauseSession(){return this._post("/api/control/pause",{})}async resumeSession(){return this._post("/api/control/resume",{})}async stopSession(){return this._post("/api/control/stop",{})}async getLogs(t=100){return this._get(`/api/logs?lines=${t}`)}async getChecklist(){return this._get("/api/checklist")}async getChecklistSummary(){return this._get("/api/checklist/summary")}async getPrdObservations(){let t=await fetch(`${this.baseUrl}/api/prd-observations`);if(!t.ok)throw new Error(`HTTP ${t.status}`);return t.text()}async getChecklistWaivers(){return this._get("/api/checklist/waivers")}async addChecklistWaiver(t,e,a="dashboard"){return this._post("/api/checklist/waivers",{item_id:t,reason:e,waived_by:a})}async removeChecklistWaiver(t){return this._delete(`/api/checklist/waivers/${encodeURIComponent(t)}`)}async getCouncilGate(){return this._get("/api/council/gate")}async getAppRunnerStatus(){return this._get("/api/app-runner/status")}async getAppRunnerLogs(t=100){return this._get(`/api/app-runner/logs?lines=${t}`)}async restartApp(){return this._post("/api/control/app-restart",{})}async stopApp(){return this._post("/api/control/app-stop",{})}async getPlaywrightResults(){return this._get("/api/playwright/results")}async getPlaywrightScreenshot(){return this._get("/api/playwright/screenshot")}startPolling(t,e=null){if(this._pollInterval)return;this._pollCallback=t;let a=async()=>{try{let s=await this.getStatus();this._connected=!0,this._pollCallback&&this._pollCallback(s),this._emit(n.STATUS_UPDATE,s),this._vscodeApi&&this.postToVSCode("pollSuccess",{timestamp:Date.now()})}catch(s){this._connected=!1,this._emit(n.ERROR,{error:s}),this._vscodeApi&&this.postToVSCode("pollError",{error:s.message})}};a();let i=e||this._currentPollInterval||this.config.pollInterval;this._pollInterval=setInterval(a,i)}stopPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null)}};k(x,"_instances",new Map);var I=x;function dt(d={}){return new I(d)}function u(d={}){return I.getInstance(d)}var it="loki-state-change",at={ui:{theme:"light",sidebarCollapsed:!1,activeSection:"kanban",terminalAutoScroll:!0},session:{connected:!1,lastSync:null,mode:"offline",phase:null,iteration:null},localTasks:[],cache:{projects:[],tasks:[],agents:[],memory:null,lastFetch:null},preferences:{pollInterval:2e3,notifications:!0,soundEnabled:!1}},f=class f extends EventTarget{static getInstance(){return f._instance||(f._instance=new f),f._instance}constructor(){super(),this._state=this._loadState(),this._subscribers=new Map,this._batchUpdates=[],this._batchTimeout=null}_loadState(){try{let t=localStorage.getItem(f.STORAGE_KEY);if(t){let e=JSON.parse(t);return this._mergeState(at,e)}}catch(t){console.warn("Failed to load state from localStorage:",t)}return{...at}}_mergeState(t,e){let a={...t};for(let i of Object.keys(e))i in t&&typeof t[i]=="object"&&!Array.isArray(t[i])?a[i]=this._mergeState(t[i],e[i]):a[i]=e[i];return a}_saveState(){try{let t={ui:this._state.ui,localTasks:this._state.localTasks,preferences:this._state.preferences};localStorage.setItem(f.STORAGE_KEY,JSON.stringify(t))}catch(t){console.warn("Failed to save state to localStorage:",t)}}get(t=null){if(!t)return{...this._state};let e=t.split("."),a=this._state;for(let i of e){if(a==null)return;a=a[i]}return a}set(t,e,a=!0){let i=t.split("."),s=i.pop(),r=this._state;for(let l of i)l in r||(r[l]={}),r=r[l];let o=r[s];r[s]=e,a&&this._saveState(),this._notifyChange(t,e,o)}update(t,e=!0){let a=[];for(let[i,s]of Object.entries(t)){let r=this.get(i);this.set(i,s,!1),a.push({path:i,value:s,oldValue:r})}e&&this._saveState();for(let i of a)this._notifyChange(i.path,i.value,i.oldValue)}_notifyChange(t,e,a){this.dispatchEvent(new CustomEvent(it,{detail:{path:t,value:e,oldValue:a}}));let i=this._subscribers.get(t)||[];for(let r of i)try{r(e,a,t)}catch(o){console.error("State subscriber error:",o)}let s=t.split(".");for(;s.length>1;){s.pop();let r=s.join("."),o=this._subscribers.get(r)||[];for(let l of o)try{l(this.get(r),null,r)}catch(p){console.error("State subscriber error:",p)}}}subscribe(t,e){return this._subscribers.has(t)||this._subscribers.set(t,[]),this._subscribers.get(t).push(e),()=>{let a=this._subscribers.get(t),i=a.indexOf(e);i>-1&&a.splice(i,1)}}reset(t=null){if(t){let e=t.split("."),a=at;for(let i of e)a=a?.[i];this.set(t,a)}else this._state={...at},this._saveState(),this.dispatchEvent(new CustomEvent(it,{detail:{path:null,value:this._state,oldValue:null}}))}addLocalTask(t){let e=this.get("localTasks")||[],a={id:`local-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,createdAt:new Date().toISOString(),status:"pending",...t};return this.set("localTasks",[...e,a]),a}updateLocalTask(t,e){let a=this.get("localTasks")||[],i=a.findIndex(r=>r.id===t);if(i===-1)return null;let s={...a[i],...e,updatedAt:new Date().toISOString()};return a[i]=s,this.set("localTasks",[...a]),s}deleteLocalTask(t){let e=this.get("localTasks")||[];this.set("localTasks",e.filter(a=>a.id!==t))}moveLocalTask(t,e,a=null){let s=(this.get("localTasks")||[]).find(r=>r.id===t);return s?this.updateLocalTask(t,{status:e,position:a??s.position}):null}updateSession(t){this.update(Object.fromEntries(Object.entries(t).map(([e,a])=>[`session.${e}`,a])),!1)}updateCache(t){this.update({"cache.projects":t.projects??this.get("cache.projects"),"cache.tasks":t.tasks??this.get("cache.tasks"),"cache.agents":t.agents??this.get("cache.agents"),"cache.memory":t.memory??this.get("cache.memory"),"cache.lastFetch":new Date().toISOString()},!1)}getMergedTasks(){let t=this.get("cache.tasks")||[],a=(this.get("localTasks")||[]).map(i=>({...i,isLocal:!0}));return[...t,...a]}getTasksByStatus(t){return this.getMergedTasks().filter(e=>e.status===t)}};k(f,"STORAGE_KEY","loki-dashboard-state"),k(f,"_instance",null);var M=f;function L(){return M.getInstance()}function ct(d){let t=L();return{get:()=>t.get(d),set:e=>t.set(d,e),subscribe:e=>t.subscribe(d,e)}}var F=class extends c{static get observedAttributes(){return["api-url","theme"]}constructor(){super(),this._data={status:"offline",phase:null,iteration:null,provider:null,running_agents:0,pending_tasks:null,uptime_seconds:0,complexity:null,connected:!1},this._api=null,this._pollInterval=null,this._statusUpdateHandler=null,this._connectedHandler=null,this._disconnectedHandler=null,this._checklistSummary=null,this._appRunnerStatus=null,this._playwrightResults=null,this._gateStatus=null}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadStatus(),this._startPolling()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling(),this._api&&(this._statusUpdateHandler&&this._api.removeEventListener(n.STATUS_UPDATE,this._statusUpdateHandler),this._connectedHandler&&this._api.removeEventListener(n.CONNECTED,this._connectedHandler),this._disconnectedHandler&&this._api.removeEventListener(n.DISCONNECTED,this._disconnectedHandler))}attributeChangedCallback(t,e,a){e!==a&&(t==="api-url"&&this._api&&(this._api.baseUrl=a,this._loadStatus()),t==="theme"&&this._applyTheme())}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t}),this._statusUpdateHandler=e=>this._updateFromStatus(e.detail),this._connectedHandler=()=>{this._data.connected=!0,this.render()},this._disconnectedHandler=()=>{this._data.connected=!1,this._data.status="offline",this.render()},this._api.addEventListener(n.STATUS_UPDATE,this._statusUpdateHandler),this._api.addEventListener(n.CONNECTED,this._connectedHandler),this._api.addEventListener(n.DISCONNECTED,this._disconnectedHandler)}async _loadStatus(){try{let[t,e,a,i,s]=await Promise.allSettled([this._api.getStatus(),this._api.getChecklistSummary(),this._api.getAppRunnerStatus(),this._api.getPlaywrightResults(),this._api.getCouncilGate()]);t.status==="fulfilled"?this._updateFromStatus(t.value):(this._data.connected=!1,this._data.status="offline"),e.status==="fulfilled"&&(this._checklistSummary=e.value?.summary||null),a.status==="fulfilled"&&(this._appRunnerStatus=a.value),i.status==="fulfilled"&&(this._playwrightResults=i.value),s.status==="fulfilled"&&(this._gateStatus=s.value),this.render()}catch{this._data.connected=!1,this._data.status="offline",this.render()}}_updateFromStatus(t){t&&(this._data={...this._data,connected:!0,status:t.status||"offline",phase:t.phase||null,iteration:t.iteration!=null?t.iteration:null,provider:t.provider||null,running_agents:t.running_agents||0,pending_tasks:t.pending_tasks!=null?t.pending_tasks:null,uptime_seconds:t.uptime_seconds||0,complexity:t.complexity||null})}_startPolling(){this._pollInterval=setInterval(async()=>{try{await this._loadStatus()}catch{this._data.connected=!1,this._data.status="offline",this.render()}},5e3)}_stopPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null)}_formatUptime(t){if(!t||t<0)return"--";let e=Math.floor(t/3600),a=Math.floor(t%3600/60),i=Math.floor(t%60);return e>0?`${e}h ${a}m`:a>0?`${a}m ${i}s`:`${i}s`}_getStatusDotClass(){switch(this._data.status){case"running":case"autonomous":return"active";case"paused":return"paused";case"stopped":return"stopped";case"error":return"error";default:return"offline"}}_escapeHtml(t){return t?String(t).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}_renderAppRunnerCard(){let t=this._appRunnerStatus;if(!t||t.status==="not_initialized")return`
|
|
1170
1196
|
<div class="overview-card">
|
|
1171
1197
|
<div class="card-label">App Runner</div>
|
|
1172
1198
|
<div class="card-value small-text">--</div>
|
|
@@ -1244,7 +1270,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1244
1270
|
.overview-container {
|
|
1245
1271
|
background: var(--loki-bg-card);
|
|
1246
1272
|
border: 1px solid var(--loki-border);
|
|
1247
|
-
border-radius:
|
|
1273
|
+
border-radius: 5px;
|
|
1248
1274
|
padding: 16px;
|
|
1249
1275
|
transition: all var(--loki-transition);
|
|
1250
1276
|
}
|
|
@@ -1267,7 +1293,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1267
1293
|
font-size: 12px;
|
|
1268
1294
|
font-weight: 600;
|
|
1269
1295
|
text-transform: uppercase;
|
|
1270
|
-
letter-spacing: 0.
|
|
1296
|
+
letter-spacing: 0.05em;
|
|
1271
1297
|
color: var(--loki-text-muted);
|
|
1272
1298
|
}
|
|
1273
1299
|
|
|
@@ -1278,8 +1304,9 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1278
1304
|
}
|
|
1279
1305
|
|
|
1280
1306
|
.overview-card {
|
|
1281
|
-
background: var(--loki-bg-
|
|
1282
|
-
border
|
|
1307
|
+
background: var(--loki-bg-secondary);
|
|
1308
|
+
border: 1px solid var(--loki-border);
|
|
1309
|
+
border-radius: 5px;
|
|
1283
1310
|
padding: 12px 14px;
|
|
1284
1311
|
transition: background var(--loki-transition);
|
|
1285
1312
|
}
|
|
@@ -1292,7 +1319,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1292
1319
|
font-size: 10px;
|
|
1293
1320
|
font-weight: 600;
|
|
1294
1321
|
text-transform: uppercase;
|
|
1295
|
-
letter-spacing: 0.
|
|
1322
|
+
letter-spacing: 0.05em;
|
|
1296
1323
|
color: var(--loki-text-muted);
|
|
1297
1324
|
margin-bottom: 6px;
|
|
1298
1325
|
}
|
|
@@ -1301,7 +1328,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1301
1328
|
font-size: 18px;
|
|
1302
1329
|
font-weight: 600;
|
|
1303
1330
|
font-family: 'JetBrains Mono', monospace;
|
|
1304
|
-
color: var(--loki-
|
|
1331
|
+
color: var(--loki-accent);
|
|
1305
1332
|
display: flex;
|
|
1306
1333
|
align-items: center;
|
|
1307
1334
|
gap: 8px;
|
|
@@ -1313,9 +1340,9 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1313
1340
|
}
|
|
1314
1341
|
|
|
1315
1342
|
.status-dot {
|
|
1316
|
-
width:
|
|
1317
|
-
height:
|
|
1318
|
-
border-radius:
|
|
1343
|
+
width: 12px;
|
|
1344
|
+
height: 6px;
|
|
1345
|
+
border-radius: 2px;
|
|
1319
1346
|
flex-shrink: 0;
|
|
1320
1347
|
}
|
|
1321
1348
|
|
|
@@ -1408,7 +1435,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1408
1435
|
</div>
|
|
1409
1436
|
</div>
|
|
1410
1437
|
</div>
|
|
1411
|
-
`}};customElements.get("loki-overview")||customElements.define("loki-overview",
|
|
1438
|
+
`}};customElements.get("loki-overview")||customElements.define("loki-overview",F);var xt=[{id:"pending",label:"Pending",status:"pending",color:"var(--loki-text-muted)"},{id:"in_progress",label:"In Progress",status:"in_progress",color:"var(--loki-blue)"},{id:"review",label:"In Review",status:"review",color:"var(--loki-purple)"},{id:"done",label:"Completed",status:"done",color:"var(--loki-green)"}];var z=class extends c{static get observedAttributes(){return["api-url","project-id","theme","readonly"]}constructor(){super(),this._tasks=[],this._loading=!0,this._error=null,this._draggedTask=null,this._api=null,this._state=L()}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadTasks()}disconnectedCallback(){super.disconnectedCallback(),this._api&&(this._api.removeEventListener(n.TASK_CREATED,this._onTaskEvent),this._api.removeEventListener(n.TASK_UPDATED,this._onTaskEvent),this._api.removeEventListener(n.TASK_DELETED,this._onTaskEvent))}attributeChangedCallback(t,e,a){e!==a&&(t==="api-url"&&this._api&&(this._api.baseUrl=a,this._loadTasks()),t==="project-id"&&this._loadTasks(),t==="theme"&&this._applyTheme())}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t}),this._onTaskEvent&&(this._api.removeEventListener(n.TASK_CREATED,this._onTaskEvent),this._api.removeEventListener(n.TASK_UPDATED,this._onTaskEvent),this._api.removeEventListener(n.TASK_DELETED,this._onTaskEvent)),this._onTaskEvent=()=>this._loadTasks(),this._api.addEventListener(n.TASK_CREATED,this._onTaskEvent),this._api.addEventListener(n.TASK_UPDATED,this._onTaskEvent),this._api.addEventListener(n.TASK_DELETED,this._onTaskEvent)}async _loadTasks(){this._loading=!0,this._error=null,this.render();try{let t=this.getAttribute("project-id"),e=t?{projectId:parseInt(t)}:{};this._tasks=await this._api.listTasks(e);let a=this._state.get("localTasks")||[];a.length>0&&(this._tasks=[...this._tasks,...a.map(i=>({...i,isLocal:!0}))]),this._state.update({"cache.tasks":this._tasks},!1)}catch(t){this._error=t.message,this._tasks=(this._state.get("localTasks")||[]).map(e=>({...e,isLocal:!0}))}this._loading=!1,this.render()}_getTasksByStatus(t){return this._tasks.filter(e=>e.status?.toLowerCase().replace(/-/g,"_")===t)}_handleDragStart(t,e){this.hasAttribute("readonly")||(this._draggedTask=e,t.target.classList.add("dragging"),t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e.id.toString()))}_handleDragEnd(t){t.target.classList.remove("dragging"),this._draggedTask=null,this.shadowRoot.querySelectorAll(".kanban-tasks").forEach(e=>{e.classList.remove("drag-over")})}_handleDragOver(t){t.preventDefault(),t.dataTransfer.dropEffect="move"}_handleDragEnter(t){t.preventDefault(),t.currentTarget.classList.add("drag-over")}_handleDragLeave(t){t.currentTarget.contains(t.relatedTarget)||t.currentTarget.classList.remove("drag-over")}async _handleDrop(t,e){if(t.preventDefault(),t.currentTarget.classList.remove("drag-over"),!this._draggedTask||this.hasAttribute("readonly"))return;let a=this._draggedTask.id,i=this._tasks.find(r=>r.id===a);if(!i)return;let s=i.status;if(s!==e){i.status=e,this.render();try{i.isLocal?this._state.moveLocalTask(a,e):await this._api.moveTask(a,e,0),this.dispatchEvent(new CustomEvent("task-moved",{detail:{taskId:a,oldStatus:s,newStatus:e}}))}catch(r){i.status=s,this.render(),console.error("Failed to move task:",r)}}}_openAddTaskModal(t="pending"){this.dispatchEvent(new CustomEvent("add-task",{detail:{status:t}}))}_openTaskDetail(t){this.dispatchEvent(new CustomEvent("task-click",{detail:{task:t}}))}render(){let t=`
|
|
1412
1439
|
<style>
|
|
1413
1440
|
${this.getBaseStyles()}
|
|
1414
1441
|
|
|
@@ -1465,7 +1492,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1465
1492
|
|
|
1466
1493
|
.kanban-column {
|
|
1467
1494
|
background: var(--loki-bg-secondary);
|
|
1468
|
-
border-radius:
|
|
1495
|
+
border-radius: 5px;
|
|
1469
1496
|
padding: 12px;
|
|
1470
1497
|
display: flex;
|
|
1471
1498
|
flex-direction: column;
|
|
@@ -1498,7 +1525,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1498
1525
|
.kanban-column-count {
|
|
1499
1526
|
background: var(--loki-bg-tertiary);
|
|
1500
1527
|
padding: 2px 8px;
|
|
1501
|
-
border-radius:
|
|
1528
|
+
border-radius: 5px;
|
|
1502
1529
|
font-size: 11px;
|
|
1503
1530
|
font-weight: 600;
|
|
1504
1531
|
font-family: 'JetBrains Mono', monospace;
|
|
@@ -1512,7 +1539,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1512
1539
|
gap: 8px;
|
|
1513
1540
|
min-height: 80px;
|
|
1514
1541
|
transition: background var(--loki-transition);
|
|
1515
|
-
border-radius:
|
|
1542
|
+
border-radius: 4px;
|
|
1516
1543
|
padding: 4px;
|
|
1517
1544
|
}
|
|
1518
1545
|
|
|
@@ -1523,7 +1550,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1523
1550
|
.task-card {
|
|
1524
1551
|
background: var(--loki-bg-card);
|
|
1525
1552
|
border: 1px solid var(--loki-border);
|
|
1526
|
-
border-radius:
|
|
1553
|
+
border-radius: 4px;
|
|
1527
1554
|
padding: 10px;
|
|
1528
1555
|
cursor: pointer;
|
|
1529
1556
|
transition: all var(--loki-transition);
|
|
@@ -1610,7 +1637,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1610
1637
|
.add-task-btn {
|
|
1611
1638
|
background: transparent;
|
|
1612
1639
|
border: 1px dashed var(--loki-border);
|
|
1613
|
-
border-radius:
|
|
1640
|
+
border-radius: 4px;
|
|
1614
1641
|
padding: 10px;
|
|
1615
1642
|
color: var(--loki-text-muted);
|
|
1616
1643
|
font-size: 12px;
|
|
@@ -1703,7 +1730,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1703
1730
|
</div>
|
|
1704
1731
|
${a}
|
|
1705
1732
|
</div>
|
|
1706
|
-
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.getElementById("refresh-btn");t&&t.addEventListener("click",()=>this._loadTasks()),this.shadowRoot.querySelectorAll(".add-task-btn").forEach(e=>{e.addEventListener("click",()=>{this._openAddTaskModal(e.dataset.status)})}),this.shadowRoot.querySelectorAll(".task-card").forEach(e=>{let a=e.dataset.taskId,i=this._tasks.find(s=>s.id.toString()===a);i&&(e.addEventListener("click",()=>this._openTaskDetail(i)),e.addEventListener("keydown",s=>{s.key==="Enter"||s.key===" "?(s.preventDefault(),this._openTaskDetail(i)):(s.key==="ArrowDown"||s.key==="ArrowUp")&&(s.preventDefault(),this._navigateTaskCards(e,s.key==="ArrowDown"?"next":"prev"))}),e.classList.contains("draggable")&&(e.addEventListener("dragstart",s=>this._handleDragStart(s,i)),e.addEventListener("dragend",s=>this._handleDragEnd(s))))}),this.shadowRoot.querySelectorAll(".kanban-tasks").forEach(e=>{e.addEventListener("dragover",a=>this._handleDragOver(a)),e.addEventListener("dragenter",a=>this._handleDragEnter(a)),e.addEventListener("dragleave",a=>this._handleDragLeave(a)),e.addEventListener("drop",a=>this._handleDrop(a,e.dataset.status))})}_escapeHtml(t){let e=document.createElement("div");return e.textContent=t,e.innerHTML}_navigateTaskCards(t,e){let a=Array.from(this.shadowRoot.querySelectorAll(".task-card")),i=a.indexOf(t);if(i===-1)return;let s=e==="next"?i+1:i-1;s>=0&&s<a.length&&a[s].focus()}};customElements.get("loki-task-board")||customElements.define("loki-task-board",
|
|
1733
|
+
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.getElementById("refresh-btn");t&&t.addEventListener("click",()=>this._loadTasks()),this.shadowRoot.querySelectorAll(".add-task-btn").forEach(e=>{e.addEventListener("click",()=>{this._openAddTaskModal(e.dataset.status)})}),this.shadowRoot.querySelectorAll(".task-card").forEach(e=>{let a=e.dataset.taskId,i=this._tasks.find(s=>s.id.toString()===a);i&&(e.addEventListener("click",()=>this._openTaskDetail(i)),e.addEventListener("keydown",s=>{s.key==="Enter"||s.key===" "?(s.preventDefault(),this._openTaskDetail(i)):(s.key==="ArrowDown"||s.key==="ArrowUp")&&(s.preventDefault(),this._navigateTaskCards(e,s.key==="ArrowDown"?"next":"prev"))}),e.classList.contains("draggable")&&(e.addEventListener("dragstart",s=>this._handleDragStart(s,i)),e.addEventListener("dragend",s=>this._handleDragEnd(s))))}),this.shadowRoot.querySelectorAll(".kanban-tasks").forEach(e=>{e.addEventListener("dragover",a=>this._handleDragOver(a)),e.addEventListener("dragenter",a=>this._handleDragEnter(a)),e.addEventListener("dragleave",a=>this._handleDragLeave(a)),e.addEventListener("drop",a=>this._handleDrop(a,e.dataset.status))})}_escapeHtml(t){let e=document.createElement("div");return e.textContent=t,e.innerHTML}_navigateTaskCards(t,e){let a=Array.from(this.shadowRoot.querySelectorAll(".task-card")),i=a.indexOf(t);if(i===-1)return;let s=e==="next"?i+1:i-1;s>=0&&s<a.length&&a[s].focus()}};customElements.get("loki-task-board")||customElements.define("loki-task-board",z);var U=class extends c{static get observedAttributes(){return["api-url","theme","compact"]}constructor(){super(),this._status={mode:"offline",phase:null,iteration:null,complexity:null,connected:!1,version:null,uptime:0,activeAgents:0,pendingTasks:0},this._api=null,this._state=L(),this._statusUpdateHandler=null,this._connectedHandler=null,this._disconnectedHandler=null}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadStatus(),this._startPolling()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling(),this._api&&(this._statusUpdateHandler&&this._api.removeEventListener(n.STATUS_UPDATE,this._statusUpdateHandler),this._connectedHandler&&this._api.removeEventListener(n.CONNECTED,this._connectedHandler),this._disconnectedHandler&&this._api.removeEventListener(n.DISCONNECTED,this._disconnectedHandler))}attributeChangedCallback(t,e,a){e!==a&&(t==="api-url"&&this._api&&(this._api.baseUrl=a,this._loadStatus()),t==="theme"&&this._applyTheme(),t==="compact"&&this.render())}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t}),this._statusUpdateHandler=e=>this._updateFromStatus(e.detail),this._connectedHandler=()=>{this._status.connected=!0,this.render()},this._disconnectedHandler=()=>{this._status.connected=!1,this._status.mode="offline",this.render()},this._api.addEventListener(n.STATUS_UPDATE,this._statusUpdateHandler),this._api.addEventListener(n.CONNECTED,this._connectedHandler),this._api.addEventListener(n.DISCONNECTED,this._disconnectedHandler)}async _loadStatus(){try{let t=await this._api.getStatus();this._updateFromStatus(t)}catch{this._status.connected=!1,this._status.mode="offline",this.render()}}_updateFromStatus(t){t&&(this._status={...this._status,connected:!0,mode:t.status||"running",version:t.version,uptime:t.uptime_seconds||0,activeAgents:t.running_agents||0,pendingTasks:t.pending_tasks||0,phase:t.phase,iteration:t.iteration,complexity:t.complexity},this._state.updateSession({connected:!0,mode:this._status.mode,lastSync:new Date().toISOString()}),this.render())}_startPolling(){this._ownPollInterval=setInterval(async()=>{try{let t=await this._api.getStatus();this._updateFromStatus(t)}catch{this._status.connected=!1,this._status.mode="offline",this.render()}},3e3)}_stopPolling(){this._ownPollInterval&&(clearInterval(this._ownPollInterval),this._ownPollInterval=null)}_formatUptime(t){if(!t||t<0)return"--";let e=Math.floor(t/3600),a=Math.floor(t%3600/60),i=Math.floor(t%60);return e>0?`${e}h ${a}m`:a>0?`${a}m ${i}s`:`${i}s`}_getStatusClass(){switch(this._status.mode){case"running":case"autonomous":return"active";case"paused":return"paused";case"stopped":return"stopped";case"error":return"error";default:return"offline"}}_getStatusLabel(){switch(this._status.mode){case"running":case"autonomous":return"AUTONOMOUS";case"paused":return"PAUSED";case"stopped":return"STOPPED";case"error":return"ERROR";default:return"OFFLINE"}}_triggerStart(){this.dispatchEvent(new CustomEvent("session-start",{detail:this._status}))}async _triggerPause(){try{await this._api.pauseSession(),this._status.mode="paused",this.render()}catch(t){console.error("Failed to pause session:",t)}this.dispatchEvent(new CustomEvent("session-pause",{detail:this._status}))}async _triggerResume(){try{await this._api.resumeSession(),this._status.mode="running",this.render()}catch(t){console.error("Failed to resume session:",t)}this.dispatchEvent(new CustomEvent("session-resume",{detail:this._status}))}async _triggerStop(){try{await this._api.stopSession(),this._status.mode="stopped",this.render()}catch(t){console.error("Failed to stop session:",t)}this.dispatchEvent(new CustomEvent("session-stop",{detail:this._status}))}render(){let t=this.hasAttribute("compact"),e=this._getStatusClass(),a=this._getStatusLabel(),i=["running","autonomous"].includes(this._status.mode),s=this._status.mode==="paused",r=`
|
|
1707
1734
|
<style>
|
|
1708
1735
|
${this.getBaseStyles()}
|
|
1709
1736
|
|
|
@@ -1713,7 +1740,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1713
1740
|
|
|
1714
1741
|
.control-panel {
|
|
1715
1742
|
background: var(--loki-bg-tertiary);
|
|
1716
|
-
border-radius:
|
|
1743
|
+
border-radius: 5px;
|
|
1717
1744
|
padding: 14px;
|
|
1718
1745
|
display: flex;
|
|
1719
1746
|
flex-direction: column;
|
|
@@ -1730,7 +1757,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1730
1757
|
font-size: 10px;
|
|
1731
1758
|
font-weight: 600;
|
|
1732
1759
|
text-transform: uppercase;
|
|
1733
|
-
letter-spacing: 0.
|
|
1760
|
+
letter-spacing: 0.05em;
|
|
1734
1761
|
color: var(--loki-text-muted);
|
|
1735
1762
|
margin-bottom: 4px;
|
|
1736
1763
|
}
|
|
@@ -1755,9 +1782,9 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1755
1782
|
}
|
|
1756
1783
|
|
|
1757
1784
|
.status-dot {
|
|
1758
|
-
width:
|
|
1759
|
-
height:
|
|
1760
|
-
border-radius:
|
|
1785
|
+
width: 12px;
|
|
1786
|
+
height: 6px;
|
|
1787
|
+
border-radius: 2px;
|
|
1761
1788
|
}
|
|
1762
1789
|
|
|
1763
1790
|
.status-dot.active {
|
|
@@ -1784,7 +1811,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1784
1811
|
.control-btn {
|
|
1785
1812
|
flex: 1;
|
|
1786
1813
|
padding: 6px 10px;
|
|
1787
|
-
border-radius:
|
|
1814
|
+
border-radius: 4px;
|
|
1788
1815
|
border: 1px solid var(--loki-border);
|
|
1789
1816
|
background: var(--loki-bg-card);
|
|
1790
1817
|
color: var(--loki-text-secondary);
|
|
@@ -1844,16 +1871,16 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1844
1871
|
gap: 6px;
|
|
1845
1872
|
padding: 6px 12px;
|
|
1846
1873
|
background: var(--loki-bg-tertiary);
|
|
1847
|
-
border-radius:
|
|
1874
|
+
border-radius: 4px;
|
|
1848
1875
|
font-size: 11px;
|
|
1849
1876
|
color: var(--loki-text-muted);
|
|
1850
1877
|
margin-top: 4px;
|
|
1851
1878
|
}
|
|
1852
1879
|
|
|
1853
1880
|
.connection-dot {
|
|
1854
|
-
width:
|
|
1855
|
-
height:
|
|
1856
|
-
border-radius:
|
|
1881
|
+
width: 10px;
|
|
1882
|
+
height: 5px;
|
|
1883
|
+
border-radius: 2px;
|
|
1857
1884
|
background: var(--loki-red);
|
|
1858
1885
|
}
|
|
1859
1886
|
|
|
@@ -1878,7 +1905,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1878
1905
|
font-size: 16px;
|
|
1879
1906
|
font-weight: 600;
|
|
1880
1907
|
font-family: 'JetBrains Mono', monospace;
|
|
1881
|
-
color: var(--loki-
|
|
1908
|
+
color: var(--loki-accent);
|
|
1882
1909
|
}
|
|
1883
1910
|
|
|
1884
1911
|
.stat-label {
|
|
@@ -1982,7 +2009,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1982
2009
|
`;this.shadowRoot.innerHTML=`
|
|
1983
2010
|
${r}
|
|
1984
2011
|
${t?o:l}
|
|
1985
|
-
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.getElementById("pause-btn"),e=this.shadowRoot.getElementById("resume-btn"),a=this.shadowRoot.getElementById("stop-btn"),i=this.shadowRoot.getElementById("start-btn");t&&t.addEventListener("click",()=>this._triggerPause()),e&&e.addEventListener("click",()=>this._triggerResume()),a&&a.addEventListener("click",()=>this._triggerStop()),i&&i.addEventListener("click",()=>this._triggerStart())}};customElements.get("loki-session-control")||customElements.define("loki-session-control",
|
|
2012
|
+
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.getElementById("pause-btn"),e=this.shadowRoot.getElementById("resume-btn"),a=this.shadowRoot.getElementById("stop-btn"),i=this.shadowRoot.getElementById("start-btn");t&&t.addEventListener("click",()=>this._triggerPause()),e&&e.addEventListener("click",()=>this._triggerResume()),a&&a.addEventListener("click",()=>this._triggerStop()),i&&i.addEventListener("click",()=>this._triggerStart())}};customElements.get("loki-session-control")||customElements.define("loki-session-control",U);var pt={info:{color:"var(--loki-blue)",label:"INFO"},success:{color:"var(--loki-green)",label:"SUCCESS"},warning:{color:"var(--loki-yellow)",label:"WARN"},error:{color:"var(--loki-red)",label:"ERROR"},step:{color:"var(--loki-purple)",label:"STEP"},agent:{color:"var(--loki-accent)",label:"AGENT"},debug:{color:"var(--loki-text-muted)",label:"DEBUG"}},j=class extends c{static get observedAttributes(){return["api-url","max-lines","auto-scroll","theme","log-file"]}constructor(){super(),this._logs=[],this._maxLines=500,this._autoScroll=!0,this._filter="",this._levelFilter="all",this._api=null,this._pollInterval=null,this._logMessageHandler=null}connectedCallback(){super.connectedCallback(),this._maxLines=parseInt(this.getAttribute("max-lines"))||500,this._autoScroll=this.hasAttribute("auto-scroll"),this._setupApi(),this._startLogPolling()}disconnectedCallback(){super.disconnectedCallback(),this._stopLogPolling(),this._api&&this._logMessageHandler&&this._api.removeEventListener(n.LOG_MESSAGE,this._logMessageHandler)}attributeChangedCallback(t,e,a){if(e!==a)switch(t){case"api-url":this._api&&(this._api.baseUrl=a);break;case"max-lines":this._maxLines=parseInt(a)||500,this._trimLogs(),this.render();break;case"auto-scroll":this._autoScroll=this.hasAttribute("auto-scroll"),this.render();break;case"theme":this._applyTheme();break}}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t}),this._logMessageHandler=e=>this._addLog(e.detail),this._api.addEventListener(n.LOG_MESSAGE,this._logMessageHandler)}_startLogPolling(){let t=this.getAttribute("log-file");t?this._pollLogFile(t):this._pollApiLogs()}async _pollApiLogs(){let t=0,e=async()=>{try{let a=await this._api.getLogs(200);if(Array.isArray(a)&&a.length>t){let i=a.slice(t);for(let s of i)s.message&&s.message.trim()&&this._addLog({message:s.message,level:s.level||"info",timestamp:s.timestamp||new Date().toLocaleTimeString()});t=a.length}}catch{}};e(),this._apiPollInterval=setInterval(e,2e3)}async _pollLogFile(t){let e=0,a=async()=>{try{let i=await fetch(`${t}?t=${Date.now()}`);if(!i.ok)return;let r=(await i.text()).split(`
|
|
1986
2013
|
`);if(r.length>e){let o=r.slice(e);for(let l of o)l.trim()&&this._addLog(this._parseLine(l));e=r.length}}catch{}};a(),this._pollInterval=setInterval(a,1e3)}_stopLogPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null),this._apiPollInterval&&(clearInterval(this._apiPollInterval),this._apiPollInterval=null)}_parseLine(t){let e=t.match(/^\[([^\]]+)\]\s*\[([^\]]+)\]\s*(.+)$/);if(e)return{timestamp:e[1],level:e[2].toLowerCase(),message:e[3]};let a=t.match(/^(\d{2}:\d{2}:\d{2})\s+(\w+)\s+(.+)$/);return a?{timestamp:a[1],level:a[2].toLowerCase(),message:a[3]}:{timestamp:new Date().toLocaleTimeString(),level:"info",message:t}}_addLog(t){if(!t)return;let e={id:Date.now()+Math.random(),timestamp:t.timestamp||new Date().toLocaleTimeString(),level:(t.level||"info").toLowerCase(),message:t.message||t};this._logs.push(e),this._trimLogs(),this.dispatchEvent(new CustomEvent("log-received",{detail:e})),this._renderLogs(),this._autoScroll&&this._scrollToBottom()}_trimLogs(){this._logs.length>this._maxLines&&(this._logs=this._logs.slice(-this._maxLines))}_clearLogs(){this._logs=[],this.dispatchEvent(new CustomEvent("logs-cleared")),this._renderLogs()}_toggleAutoScroll(){this._autoScroll=!this._autoScroll,this.render(),this._autoScroll&&this._scrollToBottom()}_scrollToBottom(){requestAnimationFrame(()=>{let t=this.shadowRoot.getElementById("log-output");t&&(t.scrollTop=t.scrollHeight)})}_downloadLogs(){let t=this._logs.map(s=>`[${s.timestamp}] [${s.level.toUpperCase()}] ${s.message}`).join(`
|
|
1987
2014
|
`),e=new Blob([t],{type:"text/plain"}),a=URL.createObjectURL(e),i=document.createElement("a");i.href=a,i.download=`loki-logs-${new Date().toISOString().split("T")[0]}.txt`,i.click(),URL.revokeObjectURL(a)}_setFilter(t){this._filter=t.toLowerCase(),this._renderLogs()}_setLevelFilter(t){this._levelFilter=t,this._renderLogs()}_getFilteredLogs(){return this._logs.filter(t=>!(this._levelFilter!=="all"&&t.level!==this._levelFilter||this._filter&&!t.message.toLowerCase().includes(this._filter)))}_renderLogs(){let t=this.shadowRoot.getElementById("log-output");if(!t)return;let e=this._getFilteredLogs();if(e.length===0){t.innerHTML='<div class="log-empty">No log output yet. Terminal will update when Loki Mode is running.</div>';return}t.innerHTML=e.map(a=>{let i=pt[a.level]||pt.info;return`
|
|
1988
2015
|
<div class="log-line">
|
|
@@ -1999,9 +2026,9 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
1999
2026
|
}
|
|
2000
2027
|
|
|
2001
2028
|
.terminal-container {
|
|
2002
|
-
background:
|
|
2003
|
-
border: 1px solid
|
|
2004
|
-
border-radius:
|
|
2029
|
+
background: #1A0F2E;
|
|
2030
|
+
border: 1px solid #2A1F3E;
|
|
2031
|
+
border-radius: 5px;
|
|
2005
2032
|
overflow: hidden;
|
|
2006
2033
|
}
|
|
2007
2034
|
|
|
@@ -2010,8 +2037,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2010
2037
|
justify-content: space-between;
|
|
2011
2038
|
align-items: center;
|
|
2012
2039
|
padding: 10px 14px;
|
|
2013
|
-
background:
|
|
2014
|
-
border-bottom: 1px solid
|
|
2040
|
+
background: #140B24;
|
|
2041
|
+
border-bottom: 1px solid #2A1F3E;
|
|
2015
2042
|
}
|
|
2016
2043
|
|
|
2017
2044
|
.terminal-title {
|
|
@@ -2020,7 +2047,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2020
2047
|
gap: 8px;
|
|
2021
2048
|
font-size: 12px;
|
|
2022
2049
|
font-weight: 600;
|
|
2023
|
-
color:
|
|
2050
|
+
color: #C0B8D0;
|
|
2024
2051
|
}
|
|
2025
2052
|
|
|
2026
2053
|
.terminal-dots {
|
|
@@ -2046,51 +2073,51 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2046
2073
|
|
|
2047
2074
|
.terminal-btn {
|
|
2048
2075
|
padding: 4px 10px;
|
|
2049
|
-
background:
|
|
2050
|
-
border: 1px solid
|
|
2076
|
+
background: #2A1F4A;
|
|
2077
|
+
border: 1px solid #3D3060;
|
|
2051
2078
|
border-radius: 4px;
|
|
2052
|
-
color:
|
|
2079
|
+
color: #C0B8D0;
|
|
2053
2080
|
font-size: 11px;
|
|
2054
2081
|
cursor: pointer;
|
|
2055
2082
|
transition: all var(--loki-transition);
|
|
2056
2083
|
}
|
|
2057
2084
|
|
|
2058
2085
|
.terminal-btn:hover {
|
|
2059
|
-
background:
|
|
2060
|
-
color:
|
|
2086
|
+
background: #3D3060;
|
|
2087
|
+
color: #F0ECF8;
|
|
2061
2088
|
}
|
|
2062
2089
|
|
|
2063
2090
|
.terminal-btn.active {
|
|
2064
|
-
background:
|
|
2065
|
-
border-color:
|
|
2091
|
+
background: #7B6BF0;
|
|
2092
|
+
border-color: #7B6BF0;
|
|
2066
2093
|
color: white;
|
|
2067
2094
|
}
|
|
2068
2095
|
|
|
2069
2096
|
.filter-input {
|
|
2070
2097
|
padding: 4px 10px;
|
|
2071
|
-
background:
|
|
2072
|
-
border: 1px solid
|
|
2098
|
+
background: #2A1F4A;
|
|
2099
|
+
border: 1px solid #3D3060;
|
|
2073
2100
|
border-radius: 4px;
|
|
2074
|
-
color:
|
|
2101
|
+
color: #F0ECF8;
|
|
2075
2102
|
font-size: 11px;
|
|
2076
2103
|
width: 120px;
|
|
2077
2104
|
}
|
|
2078
2105
|
|
|
2079
2106
|
.filter-input:focus {
|
|
2080
2107
|
outline: none;
|
|
2081
|
-
border-color:
|
|
2108
|
+
border-color: #7B6BF0;
|
|
2082
2109
|
}
|
|
2083
2110
|
|
|
2084
2111
|
.filter-input::placeholder {
|
|
2085
|
-
color:
|
|
2112
|
+
color: #8B7FA8;
|
|
2086
2113
|
}
|
|
2087
2114
|
|
|
2088
2115
|
.level-select {
|
|
2089
2116
|
padding: 4px 10px;
|
|
2090
|
-
background:
|
|
2091
|
-
border: 1px solid
|
|
2117
|
+
background: #2A1F4A;
|
|
2118
|
+
border: 1px solid #3D3060;
|
|
2092
2119
|
border-radius: 4px;
|
|
2093
|
-
color:
|
|
2120
|
+
color: #C0B8D0;
|
|
2094
2121
|
font-size: 11px;
|
|
2095
2122
|
cursor: pointer;
|
|
2096
2123
|
}
|
|
@@ -2102,8 +2129,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2102
2129
|
font-family: 'JetBrains Mono', monospace;
|
|
2103
2130
|
font-size: 12px;
|
|
2104
2131
|
line-height: 1.6;
|
|
2105
|
-
color:
|
|
2106
|
-
background:
|
|
2132
|
+
color: #F0ECF8;
|
|
2133
|
+
background: #1A0F2E;
|
|
2107
2134
|
}
|
|
2108
2135
|
|
|
2109
2136
|
.log-line {
|
|
@@ -2183,7 +2210,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2183
2210
|
${this._logs.length} lines (${this._getFilteredLogs().length} shown)
|
|
2184
2211
|
</div>
|
|
2185
2212
|
</div>
|
|
2186
|
-
`,this._attachEventListeners(),this._renderLogs()}_attachEventListeners(){let t=this.shadowRoot.getElementById("filter-input"),e=this.shadowRoot.getElementById("level-select"),a=this.shadowRoot.getElementById("auto-scroll-btn"),i=this.shadowRoot.getElementById("clear-btn"),s=this.shadowRoot.getElementById("download-btn");t&&(t.value=this._filter,t.addEventListener("input",r=>this._setFilter(r.target.value))),e&&(e.value=this._levelFilter,e.addEventListener("change",r=>this._setLevelFilter(r.target.value))),a&&a.addEventListener("click",()=>this._toggleAutoScroll()),i&&i.addEventListener("click",()=>this._clearLogs()),s&&s.addEventListener("click",()=>this._downloadLogs())}addLog(t,e="info"){this._addLog({message:t,level:e,timestamp:new Date().toLocaleTimeString()})}clear(){this._clearLogs()}};customElements.get("loki-log-stream")||customElements.define("loki-log-stream",
|
|
2213
|
+
`,this._attachEventListeners(),this._renderLogs()}_attachEventListeners(){let t=this.shadowRoot.getElementById("filter-input"),e=this.shadowRoot.getElementById("level-select"),a=this.shadowRoot.getElementById("auto-scroll-btn"),i=this.shadowRoot.getElementById("clear-btn"),s=this.shadowRoot.getElementById("download-btn");t&&(t.value=this._filter,t.addEventListener("input",r=>this._setFilter(r.target.value))),e&&(e.value=this._levelFilter,e.addEventListener("change",r=>this._setLevelFilter(r.target.value))),a&&a.addEventListener("click",()=>this._toggleAutoScroll()),i&&i.addEventListener("click",()=>this._clearLogs()),s&&s.addEventListener("click",()=>this._downloadLogs())}addLog(t,e="info"){this._addLog({message:t,level:e,timestamp:new Date().toLocaleTimeString()})}clear(){this._clearLogs()}};customElements.get("loki-log-stream")||customElements.define("loki-log-stream",j);var yt=[{id:"summary",label:"Summary",icon:"M4 6h16M4 12h16M4 18h16"},{id:"episodes",label:"Episodes",icon:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"},{id:"patterns",label:"Patterns",icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"},{id:"skills",label:"Skills",icon:"M13 10V3L4 14h7v7l9-11h-7z"}],O=class extends c{static get observedAttributes(){return["api-url","theme","tab"]}constructor(){super(),this._activeTab="summary",this._loading=!1,this._error=null,this._api=null,this._summary=null,this._episodes=[],this._patterns=[],this._skills=[],this._tokenEconomics=null,this._selectedItem=null,this._lastFocusedElement=null}connectedCallback(){super.connectedCallback(),this._activeTab=this.getAttribute("tab")||"summary",this._setupApi(),this._loadData()}attributeChangedCallback(t,e,a){if(e!==a)switch(t){case"api-url":this._api&&(this._api.baseUrl=a,this._loadData());break;case"theme":this._applyTheme();break;case"tab":this._setTab(a);break}}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t})}async _loadData(){this._loading=!0,this._error=null,this.render();try{this._summary=await this._api.getMemorySummary().catch(()=>null),this._tokenEconomics=await this._api.getTokenEconomics().catch(()=>null),await this._loadTabData()}catch(t){this._error=t.message||"Failed to load memory data"}this._loading=!1,this.render()}async _loadTabData(){switch(this._activeTab){case"episodes":this._episodes=await this._api.listEpisodes({limit:50}).catch(()=>[]);break;case"patterns":this._patterns=await this._api.listPatterns().catch(()=>[]);break;case"skills":this._skills=await this._api.listSkills().catch(()=>[]);break}}_setTab(t){this._activeTab!==t&&(this._activeTab=t,this._selectedItem=null,this._loadTabData().then(()=>this.render()))}async _selectEpisode(t){try{this._lastFocusedElement=this.shadowRoot.activeElement,this._selectedItem=await this._api.getEpisode(t),this.dispatchEvent(new CustomEvent("episode-select",{detail:this._selectedItem})),this.render(),this._focusDetailPanel()}catch(e){console.error("Failed to load episode:",e)}}async _selectPattern(t){try{this._lastFocusedElement=this.shadowRoot.activeElement,this._selectedItem=await this._api.getPattern(t),this.dispatchEvent(new CustomEvent("pattern-select",{detail:this._selectedItem})),this.render(),this._focusDetailPanel()}catch(e){console.error("Failed to load pattern:",e)}}async _selectSkill(t){try{this._lastFocusedElement=this.shadowRoot.activeElement,this._selectedItem=await this._api.getSkill(t),this.dispatchEvent(new CustomEvent("skill-select",{detail:this._selectedItem})),this.render(),this._focusDetailPanel()}catch(e){console.error("Failed to load skill:",e)}}_focusDetailPanel(){requestAnimationFrame(()=>{let t=this.shadowRoot.getElementById("close-detail");t&&t.focus()})}_closeDetail(){this._selectedItem=null,this.render(),this._lastFocusedElement&&requestAnimationFrame(()=>{this._lastFocusedElement.focus(),this._lastFocusedElement=null})}async _triggerConsolidation(){try{let t=await this._api.consolidateMemory(24);alert(`Consolidation complete:
|
|
2187
2214
|
- Patterns created: ${t.patternsCreated}
|
|
2188
2215
|
- Patterns merged: ${t.patternsMerged}
|
|
2189
2216
|
- Episodes processed: ${t.episodesProcessed}`),this._loadData()}catch(t){alert("Consolidation failed: "+t.message)}}_renderSummary(){if(!this._summary)return'<div class="empty-state">No memory data available</div>';let{episodic:t,semantic:e,procedural:a,tokenEconomics:i}=this._summary;return`
|
|
@@ -2459,7 +2486,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2459
2486
|
.memory-browser {
|
|
2460
2487
|
background: var(--loki-bg-card);
|
|
2461
2488
|
border: 1px solid var(--loki-border);
|
|
2462
|
-
border-radius:
|
|
2489
|
+
border-radius: 5px;
|
|
2463
2490
|
overflow: hidden;
|
|
2464
2491
|
}
|
|
2465
2492
|
|
|
@@ -2479,12 +2506,15 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2479
2506
|
|
|
2480
2507
|
.tabs {
|
|
2481
2508
|
display: flex;
|
|
2482
|
-
|
|
2509
|
+
gap: 4px;
|
|
2510
|
+
padding: 4px;
|
|
2483
2511
|
background: var(--loki-bg-secondary);
|
|
2512
|
+
border-radius: 5px;
|
|
2513
|
+
border: 1px solid var(--loki-border);
|
|
2484
2514
|
}
|
|
2485
2515
|
|
|
2486
2516
|
.tab {
|
|
2487
|
-
padding:
|
|
2517
|
+
padding: 7px 14px;
|
|
2488
2518
|
font-size: 12px;
|
|
2489
2519
|
font-weight: 500;
|
|
2490
2520
|
color: var(--loki-text-secondary);
|
|
@@ -2495,8 +2525,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2495
2525
|
align-items: center;
|
|
2496
2526
|
gap: 6px;
|
|
2497
2527
|
transition: all var(--loki-transition);
|
|
2498
|
-
border-
|
|
2499
|
-
margin-bottom: -1px;
|
|
2528
|
+
border-radius: 4px;
|
|
2500
2529
|
}
|
|
2501
2530
|
|
|
2502
2531
|
.tab:hover {
|
|
@@ -2505,8 +2534,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2505
2534
|
}
|
|
2506
2535
|
|
|
2507
2536
|
.tab.active {
|
|
2508
|
-
color:
|
|
2509
|
-
|
|
2537
|
+
color: white;
|
|
2538
|
+
background: var(--loki-accent);
|
|
2510
2539
|
}
|
|
2511
2540
|
|
|
2512
2541
|
.tab svg {
|
|
@@ -2549,7 +2578,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2549
2578
|
|
|
2550
2579
|
.summary-card {
|
|
2551
2580
|
background: var(--loki-bg-secondary);
|
|
2552
|
-
border-radius:
|
|
2581
|
+
border-radius: 5px;
|
|
2553
2582
|
padding: 14px;
|
|
2554
2583
|
}
|
|
2555
2584
|
|
|
@@ -2645,7 +2674,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2645
2674
|
.item-card {
|
|
2646
2675
|
background: var(--loki-bg-secondary);
|
|
2647
2676
|
border: 1px solid var(--loki-border);
|
|
2648
|
-
border-radius:
|
|
2677
|
+
border-radius: 4px;
|
|
2649
2678
|
padding: 12px;
|
|
2650
2679
|
cursor: pointer;
|
|
2651
2680
|
transition: all var(--loki-transition);
|
|
@@ -2781,7 +2810,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2781
2810
|
.detail-content {
|
|
2782
2811
|
background: var(--loki-bg-tertiary);
|
|
2783
2812
|
padding: 10px;
|
|
2784
|
-
border-radius:
|
|
2813
|
+
border-radius: 4px;
|
|
2785
2814
|
font-size: 12px;
|
|
2786
2815
|
color: var(--loki-text-primary);
|
|
2787
2816
|
}
|
|
@@ -2806,7 +2835,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2806
2835
|
|
|
2807
2836
|
.action-log {
|
|
2808
2837
|
background: var(--loki-bg-tertiary);
|
|
2809
|
-
border-radius:
|
|
2838
|
+
border-radius: 4px;
|
|
2810
2839
|
padding: 8px;
|
|
2811
2840
|
max-height: 200px;
|
|
2812
2841
|
overflow-y: auto;
|
|
@@ -2876,7 +2905,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2876
2905
|
${e}
|
|
2877
2906
|
</div>
|
|
2878
2907
|
</div>
|
|
2879
|
-
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.querySelectorAll(".tab");t.forEach((s,r)=>{s.addEventListener("click",()=>this._setTab(s.dataset.tab)),s.addEventListener("keydown",o=>{if(o.key==="ArrowRight"||o.key==="ArrowLeft"){o.preventDefault();let l=Array.from(t),p=o.key==="ArrowRight"?(r+1)%l.length:(r-1+l.length)%l.length;l[p].focus(),this._setTab(l[p].dataset.tab)}})}),this.shadowRoot.querySelectorAll(".item-card").forEach(s=>{s.addEventListener("click",()=>this._handleItemClick(s)),s.addEventListener("keydown",r=>{r.key==="Enter"||r.key===" "?(r.preventDefault(),this._handleItemClick(s)):(r.key==="ArrowDown"||r.key==="ArrowUp")&&(r.preventDefault(),this._navigateItemCards(s,r.key==="ArrowDown"?"next":"prev"))})});let e=this.shadowRoot.getElementById("close-detail");e&&e.addEventListener("click",()=>this._closeDetail());let a=this.shadowRoot.getElementById("consolidate-btn");a&&a.addEventListener("click",()=>this._triggerConsolidation());let i=this.shadowRoot.getElementById("refresh-btn");i&&i.addEventListener("click",()=>this._loadData())}_handleItemClick(t){let e=t.dataset.id;switch(t.dataset.type){case"episode":this._selectEpisode(e);break;case"pattern":this._selectPattern(e);break;case"skill":this._selectSkill(e);break}}_navigateItemCards(t,e){let a=Array.from(this.shadowRoot.querySelectorAll(".item-card")),i=a.indexOf(t);if(i===-1)return;let s=e==="next"?i+1:i-1;s>=0&&s<a.length&&a[s].focus()}};customElements.get("loki-memory-browser")||customElements.define("loki-memory-browser",O);var wt=[{id:"1h",label:"1 Hour",hours:1},{id:"24h",label:"24 Hours",hours:24},{id:"7d",label:"7 Days",hours:168},{id:"30d",label:"30 Days",hours:720}],$t=[{id:"all",label:"All Signals"},{id:"user_preference",label:"User Preferences"},{id:"error_pattern",label:"Error Patterns"},{id:"success_pattern",label:"Success Patterns"},{id:"tool_efficiency",label:"Tool Efficiency"},{id:"context_relevance",label:"Context Relevance"}],
|
|
2908
|
+
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.querySelectorAll(".tab");t.forEach((s,r)=>{s.addEventListener("click",()=>this._setTab(s.dataset.tab)),s.addEventListener("keydown",o=>{if(o.key==="ArrowRight"||o.key==="ArrowLeft"){o.preventDefault();let l=Array.from(t),p=o.key==="ArrowRight"?(r+1)%l.length:(r-1+l.length)%l.length;l[p].focus(),this._setTab(l[p].dataset.tab)}})}),this.shadowRoot.querySelectorAll(".item-card").forEach(s=>{s.addEventListener("click",()=>this._handleItemClick(s)),s.addEventListener("keydown",r=>{r.key==="Enter"||r.key===" "?(r.preventDefault(),this._handleItemClick(s)):(r.key==="ArrowDown"||r.key==="ArrowUp")&&(r.preventDefault(),this._navigateItemCards(s,r.key==="ArrowDown"?"next":"prev"))})});let e=this.shadowRoot.getElementById("close-detail");e&&e.addEventListener("click",()=>this._closeDetail());let a=this.shadowRoot.getElementById("consolidate-btn");a&&a.addEventListener("click",()=>this._triggerConsolidation());let i=this.shadowRoot.getElementById("refresh-btn");i&&i.addEventListener("click",()=>this._loadData())}_handleItemClick(t){let e=t.dataset.id;switch(t.dataset.type){case"episode":this._selectEpisode(e);break;case"pattern":this._selectPattern(e);break;case"skill":this._selectSkill(e);break}}_navigateItemCards(t,e){let a=Array.from(this.shadowRoot.querySelectorAll(".item-card")),i=a.indexOf(t);if(i===-1)return;let s=e==="next"?i+1:i-1;s>=0&&s<a.length&&a[s].focus()}};customElements.get("loki-memory-browser")||customElements.define("loki-memory-browser",O);var wt=[{id:"1h",label:"1 Hour",hours:1},{id:"24h",label:"24 Hours",hours:24},{id:"7d",label:"7 Days",hours:168},{id:"30d",label:"30 Days",hours:720}],$t=[{id:"all",label:"All Signals"},{id:"user_preference",label:"User Preferences"},{id:"error_pattern",label:"Error Patterns"},{id:"success_pattern",label:"Success Patterns"},{id:"tool_efficiency",label:"Tool Efficiency"},{id:"context_relevance",label:"Context Relevance"}],Et=[{id:"all",label:"All Sources"},{id:"cli",label:"CLI"},{id:"api",label:"API"},{id:"vscode",label:"VS Code"},{id:"mcp",label:"MCP"},{id:"dashboard",label:"Dashboard"}],N=class extends c{static get observedAttributes(){return["api-url","theme","time-range","signal-type","source"]}constructor(){super(),this._loading=!1,this._error=null,this._api=null,this._timeRange="7d",this._signalType="all",this._source="all",this._metrics=null,this._trends=null,this._signals=[],this._selectedMetric=null}connectedCallback(){super.connectedCallback(),this._timeRange=this.getAttribute("time-range")||"7d",this._signalType=this.getAttribute("signal-type")||"all",this._source=this.getAttribute("source")||"all",this._setupApi(),this._loadData()}attributeChangedCallback(t,e,a){if(e!==a)switch(t){case"api-url":this._api&&(this._api.baseUrl=a,this._loadData());break;case"theme":this._applyTheme();break;case"time-range":this._timeRange=a,this._loadData();break;case"signal-type":this._signalType=a,this._loadData();break;case"source":this._source=a,this._loadData();break}}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t})}async _loadData(){this._loading=!0,this._error=null,this.render();try{let t={timeRange:this._timeRange,signalType:this._signalType!=="all"?this._signalType:void 0,source:this._source!=="all"?this._source:void 0},[e,a,i]=await Promise.all([this._api.getLearningMetrics(t).catch(()=>null),this._api.getLearningTrends(t).catch(()=>null),this._api.getLearningSignals({...t,limit:50}).catch(()=>[])]);this._metrics=e,this._trends=a,this._signals=i||[]}catch(t){this._error=t.message||"Failed to load learning data"}this._loading=!1,this.render()}_setFilter(t,e){switch(t){case"timeRange":this._timeRange=e,this.setAttribute("time-range",e);break;case"signalType":this._signalType=e,this.setAttribute("signal-type",e);break;case"source":this._source=e,this.setAttribute("source",e);break}this.dispatchEvent(new CustomEvent("filter-change",{detail:{timeRange:this._timeRange,signalType:this._signalType,source:this._source}})),this._loadData()}_selectMetric(t,e){this._selectedMetric={type:t,item:e},this.dispatchEvent(new CustomEvent("metric-select",{detail:{type:t,item:e}})),this.render()}_closeDetail(){this._selectedMetric=null,this.render()}_formatNumber(t){return t>=1e6?(t/1e6).toFixed(1)+"M":t>=1e3?(t/1e3).toFixed(1)+"K":t?.toString()||"0"}_formatPercent(t){return(t*100).toFixed(1)+"%"}_formatDuration(t){return t<60?t.toFixed(0)+"s":t<3600?(t/60).toFixed(1)+"m":(t/3600).toFixed(1)+"h"}_escapeHtml(t){if(!t)return"";let e=document.createElement("div");return e.textContent=t,e.innerHTML}_renderFilters(){return`
|
|
2880
2909
|
<div class="filters">
|
|
2881
2910
|
<div class="filter-group">
|
|
2882
2911
|
<label>Time Range</label>
|
|
@@ -2897,7 +2926,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2897
2926
|
<div class="filter-group">
|
|
2898
2927
|
<label>Source</label>
|
|
2899
2928
|
<select id="source-select" class="filter-select">
|
|
2900
|
-
${
|
|
2929
|
+
${Et.map(t=>`
|
|
2901
2930
|
<option value="${t.id}" ${this._source===t.id?"selected":""}>${t.label}</option>
|
|
2902
2931
|
`).join("")}
|
|
2903
2932
|
</select>
|
|
@@ -2979,7 +3008,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2979
3008
|
</div>
|
|
2980
3009
|
</div>
|
|
2981
3010
|
</div>
|
|
2982
|
-
`}_renderTrendChart(){if(!this._trends||!this._trends.dataPoints||this._trends.dataPoints.length===0)return'<div class="chart-empty">No trend data available</div>';let{dataPoints:t,maxValue:e}=this._trends,a=120,i=400,s=20,r=t.map((l,p)=>{let y=s+p/(t.length-1||1)*(i-s*2),
|
|
3011
|
+
`}_renderTrendChart(){if(!this._trends||!this._trends.dataPoints||this._trends.dataPoints.length===0)return'<div class="chart-empty">No trend data available</div>';let{dataPoints:t,maxValue:e}=this._trends,a=120,i=400,s=20,r=t.map((l,p)=>{let y=s+p/(t.length-1||1)*(i-s*2),T=a-s-l.count/(e||1)*(a-s*2);return`${y},${T}`}).join(" "),o=`${s},${a-s} ${r} ${i-s},${a-s}`;return`
|
|
2983
3012
|
<div class="trend-chart">
|
|
2984
3013
|
<div class="chart-header">
|
|
2985
3014
|
<span class="chart-title">Signal Volume Over Time</span>
|
|
@@ -2997,7 +3026,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
2997
3026
|
<polyline points="${r}" fill="none" stroke="var(--loki-accent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
2998
3027
|
|
|
2999
3028
|
<!-- Data points -->
|
|
3000
|
-
${t.map((l,p)=>{let y=s+p/(t.length-1||1)*(i-s*2),
|
|
3029
|
+
${t.map((l,p)=>{let y=s+p/(t.length-1||1)*(i-s*2),T=a-s-l.count/(e||1)*(a-s*2);return`<circle cx="${y}" cy="${T}" r="3" fill="var(--loki-accent)" />`}).join("")}
|
|
3001
3030
|
</svg>
|
|
3002
3031
|
<div class="chart-labels">
|
|
3003
3032
|
${t.length>0?`
|
|
@@ -3249,7 +3278,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3249
3278
|
.learning-dashboard {
|
|
3250
3279
|
background: var(--loki-bg-card);
|
|
3251
3280
|
border: 1px solid var(--loki-border);
|
|
3252
|
-
border-radius:
|
|
3281
|
+
border-radius: 5px;
|
|
3253
3282
|
overflow: hidden;
|
|
3254
3283
|
}
|
|
3255
3284
|
|
|
@@ -3346,7 +3375,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3346
3375
|
|
|
3347
3376
|
.summary-card {
|
|
3348
3377
|
background: var(--loki-bg-secondary);
|
|
3349
|
-
border-radius:
|
|
3378
|
+
border-radius: 5px;
|
|
3350
3379
|
padding: 14px;
|
|
3351
3380
|
}
|
|
3352
3381
|
|
|
@@ -3462,7 +3491,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3462
3491
|
/* Trend Chart */
|
|
3463
3492
|
.trend-chart {
|
|
3464
3493
|
background: var(--loki-bg-secondary);
|
|
3465
|
-
border-radius:
|
|
3494
|
+
border-radius: 5px;
|
|
3466
3495
|
padding: 14px;
|
|
3467
3496
|
margin-bottom: 20px;
|
|
3468
3497
|
}
|
|
@@ -3504,7 +3533,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3504
3533
|
color: var(--loki-text-muted);
|
|
3505
3534
|
font-size: 12px;
|
|
3506
3535
|
background: var(--loki-bg-secondary);
|
|
3507
|
-
border-radius:
|
|
3536
|
+
border-radius: 5px;
|
|
3508
3537
|
margin-bottom: 20px;
|
|
3509
3538
|
}
|
|
3510
3539
|
|
|
@@ -3518,7 +3547,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3518
3547
|
|
|
3519
3548
|
.top-list {
|
|
3520
3549
|
background: var(--loki-bg-secondary);
|
|
3521
|
-
border-radius:
|
|
3550
|
+
border-radius: 5px;
|
|
3522
3551
|
overflow: hidden;
|
|
3523
3552
|
}
|
|
3524
3553
|
|
|
@@ -3540,7 +3569,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3540
3569
|
font-size: 10px;
|
|
3541
3570
|
padding: 2px 6px;
|
|
3542
3571
|
background: var(--loki-bg-card);
|
|
3543
|
-
border-radius:
|
|
3572
|
+
border-radius: 5px;
|
|
3544
3573
|
color: var(--loki-text-muted);
|
|
3545
3574
|
}
|
|
3546
3575
|
|
|
@@ -3651,7 +3680,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3651
3680
|
/* Recent Signals */
|
|
3652
3681
|
.recent-signals {
|
|
3653
3682
|
background: var(--loki-bg-secondary);
|
|
3654
|
-
border-radius:
|
|
3683
|
+
border-radius: 5px;
|
|
3655
3684
|
overflow: hidden;
|
|
3656
3685
|
}
|
|
3657
3686
|
|
|
@@ -3673,7 +3702,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3673
3702
|
font-size: 10px;
|
|
3674
3703
|
padding: 2px 6px;
|
|
3675
3704
|
background: var(--loki-bg-card);
|
|
3676
|
-
border-radius:
|
|
3705
|
+
border-radius: 5px;
|
|
3677
3706
|
color: var(--loki-text-muted);
|
|
3678
3707
|
}
|
|
3679
3708
|
|
|
@@ -3888,7 +3917,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3888
3917
|
${e}
|
|
3889
3918
|
</div>
|
|
3890
3919
|
</div>
|
|
3891
|
-
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.getElementById("time-range-select");t&&t.addEventListener("change",r=>this._setFilter("timeRange",r.target.value));let e=this.shadowRoot.getElementById("signal-type-select");e&&e.addEventListener("change",r=>this._setFilter("signalType",r.target.value));let a=this.shadowRoot.getElementById("source-select");a&&a.addEventListener("change",r=>this._setFilter("source",r.target.value));let i=this.shadowRoot.getElementById("refresh-btn");i&&i.addEventListener("click",()=>this._loadData());let s=this.shadowRoot.getElementById("close-detail");s&&s.addEventListener("click",()=>this._closeDetail()),this.shadowRoot.querySelectorAll(".list-item").forEach(r=>{r.addEventListener("click",()=>{let o=r.dataset.type,l=r.dataset.id,p=this._findItemData(o,l);p&&this._selectMetric(o,p)}),r.addEventListener("keydown",o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),r.click())})})}_findItemData(t,e){if(!this._metrics?.aggregation)return null;switch(t){case"preference":return this._metrics.aggregation.preferences?.find(a=>a.preference_key===e);case"error_pattern":return this._metrics.aggregation.error_patterns?.find(a=>a.error_type===e);case"success_pattern":return this._metrics.aggregation.success_patterns?.find(a=>a.pattern_name===e);case"tool_efficiency":return this._metrics.aggregation.tool_efficiencies?.find(a=>a.tool_name===e);default:return null}}};customElements.get("loki-learning-dashboard")||customElements.define("loki-learning-dashboard",N);var
|
|
3920
|
+
`,this._attachEventListeners()}_attachEventListeners(){let t=this.shadowRoot.getElementById("time-range-select");t&&t.addEventListener("change",r=>this._setFilter("timeRange",r.target.value));let e=this.shadowRoot.getElementById("signal-type-select");e&&e.addEventListener("change",r=>this._setFilter("signalType",r.target.value));let a=this.shadowRoot.getElementById("source-select");a&&a.addEventListener("change",r=>this._setFilter("source",r.target.value));let i=this.shadowRoot.getElementById("refresh-btn");i&&i.addEventListener("click",()=>this._loadData());let s=this.shadowRoot.getElementById("close-detail");s&&s.addEventListener("click",()=>this._closeDetail()),this.shadowRoot.querySelectorAll(".list-item").forEach(r=>{r.addEventListener("click",()=>{let o=r.dataset.type,l=r.dataset.id,p=this._findItemData(o,l);p&&this._selectMetric(o,p)}),r.addEventListener("keydown",o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),r.click())})})}_findItemData(t,e){if(!this._metrics?.aggregation)return null;switch(t){case"preference":return this._metrics.aggregation.preferences?.find(a=>a.preference_key===e);case"error_pattern":return this._metrics.aggregation.error_patterns?.find(a=>a.error_type===e);case"success_pattern":return this._metrics.aggregation.success_patterns?.find(a=>a.pattern_name===e);case"tool_efficiency":return this._metrics.aggregation.tool_efficiencies?.find(a=>a.tool_name===e);default:return null}}};customElements.get("loki-learning-dashboard")||customElements.define("loki-learning-dashboard",N);var Ct=[{id:"overview",label:"Overview"},{id:"decisions",label:"Decision Log"},{id:"convergence",label:"Convergence"},{id:"agents",label:"Agents"}],q=class extends c{static get observedAttributes(){return["api-url","theme"]}constructor(){super(),this._loading=!1,this._error=null,this._api=null,this._activeTab="overview",this._pollInterval=null,this._councilState=null,this._verdicts=[],this._convergence=[],this._agents=[],this._selectedAgent=null,this._lastDataHash=null}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadData(),this._startPolling()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling()}attributeChangedCallback(t,e,a){e!==a&&(t==="api-url"&&this._api&&(this._api.baseUrl=a,this._loadData()),t==="theme"&&this._applyTheme())}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t})}_startPolling(){this._pollInterval=setInterval(()=>this._loadData(),3e3),this._visibilityHandler=()=>{document.hidden?this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null):this._pollInterval||(this._loadData(),this._pollInterval=setInterval(()=>this._loadData(),3e3))},document.addEventListener("visibilitychange",this._visibilityHandler)}_stopPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null),this._visibilityHandler&&(document.removeEventListener("visibilitychange",this._visibilityHandler),this._visibilityHandler=null),this._pendingRaf&&(cancelAnimationFrame(this._pendingRaf),this._pendingRaf=null)}async _loadData(){try{let[e,a,i,s]=await Promise.allSettled([this._api._get("/api/council/state"),this._api._get("/api/council/verdicts"),this._api._get("/api/council/convergence"),this._api._get("/api/agents")]);e.status==="fulfilled"&&(this._councilState=e.value),a.status==="fulfilled"&&(this._verdicts=a.value.verdicts||[]),i.status==="fulfilled"&&(this._convergence=i.value.dataPoints||[]),s.status==="fulfilled"&&(this._agents=Array.isArray(s.value)?s.value:[]),this._error=null}catch(e){this._error=e.message}let t=JSON.stringify({s:this._councilState,v:this._verdicts,c:this._convergence,a:this._agents,e:this._error});t!==this._lastDataHash&&(this._lastDataHash=t,this.render())}async _forceReview(){try{await this._api._post("/api/council/force-review"),this.dispatchEvent(new CustomEvent("council-action",{detail:{action:"force-review"},bubbles:!0}))}catch(t){this._error=`Failed to force review: ${t.message}`,this.render()}}async _killAgent(t){if(confirm(`Kill agent ${t}?`))try{await this._api._post(`/api/agents/${t}/kill`),this.dispatchEvent(new CustomEvent("council-action",{detail:{action:"kill-agent",agentId:t},bubbles:!0})),await this._loadData()}catch(e){this._error=`Failed to kill agent: ${e.message}`,this.render()}}async _pauseAgent(t){try{await this._api._post(`/api/agents/${t}/pause`),await this._loadData()}catch(e){this._error=`Failed to pause agent: ${e.message}`,this.render()}}async _resumeAgent(t){try{await this._api._post(`/api/agents/${t}/resume`),await this._loadData()}catch(e){this._error=`Failed to resume agent: ${e.message}`,this.render()}}_setTab(t){this._activeTab=t,this.render()}_selectAgent(t){this._selectedAgent=this._selectedAgent?.id===t.id?null:t,this.render()}render(){let t=this.shadowRoot;t&&(this._pendingRaf&&(cancelAnimationFrame(this._pendingRaf),this._pendingRaf=null),t.innerHTML=`
|
|
3892
3921
|
<style>${this.getBaseStyles()}${this._getStyles()}</style>
|
|
3893
3922
|
<div class="council-dashboard">
|
|
3894
3923
|
<div class="council-header">
|
|
@@ -3902,7 +3931,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
3902
3931
|
</div>
|
|
3903
3932
|
|
|
3904
3933
|
<div class="tabs">
|
|
3905
|
-
${
|
|
3934
|
+
${Ct.map(e=>`
|
|
3906
3935
|
<button
|
|
3907
3936
|
class="tab ${this._activeTab===e.id?"active":""}"
|
|
3908
3937
|
data-tab="${e.id}"
|
|
@@ -4090,9 +4119,9 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4090
4119
|
font-size: 11px;
|
|
4091
4120
|
font-weight: 500;
|
|
4092
4121
|
padding: 2px 8px;
|
|
4093
|
-
border-radius:
|
|
4122
|
+
border-radius: 4px;
|
|
4094
4123
|
text-transform: uppercase;
|
|
4095
|
-
letter-spacing: 0.
|
|
4124
|
+
letter-spacing: 0.05em;
|
|
4096
4125
|
}
|
|
4097
4126
|
|
|
4098
4127
|
.badge-active {
|
|
@@ -4109,36 +4138,40 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4109
4138
|
|
|
4110
4139
|
.tabs {
|
|
4111
4140
|
display: flex;
|
|
4112
|
-
gap:
|
|
4113
|
-
|
|
4141
|
+
gap: 4px;
|
|
4142
|
+
padding: 4px;
|
|
4143
|
+
background: var(--loki-bg-secondary);
|
|
4144
|
+
border-radius: 5px;
|
|
4145
|
+
border: 1px solid var(--loki-border);
|
|
4114
4146
|
margin-bottom: 16px;
|
|
4115
4147
|
}
|
|
4116
4148
|
|
|
4117
4149
|
.tab {
|
|
4118
|
-
padding:
|
|
4150
|
+
padding: 7px 14px;
|
|
4119
4151
|
background: none;
|
|
4120
4152
|
border: none;
|
|
4121
4153
|
color: var(--loki-text-muted);
|
|
4122
4154
|
cursor: pointer;
|
|
4123
4155
|
font-size: 13px;
|
|
4124
4156
|
font-weight: 500;
|
|
4125
|
-
border-
|
|
4157
|
+
border-radius: 4px;
|
|
4126
4158
|
transition: all 0.15s ease;
|
|
4127
4159
|
}
|
|
4128
4160
|
|
|
4129
4161
|
.tab:hover {
|
|
4130
4162
|
color: var(--loki-text-primary);
|
|
4163
|
+
background: var(--loki-bg-hover);
|
|
4131
4164
|
}
|
|
4132
4165
|
|
|
4133
4166
|
.tab.active {
|
|
4134
|
-
color:
|
|
4135
|
-
|
|
4167
|
+
color: white;
|
|
4168
|
+
background: var(--loki-accent);
|
|
4136
4169
|
}
|
|
4137
4170
|
|
|
4138
4171
|
.btn {
|
|
4139
4172
|
padding: 6px 14px;
|
|
4140
4173
|
border: 1px solid var(--loki-border);
|
|
4141
|
-
border-radius:
|
|
4174
|
+
border-radius: 4px;
|
|
4142
4175
|
background: var(--loki-bg-tertiary);
|
|
4143
4176
|
color: var(--loki-text-primary);
|
|
4144
4177
|
cursor: pointer;
|
|
@@ -4201,7 +4234,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4201
4234
|
.stat-card {
|
|
4202
4235
|
background: var(--loki-bg-card);
|
|
4203
4236
|
border: 1px solid var(--loki-border);
|
|
4204
|
-
border-radius:
|
|
4237
|
+
border-radius: 5px;
|
|
4205
4238
|
padding: 14px;
|
|
4206
4239
|
}
|
|
4207
4240
|
|
|
@@ -4210,7 +4243,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4210
4243
|
font-weight: 500;
|
|
4211
4244
|
color: var(--loki-text-muted);
|
|
4212
4245
|
text-transform: uppercase;
|
|
4213
|
-
letter-spacing: 0.
|
|
4246
|
+
letter-spacing: 0.05em;
|
|
4214
4247
|
margin-bottom: 6px;
|
|
4215
4248
|
}
|
|
4216
4249
|
|
|
@@ -4218,6 +4251,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4218
4251
|
font-size: 24px;
|
|
4219
4252
|
font-weight: 600;
|
|
4220
4253
|
line-height: 1.2;
|
|
4254
|
+
color: var(--loki-accent);
|
|
4255
|
+
font-family: 'JetBrains Mono', monospace;
|
|
4221
4256
|
}
|
|
4222
4257
|
|
|
4223
4258
|
.stat-sub {
|
|
@@ -4251,7 +4286,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4251
4286
|
padding: 8px;
|
|
4252
4287
|
background: var(--loki-bg-card);
|
|
4253
4288
|
border: 1px solid var(--loki-border);
|
|
4254
|
-
border-radius:
|
|
4289
|
+
border-radius: 5px;
|
|
4255
4290
|
}
|
|
4256
4291
|
|
|
4257
4292
|
.bar-wrapper {
|
|
@@ -4293,7 +4328,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4293
4328
|
.decision-card {
|
|
4294
4329
|
background: var(--loki-bg-card);
|
|
4295
4330
|
border: 1px solid var(--loki-border);
|
|
4296
|
-
border-radius:
|
|
4331
|
+
border-radius: 5px;
|
|
4297
4332
|
padding: 12px 16px;
|
|
4298
4333
|
border-left: 3px solid transparent;
|
|
4299
4334
|
}
|
|
@@ -4347,7 +4382,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4347
4382
|
.convergence-table {
|
|
4348
4383
|
background: var(--loki-bg-card);
|
|
4349
4384
|
border: 1px solid var(--loki-border);
|
|
4350
|
-
border-radius:
|
|
4385
|
+
border-radius: 5px;
|
|
4351
4386
|
overflow: hidden;
|
|
4352
4387
|
}
|
|
4353
4388
|
|
|
@@ -4363,7 +4398,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4363
4398
|
font-size: 11px;
|
|
4364
4399
|
font-weight: 600;
|
|
4365
4400
|
text-transform: uppercase;
|
|
4366
|
-
letter-spacing: 0.
|
|
4401
|
+
letter-spacing: 0.05em;
|
|
4367
4402
|
color: var(--loki-text-muted);
|
|
4368
4403
|
border-bottom: 1px solid var(--loki-border);
|
|
4369
4404
|
background: var(--loki-bg-tertiary);
|
|
@@ -4392,7 +4427,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4392
4427
|
.agent-card {
|
|
4393
4428
|
background: var(--loki-bg-card);
|
|
4394
4429
|
border: 1px solid var(--loki-border);
|
|
4395
|
-
border-radius:
|
|
4430
|
+
border-radius: 5px;
|
|
4396
4431
|
padding: 12px 16px;
|
|
4397
4432
|
cursor: pointer;
|
|
4398
4433
|
transition: all 0.15s ease;
|
|
@@ -4423,7 +4458,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4423
4458
|
font-size: 11px;
|
|
4424
4459
|
font-weight: 500;
|
|
4425
4460
|
padding: 2px 8px;
|
|
4426
|
-
border-radius:
|
|
4461
|
+
border-radius: 5px;
|
|
4427
4462
|
}
|
|
4428
4463
|
|
|
4429
4464
|
.status-alive {
|
|
@@ -4465,15 +4500,15 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4465
4500
|
padding: 10px 14px;
|
|
4466
4501
|
background: var(--loki-error-muted);
|
|
4467
4502
|
border: 1px solid var(--loki-error-muted);
|
|
4468
|
-
border-radius:
|
|
4503
|
+
border-radius: 4px;
|
|
4469
4504
|
color: var(--loki-error);
|
|
4470
4505
|
font-size: 12px;
|
|
4471
4506
|
}
|
|
4472
|
-
`}};customElements.get("loki-council-dashboard")||customElements.define("loki-council-dashboard",q);var ut={critical:0,major:1,minor:2},
|
|
4507
|
+
`}};customElements.get("loki-council-dashboard")||customElements.define("loki-council-dashboard",q);var ut={critical:0,major:1,minor:2},Tt={critical:"var(--loki-status-error, #ef4444)",major:"var(--loki-status-warning, #f59e0b)",minor:"var(--loki-text-muted, #71717a)"},G=class extends c{static get observedAttributes(){return["api-url","theme"]}constructor(){super(),this._loading=!1,this._error=null,this._api=null,this._pollInterval=null,this._checklist=null,this._waivers=[],this._expandedCategories=new Set,this._lastDataHash=null}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadData(),this._startPolling()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling()}attributeChangedCallback(t,e,a){e!==a&&(t==="api-url"&&this._api&&(this._api.baseUrl=a,this._loadData()),t==="theme"&&this._applyTheme())}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t})}_startPolling(){this._pollInterval=setInterval(()=>this._loadData(),5e3),this._visibilityHandler=()=>{document.hidden?this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null):this._pollInterval||(this._loadData(),this._pollInterval=setInterval(()=>this._loadData(),5e3))},document.addEventListener("visibilitychange",this._visibilityHandler)}_stopPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null),this._visibilityHandler&&(document.removeEventListener("visibilitychange",this._visibilityHandler),this._visibilityHandler=null)}async _loadData(){try{let[t,e]=await Promise.all([this._api.getChecklist(),this._api.getChecklistWaivers().catch(()=>null)]),a=JSON.stringify(e),i=JSON.stringify(t)+a;if(i===this._lastDataHash)return;this._lastDataHash=i,this._checklist=t,this._waivers=e&&e.waivers?e.waivers.filter(s=>s.active):[],this._error=null,this.render()}catch(t){this._error=`Failed to load checklist: ${t.message}`,this.render()}}_isItemWaived(t){return this._waivers.some(e=>e.item_id===t)}_getWaiverForItem(t){return this._waivers.find(e=>e.item_id===t)||null}async _waiveItem(t){let e=window.prompt("Enter reason for waiving this item:");if(e)try{await this._api.addChecklistWaiver(t,e),this._lastDataHash=null,await this._loadData()}catch(a){this._error=`Failed to add waiver: ${a.message}`,this.render()}}async _unwaiveItem(t){try{await this._api.removeChecklistWaiver(t),this._lastDataHash=null,await this._loadData()}catch(e){this._error=`Failed to remove waiver: ${e.message}`,this.render()}}_toggleCategory(t){this._expandedCategories.has(t)?this._expandedCategories.delete(t):this._expandedCategories.add(t),this.render()}_getStyles(){return`
|
|
4473
4508
|
.checklist-viewer {
|
|
4474
4509
|
padding: 16px;
|
|
4475
4510
|
font-family: var(--loki-font-family, system-ui, -apple-system, sans-serif);
|
|
4476
|
-
color: var(--loki-text-primary, #
|
|
4511
|
+
color: var(--loki-text-primary, #201515);
|
|
4477
4512
|
}
|
|
4478
4513
|
.checklist-header {
|
|
4479
4514
|
display: flex;
|
|
@@ -4494,7 +4529,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4494
4529
|
display: inline-flex;
|
|
4495
4530
|
align-items: center;
|
|
4496
4531
|
padding: 2px 8px;
|
|
4497
|
-
border-radius:
|
|
4532
|
+
border-radius: 4px;
|
|
4498
4533
|
font-size: 12px;
|
|
4499
4534
|
font-weight: 500;
|
|
4500
4535
|
}
|
|
@@ -4541,7 +4576,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4541
4576
|
/* Category accordions */
|
|
4542
4577
|
.category {
|
|
4543
4578
|
border: 1px solid var(--loki-border, #e4e4e7);
|
|
4544
|
-
border-radius:
|
|
4579
|
+
border-radius: 5px;
|
|
4545
4580
|
margin-bottom: 8px;
|
|
4546
4581
|
overflow: hidden;
|
|
4547
4582
|
}
|
|
@@ -4587,9 +4622,9 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4587
4622
|
font-size: 13px;
|
|
4588
4623
|
}
|
|
4589
4624
|
.item-status {
|
|
4590
|
-
width:
|
|
4591
|
-
height:
|
|
4592
|
-
border-radius:
|
|
4625
|
+
width: 12px;
|
|
4626
|
+
height: 6px;
|
|
4627
|
+
border-radius: 2px;
|
|
4593
4628
|
flex-shrink: 0;
|
|
4594
4629
|
}
|
|
4595
4630
|
.status-verified {
|
|
@@ -4609,7 +4644,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4609
4644
|
font-size: 10px;
|
|
4610
4645
|
font-weight: 600;
|
|
4611
4646
|
text-transform: uppercase;
|
|
4612
|
-
letter-spacing: 0.
|
|
4647
|
+
letter-spacing: 0.05em;
|
|
4613
4648
|
padding: 1px 6px;
|
|
4614
4649
|
border-radius: 4px;
|
|
4615
4650
|
flex-shrink: 0;
|
|
@@ -4656,7 +4691,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4656
4691
|
font-size: 10px;
|
|
4657
4692
|
font-weight: 600;
|
|
4658
4693
|
text-transform: uppercase;
|
|
4659
|
-
letter-spacing: 0.
|
|
4694
|
+
letter-spacing: 0.05em;
|
|
4660
4695
|
background: #92400e;
|
|
4661
4696
|
color: #fbbf24;
|
|
4662
4697
|
flex-shrink: 0;
|
|
@@ -4678,7 +4713,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4678
4713
|
}
|
|
4679
4714
|
.waiver-btn:hover {
|
|
4680
4715
|
background: var(--loki-bg-hover, #f0f0f3);
|
|
4681
|
-
color: var(--loki-text-primary, #
|
|
4716
|
+
color: var(--loki-text-primary, #201515);
|
|
4682
4717
|
}
|
|
4683
4718
|
.waiver-btn-unwaive {
|
|
4684
4719
|
border-color: #92400e;
|
|
@@ -4693,7 +4728,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4693
4728
|
.gate-banner {
|
|
4694
4729
|
padding: 10px 14px;
|
|
4695
4730
|
margin-bottom: 16px;
|
|
4696
|
-
border-radius:
|
|
4731
|
+
border-radius: 4px;
|
|
4697
4732
|
font-size: 13px;
|
|
4698
4733
|
font-weight: 600;
|
|
4699
4734
|
}
|
|
@@ -4714,7 +4749,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4714
4749
|
padding: 8px 12px;
|
|
4715
4750
|
background: color-mix(in srgb, var(--loki-status-error, #ef4444) 10%, transparent);
|
|
4716
4751
|
color: var(--loki-status-error, #ef4444);
|
|
4717
|
-
border-radius:
|
|
4752
|
+
border-radius: 4px;
|
|
4718
4753
|
font-size: 12px;
|
|
4719
4754
|
}
|
|
4720
4755
|
`}_getUnwaivedCriticalFailures(){if(!this._checklist?.categories)return[];let t=[];for(let e of this._checklist.categories)for(let a of e.items||[])a.status==="failing"&&a.priority==="critical"&&!this._isItemWaived(a.id)&&t.push(a);return t}_renderGateBanner(){let t=this._getUnwaivedCriticalFailures();return t.length>0?`<div class="gate-banner gate-blocked">COUNCIL GATE: BLOCKED - ${t.length} critical item${t.length!==1?"s":""} must be verified or waived before completion</div>`:'<div class="gate-banner gate-passed">COUNCIL GATE: PASSED - No blocking critical failures</div>'}render(){let t=this.shadowRoot;if(!t)return;let e=this._checklist,a=e&&e.status!=="not_initialized"&&e.categories?.length>0;t.innerHTML=`
|
|
@@ -4758,12 +4793,12 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4758
4793
|
</div>
|
|
4759
4794
|
${a?`<div class="category-body">${this._renderItems(i)}</div>`:""}
|
|
4760
4795
|
</div>
|
|
4761
|
-
`}).join(""):this._renderEmpty()}_renderItems(t){return t?.length?[...t].sort((a,i)=>(ut[a.priority]??2)-(ut[i.priority]??2)).map(a=>{let i=a.status==="verified"?"status-verified":a.status==="failing"?"status-failing":"status-pending",s=["critical","major","minor"].includes(a.priority)?a.priority:"minor",r=
|
|
4796
|
+
`}).join(""):this._renderEmpty()}_renderItems(t){return t?.length?[...t].sort((a,i)=>(ut[a.priority]??2)-(ut[i.priority]??2)).map(a=>{let i=a.status==="verified"?"status-verified":a.status==="failing"?"status-failing":"status-pending",s=["critical","major","minor"].includes(a.priority)?a.priority:"minor",r=Tt[s],o=a.verification||[],l=this._getWaiverForItem(a.id),p=!!l,y=a.status==="failing"&&(s==="critical"||s==="major"),T=p?`<span class="item-waived-badge" title="${this._escapeHtml(l.reason||"No reason provided")}">WAIVED</span>`:"",P="";return y&&(p?P=`<button class="waiver-btn waiver-btn-unwaive" data-unwaive-id="${this._escapeHtml(a.id)}">Unwaive</button>`:P=`<button class="waiver-btn" data-waive-id="${this._escapeHtml(a.id)}">Waive</button>`),`
|
|
4762
4797
|
<div class="item">
|
|
4763
4798
|
<div class="item-status ${i}"></div>
|
|
4764
4799
|
<div class="item-title">${this._escapeHtml(a.title||a.id||"?")}</div>
|
|
4765
4800
|
<span class="item-priority" style="color:${r};border:1px solid ${r}">${s}</span>
|
|
4766
|
-
${
|
|
4801
|
+
${T}
|
|
4767
4802
|
${P}
|
|
4768
4803
|
<div class="verification-dots">
|
|
4769
4804
|
${o.map(R=>`<div class="v-dot ${R.passed===!0?"v-dot-pass":R.passed===!1?"v-dot-fail":"v-dot-pending"}" title="${this._escapeHtml(R.type||"")}"></div>`).join("")}
|
|
@@ -4778,7 +4813,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4778
4813
|
.app-status {
|
|
4779
4814
|
padding: 16px;
|
|
4780
4815
|
font-family: var(--loki-font-family, system-ui, -apple-system, sans-serif);
|
|
4781
|
-
color: var(--loki-text-primary, #
|
|
4816
|
+
color: var(--loki-text-primary, #201515);
|
|
4782
4817
|
}
|
|
4783
4818
|
.header {
|
|
4784
4819
|
display: flex;
|
|
@@ -4797,11 +4832,11 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4797
4832
|
margin: 0;
|
|
4798
4833
|
}
|
|
4799
4834
|
|
|
4800
|
-
/* Status
|
|
4835
|
+
/* Status indicator */
|
|
4801
4836
|
.status-dot {
|
|
4802
|
-
width:
|
|
4803
|
-
height:
|
|
4804
|
-
border-radius:
|
|
4837
|
+
width: 12px;
|
|
4838
|
+
height: 6px;
|
|
4839
|
+
border-radius: 2px;
|
|
4805
4840
|
flex-shrink: 0;
|
|
4806
4841
|
}
|
|
4807
4842
|
.status-dot.pulse {
|
|
@@ -4817,7 +4852,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4817
4852
|
align-items: center;
|
|
4818
4853
|
gap: 6px;
|
|
4819
4854
|
padding: 2px 10px;
|
|
4820
|
-
border-radius:
|
|
4855
|
+
border-radius: 4px;
|
|
4821
4856
|
font-size: 12px;
|
|
4822
4857
|
font-weight: 500;
|
|
4823
4858
|
}
|
|
@@ -4826,7 +4861,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4826
4861
|
.status-card {
|
|
4827
4862
|
background: var(--loki-bg-card, #ffffff);
|
|
4828
4863
|
border: 1px solid var(--loki-border, #e4e4e7);
|
|
4829
|
-
border-radius:
|
|
4864
|
+
border-radius: 5px;
|
|
4830
4865
|
padding: 14px;
|
|
4831
4866
|
margin-bottom: 12px;
|
|
4832
4867
|
}
|
|
@@ -4844,7 +4879,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4844
4879
|
font-weight: 500;
|
|
4845
4880
|
}
|
|
4846
4881
|
.status-value a {
|
|
4847
|
-
color: var(--loki-accent, #
|
|
4882
|
+
color: var(--loki-accent, #553DE9);
|
|
4848
4883
|
text-decoration: none;
|
|
4849
4884
|
}
|
|
4850
4885
|
.status-value a:hover {
|
|
@@ -4864,7 +4899,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4864
4899
|
.log-area {
|
|
4865
4900
|
background: var(--loki-bg-tertiary, #1a1a2e);
|
|
4866
4901
|
border: 1px solid var(--loki-border, #e4e4e7);
|
|
4867
|
-
border-radius:
|
|
4902
|
+
border-radius: 4px;
|
|
4868
4903
|
padding: 10px;
|
|
4869
4904
|
max-height: 300px;
|
|
4870
4905
|
overflow-y: auto;
|
|
@@ -4887,13 +4922,13 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4887
4922
|
}
|
|
4888
4923
|
.btn {
|
|
4889
4924
|
padding: 5px 14px;
|
|
4890
|
-
border-radius:
|
|
4925
|
+
border-radius: 4px;
|
|
4891
4926
|
font-size: 12px;
|
|
4892
4927
|
font-weight: 500;
|
|
4893
4928
|
cursor: pointer;
|
|
4894
4929
|
border: 1px solid var(--loki-border, #e4e4e7);
|
|
4895
4930
|
background: var(--loki-bg-secondary, #f4f4f5);
|
|
4896
|
-
color: var(--loki-text-primary, #
|
|
4931
|
+
color: var(--loki-text-primary, #201515);
|
|
4897
4932
|
transition: background 0.15s;
|
|
4898
4933
|
}
|
|
4899
4934
|
.btn:hover {
|
|
@@ -4932,7 +4967,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
4932
4967
|
padding: 8px 12px;
|
|
4933
4968
|
background: color-mix(in srgb, var(--loki-status-error, #ef4444) 10%, transparent);
|
|
4934
4969
|
color: var(--loki-status-error, #ef4444);
|
|
4935
|
-
border-radius:
|
|
4970
|
+
border-radius: 4px;
|
|
4936
4971
|
font-size: 12px;
|
|
4937
4972
|
}
|
|
4938
4973
|
`}render(){let t=this.shadowRoot;if(!t)return;let e=this._status,a=e&&e.status&&e.status!=="not_initialized";t.innerHTML=`
|
|
@@ -5000,7 +5035,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5000
5035
|
<p>App runner not started</p>
|
|
5001
5036
|
<p class="hint">App runner will start after the first successful build iteration.</p>
|
|
5002
5037
|
</div>
|
|
5003
|
-
`}_attachEventListeners(){let t=this.shadowRoot;if(!t)return;let e=t.querySelector('[data-action="restart"]'),a=t.querySelector('[data-action="stop"]');e&&e.addEventListener("click",()=>this._handleRestart()),a&&a.addEventListener("click",()=>this._handleStop())}_escapeHtml(t){return t?String(t).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}};customElements.define("loki-app-status",J);var
|
|
5038
|
+
`}_attachEventListeners(){let t=this.shadowRoot;if(!t)return;let e=t.querySelector('[data-action="restart"]'),a=t.querySelector('[data-action="stop"]');e&&e.addEventListener("click",()=>this._handleRestart()),a&&a.addEventListener("click",()=>this._handleStop())}_escapeHtml(t){return t?String(t).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}};customElements.define("loki-app-status",J);var St={opus:{input:5,output:25,label:"Opus 4.6",provider:"claude"},sonnet:{input:3,output:15,label:"Sonnet 4.5",provider:"claude"},haiku:{input:1,output:5,label:"Haiku 4.5",provider:"claude"},"gpt-5.3-codex":{input:1.5,output:12,label:"GPT-5.3 Codex",provider:"codex"},"gemini-3-pro":{input:1.25,output:10,label:"Gemini 3 Pro",provider:"gemini"},"gemini-3-flash":{input:.1,output:.4,label:"Gemini 3 Flash",provider:"gemini"}},K=class extends c{static get observedAttributes(){return["api-url","theme"]}constructor(){super(),this._data={total_input_tokens:0,total_output_tokens:0,estimated_cost_usd:0,by_phase:{},by_model:{},budget_limit:null,budget_used:0,budget_remaining:null,connected:!1},this._api=null,this._pollInterval=null,this._modelPricing={...St}}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadPricing(),this._loadCost(),this._startPolling()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling()}attributeChangedCallback(t,e,a){e!==a&&(t==="api-url"&&this._api&&(this._api.baseUrl=a,this._loadCost()),t==="theme"&&this._applyTheme())}_setupApi(){let t=this.getAttribute("api-url")||window.location.origin;this._api=u({baseUrl:t})}async _loadPricing(){try{let t=await this._api.getPricing();if(t&&t.models){let e={};for(let[a,i]of Object.entries(t.models))e[a]={input:i.input,output:i.output,label:i.label||a,provider:i.provider||"unknown"};this._modelPricing=e,this._pricingSource=t.source||"api",this._pricingDate=t.updated||"",this._activeProvider=t.provider||"claude",this.render()}}catch{}}async _loadCost(){try{let t=await this._api.getCost();this._updateFromCost(t)}catch{this._data.connected=!1,this.render()}}_updateFromCost(t){t&&(this._data={...this._data,connected:!0,total_input_tokens:t.total_input_tokens||0,total_output_tokens:t.total_output_tokens||0,estimated_cost_usd:t.estimated_cost_usd||0,by_phase:t.by_phase||{},by_model:t.by_model||{},budget_limit:t.budget_limit,budget_used:t.budget_used||0,budget_remaining:t.budget_remaining},this.render())}_startPolling(){this._pollInterval=setInterval(async()=>{try{let t=await this._api.getCost();this._updateFromCost(t)}catch{this._data.connected=!1,this.render()}},5e3),this._visibilityHandler=()=>{document.hidden?this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null):this._pollInterval||(this._loadCost(),this._pollInterval=setInterval(async()=>{try{let t=await this._api.getCost();this._updateFromCost(t)}catch{this._data.connected=!1,this.render()}},5e3))},document.addEventListener("visibilitychange",this._visibilityHandler)}_stopPolling(){this._pollInterval&&(clearInterval(this._pollInterval),this._pollInterval=null),this._visibilityHandler&&(document.removeEventListener("visibilitychange",this._visibilityHandler),this._visibilityHandler=null)}_formatTokens(t){return!t||t===0?"0":t>=1e6?(t/1e6).toFixed(2)+"M":t>=1e3?(t/1e3).toFixed(1)+"K":String(t)}_formatUSD(t){return!t||t===0?"$0.00":t<.01?"<$0.01":"$"+t.toFixed(2)}_getBudgetPercent(){return!this._data.budget_limit||this._data.budget_limit<=0?0:Math.min(100,this._data.budget_used/this._data.budget_limit*100)}_getBudgetStatusClass(){let t=this._getBudgetPercent();return t>=90?"critical":t>=70?"warning":"ok"}_renderPhaseRows(){let t=this._data.by_phase;return!t||Object.keys(t).length===0?'<tr><td colspan="4" class="empty-cell">No phase data yet</td></tr>':Object.entries(t).map(([e,a])=>{let i=a.input_tokens||0,s=a.output_tokens||0,r=a.cost_usd||0;return`
|
|
5004
5039
|
<tr>
|
|
5005
5040
|
<td class="phase-name">${this._escapeHTML(e)}</td>
|
|
5006
5041
|
<td class="mono-cell">${this._formatTokens(i)}</td>
|
|
@@ -5065,7 +5100,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5065
5100
|
.summary-card {
|
|
5066
5101
|
background: var(--loki-bg-card);
|
|
5067
5102
|
border: 1px solid var(--loki-border);
|
|
5068
|
-
border-radius:
|
|
5103
|
+
border-radius: 5px;
|
|
5069
5104
|
padding: 14px 16px;
|
|
5070
5105
|
transition: all var(--loki-transition);
|
|
5071
5106
|
}
|
|
@@ -5078,7 +5113,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5078
5113
|
font-size: 10px;
|
|
5079
5114
|
font-weight: 600;
|
|
5080
5115
|
text-transform: uppercase;
|
|
5081
|
-
letter-spacing: 0.
|
|
5116
|
+
letter-spacing: 0.05em;
|
|
5082
5117
|
color: var(--loki-text-muted);
|
|
5083
5118
|
margin-bottom: 6px;
|
|
5084
5119
|
}
|
|
@@ -5087,7 +5122,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5087
5122
|
font-size: 22px;
|
|
5088
5123
|
font-weight: 600;
|
|
5089
5124
|
font-family: 'JetBrains Mono', monospace;
|
|
5090
|
-
color: var(--loki-
|
|
5125
|
+
color: var(--loki-accent);
|
|
5091
5126
|
line-height: 1.2;
|
|
5092
5127
|
}
|
|
5093
5128
|
|
|
@@ -5121,7 +5156,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5121
5156
|
font-size: 12px;
|
|
5122
5157
|
font-weight: 600;
|
|
5123
5158
|
text-transform: uppercase;
|
|
5124
|
-
letter-spacing: 0.
|
|
5159
|
+
letter-spacing: 0.05em;
|
|
5125
5160
|
color: var(--loki-text-muted);
|
|
5126
5161
|
}
|
|
5127
5162
|
|
|
@@ -5129,7 +5164,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5129
5164
|
.data-table-container {
|
|
5130
5165
|
background: var(--loki-bg-card);
|
|
5131
5166
|
border: 1px solid var(--loki-border);
|
|
5132
|
-
border-radius:
|
|
5167
|
+
border-radius: 5px;
|
|
5133
5168
|
padding: 16px;
|
|
5134
5169
|
overflow-x: auto;
|
|
5135
5170
|
}
|
|
@@ -5146,7 +5181,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5146
5181
|
font-size: 10px;
|
|
5147
5182
|
font-weight: 600;
|
|
5148
5183
|
text-transform: uppercase;
|
|
5149
|
-
letter-spacing: 0.
|
|
5184
|
+
letter-spacing: 0.05em;
|
|
5150
5185
|
color: var(--loki-text-muted);
|
|
5151
5186
|
border-bottom: 1px solid var(--loki-border);
|
|
5152
5187
|
}
|
|
@@ -5192,7 +5227,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5192
5227
|
.budget-section {
|
|
5193
5228
|
background: var(--loki-bg-card);
|
|
5194
5229
|
border: 1px solid var(--loki-border);
|
|
5195
|
-
border-radius:
|
|
5230
|
+
border-radius: 5px;
|
|
5196
5231
|
padding: 16px;
|
|
5197
5232
|
}
|
|
5198
5233
|
|
|
@@ -5254,7 +5289,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5254
5289
|
.pricing-ref {
|
|
5255
5290
|
background: var(--loki-bg-card);
|
|
5256
5291
|
border: 1px solid var(--loki-border);
|
|
5257
|
-
border-radius:
|
|
5292
|
+
border-radius: 5px;
|
|
5258
5293
|
padding: 16px;
|
|
5259
5294
|
}
|
|
5260
5295
|
|
|
@@ -5267,7 +5302,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5267
5302
|
|
|
5268
5303
|
.pricing-item {
|
|
5269
5304
|
background: var(--loki-bg-tertiary);
|
|
5270
|
-
border-radius:
|
|
5305
|
+
border-radius: 5px;
|
|
5271
5306
|
padding: 10px 12px;
|
|
5272
5307
|
}
|
|
5273
5308
|
|
|
@@ -5497,7 +5532,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5497
5532
|
font-size: 11px;
|
|
5498
5533
|
font-weight: 600;
|
|
5499
5534
|
padding: 2px 8px;
|
|
5500
|
-
border-radius:
|
|
5535
|
+
border-radius: 5px;
|
|
5501
5536
|
background: var(--loki-accent-muted);
|
|
5502
5537
|
color: var(--loki-accent);
|
|
5503
5538
|
}
|
|
@@ -5505,7 +5540,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5505
5540
|
.btn {
|
|
5506
5541
|
padding: 6px 14px;
|
|
5507
5542
|
border: 1px solid var(--loki-border);
|
|
5508
|
-
border-radius:
|
|
5543
|
+
border-radius: 4px;
|
|
5509
5544
|
background: var(--loki-bg-tertiary);
|
|
5510
5545
|
color: var(--loki-text-primary);
|
|
5511
5546
|
cursor: pointer;
|
|
@@ -5556,7 +5591,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5556
5591
|
padding: 12px;
|
|
5557
5592
|
background: var(--loki-bg-card);
|
|
5558
5593
|
border: 1px solid var(--loki-border);
|
|
5559
|
-
border-radius:
|
|
5594
|
+
border-radius: 5px;
|
|
5560
5595
|
}
|
|
5561
5596
|
|
|
5562
5597
|
.form-input {
|
|
@@ -5564,7 +5599,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5564
5599
|
padding: 8px 12px;
|
|
5565
5600
|
background: var(--loki-bg-primary);
|
|
5566
5601
|
border: 1px solid var(--loki-border);
|
|
5567
|
-
border-radius:
|
|
5602
|
+
border-radius: 4px;
|
|
5568
5603
|
color: var(--loki-text-primary);
|
|
5569
5604
|
font-size: 13px;
|
|
5570
5605
|
font-family: inherit;
|
|
@@ -5594,7 +5629,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5594
5629
|
.checkpoint-card {
|
|
5595
5630
|
background: var(--loki-bg-card);
|
|
5596
5631
|
border: 1px solid var(--loki-border);
|
|
5597
|
-
border-radius:
|
|
5632
|
+
border-radius: 5px;
|
|
5598
5633
|
padding: 12px 16px;
|
|
5599
5634
|
transition: all 0.15s ease;
|
|
5600
5635
|
}
|
|
@@ -5686,7 +5721,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5686
5721
|
padding: 10px 14px;
|
|
5687
5722
|
background: var(--loki-red-muted);
|
|
5688
5723
|
border: 1px solid var(--loki-red-muted);
|
|
5689
|
-
border-radius:
|
|
5724
|
+
border-radius: 4px;
|
|
5690
5725
|
color: var(--loki-red);
|
|
5691
5726
|
font-size: 12px;
|
|
5692
5727
|
}
|
|
@@ -5803,11 +5838,11 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5803
5838
|
<div class="legend-item"><span class="legend-swatch swatch-cache-read"></span> Cache Read</div>
|
|
5804
5839
|
<div class="legend-item"><span class="legend-swatch swatch-cache-create"></span> Cache Creation</div>
|
|
5805
5840
|
</div>
|
|
5806
|
-
`,i="";for(let s of t){let r=s.input_tokens||0,o=s.output_tokens||0,l=s.cache_read_tokens||0,p=s.cache_creation_tokens||0,y=r+o+l+p,
|
|
5841
|
+
`,i="";for(let s of t){let r=s.input_tokens||0,o=s.output_tokens||0,l=s.cache_read_tokens||0,p=s.cache_creation_tokens||0,y=r+o+l+p,T=e>0?r/e*100:0,P=e>0?o/e*100:0,R=e>0?l/e*100:0,rt=e>0?p/e*100:0;i+=`
|
|
5807
5842
|
<div class="breakdown-row">
|
|
5808
5843
|
<div class="breakdown-iter">#${s.iteration}</div>
|
|
5809
5844
|
<div class="breakdown-bar-container">
|
|
5810
|
-
<div class="breakdown-bar bar-input" style="width: ${
|
|
5845
|
+
<div class="breakdown-bar bar-input" style="width: ${T.toFixed(1)}%"></div>
|
|
5811
5846
|
<div class="breakdown-bar bar-output" style="width: ${P.toFixed(1)}%"></div>
|
|
5812
5847
|
<div class="breakdown-bar bar-cache-read" style="width: ${R.toFixed(1)}%"></div>
|
|
5813
5848
|
<div class="breakdown-bar bar-cache-create" style="width: ${rt.toFixed(1)}%"></div>
|
|
@@ -5847,7 +5882,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5847
5882
|
gap: 2px;
|
|
5848
5883
|
margin-bottom: 16px;
|
|
5849
5884
|
background: var(--loki-bg-tertiary);
|
|
5850
|
-
border-radius:
|
|
5885
|
+
border-radius: 5px;
|
|
5851
5886
|
padding: 2px;
|
|
5852
5887
|
}
|
|
5853
5888
|
|
|
@@ -5858,7 +5893,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5858
5893
|
background: none;
|
|
5859
5894
|
color: var(--loki-text-muted);
|
|
5860
5895
|
cursor: pointer;
|
|
5861
|
-
border-radius:
|
|
5896
|
+
border-radius: 4px;
|
|
5862
5897
|
font-size: 12px;
|
|
5863
5898
|
font-weight: 500;
|
|
5864
5899
|
transition: all 0.2s;
|
|
@@ -5870,9 +5905,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5870
5905
|
}
|
|
5871
5906
|
|
|
5872
5907
|
.tab.active {
|
|
5873
|
-
background: var(--loki-
|
|
5874
|
-
color:
|
|
5875
|
-
box-shadow: 0 1px 2px rgba(0,0,0,0.1);
|
|
5908
|
+
background: var(--loki-accent);
|
|
5909
|
+
color: white;
|
|
5876
5910
|
}
|
|
5877
5911
|
|
|
5878
5912
|
/* Summary Cards */
|
|
@@ -5885,7 +5919,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5885
5919
|
.summary-card {
|
|
5886
5920
|
background: var(--loki-bg-card);
|
|
5887
5921
|
border: 1px solid var(--loki-border);
|
|
5888
|
-
border-radius:
|
|
5922
|
+
border-radius: 5px;
|
|
5889
5923
|
padding: 14px 16px;
|
|
5890
5924
|
transition: all var(--loki-transition);
|
|
5891
5925
|
}
|
|
@@ -5898,7 +5932,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5898
5932
|
font-size: 10px;
|
|
5899
5933
|
font-weight: 600;
|
|
5900
5934
|
text-transform: uppercase;
|
|
5901
|
-
letter-spacing: 0.
|
|
5935
|
+
letter-spacing: 0.05em;
|
|
5902
5936
|
color: var(--loki-text-muted);
|
|
5903
5937
|
margin-bottom: 6px;
|
|
5904
5938
|
}
|
|
@@ -5907,7 +5941,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5907
5941
|
font-size: 22px;
|
|
5908
5942
|
font-weight: 600;
|
|
5909
5943
|
font-family: 'JetBrains Mono', monospace;
|
|
5910
|
-
color: var(--loki-
|
|
5944
|
+
color: var(--loki-accent);
|
|
5911
5945
|
line-height: 1.2;
|
|
5912
5946
|
}
|
|
5913
5947
|
|
|
@@ -5941,7 +5975,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5941
5975
|
font-size: 12px;
|
|
5942
5976
|
font-weight: 600;
|
|
5943
5977
|
text-transform: uppercase;
|
|
5944
|
-
letter-spacing: 0.
|
|
5978
|
+
letter-spacing: 0.05em;
|
|
5945
5979
|
color: var(--loki-text-muted);
|
|
5946
5980
|
}
|
|
5947
5981
|
|
|
@@ -5970,7 +6004,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
5970
6004
|
.cache-info {
|
|
5971
6005
|
background: var(--loki-bg-card);
|
|
5972
6006
|
border: 1px solid var(--loki-border);
|
|
5973
|
-
border-radius:
|
|
6007
|
+
border-radius: 5px;
|
|
5974
6008
|
padding: 16px;
|
|
5975
6009
|
}
|
|
5976
6010
|
|
|
@@ -6014,7 +6048,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6014
6048
|
font-size: 10px;
|
|
6015
6049
|
font-weight: 600;
|
|
6016
6050
|
text-transform: uppercase;
|
|
6017
|
-
letter-spacing: 0.
|
|
6051
|
+
letter-spacing: 0.05em;
|
|
6018
6052
|
color: var(--loki-text-muted);
|
|
6019
6053
|
border-bottom: 1px solid var(--loki-border);
|
|
6020
6054
|
margin-bottom: 4px;
|
|
@@ -6026,7 +6060,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6026
6060
|
gap: 8px;
|
|
6027
6061
|
align-items: center;
|
|
6028
6062
|
padding: 6px 8px;
|
|
6029
|
-
border-radius:
|
|
6063
|
+
border-radius: 4px;
|
|
6030
6064
|
transition: background 0.15s;
|
|
6031
6065
|
}
|
|
6032
6066
|
|
|
@@ -6094,7 +6128,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6094
6128
|
font-size: 10px;
|
|
6095
6129
|
font-weight: 600;
|
|
6096
6130
|
text-transform: uppercase;
|
|
6097
|
-
letter-spacing: 0.
|
|
6131
|
+
letter-spacing: 0.05em;
|
|
6098
6132
|
color: var(--loki-yellow);
|
|
6099
6133
|
white-space: nowrap;
|
|
6100
6134
|
}
|
|
@@ -6114,7 +6148,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6114
6148
|
padding: 10px 12px;
|
|
6115
6149
|
background: var(--loki-bg-card);
|
|
6116
6150
|
border: 1px solid var(--loki-border);
|
|
6117
|
-
border-radius:
|
|
6151
|
+
border-radius: 5px;
|
|
6118
6152
|
}
|
|
6119
6153
|
|
|
6120
6154
|
.legend-item {
|
|
@@ -6143,7 +6177,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6143
6177
|
gap: 8px;
|
|
6144
6178
|
align-items: center;
|
|
6145
6179
|
padding: 6px 8px;
|
|
6146
|
-
border-radius:
|
|
6180
|
+
border-radius: 4px;
|
|
6147
6181
|
transition: background 0.15s;
|
|
6148
6182
|
}
|
|
6149
6183
|
|
|
@@ -6273,7 +6307,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6273
6307
|
gap: 2px;
|
|
6274
6308
|
margin-bottom: 16px;
|
|
6275
6309
|
background: var(--loki-bg-tertiary);
|
|
6276
|
-
border-radius:
|
|
6310
|
+
border-radius: 5px;
|
|
6277
6311
|
padding: 2px;
|
|
6278
6312
|
}
|
|
6279
6313
|
|
|
@@ -6284,7 +6318,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6284
6318
|
background: none;
|
|
6285
6319
|
color: var(--loki-text-muted);
|
|
6286
6320
|
cursor: pointer;
|
|
6287
|
-
border-radius:
|
|
6321
|
+
border-radius: 4px;
|
|
6288
6322
|
font-size: 12px;
|
|
6289
6323
|
font-weight: 500;
|
|
6290
6324
|
transition: all 0.2s;
|
|
@@ -6296,9 +6330,8 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6296
6330
|
}
|
|
6297
6331
|
|
|
6298
6332
|
.tab.active {
|
|
6299
|
-
background: var(--loki-
|
|
6300
|
-
color:
|
|
6301
|
-
box-shadow: 0 1px 2px rgba(0,0,0,0.1);
|
|
6333
|
+
background: var(--loki-accent);
|
|
6334
|
+
color: white;
|
|
6302
6335
|
}
|
|
6303
6336
|
|
|
6304
6337
|
/* Summary bar */
|
|
@@ -6319,7 +6352,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6319
6352
|
.summary-card {
|
|
6320
6353
|
background: var(--loki-bg-card);
|
|
6321
6354
|
border: 1px solid var(--loki-border);
|
|
6322
|
-
border-radius:
|
|
6355
|
+
border-radius: 5px;
|
|
6323
6356
|
padding: 14px 16px;
|
|
6324
6357
|
transition: all var(--loki-transition);
|
|
6325
6358
|
}
|
|
@@ -6332,7 +6365,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6332
6365
|
font-size: 10px;
|
|
6333
6366
|
font-weight: 600;
|
|
6334
6367
|
text-transform: uppercase;
|
|
6335
|
-
letter-spacing: 0.
|
|
6368
|
+
letter-spacing: 0.05em;
|
|
6336
6369
|
color: var(--loki-text-muted);
|
|
6337
6370
|
margin-bottom: 6px;
|
|
6338
6371
|
}
|
|
@@ -6341,7 +6374,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6341
6374
|
font-size: 22px;
|
|
6342
6375
|
font-weight: 600;
|
|
6343
6376
|
font-family: 'JetBrains Mono', monospace;
|
|
6344
|
-
color: var(--loki-
|
|
6377
|
+
color: var(--loki-accent);
|
|
6345
6378
|
line-height: 1.2;
|
|
6346
6379
|
}
|
|
6347
6380
|
|
|
@@ -6350,7 +6383,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6350
6383
|
padding: 8px 16px;
|
|
6351
6384
|
background: var(--loki-bg-card);
|
|
6352
6385
|
border: 1px solid var(--loki-border);
|
|
6353
|
-
border-radius:
|
|
6386
|
+
border-radius: 5px;
|
|
6354
6387
|
color: var(--loki-text-primary);
|
|
6355
6388
|
font-size: 12px;
|
|
6356
6389
|
font-weight: 500;
|
|
@@ -6370,7 +6403,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6370
6403
|
.notif-list {
|
|
6371
6404
|
background: var(--loki-bg-card);
|
|
6372
6405
|
border: 1px solid var(--loki-border);
|
|
6373
|
-
border-radius:
|
|
6406
|
+
border-radius: 5px;
|
|
6374
6407
|
overflow: hidden;
|
|
6375
6408
|
}
|
|
6376
6409
|
|
|
@@ -6396,9 +6429,9 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6396
6429
|
}
|
|
6397
6430
|
|
|
6398
6431
|
.severity-dot {
|
|
6399
|
-
width:
|
|
6400
|
-
height:
|
|
6401
|
-
border-radius:
|
|
6432
|
+
width: 12px;
|
|
6433
|
+
height: 6px;
|
|
6434
|
+
border-radius: 2px;
|
|
6402
6435
|
flex-shrink: 0;
|
|
6403
6436
|
}
|
|
6404
6437
|
|
|
@@ -6423,7 +6456,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6423
6456
|
color: var(--loki-text-muted);
|
|
6424
6457
|
background: var(--loki-bg-tertiary);
|
|
6425
6458
|
padding: 2px 8px;
|
|
6426
|
-
border-radius:
|
|
6459
|
+
border-radius: 5px;
|
|
6427
6460
|
white-space: nowrap;
|
|
6428
6461
|
}
|
|
6429
6462
|
|
|
@@ -6431,7 +6464,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6431
6464
|
padding: 4px 10px;
|
|
6432
6465
|
background: none;
|
|
6433
6466
|
border: 1px solid var(--loki-border);
|
|
6434
|
-
border-radius:
|
|
6467
|
+
border-radius: 4px;
|
|
6435
6468
|
color: var(--loki-text-secondary);
|
|
6436
6469
|
font-size: 11px;
|
|
6437
6470
|
cursor: pointer;
|
|
@@ -6449,7 +6482,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6449
6482
|
.trigger-list {
|
|
6450
6483
|
background: var(--loki-bg-card);
|
|
6451
6484
|
border: 1px solid var(--loki-border);
|
|
6452
|
-
border-radius:
|
|
6485
|
+
border-radius: 5px;
|
|
6453
6486
|
overflow: hidden;
|
|
6454
6487
|
}
|
|
6455
6488
|
|
|
@@ -6482,7 +6515,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6482
6515
|
text-transform: uppercase;
|
|
6483
6516
|
letter-spacing: 0.3px;
|
|
6484
6517
|
padding: 3px 8px;
|
|
6485
|
-
border-radius:
|
|
6518
|
+
border-radius: 5px;
|
|
6486
6519
|
white-space: nowrap;
|
|
6487
6520
|
}
|
|
6488
6521
|
|
|
@@ -6520,7 +6553,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6520
6553
|
position: absolute;
|
|
6521
6554
|
inset: 0;
|
|
6522
6555
|
background: var(--loki-bg-tertiary);
|
|
6523
|
-
border-radius:
|
|
6556
|
+
border-radius: 5px;
|
|
6524
6557
|
cursor: pointer;
|
|
6525
6558
|
transition: 0.2s;
|
|
6526
6559
|
}
|
|
@@ -6554,7 +6587,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6554
6587
|
font-size: 13px;
|
|
6555
6588
|
background: var(--loki-bg-card);
|
|
6556
6589
|
border: 1px solid var(--loki-border);
|
|
6557
|
-
border-radius:
|
|
6590
|
+
border-radius: 5px;
|
|
6558
6591
|
}
|
|
6559
6592
|
|
|
6560
6593
|
/* Offline notice */
|
|
@@ -6590,7 +6623,7 @@ var LokiDashboard=(()=>{var X=Object.defineProperty;var gt=Object.getOwnProperty
|
|
|
6590
6623
|
</div>
|
|
6591
6624
|
`:""}
|
|
6592
6625
|
</div>
|
|
6593
|
-
`,this._bindEvents()}};customElements.get("loki-notification-center")||customElements.define("loki-notification-center",W);var At="1.3.0";function Lt(d={}){return d.theme?g.setTheme(d.theme):d.autoDetectContext!==!1?g.init():A.init(),d.apiUrl&&u({baseUrl:d.apiUrl}),{theme:g.getTheme(),context:g.detectContext()}}return _t(
|
|
6626
|
+
`,this._bindEvents()}};customElements.get("loki-notification-center")||customElements.define("loki-notification-center",W);var At="1.3.0";function Lt(d={}){return d.theme?g.setTheme(d.theme):d.autoDetectContext!==!1?g.init():A.init(),d.apiUrl&&u({baseUrl:d.apiUrl}),{theme:g.getTheme(),context:g.detectContext()}}return _t(Dt);})();
|
|
6594
6627
|
|
|
6595
6628
|
|
|
6596
6629
|
// Initialize dashboard when DOM is ready
|
|
@@ -6696,13 +6729,19 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
|
6696
6729
|
var mainContent = document.getElementById('main-content');
|
|
6697
6730
|
|
|
6698
6731
|
function switchSection(sectionId) {
|
|
6732
|
+
// Hide all section pages, show only the active one
|
|
6733
|
+
var allPages = document.querySelectorAll('.section-page');
|
|
6734
|
+
allPages.forEach(function(page) { page.classList.remove('active'); });
|
|
6699
6735
|
var pageEl = document.getElementById('page-' + sectionId);
|
|
6700
6736
|
if (pageEl) {
|
|
6701
|
-
pageEl.
|
|
6737
|
+
pageEl.classList.add('active');
|
|
6702
6738
|
}
|
|
6739
|
+
// Update nav active state
|
|
6703
6740
|
navLinks.forEach(function(link) { link.classList.remove('active'); });
|
|
6704
6741
|
var navEl = document.querySelector('.nav-link[data-section="' + sectionId + '"]');
|
|
6705
6742
|
if (navEl) navEl.classList.add('active');
|
|
6743
|
+
// Scroll main content to top on section switch
|
|
6744
|
+
mainContent.scrollTop = 0;
|
|
6706
6745
|
localStorage.setItem('loki-active-section', sectionId);
|
|
6707
6746
|
}
|
|
6708
6747
|
|
|
@@ -6716,26 +6755,14 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
|
6716
6755
|
});
|
|
6717
6756
|
});
|
|
6718
6757
|
|
|
6719
|
-
//
|
|
6720
|
-
|
|
6721
|
-
var observer = new IntersectionObserver(function(entries) {
|
|
6722
|
-
entries.forEach(function(entry) {
|
|
6723
|
-
if (entry.isIntersecting && entry.intersectionRatio > 0.3) {
|
|
6724
|
-
var sectionId = entry.target.id.replace('page-', '');
|
|
6725
|
-
navLinks.forEach(function(link) { link.classList.remove('active'); });
|
|
6726
|
-
var navEl = document.querySelector('.nav-link[data-section="' + sectionId + '"]');
|
|
6727
|
-
if (navEl) navEl.classList.add('active');
|
|
6728
|
-
}
|
|
6729
|
-
});
|
|
6730
|
-
}, { root: mainContent, threshold: 0.3 });
|
|
6731
|
-
|
|
6732
|
-
sectionPages.forEach(function(page) { observer.observe(page); });
|
|
6758
|
+
// Show the default section (overview) on load
|
|
6759
|
+
switchSection('overview');
|
|
6733
6760
|
|
|
6734
6761
|
// Keyboard shortcuts: Cmd/Ctrl + 1-7
|
|
6735
6762
|
document.addEventListener('keydown', function(e) {
|
|
6736
6763
|
if ((e.metaKey || e.ctrlKey) && ((e.key >= '1' && e.key <= '9') || e.key === '0')) {
|
|
6737
6764
|
e.preventDefault();
|
|
6738
|
-
var sections = ['overview', '
|
|
6765
|
+
var sections = ['overview', 'insights', 'prd-checklist', 'app-runner', 'council', 'cost', 'checkpoint', 'context', 'notifications'];
|
|
6739
6766
|
var idx = e.key === '0' ? 9 : parseInt(e.key) - 1;
|
|
6740
6767
|
if (idx < sections.length) switchSection(sections[idx]);
|
|
6741
6768
|
}
|
|
@@ -6776,7 +6803,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
|
6776
6803
|
// Skip if modifier keys are held (let browser defaults work)
|
|
6777
6804
|
if (e.metaKey || e.ctrlKey || e.altKey) return;
|
|
6778
6805
|
|
|
6779
|
-
var sections = ['overview', '
|
|
6806
|
+
var sections = ['overview', 'insights', 'prd-checklist', 'app-runner', 'council', 'cost', 'checkpoint', 'context', 'notifications'];
|
|
6780
6807
|
|
|
6781
6808
|
switch (e.key) {
|
|
6782
6809
|
// Section navigation: 1-9, 0
|
|
@@ -6855,10 +6882,10 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
|
6855
6882
|
}
|
|
6856
6883
|
});
|
|
6857
6884
|
|
|
6858
|
-
// Restore last section from localStorage
|
|
6885
|
+
// Restore last section from localStorage (overrides default overview)
|
|
6859
6886
|
var savedSection = localStorage.getItem('loki-active-section');
|
|
6860
6887
|
if (savedSection) {
|
|
6861
|
-
|
|
6888
|
+
switchSection(savedSection);
|
|
6862
6889
|
}
|
|
6863
6890
|
|
|
6864
6891
|
// Add initial log entry and verify connection
|