beast-agent 1.4.0 → 1.4.2

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": "1.4.0",
4
+ "version": "1.4.2",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
package/src/main.js CHANGED
@@ -316,36 +316,24 @@ function waRememberSession(jid, sid) {
316
316
  /beastagent → normal sohbet oturumuna geri dönülür. */
317
317
 
318
318
  function waBcWorkspace() {
319
- const dir = path.join(app.getPath('home'), 'BeastCode');
319
+ /* masaüstü Beast Code paneliyle AYNI klasör — WhatsApp'tan yazınca
320
+ panelde aynı dosyalar canlı görünür */
321
+ const dir = ideRoot();
320
322
  try { fs.mkdirSync(dir, { recursive: true }); } catch {}
321
323
  return dir;
322
324
  }
323
325
 
324
- /* Sohbetin Beast Code oturumu: varsa onu, yoksa yenisini */
326
+ /* Sohbetin Beast Code oturumu: masaüstü paneliyle AYNI oturum (klasör bazlı
327
+ bcGetSession) — WhatsApp'tan yazılan sohbet, masaüstü Beast Code panelinde
328
+ canlı akar; panelde yazılan da WhatsApp'a düşer */
325
329
  function waBcSession(jid) {
326
- const sid = waChats.get(jid);
327
- if (sid) {
328
- try {
329
- const s = engine.cache.get(sid);
330
- if (s && s.bcCode) return s;
331
- } catch {}
330
+ const s = bcGetSession(waBcWorkspace());
331
+ if (waChats.get(jid) !== s.id) {
332
+ waChats.set(jid, s.id);
333
+ waRememberSession(jid, s.id);
334
+ saveWaChats();
335
+ if (wa) wa.setWatchJids([...waChats.keys()]);
332
336
  }
333
- const s = engine._load(engine.createSession().id);
334
- s.messages = s.messages || [];
335
- s.bgTitle = 'Beast Code (WA)'; /* sohbet geçmişi listesinde etiketli görünür */
336
- s.bcCode = true; /* engine: BEAST CODE MODU bloğu + todo disiplini */
337
- s.workspace = waBcWorkspace();
338
- engine.cache.set(s.id, s);
339
- try {
340
- fs.appendFileSync(
341
- engine._file(s.id),
342
- JSON.stringify({ t: 'meta2', bgOf: '', title: 'Beast Code (WA)', at: new Date().toISOString() }) + '\n'
343
- );
344
- } catch {}
345
- waChats.set(jid, s.id);
346
- waRememberSession(jid, s.id);
347
- saveWaChats();
348
- if (wa) wa.setWatchJids([...waChats.keys()]);
349
337
  return s;
350
338
  }
351
339
 
@@ -701,8 +689,8 @@ function waSlashHelp() {
701
689
  '• */new* – yeni oturum aç (kod verilir)',
702
690
  '• */open* <kod> – o koddaki oturuma geç',
703
691
  '• */sessions* – bu sohbetin oturumları',
704
- '• */beastcode* [görev] – ⚡ UZAKTAN KODLAMA modu: WhatsApp\u2019tan uygulama yazdır (örn: /beastcode hava durumu uygulaması yaz)',
705
- '• */beastagent* – kodlama modundan normal sohbete dön',
692
+ '• */beastcode* [görev] – ⚡ UZAKTAN KODLAMA: masaüstünde Beast Code paneli açılır, WhatsApp\u2019tan uygulama yazdır (örn: /beastcode hava durumu uygulaması yaz)',
693
+ '• */beastagent* – kodlama modunu kapat, masaüstünde chat ekranına dön',
706
694
  '• */plan* · */build* · */auto* – BeastCode modunda çalışma modu (planla · uygula · otomatik)',
707
695
  '• */stop* – koşan işleri durdur (ajanlar+turlar; cron/izleyici/olay sürer)',
708
696
  '• */start* – durdurulan servisleri devam ettir',
@@ -1201,29 +1189,31 @@ async function tryWaSlash(jid, rawText, senderNum, payload0) {
1201
1189
  `*İzleyici:* ${watchers.list().length} adet\n*Cron:* ${jobs} aktif görev`;
1202
1190
  } else if (cmd === 'beastcode') {
1203
1191
  /* /beastcode [görev] — WhatsApp'tan UZAKTAN KODLAMA modu:
1204
- sohbet masaüstü Beast Code motoruna bağlanır (bcCode + workspace) */
1192
+ masaüstünde GERÇEK Beast Code paneli açılır (IDE ekranı), sohbet
1193
+ panel oturumuyla birleşir; yazılanlar panelde canlı akar */
1205
1194
  const s = waBcSession(jid);
1206
1195
  waBcMode.add(jid);
1207
1196
  saveWaChats();
1208
- emitWaEventSafe({ type: 'bc-mode', jid, on: true });
1197
+ emitWaEventSafe({ type: 'bc-screen', on: true, sessionId: s.id, workspace: s.workspace || waBcWorkspace() });
1209
1198
  if (arg) {
1210
1199
  /* görev normal WA akışına verilir — meşgulse bekleme-kuyruğu devrede */
1211
1200
  waQueuePush(jid, { text: arg, isGroup: !!(payload0 && payload0.isGroup) }, senderNum);
1212
1201
  out =
1213
- `*⚡ BEASTCODE MODU — görev alındı, yazıyorum.*\n` +
1214
- `Klasör: \`${s.workspace}\`\n` +
1202
+ `*⚡ BEASTCODE MODU AÇILDI — görev alındı, yazıyorum.*\n` +
1203
+ `Bilgisayarda Beast Code paneli açıldı: \`${s.workspace || waBcWorkspace()}\`\n` +
1215
1204
  `Mod değiştir: \`/plan\` (sadece plan) · \`/build\` (uygula) · \`/auto\`\n` +
1216
1205
  `Sohbete dönmek için: /beastagent`;
1217
1206
  } else {
1218
1207
  out =
1219
- `*⚡ BEASTCODE MODU AKTİF*\n` +
1220
- `Oturum: \`${s.code || '?'}\` · Klasör: \`${s.workspace}\`\n` +
1221
- `Artık ne yazarsan UYGULAMA olarak yaparım: dosyalar yazar, komut çalıştırır, doğrular.\n` +
1208
+ `*⚡ BEASTCODE MODU AÇILDI*\n` +
1209
+ `Bilgisayarda Beast Code paneli açıldı çalışma klasörü: \`${s.workspace || waBcWorkspace()}\`\n` +
1210
+ `Ne yazarsan UYGULAMA olarak yaparım: dosyalar yazar, komut çalıştırır, doğrular.\n` +
1222
1211
  `İlk görevi yaz — örn: "todo listesi uygulaması yaz"\n` +
1223
1212
  `Sohbete dönmek için: /beastagent`;
1224
1213
  }
1225
1214
  } else if (cmd === 'beastagent') {
1226
- /* /beastagent — kodlama modundan normal sohbete dön */
1215
+ /* /beastagent — kodlama modundan normal sohbete dön; masaüstünde
1216
+ Beast Code paneli kapanır, chat ekranı geri gelir */
1227
1217
  if (!waBcMode.has(jid)) {
1228
1218
  out = 'Zaten sohbet modundasın — kodlamak için /beastcode yaz.';
1229
1219
  } else {
@@ -1237,9 +1227,9 @@ async function tryWaSlash(jid, rawText, senderNum, payload0) {
1237
1227
  waRememberSession(jid, v.id);
1238
1228
  saveWaChats();
1239
1229
  if (wa) wa.setWatchJids([...waChats.keys()]);
1240
- emitWaEventSafe({ type: 'bc-mode', jid, on: false });
1230
+ emitWaEventSafe({ type: 'bc-screen', on: false });
1241
1231
  out =
1242
- `*💬 Sohbet moduna dönüldü* — yeni oturum \`${v.code}\`.\n` +
1232
+ `*💬 Sohbet moduna dönüldü* — masaüstünde chat ekranı açıldı, yeni oturum \`${v.code}\`.\n` +
1243
1233
  `Kodlar duruyor: \`${waBcWorkspace()}\`\n` +
1244
1234
  `Tekrar kodlamak için: /beastcode`;
1245
1235
  }
@@ -2019,6 +2009,29 @@ async function processWaMessage(jid, payload, senderNum, requeues = 0) {
2019
2009
  }
2020
2010
 
2021
2011
  if (payload.text) text += `\n${String(payload.text).slice(0, 6000)}`;
2012
+ /* BEASTCODE MODU: WA'dan gelen kullanıcı mesajını masaüstü panelde de göster.
2013
+ Ajan cevabı engine olaylarıyla zaten panele akar ama KULLANICI mesajı için
2014
+ engine olay üretmez (panel kendi input'undan "code>" satırı basar) — bu
2015
+ yüzden açıkça bildiriyoruz; yoksa WhatsApp'tan yazılanlar panelde görünmez. */
2016
+ if (waBcMode.has(jid) && win && !win.isDestroyed()) {
2017
+ const waEcho = [];
2018
+ if (payload.text) waEcho.push(String(payload.text).slice(0, 6000));
2019
+ if (attachments.length) {
2020
+ waEcho.push(
2021
+ '[' +
2022
+ attachments
2023
+ .map((a) => (a.type === 'image' ? 'resim' : 'dosya: ' + (a.name || '?')))
2024
+ .join(', ') +
2025
+ ']'
2026
+ );
2027
+ }
2028
+ win.webContents.send('agent:event', {
2029
+ sessionId: sid,
2030
+ type: 'wa-user',
2031
+ from: isGroup ? (groupSender || 'grup üyesi') : (hit && hit.name) || '+' + (senderNum || '?'),
2032
+ text: waEcho.join('\n'),
2033
+ });
2034
+ }
2022
2035
  engine.send(sid, { text: text.slice(0, 8000), attachments });
2023
2036
  }
2024
2037
 
@@ -1844,6 +1844,23 @@ function onWaEvent(ev) {
1844
1844
  if (!els.settingsOverlay.hidden && setTab === 'integrations') renderIntegrationsPane();
1845
1845
  return;
1846
1846
  }
1847
+ if (ev.type === 'bc-screen') {
1848
+ /* WA'dan /beastcode → masaüstünde GERÇEK Beast Code paneli açılır;
1849
+ /beastagent → chat ekranına dönülür. Panel, WA oturumuna bağlanır:
1850
+ WhatsApp'tan yazılan sohbet canlı olarak panelde akar. */
1851
+ setIdeMode(!!ev.on);
1852
+ if (ev.on) {
1853
+ if (ev.sessionId) bcSessionId = ev.sessionId;
1854
+ bcSetBusy(false);
1855
+ if (ev.workspace) bcLine('t-sys', '[WhatsApp — Beast Code modu açıldı · ' + ev.workspace + ']');
1856
+ else bcLine('t-sys', '[WhatsApp — Beast Code modu açıldı]');
1857
+ } else {
1858
+ if (bcSessionId) bcSessionId = null;
1859
+ bcSetBusy(false);
1860
+ bcStatusHide();
1861
+ }
1862
+ return;
1863
+ }
1847
1864
  if (ev.type === 'queue') {
1848
1865
  /* FEATURE 2: offline kuyruk bildirimi — toast + paneldeki sayaç */
1849
1866
  if (ev.text) toast(ev.text);
@@ -6817,6 +6834,13 @@ function bcNoteStream(delta) {
6817
6834
  /* Beast Code oturumunun engine olayları → panel çıktısı */
6818
6835
  function bcIngest(ev) {
6819
6836
  switch (ev.type) {
6837
+ case 'wa-user':
6838
+ /* WhatsApp'tan gelen kullanıcı mesajı panelde görünür — ajan cevabı
6839
+ zaten akar; bu olay kullanıcının KENDİ yazdığını gösterir */
6840
+ bcFlushStream();
6841
+ bcCloseToolGroup();
6842
+ bcLine('t-cmd', '📱 ' + (ev.from || 'WhatsApp') + '» ' + (ev.text || ''));
6843
+ break;
6820
6844
  case 'token':
6821
6845
  /* grup açıksa ara not (kutu içi); değilse normal akış */
6822
6846
  if (bcNoteStream(ev.delta)) break;