neuroalpha 0.2.0 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -3
  3. package/bin/cli.js +69 -69
  4. package/config/seed-run.json +1 -0
  5. package/config/strategy.json +4 -10
  6. package/deploy/install.sh +128 -0
  7. package/docs//320/224/320/225/320/237/320/233/320/236/320/231.md +103 -0
  8. package/docs//320/230/320/235/320/241/320/242/320/240/320/243/320/232/320/246/320/230/320/257.md +1 -1
  9. package/docs//320/234/320/225/320/245/320/220/320/235/320/230/320/232/320/220_/320/230_/320/237/320/220/320/240/320/220/320/234/320/225/320/242/320/240/320/253.md +171 -0
  10. package/package.json +15 -5
  11. package/public/admin.html +426 -0
  12. package/public/app.js +741 -251
  13. package/public/index.html +45 -20
  14. package/public/landing.html +1004 -870
  15. package/public/legal.html +22 -0
  16. package/public/styles.css +49 -15
  17. package/server/api/routes.js +176 -23
  18. package/server/auth/index.js +544 -340
  19. package/server/billing/yookassa.js +1 -0
  20. package/server/brokers/index.js +1224 -645
  21. package/server/config.js +6 -4
  22. package/server/data/moex.js +1 -0
  23. package/server/db.js +53 -2
  24. package/server/hub.js +1 -0
  25. package/server/index.js +10 -2
  26. package/server/llm/client.js +1 -0
  27. package/server/llm/providers.js +50 -3
  28. package/server/model/dataset.js +362 -352
  29. package/server/model/forecast.js +15 -21
  30. package/server/model/linalg.js +1 -0
  31. package/server/model/live.js +489 -486
  32. package/server/model/metrics.js +1 -0
  33. package/server/model/models.js +31 -21
  34. package/server/model/profiles.js +1 -0
  35. package/server/model/research.js +119 -172
  36. package/server/model/vocab.js +1 -0
  37. package/server/news/index.js +1 -0
  38. package/server/notify/index.js +304 -168
  39. package/server/params-meta.js +20 -25
  40. package/server/settings.js +1 -0
  41. package/server/strategist/analytics.js +1 -0
  42. package/server/strategist/index.js +6 -6
  43. package/server/strategist/tools.js +2 -1
  44. package/server/util.js +1 -0
  45. package/server/model/gpu-worker.html +0 -11
  46. package/server/model/gpu-worker.js +0 -60
  47. package/server/model/tf-node.js +0 -26
  48. package/server/model/transformer-core.js +0 -330
  49. package/server/model/transformer-gpu.js +0 -221
  50. package/server/model/transformer-pool.js +0 -200
  51. package/server/model/transformer-worker.js +0 -28
  52. package/server/model/transformer.js +0 -57
package/public/index.html CHANGED
@@ -1,3 +1,4 @@
1
+ <!-- Copyright (c) 2026 Roman A. Perepelkin. Licensed under the MIT License. -->
1
2
  <!doctype html>
2
3
  <html lang="ru">
3
4
  <head>
@@ -79,10 +80,10 @@
79
80
  </button>
80
81
  </div>
81
82
  </div>
82
- <button id="chat-action" type="button" class="pbtn action-btn" title="Голосовой ввод (русский язык)">
83
+ <button id="chat-action" type="button" class="pbtn action-btn" data-icon="mic" title="Голосовой ввод (русский язык)">
83
84
  <svg id="ico-mic" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="2" width="6" height="11" rx="3"/><path d="M5 10a7 7 0 0 0 14 0"/><line x1="12" y1="17" x2="12" y2="21"/><line x1="8" y1="21" x2="16" y2="21"/></svg>
84
- <svg id="ico-send" hidden width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"/><polyline points="5 12 12 5 19 12"/></svg>
85
- <svg id="ico-stop" hidden width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><rect x="5" y="5" width="14" height="14" rx="2.5"/></svg>
85
+ <svg id="ico-send" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"/><polyline points="5 12 12 5 19 12"/></svg>
86
+ <svg id="ico-stop" width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><rect x="5" y="5" width="14" height="14" rx="2.5"/></svg>
86
87
  </button>
87
88
  <button id="chat-stop" type="button" class="pbtn stop" hidden title="Остановить ответ">■</button>
88
89
  </div>
@@ -110,15 +111,13 @@
110
111
  </div>
111
112
  <div id="run-bar" class="run-bar" hidden>
112
113
  <div class="run-bar-left">
