neuroalpha 0.5.11 → 0.5.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neuroalpha",
3
- "version": "0.5.11",
3
+ "version": "0.5.12",
4
4
  "description": "НейроАльфа — ИИ-автопилот для рынка акций Мосбиржи: эмбеддинги акций, самообучение правил, коннекторы Т-Банк / БКС / Финам / Алор и боты Telegram / MAX",
5
5
  "author": "Roman A. Perepelkin",
6
6
  "license": "UNLICENSED",
package/public/app.js CHANGED
@@ -2016,6 +2016,12 @@ function toggleBrokerHistFilter(id, flt) {
2016
2016
  }
2017
2017
  let openBrokerId = loadSavedNav().openBrokerId ?? null;
2018
2018
  let openBrokerCfgId = loadSavedNav().openBrokerCfgId ?? null;
2019
+ let hideBrokerSpecsById = new Set(Array.isArray(loadSavedNav().hideBrokerSpecs) ? loadSavedNav().hideBrokerSpecs : []);
2020
+ function toggleBrokerSpecs(id) {
2021
+ if (hideBrokerSpecsById.has(id)) hideBrokerSpecsById.delete(id);
2022
+ else hideBrokerSpecsById.add(id);
2023
+ saveNavPatch({ hideBrokerSpecs: [...hideBrokerSpecsById] });
2024
+ }
2019
2025
  let editingBrokerId = null;
2020
2026
  let brokerPollBusy = false;
2021
2027
  let lastBrokerPollTs = 0;
