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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "0.25.0",
4
+ "version": "0.25.2",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -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
- // cevap tamam pencereden düşecek kısmın oturum notlarını güncelle
2279
- /* #21 bg ajanı: görev sonu ekstra LLM çağrıları YOK — hızlı kapansın.
2280
- Beast Code (bcCode) oturumları da aynı şekilde ANINDA kapansın:
2281
- not/hafıza/skill yansıtma çağrıları yapılmaz → done hemen gelir */
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); // bekleyen arka plan raporları
2308
- /* #12: yeterli örnek birikmişse üslup kalibrasyonu (sessiz) */
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
- '• /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',
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) {
@@ -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;