114
+ <button id="btn-to-live" type="button" class="primary" title="Запустить виртуальный счёт с замороженными настройками этого эксперимента">▶ В торговлю</button>
115
+ <button id="btn-apply" type="button" hidden title="Скопировать настройки этого эксперимента в текущие настройки">✓ Применить настройки</button>
113
116
  <button id="btn-rename-run" type="button" title="Дать эксперименту понятное имя">✎ Назвать</button>
114
- <button id="btn-apply" type="button" hidden title="Скопировать настройки этого эксперимента в текущие настройки">✓ Применить эти настройки</button>
115
- <button id="btn-stability" type="button" title="Проверить стратегию на 5 сдвигах периода (−8…+8 дней)">Проверить устойчивость</button>
116
- <button id="btn-to-live" type="button" title="Запустить виртуальный счёт с замороженными настройками этого эксперимента">▶ В торговлю</button>
117
117
  <button id="btn-showcase" type="button" hidden title="Показывать этот эксперимент на публичной витрине лендинга">☆ На витрину</button>
118
118
  </div>
119
119
  <div class="row-gap">
120
120
  <button id="btn-ask-run" type="button" title="Попросить Стратега разобрать этот эксперимент">💬 Разобрать</button>
121
- <button id="btn-cmp-run" type="button" title="Попросить Стратега сравнить этот эксперимент с другим">⇄ Сравнить</button>
122
121
  <button id="btn-del" type="button" title="Удалить этот эксперимент из истории">Удалить</button>
123
122
  </div>
124
123
  </div>
@@ -131,7 +130,7 @@
131
130
  <div id="stability" class="stab-box" hidden></div>
132
131
  <div id="eq-chart" class="chart"></div>
133
132
  <div class="legend" id="legend"></div>
134
- <details id="periods-box" hidden>
133
+ <details id="periods-box" open hidden>
135
134
  <summary>Доходность по месяцам и годам</summary>
136
135
  <div class="seg" id="pmode" title="Что показывать в ячейках">
137
136
  <button data-k="model" class="active">Стратегия</button><button data-k="market">Рынок</button><button data-k="diff">Разница</button>
@@ -221,13 +220,12 @@
221
220
  <div class="tab" id="tab-settings" hidden>
222
221
  <div class="settings-wrap">
223
222
  <aside class="snav">
224
- <input id="s-search" type="search" placeholder="Поиск">
225
- <button type="button" data-sec="g0" class="active">Общие</button>
226
- <button type="button" data-sec="g1">Для карты</button>
227
- <button type="button" data-sec="g2">Для Трансформера</button>
228
- <button type="button" data-sec="g3">Дополнительно</button>
223
+ <input id="s-search" type="search" placeholder="Поиск настроек…">
224
+ <button type="button" data-sec="g0" class="active">Стратегия и сигналы</button>
225
+ <button type="button" data-sec="g1">Издержки и риск</button>
226
+ <button type="button" data-sec="g2">Автопилот и система</button>
229
227
  <div class="ssep"></div>
230
- <button type="button" data-sec="cloud" id="snav-cloud">Профиль, тариф и боты</button>
228
+ <button type="button" data-sec="cloud" id="snav-cloud">Подписка и уведомления</button>
231
229
  <button type="button" data-sec="brokers" id="snav-brokers">Брокерские счета</button>
232
230
  <button type="button" data-sec="llm">Модели ИИ</button>
233
231
  <button type="button" data-sec="hist" id="snav-hist">История изменений</button>
@@ -237,7 +235,7 @@
237
235
  <div class="spane">
238
236
  <form id="params"></form>
239
237
  <section class="ssec" data-sec="cloud" id="cloud-box" hidden>
240
- <div class="stitle">Профиль, подписка и мессенджеры (Telegram / MAX)</div>
238
+ <div class="stitle">Подписка, лицензия и уведомления (Telegram / MAX)</div>
241
239
  <div class="scard spadded" id="cloud-pane"></div>
242
240
  </section>
243
241
  <section class="ssec" data-sec="brokers" id="brokers-box" hidden>
@@ -258,8 +256,15 @@
258
256
  <option value="bcs">БКС Мир инвестиций</option>
259
257
  </select>
260
258
  </label>
