beast-agent 2.23.2 → 2.24.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 +113 -0
package/package.json
CHANGED
package/src/agent/engine.js
CHANGED
|
@@ -2934,6 +2934,8 @@ class Engine {
|
|
|
2934
2934
|
this._bgMeta = this._bgMeta || new Map();
|
|
2935
2935
|
this._bgMeta.set(bg.id, { parentId: parent, title: ttl });
|
|
2936
2936
|
this._bgEmit();
|
|
2937
|
+
/* EKİP GRUBU: aynı görevde koşan paralel ajanlar otomatik ortak DM grubuna girer */
|
|
2938
|
+
try { this._agentTeamJoin(this._bgJobs.get(bg.id)); } catch {}
|
|
2937
2939
|
setTimeout(() => this._bgAdmit(bg.id, t), 60);
|
|
2938
2940
|
return { ok: true, backgroundId: bg.id, code: bg.code };
|
|
2939
2941
|
}
|
|
@@ -3208,6 +3210,12 @@ class Engine {
|
|
|
3208
3210
|
}
|
|
3209
3211
|
/* #17 öz-kurtarma hakları tükendi → owner'a anlık altyapı uyarısı */
|
|
3210
3212
|
this._notifyOwnerTaskFailed(job, msg);
|
|
3213
|
+
/* EKİP GRUBU: kapanış postu — ekibe hata bildirilir */
|
|
3214
|
+
if (job.teamGid) {
|
|
3215
|
+
try {
|
|
3216
|
+
this._agentTeamPost(job.teamGid, sid, job.title, '[EKİP] ' + job.title + ' HATA ile bitti: ' + String(msg || '').slice(0, 150));
|
|
3217
|
+
} catch {}
|
|
3218
|
+
}
|
|
3211
3219
|
/* AJAN DM: işi kesin bitti — ajanın DM/grup sohbetleri kapanır */
|
|
3212
3220
|
try { this._agentDmClose(sid); } catch {}
|
|
3213
3221
|
if (grouped) {
|
|
@@ -3233,9 +3241,21 @@ class Engine {
|
|
|
3233
3241
|
this._pendingReports.push({ parentId: job.parentId, text });
|
|
3234
3242
|
this.flushPendingReports(job.parentId);
|
|
3235
3243
|
}
|
|
3244
|
+
/* EKİP GRUBU: kapanış postu — iptal ekipçe bilinir */
|
|
3245
|
+
if (job.teamGid) {
|
|
3246
|
+
try {
|
|
3247
|
+
this._agentTeamPost(job.teamGid, sid, job.title, '[EKİP] ' + job.title + ' İPTAL edildi — sebep: ' + String(why || '').slice(0, 120));
|
|
3248
|
+
} catch {}
|
|
3249
|
+
}
|
|
3236
3250
|
/* AJAN DM: işi bitti (kullanıcı iptali dahil) — sohbetler kapanır */
|
|
3237
3251
|
try { this._agentDmClose(sid); } catch {}
|
|
3238
3252
|
} else if (status === 'done') {
|
|
3253
|
+
/* EKİP GRUBU: kapanış postu */
|
|
3254
|
+
if (job.teamGid) {
|
|
3255
|
+
try {
|
|
3256
|
+
this._agentTeamPost(job.teamGid, sid, job.title, '[EKİP] ' + job.title + ' görevini TAMAMLADI.');
|
|
3257
|
+
} catch {}
|
|
3258
|
+
}
|
|
3239
3259
|
/* AJAN DM: görev tamamlandı — ajanın DM/grup sohbetleri kapanır */
|
|
3240
3260
|
try { this._agentDmClose(sid); } catch {}
|
|
3241
3261
|
}
|
|
@@ -3499,6 +3519,7 @@ class Engine {
|
|
|
3499
3519
|
`- PDF gerekirse pip\u2019ten paket kurma (Türkçe bozar); Node\u2019un kurulu \`pdf-lib\`+fontkit\u2019iyle .js script yazıp \`node\` ile çalıştır. md→pdf çevirme: belge çıktısını doğrudan PDF olarak üret.\n` +
|
|
3500
3520
|
`- ARAŞTIRMA SINIRI: 3-5 kaynak yeter; süre hedefi ~3 dakika. 2-3 denemede bulunamayan bilgiyi BIRAK — bulabildiğin kısmi sonucu raporla ve neyi bulamadığını yaz. Kapalı/gizli içerik peşinde koşma.\n` +
|
|
3501
3521
|
`AJAN KOORDİNASYONU: diğer koşan ajanlarla (paralel işler, finance ajanları) konuşman gerekiyorsa agent_dm aracını kullan — to: hedefin başlığındaki anahtar kelime (örn "GOLD", "Trader"), message: 1-3 cümlelik net mesaj. Senden istenen görevde başka bir ajanın zaten yaptığın işe ihtiyacı varsa DM ile haber ver. Birden fazla ajanla ORTAK KARAR almanız gerekiyorsa group: "İSİM" vererek grup sohbeti kur — mesajın tüm üyelere düşer, cevaplar aynı gruba gelir. Görevin bitince DM/grup sohbetleri otomatik KAPANIR (geçmiş panelde kalır).\n` +
|
|
3522
|
+
(job.teamGid ? this._agentTeamPromptLine(job.teamGid) : '') +
|
|
3502
3523
|
FORMAT_RULES + '\n' +
|
|
3503
3524
|
`SON ÇIKTI: 3-5 satırlık net sonuç raporu, madde madde. Soru sorma, sohbet etme.`
|
|
3504
3525
|
);
|
|
@@ -6375,6 +6396,98 @@ Engine.prototype._pushAgentDm = function (dm) {
|
|
|
6375
6396
|
if (this._agentDms.length > 600) this._agentDms.splice(0, this._agentDms.length - 600);
|
|
6376
6397
|
};
|
|
6377
6398
|
|
|
6399
|
+
/* ---------- EKİP GRUBU: aynı görevde koşan paralel ajanlar otomatik
|
|
6400
|
+
ortak DM grubuna girer — tartışma ZORUNLU (sistem promptuyla). ---------- */
|
|
6401
|
+
|
|
6402
|
+
/* İş başlarken çağrılır: aynı parent / bg-gruptan başka ajan varsa (varsa
|
|
6403
|
+
önceden kurulmuştur) hepsini TEK ekip grubuna katar + katılım postu düşer. */
|
|
6404
|
+
Engine.prototype._agentTeamJoin = function (job) {
|
|
6405
|
+
try {
|
|
6406
|
+
if (!job || !job.id) return;
|
|
6407
|
+
const parent = String(job.parentId || '');
|
|
6408
|
+
if (!parent) return;
|
|
6409
|
+
const gid = 'team:' + (job.groupId || parent);
|
|
6410
|
+
const base =
|
|
6411
|
+
String(job.task || job.title || 'ortak görev').replace(/\s+/g, ' ').trim().slice(0, 28) || 'ortak görev';
|
|
6412
|
+
let g = this._agentGroups.get(gid);
|
|
6413
|
+
if (!g) {
|
|
6414
|
+
g = { id: gid, title: base + ' EKİP', members: [], titles: {}, createdAt: nowIso(), closed: false, team: true };
|
|
6415
|
+
this._agentGroups.set(gid, g);
|
|
6416
|
+
}
|
|
6417
|
+
g.closed = false;
|
|
6418
|
+
delete g.closedAt;
|
|
6419
|
+
g.titles = g.titles || {};
|
|
6420
|
+
const add = (id, title) => {
|
|
6421
|
+
id = String(id);
|
|
6422
|
+
if (!g.members.includes(id)) g.members.push(id);
|
|
6423
|
+
if (title) g.titles[id] = String(title);
|
|
6424
|
+
};
|
|
6425
|
+
/* aynı ortak görevdeki DİĞER ajanlar (aborted olanlar hariç) */
|
|
6426
|
+
const mates = [...this._bgJobs.values()].filter(
|
|
6427
|
+
(j) => j && String(j.id) !== String(job.id) && String(j.parentId) === parent && j.status !== 'aborted'
|
|
6428
|
+
);
|
|
6429
|
+
add(job.id, job.title);
|
|
6430
|
+
for (const m of mates) add(m.id, m.title);
|
|
6431
|
+
job.teamGid = gid;
|
|
6432
|
+
for (const m of mates) m.teamGid = gid;
|
|
6433
|
+
this._persistAgentDms();
|
|
6434
|
+
this._bgEmit();
|
|
6435
|
+
/* katılım postu: gruptaki DİĞER koşan ajanlara bildirim olarak düşer */
|
|
6436
|
+
const names = mates.map((m) => m.title).filter(Boolean);
|
|
6437
|
+
this._agentTeamPost(
|
|
6438
|
+
gid,
|
|
6439
|
+
job.id,
|
|
6440
|
+
job.title,
|
|
6441
|
+
names.length
|
|
6442
|
+
? '[EKİP] ' + job.title + ' ortak göreve katıldı — ekip: ' + names.join(', ') + '. Planı ve kararları grupta paylaş.'
|
|
6443
|
+
: '[EKİP] ' + job.title + ' göreve başladı.'
|
|
6444
|
+
);
|
|
6445
|
+
} catch {}
|
|
6446
|
+
};
|
|
6447
|
+
|
|
6448
|
+
/* Ekip grubuna sistem postu: panelde görünür + koşan üye ajanlara bildirim */
|
|
6449
|
+
Engine.prototype._agentTeamPost = function (gid, fromSid, fromTitle, text) {
|
|
6450
|
+
try {
|
|
6451
|
+
const g = this._agentGroups.get(String(gid));
|
|
6452
|
+
if (!g) return;
|
|
6453
|
+
const dm = {
|
|
6454
|
+
at: nowIso(),
|
|
6455
|
+
from: String(fromSid || ''),
|
|
6456
|
+
fromTitle: String(fromTitle || 'EKİP'),
|
|
6457
|
+
to: '',
|
|
6458
|
+
toTitle: 'ekip',
|
|
6459
|
+
group: gid,
|
|
6460
|
+
groupTitle: g.title,
|
|
6461
|
+
topic: 'ortak görev',
|
|
6462
|
+
text: String(text || '').slice(0, 600),
|
|
6463
|
+
system: true,
|
|
6464
|
+
};
|
|
6465
|
+
this._pushAgentDm(dm);
|
|
6466
|
+
/* Sistem postları YALNIZ panelde görünür — modele pendingReports ile
|
|
6467
|
+
enjekte EDİLMEZ (mid-task müdahale + kuyruk/konkürans bozulmasın).
|
|
6468
|
+
Üyeler ekibi her turda sistem promptundaki ZORUNLU satırdan bilir;
|
|
6469
|
+
gerçek ajan mesajları (agent_dm) normal teslim akışıyla düşer. */
|
|
6470
|
+
for (const m of g.members || []) {
|
|
6471
|
+
if (m === String(fromSid)) continue;
|
|
6472
|
+
const j = this._bgJobs && this._bgJobs.get(m);
|
|
6473
|
+
if (!j || j.status !== 'running') continue;
|
|
6474
|
+
emitSafe(this, m, { type: 'agent-dm', ...dm });
|
|
6475
|
+
}
|
|
6476
|
+
this._persistAgentDms();
|
|
6477
|
+
} catch {}
|
|
6478
|
+
};
|
|
6479
|
+
|
|
6480
|
+
/* Sistem promptuna ekip zorunluluğu */
|
|
6481
|
+
Engine.prototype._agentTeamPromptLine = function (gid) {
|
|
6482
|
+
const g = this._agentGroups && this._agentGroups.get(String(gid));
|
|
6483
|
+
if (!g) return '';
|
|
6484
|
+
return (
|
|
6485
|
+
`EKİP GRUBU (ZORUNLU): bu ortak görevde birlikte çalışan ajanlarla "${g.title}" DM grubundasın — ` +
|
|
6486
|
+
`her önemli bulgu/karar/durum değişiminde agent_dm aracıyla GRUBA yaz (group: "${g.title}", topic: "ortak görev"); ` +
|
|
6487
|
+
`işin SONUNDA 1-2 cümlelik kapanış raporunu da gruba bırak. Gruba düşen mesajlar sana da gelir — ekiple çelişen hareket etme.\n`
|
|
6488
|
+
);
|
|
6489
|
+
};
|
|
6490
|
+
|
|
6378
6491
|
Engine.prototype._persistAgentDms = function () {
|
|
6379
6492
|
try {
|
|
6380
6493
|
const groups = {};
|