beast-agent 0.26.0 → 0.26.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/bin/beast-agent.js +34 -17
- package/package.json +2 -2
- package/scripts/fix-electron.js +126 -0
- package/src/agent/bots.js +8 -0
- package/src/agent/discord.js +268 -0
- package/src/agent/engine.js +135 -77
- package/src/agent/llm.js +46 -17
- package/src/agent/research.js +133 -0
- package/src/agent/skills.js +8 -1
- package/src/agent/tools.js +53 -14
- package/src/agent/watext.js +4 -0
- package/src/main.js +534 -351
- package/src/preload.js +8 -5
- package/src/renderer/i18n.js +19 -55
- package/src/renderer/index.html +1 -3
- package/src/renderer/renderer.js +336 -155
- package/src/renderer/style.css +1 -60
- package/tests/bg-jobs.test.js +5 -10
- package/tests/llm.test.js +81 -1
- package/tests/python.test.js +3 -2
- package/tests/research.test.js +116 -0
package/src/preload.js
CHANGED
|
@@ -39,11 +39,6 @@ contextBridge.exposeInMainWorld('beast', {
|
|
|
39
39
|
eventsSubs: () => ipcRenderer.invoke('events:subs:list'),
|
|
40
40
|
eventUnsub: (id) => ipcRenderer.invoke('events:subs:remove', id),
|
|
41
41
|
getSettings: () => ipcRenderer.invoke('settings:get'),
|
|
42
|
-
proxyGet: () => ipcRenderer.invoke('proxy:get'),
|
|
43
|
-
proxySet: (cfg) => ipcRenderer.invoke('proxy:set', cfg),
|
|
44
|
-
proxyTest: () => ipcRenderer.invoke('proxy:test'),
|
|
45
|
-
warpGet: () => ipcRenderer.invoke('warp:get'),
|
|
46
|
-
warpSet: (on) => ipcRenderer.invoke('warp:set', on),
|
|
47
42
|
getFallout: () => ipcRenderer.invoke('fallout:get'),
|
|
48
43
|
setFallout: (cfg) => ipcRenderer.invoke('fallout:set', cfg),
|
|
49
44
|
getLimits: () => ipcRenderer.invoke('limits:get'),
|
|
@@ -130,6 +125,14 @@ contextBridge.exposeInMainWorld('beast', {
|
|
|
130
125
|
tgSetAllow: (list) => ipcRenderer.invoke('tg:allow:set', list),
|
|
131
126
|
tgListSessions: () => ipcRenderer.invoke('tg:sessions'),
|
|
132
127
|
onTgEvent: (cb) => ipcRenderer.on('tg:event', (_e, ev) => cb(ev)),
|
|
128
|
+
dcGetStatus: () => ipcRenderer.invoke('dc:status:get'),
|
|
129
|
+
dcSetToken: (token) => ipcRenderer.invoke('dc:set', token),
|
|
130
|
+
dcStart: () => ipcRenderer.invoke('dc:start'),
|
|
131
|
+
dcStop: () => ipcRenderer.invoke('dc:stop'),
|
|
132
|
+
dcGetAllow: () => ipcRenderer.invoke('dc:allow:get'),
|
|
133
|
+
dcSetAllow: (list) => ipcRenderer.invoke('dc:allow:set', list),
|
|
134
|
+
dcListSessions: () => ipcRenderer.invoke('dc:sessions'),
|
|
135
|
+
onDcEvent: (cb) => ipcRenderer.on('dc:event', (_e, ev) => cb(ev)),
|
|
133
136
|
getUsage: () => ipcRenderer.invoke('usage:get'),
|
|
134
137
|
resetUsage: () => ipcRenderer.invoke('usage:reset'),
|
|
135
138
|
createBackup: () => ipcRenderer.invoke('backup:create'),
|
package/src/renderer/i18n.js
CHANGED
|
@@ -61,33 +61,6 @@
|
|
|
61
61
|
tab_websearch: 'Web Arama',
|
|
62
62
|
tab_limits: 'Limit Ayarları',
|
|
63
63
|
tab_security: 'Güvenlik',
|
|
64
|
-
tab_proxy: 'Proxy',
|
|
65
|
-
proxy_h2: 'Proxy',
|
|
66
|
-
proxy_sub: 'Tüm çıkış trafiğini (LLM API, dahili tarayıcı, web arama, http_fetch) proxy üzerinden geçir. Gizlilik, IP rotasyonu ve erişim engelleri için.',
|
|
67
|
-
proxy_enabled: 'Proxy aktif',
|
|
68
|
-
proxy_urls: 'Proxy listesi (çoklu satır = rotasyon)',
|
|
69
|
-
proxy_add: '+ Ekle',
|
|
70
|
-
proxy_host: 'IP / sunucu',
|
|
71
|
-
proxy_port: 'Port',
|
|
72
|
-
proxy_user: 'Kullanıcı (opsiyonel)',
|
|
73
|
-
proxy_pass: 'Şifre (opsiyonel)',
|
|
74
|
-
proxy_none: 'Henüz proxy eklenmedi — alanları doldurup + Ekle\u2019ye bas.',
|
|
75
|
-
proxy_invalid: 'IP ve Port zorunlu (port sayı olmalı)',
|
|
76
|
-
proxy_dup: 'Bu proxy zaten listede',
|
|
77
|
-
proxy_urls_ph: 'http://127.0.0.1:8080\nhttp://kullanici:sifre@sunucu:port\nsocks5://sunucu:1080 (socks5 yalnız dahili tarayıcı)',
|
|
78
|
-
proxy_save: 'Kaydet',
|
|
79
|
-
proxy_test: 'Test Et (çıkış IP)',
|
|
80
|
-
proxy_testing: 'Test ediliyor…',
|
|
81
|
-
proxy_test_ok: 'Bağlantı OK — çıkış IP:',
|
|
82
|
-
proxy_test_fail: 'Test başarısız:',
|
|
83
|
-
proxy_saved: 'Proxy ayarları kaydedildi',
|
|
84
|
-
proxy_note: 'Not: LLM API, http_fetch, TinyFish/Exa (http + socks5) ve dahili tarayıcı (http/socks5) destekler. Python motorları ve terminal süreçleri ortam değişkenleriyle yönlendirilir. Ayar anında uygulanır, yeniden başlatma gerekmez.',
|
|
85
|
-
warp_on: '☁ Cloudflare WARP Aç',
|
|
86
|
-
warp_off: '☁ Cloudflare WARP Kapat',
|
|
87
|
-
warp_state_on: 'çalışıyor ✓',
|
|
88
|
-
warp_state_starting: 'başlatılıyor…',
|
|
89
|
-
warp_state_off: 'kapalı',
|
|
90
|
-
warp_note: 'Bedava + üyeliksiz: Beast trafiğini Cloudflare ağından geçirir (yerel socks5). İlk açılışta ~10MB otomatik indirilir; kapatınca her şey normale döner.',
|
|
91
64
|
tab_update: 'Güncelleme',
|
|
92
65
|
up_h2: 'Güncelleme',
|
|
93
66
|
up_sub: 'Sürümler GitHub Releases\u2019ten gelir. Otomatik kontrol açılışta ve 6 saatte bir çalışır.',
|
|
@@ -236,6 +209,12 @@
|
|
|
236
209
|
it_tg_token_bad: 'Token doğrulanamadı — @BotFather\u2019dan aldığın tokenı kontrol et',
|
|
237
210
|
it_tg_id_ph: 'Kullanıcı ID veya @kullanıcı_adı',
|
|
238
211
|
it_tg_note: 'İzin listesi boşsa kimse cevap almaz. Bot oluşturma: @BotFather → /newbot. Kendi ID\u2019ni öğrenmek için @userinfobot\u2019a mesaj at.',
|
|
212
|
+
it_dc_sub: 'Bot tokenı ile çalışır — izin listendeki kişilere Discord\u2019dan cevap verir (sunucularda @mention bekler)',
|
|
213
|
+
it_dc_token_ph: 'Bot tokenı (Developer Portal → Bot → Reset Token)',
|
|
214
|
+
it_dc_connecting: 'Discord\u2019a bağlanıyor…',
|
|
215
|
+
it_dc_token_bad: 'Token doğrulanamadı — Developer Portal\u2019dan aldığın tokenı kontrol et',
|
|
216
|
+
it_dc_id_ph: 'Kullanıcı ID veya @kullanıcı_adı',
|
|
217
|
+
it_dc_note: 'İzin listesi boşsa kimse cevap almaz. Bot oluşturma: discord.com/developers → New Application → Bot → Token. "MESSAGE CONTENT INTENT"i AÇ (yoksa mesajlar boş gelir). Sunucu daveti: OAuth2 → bot yetkisiyle. Kendi ID\u2019ni öğrenmek için geliştirici modunu açıp kendine sağ tıkla → ID\u2019yi kopyala.',
|
|
239
218
|
ev_h2: 'Olay Merkezi',
|
|
240
219
|
ev_sub: 'Cron\u2019suz canlı olaylar — kaynakları aç, abonelikleri agent kendisi kurar (event_subscribe). Tetiklenen olay ilgili sohbete düşer, cevap WhatsApp\u2019a gider.',
|
|
241
220
|
ev_on: 'Olay merkezi açık',
|
|
@@ -436,6 +415,9 @@
|
|
|
436
415
|
bot_perm: 'Yetki seviyesi',
|
|
437
416
|
bot_perm_note: 'all tek başına tüm araçları açar (özel). Web / Okuma / Sohbet birden fazla seçilebilir — seçilenlerin araçları birleşir.',
|
|
438
417
|
bot_skills: 'Skill erişimi',
|
|
418
|
+
bot_model: 'Model',
|
|
419
|
+
bot_model_global: 'Global seçim (üstteki picker)',
|
|
420
|
+
bot_model_note: 'Bu bot için farklı model seçebilirsin; boş bırakırsan üstteki global model kullanılır. Seçim sadece bu bota bağlı sohbetlerde geçerli.',
|
|
439
421
|
bot_browser: 'Tarayıcı ayarları',
|
|
440
422
|
bot_ext_browser: 'Dış tarayıcı yetkisi (kullanıcı isterse)',
|
|
441
423
|
bot_def_browser: 'Varsayılan tarayıcı',
|
|
@@ -497,7 +479,7 @@
|
|
|
497
479
|
q_flushed: '${n} kuyruktaki mesaj gönderiliyor',
|
|
498
480
|
bot_num_ro_hint: 'Numara ekleme/kişi adı Ayarlar → Entegrasyonlar (WhatsApp izin listesi) üzerinden yapılır; burada yalnızca bağlı numaralar görünür.',
|
|
499
481
|
tipStore: 'Skills Store',
|
|
500
|
-
tipGithub: 'GitHub Trending —
|
|
482
|
+
tipGithub: 'GitHub Trending — repoları favorile, chate at, ajana araştır',
|
|
501
483
|
tipIde: 'IDE Modu — dosyalar + chat + preview',
|
|
502
484
|
ide_files: 'DOSYALAR',
|
|
503
485
|
ide_pick: 'Klasör seç',
|
|
@@ -606,33 +588,6 @@
|
|
|
606
588
|
tab_websearch: 'Web Search',
|
|
607
589
|
tab_limits: 'Limits',
|
|
608
590
|
tab_security: 'Security',
|
|
609
|
-
tab_proxy: 'Proxy',
|
|
610
|
-
proxy_h2: 'Proxy',
|
|
611
|
-
proxy_sub: 'Route all outgoing traffic (LLM APIs, built-in browser, web search, http_fetch) through a proxy. For privacy, IP rotation and access blocks.',
|
|
612
|
-
proxy_enabled: 'Proxy enabled',
|
|
613
|
-
proxy_urls: 'Proxy list (multiple lines = rotation)',
|
|
614
|
-
proxy_add: '+ Add',
|
|
615
|
-
proxy_host: 'IP / server',
|
|
616
|
-
proxy_port: 'Port',
|
|
617
|
-
proxy_user: 'Username (optional)',
|
|
618
|
-
proxy_pass: 'Password (optional)',
|
|
619
|
-
proxy_none: 'No proxy added yet — fill the fields and press + Add.',
|
|
620
|
-
proxy_invalid: 'IP and Port are required (port must be numeric)',
|
|
621
|
-
proxy_dup: 'This proxy is already in the list',
|
|
622
|
-
proxy_urls_ph: 'http://127.0.0.1:8080\nhttp://user:pass@server:port\nsocks5://server:1080 (socks5 built-in browser only)',
|
|
623
|
-
proxy_save: 'Save',
|
|
624
|
-
proxy_test: 'Test (exit IP)',
|
|
625
|
-
proxy_testing: 'Testing…',
|
|
626
|
-
proxy_test_ok: 'Connection OK — exit IP:',
|
|
627
|
-
proxy_test_fail: 'Test failed:',
|
|
628
|
-
proxy_saved: 'Proxy settings saved',
|
|
629
|
-
proxy_note: 'Note: LLM APIs, http_fetch, TinyFish/Exa (http + socks5) and the built-in browser (http/socks5) are supported. Python engines and terminal processes are routed via environment variables. Applied instantly — no restart needed.',
|
|
630
|
-
warp_on: '☁ Cloudflare WARP On',
|
|
631
|
-
warp_off: '☁ Cloudflare WARP Off',
|
|
632
|
-
warp_state_on: 'running ✓',
|
|
633
|
-
warp_state_starting: 'starting…',
|
|
634
|
-
warp_state_off: 'off',
|
|
635
|
-
warp_note: 'Free + no account: routes Beast traffic through the Cloudflare network (local socks5). First enable downloads ~10MB automatically; turning it off restores everything.',
|
|
636
591
|
tab_update: 'Update',
|
|
637
592
|
up_h2: 'Update',
|
|
638
593
|
up_sub: 'Versions come from GitHub Releases. Automatic check runs on startup and every 6 hours.',
|
|
@@ -781,6 +736,12 @@
|
|
|
781
736
|
it_tg_token_bad: 'Token could not be verified — check the token from @BotFather',
|
|
782
737
|
it_tg_id_ph: 'User ID or @username',
|
|
783
738
|
it_tg_note: 'Empty allow list = nobody gets a reply. Create a bot: @BotFather → /newbot. To learn your ID, message @userinfobot.',
|
|
739
|
+
it_dc_sub: 'Works with a bot token — replies on Discord to people in your allow list (mentions only in servers)',
|
|
740
|
+
it_dc_token_ph: 'Bot token (Developer Portal → Bot → Reset Token)',
|
|
741
|
+
it_dc_connecting: 'Connecting to Discord…',
|
|
742
|
+
it_dc_token_bad: 'Token could not be verified — check the token from the Developer Portal',
|
|
743
|
+
it_dc_id_ph: 'User ID or @username',
|
|
744
|
+
it_dc_note: 'Empty allow list = nobody gets a reply. Create a bot: discord.com/developers → New Application → Bot → Token. Turn ON "MESSAGE CONTENT INTENT". Invite via OAuth2 bot URL. To learn your ID: enable developer mode, right-click yourself → Copy ID.',
|
|
784
745
|
ev_h2: 'Event Center',
|
|
785
746
|
ev_sub: 'Live events without cron — open sources, the agent sets up subscriptions itself (event_subscribe). The triggered event drops into the relevant chat, the reply goes to WhatsApp.',
|
|
786
747
|
ev_on: 'Event center on',
|
|
@@ -1039,6 +1000,9 @@
|
|
|
1039
1000
|
bot_perm: 'Permission level',
|
|
1040
1001
|
bot_perm_note: 'all alone grants every tool (exclusive). Web / Read / Chat can be multi-selected — their tool sets are combined.',
|
|
1041
1002
|
bot_skills: 'Skill access',
|
|
1003
|
+
bot_model: 'Model',
|
|
1004
|
+
bot_model_global: 'Global selection (main picker)',
|
|
1005
|
+
bot_model_note: 'You can pick a different model for this bot; leave empty to use the global selection. Applies only to chats bound to this bot.',
|
|
1042
1006
|
bot_browser: 'Browser settings',
|
|
1043
1007
|
bot_ext_browser: 'External browser permission (when user asks)',
|
|
1044
1008
|
bot_def_browser: 'Default browser',
|
package/src/renderer/index.html
CHANGED
|
@@ -164,7 +164,6 @@
|
|
|
164
164
|
<button class="tab" data-tab="dash" data-i18n="tab_dash">Dashboard</button>
|
|
165
165
|
<button class="tab" data-tab="limits" data-i18n="tab_limits">Limit</button>
|
|
166
166
|
<button class="tab" data-tab="sec" data-i18n="tab_security">Güvenlik</button>
|
|
167
|
-
<button class="tab" data-tab="proxy" data-i18n="tab_proxy">Proxy</button>
|
|
168
167
|
<button class="tab" data-tab="update" data-i18n="tab_update">Güncelleme</button>
|
|
169
168
|
</nav>
|
|
170
169
|
<div class="set-tabs-foot">
|
|
@@ -192,7 +191,6 @@
|
|
|
192
191
|
<div id="tab-dash" class="pane" hidden></div>
|
|
193
192
|
<div id="tab-limits" class="pane" hidden></div>
|
|
194
193
|
<div id="tab-sec" class="pane" hidden></div>
|
|
195
|
-
<div id="tab-proxy" class="pane" hidden></div>
|
|
196
194
|
<div id="tab-update" class="pane" hidden></div>
|
|
197
195
|
<div id="tab-cron" class="pane" hidden>
|
|
198
196
|
<h2 data-i18n="cron_h2">Cron Görevler</h2>
|
|
@@ -281,7 +279,7 @@
|
|
|
281
279
|
<div id="ghBody">
|
|
282
280
|
<section id="ghTrendPane" class="gh-pane">
|
|
283
281
|
<div class="gh-pane-tabs">
|
|
284
|
-
<button class="gh-tab on" data-ghtab="trend">Trend
|
|
282
|
+
<button class="gh-tab on" data-ghtab="trend">Trend Repolar</button>
|
|
285
283
|
<button class="gh-tab" data-ghtab="all">Tüm Repolar</button>
|
|
286
284
|
</div>
|
|
287
285
|
<div class="gh-pane-subline" id="ghTrendSub">— son 2 haftanın yıldız yükselenleri</div>
|