261
- <label><span>Номер счёта / портфеля</span><input name="accountId" placeholder="ID счёта или портфеля"></label>
262
- <label><span id="broker-token-lbl">Токен API</span><input name="token" type="password" autocomplete="new-password" placeholder="Токен доступа к API брокера"></label>
259
+ <label><span id="broker-token-lbl">Токен API</span><input name="token" type="text" class="secret-input" autocomplete="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" placeholder="Токен доступа к API брокера (t.…)"></label>
260
+ <label>
261
+ <span>Номер субсчёта / портфеля</span>
262
+ <div class="row-gap" style="width:100%">
263
+ <input name="accountId" autocomplete="off" placeholder="ID счёта (или нажмите кнопку справа →)" style="flex:1">
264
+ <button type="button" id="btn-broker-discover" style="white-space:nowrap">🔍 Найти мои счета по токену</button>
265
+ </div>
266
+ </label>
267
+ <div id="broker-discovered" hidden style="display:grid;gap:6px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--bg2)"></div>
263
268
  <label><span>Режим работы счёта</span>
264
269
  <select name="mode">
265
270
  <option value="readonly">Только чтение (портфель и сверка)</option>
@@ -267,7 +272,18 @@
267
272
  <option value="auto">Автомат (лимитные заявки)</option>
268
273
  </select>
269
274
  </label>
270
- <label><span>Номер эксперимента для настроек (пусто — текущие)</span><input name="baseRunId" type="number" min="1" placeholder="например, 234"></label>
275
+ <label><span>Начальный портфель на счёте (переходный период)</span>
276
+ <select name="legacyMode">
277
+ <option value="isolate" selected>Изолированный карман — не трогать старые бумаги (рекомендуется)</option>
278
+ <option value="smooth">Плавный переход — продавать старые акции только под новые покупки или при угрозе обвала</option>
279
+ <option value="takeover">Полное управление — сразу продать нецелевые акции под стратегию</option>
280
+ </select>
281
+ </label>
282
+ <label><span>Эксперимент для настроек</span>
283
+ <select name="baseRunId" id="broker-run-select">
284
+ <option value="">Текущие настройки</option>
285
+ </select>
286
+ </label>
271
287
  <label><span>Лимит суммы на стратегию, ₽ (предохранитель)</span><input name="maxCapitalRub" type="number" min="10000" step="10000" value="100000"></label>
272
288
  <label><span>Дневной стоп по просадке, % (предохранитель)</span><input name="maxDailyDrawdownPct" type="number" min="0.5" max="50" step="0.5" value="3"></label>
273
289
  <label><span>Защитный отступ лимитной заявки, %</span><input name="limitOffsetPct" type="number" min="0" max="2" step="0.05" value="0.1"></label>
@@ -301,7 +317,7 @@
301
317
  </select>
302
318
  </label>
303
319
  <label><span>Адрес</span><input name="baseUrl" placeholder="https://…/v1/chat/completions"></label>
304
- <label data-for="key"><span id="llm-key-label">Ключ</span><input name="apiKey" type="password" autocomplete="new-password"></label>
320
+ <label data-for="key"><span id="llm-key-label">Ключ</span><input name="apiKey" type="text" class="secret-input" autocomplete="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true"></label>
305
321
  <label data-for="scope" hidden><span>Область доступа (scope)</span><input name="scope" placeholder="GIGACHAT_API_PERS"></label>
306
322
  <label data-for="cert" hidden><span>Сертификат НУЦ Минцифры (путь к .pem, для GigaChat)</span><input name="caFile" placeholder="путь к russian_trusted_root_ca.pem"></label>
307
323
  <label data-for="model"><span>Модель (идентификатор на сервере)</span><input name="model" placeholder="например, qwen/Qwen3-8B"></label>
@@ -327,7 +343,16 @@
327
343
 
328
344
  <div id="help" class="modal" hidden>
329
345
  <div class="modal-box">
330
- <div class="modal-head"><b>Справка</b><button id="help-close" class="icon">✕</button></div>
346
+ <div class="modal-head">
347
+ <div class="row-gap" style="align-items:center">
348
+ <b>Справка и документация</b>
349
+ <div class="seg" id="help-tabs" style="margin:0">
350
+ <button type="button" data-hdoc="ИНСТРУКЦИЯ.md" class="active">Как пользоваться</button>
351
+ <button type="button" data-hdoc="МЕХАНИКА_И_ПАРАМЕТРЫ.md">Механика и параметры</button>
352
+ </div>
353
+ </div>
354
+ <button id="help-close" class="icon">✕</button>
355
+ </div>
331
356
  <div id="help-body" class="md">Загрузка…</div>
332
357
  </div>
333
358
  </div>