beast-agent 2.57.0 → 2.57.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.57.0",
4
+ "version": "2.57.1",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -6178,7 +6178,7 @@ const TOOLS = [
6178
6178
  everyMin: { type: 'number', description: 'Check interval in minutes (default 15, min 1, max 1440)' },
6179
6179
  everySec: { type: 'number', description: 'Check interval in SECONDS (10-8640) — overrides everyMin for fast watchers (e.g. 30 = every 30s)' },
6180
6180
  cooldownMin: { type: 'number', description: 'İki bildirim arası en az dakika (varsayılan 60). >0 ise alarm TEKRARLIDIR: koşul sürdükçe soğuma dolduğunda yeniden bildirir (ör. 5 = 5 dakikada bir hatırlat). 0 = yalnız koşul yeniden sağlandığında (kenar tetikleme).' },
6181
- once: { type: 'boolean', description: 'true = tek seferlik izleyici: ilk tetiklemede kapanır (varsayılan false = tekrarlı)' },
6181
+ once: { type: 'boolean', description: 'true = tek seferlik izleyici: ilk tetiklemede listeden OTOMATİK SİLİNİR (varsayılan false = tekrarlı)' },
6182
6182
  },
6183
6183
  required: ['name', 'kind'],
6184
6184
  },
@@ -194,7 +194,7 @@ function normalize(input) {
194
194
  everyMin: Math.max(1, Math.round(everySec / 60)), // geriye dönük uyum
195
195
  everySec,
196
196
  cooldownMin,
197
- once: !!i.once, /* tek seferlik: ilk tetiklemede kapanır */
197
+ once: !!i.once, /* tek seferlik: ilk tetiklemede listeden OTOMATİK SİLİNİR */
198
198
  prompt,
199
199
  sessionId: i.sessionId || null,
200
200
  enabled: true,
@@ -378,10 +378,11 @@ async function tickOnce(deps = {}) {
378
378
  w.lastError = '';
379
379
  pushLog(w.id, r.triggered ? 'trigger' : 'ok', value);
380
380
  if (r.triggered) {
381
- /* TEK SEFERLİK: ilk tetiklemede izleyici kapanır (yeniden etkinleştirilebilir) */
382
- if (w.once) w.enabled = false;
383
381
  if (typeof hooks.onTrigger === 'function') hooks.onTrigger({ ...w }, value);
384
382
  events.push({ id: w.id, name: w.name, value });
383
+ /* TEK SEFERLİK: ilk tetiklemede izleyici listeden OTOMATİK SİLİNİR —
384
+ pasif olarak listede kalmaz (logları da temizlenir). */
385
+ if (w.once) remove(w.id);
385
386
  }
386
387
  } catch (e) {
387
388
  w.lastCheckAt = new Date(now).toISOString();
package/src/main.js CHANGED
@@ -2931,20 +2931,35 @@ async function handleTgIncoming(chatId, payload) {
2931
2931
  try {
2932
2932
  if (!engine) return;
2933
2933
  /* GRUP: normal grup desteği kapalı; ancak AJAN DM ↔ TELEGRAM köprüsünde
2934
- seçili grupsa mesaj AJAN DM grubuna düşer ve finance ajanları uyanır. */
2934
+ köprü AÇIKKEN gruba yazılan ilk mesaj o grubu OTOMATİK bağlar —
2935
+ grup seçme adımı yok. Bağlı gruptan gelen mesaj AJAN DM grubuna düşer
2936
+ ve finance ajanları uyanır. */
2935
2937
  if (payload.isGroup) {
2936
2938
  tgRememberGroup(chatId, payload.chatTitle);
2937
2939
  const dmTg = finDmTgCfg();
2938
- if (dmTg.on && String(dmTg.chat) === String(chatId)) {
2939
- const allowed = tgFind(payload.senderId, payload.username);
2940
- tgLog(
2941
- `grup(ajan dm) chat=${chatId} sender=${payload.senderId || '?'} user=${payload.username || '-'} allowed=${!!allowed}`
2942
- );
2943
- if (!allowed) return; /* izin listesi dışı yoksay */
2940
+ if (!dmTg.on) {
2941
+ tgLog(`skip: grup mesajı chat=${chatId} (köprü kapalı)`);
2942
+ return;
2943
+ }
2944
+ const allowed = tgFind(payload.senderId, payload.username);
2945
+ if (!allowed) {
2946
+ tgLog(`skip: grup mesajı chat=${chatId} — gönderici izin listesinde değil`);
2947
+ return;
2948
+ }
2949
+ if (!dmTg.chat) {
2950
+ /* İLK MESAJ = BAĞLAMA: /start gibi kısa komutlar yalnız bağlar,
2951
+ normal mesaj hem bağlar hem AJAN DM'e düşer. */
2952
+ finDmTgBind(chatId, payload.chatTitle);
2953
+ const boot = /^\/(start|baglan|bağlan)\b/i.test(String(payload.text || '').trim());
2954
+ if (boot) return;
2944
2955
  finTelegramToAgentDm(payload);
2945
2956
  return;
2946
2957
  }
2947
- tgLog(`skip: grup mesajı chat=${chatId} (grup desteği kapalı)`);
2958
+ if (String(dmTg.chat) === String(chatId)) {
2959
+ finTelegramToAgentDm(payload);
2960
+ return;
2961
+ }
2962
+ tgLog(`skip: grup mesajı chat=${chatId} (bağlı grup ${dmTg.chat})`);
2948
2963
  return;
2949
2964
  }
2950
2965
  const hit = tgFind(payload.senderId, payload.username);
@@ -10067,24 +10082,51 @@ async function finStatsRefresh(force) {
10067
10082
  const FIN_TEAM_GID = 'team:finance';
10068
10083
  const FIN_TEAM_TITLE = 'Beast Finance EKİP';
10069
10084
 
10070
- /* Köprü ayarı (tek nokta): açık + grup seçili mi? */
10085
+ /* Köprü ayarı: açık mı + bağlı grup (chatId). Grup SEÇİLMEZ — köprü açıkken
10086
+ gruba yazılan ilk mesaj o grubu otomatik bağlar (finDmTgBind). */
10071
10087
  function finDmTgCfg() {
10072
10088
  let f = {};
10073
10089
  try { f = finCfg(); } catch {}
10074
10090
  return {
10075
- on: !!(f && f.dmTelegram && f.dmTelegramChat),
10091
+ on: !!(f && f.dmTelegram),
10076
10092
  chat: String((f && f.dmTelegramChat) || ''),
10077
10093
  title: String((f && f.dmTelegramTitle) || ''),
10078
10094
  };
10079
10095
  }
10080
10096
 
10081
- /* Giden: AJAN DM grubu → Telegram (Telegram'dan gelenler geri gönderilmez). */
10097
+ /* Otomatik bağlama: gelen grup mesajı (izinli gönderici) AJAN DM aynası olur. */
10098
+ function finDmTgBind(chatId, title) {
10099
+ const id = String(chatId || '');
10100
+ if (!id) return false;
10101
+ const f = finCfg();
10102
+ const t = String(title || '').trim();
10103
+ f.dmTelegramChat = id;
10104
+ f.dmTelegramTitle = t || f.dmTelegramTitle || id;
10105
+ try { saveSettings(); } catch {}
10106
+ tgLog(`ajan dm telegram grubu OTOMATİK bağlandı: ${id}${t ? ' (' + t + ')' : ''}`);
10107
+ /* gruba onay: kullanıcı bağlandığını net görsün */
10108
+ try {
10109
+ if (tg && tg.connected) {
10110
+ Promise.resolve(
10111
+ tg.send(
10112
+ id,
10113
+ '✅ Beast Finance AJAN DM bu gruba bağlandı.\n' +
10114
+ 'Bundan sonra ajanların/alarmların mesajları burada; buraya yazdıkların AJAN DM grubunda görünür ve ajanları uyandırır.'
10115
+ )
10116
+ ).catch(() => {});
10117
+ }
10118
+ } catch {}
10119
+ return true;
10120
+ }
10121
+
10122
+ /* Giden: AJAN DM grubu → Telegram (Telegram'dan gelenler geri gönderilmez;
10123
+ grup henüz otomatik bağlanmadıysa sessizce beklenir). */
10082
10124
  function finAgentDmToTelegram(dm) {
10083
10125
  try {
10084
10126
  if (!dm || dm.viaTelegram) return;
10085
10127
  if (String(dm.group || '') !== FIN_TEAM_GID) return;
10086
10128
  const c = finDmTgCfg();
10087
- if (!c.on || !tg || !tg.connected) return;
10129
+ if (!c.on || !c.chat || !tg || !tg.connected) return;
10088
10130
  const who = String(dm.fromTitle || (dm.system ? 'SİSTEM' : 'Ajan'));
10089
10131
  const body =
10090
10132
  `👥 *${String(dm.groupTitle || FIN_TEAM_TITLE)}* · ${who}\n` +
@@ -11613,13 +11655,21 @@ ipcMain.handle('finance:settings', async (_e, patch) => {
11613
11655
  if (p.notifyTrades !== undefined) f.notifyTrades = !!p.notifyTrades;
11614
11656
  if (p.notifyWatchdog !== undefined) f.notifyWatchdog = !!p.notifyWatchdog;
11615
11657
  if (p.notifyTradeOnly !== undefined) f.notifyTradeOnly = !!p.notifyTradeOnly;
11616
- /* AJAN DM ↔ TELEGRAM köprüsü ayarları */
11658
+ /* AJAN DM ↔ TELEGRAM köprüsü ayarları (grup SEÇİLMEZ — otomatik bağlanır) */
11617
11659
  if (p.dmTelegram !== undefined) f.dmTelegram = !!p.dmTelegram;
11618
11660
  if (p.dmTelegramChat !== undefined) {
11619
11661
  f.dmTelegramChat = String(p.dmTelegramChat || '').trim().slice(0, 64);
11620
- if (!f.dmTelegramChat) f.dmTelegram = false;
11662
+ if (!f.dmTelegramChat) f.dmTelegramTitle = ''; /* koparıldı → başlık da gitsin */
11621
11663
  }
11622
11664
  if (p.dmTelegramTitle !== undefined) f.dmTelegramTitle = String(p.dmTelegramTitle || '').trim().slice(0, 80);
11665
+ /* köprü yeni açıldı ve botun gördüğü TEK grup varsa hemen bağla */
11666
+ if (p.dmTelegram === true && !f.dmTelegramChat) {
11667
+ const known = tgGroupsList();
11668
+ if (known.length === 1) {
11669
+ f.dmTelegramChat = String(known[0].id);
11670
+ f.dmTelegramTitle = String(known[0].title || known[0].id);
11671
+ }
11672
+ }
11623
11673
  if (p.maxDailyLossPct !== undefined) f.maxDailyLossPct = Math.max(0, Math.min(50, Number(p.maxDailyLossPct) || 0));
11624
11674
  if (p.dailyLossAction !== undefined) {
11625
11675
  const v = String(p.dailyLossAction || 'warn').toLowerCase();
@@ -14024,8 +14074,6 @@ ipcMain.handle('tg:allow:set', (_e, list) => {
14024
14074
  saveSettings();
14025
14075
  return settings.tgAllow;
14026
14076
  });
14027
- /* Botun gördüğü gruplar (AJAN DM ↔ TELEGRAM grup seçicisi) */
14028
- ipcMain.handle('tg:groups:list', () => tgGroupsList());
14029
14077
  ipcMain.handle('tg:sessions', () => [...tgChats.values()]);
14030
14078
 
14031
14079
  /* Sohbet geçmişi etiketi (Telegram): "Telegram <ad|chatId>" */
package/src/preload.js CHANGED
@@ -221,7 +221,6 @@ contextBridge.exposeInMainWorld('beast', {
221
221
  tgStop: () => ipcRenderer.invoke('tg:stop'),
222
222
  tgGetAllow: () => ipcRenderer.invoke('tg:allow:get'),
223
223
  tgSetAllow: (list) => ipcRenderer.invoke('tg:allow:set', list),
224
- tgGroupsList: () => ipcRenderer.invoke('tg:groups:list'),
225
224
  tgListSessions: () => ipcRenderer.invoke('tg:sessions'),
226
225
  onTgEvent: (cb) => ipcRenderer.on('tg:event', (_e, ev) => cb(ev)),
227
226
  dcGetStatus: () => ipcRenderer.invoke('dc:status:get'),
@@ -800,7 +800,7 @@
800
800
  </div>
801
801
  <div class="mini-add-row">
802
802
  <input id="wAddCd" class="inp" type="number" min="0" max="10080" value="60" title="soğuma (dk): koşul sürdükçe en fazla bu aralıkta bir bildirir — 0 = yalnız koşul yeniden sağlanınca" style="width:70px" />
803
- <label style="display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);white-space:nowrap"><input id="wAddOnce" type="checkbox" /> tek seferlik</label>
803
+ <label style="display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);white-space:nowrap"><input id="wAddOnce" type="checkbox" /> tek seferlik <i style="font-style:normal;opacity:.75">(tetiklenince listeden silinir)</i></label>
804
804
  </div>
805
805
  </div>
806
806
  <div id="watchList" class="mini-list"></div>
@@ -892,14 +892,14 @@
892
892
  </label>
893
893
  <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>
894
894
  <div class="fin-set-sep"></div>
895
- <label class="fin-set-row" title="Açıkken Beast Finance AJAN DM grubundaki mesajlar (alarm/sistem postları dahil) seçtiğin Telegram grubuna düşer; o gruba yazdığın mesaj AJAN DM grubunda görünür ve koşan finance ajanları tur beklemeden uyanır.">
895
+ <label class="fin-set-row" title="Açıkken botu eklediğin Telegram grubuna yazılan ilk mesaj o grubu AJAN DM aynası yapar: AJAN DM'de konuşulanlar (alarmlar dahil) gruba düşer, grupta yazdıkların AJAN DM'de görünür ve finance ajanları uyanır. Grup seçmene gerek yok.">
896
896
  <input id="finDmTgOn" type="checkbox" />
897
- <span class="fsr-main"><b>AJAN DM ↔ TELEGRAM</b><i>Ajan DM grubu Telegram'da canlı — iki yönlü köprü</i></span>
897
+ <span class="fsr-main"><b>AJAN DM ↔ TELEGRAM</b><i>Ajan DM grubu Telegram'da canlı — otomatik bağlanır</i></span>
898
898
  </label>
899
899
  <div id="finDmTgWrap" class="fin-set-sub" hidden>
900
900
  <span class="fin-set-lbl">TELEGRAM GRUBU</span>
901
- <select id="finDmTgChat" title="Botu eklediğin Telegram grubunu seç — liste, bottan mesaj alınan grupları gösterir"></select>
902
- <button id="finDmTgRefresh" class="fin-set-btn" title="Grup listesini yenile — bottan mesaj alan gruplar listelenir">&#x27F3; Listeyi yenile</button>
901
+ <div id="finDmTgState" class="fin-dm-tg-state">—</div>
902
+ <button id="finDmTgUnbind" class="fin-set-btn" title="Bağlantıyı kopar — sonra gruba yazılan ilk mesaj yeni grup olarak otomatik bağlanır">&#x2715;&#xFE0E; Bağlantıyı kopar</button>
903
903
  <div id="finDmTgHint" class="fin-set-note" style="margin:2px 0 0"></div>
904
904
  </div>
905
905
  </div>
@@ -205,8 +205,8 @@ const els = {
205
205
  finShowFlow: $('#finShowFlow'),
206
206
  finDmTgOn: $('#finDmTgOn'),
207
207
  finDmTgWrap: $('#finDmTgWrap'),
208
- finDmTgChat: $('#finDmTgChat'),
209
- finDmTgRefresh: $('#finDmTgRefresh'),
208
+ finDmTgState: $('#finDmTgState'),
209
+ finDmTgUnbind: $('#finDmTgUnbind'),
210
210
  finDmTgHint: $('#finDmTgHint'),
211
211
  finRiskCard: $('#finRiskCard'),
212
212
  finNotifyCard: $('#finNotifyCard'),
@@ -10124,9 +10124,8 @@ async function finSnapshot() {
10124
10124
  if (!finView.risk && r.cfg && r.cfg.watchdog !== false) finSaveCfg({ watchdog: false });
10125
10125
  finRenderStats(r.stats, r.equity, r.account && r.account.currency ? r.account.currency : '');
10126
10126
  finRenderAlerts(r.alerts);
10127
- /* görünüm ayarları açıkken AJAN DM ↔ TELEGRAM seçimi cfg ile senkron kalsın
10128
- (kullanıcı dropdown'dayken DOM'a dokunulmaz) */
10129
- if (els.finSettingsOverlay && !els.finSettingsOverlay.hidden && document.activeElement !== els.finDmTgChat) {
10127
+ /* görünüm ayarları açıkken AJAN DM ↔ TELEGRAM durumu cfg ile senkron kalsın */
10128
+ if (els.finSettingsOverlay && !els.finSettingsOverlay.hidden) {
10130
10129
  finDmTgPaint();
10131
10130
  }
10132
10131
  }
@@ -10291,10 +10290,9 @@ function finViewApply() {
10291
10290
  }
10292
10291
 
10293
10292
  /* ---------- AJAN DM ↔ TELEGRAM (görünüm ayarları) ----------
10294
- Ayarlar settings.finance'ta: dmTelegram + dmTelegramChat/Title. Grup listesi
10295
- bottan mesaj alan gruplardan gelir (kanal: tg:groups:list). */
10296
- let finDmTgGroups = [];
10297
-
10293
+ Grup SEÇİLMEZ: köprü açıkken botu eklediğin gruba yazılan ilk mesaj o grubu
10294
+ otomatik bağlar (sunucu tarafı: finDmTgBind). Bağlantıyı koparınca yeni
10295
+ grupta ilk mesaj yeniden bağlar. */
10298
10296
  function finDmTgPaint() {
10299
10297
  if (!els.finDmTgOn) return;
10300
10298
  const cfg = finCfgCache || {};
@@ -10303,50 +10301,22 @@ function finDmTgPaint() {
10303
10301
  const row = els.finDmTgOn.closest('.fin-set-row');
10304
10302
  if (row) row.classList.toggle('on', on);
10305
10303
  if (els.finDmTgWrap) els.finDmTgWrap.hidden = !on;
10306
- if (els.finDmTgChat) {
10307
- const cur = String(cfg.dmTelegramChat || '');
10308
- const sel = els.finDmTgChat;
10309
- sel.textContent = '';
10310
- const opt0 = document.createElement('option');
10311
- opt0.value = '';
10312
- opt0.textContent = finDmTgGroups.length ? '— Grup seç —' : '— Görünen grup yok —';
10313
- sel.appendChild(opt0);
10314
- let has = false;
10315
- for (const g of finDmTgGroups) {
10316
- const o = document.createElement('option');
10317
- o.value = String(g.id);
10318
- o.textContent = String(g.title || g.id) + ' (' + g.id + ')';
10319
- if (String(g.id) === cur) { o.selected = true; has = true; }
10320
- sel.appendChild(o);
10321
- }
10322
- /* listelenmemiş kayıtlı grup kaybolmasın — mevcut seçim korunur */
10323
- if (cur && !has) {
10324
- const o = document.createElement('option');
10325
- o.value = cur;
10326
- o.textContent = String(cfg.dmTelegramTitle || cur) + ' (' + cur + ')';
10327
- o.selected = true;
10328
- sel.appendChild(o);
10329
- }
10304
+ const chat = String(cfg.dmTelegramChat || '');
10305
+ if (els.finDmTgState) {
10306
+ els.finDmTgState.textContent = chat
10307
+ ? '✅ Bağlı: ' + String(cfg.dmTelegramTitle || chat) + ' (' + chat + ')'
10308
+ : 'Bağlı grup yok — botu gruba ekle ve gruba /start yaz; o grup otomatik bağlanır.';
10330
10309
  }
10310
+ if (els.finDmTgUnbind) els.finDmTgUnbind.hidden = !chat;
10331
10311
  if (els.finDmTgHint) {
10332
- els.finDmTgHint.textContent = finDmTgGroups.length
10333
- ? 'Seçili gruptaki mesajlar AJAN DM grubunda görünür; AJAN DM mesajları da bu gruba düşer.'
10334
- : 'Botu bir Telegram grubuna ekle, gruba bir mesaj yaz ve "Listeyi yenile"ye bas (BotFather → /setprivacy → Disable ya da bot gruba admin olmalı).';
10312
+ els.finDmTgHint.textContent =
10313
+ 'Grupta konuşulan her şey AJAN DM\u2019de görünür; ajanların/alarmların yazdıkları da gruba düşer. Grup değiştirmek için bağlantıyı kopar, yeni grupta /start yaz.';
10335
10314
  }
10336
10315
  }
10337
10316
 
10338
- async function finDmTgRefresh() {
10339
- try {
10340
- const list = await beast.tgGroupsList();
10341
- finDmTgGroups = Array.isArray(list) ? list : [];
10342
- } catch { finDmTgGroups = []; }
10343
- finDmTgPaint();
10344
- }
10345
-
10346
10317
  function finSettingsOpen() {
10347
10318
  if (els.finSettingsOverlay) els.finSettingsOverlay.hidden = false;
10348
10319
  finDmTgPaint();
10349
- finDmTgRefresh();
10350
10320
  }
10351
10321
  function finSettingsCloseModal() {
10352
10322
  if (els.finSettingsOverlay) els.finSettingsOverlay.hidden = true;
@@ -10380,30 +10350,27 @@ if (els.finShowRisk) els.finShowRisk.addEventListener('change', () => finViewTog
10380
10350
  if (els.finShowNotify) els.finShowNotify.addEventListener('change', () => finViewToggle('notify', els.finShowNotify.checked));
10381
10351
  if (els.finShowPerf) els.finShowPerf.addEventListener('change', () => finViewToggle('perf', els.finShowPerf.checked));
10382
10352
  if (els.finShowFlow) els.finShowFlow.addEventListener('change', () => finViewToggle('flow', els.finShowFlow.checked));
10383
- /* AJAN DM ↔ TELEGRAM köprüsü kontrolleri */
10353
+ /* AJAN DM ↔ TELEGRAM köprüsü kontrolleri (grup otomatik bağlanır) */
10384
10354
  if (els.finDmTgOn) {
10385
10355
  els.finDmTgOn.addEventListener('change', () => {
10386
10356
  const on = els.finDmTgOn.checked;
10387
10357
  if (finCfgCache) finCfgCache.dmTelegram = on;
10388
10358
  finSaveCfg({ dmTelegram: on });
10389
10359
  finDmTgPaint();
10390
- toast(on ? 'AJAN DM ↔ Telegram köprüsü açıldı' : 'AJAN DM ↔ Telegram köprüsü kapatıldı');
10391
- if (on) finDmTgRefresh();
10360
+ toast(on ? 'AJAN DM ↔ Telegram açıldı — gruba /start yazınca otomatik bağlanır' : 'AJAN DM ↔ Telegram kapatıldı');
10392
10361
  });
10393
10362
  }
10394
- if (els.finDmTgChat) {
10395
- els.finDmTgChat.addEventListener('change', () => {
10396
- const id = els.finDmTgChat.value || '';
10397
- const g = finDmTgGroups.find((x) => String(x.id) === String(id));
10363
+ if (els.finDmTgUnbind) {
10364
+ els.finDmTgUnbind.addEventListener('click', () => {
10398
10365
  if (finCfgCache) {
10399
- finCfgCache.dmTelegramChat = id;
10400
- finCfgCache.dmTelegramTitle = g ? String(g.title || '') : '';
10366
+ finCfgCache.dmTelegramChat = '';
10367
+ finCfgCache.dmTelegramTitle = '';
10401
10368
  }
10402
- finSaveCfg({ dmTelegramChat: id, dmTelegramTitle: g ? String(g.title || '') : '' });
10403
- toast(id ? 'Telegram grubu bağlandı: ' + (g ? g.title || id : id) : 'Telegram grubu seçilmedi');
10369
+ finSaveCfg({ dmTelegramChat: '', dmTelegramTitle: '' });
10370
+ finDmTgPaint();
10371
+ toast('Telegram grubu koparıldı — yeni grupta /start yazınca bağlanır');
10404
10372
  });
10405
10373
  }
10406
- if (els.finDmTgRefresh) els.finDmTgRefresh.addEventListener('click', () => finDmTgRefresh());
10407
10374
  finViewApply();
10408
10375
 
10409
10376
  /* ---------- BÖLÜM SIRALAMA (sürükle-bırak) ----------
@@ -5882,7 +5882,7 @@ body.finance-mode #composerWrap { margin-right: var(--finW, 400px); }
5882
5882
  }
5883
5883
  .fin-set-sub[hidden] { display: none; }
5884
5884
  .fin-set-lbl { font-size: 10.5px; color: var(--muted); letter-spacing: 0.5px; }
5885
- .fin-set-sub select { width: 100%; }
5885
+ .fin-dm-tg-state { font-size: 11.5px; color: var(--text); line-height: 1.4; word-break: break-word; }
5886
5886
  .fin-set-btn {
5887
5887
  align-self: flex-start;
5888
5888
  font-size: 10.5px;