beast-agent 2.76.6 → 2.77.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.
Files changed (54) hide show
  1. package/package.json +1 -1
  2. package/src/agent/bots.js +669 -664
  3. package/src/agent/customtools.js +6 -19
  4. package/src/agent/engine.js +55 -307
  5. package/src/agent/seeds/tool-yazma/SKILL.md +13 -16
  6. package/src/agent/skills.js +14 -35
  7. package/src/agent/supertonic.js +622 -0
  8. package/src/agent/tools.js +3 -7
  9. package/src/main.js +77 -6164
  10. package/src/preload.js +2 -18
  11. package/src/renderer/i18n.js +14 -8
  12. package/src/renderer/index.html +0 -297
  13. package/src/renderer/renderer.js +142 -2301
  14. package/src/renderer/style.css +3 -825
  15. package/src/agent/defaulttools/mt5_barlar2/run.js +0 -188
  16. package/src/agent/defaulttools/mt5_barlar2/tool.json +0 -23
  17. package/src/agent/defaulttools/mt5_bekleyen/run.js +0 -105
  18. package/src/agent/defaulttools/mt5_bekleyen/tool.json +0 -18
  19. package/src/agent/defaulttools/mt5_durum/run.js +0 -93
  20. package/src/agent/defaulttools/mt5_durum/tool.json +0 -10
  21. package/src/agent/defaulttools/mt5_emir/run.js +0 -98
  22. package/src/agent/defaulttools/mt5_emir/tool.json +0 -17
  23. package/src/agent/defaulttools/mt5_emir_iptal/run.js +0 -90
  24. package/src/agent/defaulttools/mt5_emir_iptal/tool.json +0 -12
  25. package/src/agent/defaulttools/mt5_fiyat/run.js +0 -87
  26. package/src/agent/defaulttools/mt5_fiyat/tool.json +0 -16
  27. package/src/agent/defaulttools/mt5_gecmis/run.js +0 -87
  28. package/src/agent/defaulttools/mt5_gecmis/tool.json +0 -12
  29. package/src/agent/defaulttools/mt5_kapat/run.js +0 -108
  30. package/src/agent/defaulttools/mt5_kapat/tool.json +0 -15
  31. package/src/agent/defaulttools/mt5_m15_m5/m15m5.py +0 -60
  32. package/src/agent/defaulttools/mt5_m15_m5/run.js +0 -73
  33. package/src/agent/defaulttools/mt5_m15_m5/tool.json +0 -10
  34. package/src/agent/defaulttools/mt5_pozisyon_gecmis/run.js +0 -144
  35. package/src/agent/defaulttools/mt5_pozisyon_gecmis/tool.json +0 -12
  36. package/src/agent/defaulttools/mt5_shot/run.js +0 -649
  37. package/src/agent/defaulttools/mt5_shot/stitch.js +0 -151
  38. package/src/agent/defaulttools/mt5_shot/tool.json +0 -25
  39. package/src/agent/defaulttools/mt5_sltp/run.js +0 -92
  40. package/src/agent/defaulttools/mt5_sltp/tool.json +0 -14
  41. package/src/agent/financetools.js +0 -1025
  42. package/src/agent/finindicators.js +0 -254
  43. package/src/agent/finrisk.js +0 -289
  44. package/src/agent/finstats.js +0 -239
  45. package/src/agent/finwatch.js +0 -302
  46. package/src/agent/mt5/BeastFinance.mq5 +0 -498
  47. package/src/agent/mt5/BeastShot.tpl +0 -0
  48. package/src/agent/mt5setup.js +0 -542
  49. package/src/agent/scripts/mt5_bridge.py +0 -575
  50. package/src/agent/seeds/haber-duygu/SKILL.md +0 -49
  51. package/src/agent/seeds/mql5/SKILL.md +0 -154
  52. package/src/agent/seeds/price-action/SKILL.md +0 -60
  53. package/src/agent/seeds/risk-yonetimi/SKILL.md +0 -52
  54. package/src/mt5bridge.js +0 -215
@@ -10,9 +10,6 @@ const llm = require('./llm');
10
10
  const { chatStream, chatStreamAuto, chatOnce } = llm;
11
11
  const { chatCompletionsUrl, beastDir } = require('./config');
12
12
  const tools = require('./tools');
13
- let financetools = null;
14
- try { financetools = require('./financetools'); } catch {}
15
- const FINANCE_TOOL_SET = new Set(financetools ? financetools.NAMES : []);
16
13
  const customtools = require('./customtools');
17
14
  const research = require('./research');
18
15
  const agentdefs = require('./agentdefs');
@@ -409,7 +406,7 @@ class Engine {
409
406
  /* #17 kalıcı ajan geçmişi: restart sonrası işler + sohbetler kaybolmasın */
410
407
  this._bgJobsFile = path.join(this.sessionsDir, 'bg-jobs.json');
411
408
  this._loadBgJobsPersisted();
412
- /* AJAN DM: paralel/finance ajanlarının birbirine attığı mesajlar
409
+ /* AJAN DM: paralel ajanların birbirine attığı mesajlar
413
410
  (AJAN DM paneli buradan beslenir; restart sonrası da durur) */
414
411
  this._agentDms = [];
415
412
  this._agentDmsFile = path.join(this.sessionsDir, 'agent-dms.json');
@@ -451,7 +448,7 @@ class Engine {
451
448
  if (nrBoot.unref) nrBoot.unref();
452
449
  skills.seedIfEmpty();
453
450
  agentdefs.seedIfEmpty();
454
- try { customtools.seedDefaults(); } catch {} // varsayılan MT5 toolları (mt5_shot, mt5_barlar2, ...) — tüm oturumlara açılır
451
+ try { customtools.seedDefaults(); } catch {} // varsayılan toollar — tüm oturumlara açılır
455
452
  }
456
453
 
457
454
  /* ---------- opencode agent.ts port: özel ajanlar ---------- */
@@ -1255,15 +1252,6 @@ class Engine {
1255
1252
  } else if (rec.t === 'bcws') {
1256
1253
  /* Beast Code oturumu: hangi çalışma klasörüne bağlı */
1257
1254
  session.bcWs = String(rec.ws || '');
1258
- } else if (rec.t === 'fin') {
1259
- /* Beast Finance oturumu: kalıcı izolasyon etiketi (finoff kapatır) */
1260
- session.finance = true;
1261
- session.financeTrader = !!rec.trader;
1262
- if (rec.role) session.financeRole = String(rec.role);
1263
- } else if (rec.t === 'finoff') {
1264
- session.finance = false;
1265
- session.financeTrader = false;
1266
- delete session.financeRole;
1267
1255
  } else if (rec.t === 'msg') {
1268
1256
  delete rec.t;
1269
1257
  session.messages.push(rec);
@@ -1324,12 +1312,9 @@ class Engine {
1324
1312
  let r;
1325
1313
  try { r = JSON.parse(l); } catch { continue; }
1326
1314
  if (r.t === 'meta') out.push(JSON.stringify({ t: 'meta', id: s.id, code: s.code, createdAt: s.createdAt }));
1327
- /* KALICİ ETİKETLER compact'ta ASLA düşmez — özellikle 'fin'/'finoff':
1328
- silinirse finance oturumu etiketini KAYBEDER ve mt5_* araçları
1329
- "unknown tool" olur (bayat compact kaybı bu yüzden) */
1315
+ /* KALICİ ETİKETLER compact'ta ASLA düşmez */
1330
1316
  else if (
1331
1317
  r.t === 'meta2' || r.t === 'bot' || r.t === 'todo' ||
1332
- r.t === 'fin' || r.t === 'finoff' ||
1333
1318
  r.t === 'agent' || r.t === 'bcws' || r.t === 'botdm'
1334
1319
  ) out.push(l);
1335
1320
  }
@@ -1407,42 +1392,10 @@ class Engine {
1407
1392
  count: s.messages.length,
1408
1393
  isBg,
1409
1394
  isBotDm: !!s.isBotDm,
1410
- finance: !!s.finance,
1411
1395
  bgStatus: isBg ? (job ? job.status : null) : null,
1412
1396
  };
1413
1397
  }
1414
1398
 
1415
- /* Beast Finance etiketi: oturumu finance sohbeti olarak KALICI işaretler
1416
- (jsonl'e 'fin' satırı düşer — restart sonrası da hatırlanır) */
1417
- markFinance(id, trader = false, role = '') {
1418
- const s = this._load(String(id));
1419
- s.finance = true;
1420
- s.financeTrader = !!trader;
1421
- if (role) s.financeRole = String(role);
1422
- else delete s.financeRole;
1423
- try {
1424
- fs.appendFileSync(
1425
- this._file(s.id),
1426
- JSON.stringify({ t: 'fin', trader: !!trader, role: String(role || ''), at: nowIso() }) + '\n'
1427
- );
1428
- } catch {}
1429
- this.cache.set(String(s.id), s);
1430
- return s;
1431
- }
1432
-
1433
- /* Finance etiketini kaldır — oturum normal sohbete döner */
1434
- unmarkFinance(id) {
1435
- const s = this._load(String(id));
1436
- s.finance = false;
1437
- s.financeTrader = false;
1438
- delete s.financeRole;
1439
- try {
1440
- fs.appendFileSync(this._file(s.id), JSON.stringify({ t: 'finoff', at: nowIso() }) + '\n');
1441
- } catch {}
1442
- this.cache.set(String(s.id), s);
1443
- return s;
1444
- }
1445
-
1446
1399
  /* #17 paralel ajan oturumları sol sohbet listesine KARIŞMAZ;
1447
1400
  geçmişleri sağdaki Paralel Ajanlar panelinde izlenir */
1448
1401
  listSessions() {
@@ -1451,21 +1404,16 @@ class Engine {
1451
1404
  files = fs.readdirSync(this.sessionsDir).filter((f) => f.endsWith('.jsonl'));
1452
1405
  } catch {}
1453
1406
  const out = [];
1454
- const fin = [];
1455
1407
  for (const f of files) {
1456
1408
  const id = f.replace(/\.jsonl$/, '');
1457
1409
  const v = this._view(this._load(id));
1458
1410
  if (v.isBg) continue;
1459
1411
  if (v.isBotDm) continue; // botlar arası DM — yalnız admin DM Log ekranında
1460
- /* FİNANS GEÇMİŞİ KAYBOLMAZ: normal sohbet listesi 100 ile sınırlı olsa da
1461
- finance sohbetleri AYRICA listelenir — 100+ oturumu olan kullanıcıda
1462
- eski finance sohbetleri listeden düşüp "kaybolmuş" görünmez. */
1463
- (v.finance ? fin : out).push(v);
1412
+ out.push(v);
1464
1413
  }
1465
1414
  const byNew = (a, b) => String(b.updatedAt).localeCompare(String(a.updatedAt));
1466
1415
  out.sort(byNew);
1467
- fin.sort(byNew);
1468
- return out.slice(0, 100).concat(fin.slice(0, 60)).sort(byNew);
1416
+ return out.slice(0, 100);
1469
1417
  }
1470
1418
 
1471
1419
  /* Panel oturumları: belirli bir bgTitle taşıyan gizli oturumlar (Beast Code,
@@ -1540,10 +1488,9 @@ class Engine {
1540
1488
  const kept = lines.filter((l) => {
1541
1489
  try {
1542
1490
  const r = JSON.parse(l);
1543
- /* kalıcı etiketler korunur (fin/finoff dahil — finance bayrağı kaybolmasın) */
1491
+ /* kalıcı etiketler korunur */
1544
1492
  return (
1545
1493
  r.t === 'meta' || r.t === 'meta2' || r.t === 'bot' || r.t === 'todo' ||
1546
- r.t === 'fin' || r.t === 'finoff' ||
1547
1494
  r.t === 'agent' || r.t === 'bcws' || r.t === 'botdm'
1548
1495
  );
1549
1496
  } catch { return false; }
