beast-agent 0.28.0 → 0.30.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.
@@ -61,43 +61,101 @@ function scan() {
61
61
  const SEEDS = [
62
62
  {
63
63
  folder: 'help',
64
+ force: true,
64
65
  body: `---
65
66
  name: help
66
- description: Beast Agent genel yardım — tüm veri yolları (%APPDATA%\\beast), ayar/config dosyaları, memory, cron, watcher, WhatsApp, TTS, araç özeti.
67
- version: 1.0.0
67
+ description: Beast Agent'ın İÇ HARİTASI"kaç bot var", "oturumlar nerede", "x nasıl çalışır" gibi SİSTEM sorularını saniyeler içinde çözer: tüm veri yolları, hazır PowerShell/json one-liner'lar, kod haritası, slash komutları, ayar sekmeleri. Kod tabanını saatlerce taramadan bu haritadan oku.
68
+ version: 2.0.0
68
69
  ---
69
70
 
70
- # Beast Agent Yardım
71
+ # Beast Agent İç Haritası (self-help)
72
+
73
+ ## ALTIN KURAL
74
+ Sistem sorusu geldiğinde KOD TABANINI TARAMA. Aşağıdaki hazır yolu/one-liner'ı kullan — cevap 1-2 saniyede çıkar.
75
+
76
+ ## HIZLI CEVAPLAR (hazır komutlar)
77
+
78
+ **"Kaç bot var / botları listele"**
79
+ \`\`\`powershell
80
+ $b = Get-Content "$env:APPDATA\\beast\\bots.json" | ConvertFrom-Json; $b.bots | Select-Object id,name,admin,code
81
+ "Toplam bot: " + $b.bots.Count + " (admin: Beast)"
82
+ \`\`\`
83
+ (python_run ile: \`import json;d=json.load(open(r'%APPDATA%\\beast\\bots.json',encoding='utf-8'));print(len(d['bots']),[b['name'] for b in d['bots']])\`)
84
+
85
+ **"Kaç oturum var / sohbet geçmişi"**
86
+ \`\`\`powershell
87
+ (Get-ChildItem "$env:APPDATA\\beast\\sessions\\*.jsonl").Count
88
+ \`\`\`
89
+ Kod ↔ dosya eşleşmesi: jsonl'nin ilk satırı \`{"t":"meta","code":"ABC12"}\` taşır.
90
+
91
+ **"Paralel ajanlar ne durumda"** → \`tasks_list\` aracını ÇAĞIR (kod okumaya gerek yok) ya da:
92
+ \`\`\`powershell
93
+ Get-Content "$env:APPDATA\\beast\\sessions\\bg-jobs.json" | ConvertFrom-Json | % jobs | Select title,status,startedAt,error
94
+ \`\`\`
95
+
96
+ **"Maliyet/usage"** → \`/usage\` komutu ya da Ayarlar → Maliyet; kayıt dosyası \`usage.json\`.
71
97
 
72
- Tüm veri tek kökte: \`%APPDATA%\\beast\\\` (test/taşınabilir için \`BEAST_DATA\` env override).
98
+ **"Cron/izleyici var mı"** \`cron.json\`, \`watchers.json\`.
73
99
 
74
- ## Dosya Haritası
100
+ ## DOSYA HARİTASI (%APPDATA%\\beast\\)
75
101
 
76
102
  | Yol | Ne İşe Yarar |
77
103
  |---|---|
78
- | \`config.yaml\` + \`.env\` | Model sağlayıcıları + API anahtarları. Provider tanımı: \`providers.<id>.base_url/key_env/models\`; aktif seçim: \`model.provider/default\`. \`.env\`'de \`<PROVIDER>_API_KEY\` veya \`key_env\` ile eşleşen anahtar |
79
- | \`settings.json\` | App ayarları: theme, workspace, modelOverride, customProviders, roleModels, deletedModels, fallout, waTts (TTS), email (mail credential), waAllow, waLockdown |
80
- | \`sessions\\\` | Sohbet oturumları (mesaj JSON'ları) |
81
- | \`memories\\\` | SOUL.md (kişilik), MEMORY.md (uzun hafıza kayıtları), USER.md (kullanıcı bilgisi) |
82
- | \`skills\\\` | \`**\\\\SKILL.md\` isim+açıklama system prompt'a gider, gövde okunur |
83
- | \`cron.json\` | Zamanlanmış görevler (5 alanlı cron) |
84
- | \`watchers.json\` | Web/batarya izleyicileri |
85
- | \`wa-auth\\\` | WhatsApp Baileys eşleme auth'u SİLME |
86
- | \`wa-chats.json\`, \`wa.log\` | WA sohbet eşlemesi ve log |
87
- | \`bots.json\`, \`bots/<id>/\`, \`whitelist.json\` | Bot sistemi: bot kaydı (max 5, \`beast\` admin silinemez), her botun izole klasörü (config.json, memory.md, yetkiler.json, logs/), numara→bot eşlemesi. Bağlı olmayan numara beast'e düşer |
88
- | \`logs\\\`, \`scripts\\\` | Çalışma logları / kullanıcı scriptleri |
89
-
90
- ## Sağlık Kontrolleri
91
-
92
- - "Model yapılandırılmadı" hatası → \`config.yaml\`/\`.env\` dolu mu bak; yoksa kullanıcıdan Ayarlar → Provider'dan model seçmesini ya da dosyaları doldurmasını iste (\`config.example.yaml\` repo kökünde örnek var).
93
- - Mail sorunları → \`email\` skill'ini oku.
94
- - fallout zinciri → Ayarlar → Fallout; 401'de sıradaki slota otomatik düşer.
95
-
96
- ## Davranış Kuralları
97
-
104
+ | \`config.yaml\` + \`.env\` | Model sağlayıcıları + API anahtarları (\`providers.<id>.base_url/key_env/models\`, aktif: \`model.provider/default\`) |
105
+ | \`settings.json\` | App ayarları: theme, workspace, modelOverride, customProviders, roleModels, deletedModels, fallout, waTts, email, waAllow, **searchChain (web arama sırası)**, **obscuraEnabled**, activeBotId |
106
+ | \`sessions\\*.jsonl\` | Sohbet oturumları (satır JSON: t:meta kod, t:meta2 paralel-ajan işareti, t:msg mesaj, t:todo, t:notes) |
107
+ | \`sessions\\bg-jobs.json\` | Paralel ajan iş kayıtları: id, title, status(queued/running/done/error/aborted), error=İPTAL SEBEBİ, groupId |
108
+ | \`memories\\\` | SOUL.md (kişilik), MEMORY.md (uzun hafıza), USER.md (kullanıcı) |
109
+ | \`skills\\<ad>\\SKILL.md\` | Skill'ler (isim+açıklama prompt'a girer, gövde okunur) |
110
+ | \`bots.json\` | Bot kayıt defteri — max 5 bot, ilk kayıt admin 'Beast' (silinemez). Bot adı HARFLE başlamak ZORUNDA |
111
+ | \`bots/<id>/\` | Botun izole klasörü: config.json, memory.md, yetkiler.json, logs/ |
112
+ | \`whitelist.json\`, \`wa-auth\\\`, \`wa-chats.json\`, \`wa.log\` | WhatsApp izin listesi, Baileys auth (SİLME), sohbet eşlemesi, log |
113
+ | \`cron.json\`, \`watchers.json\`, \`bus.json\` | Zamanlanmış görevler, web/batarya izleyicileri, olay abonelikleri |
114
+ | \`scripts\\\` | Python scriptleri (websearch.py, news.py) |
115
+ | \`obscura\\obscura.exe\` | Obscura stealth tarayıcı (web arama zincirinin 2. motoru; açılışta otomatik kurulur) |
116
+ | \`py\\python.exe\` | Gömülü Python runtime (makinede Python olmasa bile python_run çalışır) |
117
+ | \`usage.json\`, \`logs\\\` | Kullanım sayaçları, çalışma logları |
118
+ | Masaüstü\\Beast-Backups | Şifreli yedekler (.beastbak) /backup ile alınır |
119
+
120
+ ## KOD HARİTASI (src/)
121
+
122
+ | Dosya | Sorumluluk |
123
+ |---|---|
124
+ | \`main.js\` | Electron ana süreç: tüm IPC, WhatsApp/Telegram/Discord entegrasyonları, onay kapısı (/approve), /stop /restart, splash, gizli araştırma tarayıcısı, obscura kurulumu |
125
+ | \`agent/engine.js\` | OTURUM MOTORU: send/_run tur döngüsü, paralel ajanlar (run_background, run_background_many, tasks_list, task_status, task_cancel — task_cancel reason ZORUNLU), superyorizon (takılan işi zorla kapatır), iptal sebep disiplini, flushPendingReports |
126
+ | \`agent/tools.js\` | Araçlar + web_search SIRALI ZİNCİRİ (searchChain: 1 dahili tarayıcı(Google) → 2 Obscura(stealth→DuckDuckGo) → 3 TinyFish(anahtarsa) → 4 python çoklu-motor; sıra Ayarlar→Web Arama'dan değişir), run_command, read/write_file, python_run, http_fetch, deep_search |
127
+ | \`agent/llm.js\` | Sağlayıcı çağrısı + retry: ağ kopmasında 6 deneme + internet dönene kadar bekler; akış ortası kopmada kaldığı yerden devam |
128
+ | \`agent/obscura.js\` | Obscura: otomatik kurulum (GitHub releases, stealth zip) + DuckDuckGo html/lite arama ayrıştırıcı |
129
+ | \`agent/bots.js\` | Bot CRUD, 5 haneli bot kodu, izolasyon; ad-ilk-harf doğrulaması |
130
+ | \`agent/skills.js\` | Builtin tohumlar (help, email, python-web-search, pdf, gold-trading) + SKILL.md taraması + taslaklar |
131
+ | \`agent/memory.js\`, \`agent/kb.js\` | Kalıcı hafıza + bilgi bankası |
132
+ | \`cron.js\` (src kökü), \`agent/watchers.js\`, \`agent/bus.js\` | Cron, izleyici, olay merkezi — /stop bunlara DOKUNMAZ |
133
+ | \`agent/usage.js\` | Token/maliyet sayaçları |
134
+ | \`renderer/\` | Arayüz: renderer.js (tüm paneller), i18n.js (TR/EN), index.html, style.css |
135
+ | \`bin/beast-agent.js\` | CLI: \`beast\` (başlat), \`beast update\`, \`beast uninstall\` |
136
+
137
+ ## SLASH KOMUTLARI
138
+ /help · /version · /new · /open <kod> · /sessions · /stop · /start · /restart · /change [n] · /model <isim> · /think 0-5 · /clear · /notes · /rule <metin> · /rules · /notify on|off · /screenshot · /approve [always] · /deny · /update [now] · /usage · /backup · /status · /skills
139
+
140
+ ## AYAR SEKMELERİ
141
+ Provider · Fallout · Skills · Paralel Ajanlar · TTS · E-posta · Entegrasyonlar · Web Arama (Obscura kurulum + arama sırası) · Olaylar · Cron · Maliyet · Loglar · Panel · Limitler · Güvenlik · Güncelleme
142
+
143
+ ## PARALEL AJAN HIZLI BİLGİ
144
+ - CEO modu: konuşan ajan iş YAPMAZ, run_background/run_background_many ile devreder; görev tanımı kendine yeterli olmalı (ajan CEO bağlamını GÖREMEZ).
145
+ - İş bitince birleşik/bireysel rapor OTOMATİK üst sohbete düşer — takılı iş superyorizon tarafından SEBEPİYLE zorla kapatılır.
146
+ - Canlı izleme: tasks_list/task_status; iptal: task_cancel (reason zorunlu, kullanıcıya sebep yazılır).
147
+
148
+ ## SAĞLIK KONTROLLERİ
149
+ - "Model yapılandırılmadı" → config.yaml/.env dolu mu; Ayarlar → Provider'dan seçim.
150
+ - Mail hatası → \`email\` skill'ini oku.
151
+ - 401 → Fallout zinciri sıradaki slota otomatik düşer.
152
+ - DDG boş/engelli → normaldir; zincir Obscura/Bing/Mojeek'e otomatik geçer.
153
+
154
+ ## DAVRANIŞ KURALLARI
98
155
  - Şifre/API anahtarlarını asla düz metin loglama/tekrarlama.
99
- - settings.json'a el ile yazarken app kapalı olsun (kapanışta ezme riski).
100
- - Yeni yetenek gerekiyorsa \`%APPDATA%\\beast\\skills\\<ad>\\\\SKILL.md\` oluşturmayı önerebilirsin.`,
156
+ - settings.json'a el ile yazarken app kapalı olsun.
157
+ - Yeni yetenek gerekiyorsa \`%APPDATA%\\beast\\skills\\<ad>\\SKILL.md\` oluşturmayı öner.
158
+ - Bu haritadaki yolları ÖNCE dene; kod taraması yalnız haritada olmayan derin sorularda.`,
101
159
  },
102
160
  {
103
161
  folder: 'email',
package/src/main.js CHANGED
@@ -224,13 +224,10 @@ startHealthServer(); /* splash/boot aşamasından itibaren /health ayakta */
224
224
  try { setSearchObscuraEnabled(settings.obscuraEnabled !== false); } catch {} /* Obscura varsayılan AKTİF */
225
225
  try { setSearchChain(settings.searchChain); } catch {}
226
226
  try { setTinyfishKey(settings.tinyfishKey || null); } catch {}
227
- /* kurulumda Obscura da kurulsun: yoksa ARKA PLANDA otomatik indir (UI kilitlenmez) */
227
+ /* kurulumda Obscura da kurulsun: yoksa ARKA PLANDA otomatik indir (UI kilitlenmez);
228
+ ilerleme Ayarlar → Web Arama'dan da izlenebilir */
228
229
  setTimeout(() => {
229
- if (!obscura.obscuraInstalled()) {
230
- obscura.installObscura().then((r) => {
231
- console.log('[obscura]', r.ok ? 'kuruldu: ' + r.dir : 'kurulamadı: ' + (r.error || '?'));
232
- }).catch((e) => console.log('[obscura] kurulamadı:', String((e && e.message) || e)));
233
- }
230
+ if (!obscura.obscuraInstalled()) startObscuraInstall();
234
231
  }, 4000).unref?.();
235
232
  let wa = null;
236
233
  let waChats = new Map(); // jid -> aktif session id
@@ -634,10 +631,24 @@ function emitWaEventSafe(ev) {
634
631
 
635
632
 
636
633
 
634
+ /* sürüm: app.getVersion() + package.json yedeği (splash, /help, /version ortak) */
635
+ function beastVersion() {
636
+ try {
637
+ const v = app.getVersion();
638
+ if (v && v !== '0.0.0') return v;
639
+ } catch {}
640
+ try {
641
+ return JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8')).version || '?';
642
+ } catch {
643
+ return '?';
644
+ }
645
+ }
646
+
637
647
  function waSlashHelp() {
638
648
  return [
639
649
  '*Beast komutları*',
640
650
  '• */help* – bu liste',
651
+ '• */version* – Beast Agent sürümünü göster',
641
652
  '• */new* – yeni oturum aç (kod verilir)',
642
653
  '• */open* <kod> – o koddaki oturuma geç',
643
654
  '• */sessions* – bu sohbetin oturumları',
@@ -1135,6 +1146,8 @@ async function tryWaSlash(jid, rawText, senderNum) {
1135
1146
  out =
1136
1147
  `*WA:* ${wst.status}${wst.user ? ' (' + wst.user + ')' : ''}\n` +
1137
1148
  `*İzleyici:* ${watchers.list().length} adet\n*Cron:* ${jobs} aktif görev`;
1149
+ } else if (cmd === 'version') {
1150
+ out = `*Beast Agent v${beastVersion()}*\nGüncelleme için: /update (kurulum hazır olunca /update now)`;
1138
1151
  } else {
1139
1152
  out = `Bilinmeyen komut: /${cmd}\nListe için /help yaz.`;
1140
1153
  }
@@ -3673,7 +3686,7 @@ function createSplash() {
3673
3686
  const muted = dark ? '#9a9aa2' : '#707078';
3674
3687
  splash = new BrowserWindow({
3675
3688
  width: 420,
3676
- height: 330,
3689
+ height: 352,
3677
3690
  frame: false,
3678
3691
  resizable: false,
3679
3692
  alwaysOnTop: true,
@@ -3686,6 +3699,7 @@ function createSplash() {
3686
3699
  body{margin:0;height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;background:${bg};font-family:'Segoe UI',sans-serif;color:${fg}}
3687
3700
  .logo{width:84px;height:84px;border-radius:20px;background:${fg};color:${bg};display:flex;align-items:center;justify-content:center;font-weight:900;font-size:44px}
3688
3701
  .t{margin-top:16px;font-size:20px;color:${fg}}.t b{font-weight:900}
3702
+ .v{margin-top:8px;font-size:12.5px;font-weight:800;letter-spacing:.6px;color:${muted};background:${muted}22;padding:2px 12px;border-radius:9px}
3689
3703
  .s{margin-top:6px;font-size:12px;color:${muted}}
3690
3704
  .cmds{margin-top:14px;display:flex;flex-wrap:wrap;gap:6px;justify-content:center;max-width:360px}
3691
3705
  .cmds b{font-size:11.5px;font-weight:800;color:${fg};background:${muted}22;padding:2px 9px;border-radius:6px;letter-spacing:.3px}
@@ -3696,9 +3710,10 @@ function createSplash() {
3696
3710
  </style></head><body>
3697
3711
  <div class="logo">B</div>
3698
3712
  <div class="t"><b>BEAST</b> Agent</div>
3699
- <div class="s">hızlı · hafif · becerikli — v${app.getVersion()}</div>
3713
+ <div class="v">v${beastVersion()}</div>
3714
+ <div class="s">hızlı · hafif · becerikli</div>
3700
3715
  <div class="cmds">
3701
- <b>/help</b><b>/restart</b><b>/change</b><b>/think</b><b>/clear</b><b>/stop</b><b>/usage</b><b>/backup</b><b>/status</b><span>…</span>
3716
+ <b>/help</b><b>/version</b><b>/restart</b><b>/change</b><b>/think</b><b>/clear</b><b>/stop</b><b>/usage</b><b>/backup</b><b>/status</b><span>…</span>
3702
3717
  </div>
3703
3718
  <div class="bar"><i></i></div>
3704
3719
  </body></html>`;
@@ -3830,6 +3845,10 @@ ipcMain.handle('agent:send', (_e, { sessionId, text }) => {
3830
3845
  handleRestart(sessionId);
3831
3846
  return true;
3832
3847
  }
3848
+ if (t === '/version') {
3849
+ desktopEcho(sessionId, t, `**Beast Agent v${beastVersion()}**\nGüncelleme: **/update** (yeni sürüm kontrolü) · **/update now** (hemen kur)`);
3850
+ return true;
3851
+ }
3833
3852
  if (t === '/help') {
3834
3853
  desktopEcho(sessionId, '/help', desktopSlashHelp());
3835
3854
  return true;
@@ -3979,6 +3998,7 @@ function desktopSlashHelp() {
3979
3998
  return [
3980
3999
  '**Beast komutları**',
3981
4000
  '**/help** – bu liste',
4001
+ '**/version** – Beast Agent sürümünü göster',
3982
4002
  '**/restart** – uygulamayı yeniden başlat',
3983
4003
  '**/stop** – koşan işleri durdur · **/start** – devam ettir',
3984
4004
  '**/change [n]** – modelleri listele · n. modele geç',
@@ -4081,6 +4101,13 @@ function thinkStatusText() {
4081
4101
  }
4082
4102
 
4083
4103
  /* /restart: uygulama kendini yeniden başlatır (relaunch + exit) */
4104
+ function scheduleAppRestart(delayMs = 800) {
4105
+ setTimeout(() => {
4106
+ try { app.relaunch(); } catch {}
4107
+ try { app.exit(0); } catch {}
4108
+ }, delayMs);
4109
+ }
4110
+
4084
4111
  function handleRestart(sessionId) {
4085
4112
  const sid = String(sessionId || ''); if (win && !win.isDestroyed()) {
4086
4113
  win.webContents.send('agent:event', { sessionId: sid, type: 'message', message: { role: 'user', content: '/restart' } });
@@ -4091,10 +4118,7 @@ function handleRestart(sessionId) {
4091
4118
  });
4092
4119
  win.webContents.send('agent:event', { sessionId: sid, type: 'done', usage: null });
4093
4120
  }
4094
- setTimeout(() => {
4095
- try { app.relaunch(); } catch {}
4096
- try { app.exit(0); } catch {}
4097
- }, 800);
4121
+ scheduleAppRestart(800);
4098
4122
  }
4099
4123
 
4100
4124
  /* Masaüstünde /stop ve /start: engine'e gitmez; tüm sistemde etki eder ve
@@ -4241,6 +4265,10 @@ let netFailStreak = 0;
4241
4265
  let chatQueueFlushing = false;
4242
4266
  const chatOfflineQueue = []; // { key, sessionId, text, attachments, at }
4243
4267
 
4268
+ /* LLM retry'ı net izleyicisinden besler: internet kopmuşsa istek,
4269
+ bağlantı dönene kadar bekler — "fetch failed" ile görev ölmez */
4270
+ try { require('./agent/llm').setNetProbe(() => netOnline); } catch {}
4271
+
4244
4272
  /* diskten yükle (app restart sonrası kuyruk korunur) */
4245
4273
  (function chatQueueLoad() {
4246
4274
  try {
@@ -5193,6 +5221,21 @@ ipcMain.handle('beastcode:send', (_e, payload) => {
5193
5221
  const s = bcGetSession(ws);
5194
5222
  s.workspace = ws; /* soldaki klasörde çalış */
5195
5223
  s.bcCode = true; /* todo disiplini + iş sonu hızlı kapanış (engine) */
5224
+ /* OpenCode disiplini — çalışma modu: /plan (incele+planla) · /build (uygula) · /auto */
5225
+ const m = /^\/(plan|build|auto)\b/i.exec(text);
5226
+ if (m) {
5227
+ s.bcMode = m[1].toLowerCase();
5228
+ engine.cache.set(s.id, s);
5229
+ if (win && !win.isDestroyed()) {
5230
+ const body = m[1].toLowerCase() === 'plan'
5231
+ ? 'PLAN MODU — dosyaları okuyup inceler, KOD YAZMAZ; adım adım uygulama planı verir.'
5232
+ : m[1].toLowerCase() === 'build'
5233
+ ? 'BUILD MODU — son planı UYGULAR: dosyaları düzenler, komutları çalıştırır, doğrular.'
5234
+ : 'OTOMATİK MOD — önce kısa plan, sonra uygulama + doğrulama (OpenCode disiplini).';
5235
+ win.webContents.send('agent:event', { sessionId: s.id, type: 'bc-mode', mode: s.bcMode, body });
5236
+ }
5237
+ return { ok: true, sessionId: s.id, mode: s.bcMode };
5238
+ }
5196
5239
  engine.cache.set(s.id, s);
5197
5240
  const ok = engine.send(s.id, text);
5198
5241
  if (!ok) return { ok: false, error: 'mesaj gönderilemedi' };
@@ -5225,19 +5268,50 @@ ipcMain.handle('think:set', (_e, v) => {
5225
5268
  });
5226
5269
 
5227
5270
  /* Obscura stealth headless tarayıcı (Ayarlar → Web Arama) */
5271
+
5272
+ /* kurulum durumu: ayarlardan çıkılıp dönülsa da main process'te sürer;
5273
+ ilerleme agent:event ile panele, obscura:installState ile sekme açılışına taşınır */
5274
+ let obscuraInstallState = { running: false, pct: 0, phase: '', error: null };
5275
+
5276
+ function pushObscuraProgress() {
5277
+ try {
5278
+ if (win && !win.isDestroyed()) win.webContents.send('agent:event', { type: 'obscura-progress', ...obscuraInstallState });
5279
+ } catch {}
5280
+ }
5281
+
5282
+ function startObscuraInstall() {
5283
+ if (obscuraInstallState.running) return { ok: false, busy: true, ...obscuraInstallState };
5284
+ obscuraInstallState = { running: true, pct: 0, phase: 'hazırlanıyor', error: null };
5285
+ pushObscuraProgress();
5286
+ obscura
5287
+ .installObscura(null, (p) => {
5288
+ obscuraInstallState.pct = Math.max(0, Math.min(100, Math.round(Number(p && p.pct) || 0)));
5289
+ obscuraInstallState.phase = String((p && p.phase) || obscuraInstallState.phase || '');
5290
+ pushObscuraProgress();
5291
+ })
5292
+ .then((r) => {
5293
+ obscuraInstallState = r && r.ok
5294
+ ? { running: false, pct: 100, phase: 'tamamlandı', error: null }
5295
+ : { running: false, pct: 0, phase: 'hata', error: String((r && r.error) || 'bilinmeyen hata') };
5296
+ pushObscuraProgress();
5297
+ console.log('[obscura]', r && r.ok ? 'kuruldu: ' + r.dir : 'kurulamadı: ' + ((r && r.error) || '?'));
5298
+ })
5299
+ .catch((e) => {
5300
+ obscuraInstallState = { running: false, pct: 0, phase: 'hata', error: String((e && e.message) || e) };
5301
+ pushObscuraProgress();
5302
+ console.log('[obscura] kurulamadı:', String((e && e.message) || e));
5303
+ });
5304
+ return { ok: true, started: true, ...obscuraInstallState };
5305
+ }
5306
+
5228
5307
  ipcMain.handle('obscura:get', () => ({
5229
5308
  installed: obscura.obscuraInstalled(),
5230
5309
  dir: obscura.obscuraDir(),
5231
5310
  enabled: settings.obscuraEnabled !== false,
5311
+ install: { ...obscuraInstallState },
5232
5312
  }));
5233
- ipcMain.handle('obscura:install', async () => {
5234
- try {
5235
- const r = await obscura.installObscura();
5236
- return { ok: !!r.ok, dir: r.dir || obscura.obscuraDir(), error: r.error || null };
5237
- } catch (e) {
5238
- return { ok: false, error: String((e && e.message) || e) };
5239
- }
5240
- });
5313
+ ipcMain.handle('obscura:install', () => startObscuraInstall());
5314
+ ipcMain.handle('obscura:installState', () => ({ ...obscuraInstallState }));
5241
5315
  ipcMain.handle('obscura:setEnabled', (_e, v) => {
5242
5316
  settings.obscuraEnabled = v !== false;
5243
5317
  saveSettings();
@@ -5258,6 +5332,17 @@ ipcMain.handle('searchorder:set', (_e, chain) => {
5258
5332
  }
5259
5333
  });
5260
5334
 
5335
+ /* Sohbet listesi ELLE sıralama (sol panelde sürükle-bırak) */
5336
+ ipcMain.handle('sessions:order:get', () => ({
5337
+ order: Array.isArray(settings.sessionOrder) ? settings.sessionOrder : [],
5338
+ }));
5339
+ ipcMain.handle('sessions:order:set', (_e, order) => {
5340
+ const arr = Array.isArray(order) ? order.map(String).filter(Boolean).slice(0, 500) : [];
5341
+ settings.sessionOrder = arr;
5342
+ saveSettings();
5343
+ return { ok: true };
5344
+ });
5345
+
5261
5346
  /* #TinyFish: anahtar girilirse web_search zincirinin BAŞINDA kullanılır */
5262
5347
  ipcMain.handle('tinyfish:get', () => {
5263
5348
  const k = settings.tinyfishKey || '';
@@ -6236,8 +6321,11 @@ ipcMain.handle('bots:remove', (_e, id) => {
6236
6321
  saveSettings();
6237
6322
  syncWhitelist();
6238
6323
  log.info('main', `bot silindi: ${id} — bağlı numaralar botsuz (beast'e düşer)`);
6324
+ /* bot silme sonrası sistem KİTLENİYOR (oturum/DM/servis referansları) →
6325
+ güvenli yol: bot kaydı silindikten sonra uygulamayı temiz yeniden başlat */
6326
+ if (String(id || '') !== 'beast') scheduleAppRestart(1200);
6239
6327
  }
6240
- return { ...r, list: r.ok ? botListWithNumbers() : null };
6328
+ return { ...r, list: r.ok ? botListWithNumbers() : null, restarting: r.ok && String(id || '') !== 'beast' };
6241
6329
  });
6242
6330
 
6243
6331
  ipcMain.handle('bots:stats', () => botStats());
package/src/preload.js CHANGED
@@ -72,9 +72,12 @@ contextBridge.exposeInMainWorld('beast', {
72
72
  thinkSet: (v) => ipcRenderer.invoke('think:set', v),
73
73
  obscuraGet: () => ipcRenderer.invoke('obscura:get'),
74
74
  obscuraInstall: () => ipcRenderer.invoke('obscura:install'),
75
+ obscuraInstallState: () => ipcRenderer.invoke('obscura:installState'),
75
76
  obscuraSetEnabled: (v) => ipcRenderer.invoke('obscura:setEnabled', v),
76
77
  searchOrderGet: () => ipcRenderer.invoke('searchorder:get'),
77
78
  searchOrderSet: (chain) => ipcRenderer.invoke('searchorder:set', chain),
79
+ sessionsOrderGet: () => ipcRenderer.invoke('sessions:order:get'),
80
+ sessionsOrderSet: (order) => ipcRenderer.invoke('sessions:order:set', order),
78
81
  tinyfishGet: () => ipcRenderer.invoke('tinyfish:get'),
79
82
  tinyfishSet: (key) => ipcRenderer.invoke('tinyfish:set', key),
80
83
  tinyfishClear: () => ipcRenderer.invoke('tinyfish:clear'),
@@ -18,6 +18,10 @@
18
18
  tipThink: 'Düşünme (reasoning) seviyesi',
19
19
  tipPickCfg: 'Picker\u2019da görünecek modeller',
20
20
  tipRail: 'Paralel Ajan Konsolu',
21
+ tipNet: 'İnternet durumu',
22
+ tip_net_online: 'İnternet: bağlı',
23
+ tip_net_offline: 'İnternet: yok — bağlantı dönünce işler otomatik sürer',
24
+ sess_drag: 'Sürükleyerek sırayı değiştir',
21
25
  tipWatch: 'İzleyiciler (Watchers)',
22
26
  tipCron: 'Cron Görevler',
23
27
  tip_light: 'Açık tema',
@@ -259,6 +263,7 @@
259
263
  us_where_off_toast: 'Açılış özeti kapandı',
260
264
  ws_calls: 'çağrı',
261
265
  ws_token: 'token',
266
+ td_hide: 'Görev listesini gizle (yeni güncellemede yine görünür)',
262
267
  ws_h2: 'Web Arama',
263
268
  ws_sub: 'Arama zinciri: 1) dahili tarayıcı (direk Google) 2) Obscura (stealth headless → DuckDuckGo) 3) TinyFish (anahtar varsa) 4) python çoklu-motor (ddgs / DDG+Bing+Mojeek) — otomatik. Sıra ve aç/kapa aşağıdan değiştirilir.',
264
269
  oc_h2: 'Obscura (Stealth Tarayıcı)',
@@ -266,7 +271,14 @@
266
271
  oc_status_ok: 'Obscura kurulu ve hazır.',
267
272
  oc_status_missing: 'Obscura kurulu değil — ilk açılışta otomatik indirilir (≈74 MB).',
268
273
  oc_install: 'Kur / Güncelle',
274
+ oc_install_running: 'Kuruluyor…',
269
275
  oc_installing: 'İndiriliyor… (≈74 MB, bağlantıya göre birkaç dakika)',
276
+ oc_phase_prep: 'Hazırlanıyor',
277
+ oc_phase_download: 'İndiriliyor',
278
+ oc_phase_extract: 'Açılıyor',
279
+ oc_phase_verify: 'Doğrulanıyor',
280
+ oc_phase_done: 'Tamamlandı',
281
+ oc_bg_note: 'Kurulum arka planda sürüyor — ayarlardan çıkıp dönsen bile ilerleme burada devam eder.',
270
282
  oc_installed_toast: 'Obscura kuruldu',
271
283
  oc_install_fail: 'Kurulamadı: ',
272
284
  oc_enabled: 'Obscura arama zincirinde aktif',
@@ -445,8 +457,9 @@
445
457
  bot_delete: 'Botu Sil',
446
458
  bot_confirm_del: '"${n}" silinsin mi? Bağlı numaralar botsuz duruma düşer (Beast\u2019e yönlendirilir).',
447
459
  bot_deleted: 'Bot silindi',
460
+ bot_deleted_restart: 'Bot silindi — sistem temiz yeniden başlatılıyor…',
448
461
  bot_max_toast: 'En fazla ${n} bot olabilir (1 admin + 4 müşteri)',
449
- bot_name_ph: 'Bot adı (örn: Muhasebe Botu)',
462
+ bot_name_ph: 'Bot adı (harfle başlar, örn: Muhasebe Botu)',
450
463
  bot_icon_ph: 'İkon seç (emoji kopyala-yapıştır)',
451
464
  bot_created: 'Bot oluşturuldu:',
452
465
  bot_mem_sub: 'Bu botun KENDİ hafızası — SOUL (kişilik) · USER (kullanıcı bilgisi) · MEMORY (hafıza kayıtları). Diğer botlardan tamamen izoledir.',
@@ -476,6 +489,7 @@
476
489
  bot_create: 'Botu Oluştur',
477
490
  bot_cancel: 'Vazgeç',
478
491
  bot_name_req: 'Bot adı zorunlu',
492
+ bot_name_letter: 'Bot adı HARF ile başlamalı — ilk karakter harf olmalı',
479
493
  p_preset: 'Hazır sağlayıcı (endpoint otomatik)',
480
494
  p_preset_custom: '— elle gir —',
481
495
  p_preset_hint: 'Hazır seçersen adres otomatik dolar; sadece API key girip modelleri çek.',
@@ -560,6 +574,10 @@
560
574
  tipThink: 'Reasoning level',
561
575
  tipPickCfg: 'Models shown in picker',
562
576
  tipRail: 'Parallel Agents Console',
577
+ tipNet: 'Internet status',
578
+ tip_net_online: 'Internet: connected',
579
+ tip_net_offline: 'Internet: offline — work resumes automatically once the connection returns',
580
+ sess_drag: 'Drag to reorder',
563
581
  tipWatch: 'Watchers',
564
582
  tipCron: 'Cron Jobs',
565
583
  tip_light: 'Light theme',
@@ -800,6 +818,7 @@
800
818
  us_where_off_toast: 'Startup summary off',
801
819
  ws_calls: 'calls',
802
820
  ws_token: 'tokens',
821
+ td_hide: 'Hide todo list (reappears on next update)',
803
822
  ws_h2: 'Web Search',
804
823
  ws_sub: 'Search chain: 1) built-in browser (direct Google) 2) Obscura (stealth headless → DuckDuckGo) 3) TinyFish (if a key is set) 4) python multi-engine (ddgs / DDG+Bing+Mojeek) — automatic. Order and on/off are editable below.',
805
824
  oc_h2: 'Obscura (Stealth Browser)',
@@ -807,7 +826,14 @@
807
826
  oc_status_ok: 'Obscura is installed and ready.',
808
827
  oc_status_missing: 'Obscura is not installed — it is auto-downloaded at first launch (≈74 MB).',
809
828
  oc_install: 'Install / Update',
829
+ oc_install_running: 'Installing…',
810
830
  oc_installing: 'Downloading… (≈74 MB, may take a few minutes)',
831
+ oc_phase_prep: 'Preparing',
832
+ oc_phase_download: 'Downloading',
833
+ oc_phase_extract: 'Extracting',
834
+ oc_phase_verify: 'Verifying',
835
+ oc_phase_done: 'Done',
836
+ oc_bg_note: 'Installation continues in the background — progress stays here even if you leave the settings.',
811
837
  oc_installed_toast: 'Obscura installed',
812
838
  oc_install_fail: 'Install failed: ',
813
839
  oc_enabled: 'Obscura active in the search chain',
@@ -1044,8 +1070,9 @@
1044
1070
  bot_delete: 'Delete Bot',
1045
1071
  bot_confirm_del: 'Delete "${n}"? Linked numbers become botless (routed to Beast).',
1046
1072
  bot_deleted: 'Bot deleted',
1073
+ bot_deleted_restart: 'Bot deleted — system is restarting cleanly…',
1047
1074
  bot_max_toast: 'Maximum ${n} bots (1 admin + 4 customer)',
1048
- bot_name_ph: 'Bot name (e.g. Accounting Bot)',
1075
+ bot_name_ph: 'Bot name (starts with a letter, e.g. Accounting Bot)',
1049
1076
  bot_icon_ph: 'Pick an icon (emoji)',
1050
1077
  bot_created: 'Bot created:',
1051
1078
  bot_mem_sub: 'This bot\u2019s OWN memory — SOUL (personality) · USER (user info) · MEMORY (memory entries). Fully isolated from other bots.',
@@ -1075,6 +1102,7 @@
1075
1102
  bot_create: 'Create Bot',
1076
1103
  bot_cancel: 'Cancel',
1077
1104
  bot_name_req: 'Bot name is required',
1105
+ bot_name_letter: 'Bot name must START with a letter — first character must be a letter',
1078
1106
  p_preset: 'Built-in provider (endpoint auto-filled)',
1079
1107
  p_preset_custom: '— manual —',
1080
1108
  p_preset_hint: 'Pick a built-in provider to auto-fill the URL; just enter your API key and fetch models.',
@@ -77,6 +77,7 @@
77
77
  <button id="termCBtn" class="dd-btn dd-icon-btn" title="CMD terminali" data-i18n-title="tipTermC">&#x276F;&#xFE0E;</button>
78
78
  <button id="browserBtn" class="dd-btn dd-icon-btn" title="Dahili tarayıcı" data-i18n-title="tipBrowser">&#x29C9;</button>
79
79
  <button id="eyeBtn" class="dd-btn dd-icon-btn" title="Ajan tarayıcısı görünür/gizli — göz açıkken aramalar panelde izlenir, kapalıyken gizli çalışır" data-i18n-title="tipEye"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z"/><circle cx="12" cy="12" r="3"/><line class="eye-slash" x1="4" y1="4" x2="20" y2="20"/></svg></button>
80
+ <span id="netDot" class="dd-btn dd-icon-btn net-on" title="İnternet: bağlı" data-i18n-title="tipNet"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12.55a11 11 0 0 1 14.08 0"/><path d="M8.53 16.11a6 6 0 0 1 6.95 0"/><line x1="12" y1="20" x2="12.01" y2="20"/><line class="net-slash" x1="4" y1="4" x2="20" y2="20"/></svg></span>
80
81
  <div class="drag-spacer"></div>
81
82
  </header>
82
83