beast-agent 0.15.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.
Files changed (62) hide show
  1. package/.env.example +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +94 -0
  4. package/assets/app.ico +0 -0
  5. package/assets/tray.png +0 -0
  6. package/bin/beast-agent.js +23 -0
  7. package/config.example.yaml +26 -0
  8. package/eng.traineddata +0 -0
  9. package/package.json +101 -0
  10. package/scripts/swap-electron.js +40 -0
  11. package/src/agent/bus.js +384 -0
  12. package/src/agent/computeruse.js +200 -0
  13. package/src/agent/config.js +284 -0
  14. package/src/agent/engine.js +3118 -0
  15. package/src/agent/kb.js +123 -0
  16. package/src/agent/llm.js +219 -0
  17. package/src/agent/logger.js +90 -0
  18. package/src/agent/memory.js +383 -0
  19. package/src/agent/pdf.js +20 -0
  20. package/src/agent/scripts/__pycache__/websearch.cpython-312.pyc +0 -0
  21. package/src/agent/scripts/news.py +113 -0
  22. package/src/agent/scripts/websearch.py +225 -0
  23. package/src/agent/skills.js +522 -0
  24. package/src/agent/tokens.js +39 -0
  25. package/src/agent/tools.js +911 -0
  26. package/src/agent/usage.js +125 -0
  27. package/src/agent/watchers.js +312 -0
  28. package/src/agent/watext.js +75 -0
  29. package/src/agent/whatsapp.js +494 -0
  30. package/src/cron.js +245 -0
  31. package/src/main.js +3622 -0
  32. package/src/preload.js +122 -0
  33. package/src/renderer/browserPreload.js +73 -0
  34. package/src/renderer/i18n.js +757 -0
  35. package/src/renderer/index.html +227 -0
  36. package/src/renderer/renderer.js +3250 -0
  37. package/src/renderer/style.css +1559 -0
  38. package/tests/approval.test.js +56 -0
  39. package/tests/bg-jobs.test.js +315 -0
  40. package/tests/bus.test.js +46 -0
  41. package/tests/computeruse-context.test.js +69 -0
  42. package/tests/cron.test.js +95 -0
  43. package/tests/engine.test.js +140 -0
  44. package/tests/eval.test.js +91 -0
  45. package/tests/fallout.test.js +188 -0
  46. package/tests/llm.test.js +56 -0
  47. package/tests/memory.test.js +33 -0
  48. package/tests/memoryloop.test.js +26 -0
  49. package/tests/notegen.test.js +63 -0
  50. package/tests/owner.test.js +32 -0
  51. package/tests/python.test.js +75 -0
  52. package/tests/scenarios.json +81 -0
  53. package/tests/sessioncode.test.js +50 -0
  54. package/tests/setup.js +9 -0
  55. package/tests/tokens.test.js +42 -0
  56. package/tests/tools.test.js +84 -0
  57. package/tests/usage.test.js +44 -0
  58. package/tests/v11.test.js +76 -0
  59. package/tests/watchers.test.js +206 -0
  60. package/tests/watext.test.js +53 -0
  61. package/tests/whatsapp.test.js +103 -0
  62. package/tests/wherewasi.test.js +40 -0
