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.
- package/.env.example +7 -0
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/assets/app.ico +0 -0
- package/assets/tray.png +0 -0
- package/bin/beast-agent.js +23 -0
- package/config.example.yaml +26 -0
- package/eng.traineddata +0 -0
- package/package.json +101 -0
- package/scripts/swap-electron.js +40 -0
- package/src/agent/bus.js +384 -0
- package/src/agent/computeruse.js +200 -0
- package/src/agent/config.js +284 -0
- package/src/agent/engine.js +3118 -0
- package/src/agent/kb.js +123 -0
- package/src/agent/llm.js +219 -0
- package/src/agent/logger.js +90 -0
- package/src/agent/memory.js +383 -0
- package/src/agent/pdf.js +20 -0
- package/src/agent/scripts/__pycache__/websearch.cpython-312.pyc +0 -0
- package/src/agent/scripts/news.py +113 -0
- package/src/agent/scripts/websearch.py +225 -0
- package/src/agent/skills.js +522 -0
- package/src/agent/tokens.js +39 -0
- package/src/agent/tools.js +911 -0
- package/src/agent/usage.js +125 -0
- package/src/agent/watchers.js +312 -0
- package/src/agent/watext.js +75 -0
- package/src/agent/whatsapp.js +494 -0
- package/src/cron.js +245 -0
- package/src/main.js +3622 -0
- package/src/preload.js +122 -0
- package/src/renderer/browserPreload.js +73 -0
- package/src/renderer/i18n.js +757 -0
- package/src/renderer/index.html +227 -0
- package/src/renderer/renderer.js +3250 -0
- package/src/renderer/style.css +1559 -0
- package/tests/approval.test.js +56 -0
- package/tests/bg-jobs.test.js +315 -0
- package/tests/bus.test.js +46 -0
- package/tests/computeruse-context.test.js +69 -0
- package/tests/cron.test.js +95 -0
- package/tests/engine.test.js +140 -0
- package/tests/eval.test.js +91 -0
- package/tests/fallout.test.js +188 -0
- package/tests/llm.test.js +56 -0
- package/tests/memory.test.js +33 -0
- package/tests/memoryloop.test.js +26 -0
- package/tests/notegen.test.js +63 -0
- package/tests/owner.test.js +32 -0
- package/tests/python.test.js +75 -0
- package/tests/scenarios.json +81 -0
- package/tests/sessioncode.test.js +50 -0
- package/tests/setup.js +9 -0
- package/tests/tokens.test.js +42 -0
- package/tests/tools.test.js +84 -0
- package/tests/usage.test.js +44 -0
- package/tests/v11.test.js +76 -0
- package/tests/watchers.test.js +206 -0
- package/tests/watext.test.js +53 -0
- package/tests/whatsapp.test.js +103 -0
- 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 {}
|