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.
@@ -0,0 +1,5 @@
1
+ <svg width="172" height="60" viewBox="16 19 172 60" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="16.75" y="20.75" width="55" height="55" rx="13" fill="none" stroke="#4a4a4a" stroke-width="1.5"/>
3
+ <text x="44" y="67" font-family="Inter, Arial, sans-serif" font-size="42" font-weight="600" fill="#f9763d" text-anchor="middle">k</text>
4
+ <text x="90" y="63" font-family="Inter, Arial, sans-serif" font-size="28" font-weight="600" fill="#ffffff" letter-spacing="-0.8">BPM<tspan fill="#f9763d">k</tspan>it</text>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg width="360" height="120" viewBox="0 0 360 120" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="8" y="16" width="88" height="88" rx="20" fill="#2b2b2b"/>
3
+ <text x="52" y="89" font-family="Inter, Arial, sans-serif" font-size="66" font-weight="600" fill="#f9763d" text-anchor="middle">k</text>
4
+ <text x="118" y="73" font-family="Inter, Arial, sans-serif" font-size="40" font-weight="600" fill="#2b2b2b" letter-spacing="-1.2">BPM<tspan fill="#f9763d">k</tspan>it</text>
5
+ </svg>
Binary file
@@ -0,0 +1,4 @@
1
+ <svg width="96" height="96" viewBox="0 0 96 96" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="4" y="4" width="88" height="88" rx="20" fill="#2b2b2b"/>
3
+ <text x="48" y="77" font-family="Inter, Arial, sans-serif" font-size="66" font-weight="600" fill="#f9763d" text-anchor="middle">k</text>
4
+ </svg>
@@ -0,0 +1,267 @@
1
+ <!DOCTYPE html>
2
+ <html lang="ru">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="standkit-token" content="__STANDKIT_TOKEN__" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <title>BPMkit Дашборд</title>
8
+ <link rel="icon" type="image/svg+xml" href="/static/favicon.svg" />
9
+ <link rel="stylesheet" href="/static/style.css" />
10
+ </head>
11
+ <body>
12
+ <header class="topbar">
13
+ <img class="brand-logo" src="/static/favicon.svg" alt="BPMkit" />
14
+ <h1>BPMkit Дашборд</h1>
15
+ <nav class="tabs">
16
+ <button class="tab-btn active" data-tab="stands">Стенды</button>
17
+ <button class="tab-btn" data-tab="agent">Локальный агент</button>
18
+ <button class="tab-btn" data-tab="settings">Настройки</button>
19
+ </nav>
20
+ <button id="about-btn" class="about-btn" type="button" title="О программе">ⓘ</button>
21
+ <button id="theme-toggle-btn" class="theme-toggle-btn" type="button" title="Переключить тему">🌓</button>
22
+ <span id="conn-status" class="conn-status" title="Связь с хабом не проверялась">
23
+ <span id="conn-status-dot" class="conn-status-dot conn-status-dot-pending"></span>
24
+ <span id="conn-status-label">подключение…</span>
25
+ </span>
26
+ </header>
27
+
28
+ <div id="about-modal-overlay" class="modal-overlay" hidden>
29
+ <div class="modal-box" role="dialog" aria-modal="true" aria-labelledby="about-modal-title">
30
+ <div class="modal-header">
31
+ <h2 id="about-modal-title">О программе</h2>
32
+ <button id="about-modal-close-btn" class="modal-close-btn" type="button" title="Закрыть">✕</button>
33
+ </div>
34
+ <div class="modal-body">
35
+ <div class="about-modal-logo">
36
+ <img class="about-modal-logo-img about-modal-logo-light" src="/static/bpmkit-logo.svg" alt="BPMkit" />
37
+ <img class="about-modal-logo-img about-modal-logo-dark" src="/static/bpmkit-logo-dark.svg" alt="BPMkit" />
38
+ </div>
39
+ <div class="modal-note">
40
+ <p>Бесплатная версия — для управления стендами.</p>
41
+ <!-- TODO: заменить на страницу Companion, ссылку даст Владимир -->
42
+ <p>Автообновление MCP и контроль лицензии доступны в <a class="modal-note-link" href="https://bpmkit.pro" target="_blank" rel="noopener">Companion</a>-версии.</p>
43
+ </div>
44
+ <p>BPMkitStand — свободный диспетчер стендов BPMSoft (часть экосистемы BPMkit).</p>
45
+ <p>Версия: <span id="about-modal-version">…</span></p>
46
+ <div class="about-modal-icons">
47
+ <div class="about-modal-icons-row">
48
+ <a class="about-modal-icon-link" href="https://bpmkit.pro" target="_blank" rel="noopener" title="Сайт bpmkit.pro" aria-label="Сайт bpmkit.pro">
49
+ <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><line x1="3" y1="12" x2="21" y2="12"/><path d="M12 3c2.6 2.6 4 5.7 4 9s-1.4 6.4-4 9c-2.6-2.6-4-5.7-4-9s1.4-6.4 4-9z"/></svg>
50
+ </a>
51
+ <a class="about-modal-icon-link" href="https://github.com/thinkquattro/BPMkitStand" target="_blank" rel="noopener" title="Репозиторий" aria-label="Репозиторий на GitHub">
52
+ <svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M12 2C6.48 2 2 6.58 2 12.2c0 4.5 2.87 8.32 6.84 9.67.5.1.68-.22.68-.5 0-.24-.01-1.04-.01-1.88-2.78.61-3.37-1.2-3.37-1.2-.45-1.18-1.11-1.5-1.11-1.5-.9-.63.07-.62.07-.62 1 .07 1.53 1.05 1.53 1.05.9 1.56 2.34 1.11 2.91.85.09-.66.35-1.11.63-1.36-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.31.1-2.72 0 0 .84-.27 2.75 1.05a9.3 9.3 0 0 1 5 0c1.9-1.32 2.74-1.05 2.74-1.05.56 1.41.21 2.46.1 2.72.65.72 1.03 1.63 1.03 2.75 0 3.94-2.34 4.8-4.57 5.06.36.32.68.94.68 1.9 0 1.37-.01 2.47-.01 2.81 0 .28.18.61.69.5A10.02 10.02 0 0 0 22 12.2C22 6.58 17.52 2 12 2z"/></svg>
53
+ </a>
54
+ </div>
55
+ <div class="about-modal-icons-row about-modal-author">
56
+ <span class="about-modal-author-name">Владимир Терновский</span>
57
+ <a class="about-modal-icon-link" href="https://t.me/quattrolife" target="_blank" rel="noopener" title="Telegram разработчика" aria-label="Telegram разработчика">
58
+ <svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M21.9 4.3 2.7 11.9c-1.2.5-1.2 1.2-.2 1.5l4.9 1.5 1.9 5.9c.2.6.4.8.8.8.4 0 .6-.2.9-.5l2.2-2.1 4.6 3.4c.8.5 1.4.2 1.6-.8l3-14.2c.3-1.2-.4-1.7-1.5-1.1zM8.3 13.9l9.5-6c.5-.3.9-.1.6.3l-8 7.3-.3 3.2z" fill-rule="evenodd"/></svg>
59
+ </a>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <div class="modal-footer">
64
+ <button id="about-modal-close-footer-btn" type="button" class="secondary">Закрыть</button>
65
+ </div>
66
+ </div>
67
+ </div>
68
+
69
+ <!-- Стилизованное подтверждение (замена window.confirm) — переиспользует
70
+ классы модалки "О программе"; используется для Стоп/Рестарт/Очистить Redis. -->
71
+ <div id="confirm-modal-overlay" class="modal-overlay" hidden>
72
+ <div class="modal-box modal-box-confirm" role="alertdialog" aria-modal="true" aria-labelledby="confirm-modal-title">
73
+ <div class="modal-header">
74
+ <h2 id="confirm-modal-title">Подтверждение</h2>
75
+ <button id="confirm-modal-close-btn" class="modal-close-btn" type="button" title="Отмена">✕</button>
76
+ </div>
77
+ <div class="modal-body">
78
+ <p id="confirm-modal-text"></p>
79
+ </div>
80
+ <div class="modal-footer">
81
+ <button id="confirm-modal-cancel-btn" type="button" class="secondary">Отмена</button>
82
+ <button id="confirm-modal-ok-btn" type="button" class="danger">Подтвердить</button>
83
+ </div>
84
+ </div>
85
+ </div>
86
+
87
+ <main>
88
+ <section id="tab-stands" class="tab-panel active">
89
+ <div class="panel-toolbar">
90
+ <button id="refresh-stands-btn">Обновить</button>
91
+ <span id="stands-error" class="error-text"></span>
92
+ </div>
93
+ <div id="action-status" class="action-status" role="status" aria-live="polite"></div>
94
+ <table class="stands-table">
95
+ <thead>
96
+ <tr>
97
+ <th>Стенд</th>
98
+ <th>Транспорт</th>
99
+ <th>Процесс</th>
100
+ <th>HTTP</th>
101
+ <th>БД</th>
102
+ <th>Действия</th>
103
+ </tr>
104
+ </thead>
105
+ <tbody id="stands-tbody"></tbody>
106
+ </table>
107
+ <p class="hint-text">Клик по строке выбирает стенд — выбор управляет панелью «Текущее состояние» ниже.</p>
108
+
109
+ <div class="state-panel">
110
+ <div class="state-panel-header">
111
+ <h2>Текущее состояние <span id="state-stand-name"></span></h2>
112
+ <div class="state-panel-controls">
113
+ <!-- Сплит-кнопка: у стенда ДВА разных места логов (см.
114
+ standkit_hub/logs_browser.py) — логи самого стенда
115
+ (<stand_dir>/logs) и логи BPMkit-проекта (scaffold,
116
+ <docs_folder>/logs). Основная кнопка открывает последний
117
+ выбранный источник (по умолчанию — "Логи стенда"), стрелка
118
+ раскрывает меню с явным выбором. Пункт "Логи BPMkit-проекта"
119
+ дизейблится на клиенте по флагу stand.logs.bpmkit_available
120
+ (см. /api/stands, app.js::updateLogsMenuState). -->
121
+ <div class="split-btn" id="log-folder-split-btn">
122
+ <button
123
+ id="log-folder-open-btn"
124
+ class="secondary split-btn-main"
125
+ type="button"
126
+ title="Открыть папку логов"
127
+ >Открыть папку логов</button>
128
+ <button
129
+ id="log-folder-menu-toggle-btn"
130
+ class="secondary split-btn-toggle"
131
+ type="button"
132
+ aria-haspopup="true"
133
+ aria-expanded="false"
134
+ title="Выбрать источник логов"
135
+ >&#9662;</button>
136
+ <div class="split-btn-menu" id="log-folder-menu" role="menu" hidden>
137
+ <button
138
+ type="button"
139
+ class="split-btn-menu-item"
140
+ data-source="stand"
141
+ role="menuitem"
142
+ >Логи стенда</button>
143
+ <button
144
+ type="button"
145
+ class="split-btn-menu-item"
146
+ data-source="bpmkit"
147
+ id="log-folder-menu-bpmkit"
148
+ role="menuitem"
149
+ >Логи BPMkit-проекта</button>
150
+ </div>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ <pre id="state-output">Выберите стенд в таблице, чтобы увидеть текущее состояние.</pre>
155
+ </div>
156
+ </section>
157
+
158
+ <section id="tab-agent" class="tab-panel">
159
+ <div class="agent-explainer">
160
+ <p>
161
+ Локальный <code>standkit_agent</code> — headless-служба, которую ставят
162
+ <strong>на хост со стендами</strong>, чтобы удалённый диспетчер BPMkitStand
163
+ (этот дашборд на машине оператора) мог федеративно управлять стендами
164
+ <strong>этой машины</strong> по HTTP — см. значение <code>transport: agent</code>
165
+ у записи стенда в реестре.
166
+ </p>
167
+ <p>
168
+ Агент нужен ТОЛЬКО для удалённого управления. Если вы управляете стендами
169
+ локально, с этой же машины, где они запущены (<code>transport: local</code>),
170
+ агент не требуется — ядро standkit работает со стендами напрямую.
171
+ </p>
172
+ <p>
173
+ Кнопки ниже запускают/останавливают такой агент на ТЕКУЩЕЙ машине с
174
+ параметрами из вкладки «Настройки» (host/port/токены/TLS) — чтобы другие
175
+ хабы могли подключиться к стендам этой машины.
176
+ </p>
177
+ </div>
178
+ <p>Статус: <span id="agent-status">…</span></p>
179
+ <div class="panel-toolbar">
180
+ <button id="agent-start-btn">Запустить агент</button>
181
+ <button id="agent-stop-btn">Остановить агент</button>
182
+ </div>
183
+ <span id="agent-error" class="error-text"></span>
184
+ </section>
185
+
186
+ <section id="tab-settings" class="tab-panel">
187
+ <form id="settings-form" class="settings-form">
188
+ <fieldset>
189
+ <legend>Хаб</legend>
190
+ <label>Путь к реестру стендов (registry_path)
191
+ <input type="text" name="registry_path" />
192
+ </label>
193
+ <label>Каталог pid-файлов (run_dir)
194
+ <input type="text" name="run_dir" />
195
+ </label>
196
+ <label>Каталог логов (log_dir)
197
+ <input type="text" name="log_dir" />
198
+ </label>
199
+ <label>Интервал автообновления, сек (refresh_interval_sec)
200
+ <input type="number" name="refresh_interval_sec" min="1" />
201
+ </label>
202
+ </fieldset>
203
+
204
+ <fieldset>
205
+ <legend>Дефолты локального агента</legend>
206
+ <label>Host (agent_host)
207
+ <input type="text" name="agent_host" />
208
+ </label>
209
+ <label>Port (agent_port)
210
+ <input type="number" name="agent_port" min="1" max="65535" />
211
+ </label>
212
+ <label>Control-токен (token_ref)
213
+ <span class="secret-row">
214
+ <input type="text" name="token_ref" />
215
+ <button type="button" class="set-secret-btn" data-ref-field="token_ref">Задать секрет…</button>
216
+ <span class="secret-status" data-ref-status="token_ref"></span>
217
+ </span>
218
+ </label>
219
+ <label>Readonly-токен (readonly_token_ref)
220
+ <span class="secret-row">
221
+ <input type="text" name="readonly_token_ref" />
222
+ <button type="button" class="set-secret-btn" data-ref-field="readonly_token_ref">Задать секрет…</button>
223
+ <span class="secret-status" data-ref-status="readonly_token_ref"></span>
224
+ </span>
225
+ </label>
226
+ <label>TLS-сертификат (tls_cert)
227
+ <input type="text" name="tls_cert" />
228
+ </label>
229
+ <label>TLS-ключ (tls_key)
230
+ <input type="text" name="tls_key" />
231
+ </label>
232
+ <label>TLS client CA (tls_client_ca)
233
+ <input type="text" name="tls_client_ca" />
234
+ </label>
235
+ <label class="checkbox-label">
236
+ <input type="checkbox" name="insecure" />
237
+ insecure (небезопасный bind без TLS на non-loopback)
238
+ </label>
239
+ <label>Аудит-лог (audit_log)
240
+ <input type="text" name="audit_log" />
241
+ </label>
242
+ <label>Порог блокировки (lockout_max_failures)
243
+ <input type="number" name="lockout_max_failures" min="1" />
244
+ </label>
245
+ <label>Окно блокировки, сек (lockout_window_sec)
246
+ <input type="number" name="lockout_window_sec" min="1" />
247
+ </label>
248
+ </fieldset>
249
+
250
+ <fieldset>
251
+ <legend>Удалённые агенты (федерация)</legend>
252
+ <div id="agents-list"></div>
253
+ <button type="button" id="add-agent-btn">+ Добавить агента</button>
254
+ </fieldset>
255
+
256
+ <div class="panel-toolbar">
257
+ <button type="submit">Сохранить настройки</button>
258
+ <button type="button" id="install-shortcut-btn">Создать ярлык на рабочем столе</button>
259
+ <span id="settings-status" class="status-text"></span>
260
+ </div>
261
+ </form>
262
+ </section>
263
+ </main>
264
+
265
+ <script src="/static/app.js"></script>
266
+ </body>
267
+ </html>