package/src/preload.js ADDED
@@ -0,0 +1,122 @@
1
+ 'use strict';
2
+
3
+ const { contextBridge, ipcRenderer } = require('electron');
4
+
5
+ contextBridge.exposeInMainWorld('beast', {
6
+ getState: () => ipcRenderer.invoke('app:state'),
7
+ logsGet: () => ipcRenderer.invoke('logs:get'),
8
+ logsClear: () => ipcRenderer.invoke('logs:clear'),
9
+ listSessions: () => ipcRenderer.invoke('sessions:list'),
10
+ createSession: () => ipcRenderer.invoke('sessions:create'),
11
+ openSession: (id) => ipcRenderer.invoke('sessions:open', id),
12
+ deleteSession: (id) => ipcRenderer.invoke('sessions:delete', id),
13
+ send: (sessionId, text) => ipcRenderer.invoke('agent:send', { sessionId, text }),
14
+ interrupt: (sessionId) => ipcRenderer.invoke('agent:interrupt', sessionId),
15
+ setModel: (sel) => ipcRenderer.invoke('model:set', sel),
16
+ pickWorkspace: () => ipcRenderer.invoke('cwd:set'),
17
+ openExternal: (url) => ipcRenderer.send('open-external', url),
18
+ getMemory: () => ipcRenderer.invoke('memory:get'),
19
+ agentsList: () => ipcRenderer.invoke('agents:list'),
20
+ agentsDetail: (id) => ipcRenderer.invoke('agents:detail', id),
21
+ agentsCancel: (id) => ipcRenderer.invoke('agents:cancel', id),
22
+ getCeoMode: () => ipcRenderer.invoke('ceo:get'),
23
+ setCeoMode: (v) => ipcRenderer.invoke('ceo:set', v),
24
+ listNotes: () => ipcRenderer.invoke('notes:list'),
25
+ clearNotes: (id) => ipcRenderer.invoke('notes:clear', id),
26
+ saveMemory: (file, content) => ipcRenderer.invoke('memory:save', { file, content }),
27
+ listSkills: () => ipcRenderer.invoke('skills:list'),
28
+ openSkillsFolder: () => ipcRenderer.invoke('skills:openFolder'),
29
+ draftsList: () => ipcRenderer.invoke('skills:drafts:list'),
30
+ draftAccept: (id) => ipcRenderer.invoke('skills:drafts:accept', id),
31
+ draftDrop: (id) => ipcRenderer.invoke('skills:drafts:drop', id),
32
+ rulesGet: () => ipcRenderer.invoke('rules:get'),
33
+ ruleAdd: (t) => ipcRenderer.invoke('rules:add', t),
34
+ ruleRemove: (id) => ipcRenderer.invoke('rules:remove', id),
35
+ eventsGetConfig: () => ipcRenderer.invoke('events:config:get'),
36
+ eventsSetConfig: (cfg) => ipcRenderer.invoke('events:config:set', cfg),
37
+ eventsSubs: () => ipcRenderer.invoke('events:subs:list'),
38
+ eventUnsub: (id) => ipcRenderer.invoke('events:subs:remove', id),
39
+ getSettings: () => ipcRenderer.invoke('settings:get'),
40
+ getFallout: () => ipcRenderer.invoke('fallout:get'),
41
+ setFallout: (cfg) => ipcRenderer.invoke('fallout:set', cfg),
42
+ getLimits: () => ipcRenderer.invoke('limits:get'),
43
+ setLimits: (cfg) => ipcRenderer.invoke('limits:set', cfg),
44
+ secGet: () => ipcRenderer.invoke('sec:get'),
45
+ secSet: (cfg) => ipcRenderer.invoke('sec:set', cfg),
46
+ approvalRespond: (id, ok, always) => ipcRenderer.invoke('approval:respond', { id, ok, always }),
47
+ sttTranscribe: (b64) => ipcRenderer.invoke('stt:transcribe', b64),
48
+ setModel: (sel) => ipcRenderer.invoke('model:set', sel),
49
+ setRoleModels: (map) => ipcRenderer.invoke('model:role', map),
50
+ deleteModel: (sel) => ipcRenderer.invoke('model:delete', sel),
51
+ restoreModel: (sel) => ipcRenderer.invoke('model:restore', sel),
52
+ setVisibleModels: (list) => ipcRenderer.invoke('visible-models:set', list),
53
+ refreshModels: () => ipcRenderer.invoke('models:refresh'),
54
+ setTheme: (t) => ipcRenderer.invoke('theme:set', t),
55
+ toggleBrowser: () => ipcRenderer.invoke('browser:toggle'),
56
+ browserShownGet: () => ipcRenderer.invoke('browser:shown:get'),
57
+ browserShownSet: (v) => ipcRenderer.invoke('browser:shown:set', v),
58
+ terminalToggle: () => ipcRenderer.invoke('terminal:toggle'),
59
+ terminalRun: (cmd, shell) => ipcRenderer.invoke('terminal:run', { cmd, shell }),
60
+ terminalStop: () => ipcRenderer.invoke('terminal:stop'),
61
+ thinkSet: (v) => ipcRenderer.invoke('think:set', v),
62
+ exaGet: () => ipcRenderer.invoke('exa:get'),
63
+ exaSet: (key) => ipcRenderer.invoke('exa:set', key),
64
+ exaClear: () => ipcRenderer.invoke('exa:clear'),
65
+ tinyfishGet: () => ipcRenderer.invoke('tinyfish:get'),
66
+ tinyfishSet: (key) => ipcRenderer.invoke('tinyfish:set', key),
67
+ tinyfishClear: () => ipcRenderer.invoke('tinyfish:clear'),
68
+ browserNavigate: (url) => ipcRenderer.invoke('browser:navigate', url),
69
+ browserCtrl: (action) => ipcRenderer.invoke('browser:ctrl', action),
70
+ browserSetWidth: (w) => ipcRenderer.invoke('browser:setWidth', w),
71
+ browserSetIgnoreMouse: (flag) => ipcRenderer.invoke('browser:setIgnoreMouse', flag),
72
+ browserScreenshot: () => ipcRenderer.invoke('browser:screenshot'),
73
+ cronList: () => ipcRenderer.invoke('cron:list'),
74
+ cronAdd: (job) => ipcRenderer.invoke('cron:add', job),
75
+ cronUpdate: (id, patch) => ipcRenderer.invoke('cron:update', { id, patch }),
76
+ cronDelete: (id) => ipcRenderer.invoke('cron:delete', id),
77
+ cronToggle: (id) => ipcRenderer.invoke('cron:toggle', id),
78
+ cronRunNow: (id) => ipcRenderer.invoke('cron:runNow', id),
79
+
80
+ watchersList: () => ipcRenderer.invoke('watchers:list'),
81
+
82
+ watchersAdd: (input) => ipcRenderer.invoke('watchers:add', input),
83
+
84
+ watchersRemove: (id) => ipcRenderer.invoke('watchers:remove', id),
85
+
86
+ watchersToggle: (id) => ipcRenderer.invoke('watchers:toggle', id),
87
+
88
+ providerKeys: () => ipcRenderer.invoke('providers:keys'),
89
+
90
+ openPath: (p) => ipcRenderer.invoke('shell:openPath', p),
91
+
92
+ showItemInFolder: (p) => ipcRenderer.invoke('shell:showItem', p),
93
+ setCustomProviders: (list) => ipcRenderer.invoke('custom:set', list),
94
+ fetchModels: (opts) => ipcRenderer.invoke('custom:fetchModels', opts),
95
+ waStart: () => ipcRenderer.invoke('wa:start'),
96
+ waStop: () => ipcRenderer.invoke('wa:stop'),
97
+ waReset: () => ipcRenderer.invoke('wa:reset'),
98
+ waStatus: () => ipcRenderer.invoke('wa:status'),
99
+ waGetAllow: () => ipcRenderer.invoke('wa:allow:get'),
100
+ waSetAllow: (list) => ipcRenderer.invoke('wa:allow:set', list),
101
+ setWaLockdown: (v) => ipcRenderer.invoke('wa:lockdown:set', v),
102
+ waGetTts: () => ipcRenderer.invoke('wa:tts:get'),
103
+ waSetTts: (cfg) => ipcRenderer.invoke('wa:tts:set', cfg),
104
+ waGetGroups: () => ipcRenderer.invoke('wa:groups:get'),
105
+ waSetGroups: (cfg) => ipcRenderer.invoke('wa:groups:set', cfg),
106
+ getUsage: () => ipcRenderer.invoke('usage:get'),
107
+ resetUsage: () => ipcRenderer.invoke('usage:reset'),
108
+ createBackup: () => ipcRenderer.invoke('backup:create'),
109
+ restoreBackup: () => ipcRenderer.invoke('backup:restore'),
110
+ setupStatus: () => ipcRenderer.invoke('setup:status'),
111
+ setupSaveProvider: (p) => ipcRenderer.invoke('setup:saveProvider', p),
112
+ setupComplete: (o) => ipcRenderer.invoke('setup:complete', o),
113
+ setupSkip: () => ipcRenderer.invoke('setup:skip'),
114
+ whereWasIGet: () => ipcRenderer.invoke('wherewasi:get'),
115
+ whereWasISet: (cfg) => ipcRenderer.invoke('wherewasi:set', cfg),
116
+ getEmail: () => ipcRenderer.invoke('email:get'),
117
+ setEmail: (cfg) => ipcRenderer.invoke('email:set', cfg),
118
+ captureScreen: () => ipcRenderer.invoke('screen:capture'),
119
+ waListSessions: () => ipcRenderer.invoke('wa:sessions'),
120
+ onWaEvent: (cb) => ipcRenderer.on('wa:event', (_e, ev) => cb(ev)),
121
+ onEvent: (cb) => ipcRenderer.on('agent:event', (_e, ev) => cb(ev)),
122
+ });
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ /* Dahili tarayıcı preload — Google girişinin "bu tarayıcı veya uygulama
4
+ güvenli olmayabilir" engelini aşar. Electron'da eksik olan gerçek Chrome
5
+ imzaları (window.chrome, navigator.plugins/mimeTypes/languages, webdriver)
6
+ ana dünyada (main world) tamamlanır. Her belge yüklemesinde tekrar koşar. */
7
+
8
+ const { webFrame } = require('electron');
9
+
10
+ const PATCH = `(function () {
11
+ try {
12
+ try { Object.defineProperty(navigator, 'webdriver', { get: function () { return false; } }); } catch (e) {}
13
+ try { Object.defineProperty(navigator, 'languages', { get: function () { return ['tr-TR', 'tr', 'en-US', 'en']; } }); } catch (e) {}
14
+
15
+ if (!window.chrome) { try { window.chrome = {}; } catch (e) {} }
16
+ if (!window.chrome.app) {
17
+ window.chrome.app = {
18
+ isInstalled: false,
19
+ InstallState: { DISABLED: 'disabled', INSTALLED: 'installed', NOT_INSTALLED: 'not_installed' },
20
+ RunningState: { CANNOT_RUN: 'cannot_run', READY_TO_RUN: 'ready_to_run', RUNNING: 'running' },
21
+ getDetails: function () {},
22
+ installState: function () { return 'not_installed'; },
23
+ };
24
+ }
25
+ if (!window.chrome.runtime) {
26
+ window.chrome.runtime = {
27
+ PlatformOs: { MAC: 'mac', WIN: 'win', ANDROID: 'android', CROS: 'cros', LINUX: 'linux', OPENBSD: 'openbsd' },
28
+ PlatformArch: { ARM: 'arm', X86_32: 'x86-32', X86_64: 'x86-64', MIPS: 'mips', MIPS64: 'mips64' },
29
+ PlatformNaclArch: { ARM: 'arm', X86_32: 'x86-32', X86_64: 'x86-64', MIPS: 'mips', MIPS64: 'mips64' },
30
+ RequestUpdateCheckStatus: { NO_UPDATE: 'no_update', THROTTLED: 'throttled', UPDATE_AVAILABLE: 'update_available' },
31
+ OnInstalledReason: { CHROME_UPDATE: 'chrome_update', INSTALL: 'install', SHARED_MODULE_UPDATE: 'shared_module_update', UPDATE: 'update' },
32
+ OnRestartRequiredReason: { APP_UPDATE: 'app_update', OS_UPDATE: 'os_update', PERIODIC: 'periodic' },
33
+ connect: function () {},
34
+ sendMessage: function () {},
35
+ };
36
+ }
37
+
38
+ if (navigator.plugins && navigator.plugins.length === 0) {
39
+ var pluginData = [
40
+ { name: 'PDF Viewer', description: 'Portable Document Format', filename: 'internal-pdf-viewer', type: 'application/pdf', suffixes: 'pdf' },
41
+ { name: 'Chrome PDF Viewer', description: 'Portable Document Format', filename: 'internal-pdf-viewer', type: 'application/pdf', suffixes: 'pdf' },
42
+ { name: 'Chromium PDF Viewer', description: 'Portable Document Format', filename: 'internal-pdf-viewer', type: 'application/pdf', suffixes: 'pdf' },
43
+ { name: 'Microsoft Edge PDF Viewer', description: 'Portable Document Format', filename: 'internal-pdf-viewer', type: 'application/pdf', suffixes: 'pdf' },
44
+ { name: 'WebKit built-in PDF', description: 'Portable Document Format', filename: 'internal-pdf-viewer', type: 'application/pdf', suffixes: 'pdf' },
45
+ ];
46
+ var plugins = {
47
+ length: pluginData.length,
48
+ item: function (i) { return this[i] || null; },
49
+ namedItem: function (n) { for (var k in this) { if (this[k] && this[k].name === n) return this[k]; } return null; },
50
+ refresh: function () {},
51
+ };
52
+ pluginData.forEach(function (p, i) {
53
+ var pl = { name: p.name, description: p.description, filename: p.filename, length: 1 };
54
+ pl[0] = { type: p.type, suffixes: p.suffixes, description: p.description, enabledPlugin: pl };
55
+ plugins[i] = pl;
56
+ });
57
+ try { Object.defineProperty(navigator, 'plugins', { get: function () { return plugins; } }); } catch (e) {}
58
+ try {
59
+ var mimes = {
60
+ length: pluginData.length,
61
+ item: function (i) { return (plugins[i] && plugins[i][0]) || null; },
62
+ namedItem: function (n) { for (var k in this) { if (this[k] && this[k].type === n) return this[k]; } return null; },
63
+ };
64
+ pluginData.forEach(function (p, i) { mimes[p.type] = plugins[i] && plugins[i][0]; });
65
+ Object.defineProperty(navigator, 'mimeTypes', { get: function () { return mimes; } });
66
+ } catch (e) {}
67
+ }
68
+ } catch (e) {}
69
+ })();`;
70
+
71
+ try {
72
+ webFrame.executeJavaScript(PATCH).catch(() => {});
73
+ } catch {}