beast-agent 2.33.0 → 2.34.0

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.33.0",
4
+ "version": "2.34.0",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
package/src/main.js CHANGED
@@ -9582,6 +9582,7 @@ ipcMain.handle('finance:mode', async (_e, payload) => {
9582
9582
  financeState.mode = !!(payload && payload.on);
9583
9583
  const sid = String((payload && payload.sessionId) || '');
9584
9584
  let needNew = false;
9585
+ let resumeSid = '';
9585
9586
  if (sid && engine) {
9586
9587
  try {
9587
9588
  let s = engine.cache.get(sid);
@@ -9605,9 +9606,21 @@ ipcMain.handle('finance:mode', async (_e, payload) => {
9605
9606
  }
9606
9607
  } catch {}
9607
9608
  }
9609
+ /* ESKİ SOHBETTEN DEVAM: finance moduna girerken aktif oturum finance değilse
9610
+ (örn. normal sohbet) yeni oturum AÇMAK yerine en son kullanılan finance
9611
+ sohbet oturumu önerilir; hiç yoksa yeni oturum açılır. */
9612
+ if (financeState.mode && needNew && engine) {
9613
+ try {
9614
+ const prev = (engine.listSessions() || []).find((v) => v && v.finance && !v.isBg && v.id);
9615
+ if (prev) {
9616
+ resumeSid = String(prev.id);
9617
+ needNew = false;
9618
+ }
9619
+ } catch {}
9620
+ }
9608
9621
  /* OTOMATİK TRADER KAPALI: finance moduna geçmek trader'ı KENDİLİĞİNDEN
9609
9622
  başlatmaz — kullanıcı TRADE AJANI kartındaki ▶ ile elle başlatır */
9610
- return { ok: true, mode: financeState.mode, needNew };
9623
+ return { ok: true, mode: financeState.mode, needNew, resumeSid };
9611
9624
  });
9612
9625
 
9613
9626
  /* MT5 sembol seçici: terminaldeki tüm semboller (isteğe bağlı *filter*) */
@@ -150,19 +150,20 @@
150
150
  <span id="finTerm" title="">MT5</span>
151
151
  <span class="file-spacer"></span>
152
152
  <button id="finReconnect" title="MT5'e yeniden bağlan">&#x27F3;</button>
153
+ <button id="finSettings" title="Görünüm ayarları — bölümleri göster/gizle">&#9881;</button>
153
154
  </div>
154
155
  <div id="finBody">
155
156
  <div class="fin-card">
156
157
  <div class="fin-card-title">HESAP</div>
157
158
  <div class="fin-grid">
158
159
  <div class="fin-kv"><span>Bakiye</span><b id="finBalance">—</b></div>
159
- <div class="fin-kv"><span>Özkaynak</span><b id="finEquity">—</b></div>
160
+ <div class="fin-kv"><span>Varlık</span><b id="finEquityValue">—</b></div>
160
161
  <div class="fin-kv"><span>Kâr/Zarar</span><b id="finProfit">—</b></div>
161
162
  <div class="fin-kv"><span>Serbest Marj</span><b id="finFree">—</b></div>
162
163
  </div>
163
164
  </div>
164
165
  <div class="fin-card fin-card-trader">
165
- <div class="fin-card-title">TRADE AJANI <span id="finTraderDot" class="fin-dot off" title="Trader durumu"></span><span class="file-spacer"></span><button id="finSkillsBtn" title="Rol → skill eşleştirmesi — hangi rol hangi skill'i okur">&#9881;</button></div>
166
+ <div class="fin-card-title">TRADE AJANI <span id="finTraderDot" class="fin-dot off" title="Trader durumu"></span><span class="file-spacer"></span><button id="finModelRefreshBtn" title="Modelleri yeniden çek — eksik/güncel modelleri tazeler">&#x27F3;</button><button id="finSkillsBtn" title="Rol → skill eşleştirmesi — hangi rol hangi skill'i okur">&#9881;</button></div>
166
167
  <div class="fin-field">
167
168
  <span>Model</span>
168
169
  <select id="finTraderModel" title="Trader ajanının modeli — farklı API/model seçilebilir"></select>
@@ -190,7 +191,7 @@
190
191
  </div>
191
192
  <div id="finTraderStatus">Kapalı</div>
192
193
  </div>
193
- <div class="fin-card">
194
+ <div class="fin-card" id="finRiskCard" hidden>
194
195
  <div class="fin-card-title">RİSK OTOMASYONU <span id="finWatchDot" class="fin-dot off" title="Koruma döngüsü"></span><span id="finWatchInfo" class="fin-hint"></span></div>
195
196
  <div class="fin-field fin-check">
196
197
  <label title="5 saniyelik döngü: +R'da SL'yi başabaşa çeker, trailing uygular, kısmi TP alır — ajan turunu beklemez">
@@ -231,9 +232,9 @@
231
232
  </div>
232
233
  <div id="finAlertList" class="fin-alerts"><div class="fin-empty">Aktif fiyat alarmı yok</div></div>
233
234
  </div>
234
- <div class="fin-card">
235
+ <div class="fin-card" id="finPerfCard" hidden>
235
236
  <div class="fin-card-title">PERFORMANS <span id="finStatsInfo" class="fin-hint"></span><span class="file-spacer"></span><button id="finReportBtn" title="Haftalık rapor üret — istatistik + işlem günlüğü + ajan değerlendirmesi">&#128196; Rapor</button></div>
236
- <div id="finEquity" class="fin-equity"></div>
237
+ <div id="finEquityChart" class="fin-equity"></div>
237
238
  <div class="fin-grid">
238
239
  <div class="fin-kv"><span>Bugün</span><b id="finStatToday">—</b></div>
239
240
  <div class="fin-kv"><span>Hafta</span><b id="finStatWeek">—</b></div>
@@ -258,7 +259,7 @@
258
259
  </div>
259
260
  <div id="finSymList"><div class="fin-empty">—</div></div>
260
261
  </div>
261
- <div class="fin-card fin-grow">
262
+ <div class="fin-card fin-grow" id="finFlowCard" hidden>
262
263
  <div class="fin-card-title">AKIŞ</div>
263
264
  <div id="finLog"></div>
264
265
  </div>
@@ -754,6 +755,31 @@
754
755
  </div>
755
756
  </div>
756
757
 
758
+ <div id="finSettingsOverlay" class="mini-overlay" hidden>
759
+ <div class="mini-dialog fin-settings-dialog">
760
+ <div class="mini-head">
761
+ <span class="mini-title">FINANCE GÖRÜNÜM AYARLARI</span>
762
+ <button class="mini-close" id="finSettingsClose" title="Kapat">&#x00D7;</button>
763
+ </div>
764
+ <div class="mini-body">
765
+ <div class="fin-set-hint">Varsayılan olarak üç bölüm de gizlidir — açmak tamamen isteğe bağlıdır. Seçim bilgisayarda hatırlanır. Risk otomasyonu gizliyken AKTİF OLMAZ.</div>
766
+ <label class="fin-set-row" title="BE + trailing + kısmi TP koruması, günlük limitler, fiyat alarmları bölümü">
767
+ <input id="finShowRisk" type="checkbox" />
768
+ <span class="fsr-main"><b>RİSK OTOMASYONU</b><i>BE + trailing + kısmi TP, günlük limitler, alarmlar</i></span>
769
+ </label>
770
+ <label class="fin-set-row" title="Equity grafiği + günlük/haftalık istatistikler + haftalık rapor bölümü">
771
+ <input id="finShowPerf" type="checkbox" />
772
+ <span class="fsr-main"><b>PERFORMANS</b><i>Equity grafiği, istatistikler, haftalık rapor</i></span>
773
+ </label>
774
+ <label class="fin-set-row" title="Ajan/MT5 işlem günlüğü akışı bölümü">
775
+ <input id="finShowFlow" type="checkbox" />
776
+ <span class="fsr-main"><b>AKIŞ</b><i>Ajan ve MT5 olay günlüğü</i></span>
777
+ </label>
778
+ <div class="fin-set-note">RİSK OTOMASYONU gizliyken koruma döngüsü (watchdog) kapatılır; tekrar gösterdiğinde ilgili kutucuktan açabilirsin.</div>
779
+ </div>
780
+ </div>
781
+ </div>
782
+
757
783
  <div id="cronOverlay" class="mini-overlay" hidden>
758
784
  <div class="mini-dialog">
759
785
  <div class="mini-head">
@@ -165,11 +165,21 @@ const els = {
165
165
  finDot: $('#finDot'),
166
166
  finTerm: $('#finTerm'),
167
167
  finReconnect: $('#finReconnect'),
168
+ finSettings: $('#finSettings'),
169
+ finSettingsOverlay: $('#finSettingsOverlay'),
170
+ finSettingsClose: $('#finSettingsClose'),
171
+ finShowRisk: $('#finShowRisk'),
172
+ finShowPerf: $('#finShowPerf'),
173
+ finShowFlow: $('#finShowFlow'),
174
+ finRiskCard: $('#finRiskCard'),
175
+ finPerfCard: $('#finPerfCard'),
176
+ finFlowCard: $('#finFlowCard'),
168
177
  finBalance: $('#finBalance'),
169
- finEquity: $('#finEquity'),
178
+ finEquity: $('#finEquityValue'),
170
179
  finProfit: $('#finProfit'),
171
180
  finFree: $('#finFree'),
172
181
  finTraderModel: $('#finTraderModel'),
182
+ finModelRefreshBtn: $('#finModelRefreshBtn'),
173
183
  finInterval: $('#finInterval'),
174
184
  finMaxLot: $('#finMaxLot'),
175
185
  finSymBtn: $('#finSymBtn'),
@@ -218,7 +228,7 @@ const els = {
218
228
  finStatPf: $('#finStatPf'),
219
229
  finStatDd: $('#finStatDd'),
220
230
  finStatTrades: $('#finStatTrades'),
221
- finEquityBox: $('#finEquity'),
231
+ finEquityBox: $('#finEquityChart'),
222
232
  stVideoEl: $('#stVideoEl'),
223
233
  stVideoName: $('#stVideoName'),
224
234
  stVideoOpen: $('#stVideoOpen'),
@@ -7169,6 +7179,8 @@ async function init() {
7169
7179
  try {
7170
7180
  state = await beast.refreshModels();
7171
7181
  applyState();
7182
+ /* finance modu açıksa TRADE AJANI model listesini de tazele */
7183
+ if (financeModeOn()) await finFillModels();
7172
7184
  toast(_t('mr_done'));
7173
7185
  } catch {
7174
7186
  toast(_t('ws_fail_toast'));
@@ -9391,7 +9403,7 @@ function finDayKey(ms) {
9391
9403
  function finRenderAutomation(cfg, watch) {
9392
9404
  if (!cfg) return;
9393
9405
  const ae = document.activeElement;
9394
- if (els.finWatchdogCb) els.finWatchdogCb.checked = cfg.watchdog !== false;
9406
+ if (els.finWatchdogCb) els.finWatchdogCb.checked = finView.risk && cfg.watchdog !== false;
9395
9407
  const setNum = (el, v) => {
9396
9408
  if (el && ae !== el) el.value = v;
9397
9409
  };
@@ -9493,6 +9505,8 @@ function finRenderAlerts(list) {
9493
9505
 
9494
9506
  async function finFillModels() {
9495
9507
  if (!els.finTraderModel) return;
9508
+ /* mevcut seçim korunur — yenilemede model kaybolursa "Genel aktif model"e düşer */
9509
+ const cur = els.finTraderModel.value || (finCfgCache && finCfgCache.traderSel) || '';
9496
9510
  let models = [];
9497
9511
  try {
9498
9512
  const st = await beast.getState();
@@ -9502,11 +9516,13 @@ async function finFillModels() {
9502
9516
  const optAuto = document.createElement('option');
9503
9517
  optAuto.value = '';
9504
9518
  optAuto.textContent = 'Genel aktif model';
9519
+ if (!cur) optAuto.selected = true;
9505
9520
  els.finTraderModel.appendChild(optAuto);
9506
9521
  for (const m of models) {
9507
9522
  const o = document.createElement('option');
9508
9523
  o.value = m.sel;
9509
9524
  o.textContent = (m.providerName || m.sel) + ' · ' + m.model;
9525
+ if (m.sel === cur) o.selected = true;
9510
9526
  els.finTraderModel.appendChild(o);
9511
9527
  }
9512
9528
  finModelsFilled = true;
@@ -9533,6 +9549,8 @@ async function finSnapshot() {
9533
9549
  finRenderRoles(r.cfg);
9534
9550
  finRenderTrader(r.trader, r.cfg);
9535
9551
  finRenderAutomation(r.cfg, r.watch);
9552
+ /* GİZLİ RİSK OTOMASYONU AKTİF OLAMAZ: sunucu hâlâ açık diyorsa kapat */
9553
+ if (!finView.risk && r.cfg && r.cfg.watchdog !== false) finSaveCfg({ watchdog: false });
9536
9554
  finRenderStats(r.stats, r.equity, r.account && r.account.currency ? r.account.currency : '');
9537
9555
  finRenderAlerts(r.alerts);
9538
9556
  }
@@ -9583,8 +9601,11 @@ async function setFinanceMode(on) {
9583
9601
  try { localStorage.setItem('beast.financeMode', on ? '1' : '0'); } catch {}
9584
9602
  const fm = await beast.financeMode(!!on, activeId).catch(() => ({}));
9585
9603
  /* finance modu açıldı ama aktif oturum NORMAL (örn. WhatsApp sohbeti) ise
9586
- ASLA o oturumu finance'e çevirme — kendine ÖZEL finance oturumu aç */
9587
- if (on && fm && fm.needNew) {
9604
+ ASLA o oturumu finance'e çevirme — önce EN SON finance sohbetinden devam
9605
+ et (resumeSid); hiç finance sohbeti yoksa kendine ÖZEL yeni oturum aç */
9606
+ if (on && fm && fm.resumeSid) {
9607
+ try { await openSession(fm.resumeSid); } catch {}
9608
+ } else if (on && fm && fm.needNew) {
9588
9609
  try {
9589
9610
  const created = await beast.createSession();
9590
9611
  if (created && created.id) await openSession(created.id);
@@ -9630,6 +9651,78 @@ function finSaveCfg(patch) {
9630
9651
  beast.financeSettings(patch).then(() => { finWatchDirty = false; }).catch(() => { finWatchDirty = false; });
9631
9652
  }, 400);
9632
9653
  }
9654
+
9655
+ /* ---------- GÖRÜNÜM AYARLARI (isteğe bağlı bölümler) ----------
9656
+ RİSK OTOMASYONU + PERFORMANS + AKIŞ varsayılan GİZLİ; açmak isteğe bağlı.
9657
+ Seçim localStorage'da hatırlanır. Risk otomasyonu gizliyken watchdog
9658
+ AKTİF OLMAZ — kart yeniden gösterilince kutucuktan açılabilir. */
9659
+ const finViewKey = 'beast.financeView';
9660
+ const finView = { risk: false, perf: false, flow: false };
9661
+ try {
9662
+ const v = JSON.parse(localStorage.getItem(finViewKey) || 'null');
9663
+ if (v && typeof v === 'object') {
9664
+ finView.risk = v.risk === true;
9665
+ finView.perf = v.perf === true;
9666
+ finView.flow = v.flow === true;
9667
+ }
9668
+ } catch {}
9669
+
9670
+ function finViewPaint() {
9671
+ if (els.finRiskCard) els.finRiskCard.hidden = !finView.risk;
9672
+ if (els.finPerfCard) els.finPerfCard.hidden = !finView.perf;
9673
+ if (els.finFlowCard) els.finFlowCard.hidden = !finView.flow;
9674
+ if (els.finShowRisk) els.finShowRisk.checked = finView.risk;
9675
+ if (els.finShowPerf) els.finShowPerf.checked = finView.perf;
9676
+ if (els.finShowFlow) els.finShowFlow.checked = finView.flow;
9677
+ const row = (cb) => cb && cb.closest('.fin-set-row');
9678
+ const r1 = row(els.finShowRisk); if (r1) r1.classList.toggle('on', finView.risk);
9679
+ const r2 = row(els.finShowPerf); if (r2) r2.classList.toggle('on', finView.perf);
9680
+ const r3 = row(els.finShowFlow); if (r3) r3.classList.toggle('on', finView.flow);
9681
+ }
9682
+
9683
+ function finViewApply() {
9684
+ finViewPaint();
9685
+ /* gizli risk otomasyonu aktif kalmaz */
9686
+ if (!finView.risk && els.finWatchdogCb) els.finWatchdogCb.checked = false;
9687
+ try { localStorage.setItem(finViewKey, JSON.stringify(finView)); } catch {}
9688
+ if (!finView.risk) finSaveCfg({ watchdog: false });
9689
+ }
9690
+
9691
+ function finSettingsOpen() {
9692
+ if (els.finSettingsOverlay) els.finSettingsOverlay.hidden = false;
9693
+ }
9694
+ function finSettingsCloseModal() {
9695
+ if (els.finSettingsOverlay) els.finSettingsOverlay.hidden = true;
9696
+ }
9697
+
9698
+ function finViewToggle(key, on) {
9699
+ finView[key] = !!on;
9700
+ finViewApply();
9701
+ if (key === 'risk') {
9702
+ toast(on
9703
+ ? 'RİSK OTOMASYONU gösteriliyor — aktif etmek için karttaki kutucuğu işaretle'
9704
+ : 'RİSK OTOMASYONU gizlendi ve kapatıldı');
9705
+ } else {
9706
+ toast((key === 'perf' ? 'PERFORMANS' : 'AKIŞ') + (on ? ' bölümü gösteriliyor' : ' bölümü gizlendi'));
9707
+ }
9708
+ if (financeModeOn()) finSnapshot();
9709
+ }
9710
+
9711
+ if (els.finSettings) els.finSettings.addEventListener('click', finSettingsOpen);
9712
+ if (els.finSettingsClose) els.finSettingsClose.addEventListener('click', finSettingsCloseModal);
9713
+ if (els.finSettingsOverlay) {
9714
+ els.finSettingsOverlay.addEventListener('click', (e) => {
9715
+ if (e.target === els.finSettingsOverlay) finSettingsCloseModal();
9716
+ });
9717
+ els.finSettingsOverlay.addEventListener('keydown', (e) => {
9718
+ if (e.key === 'Escape') { e.stopPropagation(); finSettingsCloseModal(); }
9719
+ });
9720
+ }
9721
+ if (els.finShowRisk) els.finShowRisk.addEventListener('change', () => finViewToggle('risk', els.finShowRisk.checked));
9722
+ if (els.finShowPerf) els.finShowPerf.addEventListener('change', () => finViewToggle('perf', els.finShowPerf.checked));
9723
+ if (els.finShowFlow) els.finShowFlow.addEventListener('change', () => finViewToggle('flow', els.finShowFlow.checked));
9724
+ finViewApply();
9725
+
9633
9726
  if (els.finInterval) els.finInterval.addEventListener('change', () => {
9634
9727
  const v = Math.max(30, Math.min(3600, Math.round(Number(els.finInterval.value) || 120)));
9635
9728
  els.finInterval.value = v;
@@ -9704,6 +9797,23 @@ if (els.finTraderModel) {
9704
9797
  toast('Trade ajanı modeli: ' + (els.finTraderModel.value || 'genel aktif model'));
9705
9798
  });
9706
9799
  }
9800
+ /* TRADE AJANI: modelleri yeniden çek — üstteki ⟳ ile aynı mantık
9801
+ (models:refresh). Eksik/yeni modeller listeye girer, seçim korunur. */
9802
+ if (els.finModelRefreshBtn) {
9803
+ els.finModelRefreshBtn.addEventListener('click', async () => {
9804
+ els.finModelRefreshBtn.classList.add('spin');
9805
+ try {
9806
+ state = await beast.refreshModels();
9807
+ applyState();
9808
+ await finFillModels();
9809
+ toast(_t('mr_done'));
9810
+ } catch {
9811
+ toast(_t('ws_fail_toast'));
9812
+ } finally {
9813
+ els.finModelRefreshBtn.classList.remove('spin');
9814
+ }
9815
+ });
9816
+ }
9707
9817
  if (els.finTraderBtn) {
9708
9818
  els.finTraderBtn.addEventListener('click', async () => {
9709
9819
  if (els.finTraderBtn.classList.contains('stop')) {
@@ -287,9 +287,9 @@ body:not(.ide-mode):not(.studio-mode):not(.sandbox-mode) #watchPane { display: f
287
287
  /* Studio tuşu artık topbar'da (dd-btn dd-icon-btn) — aktif rozet diğer topbar ikonlarıyla aynı */
288
288
  #studioBtn.on { background: var(--accent-dim); color: var(--accent); }
289
289
 
290
- /* model refresh butonu — çekerken döner */
291
- #modelRefreshBtn.spin { opacity: .7; pointer-events: none; }
292
- #modelRefreshBtn.spin { animation: beast-spin 0.9s linear infinite; }
290
+ /* model refresh butonları — çekerken döner */
291
+ #modelRefreshBtn.spin, #finModelRefreshBtn.spin { opacity: .7; pointer-events: none; }
292
+ #modelRefreshBtn.spin, #finModelRefreshBtn.spin { animation: beast-spin 0.9s linear infinite; }
293
293
  @keyframes beast-spin { to { transform: rotate(360deg); } }
294
294
 
295
295
  /* ---------- cron modülü (ayarlar sekmesi) ---------- */
@@ -5202,3 +5202,32 @@ body.finance-mode #composerWrap { margin-right: var(--finW, 400px); }
5202
5202
  .fin-skill-chip:hover { border-color: var(--accent); }
5203
5203
  .fin-skill-chip.on { border-color: var(--accent); color: var(--accent); background: var(--accent-dim); }
5204
5204
  .fin-skill-chip input { flex: none; width: auto; margin: 0; }
5205
+
5206
+ /* FINANCE GÖRÜNÜM AYARLARI modalı (başlıktaki ⚙) — isteğe bağlı bölümler */
5207
+ .fin-card[hidden] { display: none; }
5208
+ .fin-settings-dialog { width: min(440px, 90vw); height: auto; max-height: min(560px, 84vh); }
5209
+ .fin-set-hint {
5210
+ font-size: 11px;
5211
+ color: var(--muted);
5212
+ line-height: 1.45;
5213
+ margin-bottom: 10px;
5214
+ }
5215
+ .fin-set-row {
5216
+ display: flex;
5217
+ align-items: flex-start;
5218
+ gap: 9px;
5219
+ background: var(--panel);
5220
+ border: 1px solid var(--border);
5221
+ border-radius: 9px;
5222
+ padding: 9px 10px;
5223
+ margin-bottom: 6px;
5224
+ cursor: pointer;
5225
+ user-select: none;
5226
+ }
5227
+ .fin-set-row:hover { border-color: var(--accent); }
5228
+ .fin-set-row.on { border-color: var(--accent); background: var(--accent-dim); }
5229
+ .fin-set-row input { flex: none; width: auto; margin: 2px 0 0; accent-color: var(--accent); }
5230
+ .fin-set-row .fsr-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
5231
+ .fin-set-row .fsr-main b { font-size: 12px; color: var(--text); letter-spacing: 0.4px; }
5232
+ .fin-set-row .fsr-main i { font-style: normal; font-size: 10.5px; color: var(--muted); }
5233
+ .fin-set-note { margin-top: 8px; font-size: 10.5px; color: var(--muted); line-height: 1.4; }