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.
- package/package.json +1 -1
- package/src/agent/bots.js +8 -0
- package/src/agent/engine.js +99 -17
- package/src/agent/llm.js +153 -71
- package/src/agent/obscura.js +49 -18
- package/src/agent/skills.js +85 -27
- package/src/main.js +110 -22
- package/src/preload.js +3 -0
- package/src/renderer/i18n.js +30 -2
- package/src/renderer/index.html +1 -0
- package/src/renderer/renderer.js +173 -16
- package/src/renderer/style.css +42 -1
- package/tests/bg-jobs.test.js +45 -0
- package/tests/bots-name.test.js +42 -0
- package/tests/llm.test.js +70 -1
package/src/agent/skills.js
CHANGED
|
@@ -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
|
|
67
|
-
version:
|
|
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
|
|
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
|
-
|
|
98
|
+
**"Cron/izleyici var mı"** → \`cron.json\`, \`watchers.json\`.
|
|
73
99
|
|
|
74
|
-
##
|
|
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
|
|
79
|
-
| \`settings.json\` | App ayarları: theme, workspace, modelOverride, customProviders, roleModels, deletedModels, fallout, waTts
|
|
80
|
-
| \`sessions
|
|
81
|
-
| \`
|
|
82
|
-
| \`
|
|
83
|
-
| \`
|
|
84
|
-
| \`
|
|
85
|
-
| \`
|
|
86
|
-
| \`wa-chats.json\`, \`wa.log\` |
|
|
87
|
-
| \`
|
|
88
|
-
| \`
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
100
|
-
- Yeni yetenek gerekiyorsa \`%APPDATA%\\beast\\skills\\<ad
|
|
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:
|
|
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="
|
|
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
|
-
|
|
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',
|
|
5234
|
-
|
|
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'),
|
package/src/renderer/i18n.js
CHANGED
|
@@ -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.',
|
package/src/renderer/index.html
CHANGED
|
@@ -77,6 +77,7 @@
|
|
|
77
77
|
<button id="termCBtn" class="dd-btn dd-icon-btn" title="CMD terminali" data-i18n-title="tipTermC">❯︎</button>
|
|
78
78
|
<button id="browserBtn" class="dd-btn dd-icon-btn" title="Dahili tarayıcı" data-i18n-title="tipBrowser">⧉</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
|
|