@@ -1694,11 +1641,11 @@ class Engine {
1694
1641
  - Sandbox oturumları (sbSandbox) → 'sandbox' ajanı (repo disiplini + panel_run)
1695
1642
  - session.bcAgent ('plan'|'build') — eski bcMode:'plan' oturumları geriye
1696
1643
  uyumlu plan ajanına düşer
1697
- Studio/Finance/bgJob kendi ajan dünyalarında koşar — opencode BC sistemine
1698
- katılmaz (buildStudioSystem/buildFinanceSystem/buildBgSystem öncelikli). */
1644
+ Studio/bgJob kendi ajan dünyalarında koşar — opencode BC sistemine
1645
+ katılmaz (buildStudioSystem/buildBgSystem öncelikli). */
1699
1646
  _bcAgentInfo(session) {
1700
1647
  if (!session || !session.bcCode) return null;
1701
- if (session.studio || session.finance || session.bgJob) return null;
1648
+ if (session.studio || session.bgJob) return null;
1702
1649
  const name = session.sbSandbox
1703
1650
  ? 'sandbox'
1704
1651
  : session.bcAgent === 'plan' || session.bcAgent === 'build' || session.bcAgent === 'sandbox'
@@ -1970,167 +1917,6 @@ class Engine {
1970
1917
  );
1971
1918
  }
1972
1919
 
1973
- /* Beast Finance: MT5 trading ajanı — chat copilot'ı VEYA otonom trader.
1974
- Oturum alanları (main enjekte eder): financeTrader, financeAuto,
1975
- financeSymbols, financeStrategy, financeLimits, financeRole */
1976
- buildFinanceSystem(session) {
1977
- const nowD = new Date();
1978
- const localDate = nowD.toLocaleDateString('tr-TR');
1979
- const localTime = String(nowD.getHours()).padStart(2, '0') + ':00';
1980
- const isTrader = !!(session && session.financeTrader);
1981
- const auto = !!(session && session.financeAuto);
1982
- const symbols = Array.isArray(session && session.financeSymbols) ? session.financeSymbols.join(', ') : String((session && session.financeSymbols) || '');
1983
- const lim = (session && session.financeLimits) || {};
1984
- const modeBlock = isTrader
1985
- ? auto
1986
- ? 'ROL: OTONOM TRADER ⚡ — tur tur çalışıyorsun. Her turda: veri çek → değerlendir → GEREKİRSE işlem aç/kapat/SL-TP güncelle → kısa rapor. Sistem seni turlar; sohbette konuşmazsın.'
1987
- : 'ROL: GÖZLEMCİ ANALİST 🔍 — tur tur piyasa tararsın ama OTOMATİK İŞLEM KAPALI: mt5_trade/mt5_pending KULLANMA. Fırsatları net öneri olarak yaz (sembol, yön, giriş, SL, TP, sebep); sahibi onaylarsa açılır.'
1988
- : 'ROL: TRADING CO-PİLOT 💬 — sahibinle sohbet ediyorsun. Veri isterse mt5_* araçlarıyla çek, analiz et; işlem istenirse limitler içinde uygula, istenmezse sadece öneri ver.';
1989
- const proj = this._projectInstructions(session);
1990
- /* Skills kataloğu: finance oturumlarında da skill'ler çağrılabilir
1991
- (skill aracı _chatTurn'de finance oturumlarına enjekte edilir). */
1992
- const skList = (() => {
1993
- try { return skills.scan(); } catch { return []; }
1994
- })();
1995
- /* CHATTEKI BEAST KİMLİĞİ: finance ajanı da sahibin SOUL/USER/KURALLARINI taşır */
1996
- const mem = memory.loadAll();
1997
- const rules = memory.listRules();
1998
- const isWorker = !!(session && session.bgJob && !isTrader);
1999
- const modeBlock2 = isWorker
2000
- ? 'ROL: FİNANS İŞÇİSİ 🔎 — TEK bir görev için piyasa verisi toplar, analiz eder, RAPOR döndürürsün. mt5_trade/mt5_pending KULLANMA (yeni işlem AÇMA) — açık pozisyonlarda kısmi kapatma (mt5_close percent: kısmi TP/kısmi stop) ve SL/TP güncelleme (mt5_modify) SERBEST; okuma araçları (mt5_status/account/market/positions/orders/history) her zaman açık. İş bitince kısa final raporu yaz.'
2001
- : modeBlock;
2002
- /* ANALİZ EKİBİ rolü: trader'ın yanında koşan uzman ajanlar (risk/teknik/
2003
- makro) — hepsi İşlem AÇMAZ, kendi uzmanlık çerçevesinde rapor yazar */
2004
- const roleBlock =
2005
- ({
2006
- risk:
2007
- 'ROL: RİSK AJANI 🛡 — portföyün RİSK GÖZCÜSÜSÜN, İşlem AÇMAZSIN (mt5_trade/mt5_pending KULLANMA — yeni işlem AÇMAZSIN; açık pozisyonda kısmi kapatma (mt5_close percent) ve SL/TP güncelleme (mt5_modify) SERBEST). Her turda: hesap + pozisyonlar + marj kullanımı → kaldıraç/exposure değerlendirmesi; SL\u2019siz pozisyon, limit aşımı, tek yönlü birikme, günlük kayıp hızı risklerini raporla; net düzeltme önerisi ver (hangi pozisyon küçültülmeli/kapatılmalı).',
2008
- technic:
2009
- 'ROL: TEKNİK ANALİZ AJANI 📊 — fiyat yapısı uzmanısın, İşlem AÇMAZSIN (mt5_trade/mt5_pending KULLANMA — yeni işlem AÇMAZSIN; açık pozisyonda kısmi kapatma (mt5_close percent) ve SL/TP güncelleme (mt5_modify) SERBEST). Her turda odak semboller için: trend/yapı, destek-direnç bölgeleri, momentum (mt5_market + mt5_history verisiyle); sembol başına AL/SAT/BEKLE + giriş/SL/TP fikri üret — trader bu öneriyi işleme çevirir. Bulgularını mt5_ea action:"note" ile grafiğe ÇİZ (destek/direnç/SL/TP seviyeleri) ve tool__mt5_shot ile seviyelerin göründüğünü teyit et; önemli seviyeleri görselle birlikte agent_dm ile trader\'a/ekibe ilet — grafik üzerinde ortak karar alın.',
2010
- macro:
2011
- 'ROL: MAKRO AJANI 🌍 — büyük resim uzmanısın, İşlem AÇMAZSIN (mt5_trade/mt5_pending KULLANMA — yeni işlem AÇMAZSIN; açık pozisyonda kısmi kapatma (mt5_close percent) ve SL/TP güncelleme (mt5_modify) SERBEST). Her turda web_search ile güncel makro manşetleri + ekonomik takvim riskleri (faiz, CPI, jeopolitik); DXY/altın/petrol bağıntılarını odak sembollere çevir; sembol başına yön eğilimi + TEMKİN/BEKLE notu ver.',
2012
- visual:
2013
- 'ROL: GÖRSEL ANALİZ AJANI 👁 — grafik/ekran görüntüsü uzmanısın, İşlem AÇMAZSIN (mt5_trade/mt5_pending KULLANMA — yeni işlem AÇMAZSIN; açık pozisyonda kısmi kapatma (mt5_close percent) ve SL/TP güncelleme (mt5_modify) SERBEST). MT5 grafiği için ÖNCE tool__mt5_shot kullan (BeastFinance EA "shot": gerçek grafik PNG + görsel SONRAKİ TURDA gözüne gelir; symbol/timeframe vererek başka sembol/periyot çekebilirsin; dönen path send_file ile gönderilebilir); gerekirse EA panosuna mt5_ea action:"note" ile plan/seviye yaz. ÇOKLU SEMBOL: symbols:["GOLD","EURUSD","BTCUSD"] ile izleme listesindeki tüm semboller TEK çağrıda çekilip etiketli TEK PNG\'de birleştirilir — ayrı ayrı 3 DM atmak yerine bu birleşik görseli gönder. web grafiklerinde browser_open + browser_screenshot; bilgisayar ekranı için computer_look; görsel göremeyen metin-model isen ocr_read (source:"screen"/"browser") kullan. Gördüğün yapıyı yorumla: trend, formasyon, mum yapısı, destek-direnç ve SL/TP çizgileri; sembol başına GÖRSEL TEYİT + AL/SAT/BEKLE notu üret. Önemli bulguyu GÖRSELİYLE paylaş: agent_dm image:true (son ekran görüntün) ya da image:"<mt5_shot path>" ile ANA TRADER\'a/ekibe gönder — karşı ajan görüntüyü GERÇEKTEN görür, AJAN DM panelinde açılır. NOT: image:true DAİMA oturumdaki EN SON görseli yollar — her sembolün fotoğrafını ayrı göndermen gerekirse dönen path\'leri kullan (image:"<path>").',
2014
- })[String((session && session.financeRole) || '')] || '';
2015
- /* ROL → SKILL eşleştirmesi (ayarlar modalı): rol başına EN FAZLA 2 skill;
2016
- ANA TRADER için ayrıca PLAYBOOK skill'leri (roleSkills.trader).
2017
- Seçili SKILL.md'lerin TAM GÖVDESİ prompta gömülür — ajan skill aracını
2018
- çağırmayı atlasa bile prosedür KESİN uygulanır. */
2019
- const roleSkills = Array.isArray(session && session.financeRoleSkills)
2020
- ? session.financeRoleSkills.map((s) => String(s || '').trim()).filter(Boolean).slice(0, 2)
2021
- : [];
2022
- let roleSkillBlock = '';
2023
- if (roleSkills.length) {
2024
- const what = roleBlock
2025
- ? 'Bu rolün ZORUNLU skill\'i'
2026
- : session && session.financePlaybook
2027
- ? 'TRADER PLAYBOOK\'un (ZORUNLU skill)'
2028
- : 'BU OTURUMUN ZORUNLU skill\'i';
2029
- for (const roleSkillName of roleSkills) {
2030
- const sb = this._skillBody({ name: roleSkillName });
2031
- roleSkillBlock +=
2032
- ` ${what}: skill("${roleSkillName}")` +
2033
- (sb && sb.ok && sb.content
2034
- ? ' — aşağıda TAM prosedürü verilmiştir; HER TURDA birebir uygula (ayrıca okumana gerek yok):\n\n' +
2035
- `===== SKILL: ${roleSkillName} =====\n${sb.content}\n===== /SKILL =====`
2036
- : ' — ilk turda bu skill\'i mutlaka oku ve prosedürüne birebir uy.') +
2037
- '\n';
2038
- }
2039
- }
2040
- /* TYPESAFE ENTEGRASYONU: roleSkills'te "typesafe-ai" seçiliyse ajan tipli
2041
- kararlarını chat modeline yazdırmak yerine typesafe_decision aracıyla
2042
- TypeSafe System One'dan (Jev) alır — anahtar yoksa uyarır. */
2043
- const finTypeSkill = roleSkills.find((s) => s.toLowerCase() === 'typesafe-ai');
2044
- if (finTypeSkill) {
2045
- let tsReady = false;
2046
- try { tsReady = !!typesafe.cfg().apiKey; } catch {}
2047
- roleSkillBlock +=
2048
- tsReady
2049
- ? ' TYPESAFE (typesafe-ai skill) ZORUNLU: semantik/olasılıklı yargılarını (haber-makro etkisi, setup kalitesi, yön/aksiyon seçimi, tez doğrulama) chat modeline metin yazdırıp yorumlamak yerine typesafe_decision aracıyla TypeSafe System One\'a (Jev) sor: state içine tüm somut bağlamı (sembol, fiyat/seviye, haber metni, pozisyon) koy; aynı state üzerindeki bağımsız soruları TEK çağrıda birlikte sor (noul: evet olasılığı, choice: seçenek+dağılım, score: ağırlıklı puan+dağılım). Dönen olasılıkları eşikle yorumla (ör. >0.65 güçlü kanaat, 0.35-0.65 belirsiz → temkinli davran/teyit ara) ve kararının gerekçesine sayısal değerleri yaz. TypeSafe yargısı SENİN yerine karar vermez — nihai karar ve risk yönetimi sende.\n'
2050
- : ' TYPESAFE (typesafe-ai skill) SEÇİLİ ama API anahtarı ayarlı DEĞİL: kullanıcıya Ayarlar → TypeSafe sekmesinden anahtar girmesini söyle; o zamana kadar bu turda kendi analizinle devam et ve typesafe_decision aracını kullanma.\n';
2051
- }
2052
- const roleBlockFull = roleBlock + roleSkillBlock;
2053
- /* FİNANS EKİBİ: tüm finance ajanları tek DM grubundadır — sohbet grup
2054
- thread'inde toplanır (ayrı ayrı 1:1 thread'lere dağılmaz) */
2055
- const finJob = this._bgJobs && this._bgJobs.get(String(session && session.id));
2056
- const teamLine = finJob && finJob.teamGid ? this._agentTeamPromptLine(finJob.teamGid) : '';
2057
- return (
2058
- (mem.soul ? mem.soul.trim() + '\n\n' : '') +
2059
- 'Sen BEAST FİNANS\u2019sın — bilgisayardaki MetaTrader 5 (MT5) terminaline köprüyle bağlı trading ajanı.\n' +
2060
- 'ORTAM: Beast Finance uygulamasındasın — solda sohbet geçmişi + izleyiciler, ortada bu sohbet, SAĞ panelde MT5 işlem panosu (hesap, pozisyonlar, piyasa, AKIŞ) var.\n' +
2061
- 'KÖPRÜ: MT5 terminaline Python stdio köprüsüyle bağlısın; panel 3 saniyede bir hesap/pozisyon/piyasa verisini tazeler. mt5_* araç çağrıların ve işlem hareketlerin (açılan/kapanan pozisyonlar) SAĞ paneldeki AKIŞ akışına canlı düşer — panelin orayı izlediğini bil.\n' +
2062
- 'GÖREV ALANI: piyasa verisi okuma (fiyat/hesap/pozisyon/geçmiş), teknik değerlendirme, pozisyon yönetimi (aç/kapat/SL/TP), risk disiplini ve kısa karar raporları. GEREKTİĞİNDE kendi araçlarını üretirsin — kişisel tool yazımı ve MQL5 script/EA geliştirme bu görev alanının parçasıdır.\n' +
2063
- modeBlock2 + '\n' +
2064
- (roleBlockFull ? roleBlockFull + '\n' : '') +
2065
- (teamLine || '') +
2066
- 'MT5 ARAÇLARI: mt5_status (bağlantı), mt5_account (hesap), mt5_market (canlı fiyat), mt5_positions (açık pozisyonlar), mt5_orders (bekleyen emirler), mt5_history (kapanan işlemler), mt5_alerts (fiyat alarmı: kur/listele/sil — modu SEN seçersin: once/repeat), mt5_ogrenme (SEMBOL + PERİYOT BAZLI ÖĞRENME: işlem istatistiği + periyot kırılımı + son hatalar + dersler — zarar/stop sonrası kind:"mistake" dersini ZORUNLU yaz, karar öncesi stats/list ile oku), mt5_limits (lot/pozisyon limitlerini gör/GÜNCELLE — yalnız trader; symbol ile SEMBOL BAZLI min/max lot — sembolün karakterine göre karar senin), mt5_ea (BeastFinance grafik panosu: status/ping/chart/note), mt5_trade (⚡PİYASA EMRİ: side:"buy"|"sell" ile ANLIK gir — bekleyen emir ZORUNLU DEĞİL; timeframe ver (M1..MN1, SEN seçersin — öğrenme o periyoda işlenir); lot için volume yerine riskPct+sl ver, sistem hesaplar; limit/stop tipleri de kabul eder), mt5_close (TAM ya da KISMİ kapat: percent ile kısmi TP & kısmi stop — karar ajanın), mt5_modify (SL/TP), mt5_pending (BEKLEYEN emir: limit/stop + price + timeframe — fiyatın seviyeye gelmesini beklemek için; anlık giriş için mt5_trade kullan), mt5_cancel (emir iptal).\n' +
2067
- 'EMİR TİPLERİ (6 tip — HEPSİ AÇIK): buy_market/sell_market = anlık piyasa emri (fiyat beklenmez), buy_limit/sell_limit = bekleyen limit (price zorunlu), buy_stop/sell_stop = bekleyen stop (price zorunlu). mt5_trade ve mt5_pending İKİSİ DE 6 tipi kabul eder; emir tipini net söyle (ör. type:"sell_limit").\n' +
2068
- '⚡HIZLI AKSİYON (ZORUNLU ZİHNİYET): piyasa emri (market buy/sell) HER ZAMAN elinde ve bekleyen emir vermek ZORUNDA DEĞİLSİN. Fırsat anıksa / teyitli kırılım, momentum, haber veya seviye reddi anında mt5_trade {symbol, side:"buy"|"sell", sl, tp, riskPct ya da volume, reason} ile ANINDA market gir — type bile yazmana gerek yok. Bekleyen emir YALNIZ fiyatın seviyeye gelmesini beklemek gerçekten mantıklıysa kurulur (ör. geri çekilme limiti); "emir" diye her şeyi bekleyen emirle yapma. Hızlı girişte tek çağrı yeter: volume yerine riskPct+sl ver → lot otomatik hesaplanır.\n' +
2069
- 'ALARM KARARI SENDE: mt5_alerts ile alarm kurarken mode ZORUNLU — "once" (tek seferlik; ilk tetiklemede kapanır) ya da "repeat" (tekrarlı; alarm açık kalır, koşul sürdükçe cooldownMin dakikada bir tekrar uyarır + seni uyandırır; cooldownMin varsayılan 5). Tekrarlı mı tek seferlik mi olacağını sen seç, varsayılana bırakma; seviyenin önemine göre cooldownMin belirle (ör. 5/15/60).\n' +
2070
- 'ALARM TEMİZLİĞİ (ZORUNLU DİSİPLİN): alarm bir BEKÇİDİR, süs değil — gereksiz alarm biriktirme. Her turda (ya da en az birkaç turda bir) mt5_alerts action:"list" ile alarmları gör; listede "mine:true" senin kurduklarındır. Tezi/geçerliliği biten alarmı SİL: seviye kırıldı ve artık anlamsız, pozisyon kapandı, plan/hedef değişti, tetiklendi ve işlevi kalmadı. Silme: tekil kayıt action:"remove" {id} · kendi gereksizlerini toplu action:"clear" (varsayılan yalnız SENİN alarmların; symbol ile daralt; tümünü temizlemek için all:true — bunu başka ajanların alarmlarını da sileceği için YALNIZ açıkça gerekliyse kullan). Akan fiyatta işe yaramayan, üst üste aynı bölgeye kurulmuş alarmları temiz tut.\n' +
2071
- 'KISMİ KAPATMA YETKİSİ (TÜM finance ajanlarında): açık pozisyonda kısmi kapatma — kısmi TP (kâr al) ve kısmi stop (zarar kes) — TAMAMEN SENİN KARARIN, OTOMATİK DEĞİLDİR; mt5_close {ticket, percent, kind:"partial_tp"|"partial_sl", reason}. Gerek gördüğünde kullan; kalan pozisyon SL/TP ile devam eder. Kısmi TP fırsatı bildirimi gelirse (fiyat seviyeye ulaştı) kapatıp kapatmamak sana bağlı.\n' +
2072
- 'KİŞİSEL MT5 ARAÇLARI (VARSAYILAN KURULU — tool__* tüm oturumlarda çağrılabilir): tool__mt5_shot (grafikten GERÇEK PNG + görsel ajana enjekte — grafik işlerinde BİRİNCİL; timeframes:["M1","M15"] ile çoklu periyot, symbols:["GOLD","EURUSD","BTCUSD"] ile çoklu sembol TEK karede), tool__mt5_barlar2 (OHLC mumlar, köprüsüz), tool__mt5_m15_m5 (GOLD M15+M5 hazır paket), tool__mt5_fiyat, tool__mt5_durum (hesap+pozisyon+emir tek çağrı), tool__mt5_gecmis, tool__mt5_pozisyon_gecmis, tool__mt5_sltp, tool__mt5_kapat, tool__mt5_bekleyen, tool__mt5_emir, tool__mt5_emir_iptal.\n' +
2073
- 'BEASTFINANCE EA (OTOMATİK GRAFİK UZMANI — ENTEGRASYON KANALI): MT5 terminaline bağlanıldığında BeastFinance uzman danışmanı İLK GRAFİĞE OTOMATİK yüklenir, AutoTrading izni açılır (kurulum sistem tarafından yapılır; elle ekleme gerekmez). Grafik panosu + seviye çizgileri + dosya köprüsü (beast_ea.json / beast_cmd.json / beast_note.json) bu EA üzerinden yürür: entegrasyon işlerinde (status/ping/chart/note) mt5_ea kullan; ekran görüntüsü işlerinde tool__mt5_shot ("shot" komutu — gerçek PNG + ajan görseli) birincildir. Yazdığın not ve çizgiler tool__mt5_shot ve computer_look screenshot\'ında GÖRÜNÜR.\n' +
2074
- 'YETKİLERİN (AÇIK — çekinmeden kullan):\n' +
2075
- '- skill: kurulu SKILL.md kataloğunu oku ve uygula — tool yazmadan ÖNCE skill("tool-yazma"), MT5 tarafı işlerden ÖNCE skill("mql5") oku ve prosedürüne birebir uy.\n' +
2076
- '- Kişisel tool yazma: %APPDATA%\\beast\\tools\\<slug>\\ içine tool.json + run.js yaz (write_file/edit_file); run_command ile çıktısını (JSON, ok alanlı) doğrula → tool__<slug> ANINDA tüm finance ajanlarında çağrılabilir olur.\n' +
2077
- '- MQL5: MT5 tarafında script/gösterge/EA yaz (write_file), metaeditor64.exe /compile ile derle, MQL5\\Files dosya köprüsüyle veriyi Beast\'e taşı; kullanıcıya çalıştırma adımını açıkça söyle.\n' +
2078
- '- Yerleşik araçlar: run_command, python_run, read_file/write_file/edit_file, web_search/deep_search, browser_*, computer_look (ekran görüntüsü) — hepsi açık.\n' +
2079
- 'GRAFİK & GÖRSEL DOĞRULAMA (karar öncesi — vazgeçilmez):\n' +
2080
- '- tool__mt5_shot: MT5 grafiğinin GERÇEK PNG\'si (BeastFinance EA "shot" komutu). Görsel SONRAKİ TURDA gözüne gelir; aktif grafikte Beast panosu + mt5_ea note ile çizilen seviyeler GÖRÜNÜR. symbol/timeframe ver → EA geçici grafik açıp o sembol/periyottan çeker; dönen path send_file ile kullanıcıya gönderilebilir. Grafik analizinde İLK tercih budur. ÇOKLU SEMBOL: symbols:["GOLD","EURUSD","BTCUSD"] (2-4 sembol) → her sembolden bir kare çekilip TEK PNG\'de birleştirilir (izleme listesinin tamamı TEK görselle paylaşılır; sembol başına ayrı DM atmaya gerek yok); timeframes ile birlikte verilirse sembol × periyot ızgarası kurulur (en fazla 6 kare, her panel "SEMBOL · PERİYOT" etiketli). ÇOKLU ZAMAN DİLİMİ: timeframes:["M1","M15"] (2-3 periyot, layout:"v" alt alta) → periyotlar sırayla çekilip TEK PNG\'de birleştirilir; solda/sağda hangisi olduğunu görüntüden OKURSUN — trend uyumu/MTF teyidi için bunu kullan (gerçek kapanışlarla).\n' +
2081
- '- mt5_ea action:"note": grafiğe kısa plan metni + yatay seviye çizgileri yazar (destek/direnç/SL/TP) — sonra tool__mt5_shot ile çekip seviyelerin doğru yerde olduğunu GÖRSEL doğrula.\n' +
2082
- '- computer_look: tüm masaüstü ekranı (MT5 dışı pencereler dahil); browser_screenshot: web grafikleri (TradingView/Investing) — browser_open ile aç.\n' +
2083
- '- Görsel göremiyorsan (metin-model) ocr_read (source:"screen"/"browser") ile grafikteki fiyat/seviyeleri metne çevir.\n' +
2084
- '- Grafikte gezinme/ölçek: computer_act ile timeframe, scroll, zoom (yerel fare/klavye sürer — imleci oynatır; kısa tut).\n' +
2085
- '- EKİPLE GÖRSEL PAYLAŞIM: chart PNG\'sini agent_dm image:true (son görüntün) ya da image:"<dosya yolu>" (ör. tool__mt5_shot dönen path) ile trader/ekibe gönder — karşı ajan görüntüyü GERÇEKTEN görür, AJAN DM panelinde açılır. Ortak kararlarda grafiği paylaşmak zorunlu disiplindir.\n' +
2086
- '- PARALEL EKİP AKIŞI: teknik ajan seviyeleri hesaplar → mt5_ea note ile grafiğe çizer; görsel ajan tool__mt5_shot ile çekip TEYİT eder ve agent_dm ile görseli trader\'a atar; risk ajanı aynı görsel üzerinden SL/TP yerleşimini denetler; trader kararı işleme çevirir. Aynı sembolde koşan ajanlar tek DM grubunda (agent_dm group) toplanır — çelişen hareket etme.\n' +
2087
- '- EKSİK ARAÇ: özel grafik aracı gerekiyorsa (ör. çoklu timeframe tek görüntü, indikatör paneli okuma) VAR SAYMA — tool_request ile TOOL botuna yazdır (asenkron çalışır; rapor sohbete düşer, araç doğrulanınca tool__<ad> olarak ANINDA çağrılır); küçük aracı skill("tool-yazma") prosedürüyle kendin de yazabilirsin.\n' +
2088
- 'VERİ AKIŞI (her değerlendirmede): mt5_account + mt5_positions + mt5_market çağrılarını AYNI turda PARALEL ver; gerekiyorsa mt5_history ile son işlemleri gör.\n' +
2089
- 'PARALEL + KOORDİNASYON: uzun araştırma/işleri run_background ile paralel finance işçisine devret (parent finance olduğu için işçi mt5 okuma araçlarını görür); koşan ajanlarla konuşmak için agent_dm (to: ajan başlığındaki anahtar kelime, örn "GOLD"; ortak karar için group: "İSİM" ile grup sohbeti kur — mesaj tüm üyelere düşer). Görevin bitince DM/grup sohbetleri otomatik KAPANIR (geçmiş panelde kalır).\n' +
2090
- (symbols ? `İZLEME LİSTESİ: ${symbols}\n` : '') +
2091
- (lim.minLot || lim.maxLot
2092
- ? 'LİMİTLER: ' +
2093
- [
2094
- lim.minLot ? `min lot ${lim.minLot}` : null,
2095
- lim.maxLot ? `max lot ${lim.maxLot}` : null,
2096
- lim.maxPositions ? `max eşzamanlı pozisyon ${lim.maxPositions}` : null,
2097
- ].filter(Boolean).join(' · ') +
2098
- ' (genel).' +
2099
- (lim.symbolLimits && Object.keys(lim.symbolLimits).length
2100
- ? ' SEMBOL BAZLI: ' +
2101
- Object.entries(lim.symbolLimits)
2102
- .map(([s, v]) => `${s} ${Number(v && v.minLot) > 0 ? Number(v.minLot) : lim.minLot}–${Number(v && v.maxLot) > 0 ? Number(v.maxLot) : lim.maxLot}`)
2103
- .join(' · ') +
2104
- ' — sembol limiti önceliklidir.'
2105
- : '') +
2106
- ' Bunları aşıp araç kullanma; sistem zaten reddeder (lot min lot altına inemez, max lot üstüne çıkamaz).\n'
2107
- : '') +
2108
- 'TUR RİTMİ (yalnız trader kararı): mt5_limits {action:"set", intervalSec, intervalForMin} ile tur aralığını ayarlarsın — sert hareket/haber anında geçici hızlan (ör. 45-60 sn × 10-20 dk), sakinleşince geri çek (ör. 180-300 sn); süre dolunca taban aralığa OTOMATİK dönülür. SÜREKLİ en düşük aralıkta kalma — API/maliyet limitini koru; hız modu sınırları sistemce zorlanır.\n' +
2109
- 'RİSK DİSİPLİNİ:\n' +
2110
- '- SL\u2019siz pozisyon BIRAKMA: açtığın her işlemde mantıklı bir SL koy; SL\u2019siz kalan pozisyonu mt5_modify ile tamamla.\n' +
2111
- '- KÂR KORUMA (SİSTEM OTOMATİK): kâr 0.3R\'ye ulaşınca SL, görülen en iyi kârın 0.15R gerisine kilitlenir — kâr eksiye dönmez. Bu yüzden kârı erken koru; hedefe ulaşmayan işlemde bile kârı geri verme.\n' +
2112
- '- TP İÇİN RR ≥ 1.5 ŞARTI YOK: scalp/hızlı işlemlerde TP 0.3R-0.5R olabilir. Kısmi kâr alımı SERBEST ve TEŞVİK EDİLİR: 0.3-0.5R\'de pozisyonun bir kısmını mt5_close {percent, kind:"partial_tp"} ile realize et, kalanı korumalı trailing ile taşı. Amaç: sık işlem + hızlı kâr toplama; kârı masada bekletme.\n' +
2113
- '- Martingale/kademeli lot artışı YASAK; kaybı geri kovalama (revenge trade) YASAK.\n' +
2114
- '- Emin olmadığında İŞLEM YOK — "BEKLE: <sebep>" yaz. Sık işlem tek başına iyi işlem değil; ama onaylı fırsatta HIZLI gir, kârı hızlı topla.\n' +
2115
- '- LOT KORKUSU YOK — önemli olan LOT DEĞİL, STOP YERİ ve risktir: SL yakın ve setup netse yüksek lot NORMALDİR (boyut zaten risk % + SL mesafesinden hesaplanır; sembol tavanı trader kararıdır). Tek işlemde serbest marjın tamamını riske atma; sık işlem için lotu değil, TUR RİTMİNİ (mt5_limits intervalSec) ve kısmi kâr alımını kullan.\n' +
2116
- 'ZAMAN DİLİMİ SENİN KARARIN (BOT KARARI): işlemi hangi periyodun analizine dayandırdıysan mt5_trade/mt5_pending çağrısında timeframe ver (M1|M5|M15|M30|H1|H4|D1|W1|MN1). Kapanış otomatik o periyoda işlenir; aynı sembolde hangi periyot kazandırıyorsa onu kullan, NEGATİF periyotta riski düşür ya da teyit bekle. Hiçbir sabit periyoda bağlı kalma — istatistik neyi söylüyorsa onu seç.\n' +
2117
- (session && session.financeLearn ? `SEMBOL BAZLI ÖĞRENME HAFIZAN (otomatik istatistik + periyot kırılımı + son hatalar + kendi derslerin — kararlarında kullan):\n${session.financeLearn}\n` : '') +
2118
- 'ÖĞRENME DÖNGÜSÜ (ZORUNLU KISIM: zarardan ders): ZARAR/STOP ile kapanan her işlemden sonra mt5_ogrenme {action:"add", symbol, timeframe, kind:"mistake", text:"yanlış neydi + bundan sonra kaçınma kuralı"} ile hatayı MUTLAKA yaz — bu ders bir sonraki turların karar girdisine girer (tek kısa cümle, sebep-sonuç; ör. "M5 destek kırılımında teyitsiz girdim; kapanış teyidi beklemeliydim"). İşe yarayan deseni ise kind:"pattern" ile yaz (her kapanışa ders değil; günde en fazla 2-3). YASAK: günlük/rapor tarzı uzun metin ("bugün şunu yaptım"), genel laf ("dikkatli olmalıyım"), aynı dersin tekrarı. Karar öncesi mt5_ogrenme {action:"stats"|"list", symbol, timeframe?} ile periyot istatistiğini ve son hataları oku; TEKRAR EDEN HATA uyarısı varsa o periyotta riski düşür/teyit ara; aynı hatayı tekrarlama, işleyen deseni kullan. Hafıza kendini sadeleştirir: eski dersler otomatik özetlenir ve süresi geçenler unutulur; gerekirse mt5_ogrenme {action:"compact", symbol} ile hemen özetlet, geçersiz dersi remove/clear ile sil.\n' +
2119
- (session && session.financeStrategy ? `SAHİBİNİN STRATEJİ NOTU (önceliklidir):\n${session.financeStrategy}\n` : '') +
2120
- (session && session.financeShadow ? 'SHADOW MOD AKTİF: mt5_trade/mt5_pending emir GÖNDERMEZ — kararını teziyle raporla; gerçek işlem açılmaz (karar günlüğe yazılır).\n' : '') +
2121
- (session && session.financeDigest ? `İŞLEM PERFORMANS GEÇMİŞİN (kendi kayıtların — kararlarında ders çıkar):\n${session.financeDigest}\n` : '') +
2122
- (mem.user ? `# USER\n${mem.user}\n` : '') +
2123
- (rules.length ? `# KURALLAR (sahibinin kalıcı talimatları — daima uy)\n${rules.map((r) => '- ' + r).join('\n')}\n` : '') +
2124
- (skList.length
2125
- ? '# SKILLS\nKurulu skill kataloğu: görev bir skill\u2019in tanımına uyarsa skill aracıyla gövdesini (SKILL.md) yükleyip uygula — tekerleği yeniden icat etme. Analysis/rapor/PDF gibi işlerde skill\u2019in prosedürüne uy. Tool yazımı → "tool-yazma", MT5 tarafı geliştirme → "mql5" skill\u2019i önceliklidir.\n' +
2126
- skList.map((s) => `- ${s.name}: ${s.description} [${s.path}]`).join('\n') + '\n'
2127
- : '') +
2128
- 'RAPOR DİSİPLİNİ: kısa ve sayısal — sembol, yön, lot, giriş, SL/TP, sebep tek satırda. Uzun fal açma; tablo/liste kullanabilirsin.\n' +
2129
- `Yerel zaman: ${localDate} ${localTime} — piyasa saatlerine dikkat et (borsa/metal seansları kapalıysa spread genişler; hafta sonu FX kapalıdır).\n` +
2130
- (proj ? '# PROJE TALİMATLARI\n' + proj + '\n' : '') +
2131
- FORMAT_RULES
2132
- );
2133
- }
2134
1920
 
2135
1921
  async buildSystem(queryText, session) {
2136
1922
  /* BOT OTURUMU: non-admin bota bağlıysa global Beast hafızası HIÇ girmez —
@@ -2176,14 +1962,6 @@ class Engine {
2176
1962
  '# SKILLS\nKullanmadan önce ilgili SKILL.md dosyasını read_file ile oku.\n' + sk.join('\n')
2177
1963
  );
2178
1964
  }
2179
- /* BOTLAR: MT5/Beast Finance entegrasyon kanalı — BeastFinance EA'sı otomatik
2180
- kurulur; botlar grafik/entegrasyon işlerinde bunu bilerek hareket etsin */
2181
- if (bctx) {
2182
- parts.push(
2183
- '# MT5 / BEAST FINANCE ENTEGRASYONU\n' +
2184
- 'Beast Finance açıldığında MT5 terminaline bağlanılır; BeastFinance.mq5 uzman danışmanı İLK GRAFİĞE OTOMATİK kurulur ve AutoTrading açılır. Grafik/entegrasyon işleri bu EA üzerinden yürür (heartbeat beast_ea.json, komut köprüsü beast_cmd.json, grafik panosu/seviyeler beast_note.json; finance oturumlarında mt5_ea status/ping/chart/note). Grafik görseli için varsayılan kurulu tool__mt5_shot kullan (EA "shot" komutu: gerçek PNG + görsel ajana enjekte edilir; path send_file/agent_dm ile paylaşılabilir) — pano ve çizgiler bu screenshot\'ta görünür. Elle EA ekleme varsayma; eksik araç gerekiyorsa Tool botuna tool_request at.'
2185
- );
2186
- }
2187
1965
  /* opencode instruction port (ajan modu): workspace AGENTS/CLAUDE/CONTEXT
2188
1966
  talimatları — oturum başına bir kez okunur, epoch boyunca sabit */
2189
1967
  const projChat = this._projectInstructions(session);
@@ -2798,10 +2576,7 @@ class Engine {
2798
2576
  `- kullanıcının hedefleri ve net talepleri\n` +
2799
2577
  `- alınan kararlar, önemli bilgi parçaları (isim, sayı, dosya/klasör yolu, hata ve çözümü)\n` +
2800
2578
  `- tamamlanan işler ve sonuçları\n` +
2801
- (session.finance
2802
- ? `- FİNANS İŞLEMLERİ (KRİTİK, atlama): açılan/kapatılan/güncellenen pozisyonlar — sembol, yön (AL/SAT), lot, giriş/SL/TP, kâr/zarar ve gerekçe; sonraki turlarda birebir hatırlanmalı\n`
2803
- : '') +
2804
- `Madde madde yaz, en fazla ${session.finance ? 180 : 120} kelime, başlık/selamlama yok. Alakasız ayrıntıyı at.\n\n` +
2579
+ `Madde madde yaz, en fazla 120 kelime, başlık/selamlama yok. Alakasız ayrıntıyı at.\n\n` +
2805
2580
  `# SOHBET PARÇASI\n${transcript}`;
2806
2581
  const res = await chatOnce(
2807
2582
  this.sel,
@@ -3177,15 +2952,6 @@ class Engine {
3177
2952
  if (adef && (adef.mode === 'bg' || adef.mode === 'all')) bg.agentName = adef.name;
3178
2953
  }
3179
2954
  this.cache.set(bg.id, bg);
3180
- /* FİNANS İŞÇİSİ: parent finance oturumuyken (Beast Finance sohbeti) açılan
3181
- arka plan işi mt5_* okuma araçlarını görür ve finance promptuyla koşar —
3182
- chat Beast'i Finance'tan paralel finance ajanı açabilir */
3183
- const parentSess = parent ? this.cache.get(parent) || null : null;
3184
- if (parentSess && parentSess.finance) {
3185
- bg.finance = true;
3186
- bg.financeTrader = false; /* işçi — asla otonom trade, yalnız analiz/rapor */
3187
- bg.financeAuto = false;
3188
- }
3189
2955
  const ttl = String(title || t).replace(/\s+/g, ' ').trim().slice(0, 80) || 'arka plan görevi';
3190
2956
  /* #17 cache'teki nesneye de işaret koy — listSessions temiz başlık göstersin */
3191
2957
  bg.bgTitle = ttl;
@@ -3456,7 +3222,7 @@ class Engine {
3456
3222
  }
3457
3223
 
3458
3224
  /* İş bitişi kaydı: status=done|error|aborted. Hata olursa üst sohbete haber gider.
3459
- SÜREKLİ (continuous) işler — Finance trade ajanları gibi tur tur koşanlar —
3225
+ SÜREKLİ (continuous) işler — tur tur koşanlar —
3460
3226
  'done'/'error'da KAPANMAZ: tur sonu = aktivite tazelenir, iş koşmaya devam
3461
3227
  eder (döngüyü main yönetir). Yalnız 'aborted' (kullanıcı iptali) gerçek bitiştir. */
3462
3228
  _bgFinish(sid, status, errorMsg) {
@@ -3561,7 +3327,7 @@ class Engine {
3561
3327
  }
3562
3328
 
3563
3329
  /* Saf sınıflandırma (test edilebilir): null | 'stuck' | 'long'
3564
- continuous işler (Finance trade ajanları) denetlenmez — turlar arası
3330
+ continuous işler denetlenmez — turlar arası
3565
3331
  boşluk normaldir; döngüyü main yönetir. */
3566
3332
  static superviseReason(job, nowMs) {
3567
3333
  if (!job || job.status !== 'running' || job.continuous) return null;
@@ -3775,12 +3541,10 @@ class Engine {
3775
3541
  return;
3776
3542
  }
3777
3543
  const job = this._bgJobs && this._bgJobs.get(String(sessionId));
3778
- /* SÜREKLİ ajan (Beast Finance): DM/rapor teslimi YENİ TUR AÇMAZ — aksi
3544
+ /* SÜREKLİ ajan: DM/rapor teslimi YENİ TUR AÇMAZ — aksi
3779
3545
  halde ajanlar birbirine DM attıkça sonsuz tur döngüsü doğar (bağlam
3780
3546
  şişer, ajan hiç dinlenmez). Mesaj inbox'a yazılır; bir sonraki PLANLI
3781
- turda send() tarafından tek blok halinde enjekte edilir.
3782
- İSTİSNA: kullanıcı/chat kaynaklı DM'ler (wake) onDmQueued kancasıyla
3783
- ajanı HEMEN uyandırabilir — ajan-ajan trafiği beklemede kalır. */
3547
+ turda send() tarafından tek blok halinde enjekte edilir. */
3784
3548
  const continuous = !!(job && job.continuous);
3785
3549
  const rest = [];
3786
3550
  for (const r of this._pendingReports) {
@@ -3834,7 +3598,7 @@ class Engine {
3834
3598
  `- Bağımsız araç çağrılarını aynı turda PARALEL ver.\n` +
3835
3599
  `- PDF gerekirse pip\u2019ten paket kurma (Türkçe bozar); Node\u2019un kurulu \`pdf-lib\`+fontkit\u2019iyle .js script yazıp \`node\` ile çalıştır. md→pdf çevirme: belge çıktısını doğrudan PDF olarak üret.\n` +
3836
3600
  `- ARAŞTIRMA SINIRI: 3-5 kaynak yeter; süre hedefi ~3 dakika. 2-3 denemede bulunamayan bilgiyi BIRAK — bulabildiğin kısmi sonucu raporla ve neyi bulamadığını yaz. Kapalı/gizli içerik peşinde koşma.\n` +
3837
- `AJAN KOORDİNASYONU: diğer koşan ajanlarla (paralel işler, finance ajanları) konuşman gerekiyorsa agent_dm aracını kullan — to: hedefin başlığındaki anahtar kelime (örn "GOLD", "Trader"), message: 1-3 cümlelik net mesaj. Senden istenen görevde başka bir ajanın zaten yaptığın işe ihtiyacı varsa DM ile haber ver. Birden fazla ajanla ORTAK KARAR almanız gerekiyorsa group: "İSİM" vererek grup sohbeti kur — mesajın tüm üyelere düşer, cevaplar aynı gruba gelir. Görevin bitince DM/grup sohbetleri otomatik KAPANIR (geçmiş panelde kalır).\n` +
3601
+ `AJAN KOORDİNASYONU: diğer koşan ajanlarla (paralel işler) konuşman gerekiyorsa agent_dm aracını kullan — to: hedefin başlığındaki anahtar kelime, message: 1-3 cümlelik net mesaj. Senden istenen görevde başka bir ajanın zaten yaptığın işe ihtiyacı varsa DM ile haber ver. Birden fazla ajanla ORTAK KARAR almanız gerekiyorsa group: "İSİM" vererek grup sohbeti kur — mesajın tüm üyelere düşer, cevaplar aynı gruba gelir. Görevin bitince DM/grup sohbetleri otomatik KAPANIR (geçmiş panelde kalır).\n` +
3838
3602
  (job.teamGid ? this._agentTeamPromptLine(job.teamGid) : '') +
3839
3603
  FORMAT_RULES + '\n' +
3840
3604
  `SON ÇIKTI: 3-5 satırlık net sonuç raporu, madde madde. Soru sorma, sohbet etme.`
@@ -3847,10 +3611,8 @@ class Engine {
3847
3611
  _bgTrim(session) {
3848
3612
  const max = Engine.BG_KEEP_MSGS;
3849
3613
  const msgs = session.messages;
3850
- /* bg işleri + Beast Code + SÜREKLİ finance ajanları: uzun geçmiş payload'ı
3851
- şişirip yavaşlatır — finance ajanları binlerce tur döndüğü için bağlam
3852
- tavanı onlara da şart */
3853
- if ((!session.bgJob && !session.bcCode && !session.finance) || msgs.length <= max) return;
3614
+ /* bg işleri + Beast Code: uzun geçmiş payload'ı şişirip yavaşlatır */
3615
+ if ((!session.bgJob && !session.bcCode) || msgs.length <= max) return;
3854
3616
  let keep = msgs.slice(-max);
3855
3617
  /* GÜVENLİ SINIR: kesim bir assistant(tool_calls) + tool sonuç çiftini BÖLMESİN.
3856
3618
  Yetim 'tool' mesajı ya da sonuçları pencere dışında kalan tool_calls'lı
@@ -3885,13 +3647,13 @@ class Engine {
3885
3647
  /* Beast Apps: kurulu app'lerin araçları (app__<id>__<tool>) modele açılır */
3886
3648
  toolsList = apps.mergeTools(toolsList);
3887
3649
  /* KİŞİSEL TOOLLAR: %APPDATA%\beast\tools\<ad>\ — kullanıcı yazmışsa
3888
- TÜM oturumlara (BEAST FINANCE dahil) tool__<ad> olarak açılır */
3650
+ TÜM oturumlara tool__<ad> olarak açılır */
3889
3651
  toolsList = [...toolsList, ...customtools.definitions()];
3890
- /* SKILL ARACI: kurulu SKILL.md gövdesini modele açar — finance oturumları
3891
- kadar BOT oturumları (Tool botu: tool-yazma/mql5) ve arka plan ajanları
3892
- da promptlarında skill() kullanır. Tanım yalnız finance'a verilince bot
3893
- skill çağrısı yapamıyor, tur rapor üretmeden boşa düşüyordu. */
3894
- if (session && (session.finance || session.botId || session.bgJob)) {
3652
+ /* SKILL ARACI: kurulu SKILL.md gövdesini modele açar — BOT oturumları
3653
+ (Tool botu: tool-yazma) ve arka plan ajanları promptlarında skill()
3654
+ kullanır. Tanım yalnız botlara verilince diğer oturumlar skill
3655
+ çağrısı yapamıyordu. */
3656
+ if (session && (session.botId || session.bgJob)) {
3895
3657
  const skillDef = (opencode.toolmap.definitions() || []).find(
3896
3658
  (d) => d && d.function && d.function.name === 'skill'
3897
3659
  );
@@ -3899,7 +3661,7 @@ class Engine {
3899
3661
  toolsList = [...toolsList, skillDef];
3900
3662
  }
3901
3663
  }
3902
- /* AJAN DM: koşan ajanlara (arka plan işleri + finance), ana sohbete VE
3664
+ /* AJAN DM: koşan ajanlara (arka plan işleri), ana sohbete VE
3903
3665
  bot sohbetlerine verilir — botlar birbirine iş atar/cevap verir
3904
3666
  (ör. Beast → Tool botu; Tool botu da sonucu DM ile geri yazar).
3905
3667
  Yalnız botlar arası DM pair oturumunda kapalı (döngü koruması). */
@@ -3907,7 +3669,7 @@ class Engine {
3907
3669
  toolsList = [...toolsList, AGENT_DM_DEF];
3908
3670
  }
3909
3671
  /* TOOL İSTEĞİ (cephane): tool botu hariç TÜM oturumlar — müşteri bot
3910
- sohbetleri, paralel ajanlar ve finance ajanları dahil */
3672
+ sohbetleri, paralel ajanlar dahil */
3911
3673
  if (session && !session.isBotDm && session.botId !== 'tool') {
3912
3674
  toolsList = [...toolsList, TOOL_REQUEST_DEF];
3913
3675
  }
@@ -3920,15 +3682,13 @@ class Engine {
3920
3682
  /* opencode agent.ts port: özel ajan tanımı — prompt/model/araç/steps */
3921
3683
  const adef = this._agentDefFor(session, !!session.bgJob);
3922
3684
  const promptText = this._lastUserText(session);
3923
- let system = session.finance
3924
- ? this.buildFinanceSystem(session) /* finance önceliklidir — bg finance işçileri de finance promptuyla koşar */
3925
- : session.bgJob
3926
- ? this.buildBgSystem(session)
3927
- : session.studio
3928
- ? this.buildStudioSystem(session)
3929
- : bcAgent
3930
- ? this.buildOcSystem(session, bcAgent)
3931
- : await this.buildSystem(promptText, session);
3685
+ let system = session.bgJob
3686
+ ? this.buildBgSystem(session)
3687
+ : session.studio
3688
+ ? this.buildStudioSystem(session)
3689
+ : bcAgent
3690
+ ? this.buildOcSystem(session, bcAgent)
3691
+ : await this.buildSystem(promptText, session);
3932
3692
  // Granül izin: oturumun yetki seviyesine göre araç seti daraltılır.
3933
3693
  // Çoklu izin (ör. web+read) seçiliyse kümeler BİRLEŞİR — hepsinin araçları açık olur.
3934
3694
  // BC'de opencode adları Beast adına çevrilerek denetlenir (read → read_file).
@@ -3941,10 +3701,6 @@ class Engine {
3941
3701
  let activeTools = allowedSet
3942
3702
  ? toolsList.filter((t) => allowedSet.has(opencode.toolmap.TO_BUILTIN[t.function.name] || t.function.name))
3943
3703
  : toolsList;
3944
- /* Beast Finance: mt5_* araçları YALNIZ finance oturumlarında görünür */
3945
- if (FINANCE_TOOL_SET.size && !(session && session.finance)) {
3946
- activeTools = activeTools.filter((t) => !FINANCE_TOOL_SET.has(t.function.name));
3947
- }
3948
3704
  /* bot skill kısıtı: bota verilen yetkiye göre araç seti daraltılır */
3949
3705
  const toolLimit = this.sessionTools.get(String(session.id));
3950
3706
  if (toolLimit) activeTools = activeTools.filter((t) => toolLimit.has(t.function.name));
@@ -5398,15 +5154,13 @@ const skills = require('./skills');
5398
5154
  }
5399
5155
  if (name === 'ocr_read') return JSON.stringify(await this._ocrRead(args || {}, signal));
5400
5156
  if (name === 'sandbox_repo') return JSON.stringify(await this._sandboxRepo(args || {}));
5401
- /* opencode general-agent portu: alt-ajan da edit/grep/glob kullanır.
5402
- MT5 (mt5_*) araçları da tools.exec'e geçer (finance işçileri/danışma). */
5157
+ /* opencode general-agent portu: alt-ajan da edit/grep/glob kullanır. */
5403
5158
  if (!(name === 'run_command' || name === 'read_file' || name === 'write_file' || name === 'edit_file' ||
5404
5159
  name === 'list_dir' || name === 'grep' || name === 'glob' ||
5405
5160
  name === 'git_commit' || name === 'git_diff_review' || name === 'git_pr_create' ||
5406
5161
  name === 'repo_map' || name === 'repo_symbols' ||
5407
5162
  name === 'xlsx_read' || name === 'xlsx_write' || name === 'xlsx_edit' ||
5408
- name === 'web_search' || name === 'http_fetch' || name === 'webfetch' || name === 'python_run') &&
5409
- !FINANCE_TOOL_SET.has(name)) {
5163
+ name === 'web_search' || name === 'http_fetch' || name === 'webfetch' || name === 'python_run')) {
5410
5164
  return JSON.stringify({ ok: false, error: `unknown tool ${name}` });
5411
5165
  }
5412
5166
  return await tools.exec(name, args, { cwd: this.workspace, signal });
@@ -5489,7 +5243,7 @@ const skills = require('./skills');
5489
5243
  }
5490
5244
 
5491
5245
  /* opencode skill aracı gövdesi: katalogdan eşleşen SKILL.md'yi okur.
5492
- Salt-okur — tüm oturum türlerinde (BC/finance/chat/trader) aynı yol. */
5246
+ Salt-okur — tüm oturum türlerinde (BC/chat) aynı yol. */
5493
5247
  _skillBody(args) {
5494
5248
  const wanted = String((args && args.name) || '').trim();
5495
5249
  let list = [];
@@ -5513,9 +5267,9 @@ const skills = require('./skills');
5513
5267
  /* opencode mantığı (BC): model opencode builtin dilinde çağırır —
5514
5268
  read/edit/write/bash/todowrite/task... execMap Beast'in yerleşik
5515
5269
  aracına çevirir (implementasyon değişmez, dil opencode olur).
5516
- Studio/Finance/bgJob kendi dünyasında koşar — bu akışa girmez. */
5270
+ Studio/bgJob kendi dünyasında koşar — bu akışa girmez. */
5517
5271
  const bcSess = this.cache.get(String(sessionId || '')) || null;
5518
- const isBc = !!(bcSess && bcSess.bcCode && !bcSess.studio && !bcSess.finance && !bcSess.bgJob);
5272
+ const isBc = !!(bcSess && bcSess.bcCode && !bcSess.studio && !bcSess.bgJob);
5519
5273
  if (isBc) {
5520
5274
  const mapped = opencode.toolmap.execMap(name, args);
5521
5275
  name = mapped.name;
@@ -5525,8 +5279,7 @@ const skills = require('./skills');
5525
5279
  const blocked = this._guardTool(name, args);
5526
5280
  if (blocked) return blocked;
5527
5281
  /* opencode skill aracı: katalogdaki SKILL.md gövdesini modele açar.
5528
- Salt-okur ve güvenli — BC dahil TÜM oturum türlerinde çalışır
5529
- (Beast Finance chat copilot + trader buradan kullanır). */
5282
+ Salt-okur ve güvenli — BC dahil TÜM oturum türlerinde çalışır. */
5530
5283
  if (name === 'skill') {
5531
5284
  return JSON.stringify(this._skillBody(args));
5532
5285
  }
@@ -6127,16 +5880,12 @@ const skills = require('./skills');
6127
5880
  return JSON.stringify(await apps.call(name, args || {}, signal));
6128
5881
  }
6129
5882
  /* opencode tool registry portu: edit_file/grep/glob ana ajanın da araçları —
6130
- bunlar olmadan model write_file + tam dosya okuma döngüsüne düşer.
6131
- MT5 (mt5_*) araçları tools.exec → financetools.handlers'a yönlendirilir —
6132
- whitelist'te yoklarsa finance ajanı "unknown tool" yiyordu (işlem açamama
6133
- hatasının kök nedeni). */
5883
+ bunlar olmadan model write_file + tam dosya okuma döngüsüne düşer. */
6134
5884
  if (
6135
5885
  !(name === 'run_command' || name === 'read_file' || name === 'write_file' || name === 'edit_file' ||
6136
5886
  name === 'list_dir' || name === 'grep' || name === 'glob' ||
6137
5887
  name === 'web_search' || name === 'http_fetch' || name === 'webfetch' || name === 'python_run' ||
6138
- name === 'typesafe_decision') &&
6139
- !FINANCE_TOOL_SET.has(name)
5888
+ name === 'typesafe_decision')
6140
5889
  ) {
6141
5890
  return JSON.stringify({ ok: false, error: `unknown tool ${name}` });
6142
5891
  }
@@ -6238,7 +5987,7 @@ function emitSafe(engine, sessionId, ev) {
6238
5987
  engine.emit({ ...ev, sessionId });
6239
5988
  }
6240
5989
 
6241
- /* AJAN DM aracı: paralel/finance ajanlarının birbirine kısa mesaj atması.
5990
+ /* AJAN DM aracı: paralel ajanların birbirine kısa mesaj atması.
6242
5991
  Salt metin — hedef ajanın oturumuna [AJAN DM] bloğu olarak düşer; AJAN DM
6243
5992
  panelinde iki yönlü görünür. topic verirsen aynı konudaki mesajlar aynı
6244
5993
  oturumda toplanır (cevap zinciri tek thread'de devam eder). */
@@ -6247,15 +5996,15 @@ const AGENT_DM_DEF = {
6247
5996
  function: {
6248
5997
  name: 'agent_dm',
6249
5998
  description:
6250
- 'Send a short DM to another agent or BOT (parallel agents, finance agents, bot chats like "Tool") to coordinate: share findings, ask status, warn about risk, hand off work, and MAKE JOINT DECISIONS. `to` = target session id, a bot name/id (e.g. "Tool", "Trader"), or a keyword from the agent title (e.g. "GOLD"). `topic` = short subject label — replies to the same topic stay in the SAME conversation thread, so ALWAYS reuse the topic you were DMed with when replying. `group` = optional group-chat name (e.g. "GOLD EKIP"): creates or reuses a group conversation, adds the target agent as a member, and your message is delivered to EVERY member — use groups when a decision needs multiple agents. `image` shares a chart/screen as an attachment the receiving agent REALLY sees and the AJAN DM panel shows: true = your last screenshot (fresh capture if none); a file path (e.g. the tool__mt5_shot "path") or a data URL = that exact image.',
5999
+ 'Send a short DM to another agent or BOT (parallel agents, bot chats like "Tool") to coordinate: share findings, ask status, warn about risk, hand off work, and MAKE JOINT DECISIONS. `to` = target session id, a bot name/id (e.g. "Tool"), or a keyword from the agent title. `topic` = short subject label — replies to the same topic stay in the SAME conversation thread, so ALWAYS reuse the topic you were DMed with when replying. `group` = optional group-chat name: creates or reuses a group conversation, adds the target agent as a member, and your message is delivered to EVERY member — use groups when a decision needs multiple agents. `image` shares a screenshot as an attachment the receiving agent REALLY sees and the AJAN DM panel shows: true = your last screenshot (fresh capture if none); a file path or a data URL = that exact image.',
6251
6000
  parameters: {
6252
6001
  type: 'object',
6253
6002
  properties: {
6254
6003
  to: { type: 'string', description: 'Target session id, bot name/id (e.g. "Tool") or a title keyword' },
6255
- topic: { type: 'string', description: 'Short subject label for the conversation thread, e.g. "GOLD pozisyon riski"' },
6004
+ topic: { type: 'string', description: 'Short subject label for the conversation thread' },
6256
6005
  message: { type: 'string', description: 'Short message (1-3 sentences)' },
6257
6006
  group: { type: 'string', description: 'Optional group-chat name — send to ALL members of that group (creates it on first use, adds the target agent)' },
6258
- image: { type: ['boolean', 'string'], description: 'true = son ekran görüntün (yoksa taze yakalar); dosya yolu (ör. tool__mt5_shot dönen PNG path) ya da data:image URL = o görsel iliştirilir. Panelde ve karşı ajanda GÖRÜNÜR; grafik/ekran bulgusunu paylaşmak için kullan' },
6007
+ image: { type: ['boolean', 'string'], description: 'true = son ekran görüntün (yoksa taze yakalar); dosya yolu ya da data:image URL = o görsel iliştirilir. Panelde ve karşı ajanda GÖRÜNÜR; ekran bulgusunu paylaşmak için kullan' },
6259
6008
  },
6260
6009
  required: ['message'],
6261
6010
  },
@@ -7140,7 +6889,7 @@ Engine.prototype.clearTodos = function (sid) {
7140
6889
 
7141
6890
  /* ---------- AJAN DM: ajanların birbirine mesajı ---------- */
7142
6891
 
7143
- /* Ajan DM gönder: hedef koşan paralel/finance ajanı (id YA DA başlık
6892
+ /* Ajan DM gönder: hedef koşan paralel ajanı (id YA DA başlık
7144
6893
  anahtar kelimesi). Teslim _pendingReports kuyruğuyla yapılır — hedef
7145
6894
  meşgulse mesaj done olunca düşer, kaybolmaz. Panel agent-dms.json'dan. */
7146
6895
  Engine.prototype._agentDmSend = async function (fromSid, args) {
@@ -7149,8 +6898,8 @@ Engine.prototype._agentDmSend = async function (fromSid, args) {
7149
6898
  const text = String((args && args.message) || '').trim().slice(0, 1200);
7150
6899
  if (!text) return { ok: false, error: 'mesaj boş' };
7151
6900
  /* GÖRSEL DM: image:true → son ekran görüntüsü (yoksa taze yakalama);
7152
- image:"<dosya yolu>" ya da data URL → o görsel BİREBİR iliştirilir
7153
- (ör. tool__mt5_shot dönen PNG path'i). Karşı ajan görüntüyü görür. */
6901
+ image:"<dosya yolu>" ya da data URL → o görsel BİREBİR iliştirilir.
6902
+ Karşı ajan görüntüyü görür. */
7154
6903
  const imgArg = args && args.image;
7155
6904
  let image = '';
7156
6905
  if (typeof imgArg === 'string' && imgArg.trim()) {
@@ -7171,8 +6920,7 @@ Engine.prototype._agentDmSend = async function (fromSid, args) {
7171
6920
  ? this._agentDmSessionTitle(fromSess)
7172
6921
  : 'Ajan';
7173
6922
  /* hedef çöz: oturum id YA DA başlık anahtar kelimesi (koşan ajanlar +
7174
- ANA OTURUM FALLBACK: chat oturumları this.cache'te yaşar — finance
7175
- trader → ana Beast DM zinciri böyle kapanır). */
6923
+ ANA OTURUM FALLBACK: chat oturumları this.cache'te yaşar). */
7176
6924
  let target = '';
7177
6925
  if (to) {
7178
6926
  target = jobs.has(to) ? to : '';
@@ -7228,8 +6976,8 @@ Engine.prototype._agentDmSend = async function (fromSid, args) {
7228
6976
  tüm iç trafiği TEK grup sohbetinde canlı toplanır. */
7229
6977
  /* TEK İŞ = TEK GRUP: taraflar AÇIK bir ekip/grup üyesiyse mesaj HER ZAMAN o
7230
6978
  gruba düşer — group: verilse bile yeni grup AÇILMAZ. Ayrıca group adı
7231
- mevcut bir grubun başlığıyla eşleşiyorsa (ör. "Beast Finance EKİP" →
7232
- team:finance) o grup kullanılır; aynı iş için ikinci grup oluşmaz. */
6979
+ mevcut bir grubun başlığıyla eşleşiyorsa o grup kullanılır; aynı iş
6980
+ için ikinci grup oluşmaz. */
7233
6981
  const shared = target ? this._agentDmSharedGroup(fromSid, target) : null;
7234
6982
  let gid = '';
7235
6983
  let g = null;
@@ -7341,7 +7089,7 @@ Engine.prototype._agentDmDeliver = function (dm, target, opts = {}) {
7341
7089
  wake: !!opts.wake,
7342
7090
  };
7343
7091
  /* bot↔bot sigorta: boş bot oturumunu her DM'de yeni turla uyandırma.
7344
- TOOL BOTU İSTİSNA (yalnız bot OLMAYAN gönderenden): ajan (finance/paralel
7092
+ TOOL BOTU İSTİSNA (yalnız bot OLMAYAN gönderenden): ajan (paralel
7345
7093
  sohbet) → Tool DM'i gerçek görevdir, beklemeden uyandırılır; bot↔bot
7346
7094
  ping-pong'u ise bütçeye tabidir (sonsuz tur fırtınası korunur). */
7347
7095
  const fromSess = this.cache.get(String(dm.from)) || null;
@@ -7378,7 +7126,7 @@ Engine.prototype._agentDmWakeAllowed = function (a, b) {
7378
7126
  };
7379
7127
 
7380
7128
  /* AJAN DM görseli (dosyadan): png/jpg/webp/gif dosyasını data URL'e çevirir.
7381
- Send_file kapısına takılmadan (ör. tool__mt5_shot path'i) görsel paylaşımı;
7129
+ Send_file kapısına takılmadan görsel paylaşımı;
7382
7130
  2.5MB üstü DM kaydını şişmesin diye atlanır. */
7383
7131
  Engine.prototype._agentDmImageFromFile = function (p) {
7384
7132
  try {
@@ -7489,7 +7237,7 @@ Engine.prototype._agentDmSharedGroup = function (a, b) {
7489
7237
  };
7490
7238
 
7491
7239
  /* Grup adı anahtarı: Türkçe-kararsız normalize — ALTIN/Altın/altın aynı gruba
7492
- iner; başlık eşleştirmede de kullanılır (ör. "Beast Finance EKİP"). */
7240
+ iner; başlık eşleştirmede de kullanılır. */
7493
7241
  Engine.prototype._agentGroupKey = function (name) {
7494
7242
  return String(name || '')
7495
7243
  .toLowerCase()
@@ -7518,7 +7266,7 @@ Engine.prototype._pushAgentDm = function (dm) {
7518
7266
 
7519
7267
  /* İş başlarken çağrılır: aynı parent / bg-gruptan başka ajan varsa (varsa
7520
7268
  önceden kurulmuştur) hepsini TEK ekip grubuna katar + katılım postu düşer.
7521
- dmGroupId verilirse (finans ekibi gibi hazır grup) parent şartı aranmaz —
7269
+ dmGroupId verilirse (hazır grup) parent şartı aranmaz —
7522
7270
  aynı dmGroupId'li TÜM ajanlar tek gruba toplanır. */
7523
7271
  Engine.prototype._agentTeamJoin = function (job) {
7524
7272
  try {
@@ -7616,7 +7364,7 @@ Engine.prototype._agentTeamPost = function (gid, fromSid, fromTitle, text) {
7616
7364
  } catch {}
7617
7365
  };
7618
7366
 
7619
- /* Grubu hazırla (yoksa kur): Telegram köprüsü ve finans alarmları grubu önceden
7367
+ /* Grubu hazırla (yoksa kur): Telegram köprüsü grubu önceden
7620
7368
  hiç kurulmamış olsa da panele düşebilsin. */
7621
7369
  Engine.prototype._agentGroupEnsure = function (gid, title, opts) {
7622
7370
  gid = String(gid || '');