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 +1 -1
- package/src/main.js +11 -1
- package/src/renderer/index.html +1 -0
- package/src/renderer/renderer.js +55 -0
- package/src/renderer/style.css +14 -0
package/package.json
CHANGED
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
|
-
|
|
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));
|
package/src/renderer/index.html
CHANGED
|
@@ -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">✕︎</button>
|
|
176
177
|
<button id="finSymAdd" title="Sembol ekle/çıkar — MT5 sembol listesinden seç">+</button>
|
|
177
178
|
</div>
|
|
178
179
|
<div id="finSymList"><div class="fin-empty">—</div></div>
|
package/src/renderer/renderer.js
CHANGED
|
@@ -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) => {
|
package/src/renderer/style.css
CHANGED
|
@@ -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 */
|