standkit 0.3.7__py3-none-any.whl
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.
- standkit/__init__.py +11 -0
- standkit/health.py +163 -0
- standkit/lifecycle.py +191 -0
- standkit/logs.py +221 -0
- standkit/models.py +211 -0
- standkit/platform.py +174 -0
- standkit/registry.py +223 -0
- standkit/secrets.py +144 -0
- standkit-0.3.7.dist-info/METADATA +155 -0
- standkit-0.3.7.dist-info/RECORD +38 -0
- standkit-0.3.7.dist-info/WHEEL +5 -0
- standkit-0.3.7.dist-info/entry_points.txt +4 -0
- standkit-0.3.7.dist-info/licenses/LICENSE +21 -0
- standkit-0.3.7.dist-info/top_level.txt +3 -0
- standkit_agent/__init__.py +9 -0
- standkit_agent/__main__.py +192 -0
- standkit_agent/audit.py +93 -0
- standkit_agent/security.py +300 -0
- standkit_agent/server.py +386 -0
- standkit_hub/__init__.py +13 -0
- standkit_hub/__main__.py +131 -0
- standkit_hub/agent_control.py +216 -0
- standkit_hub/assets/bpmkit-icon.ico +0 -0
- standkit_hub/assets/icon.png +0 -0
- standkit_hub/client.py +159 -0
- standkit_hub/config.py +156 -0
- standkit_hub/logs_browser.py +174 -0
- standkit_hub/redis_min.py +326 -0
- standkit_hub/security.py +146 -0
- standkit_hub/server.py +881 -0
- standkit_hub/shortcut.py +264 -0
- standkit_hub/web/app.js +803 -0
- standkit_hub/web/bpmkit-logo-dark.svg +5 -0
- standkit_hub/web/bpmkit-logo.svg +5 -0
- standkit_hub/web/favicon.png +0 -0
- standkit_hub/web/favicon.svg +4 -0
- standkit_hub/web/index.html +267 -0
- standkit_hub/web/style.css +843 -0
|
@@ -0,0 +1,843 @@
|
|
|
1
|
+
/* Vanilla CSS дашборда standkit — без внешних ресурсов, без сборки. */
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Тема (light/dark) — переключается атрибутом data-theme на <html>
|
|
5
|
+
* (см. app.js::setupTheme). Дефолт (без атрибута/light) — переменные ниже.
|
|
6
|
+
* Тёмная тема переопределяет их в блоке [data-theme="dark"] в конце файла.
|
|
7
|
+
* Всё остальное CSS-правило файла ссылается ТОЛЬКО на переменные — ни одного
|
|
8
|
+
* захардкоженного цвета вне двух этих блоков, иначе тема "протекает".
|
|
9
|
+
*
|
|
10
|
+
* БРЕНД BPMkit: акцентный цвет продукта — оранжевый #f9763d (тот же, что в
|
|
11
|
+
* иконке "k" на тёмном фоне) — единый для обеих тем, минималистичный стиль,
|
|
12
|
+
* без лишних рамок/теней.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
:root {
|
|
16
|
+
--bpmkit-primary: #f9763d;
|
|
17
|
+
--bpmkit-primary-contrast: #ffffff;
|
|
18
|
+
--bpmkit-bg: #f7f7f8;
|
|
19
|
+
--bpmkit-panel-bg: #ffffff;
|
|
20
|
+
--bpmkit-border: #e3e2e0;
|
|
21
|
+
--bpmkit-text: #201f1d;
|
|
22
|
+
--bpmkit-muted: #6b6864;
|
|
23
|
+
--bpmkit-ok: #1f9d55;
|
|
24
|
+
--bpmkit-down: #d84040;
|
|
25
|
+
--bpmkit-unknown: #b98900;
|
|
26
|
+
--bpmkit-skipped: #9aa3b5;
|
|
27
|
+
/* Панель "Текущее состояние" (<pre>) — тёмная в обеих темах (консоль),
|
|
28
|
+
но с отдельными переменными, чтобы тёмная тема могла её отличить от фона. */
|
|
29
|
+
--bpmkit-console-bg: #1e1e1e;
|
|
30
|
+
--bpmkit-console-text: #d7dee8;
|
|
31
|
+
--bpmkit-row-hover: #faf3ee;
|
|
32
|
+
--bpmkit-row-selected: #fdece1;
|
|
33
|
+
--bpmkit-code-bg: #f1efec;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
[data-theme="dark"] {
|
|
37
|
+
--bpmkit-primary: #f9763d;
|
|
38
|
+
--bpmkit-primary-contrast: #ffffff;
|
|
39
|
+
--bpmkit-bg: #1e1e1e;
|
|
40
|
+
--bpmkit-panel-bg: #2b2b2b;
|
|
41
|
+
--bpmkit-border: #3a3a3a;
|
|
42
|
+
--bpmkit-text: #e9e7e4;
|
|
43
|
+
--bpmkit-muted: #a3a09b;
|
|
44
|
+
--bpmkit-ok: #3ecb7a;
|
|
45
|
+
--bpmkit-down: #f06868;
|
|
46
|
+
--bpmkit-unknown: #d6a63a;
|
|
47
|
+
--bpmkit-skipped: #8a877f;
|
|
48
|
+
--bpmkit-console-bg: #141414;
|
|
49
|
+
--bpmkit-console-text: #d7dee8;
|
|
50
|
+
--bpmkit-row-hover: #333029;
|
|
51
|
+
--bpmkit-row-selected: #3d2c1f;
|
|
52
|
+
--bpmkit-code-bg: #262523;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
* {
|
|
56
|
+
box-sizing: border-box;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
body {
|
|
60
|
+
margin: 0;
|
|
61
|
+
font-family: "Segoe UI", Roboto, Arial, sans-serif;
|
|
62
|
+
background: var(--bpmkit-bg);
|
|
63
|
+
color: var(--bpmkit-text);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.topbar {
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: 16px;
|
|
70
|
+
padding: 10px 20px;
|
|
71
|
+
background: var(--bpmkit-panel-bg);
|
|
72
|
+
border-bottom: 1px solid var(--bpmkit-border);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.brand-logo {
|
|
76
|
+
width: 28px;
|
|
77
|
+
height: 28px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.topbar h1 {
|
|
81
|
+
font-size: 18px;
|
|
82
|
+
margin: 0;
|
|
83
|
+
margin-right: auto;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.tabs {
|
|
87
|
+
display: flex;
|
|
88
|
+
gap: 4px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.tab-btn {
|
|
92
|
+
border: none;
|
|
93
|
+
background: transparent;
|
|
94
|
+
padding: 8px 14px;
|
|
95
|
+
cursor: pointer;
|
|
96
|
+
border-radius: 6px;
|
|
97
|
+
color: var(--bpmkit-muted);
|
|
98
|
+
font-size: 14px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.tab-btn.active {
|
|
102
|
+
background: var(--bpmkit-primary);
|
|
103
|
+
color: var(--bpmkit-primary-contrast);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.theme-toggle-btn {
|
|
107
|
+
background: transparent;
|
|
108
|
+
color: var(--bpmkit-text);
|
|
109
|
+
border: 1px solid var(--bpmkit-border);
|
|
110
|
+
border-radius: 6px;
|
|
111
|
+
width: 32px;
|
|
112
|
+
height: 32px;
|
|
113
|
+
padding: 0;
|
|
114
|
+
font-size: 15px;
|
|
115
|
+
line-height: 1;
|
|
116
|
+
cursor: pointer;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.theme-toggle-btn:hover {
|
|
120
|
+
filter: brightness(1.1);
|
|
121
|
+
background: var(--bpmkit-bg);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* --- кнопка "О программе" (topbar) — БЕЗ фона, оранжевая иконка (бренд) --- */
|
|
125
|
+
|
|
126
|
+
.about-btn {
|
|
127
|
+
background: transparent;
|
|
128
|
+
color: var(--bpmkit-primary);
|
|
129
|
+
border: none;
|
|
130
|
+
border-radius: 6px;
|
|
131
|
+
width: 32px;
|
|
132
|
+
height: 32px;
|
|
133
|
+
padding: 0;
|
|
134
|
+
font-size: 17px;
|
|
135
|
+
font-weight: 700;
|
|
136
|
+
line-height: 1;
|
|
137
|
+
cursor: pointer;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.about-btn:hover {
|
|
141
|
+
background: var(--bpmkit-bg);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* --- индикатор связи с хабом (точка + подпись, НЕ похож на меню) --- */
|
|
145
|
+
|
|
146
|
+
.conn-status {
|
|
147
|
+
display: inline-flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
gap: 6px;
|
|
150
|
+
font-size: 12px;
|
|
151
|
+
color: var(--bpmkit-muted);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.conn-status-dot {
|
|
155
|
+
display: inline-block;
|
|
156
|
+
width: 8px;
|
|
157
|
+
height: 8px;
|
|
158
|
+
border-radius: 50%;
|
|
159
|
+
background: var(--bpmkit-skipped);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.conn-status-dot-pending {
|
|
163
|
+
background: var(--bpmkit-skipped);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.conn-status-dot-ok {
|
|
167
|
+
background: var(--bpmkit-ok);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.conn-status-dot-down {
|
|
171
|
+
background: var(--bpmkit-down);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* --- модалка "О программе" --- */
|
|
175
|
+
|
|
176
|
+
.modal-overlay {
|
|
177
|
+
position: fixed;
|
|
178
|
+
inset: 0;
|
|
179
|
+
background: rgba(0, 0, 0, 0.45);
|
|
180
|
+
display: flex;
|
|
181
|
+
align-items: center;
|
|
182
|
+
justify-content: center;
|
|
183
|
+
z-index: 1000;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.modal-overlay[hidden] {
|
|
187
|
+
display: none;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.modal-box {
|
|
191
|
+
width: min(420px, calc(100vw - 32px));
|
|
192
|
+
max-height: calc(100vh - 64px);
|
|
193
|
+
overflow: auto;
|
|
194
|
+
background: var(--bpmkit-panel-bg);
|
|
195
|
+
color: var(--bpmkit-text);
|
|
196
|
+
border: 1px solid var(--bpmkit-border);
|
|
197
|
+
border-radius: 10px;
|
|
198
|
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.16);
|
|
199
|
+
padding: 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.modal-box-confirm {
|
|
203
|
+
width: min(380px, calc(100vw - 32px));
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.modal-header {
|
|
207
|
+
display: flex;
|
|
208
|
+
align-items: center;
|
|
209
|
+
justify-content: space-between;
|
|
210
|
+
padding: 14px 18px;
|
|
211
|
+
border-bottom: 1px solid var(--bpmkit-border);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.modal-header h2 {
|
|
215
|
+
margin: 0;
|
|
216
|
+
font-size: 16px;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.modal-close-btn {
|
|
220
|
+
background: transparent;
|
|
221
|
+
color: var(--bpmkit-muted);
|
|
222
|
+
border: none;
|
|
223
|
+
width: 28px;
|
|
224
|
+
height: 28px;
|
|
225
|
+
border-radius: 6px;
|
|
226
|
+
font-size: 14px;
|
|
227
|
+
cursor: pointer;
|
|
228
|
+
padding: 0;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.modal-close-btn:hover {
|
|
232
|
+
background: var(--bpmkit-bg);
|
|
233
|
+
color: var(--bpmkit-text);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.modal-body {
|
|
237
|
+
padding: 16px 18px;
|
|
238
|
+
font-size: 13px;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.modal-body p {
|
|
242
|
+
margin: 0 0 10px;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.modal-body a {
|
|
246
|
+
color: var(--bpmkit-primary);
|
|
247
|
+
text-decoration: none;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.modal-body a:hover {
|
|
251
|
+
text-decoration: underline;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* --- лого BPMkit в модалке "О программе" (иконка + надпись, как на сайте) ---
|
|
255
|
+
*
|
|
256
|
+
* Два SVG (светлая/тёмная тема) наложены друг на друга через display:none —
|
|
257
|
+
* переключение зависит ТОЛЬКО от [data-theme] на <html> (см. app.js::applyTheme),
|
|
258
|
+
* ни одного JS-условия здесь не требуется. */
|
|
259
|
+
|
|
260
|
+
.about-modal-logo {
|
|
261
|
+
display: flex;
|
|
262
|
+
justify-content: center;
|
|
263
|
+
margin: 4px 0 16px;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.about-modal-logo-img {
|
|
267
|
+
width: min(200px, 100%);
|
|
268
|
+
height: auto;
|
|
269
|
+
display: none;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.about-modal-logo-light {
|
|
273
|
+
display: block;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
[data-theme="dark"] .about-modal-logo-light {
|
|
277
|
+
display: none;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
[data-theme="dark"] .about-modal-logo-dark {
|
|
281
|
+
display: block;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.modal-note {
|
|
285
|
+
margin: 0 0 14px;
|
|
286
|
+
padding: 10px 12px;
|
|
287
|
+
border-radius: 8px;
|
|
288
|
+
background: var(--bpmkit-code-bg);
|
|
289
|
+
border: 1px solid var(--bpmkit-border);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.modal-note p {
|
|
293
|
+
margin: 0;
|
|
294
|
+
color: var(--bpmkit-muted);
|
|
295
|
+
font-size: 12px;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.modal-note p + p {
|
|
299
|
+
margin-top: 4px;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.modal-note-link {
|
|
303
|
+
color: var(--bpmkit-primary);
|
|
304
|
+
font-weight: 400;
|
|
305
|
+
text-decoration: none;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.modal-note-link:hover {
|
|
309
|
+
text-decoration: underline;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/* --- иконочный футер модалки "О программе" (сайт/репозиторий/telegram) --- */
|
|
313
|
+
|
|
314
|
+
.about-modal-icons {
|
|
315
|
+
margin-top: 16px;
|
|
316
|
+
padding-top: 12px;
|
|
317
|
+
border-top: 1px solid var(--bpmkit-border);
|
|
318
|
+
display: flex;
|
|
319
|
+
align-items: center;
|
|
320
|
+
justify-content: space-between;
|
|
321
|
+
flex-wrap: wrap;
|
|
322
|
+
gap: 10px;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.about-modal-icons-row {
|
|
326
|
+
display: flex;
|
|
327
|
+
align-items: center;
|
|
328
|
+
gap: 10px;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.about-modal-author-name {
|
|
332
|
+
font-size: 12px;
|
|
333
|
+
color: var(--bpmkit-muted);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.about-modal-icon-link {
|
|
337
|
+
display: inline-flex;
|
|
338
|
+
align-items: center;
|
|
339
|
+
justify-content: center;
|
|
340
|
+
width: 28px;
|
|
341
|
+
height: 28px;
|
|
342
|
+
border-radius: 6px;
|
|
343
|
+
color: var(--bpmkit-muted);
|
|
344
|
+
transition: color 0.15s ease, background 0.15s ease;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.about-modal-icon-link:hover,
|
|
348
|
+
.about-modal-icon-link:focus-visible {
|
|
349
|
+
color: var(--bpmkit-primary);
|
|
350
|
+
background: var(--bpmkit-code-bg);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.modal-footer {
|
|
354
|
+
display: flex;
|
|
355
|
+
justify-content: flex-end;
|
|
356
|
+
padding: 12px 18px;
|
|
357
|
+
border-top: 1px solid var(--bpmkit-border);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
main {
|
|
361
|
+
padding: 20px;
|
|
362
|
+
max-width: 1100px;
|
|
363
|
+
margin: 0 auto;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.tab-panel {
|
|
367
|
+
display: none;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.tab-panel.active {
|
|
371
|
+
display: block;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.panel-toolbar {
|
|
375
|
+
display: flex;
|
|
376
|
+
align-items: center;
|
|
377
|
+
gap: 10px;
|
|
378
|
+
margin-bottom: 12px;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
button {
|
|
382
|
+
background: var(--bpmkit-primary);
|
|
383
|
+
color: var(--bpmkit-primary-contrast);
|
|
384
|
+
border: none;
|
|
385
|
+
border-radius: 6px;
|
|
386
|
+
padding: 7px 14px;
|
|
387
|
+
cursor: pointer;
|
|
388
|
+
font-size: 13px;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
button:hover {
|
|
392
|
+
filter: brightness(1.08);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
button.secondary {
|
|
396
|
+
background: var(--bpmkit-muted);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
button.danger {
|
|
400
|
+
background: var(--bpmkit-down);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
button:disabled {
|
|
404
|
+
opacity: 0.4;
|
|
405
|
+
cursor: not-allowed;
|
|
406
|
+
filter: none;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.error-text {
|
|
410
|
+
color: var(--bpmkit-down);
|
|
411
|
+
font-size: 13px;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
.status-text {
|
|
415
|
+
color: var(--bpmkit-muted);
|
|
416
|
+
font-size: 13px;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* --- область статуса действий (плавающий тост, НЕ в потоке документа) ---
|
|
420
|
+
*
|
|
421
|
+
* Раньше это был блочный элемент над таблицей стендов — его появление
|
|
422
|
+
* сдвигало вёрстку вниз (page jump). Теперь — position: fixed поверх
|
|
423
|
+
* контента (верх экрана, по центру — рядом с кнопкой "Обновить" панели
|
|
424
|
+
* инструментов), с fade+slide переходом; документ не двигается независимо
|
|
425
|
+
* от того, показан тост или нет. Цвета берутся из тех же CSS-переменных,
|
|
426
|
+
* что и остальной UI — читаемость в обеих темах гарантирована (panel-bg/text
|
|
427
|
+
* меняются по [data-theme="dark"], см. :root выше).
|
|
428
|
+
*/
|
|
429
|
+
|
|
430
|
+
.action-status {
|
|
431
|
+
position: fixed;
|
|
432
|
+
top: 70px;
|
|
433
|
+
left: 50%;
|
|
434
|
+
z-index: 1200;
|
|
435
|
+
min-width: 220px;
|
|
436
|
+
max-width: min(420px, calc(100vw - 32px));
|
|
437
|
+
margin-bottom: 0;
|
|
438
|
+
padding: 10px 14px;
|
|
439
|
+
border-radius: 8px;
|
|
440
|
+
font-size: 13px;
|
|
441
|
+
border: 1px solid var(--bpmkit-border);
|
|
442
|
+
background: var(--bpmkit-panel-bg);
|
|
443
|
+
color: var(--bpmkit-text);
|
|
444
|
+
box-shadow: 0 8px 22px rgba(0, 0, 0, 0.2);
|
|
445
|
+
opacity: 0;
|
|
446
|
+
visibility: hidden;
|
|
447
|
+
transform: translateX(-50%) translateY(-10px);
|
|
448
|
+
pointer-events: none;
|
|
449
|
+
transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.action-status.action-status-visible {
|
|
453
|
+
opacity: 1;
|
|
454
|
+
visibility: visible;
|
|
455
|
+
transform: translateX(-50%) translateY(0);
|
|
456
|
+
pointer-events: auto;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.action-status.action-status-ok {
|
|
460
|
+
border-color: var(--bpmkit-ok);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.action-status.action-status-error {
|
|
464
|
+
border-color: var(--bpmkit-down);
|
|
465
|
+
color: var(--bpmkit-down);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
.stands-table {
|
|
469
|
+
width: 100%;
|
|
470
|
+
border-collapse: collapse;
|
|
471
|
+
background: var(--bpmkit-panel-bg);
|
|
472
|
+
border: 1px solid var(--bpmkit-border);
|
|
473
|
+
border-radius: 8px;
|
|
474
|
+
overflow: hidden;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.stands-table th,
|
|
478
|
+
.stands-table td {
|
|
479
|
+
text-align: left;
|
|
480
|
+
padding: 10px 12px;
|
|
481
|
+
border-bottom: 1px solid var(--bpmkit-border);
|
|
482
|
+
font-size: 13px;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.stands-table tbody tr:last-child td {
|
|
486
|
+
border-bottom: none;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.badge {
|
|
490
|
+
display: inline-block;
|
|
491
|
+
padding: 2px 8px;
|
|
492
|
+
border-radius: 10px;
|
|
493
|
+
font-size: 11px;
|
|
494
|
+
font-weight: 600;
|
|
495
|
+
color: white;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
.badge-ok {
|
|
499
|
+
background: var(--bpmkit-ok);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
.badge-down {
|
|
503
|
+
background: var(--bpmkit-down);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
.badge-unknown {
|
|
507
|
+
background: var(--bpmkit-unknown);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.badge-skipped {
|
|
511
|
+
background: var(--bpmkit-skipped);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
.row-actions button {
|
|
515
|
+
margin-right: 4px;
|
|
516
|
+
padding: 4px 8px;
|
|
517
|
+
font-size: 12px;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
.stands-table tbody tr {
|
|
521
|
+
cursor: pointer;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.stands-table tbody tr:hover {
|
|
525
|
+
background: var(--bpmkit-row-hover);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
.stands-table tbody tr.selected {
|
|
529
|
+
background: var(--bpmkit-row-selected);
|
|
530
|
+
box-shadow: inset 3px 0 0 var(--bpmkit-primary);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
.hint-text {
|
|
534
|
+
color: var(--bpmkit-muted);
|
|
535
|
+
font-size: 12px;
|
|
536
|
+
margin: 8px 2px 0;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
.value-cell {
|
|
540
|
+
font-weight: 600;
|
|
541
|
+
font-size: 13px;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
.value-ok {
|
|
545
|
+
color: var(--bpmkit-ok);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
.value-down {
|
|
549
|
+
color: var(--bpmkit-down);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
.value-unknown {
|
|
553
|
+
color: var(--bpmkit-unknown);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
.value-skipped {
|
|
557
|
+
color: var(--bpmkit-skipped);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
.value-muted {
|
|
561
|
+
color: var(--bpmkit-muted);
|
|
562
|
+
font-weight: 400;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/* --- иконки действий (Старт/Стоп/Рестарт/Очистить Redis) --- */
|
|
566
|
+
|
|
567
|
+
.icon-btn {
|
|
568
|
+
display: inline-flex;
|
|
569
|
+
align-items: center;
|
|
570
|
+
justify-content: center;
|
|
571
|
+
width: 26px;
|
|
572
|
+
height: 26px;
|
|
573
|
+
margin-right: 4px;
|
|
574
|
+
padding: 0;
|
|
575
|
+
border-radius: 6px;
|
|
576
|
+
border: none;
|
|
577
|
+
cursor: pointer;
|
|
578
|
+
color: white;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
.icon-btn-play {
|
|
582
|
+
background: var(--bpmkit-ok);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
.icon-btn-stop {
|
|
586
|
+
background: var(--bpmkit-down);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
.icon-btn-restart {
|
|
590
|
+
background: var(--bpmkit-primary);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
.icon-btn-redis {
|
|
594
|
+
background: var(--bpmkit-muted);
|
|
595
|
+
margin-right: 0;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.icon-btn:hover {
|
|
599
|
+
filter: brightness(1.1);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
.icon-btn:disabled,
|
|
603
|
+
.icon-btn:disabled:hover {
|
|
604
|
+
opacity: 0.35;
|
|
605
|
+
filter: none;
|
|
606
|
+
cursor: not-allowed;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/* --- индикатор "запуск…" (честный старт, см. app.js::checkStartingTransitions) --- */
|
|
610
|
+
|
|
611
|
+
.process-starting {
|
|
612
|
+
display: inline-flex;
|
|
613
|
+
align-items: center;
|
|
614
|
+
gap: 6px;
|
|
615
|
+
color: var(--bpmkit-muted);
|
|
616
|
+
font-size: 13px;
|
|
617
|
+
font-weight: 600;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
.mini-spinner {
|
|
621
|
+
width: 12px;
|
|
622
|
+
height: 12px;
|
|
623
|
+
border-radius: 50%;
|
|
624
|
+
border: 2px solid var(--bpmkit-border);
|
|
625
|
+
border-top-color: var(--bpmkit-primary);
|
|
626
|
+
animation: bpmkit-spin 0.8s linear infinite;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
@keyframes bpmkit-spin {
|
|
630
|
+
to {
|
|
631
|
+
transform: rotate(360deg);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/* --- панель "Текущее состояние" --- */
|
|
636
|
+
|
|
637
|
+
.state-panel {
|
|
638
|
+
margin-top: 20px;
|
|
639
|
+
background: var(--bpmkit-panel-bg);
|
|
640
|
+
border: 1px solid var(--bpmkit-border);
|
|
641
|
+
border-radius: 8px;
|
|
642
|
+
padding: 12px 16px;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
.state-panel-header {
|
|
646
|
+
display: flex;
|
|
647
|
+
align-items: center;
|
|
648
|
+
justify-content: space-between;
|
|
649
|
+
flex-wrap: wrap;
|
|
650
|
+
gap: 8px;
|
|
651
|
+
margin-bottom: 8px;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
.state-panel-header h2 {
|
|
655
|
+
font-size: 14px;
|
|
656
|
+
margin: 0;
|
|
657
|
+
color: var(--bpmkit-text);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
.state-panel-controls {
|
|
661
|
+
display: flex;
|
|
662
|
+
align-items: center;
|
|
663
|
+
gap: 8px;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/* --- сплит-кнопка "Открыть папку логов" (основное действие + выпадающее
|
|
667
|
+
* меню выбора источника: "Логи стенда" / "Логи BPMkit-проекта") --- */
|
|
668
|
+
|
|
669
|
+
.split-btn {
|
|
670
|
+
position: relative;
|
|
671
|
+
display: inline-flex;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
.split-btn-main {
|
|
675
|
+
border-top-right-radius: 0;
|
|
676
|
+
border-bottom-right-radius: 0;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.split-btn-toggle {
|
|
680
|
+
border-top-left-radius: 0;
|
|
681
|
+
border-bottom-left-radius: 0;
|
|
682
|
+
border-left: 1px solid rgba(0, 0, 0, 0.15);
|
|
683
|
+
padding: 7px 9px;
|
|
684
|
+
font-size: 11px;
|
|
685
|
+
line-height: 1;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.split-btn-menu {
|
|
689
|
+
position: absolute;
|
|
690
|
+
top: calc(100% + 4px);
|
|
691
|
+
right: 0;
|
|
692
|
+
z-index: 1100;
|
|
693
|
+
min-width: 200px;
|
|
694
|
+
background: var(--bpmkit-panel-bg);
|
|
695
|
+
border: 1px solid var(--bpmkit-border);
|
|
696
|
+
border-radius: 8px;
|
|
697
|
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.16);
|
|
698
|
+
padding: 4px;
|
|
699
|
+
display: flex;
|
|
700
|
+
flex-direction: column;
|
|
701
|
+
gap: 2px;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
.split-btn-menu[hidden] {
|
|
705
|
+
display: none;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
.split-btn-menu-item {
|
|
709
|
+
background: transparent;
|
|
710
|
+
color: var(--bpmkit-text);
|
|
711
|
+
border: none;
|
|
712
|
+
border-radius: 6px;
|
|
713
|
+
padding: 8px 10px;
|
|
714
|
+
font-size: 13px;
|
|
715
|
+
text-align: left;
|
|
716
|
+
cursor: pointer;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
.split-btn-menu-item:hover:not(:disabled) {
|
|
720
|
+
background: var(--bpmkit-code-bg);
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
.split-btn-menu-item:disabled {
|
|
724
|
+
opacity: 0.4;
|
|
725
|
+
cursor: not-allowed;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
#state-output {
|
|
729
|
+
max-height: 320px;
|
|
730
|
+
overflow: auto;
|
|
731
|
+
background: var(--bpmkit-console-bg);
|
|
732
|
+
color: var(--bpmkit-console-text);
|
|
733
|
+
padding: 10px;
|
|
734
|
+
border-radius: 6px;
|
|
735
|
+
font-size: 12px;
|
|
736
|
+
white-space: pre-wrap;
|
|
737
|
+
word-break: break-word;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
/* --- пояснение вкладки "Локальный агент" --- */
|
|
741
|
+
|
|
742
|
+
.agent-explainer {
|
|
743
|
+
background: var(--bpmkit-panel-bg);
|
|
744
|
+
border: 1px solid var(--bpmkit-border);
|
|
745
|
+
border-radius: 8px;
|
|
746
|
+
padding: 14px 18px;
|
|
747
|
+
margin-bottom: 16px;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
.agent-explainer p {
|
|
751
|
+
font-size: 13px;
|
|
752
|
+
margin: 0 0 10px;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
.agent-explainer p:last-child {
|
|
756
|
+
margin-bottom: 0;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.agent-explainer code {
|
|
760
|
+
background: var(--bpmkit-code-bg);
|
|
761
|
+
padding: 1px 5px;
|
|
762
|
+
border-radius: 4px;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
.settings-form fieldset {
|
|
766
|
+
background: var(--bpmkit-panel-bg);
|
|
767
|
+
border: 1px solid var(--bpmkit-border);
|
|
768
|
+
border-radius: 8px;
|
|
769
|
+
padding: 14px 18px;
|
|
770
|
+
margin-bottom: 16px;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
.settings-form legend {
|
|
774
|
+
font-weight: 600;
|
|
775
|
+
padding: 0 6px;
|
|
776
|
+
color: var(--bpmkit-text);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
.settings-form label {
|
|
780
|
+
display: block;
|
|
781
|
+
margin-bottom: 10px;
|
|
782
|
+
font-size: 13px;
|
|
783
|
+
color: var(--bpmkit-muted);
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
.settings-form input[type="text"],
|
|
787
|
+
.settings-form input[type="number"] {
|
|
788
|
+
display: block;
|
|
789
|
+
width: 100%;
|
|
790
|
+
margin-top: 4px;
|
|
791
|
+
padding: 6px 8px;
|
|
792
|
+
border: 1px solid var(--bpmkit-border);
|
|
793
|
+
border-radius: 6px;
|
|
794
|
+
font-size: 13px;
|
|
795
|
+
background: var(--bpmkit-panel-bg);
|
|
796
|
+
color: var(--bpmkit-text);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
.checkbox-label {
|
|
800
|
+
display: flex;
|
|
801
|
+
align-items: center;
|
|
802
|
+
gap: 8px;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
.checkbox-label input {
|
|
806
|
+
width: auto;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
.secret-row {
|
|
810
|
+
display: flex;
|
|
811
|
+
align-items: center;
|
|
812
|
+
gap: 8px;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
.secret-row input {
|
|
816
|
+
flex: 1;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
.secret-status {
|
|
820
|
+
font-size: 12px;
|
|
821
|
+
color: var(--bpmkit-muted);
|
|
822
|
+
white-space: nowrap;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
.agent-row {
|
|
826
|
+
display: flex;
|
|
827
|
+
gap: 8px;
|
|
828
|
+
margin-bottom: 8px;
|
|
829
|
+
align-items: center;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
.agent-row input {
|
|
833
|
+
flex: 1;
|
|
834
|
+
padding: 6px 8px;
|
|
835
|
+
border: 1px solid var(--bpmkit-border);
|
|
836
|
+
border-radius: 6px;
|
|
837
|
+
background: var(--bpmkit-panel-bg);
|
|
838
|
+
color: var(--bpmkit-text);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
.agent-row button {
|
|
842
|
+
background: var(--bpmkit-down);
|
|
843
|
+
}
|