beast-agent 0.25.2 → 0.25.3

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 +66 -11
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "0.25.2",
4
+ "version": "0.25.3",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
package/src/main.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const { app, BrowserWindow, WebContentsView, ipcMain, shell, dialog, Tray, Menu, nativeImage, desktopCapturer, session } = require('electron');
3
+ const { app, BrowserWindow, WebContentsView, ipcMain, shell, dialog, Tray, Menu, nativeImage, desktopCapturer, session, net: electronNet } = require('electron');
4
4
  const path = require('path');
5
5
  const fs = require('fs');
6
6
  const http = require('http');
@@ -3743,13 +3743,21 @@ function flushDesktopOnDone(ev) {
3743
3743
  - Bağlantı geri gelince (DNS kontrolü) sırayla otomatik gönderilir
3744
3744
  - Renderer'a 'net' / 'netQueue' olayları gider: ⏳ kuyruk balonu + toast */
3745
3745
  const NET_CHECK_HOSTS = ['one.one.one.one', 'dns.google'];
3746
+ const NET_LOOKUP_HOSTS = ['www.google.com', 'www.microsoft.com'];
3747
+ const NET_HTTP_PROBES = [
3748
+ 'http://www.msftconnecttest.com/connecttest.txt',
3749
+ 'http://cp.cloudflare.com/generate_204',
3750
+ 'http://connectivitycheck.gstatic.com/generate_204',
3751
+ ];
3746
3752
  const NET_CHECK_MS = 8000;
3747
3753
  const NET_CHECK_TIMEOUT = 4000;
3754
+ const NET_OFFLINE_STRIKES = 2; // üst üste bu kadar başarısız turda offline ilan edilir
3748
3755
  const CHAT_QUEUE_MAX = 50; // kuyruk üst sınırı — taşarsa en eski düşer
3749
3756
 
3750
3757
  let netOnline = true; // son bilinen bağlantı durumu (başlangıçta iyimser)
3751
3758
  let netCheckedOnce = false;
3752
3759
  let netCheckBusy = false;
3760
+ let netFailStreak = 0;
3753
3761
  let chatQueueFlushing = false;
3754
3762
  const chatOfflineQueue = []; // { key, sessionId, text, attachments, at }
3755
3763
 
@@ -3833,8 +3841,42 @@ async function flushChatQueue() {
3833
3841
  }
3834
3842
  }
3835
3843
 
3836
- /* gerçek internet kontrolü: DNS çözümlemesi (sadece arayüzü değil,
3837
- paket gerçekten çıkıyor mu test eder). Adaylar sırayla denenir. */
3844
+ /* gerçek internet kontrolü TEK yöntem yanıltıcı olabilir:
3845
+ dns.resolve (c-ares) sistem çözümleyicisini atlar; mobil ağ/hotspot/VPN ve
3846
+ ISS DNS engellemelerinde (ör. 1.1.1.1, dns.google) internet VARken bile
3847
+ başarısız çıkar. Bu yüzden katmanlı deniyoruz; HERHANGİ bir katman başarılıysa
3848
+ internet VAR sayılır:
3849
+ 1) HTTP connectivity endpoint'leri (http modülü dns.lookup = OS çözümleyicisi
3850
+ kullanır — tarayıcı gibi; captive portal/proxy/mobil ağ hepsinde çalışır)
3851
+ 2) dns.lookup (Windows sistem çözümleyicisi — hosts dosyası/VPN/NRPT dahil)
3852
+ + dns.resolve (doğrudan DNS sunucusu)
3853
+ 3) OS'in kendi bağlantı durumu (Electron net.isOnline — Windows NCSI)
3854
+ Ayrıca tek başarısız tur offline ilan etmez (2 üst üste başarısız tur gerekir):
3855
+ geçici DNS gecikmesi mesajları gereksiz kuyruğa atmaz. */
3856
+ function httpProbe(url) {
3857
+ return new Promise((resolve) => {
3858
+ let done = false;
3859
+ const fin = (v) => { if (!done) { done = true; resolve(v); } };
3860
+ try {
3861
+ const req = http.get(url, { timeout: NET_CHECK_TIMEOUT }, (res) => {
3862
+ res.resume(); // gövdeyi tüket — soket serbest kalsın
3863
+ const ok = !!res.statusCode && res.statusCode < 500;
3864
+ try { res.destroy(); } catch {}
3865
+ fin(ok);
3866
+ });
3867
+ req.on('timeout', () => { try { req.destroy(); } catch {} fin(false); });
3868
+ req.on('error', () => fin(false));
3869
+ } catch { fin(false); }
3870
+ });
3871
+ }
3872
+
3873
+ function lookupProbe(host) {
3874
+ return new Promise((resolve) => {
3875
+ const t = setTimeout(() => resolve(false), NET_CHECK_TIMEOUT);
3876
+ dns.lookup(host, (err) => { clearTimeout(t); resolve(!err); });
3877
+ });
3878
+ }
3879
+
3838
3880
  function dnsProbe(host) {
3839
3881
  return new Promise((resolve) => {
3840
3882
  const t = setTimeout(() => resolve(false), NET_CHECK_TIMEOUT);
@@ -3849,24 +3891,37 @@ async function netCheck() {
3849
3891
  if (netCheckBusy) return;
3850
3892
  netCheckBusy = true;
3851
3893
  try {
3852
- let ok = false;
3853
- for (const h of NET_CHECK_HOSTS) {
3854
- if (await dnsProbe(h)) { ok = true; break; }
3894
+ let ok = (await Promise.all(NET_HTTP_PROBES.map(httpProbe))).some(Boolean);
3895
+ if (!ok) {
3896
+ const lookups = [
3897
+ ...NET_LOOKUP_HOSTS.map(lookupProbe),
3898
+ ...NET_CHECK_HOSTS.map(dnsProbe),
3899
+ ];
3900
+ ok = (await Promise.all(lookups)).some(Boolean);
3901
+ }
3902
+ if (!ok) {
3903
+ try { ok = electronNet.isOnline() === true; } catch {}
3855
3904
  }
3856
3905
  const first = !netCheckedOnce;
3857
3906
  const was = netOnline;
3858
- netOnline = ok;
3859
3907
  netCheckedOnce = true;
3860
- if (was !== ok || first) {
3908
+ if (ok) {
3909
+ netFailStreak = 0;
3910
+ netOnline = true;
3911
+ } else {
3912
+ netFailStreak++;
3913
+ if (!was || netFailStreak >= NET_OFFLINE_STRIKES) netOnline = false;
3914
+ }
3915
+ if (netOnline !== was || first) {
3861
3916
  try {
3862
- if (win && !win.isDestroyed()) win.webContents.send('agent:event', { type: 'net', online: ok });
3917
+ if (win && !win.isDestroyed()) win.webContents.send('agent:event', { type: 'net', online: netOnline });
3863
3918
  } catch {}
3864
- if (ok) {
3919
+ if (netOnline) {
3865
3920
  log.info('main', 'bağlantı geri geldi — offline kuyruk kontrol ediliyor');
3866
3921
  chatQueueEmit(); // renderer: pill/toast güncellensin
3867
3922
  flushChatQueue().catch(() => {});
3868
3923
  } else {
3869
- log.info('main', 'internet bağlantısı yok — mesajlar kuyruğa alınacak');
3924
+ log.info('main', `internet bağlantısı yok — mesajlar kuyruğa alınacak (streak=${netFailStreak})`);
3870
3925
  chatQueueEmit();
3871
3926
  }
3872
3927
  }