beast-agent 2.6.4 → 2.6.6
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/memory.js +139 -26
- package/src/agent/nightref.js +15 -0
- package/src/agent/perception.js +65 -2
- package/src/main.js +19 -3
package/package.json
CHANGED
package/src/agent/memory.js
CHANGED
|
@@ -265,67 +265,180 @@ function removeRule(textOrIndex) {
|
|
|
265
265
|
}
|
|
266
266
|
|
|
267
267
|
/* ---------- bellek hijyeni (#5) ----------
|
|
268
|
-
MEMORY.md: dedup +
|
|
268
|
+
MEMORY.md: yakın-kayıt dedup + gürültü temizliği + eskime. LLM'siz
|
|
269
|
+
deterministik — gece yansıması 429/limit'e takılsa bile memory sadeleşir. */
|
|
269
270
|
|
|
270
271
|
const MEMORY_CAP = 400; // maksimum kayıt sayısı
|
|
271
272
|
const MEMORY_MAX_AGE_DAYS = 120; // hiç skor üretmeyen kayıtların ömrü
|
|
272
273
|
|
|
273
|
-
|
|
274
|
-
|
|
274
|
+
/* kelime-kümesi benzerliği: fold + stopword temiz. "adı Batuhan, hitap kanka"
|
|
275
|
+
≡ "kullanıcı Batuhan Bozoklu, hitap 'kanka'" gibi TEKRARLARI yakalar. */
|
|
276
|
+
const MEM_STOP = new Set(
|
|
277
|
+
('ve veya ya ile için ama fakat da de ki mi mi mu mü bir bu şu o en daha çok az olarak gibi sonra önce yeni son ' +
|
|
278
|
+
'the a an of in on to for and or is are was were be been at by with as it its this that from').split(' ')
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
function lineTokens(s) {
|
|
282
|
+
const words = fold(s)
|
|
283
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
284
|
+
.split(' ')
|
|
285
|
+
.filter((w) => w.length > 1 && !MEM_STOP.has(w) && !/^kullanici/.test(w));
|
|
286
|
+
return new Set(words.slice(0, 30));
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function linesSimilar(a, b) {
|
|
290
|
+
const A = lineTokens(a);
|
|
291
|
+
const B = lineTokens(b);
|
|
292
|
+
if (!A.size || !B.size) return false;
|
|
293
|
+
let inter = 0;
|
|
294
|
+
for (const t of A) if (B.has(t)) inter++;
|
|
295
|
+
if (!inter) return false;
|
|
296
|
+
const min = Math.min(A.size, B.size);
|
|
297
|
+
return inter / min >= 0.7 || inter / (A.size + B.size - inter) >= 0.6;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/* 'X'i sildi / X ile ilgilenmiyor' beyanı — aynı X için eski kurulum satırları düşürülür */
|
|
301
|
+
const RETIRE_DECL_RE = /(indirdikten sonra sildi|bilerek sildi|art[i]?k ilgilenmiyor|ilgilenmiyor)/i;
|
|
302
|
+
const INSTALL_VERB_RE = /(indiriyor|indirdi|indirmek|kuruyor|kurulu|kurulum|y[kü]kl)/i;
|
|
303
|
+
|
|
304
|
+
function retiredToolNames(list) {
|
|
305
|
+
const retired = new Set();
|
|
306
|
+
for (const l of list) {
|
|
307
|
+
if (!RETIRE_DECL_RE.test(l)) continue;
|
|
308
|
+
for (const w of String(l).match(/[A-Za-z][A-Za-z0-9-]{2,}/g) || []) {
|
|
309
|
+
const f = fold(w);
|
|
310
|
+
if (!MEM_STOP.has(f) && f.length >= 4) retired.add(f);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return retired;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/* repo/araç indirme-inceleme günlüğü: kalıcı profil değil, bir kez değdi */
|
|
317
|
+
function isRepoNoise(l) {
|
|
318
|
+
if (RETIRE_DECL_RE.test(l)) return false; /* emeklilik beyanı değerli — korunur */
|
|
319
|
+
if (/(repo|github)/i.test(l) && /(indir|incel|kopya|kar[sş]ıla[sş]tır|ilgilen)/i.test(l)) return true;
|
|
320
|
+
if (/ilgilen/i.test(l) && /(inceliyor|kar[sş]ıla[sş]tır)/i.test(l)) return true;
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** Duplike + yakın-kayıt + gürültü + çok eski kayıtları temizler.
|
|
325
|
+
deep: LLM'siz temizlik katmanı (yakın-kayıt birleştirme — SON kopya kazanır). */
|
|
326
|
+
function hygiene({ maxAgeDays = MEMORY_MAX_AGE_DAYS, cap = MEMORY_CAP, deep = true } = {}) {
|
|
275
327
|
const list = entries();
|
|
276
328
|
if (!list.length) return { ok: true, removed: 0, reason: 'boş' };
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
329
|
+
let working = list.slice();
|
|
330
|
+
const dropped = [];
|
|
331
|
+
|
|
332
|
+
/* 0) birebir dedup — her modda (ucuz) */
|
|
333
|
+
{
|
|
334
|
+
const seen = new Set();
|
|
335
|
+
working = working.filter((l) => {
|
|
336
|
+
const key = fold(l).replace(/[^a-z0-9]+/g, ' ').trim();
|
|
337
|
+
if (seen.has(key)) {
|
|
338
|
+
dropped.push(l);
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
seen.add(key);
|
|
342
|
+
return true;
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (deep) {
|
|
347
|
+
/* 1) emekli araç beyanları: 'X'i sildi/ilgilenmiyor' → X'in eski kurulum satırları düşer */
|
|
348
|
+
const retired = retiredToolNames(working);
|
|
349
|
+
if (retired.size) {
|
|
350
|
+
working = working.filter((l) => {
|
|
351
|
+
if (RETIRE_DECL_RE.test(l)) return true; /* beyanın kendisi korunur */
|
|
352
|
+
if (!INSTALL_VERB_RE.test(l)) return true;
|
|
353
|
+
for (const t of lineTokens(l)) {
|
|
354
|
+
if (retired.has(t)) {
|
|
355
|
+
dropped.push(l);
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return true;
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
/* 2) repo/araç gürültüsü */
|
|
363
|
+
working = working.filter((l) => {
|
|
364
|
+
if (isRepoNoise(l)) {
|
|
365
|
+
dropped.push(l);
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
return true;
|
|
369
|
+
});
|
|
370
|
+
/* 3) yakın-kayıt dedup — aynı şeyin yeniden yazımı TEK satırda; SON kopya kazanır (en taze) */
|
|
371
|
+
const kept2 = [];
|
|
372
|
+
for (const l of working) {
|
|
373
|
+
const idx = kept2.findIndex((k) => linesSimilar(k, l));
|
|
374
|
+
if (idx >= 0) {
|
|
375
|
+
dropped.push(kept2[idx]);
|
|
376
|
+
kept2[idx] = l;
|
|
377
|
+
} else {
|
|
378
|
+
kept2.push(l);
|
|
379
|
+
}
|
|
285
380
|
}
|
|
286
|
-
|
|
287
|
-
kept.push(l);
|
|
381
|
+
working = kept2;
|
|
288
382
|
}
|
|
383
|
+
|
|
289
384
|
let aged = 0;
|
|
290
|
-
if (
|
|
385
|
+
if (working.length > cap || maxAgeDays > 0) {
|
|
291
386
|
/* tarih etiketli olmayanlar en eski kabul edilir (append-only başlangıç) */
|
|
292
387
|
const cut = Date.now() - maxAgeDays * 86400000;
|
|
293
388
|
const filtered = [];
|
|
294
389
|
/* kronolojik varsayım: dosya sırası = ekleme sırası */
|
|
295
|
-
const overflow = Math.max(0,
|
|
296
|
-
|
|
390
|
+
const overflow = Math.max(0, working.length - cap);
|
|
391
|
+
working.forEach((l, idx) => {
|
|
297
392
|
const m = l.match(/\b(\d{4}-\d{2}-\d{2})\b/);
|
|
298
393
|
const tooOld = m && new Date(m[1]).getTime() < cut;
|
|
299
|
-
if (tooOld && idx <
|
|
394
|
+
if (tooOld && idx < working.length - 20) { // son 20 kayıt asla yaşla silinmez
|
|
300
395
|
aged++;
|
|
301
396
|
return;
|
|
302
397
|
}
|
|
303
398
|
if (overflow > 0 && idx < overflow) {
|
|
304
399
|
// kap aşımı: en eskilerden düş ama yine de son 20 korunur
|
|
305
|
-
if (idx <
|
|
400
|
+
if (idx < working.length - 20) {
|
|
306
401
|
aged++;
|
|
307
402
|
return;
|
|
308
403
|
}
|
|
309
404
|
}
|
|
310
405
|
filtered.push(l);
|
|
311
406
|
});
|
|
312
|
-
return writeKept(filtered,
|
|
407
|
+
return writeKept(list, filtered, dropped.length + aged);
|
|
313
408
|
}
|
|
314
|
-
return writeKept(
|
|
409
|
+
return writeKept(list, working, dropped.length + aged);
|
|
315
410
|
}
|
|
316
411
|
|
|
317
|
-
function writeKept(kept, removedCount) {
|
|
412
|
+
function writeKept(originalList, kept, removedCount) {
|
|
318
413
|
try {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
414
|
+
/* yedek: hijyen geri alınabilir olsun (nightref backups klasörü ortak) */
|
|
415
|
+
if (removedCount > 0 && originalList.length) {
|
|
416
|
+
try {
|
|
417
|
+
const dir = path.join(memDir(), 'backups');
|
|
418
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
419
|
+
fs.writeFileSync(
|
|
420
|
+
path.join(dir, 'MEMORY-hygiene-' + new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19) + '.md'),
|
|
421
|
+
originalList.map((l) => '- ' + l).join('\n') + '\n',
|
|
422
|
+
'utf8'
|
|
423
|
+
);
|
|
424
|
+
} catch {}
|
|
425
|
+
}
|
|
426
|
+
/* save() → mem0 store'u satırlardan yeniden kurar (ham yazımda store bayat kalırdı) */
|
|
427
|
+
const w = save('MEMORY.md', kept.map((l) => '- ' + l).join('\n') + (kept.length ? '\n' : ''));
|
|
428
|
+
if (w && !w.ok) return { ok: false, error: w.error || 'yazılamadı' };
|
|
429
|
+
return { ok: true, removed: removedCount, remaining: kept.length, ...(droppedPreview(originalList, kept)) };
|
|
324
430
|
} catch (e) {
|
|
325
431
|
return { ok: false, error: String((e && e.message) || e) };
|
|
326
432
|
}
|
|
327
433
|
}
|
|
328
434
|
|
|
435
|
+
/* silinenleri özet olarak döndür (admin/araç yanıtı + audit) — ilk 40 */
|
|
436
|
+
function droppedPreview(originalList, kept) {
|
|
437
|
+
const keptSet = new Set(kept);
|
|
438
|
+
const gone = originalList.filter((l) => !keptSet.has(l)).slice(0, 40);
|
|
439
|
+
return gone.length ? { dropped: gone } : {};
|
|
440
|
+
}
|
|
441
|
+
|
|
329
442
|
/* ---------- #12 kişilik kalibrasyonu ----------
|
|
330
443
|
Kullanıcının konuşma tarzından üslup imzası çıkarır, SOUL.md'ye ekler.
|
|
331
444
|
İlk hafta mesajlar birikince "dijital ikiz" ton yakalanır. */
|
package/src/agent/nightref.js
CHANGED
|
@@ -318,6 +318,20 @@ async function run(deps) {
|
|
|
318
318
|
report.notes.push('bugün değerli transkript yok — öğrenme adımı atlandı');
|
|
319
319
|
}
|
|
320
320
|
|
|
321
|
+
/* 2b) LLM'siz derin hijyen: yakın-kayıt dedup + gürültü temizliği.
|
|
322
|
+
LLM (429/limit) çökse bile memory her yansımada sadeleşir. */
|
|
323
|
+
if (deps.memory && typeof deps.memory.hygiene === 'function') {
|
|
324
|
+
try {
|
|
325
|
+
const h = deps.memory.hygiene({ deep: true });
|
|
326
|
+
if (h && typeof h.removed === 'number' && h.removed > 0) {
|
|
327
|
+
report.hygiene = { removed: h.removed, remaining: h.remaining || 0 };
|
|
328
|
+
report.notes.push('derin hijyen: ' + h.removed + ' kayıt temizlendi');
|
|
329
|
+
}
|
|
330
|
+
} catch (e) {
|
|
331
|
+
report.errors.push('hijyen: ' + String((e && e.message) || e).slice(0, 100));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
321
335
|
/* 3) memory sıkılaştırma: drop/merge kararları → yedek → uygula */
|
|
322
336
|
const entriesNow = deps.memory.entries();
|
|
323
337
|
if (!noLlm && entriesNow.length >= CONSOLIDATE_MIN) {
|
|
@@ -401,6 +415,7 @@ async function run(deps) {
|
|
|
401
415
|
? '\n## İlgi alanları (günlük çıkarım)\n' + report.interests.labels.map((l) => '- ' + l).join('\n') + '\n'
|
|
402
416
|
: '') +
|
|
403
417
|
'\n## Bellek bakımı\n' +
|
|
418
|
+
(report.hygiene ? '- Derin hijyen (LLM\u2019siz): ' + report.hygiene.removed + ' kayıt temizlendi\n' : '') +
|
|
404
419
|
'- Kayıt: ' + m.before + ' → ' + m.after + ' (düşülen ' + m.dropped + ', ' + m.merged + ' kayıt birleşti)\n' +
|
|
405
420
|
'- Boyut: ' + m.charsBefore + ' → ' + m.charsAfter + ' char (~' + m.tokensSaved + ' token tasarruf)\n' +
|
|
406
421
|
(report.notes.length ? '- Not: ' + report.notes.join('; ') + '\n' : '') +
|
package/src/agent/perception.js
CHANGED
|
@@ -304,6 +304,35 @@ function topicKey(type, title) {
|
|
|
304
304
|
return normTitle(type + ' ' + title).split(' ').slice(0, 5).join(' ');
|
|
305
305
|
}
|
|
306
306
|
|
|
307
|
+
/* ---------- benzer haber dedup (kelime-kümesi benzerliği) ----------
|
|
308
|
+
Aynı olayın farklı kaynak varyasyonları farklı başlıkla gelir → fingerprint
|
|
309
|
+
kaçırır ("X yaptırım" / "ABD X'e yeni yaptırım"). Bu katman: TR fold'lu
|
|
310
|
+
stopword temizli kelime kümeleriyle containment/Jaccard benzerliği. */
|
|
311
|
+
|
|
312
|
+
const SIM_CONTAIN = 0.6; /* kısa başlık, uzun varyantın alt kümesiyse */
|
|
313
|
+
const SIM_JACCARD = 0.55; /* genel örtüşme eşiği */
|
|
314
|
+
|
|
315
|
+
const TITLE_STOP = new Set(
|
|
316
|
+
('ve veya ya ile için ama fakat da de ki mi mu mu mü bir bu şu o en daha çok az olarak gibi sonra önce yeni son sonucunda ' +
|
|
317
|
+
'the a an of in on to for and or is are was were be been at by with as it its this that from after before new').split(' ')
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
function titleTokens(t) {
|
|
321
|
+
const words = normTitle(String(t || '')).split(' ').filter((w) => w.length > 1 && !TITLE_STOP.has(w));
|
|
322
|
+
return new Set(words.slice(0, 24));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function tokensSimilar(a, b) {
|
|
326
|
+
if (!a || !b || !a.size || !b.size) return false;
|
|
327
|
+
const min = Math.min(a.size, b.size);
|
|
328
|
+
if (min < 2) return false; /* tek anahtar kelimelik başlık güvenilir değil */
|
|
329
|
+
let inter = 0;
|
|
330
|
+
for (const t of a) if (b.has(t)) inter++;
|
|
331
|
+
if (!inter) return false;
|
|
332
|
+
if (inter / min >= SIM_CONTAIN) return true;
|
|
333
|
+
return inter / (a.size + b.size - inter) >= SIM_JACCARD;
|
|
334
|
+
}
|
|
335
|
+
|
|
307
336
|
function uid() {
|
|
308
337
|
return Date.now().toString(36) + Math.random().toString(36).slice(2, 8);
|
|
309
338
|
}
|
|
@@ -516,6 +545,41 @@ async function runCycle({ cfg, signals, llmFilter, now = new Date(), log = () =>
|
|
|
516
545
|
for (const k of seenKeys.slice(0, seenKeys.length - SEEN_CAP)) delete st.seen[k];
|
|
517
546
|
}
|
|
518
547
|
|
|
548
|
+
/* FAZ 1 — döngü içi benzer birleştirme: aynı haberin farklı kaynak
|
|
549
|
+
varyasyonları TEK adaya iner (kaynaklar birleşir, LLM'e tekrar gitmez) */
|
|
550
|
+
const mergedPending = [];
|
|
551
|
+
let similar = 0;
|
|
552
|
+
for (const ev of pending) {
|
|
553
|
+
const tk = titleTokens(ev.title);
|
|
554
|
+
const twin = mergedPending.find((m) => tokensSimilar(m._tk, tk));
|
|
555
|
+
if (twin) {
|
|
556
|
+
if (!twin.sources.includes(ev.source)) twin.sources.push(ev.source);
|
|
557
|
+
similar++;
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
ev._tk = tk;
|
|
561
|
+
mergedPending.push(ev);
|
|
562
|
+
}
|
|
563
|
+
pending.splice(0, pending.length, ...mergedPending);
|
|
564
|
+
|
|
565
|
+
/* FAZ 2 — bildirim geçmişine karşı: son 24 saatte BENZER bir haber zaten
|
|
566
|
+
BİLDİRİLDİYSE aday sönüklenir (aynı haberin 3 varyasyon spam'i olmasın) */
|
|
567
|
+
const counts = { ignored: 0, stored: 0, queued: 0, dup: dups, raw: raws.length, similar };
|
|
568
|
+
const passable = [];
|
|
569
|
+
for (const ev of pending) {
|
|
570
|
+
const twin = st.events.find(
|
|
571
|
+
(s) => s.status === 'notified' && tokensSimilar(titleTokens(s.title), ev._tk)
|
|
572
|
+
);
|
|
573
|
+
if (twin) {
|
|
574
|
+
ev.status = 'ignored';
|
|
575
|
+
ev.reason = 'benzer haber zaten bildirildi: ' + String(twin.title || '').slice(0, 50);
|
|
576
|
+
counts.similar++;
|
|
577
|
+
continue;
|
|
578
|
+
}
|
|
579
|
+
passable.push(ev);
|
|
580
|
+
}
|
|
581
|
+
pending.splice(0, pending.length, ...passable);
|
|
582
|
+
|
|
519
583
|
/* UCUZ FİLTRE: tüm adaylar TEK toplu çağrıda (maliyet freni). Çökerse deterministik.
|
|
520
584
|
İlgi alanları: elle girilen + sohbetlerden öğrenilenler; son konuşmalar bağlam. */
|
|
521
585
|
const interests = combinedInterests(cfg);
|
|
@@ -532,7 +596,6 @@ async function runCycle({ cfg, signals, llmFilter, now = new Date(), log = () =>
|
|
|
532
596
|
}
|
|
533
597
|
if (!graded || !graded.size) log('filtre: deterministik puanlama');
|
|
534
598
|
|
|
535
|
-
const counts = { ignored: 0, stored: 0, queued: 0, dup: dups, raw: raws.length };
|
|
536
599
|
const actions = [];
|
|
537
600
|
for (const ev of pending) {
|
|
538
601
|
const g = graded && graded.get(String(ev.id).toLowerCase());
|
|
@@ -603,7 +666,7 @@ async function runCycle({ cfg, signals, llmFilter, now = new Date(), log = () =>
|
|
|
603
666
|
st.lastRunAt = now.toISOString();
|
|
604
667
|
saveState(st);
|
|
605
668
|
log(
|
|
606
|
-
'cycle tamam: raw=' + counts.raw + ' dup=' + dups +
|
|
669
|
+
'cycle tamam: raw=' + counts.raw + ' dup=' + dups + ' similar=' + counts.similar +
|
|
607
670
|
' ignored=' + counts.ignored + ' stored=' + counts.stored + ' queued=' + counts.queued +
|
|
608
671
|
' (' + (Date.now() - t0) + 'ms)'
|
|
609
672
|
);
|
package/src/main.js
CHANGED
|
@@ -6420,6 +6420,20 @@ function empatiSourceLinePlain(ev) {
|
|
|
6420
6420
|
return src ? '🔗 kaynak: ' + cap(src, 80) : '';
|
|
6421
6421
|
}
|
|
6422
6422
|
|
|
6423
|
+
/* WhatsApp: kullanıcı tercihi — ham URL GÖRÜNMEZ, haber başlığı gider.
|
|
6424
|
+
(WA düz metinde başlık-linki desteklemez; gerçek link yine de ajanın
|
|
6425
|
+
BAĞLAM bloğunda durur — "linki at" derse model oradan paylaşıır.) */
|
|
6426
|
+
function empatiSourceLineWa(ev) {
|
|
6427
|
+
if (!ev) return '';
|
|
6428
|
+
const oneLine = (s) =>
|
|
6429
|
+
String(s || '').replace(/\s*\n+\s*/g, ' ').replace(/\s{2,}/g, ' ').trim();
|
|
6430
|
+
const ELLIPSIS = '...';
|
|
6431
|
+
const cap = (s, max) =>
|
|
6432
|
+
oneLine(s).length > max ? oneLine(s).slice(0, max - ELLIPSIS.length) + ELLIPSIS : oneLine(s);
|
|
6433
|
+
const title = oneLine(ev.title || ev.source || '').trim();
|
|
6434
|
+
return title ? '🔗 ' + cap(title, 80) : '';
|
|
6435
|
+
}
|
|
6436
|
+
|
|
6423
6437
|
function empatiInjectToSession(sid, out) {
|
|
6424
6438
|
try {
|
|
6425
6439
|
if (!sid || engine.isBusy(sid)) return; /* tur ortasında geçmişi karıştırma — bildirim kanala zaten gitti */
|
|
@@ -6525,12 +6539,14 @@ function empatiDesktopSid() {
|
|
|
6525
6539
|
Hiçbir entegrasyon yazılamazsa masaüstü chat UI (toast) kalır. */
|
|
6526
6540
|
function empatiNotify(text, ev) {
|
|
6527
6541
|
const cfg = empatiCfg();
|
|
6528
|
-
/* desktop + Discord: başlık-linki (markdown);
|
|
6529
|
-
olması için şart) —
|
|
6542
|
+
/* desktop + Discord: başlık-linki (markdown); TG: ham URL (tıklanabilir
|
|
6543
|
+
olması için şart); WA: yalnız başlık (kullanıcı tercihi — ham URL yok) */
|
|
6530
6544
|
const src = empatiSourceLine(ev);
|
|
6531
6545
|
const srcPlain = empatiSourceLinePlain(ev);
|
|
6546
|
+
const srcWa = empatiSourceLineWa(ev);
|
|
6532
6547
|
const out = PROACTIVE_MARK + '\n' + text + (src ? '\n' + src : '');
|
|
6533
6548
|
const outPlain = PROACTIVE_MARK + '\n' + text + (srcPlain ? '\n' + srcPlain : '');
|
|
6549
|
+
const outWa = PROACTIVE_MARK + '\n' + text + (srcWa ? '\n' + srcWa : '');
|
|
6534
6550
|
const inject = empatiInjectText(ev, out);
|
|
6535
6551
|
const senders = [];
|
|
6536
6552
|
const tryWa = () => {
|
|
@@ -6539,7 +6555,7 @@ function empatiNotify(text, ev) {
|
|
|
6539
6555
|
if (own && wa && wa.connected) {
|
|
6540
6556
|
const jid = own + '@s.whatsapp.net';
|
|
6541
6557
|
senders.push(() =>
|
|
6542
|
-
Promise.resolve(sendWaSafe(jid,
|
|
6558
|
+
Promise.resolve(sendWaSafe(jid, outWa))
|
|
6543
6559
|
.then(() => empatiInjectToSession(ensureWaSession(jid), inject))
|
|
6544
6560
|
.catch(() => {})
|
|
6545
6561
|
);
|