beast-agent 2.19.0 → 2.19.1

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,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "2.19.0",
4
+ "version": "2.19.1",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
package/src/main.js CHANGED
@@ -8725,7 +8725,17 @@ ipcMain.handle('finance:settings', async (_e, patch) => {
8725
8725
  const p = patch || {};
8726
8726
  if (p.symbols !== undefined) {
8727
8727
  const arr = Array.isArray(p.symbols) ? p.symbols : String(p.symbols).split(/[,\s]+/);
8728
- f.symbols = arr.map((s) => String(s).trim().toUpperCase()).filter(Boolean).slice(0, 20);
8728
+ const next = arr.map((s) => String(s).trim().toUpperCase()).filter(Boolean).slice(0, 20);
8729
+ /* SEMBOL GEÇMİŞİ: eklenen/silinen her sembol hatırlanır — izleme listesi
8730
+ tamamen silinse bile semboller geçmişte kalır, seçicide TEK TIKLA
8731
+ tekrar eklenir (brokere search'e gerek kalmaz). */
8732
+ const hist = Array.isArray(f.symbolHistory) ? f.symbolHistory.slice() : [];
8733
+ for (const s of [...(f.symbols || []), ...next]) {
8734
+ const u = String(s).toUpperCase();
8735
+ if (u && !hist.includes(u)) hist.push(u);
8736
+ }
8737
+ f.symbolHistory = hist.slice(-40);
8738
+ f.symbols = next;
8729
8739
  }
8730
8740
  if (p.intervalSec !== undefined) f.intervalSec = Math.max(30, Math.min(3600, Math.round(Number(p.intervalSec) || 120)));
8731
8741
  if (p.maxLot !== undefined) f.maxLot = Math.max(0.01, Math.min(100, Number(p.maxLot) || 0.1));
@@ -173,6 +173,7 @@
173
173
  <div class="fin-card-title">
174
174
  PİYASA
175
175
  <span class="file-spacer"></span>
176
+ <button id="finWatchClear" title="İzleme listesini TAMAMEN sil — semboller geçmişe düşer, sonra tek tıkla geri eklenir">&#x2715;&#xFE0E;</button>
176
177
  <button id="finSymAdd" title="Sembol ekle/çıkar — MT5 sembol listesinden seç">&#43;</button>
177
178
  </div>
178
179
  <div id="finSymList"><div class="fin-empty">—</div></div>
@@ -150,6 +150,7 @@ const els = {
150
150
  finInterval: $('#finInterval'),
151
151
  finMaxLot: $('#finMaxLot'),
152
152
  finSymBtn: $('#finSymBtn'),
153
+ finWatchClear: $('#finWatchClear'),
153
154
  finAllow: $('#finAllow'),
154
155
  finTraderBtn: $('#finTraderBtn'),
155
156
  finTraderDot: $('#finTraderDot'),
@@ -8502,6 +8503,10 @@ function finSymBtnUpdate() {
8502
8503
  function finTraderInputsSet(cfg) {
8503
8504
  if (!cfg) return;
8504
8505
  if (!finWatchDirty) finWatchSet(cfg.symbols);
8506
+ /* sembol geçmişi (silinenler dahil) — seçicide "SON SEMBOLLER" olarak çıkar */
8507
+ finSymHist = Array.isArray(cfg.symbolHistory)
8508
+ ? cfg.symbolHistory.map((s) => String(s).trim().toUpperCase()).filter(Boolean).slice(0, 40)
8509
+ : [];
8505
8510
  const ae = document.activeElement;
8506
8511
  if (els.finInterval && ae !== els.finInterval) els.finInterval.value = cfg.intervalSec || 120;
8507
8512
  if (els.finMaxLot && ae !== els.finMaxLot) els.finMaxLot.value = cfg.maxLot || 0.1;
@@ -8695,6 +8700,7 @@ if (els.finTraderBtn) {
8695
8700
  ekle/çıkar. PİYASA kartı yalnız seçili sembolleri gösterir. */
8696
8701
 
8697
8702
  let finWatch = []; /* anlık izleme listesi (snapshot cfg'den senkron) */
8703
+ let finSymHist = []; /* sembol geçmişi — silinenler dahil, seçicide tek tıkla geri ekleme */
8698
8704
  let finSymSearchTimer = null;
8699
8705
  let finSymRefreshTimer = null;
8700
8706
 
@@ -8718,12 +8724,41 @@ function finRenderPickRows(rows, q) {
8718
8724
  if (!els.finSymPick) return;
8719
8725
  els.finSymPick.textContent = '';
8720
8726
  const term = String(q || '').trim().toUpperCase();
8727
+ /* arama boşken ÜSTTE geçmiş bölümü: silinen semboller TEK TIKLA geri eklenir */
8728
+ if (!term && finSymHist.length) {
8729
+ const sec = document.createElement('div');
8730
+ sec.className = 'fin-sym-sec';
8731
+ sec.textContent = 'SON SEMBOLLER (sildiklerin dahil — tek tıkla geri ekle)';
8732
+ els.finSymPick.appendChild(sec);
8733
+ for (const name of finSymHist) {
8734
+ const row = document.createElement('div');
8735
+ row.className = 'fin-sym-row';
8736
+ const on = finWatch.includes(name);
8737
+ row.innerHTML =
8738
+ '<span class="fsr-check">' + (on ? '✓' : '') + '</span>' +
8739
+ '<span class="fsr-name">' + escapeHtml(name) + '</span>' +
8740
+ '<span class="fsr-desc">' + (on ? 'izlemede' : 'silinmiş — eklemek için tıkla') + '</span>';
8741
+ if (on) row.classList.add('on');
8742
+ row.addEventListener('click', () => {
8743
+ const added = finToggleWatch(name);
8744
+ row.classList.toggle('on', added);
8745
+ row.querySelector('.fsr-check').textContent = added ? '✓' : '';
8746
+ row.querySelector('.fsr-desc').textContent = added ? 'izlemede' : 'silinmiş — eklemek için tıkla';
8747
+ });
8748
+ els.finSymPick.appendChild(row);
8749
+ }
8750
+ const sep = document.createElement('div');
8751
+ sep.className = 'fin-sym-sec';
8752
+ sep.textContent = 'TÜM MT5 SEMBOLLERİ';
8753
+ els.finSymPick.appendChild(sep);
8754
+ }
8721
8755
  const matches = rows.filter((r) => {
8722
8756
  if (!term) return true;
8723
8757
  return (String(r.name || '').toUpperCase().includes(term) || String(r.desc || '').toUpperCase().includes(term));
8724
8758
  });
8725
8759
  if (els.finSymCount) els.finSymCount.textContent = matches.length ? matches.length + ' sembol' : '';
8726
8760
  if (!matches.length) {
8761
+ if (!term && finSymHist.length) return; /* geçmiş zaten gösterildi */
8727
8762
  const d = document.createElement('div');
8728
8763
  d.className = 'fin-empty';
8729
8764
  d.textContent = term ? 'Eşleşme yok' : 'Sembol listesi boş';
@@ -8788,6 +8823,26 @@ function finSymPickerClose() {
8788
8823
  }
8789
8824
 
8790
8825
  if (els.finSymAdd) els.finSymAdd.addEventListener('click', finSymPickerOpen);
8826
+ if (els.finWatchClear) {
8827
+ els.finWatchClear.addEventListener('click', async () => {
8828
+ if (!finWatch.length) {
8829
+ toast('İzleme listesi zaten boş');
8830
+ return;
8831
+ }
8832
+ const ok = await uiConfirm(
8833
+ 'İzleme listesindeki TÜM semboller silinsin mi? (' + finWatch.join(', ') + ')\nSilinenler geçmişte kalır — sembol seçicide TEK TIKLA geri ekleyebilirsin.',
8834
+ 'Tümünü Sil',
8835
+ 'Vazgeç'
8836
+ );
8837
+ if (!ok) return;
8838
+ finWatchSet([]);
8839
+ finSaveCfg({ symbols: [] });
8840
+ finSymBtnUpdate();
8841
+ clearTimeout(finSymRefreshTimer);
8842
+ finSymRefreshTimer = setTimeout(() => finSnapshot(), 700);
8843
+ toast('İzleme listesi temizlendi — semboller geçmişte duruyor');
8844
+ });
8845
+ }
8791
8846
  if (els.finSymClose) els.finSymClose.addEventListener('click', finSymPickerClose);
8792
8847
  if (els.finSymOverlay) {
8793
8848
  els.finSymOverlay.addEventListener('click', (e) => {
@@ -2206,6 +2206,20 @@ body.rail-hidden #dmRailHead { padding-right: 148px; }
2206
2206
  .fin-sym:hover .fs-agent { visibility: visible; color: var(--accent); }
2207
2207
  .fin-sym .fs-agent:hover { background: var(--accent-dim); }
2208
2208
 
2209
+ /* sembol seçicide bölüm başlıkları (geçmiş / tüm semboller) */
2210
+ .fin-sym-sec {
2211
+ font-size: 10px;
2212
+ font-weight: 800;
2213
+ letter-spacing: 0.6px;
2214
+ color: var(--accent);
2215
+ padding: 8px 4px 3px;
2216
+ border-bottom: 1px solid var(--border);
2217
+ margin-bottom: 3px;
2218
+ white-space: nowrap;
2219
+ overflow: hidden;
2220
+ text-overflow: ellipsis;
2221
+ }
2222
+
2209
2223
  /* ---------- BOT SİSTEMİ (sol panel alt bölümü + bot sayfası) ---------- */
2210
2224
 
2211
2225
  /* üst bardaki aktif bot rozeti */