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 +1 -1
- package/src/agent/engine.js +4 -0
- package/src/main.js +35 -20
package/package.json
CHANGED
package/src/agent/engine.js
CHANGED
|
@@ -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);
|