beast-agent 0.25.0 → 0.25.2
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 +34 -37
- package/src/main.js +36 -23
- package/src/renderer/renderer.js +6 -0
package/package.json
CHANGED
package/src/agent/engine.js
CHANGED
|
@@ -1501,6 +1501,10 @@ class Engine {
|
|
|
1501
1501
|
/* #6 bağlam sıkıştırma: öze dönüşen eski mesajlar bellekten VE diskten
|
|
1502
1502
|
düşer (compacted işaretiyle); notlar + son pencere her zaman kalır.
|
|
1503
1503
|
Böylece notesAt=0'dan yeniden başlar, uzun sohbette şişme olmaz. */
|
|
1504
|
+
/* YARIŞ KORUMASI: bu bakım artık done SONRASI arka planda koşuyor —
|
|
1505
|
+
yeni tur başladıysa dosya sıkıştırmayı ERTENELE (not satırı append ile
|
|
1506
|
+
zaten kayıtlı; sıkıştırma sonraki bakımda yapılır, append kaybı olmaz) */
|
|
1507
|
+
if (this.ctrls.has(session.id)) return { ok: true, deferred: true };
|
|
1504
1508
|
this._compactToNotes(session, cut);
|
|
1505
1509
|
/* bellek kopyasını da eşele: özetlenen bölge [0..cut) atılır */
|
|
1506
1510
|
session.messages = session.messages.slice(cut);
|
|
@@ -1511,6 +1515,29 @@ class Engine {
|
|
|
1511
1515
|
}
|
|
1512
1516
|
}
|
|
1513
1517
|
|
|
1518
|
+
/* Cevap done SONRASI arka planda koşan ev işleri (kullanıcıyı BEKLETMEZ,
|
|
1519
|
+
DURUM BALONUNU DA MEŞGUL ETMEZ — tamamen sessizdir):
|
|
1520
|
+
oturum notları → otomatik memory → skill yansıtma → kişilik kalibrasyonu.
|
|
1521
|
+
Aynı oturum için per-session zincirle sıralanır. */
|
|
1522
|
+
_postRunHousekeeping(session, prevSignal) {
|
|
1523
|
+
const sid = session.id;
|
|
1524
|
+
if (session.bgJob || session.bcCode || session.isBotDm) return;
|
|
1525
|
+
if (prevSignal && prevSignal.aborted) return;
|
|
1526
|
+
if (!this._housekeepingTail) this._housekeepingTail = new Map();
|
|
1527
|
+
const job = this._housekeepingTail.get(sid) || Promise.resolve();
|
|
1528
|
+
const next = job.catch(() => {}).then(async () => {
|
|
1529
|
+
const ctl = new AbortController();
|
|
1530
|
+
try { await this._updateSessionNotes(session, ctl.signal); } catch {}
|
|
1531
|
+
if (ctl.signal.aborted || this.ctrls.has(sid)) return;
|
|
1532
|
+
try { await this._autoMemory(session, ctl.signal); } catch {}
|
|
1533
|
+
if (this.reflection.enabled && !ctl.signal.aborted && !this.ctrls.has(sid)) {
|
|
1534
|
+
try { await this._maybeReflectSkill(session); } catch {}
|
|
1535
|
+
}
|
|
1536
|
+
try { memory.calibratePersona(); } catch {}
|
|
1537
|
+
});
|
|
1538
|
+
this._housekeepingTail.set(sid, next);
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1514
1541
|
/* ---------- agent loop ---------- */
|
|
1515
1542
|
|
|
1516
1543
|
send(sessionId, payload) {
|
|
@@ -2275,43 +2302,14 @@ class Engine {
|
|
|
2275
2302
|
emit({ type: 'message', message: assistant });
|
|
2276
2303
|
|
|
2277
2304
|
if (!res.toolCalls || !res.toolCalls.length) {
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
if (!session.bgJob && !session.bcCode && !session.isBotDm) {
|
|
2283
|
-
const r = await this._updateSessionNotes(session, ctrl.signal);
|
|
2284
|
-
if (r && r.ok) {
|
|
2285
|
-
emitSafe(this, sid, { type: 'status', status: `oturum notları güncellendi (${session.code || ''})` });
|
|
2286
|
-
} else if (r && r.reason && !/^bekleme/.test(r.reason)) {
|
|
2287
|
-
emitSafe(this, sid, { type: 'status', status: `oturum notu YAZILAMADI: ${r.reason}` });
|
|
2288
|
-
}
|
|
2289
|
-
}
|
|
2290
|
-
/* otomatik memory döngüsü: kalıcı değerli bilgiyi MEMORY.md'ye düşür */
|
|
2291
|
-
if (!ctrl.signal.aborted && !session.bgJob && !session.bcCode && !session.isBotDm) {
|
|
2292
|
-
try {
|
|
2293
|
-
await this._autoMemory(session, ctrl.signal);
|
|
2294
|
-
} catch {}
|
|
2295
|
-
}
|
|
2296
|
-
/* deneyimden skill doğurma (#2): 5+ yeni araç çağrısı biriktiyse yansıt */
|
|
2297
|
-
if (this.reflection.enabled && !ctrl.signal.aborted && !session.bgJob && !session.bcCode && !session.isBotDm) {
|
|
2298
|
-
try {
|
|
2299
|
-
const made = await this._maybeReflectSkill(session);
|
|
2300
|
-
if (made) emitSafe(this, sid, { type: 'status', status: `skill taslağı doğdu: ${made}` });
|
|
2301
|
-
} catch {}
|
|
2302
|
-
}
|
|
2303
|
-
this._clearCrash(); // temiz bitiş — çökme kaydını sil
|
|
2304
|
-
this._maybeCompact(sid); // oturum dosyası şiştiyse sıkıştır
|
|
2305
|
+
/* cevap tamam → done HEMEN: kullanıcı beklemeden yeni iş yazabilsin.
|
|
2306
|
+
Not/memory/skill bakımı artık arka planda (_postRunHousekeeping). */
|
|
2307
|
+
this._clearCrash();
|
|
2308
|
+
this._maybeCompact(sid);
|
|
2305
2309
|
emit({ type: 'done', usage: res.usage || null, meta: res.meta || null });
|
|
2306
2310
|
this._bgFinish(sid, 'done');
|
|
2307
|
-
this.flushPendingReports(sid);
|
|
2308
|
-
|
|
2309
|
-
try {
|
|
2310
|
-
const cal = memory.calibratePersona();
|
|
2311
|
-
if (cal.ok && cal.traits && cal.traits.length) {
|
|
2312
|
-
emitSafe(this, sid, { type: 'status', status: 'kişilik kalibre edildi' });
|
|
2313
|
-
}
|
|
2314
|
-
} catch {}
|
|
2311
|
+
this.flushPendingReports(sid);
|
|
2312
|
+
this._postRunHousekeeping(session, ctrl.signal);
|
|
2315
2313
|
return;
|
|
2316
2314
|
}
|
|
2317
2315
|
|
|
@@ -2359,8 +2357,7 @@ class Engine {
|
|
|
2359
2357
|
);
|
|
2360
2358
|
}
|
|
2361
2359
|
emit({ type: 'done', usage: null });
|
|
2362
|
-
this._bgFinish(sid, 'error', 'tur limiti doldu (MAX_TURNS)');
|
|
2363
|
-
} catch (e) {
|
|
2360
|
+
this._bgFinish(sid, 'error', 'tur limiti doldu (MAX_TURNS)'); } catch (e) {
|
|
2364
2361
|
const aborted = e && (e.name === 'AbortError' || ctrl.signal.aborted);
|
|
2365
2362
|
if (aborted) {
|
|
2366
2363
|
this._clearCrash(); // kullanıcı durdurdu — kurtarma yok
|
package/src/main.js
CHANGED
|
@@ -620,29 +620,29 @@ function emitWaEventSafe(ev) {
|
|
|
620
620
|
function waSlashHelp() {
|
|
621
621
|
return [
|
|
622
622
|
'*Beast komutları*',
|
|
623
|
-
'•
|
|
624
|
-
'•
|
|
625
|
-
'•
|
|
626
|
-
'•
|
|
627
|
-
'•
|
|
628
|
-
'•
|
|
629
|
-
'•
|
|
630
|
-
'•
|
|
631
|
-
'•
|
|
632
|
-
'•
|
|
633
|
-
'•
|
|
634
|
-
'•
|
|
635
|
-
'•
|
|
636
|
-
'•
|
|
637
|
-
'•
|
|
638
|
-
'•
|
|
639
|
-
'•
|
|
640
|
-
'•
|
|
641
|
-
'•
|
|
642
|
-
'•
|
|
643
|
-
'•
|
|
644
|
-
'•
|
|
645
|
-
'•
|
|
623
|
+
'• */help* – bu liste',
|
|
624
|
+
'• */new* – yeni oturum aç (kod verilir)',
|
|
625
|
+
'• */open* <kod> – o koddaki oturuma geç',
|
|
626
|
+
'• */sessions* – bu sohbetin oturumları',
|
|
627
|
+
'• */stop* – koşan işleri durdur (ajanlar+turlar; cron/izleyici/olay sürer)',
|
|
628
|
+
'• */start* – durdurulan servisleri devam ettir',
|
|
629
|
+
'• */restart* – uygulamayı yeniden başlat',
|
|
630
|
+
'• */change* – modelleri listele (*/change 5* ile 5.modele geç)',
|
|
631
|
+
'• */notes* – bu oturumun notlarını göster',
|
|
632
|
+
'• */notify* on|off – hata mail bildirimini aç/kapa',
|
|
633
|
+
'• */think* <0-5> – düşünme seviyesi (0 kapalı · 1 low · 2 medium · 3 high · 4 xhigh · 5 max)',
|
|
634
|
+
'• */clear* – bu oturumun geçmişini temizle',
|
|
635
|
+
'• */screenshot* – masaüstü ekran görüntüsünü gönder',
|
|
636
|
+
'• */rule* <metin> – kalıcı kural ekle (*/rules*: liste)',
|
|
637
|
+
'• */allow* <isim> <numara> – WhatsApp allow listesine kişi ekle (örn: /allow batu 905414178456)',
|
|
638
|
+
'• */block* – allow listesini numaralarıyla listele (*/block 3*: 3. kişiyi çıkar; 1 = sahip, silinemez)',
|
|
639
|
+
'• */approve* – bekleyen riskli işlemi onayla (*/approve always*: bir daha sorulmasın · */deny*: reddet)',
|
|
640
|
+
'• */update* – yeni sürüm kontrolü (*/update now*: indirileni hemen kur)',
|
|
641
|
+
'• */model* – aktif modeli göster (*/model* <isim> ile değiştir)',
|
|
642
|
+
'• */skills* – kurulu skill\u2019ler',
|
|
643
|
+
'• */usage* – bugünkü kullanım',
|
|
644
|
+
'• */backup* – tüm veriyi ŞİFRELİ yedekle (Beast Kodu imzalı, Masaüstü\\Beast-Backups)',
|
|
645
|
+
'• */status* – bağlantı ve servis durumu',
|
|
646
646
|
'',
|
|
647
647
|
'Gruplarda beni @mention ile çağır; ardışık mesajlarını tek cevapta birleştiririm.',
|
|
648
648
|
].join('\n');
|
|
@@ -2117,6 +2117,19 @@ function reloadBackend() {
|
|
|
2117
2117
|
}
|
|
2118
2118
|
} catch {}
|
|
2119
2119
|
}
|
|
2120
|
+
/* WA ara yorumları: ajanın araç çağrıları ARASINDAKİ açıklama metinleri
|
|
2121
|
+
("işe başlıyorum…" vb.) da WhatsApp'a gitsin. Son cevap 'done'da
|
|
2122
|
+
gönderildiği için burada yalnız tool_calls TAŞIYAN ara mesajlar alınır. */
|
|
2123
|
+
if (ev.type === 'message' && ev.message && ev.message.role === 'assistant' && wa && wa.connected) {
|
|
2124
|
+
const mtxt = typeof ev.message.content === 'string' ? ev.message.content.trim() : '';
|
|
2125
|
+
const isInterim = Array.isArray(ev.message.tool_calls) && ev.message.tool_calls.length > 0;
|
|
2126
|
+
if (mtxt && isInterim) {
|
|
2127
|
+
try {
|
|
2128
|
+
const hit = [...waChats.entries()].find(([, s]) => s === ev.sessionId);
|
|
2129
|
+
if (hit) sendWaSafe(hit[0], mtxt).catch(() => {});
|
|
2130
|
+
} catch {}
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2120
2133
|
/* #14 paralel ajan: arka plan oturumu bitince ana sohbete özet bas.
|
|
2121
2134
|
aborted (öz-kurtarma/wrap-up kick) turları BİTİŞ değildir — rapor basma */
|
|
2122
2135
|
if (ev.type === 'done' && ev.sessionId && !ev.aborted) {
|
package/src/renderer/renderer.js
CHANGED
|
@@ -3439,12 +3439,18 @@ function onEvent(ev) {
|
|
|
3439
3439
|
case 'done':
|
|
3440
3440
|
closeChatToolGroup();
|
|
3441
3441
|
setBusy(false);
|
|
3442
|
+
setStatus(''); /* son durum balonu ("düşünüyor…" vb.) yapışmasın */
|
|
3443
|
+
/* cevabın SONU görünsün: markdown son render sonrası iki kez en alta kilitle */
|
|
3444
|
+
scrollDown(true);
|
|
3445
|
+
setTimeout(() => scrollDown(true), 80);
|
|
3446
|
+
setTimeout(() => scrollDown(true), 260);
|
|
3442
3447
|
refreshSessions();
|
|
3443
3448
|
els.input.focus();
|
|
3444
3449
|
break;
|
|
3445
3450
|
case 'error':
|
|
3446
3451
|
closeChatToolGroup();
|
|
3447
3452
|
setBusy(false);
|
|
3453
|
+
setStatus('');
|
|
3448
3454
|
addErrorBubble(ev.error);
|
|
3449
3455
|
refreshSessions();
|
|
3450
3456
|
break;
|