@@ -2409,6 +2415,7 @@ function renderBrokers() {
2409
2415
 
2410
2416
  const isPaused = a.autoSchedule === false || a.mode === 'readonly';
2411
2417
  const isEditingThis = editingBrokerId === a.id;
2418
+ const isSpecsHidden = hideBrokerSpecsById.has(a.id);
2412
2419
  const collapsedMetricsHtml = !isOpen && ls?.ok
2413
2420
  ? `<span class="small muted" style="margin-left:6px">Всего: <b style="color:var(--text)">${fmtNum(ls.totalRub, 0)} ₽</b> · Свободно: <b class="${ls.cashRub > 1000 ? 'pos' : ''}">${fmtNum(ls.cashRub, 0)} ₽</b>${ls.marginInfo ? ` · Марж. запас: <b class="pos">${fmtNum(ls.marginInfo.freeMarginRub, 0)} ₽</b>` : ''} · Финрез.: <b class="${cls(totalPnlRub)}">${totalPnlRub >= 0 ? '+' : ''}${fmtNum(totalPnlRub, 0)} ₽</b>${a.executionAudit?.periods ? ` · 30 дн.: <b class="${cls(a.executionAudit.periods.month.netRub)}">${a.executionAudit.periods.month.netRub >= 0 ? '+' : ''}${fmtNum(a.executionAudit.periods.month.netRub, 0)} ₽</b>` : ''}</span>`
2414
2421
  : '';
@@ -2427,6 +2434,7 @@ function renderBrokers() {
2427
2434
  <div class="row-gap" style="align-items:center">
2428
2435
  <button type="button" class="brk-toggle ${isPaused ? 'on' : ''}" data-btrade="pause" data-bid="${esc(a.id)}" title="${isPaused ? 'Авто-торговля на паузе. Нажмите, чтобы возобновить торговлю по расписанию' : 'Нажмите, чтобы поставить авто-торговлю на этом счёте на паузу'}">${isPaused ? '▶ Запустить' : '⏸ Пауза'}</button>
2429
2436
  ${isOpen && ls?.positions?.length ? `<button type="button" class="brk-toggle ${lMode === 'isolate' && Object.keys(baseMap).length ? 'on' : ''}" data-btrade="freeze" data-bid="${esc(a.id)}" title="${lMode === 'isolate' && Object.keys(baseMap).length ? 'Жёсткая защита включена (режим «Изолированный карман»): старые бумаги на счёте неприкосновенны. Нажмите, чтобы переключить в «Плавный переход».' : 'Нажмите, чтобы зафиксировать все текущие бумаги на счёте как неприкосновенные (включить режим «Изолированный карман»).'}">${lMode === 'isolate' && Object.keys(baseMap).length ? '🔒 Защита бумаг: ВКЛ' : '🔓 Защита бумаг: ВЫКЛ'}</button>` : ''}
2437
+ ${isOpen ? `<button type="button" class="brk-icon-btn${!isSpecsHidden ? ' primary' : ''}" data-btrade="specs" data-bid="${esc(a.id)}" title="${isSpecsHidden ? 'Показать служебную информацию по счёту' : 'Скрыть служебную информацию по счёту'}" aria-label="Служебная информация">ℹ</button>` : ''}
2430
2438
  ${isOpen ? `<button type="button" class="brk-icon-btn" data-btrade="events" data-bid="${esc(a.id)}" title="Журнал исполнения: отправленные заявки, ошибки брокера, стопы, ручные действия" aria-label="Журнал исполнения">📋</button>` : ''}
2431
2439
  ${isOpen ? `<button type="button" class="brk-icon-btn${isEditingThis ? ' primary' : ''}" data-btrade="cfg" data-bid="${esc(a.id)}" title="${isEditingThis ? 'Закрыть настройки и вернуться к торговле' : 'Настроить счёт и предохранители'}">⚙</button>` : ''}
2432
2440
  </div>
@@ -2434,7 +2442,7 @@ function renderBrokers() {
2434
2442
  <div ${isOpen ? '' : 'hidden'}>
2435
2443
  <div class="brk-cfg-mount" data-cfg-mount="${esc(a.id)}" ${isEditingThis ? '' : 'hidden'} style="margin-top:12px"></div>
2436
2444
  <div class="brk-trade-view" ${isEditingThis ? 'hidden' : ''}>
2437
- <div class="brk-specs">
2445
+ <div class="brk-specs" ${isSpecsHidden ? 'hidden' : ''}>
2438
2446
  <span class="k">Брокер и номер счёта:</span><span class="v"><b>${esc(BROKER_LABELS[a.broker] || a.broker)}</b> · <code>${esc(a.accountId || ls?.accountId || 'авто')}</code>${ls?.at ? ` <span class="muted">(обновлён ${fmtTs(ls.at)})</span>` : ''}</span>
2439
2447
  <span class="k">Режим работы счёта:</span><span class="v"><span class="tag ${a.mode === 'auto' ? 'mid' : a.mode === 'confirm' ? 'ok' : ''}">${esc(BROKER_MODES[a.mode] || a.mode)}</span> · авто-торговля по расписанию: <b>${a.autoSchedule !== false ? '<span class="pos">вкл.</span>' : '<span class="muted">на паузе</span>'}</b></span>
2440
2448
  <span class="k">Начальный портфель:</span><span class="v">${esc(LEGACY_MODES[lMode] || lMode)}</span>
@@ -2895,6 +2903,11 @@ $('#brokers-trade').addEventListener('click', async (e) => {
2895
2903
  }
2896
2904
  return;
2897
2905
  }
2906
+ if (act === 'specs') {
2907
+ toggleBrokerSpecs(id);
2908
+ renderBrokers();
2909
+ return;
2910
+ }
2898
2911
  if (act === 'events') {
2899
2912
  openBrokerEvents(id);
2900
2913
  return;
package/public/styles.css CHANGED
@@ -414,6 +414,7 @@ table.cmp td { padding: 3px 8px; }
414
414
  .brk-alloc-legend span { display: inline-flex; align-items: center; gap: 5px; }
415
415
  .brk-alloc-legend i { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }
416
416
  .brk-specs { display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: 4px 14px; font-size: 13px; margin: 10px 0; line-height: 1.45; }
417
+ .brk-specs[hidden] { display: none; }
417
418
  .brk-specs .k { color: var(--muted); }
418
419
  .brk-specs .v { color: var(--text); }
419
420
  .brk-toolbar { display: flex; flex-wrap: nowrap; align-items: center; gap: 8px; padding: 8px 0 10px; margin-bottom: 10px; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); overflow-x: auto; }