beast-agent 2.9.0 → 2.10.0

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.9.0",
4
+ "version": "2.10.0",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -3402,6 +3402,10 @@ class Engine {
3402
3402
  session.messages.slice(preLen).some((m) => m.role === 'user') ||
3403
3403
  this._flushSteer(sid, session, emit)
3404
3404
  ) {
3405
+ /* ARA CEVAP: bu cevap 'done' değil (tur steer'le sürüyor) —
3406
+ bağlı kanallara (WA/TG/DC) tek tek iletilir; SON cevap yine
3407
+ done'da gider (çift yok: bu artık 'son' değil). */
3408
+ emit({ type: 'interim-final', message: assistant });
3405
3409
  continue;
3406
3410
  }
3407
3411
  /* GÖREV LİSTESİ DİSİPLİNİ: ajan işi bitti sanıyor ama listede hâlâ
package/src/main.js CHANGED
@@ -2334,17 +2334,10 @@ async function processWaMessage(jid, payload, senderNum, requeues = 0) {
2334
2334
  waLog(`skip flush: izinli eşleşme yok (sender=+${senderNum || '?'})`);
2335
2335
  return;
2336
2336
  }
2337
+ /* OPENCODE STEER: oturum meşgulse mesaj bekleMEZ — engine.send tamponuna
2338
+ ekler, koşan tur sonraki istekte görür ve cevaplar (eski cevap bozulmaz).
2339
+ Sıra korunur: floş katmanı debounceli ve sıralı işler. */
2337
2340
  let sid = waChats.get(jid) || waSingleSid;
2338
- if (sid && engine.isBusy(sid)) {
2339
- /* oturum hâlâ önceki işle uğraşıyor — KAYBETME: sınırı kaldırdık,
2340
- iş bitene dek her debounce turunda yeniden deneriz; kullanıcıya
2341
- "işleyemedim" denmez, mesaj boşa gitmez. */
2342
- if (requeues === 1) {
2343
- waLog(`flush: oturum meşgul, mesaj kuyrukta bekliyor sid=${sid}`);
2344
- }
2345
- await new Promise((r) => setTimeout(r, WA_DEBOUNCE_MS));
2346
- return processWaMessage(jid, payload, senderNum, requeues + 1);
2347
- }
2348
2341
  if (!isGroup && requeues > 0) {
2349
2342
  // retry sonrası izin yeniden kontrol edilir (yukarıda hit zaten alınıyor)
2350
2343
  }
@@ -2650,12 +2643,9 @@ async function processTgMessage(chatId, payload, requeues = 0) {
2650
2643
  tgLog(`skip flush: izinli eşleşme yok (sender=${payload.senderId || '?'})`);
2651
2644
  return;
2652
2645
  }
2646
+ /* OPENCODE STEER: meşgulse bekleme — engine.send tampona ekler, koşan tur
2647
+ sonraki istekte görür (WA ile aynı mantık) */
2653
2648
  let sid = tgChats.get(chatId) || tgSingleSid;
2654
- if (sid && engine.isBusy(sid)) {
2655
- /* oturum meşgul — WA ile aynı: kaybetme, iş bitene dek yeniden dene */
2656
- await new Promise((r) => setTimeout(r, TG_DEBOUNCE_MS));
2657
- return processTgMessage(chatId, payload, requeues + 1);
2658
- }
2659
2649
  /* KANAL TEK OTURUMU: eskisi silinmedikçe hep aynı oturumdan devam */
2660
2650
  sid = ensureTgSession(chatId);
2661
2651
  /* Kişi bazlı granül izin: all/web/read/chat */
@@ -2864,12 +2854,9 @@ async function processDcMessage(channelId, payload) {
2864
2854
  dcLog(`skip flush: izinli eşleşme yok (sender=${payload.senderId || '?'})`);
2865
2855
  return;
2866
2856
  }
2857
+ /* OPENCODE STEER: meşgulse bekleme — engine.send tampona ekler, koşan tur
2858
+ sonraki istekte görür (WA/TG ile aynı mantık) */
2867
2859
  let sid = dcChats.get(channelId) || dcSingleSid;
2868
- if (sid && engine.isBusy(sid)) {
2869
- /* oturum meşgul — WA/TG ile aynı: kaybetme, iş bitene dek yeniden dene */
2870
- await new Promise((r) => setTimeout(r, DC_DEBOUNCE_MS));
2871
- return processDcMessage(channelId, payload, 1);
2872
- }
2873
2860
  /* KANAL TEK OTURUMU: eskisi silinmedikçe hep aynı oturumdan devam */
2874
2861
  sid = ensureDcSession(channelId);
2875
2862
  /* Kişi bazlı granül izin: all/web/read/chat */
@@ -3115,6 +3102,34 @@ function reloadBackend() {
3115
3102
  })();
3116
3103
  }
3117
3104
  }
3105
+ /* OPENCODE STEER ARA CEVABI: koşan tur sırasında gelen mesajın cevabı.
3106
+ 'done' YOK (tur steer'le sürüyor) — bu yüzden done akışı YAZMAZ.
3107
+ Bağlı kanallara (WA/TG/DC) tek tek gider; SON cevap yine done'da. */
3108
+ if (ev.type === 'interim-final' && ev.message) {
3109
+ const txt = typeof ev.message.content === 'string' ? ev.message.content.trim() : '';
3110
+ if (txt) {
3111
+ (async () => {
3112
+ try {
3113
+ if (wa && wa.connected) {
3114
+ const jid = waReplyJid(ev.sessionId);
3115
+ if (jid) await sendWaSafe(jid, txt);
3116
+ }
3117
+ } catch {}
3118
+ try {
3119
+ if (tg && tg.connected) {
3120
+ const hit = [...tgChats.entries()].find(([, s]) => s === ev.sessionId);
3121
+ if (hit) await sendTgSafe(hit[0], txt);
3122
+ }
3123
+ } catch {}
3124
+ try {
3125
+ if (dc && dc.connected) {
3126
+ const hit = [...dcChats.entries()].find(([, s]) => s === ev.sessionId);
3127
+ if (hit) await sendDcSafe(hit[0], txt);
3128
+ }
3129
+ } catch {}
3130
+ })();
3131
+ }
3132
+ }
3118
3133
  // Telegram oturumlarının son cevabını geri gönder (WA ile aynı akış)
3119
3134
  if ((ev.type === 'done' || ev.type === 'error') && tg && tg.connected) {
3120
3135
  const hitT = [...tgChats.entries()].find(([, s]) => s === ev.sessionId);