beast-agent 2.10.0 → 2.11.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/main.js +95 -2
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "2.10.0",
4
+ "version": "2.11.0",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
package/src/main.js CHANGED
@@ -75,6 +75,73 @@ function emitUpdateEvent() {
75
75
  } catch {}
76
76
  }
77
77
 
78
+ /* /version ORTAK METNİ — tüm kanallar (desktop/WA/TG/DC): güncel sürüm +
79
+ npm'deki en son sürüm (yeni varsa vurgulu; 10dk cache'li getNpmLatest). */
80
+ async function versionText(waStyle) {
81
+ const cur = beastVersion();
82
+ const latest = await getNpmLatest();
83
+ const b = waStyle ? '*' : '**';
84
+ if (latest && isNewerVersion(latest, cur)) {
85
+ return (
86
+ `${b}Beast Agent v${cur}${b} — ${b}yeni sürüm var: v${latest}${b}\n` +
87
+ `Güncelleme: ${b}/update${b} (kontrol) · ${b}/update now${b} (hemen kur)`
88
+ );
89
+ }
90
+ if (latest) {
91
+ return `${b}Beast Agent v${cur}${b} — güncel ✓\nGüncelleme kontrolü: ${b}/update${b} · hemen kur: ${b}/update now${b}`;
92
+ }
93
+ return `${b}Beast Agent v${cur}${b}\nGüncelleme: ${b}/update${b} (yeni sürüm kontrolü) · ${b}/update now${b} (hemen kur)`;
94
+ }
95
+
96
+ /* SÜRÜM GÜNCELLEMESİ BİLGİSİ: sürüm değiştiyse İLK AÇILIŞTA kullanıcı'nın
97
+ olduğu yere kısa bilgi düşer — en güncel oturum (desktop) + o oturuma
98
+ BĞLI kanal (WA/TG/DC; hangisindeyse oraya). settings.lastRunVersion
99
+ yazıldığı için sürüm başına YALNIZ BİR KEZ çalışır. */
100
+ function notifyVersionUpdate() {
101
+ const cur = beastVersion();
102
+ const prev = String(settings.lastRunVersion || '');
103
+ settings.lastRunVersion = cur;
104
+ saveSettings();
105
+ if (!prev || prev === cur) return; /* ilk kurulum ya da sürüm değişmedi */
106
+ const waStyleTxt =
107
+ `🔄 *Beast Agent güncellendi:* v${prev} → *v${cur}*\n` +
108
+ `Yenilikler: GitHub Releases · Sürüm: /version · Güncelleme: /update`;
109
+ let sid = '';
110
+ try { sid = reuseOrLatestSession(''); } catch {}
111
+ /* desktop: en güncel oturuma bilgi balonu */
112
+ try {
113
+ if (win && !win.isDestroyed() && sid) {
114
+ const mdTxt = waStyleTxt.replace(/\*/g, '**');
115
+ win.webContents.send('agent:event', { sessionId: sid, type: 'message', message: { role: 'assistant', content: mdTxt } });
116
+ win.webContents.send('agent:event', { sessionId: sid, type: 'done', usage: null });
117
+ }
118
+ } catch {}
119
+ /* kanallar: SADECE bu oturuma bağlı kanal (kullanıcı oradaydı) */
120
+ (async () => {
121
+ try {
122
+ if (wa && wa.connected) {
123
+ const own = waOwnerNum();
124
+ const jid = own ? own + '@s.whatsapp.net' : '';
125
+ if (jid && [...waChats.entries()].some(([j, s]) => j === jid && String(s) === String(sid))) {
126
+ await sendWaSafe(jid, waStyleTxt);
127
+ }
128
+ }
129
+ } catch {}
130
+ try {
131
+ if (tg && tg.connected) {
132
+ const hit = [...tgChats.entries()].find(([, s]) => String(s) === String(sid));
133
+ if (hit) await sendTgSafe(hit[0], waStyleTxt);
134
+ }
135
+ } catch {}
136
+ try {
137
+ if (dc && dc.connected) {
138
+ const hit = [...dcChats.entries()].find(([, s]) => String(s) === String(sid));
139
+ if (hit) await sendDcSafe(hit[0], waStyleTxt);
140
+ }
141
+ } catch {}
142
+ })();
143
+ }
144
+
78
145
  function replyUpdate(text) {
79
146
  try {
80
147
  for (const sid of updateReplies.sids) desktopEcho(sid, '/update', text);
@@ -1623,7 +1690,8 @@ async function tryWaSlash(jid, rawText, senderNum, payload0) {
1623
1690
  out = 'Bu komut yalnız BeastCode modunda çalışır — önce /beastcode yaz.';
1624
1691
  }
1625
1692
  } else if (cmd === 'version') {
1626
- out = `*Beast Agent v${beastVersion()}*\nGüncelleme için: /update (kurulum hazır olunca /update now)`;
1693
+ /* npm'deki en son sürümü de göster */
1694
+ out = await versionText(true);
1627
1695
  } else {
1628
1696
  out = `Bilinmeyen komut: /${cmd}\nListe için /help yaz.`;
1629
1697
  }
@@ -2643,6 +2711,14 @@ async function processTgMessage(chatId, payload, requeues = 0) {
2643
2711
  tgLog(`skip flush: izinli eşleşme yok (sender=${payload.senderId || '?'})`);
2644
2712
  return;
2645
2713
  }
2714
+ /* /version HER KANALDA: sürüm + npm'deki en son sürüm (izin kontrolü üstte) */
2715
+ const tgRaw = String((payload && payload.text) || '').trim();
2716
+ if (tgRaw === '/version' || tgRaw.startsWith('/version ')) {
2717
+ versionText(true)
2718
+ .then((txt) => sendTgSafe(chatId, txt))
2719
+ .catch(() => {});
2720
+ return;
2721
+ }
2646
2722
  /* OPENCODE STEER: meşgulse bekleme — engine.send tampona ekler, koşan tur
2647
2723
  sonraki istekte görür (WA ile aynı mantık) */
2648
2724
  let sid = tgChats.get(chatId) || tgSingleSid;
@@ -2854,6 +2930,14 @@ async function processDcMessage(channelId, payload) {
2854
2930
  dcLog(`skip flush: izinli eşleşme yok (sender=${payload.senderId || '?'})`);
2855
2931
  return;
2856
2932
  }
2933
+ /* /version HER KANALDA: sürüm + npm'deki en son sürüm (izin kontrolü üstte) */
2934
+ const dcRaw = String((payload && payload.text) || '').trim();
2935
+ if (dcRaw === '/version' || dcRaw.startsWith('/version ')) {
2936
+ versionText(true)
2937
+ .then((txt) => sendDcSafe(channelId, txt))
2938
+ .catch(() => {});
2939
+ return;
2940
+ }
2857
2941
  /* OPENCODE STEER: meşgulse bekleme — engine.send tampona ekler, koşan tur
2858
2942
  sonraki istekte görür (WA/TG ile aynı mantık) */
2859
2943
  let sid = dcChats.get(channelId) || dcSingleSid;
@@ -3413,6 +3497,12 @@ app.whenReady().then(() => {
3413
3497
  ensureDc().start().catch((e) => dcLog('autostart failed: ' + String((e && e.message) || e)));
3414
3498
  }
3415
3499
 
3500
+ /* SÜRÜM GÜNCELLENDİYSE ilk açılışta bilgi: kanalların bağlanmasına 5 sn tanı,
3501
+ sonra kullanıcının olduğu yere (en güncel oturum + bağlı kanal) düşer */
3502
+ setTimeout(() => {
3503
+ try { notifyVersionUpdate(); } catch {}
3504
+ }, 5000);
3505
+
3416
3506
  app.on('activate', () => {
3417
3507
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
3418
3508
  });
@@ -4808,7 +4898,10 @@ ipcMain.handle('agent:send', (_e, { sessionId, text }) => {
4808
4898
  return true;
4809
4899
  }
4810
4900
  if (t === '/version') {
4811
- desktopEcho(sessionId, t, `**Beast Agent v${beastVersion()}**\nGüncelleme: **/update** (yeni sürüm kontrolü) · **/update now** (hemen kur)`);
4901
+ /* npm registry'den en son sürümü de göster (10dk cache'li) */
4902
+ versionText(false)
4903
+ .then((txt) => desktopEcho(sessionId, t, txt))
4904
+ .catch(() => desktopEcho(sessionId, t, `**Beast Agent v${beastVersion()}**`));
4812
4905
  return true;
4813
4906
  }
4814
4907
  if (t === '/help') {