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 +1 -1
- package/src/agent/engine.js +1 -1
- package/src/agent/watchers.js +4 -3
- package/src/main.js +64 -16
- package/src/preload.js +0 -1
- package/src/renderer/index.html +5 -5
- package/src/renderer/renderer.js +24 -57
- package/src/renderer/style.css +1 -1
package/package.json
CHANGED
package/src/agent/engine.js
CHANGED
|
@@ -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
|
|
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
|
},
|
package/src/agent/watchers.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
|
|
2943
|
-
|
|
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
|
-
|
|
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ü
|
|
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
|
|
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
|
-
/*
|
|
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.
|
|
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'),
|
package/src/renderer/index.html
CHANGED
|
@@ -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
|
|
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ı —
|
|
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
|
-
<
|
|
902
|
-
<button id="
|
|
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">✕︎ 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>
|
package/src/renderer/renderer.js
CHANGED
|
@@ -205,8 +205,8 @@ const els = {
|
|
|
205
205
|
finShowFlow: $('#finShowFlow'),
|
|
206
206
|
finDmTgOn: $('#finDmTgOn'),
|
|
207
207
|
finDmTgWrap: $('#finDmTgWrap'),
|
|
208
|
-
|
|
209
|
-
|
|
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
|
|
10128
|
-
|
|
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
|
-
|
|
10295
|
-
|
|
10296
|
-
|
|
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
|
-
|
|
10307
|
-
|
|
10308
|
-
|
|
10309
|
-
|
|
10310
|
-
|
|
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 =
|
|
10333
|
-
|
|
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
|
|
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.
|
|
10395
|
-
els.
|
|
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 =
|
|
10400
|
-
finCfgCache.dmTelegramTitle =
|
|
10366
|
+
finCfgCache.dmTelegramChat = '';
|
|
10367
|
+
finCfgCache.dmTelegramTitle = '';
|
|
10401
10368
|
}
|
|
10402
|
-
finSaveCfg({ dmTelegramChat:
|
|
10403
|
-
|
|
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) ----------
|
package/src/renderer/style.css
CHANGED
|
@@ -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-
|
|
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;
|