beast-agent 2.23.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "2.23.1",
4
+ "version": "2.24.0",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -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 = {};
@@ -2088,7 +2088,9 @@ body.browser-open #settingsDialog { width: min(70vw, calc(100vw - var(--bw, 480p
2088
2088
  #dmRail.dm-hidden { display: none; }
2089
2089
 
2090
2090
  #dmRailHead {
2091
- padding: 12px 12px 10px 16px;
2091
+ /* railHead ile BİREBİR AYNI: sağ 148px = pencere butonları (min/kapat)
2092
+ alanı — çöp ikonu asla pencere butonlarının altına girmez */
2093
+ padding: 12px 148px 10px 16px;
2092
2094
  font-weight: 800;
2093
2095
  letter-spacing: 1px;
2094
2096
  font-size: 13px;
@@ -2097,8 +2099,6 @@ body.browser-open #settingsDialog { width: min(70vw, calc(100vw - var(--bw, 480p
2097
2099
  align-items: center;
2098
2100
  gap: 8px;
2099
2101
  }
2100
- /* rail gizliyken DM sütunu sağ kenara yaslanır — pencere butonları alanı */
2101
- body.rail-hidden #dmRailHead { padding-right: 148px; }
2102
2102
  #dmRailTitle { flex: 1; text-align: left; }
2103
2103
  #dmClear {
2104
2104
  flex: none;