beast-agent 0.19.0 → 0.20.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 +495 -0
- package/src/agent/engine.js +3303 -3118
- package/src/agent/memory.js +419 -383
- package/src/agent/mqueue.js +124 -0
- package/src/agent/skills.js +523 -522
- package/src/agent/store.js +378 -0
- package/src/agent/watext.js +76 -75
- package/src/main.js +4719 -3951
- package/src/preload.js +149 -128
- package/src/renderer/i18n.js +1073 -795
- package/src/renderer/index.html +288 -231
- package/src/renderer/renderer.js +4317 -3356
- package/src/renderer/style.css +1826 -1307
- package/store/skills.json +5 -0
- package/tests/bg-jobs.test.js +4 -3
package/src/preload.js
CHANGED
|
@@ -1,128 +1,149 @@
|
|
|
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, lang) => ipcRenderer.invoke('stt:transcribe', b64, lang),
|
|
48
|
-
sttLangGet: () => ipcRenderer.invoke('stt:lang:get'),
|
|
49
|
-
sttLangSet: (lang) => ipcRenderer.invoke('stt:lang:set', lang),
|
|
50
|
-
updateStatus: () => ipcRenderer.invoke('update:status'),
|
|
51
|
-
updateCheck: () => ipcRenderer.invoke('update:check'),
|
|
52
|
-
updateInstall: () => ipcRenderer.invoke('update:install'),
|
|
53
|
-
updateSetAuto: (cfg) => ipcRenderer.invoke('update:setAuto', cfg),
|
|
54
|
-
setModel: (sel) => ipcRenderer.invoke('model:set', sel),
|
|
55
|
-
setRoleModels: (map) => ipcRenderer.invoke('model:role', map),
|
|
56
|
-
deleteModel: (sel) => ipcRenderer.invoke('model:delete', sel),
|
|
57
|
-
restoreModel: (sel) => ipcRenderer.invoke('model:restore', sel),
|
|
58
|
-
setVisibleModels: (list) => ipcRenderer.invoke('visible-models:set', list),
|
|
59
|
-
refreshModels: () => ipcRenderer.invoke('models:refresh'),
|
|
60
|
-
setTheme: (t) => ipcRenderer.invoke('theme:set', t),
|
|
61
|
-
toggleBrowser: () => ipcRenderer.invoke('browser:toggle'),
|
|
62
|
-
browserShownGet: () => ipcRenderer.invoke('browser:shown:get'),
|
|
63
|
-
browserShownSet: (v) => ipcRenderer.invoke('browser:shown:set', v),
|
|
64
|
-
terminalToggle: () => ipcRenderer.invoke('terminal:toggle'),
|
|
65
|
-
terminalRun: (cmd, shell) => ipcRenderer.invoke('terminal:run', { cmd, shell }),
|
|
66
|
-
terminalStop: () => ipcRenderer.invoke('terminal:stop'),
|
|
67
|
-
thinkSet: (v) => ipcRenderer.invoke('think:set', v),
|
|
68
|
-
exaGet: () => ipcRenderer.invoke('exa:get'),
|
|
69
|
-
exaSet: (key) => ipcRenderer.invoke('exa:set', key),
|
|
70
|
-
exaClear: () => ipcRenderer.invoke('exa:clear'),
|
|
71
|
-
tinyfishGet: () => ipcRenderer.invoke('tinyfish:get'),
|
|
72
|
-
tinyfishSet: (key) => ipcRenderer.invoke('tinyfish:set', key),
|
|
73
|
-
tinyfishClear: () => ipcRenderer.invoke('tinyfish:clear'),
|
|
74
|
-
browserNavigate: (url) => ipcRenderer.invoke('browser:navigate', url),
|
|
75
|
-
browserCtrl: (action) => ipcRenderer.invoke('browser:ctrl', action),
|
|
76
|
-
browserSetWidth: (w) => ipcRenderer.invoke('browser:setWidth', w),
|
|
77
|
-
browserSetIgnoreMouse: (flag) => ipcRenderer.invoke('browser:setIgnoreMouse', flag),
|
|
78
|
-
browserScreenshot: () => ipcRenderer.invoke('browser:screenshot'),
|
|
79
|
-
cronList: () => ipcRenderer.invoke('cron:list'),
|
|
80
|
-
cronAdd: (job) => ipcRenderer.invoke('cron:add', job),
|
|
81
|
-
cronUpdate: (id, patch) => ipcRenderer.invoke('cron:update', { id, patch }),
|
|
82
|
-
cronDelete: (id) => ipcRenderer.invoke('cron:delete', id),
|
|
83
|
-
cronToggle: (id) => ipcRenderer.invoke('cron:toggle', id),
|
|
84
|
-
cronRunNow: (id) => ipcRenderer.invoke('cron:runNow', id),
|
|
85
|
-
|
|
86
|
-
watchersList: () => ipcRenderer.invoke('watchers:list'),
|
|
87
|
-
|
|
88
|
-
watchersAdd: (input) => ipcRenderer.invoke('watchers:add', input),
|
|
89
|
-
|
|
90
|
-
watchersRemove: (id) => ipcRenderer.invoke('watchers:remove', id),
|
|
91
|
-
|
|
92
|
-
watchersToggle: (id) => ipcRenderer.invoke('watchers:toggle', id),
|
|
93
|
-
|
|
94
|
-
providerKeys: () => ipcRenderer.invoke('providers:keys'),
|
|
95
|
-
|
|
96
|
-
openPath: (p) => ipcRenderer.invoke('shell:openPath', p),
|
|
97
|
-
|
|
98
|
-
showItemInFolder: (p) => ipcRenderer.invoke('shell:showItem', p),
|
|
99
|
-
setCustomProviders: (list) => ipcRenderer.invoke('custom:set', list),
|
|
100
|
-
fetchModels: (opts) => ipcRenderer.invoke('custom:fetchModels', opts),
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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, lang) => ipcRenderer.invoke('stt:transcribe', b64, lang),
|
|
48
|
+
sttLangGet: () => ipcRenderer.invoke('stt:lang:get'),
|
|
49
|
+
sttLangSet: (lang) => ipcRenderer.invoke('stt:lang:set', lang),
|
|
50
|
+
updateStatus: () => ipcRenderer.invoke('update:status'),
|
|
51
|
+
updateCheck: () => ipcRenderer.invoke('update:check'),
|
|
52
|
+
updateInstall: () => ipcRenderer.invoke('update:install'),
|
|
53
|
+
updateSetAuto: (cfg) => ipcRenderer.invoke('update:setAuto', cfg),
|
|
54
|
+
setModel: (sel) => ipcRenderer.invoke('model:set', sel),
|
|
55
|
+
setRoleModels: (map) => ipcRenderer.invoke('model:role', map),
|
|
56
|
+
deleteModel: (sel) => ipcRenderer.invoke('model:delete', sel),
|
|
57
|
+
restoreModel: (sel) => ipcRenderer.invoke('model:restore', sel),
|
|
58
|
+
setVisibleModels: (list) => ipcRenderer.invoke('visible-models:set', list),
|
|
59
|
+
refreshModels: () => ipcRenderer.invoke('models:refresh'),
|
|
60
|
+
setTheme: (t) => ipcRenderer.invoke('theme:set', t),
|
|
61
|
+
toggleBrowser: () => ipcRenderer.invoke('browser:toggle'),
|
|
62
|
+
browserShownGet: () => ipcRenderer.invoke('browser:shown:get'),
|
|
63
|
+
browserShownSet: (v) => ipcRenderer.invoke('browser:shown:set', v),
|
|
64
|
+
terminalToggle: () => ipcRenderer.invoke('terminal:toggle'),
|
|
65
|
+
terminalRun: (cmd, shell) => ipcRenderer.invoke('terminal:run', { cmd, shell }),
|
|
66
|
+
terminalStop: () => ipcRenderer.invoke('terminal:stop'),
|
|
67
|
+
thinkSet: (v) => ipcRenderer.invoke('think:set', v),
|
|
68
|
+
exaGet: () => ipcRenderer.invoke('exa:get'),
|
|
69
|
+
exaSet: (key) => ipcRenderer.invoke('exa:set', key),
|
|
70
|
+
exaClear: () => ipcRenderer.invoke('exa:clear'),
|
|
71
|
+
tinyfishGet: () => ipcRenderer.invoke('tinyfish:get'),
|
|
72
|
+
tinyfishSet: (key) => ipcRenderer.invoke('tinyfish:set', key),
|
|
73
|
+
tinyfishClear: () => ipcRenderer.invoke('tinyfish:clear'),
|
|
74
|
+
browserNavigate: (url) => ipcRenderer.invoke('browser:navigate', url),
|
|
75
|
+
browserCtrl: (action) => ipcRenderer.invoke('browser:ctrl', action),
|
|
76
|
+
browserSetWidth: (w) => ipcRenderer.invoke('browser:setWidth', w),
|
|
77
|
+
browserSetIgnoreMouse: (flag) => ipcRenderer.invoke('browser:setIgnoreMouse', flag),
|
|
78
|
+
browserScreenshot: () => ipcRenderer.invoke('browser:screenshot'),
|
|
79
|
+
cronList: () => ipcRenderer.invoke('cron:list'),
|
|
80
|
+
cronAdd: (job) => ipcRenderer.invoke('cron:add', job),
|
|
81
|
+
cronUpdate: (id, patch) => ipcRenderer.invoke('cron:update', { id, patch }),
|
|
82
|
+
cronDelete: (id) => ipcRenderer.invoke('cron:delete', id),
|
|
83
|
+
cronToggle: (id) => ipcRenderer.invoke('cron:toggle', id),
|
|
84
|
+
cronRunNow: (id) => ipcRenderer.invoke('cron:runNow', id),
|
|
85
|
+
|
|
86
|
+
watchersList: () => ipcRenderer.invoke('watchers:list'),
|
|
87
|
+
|
|
88
|
+
watchersAdd: (input) => ipcRenderer.invoke('watchers:add', input),
|
|
89
|
+
|
|
90
|
+
watchersRemove: (id) => ipcRenderer.invoke('watchers:remove', id),
|
|
91
|
+
|
|
92
|
+
watchersToggle: (id) => ipcRenderer.invoke('watchers:toggle', id),
|
|
93
|
+
|
|
94
|
+
providerKeys: () => ipcRenderer.invoke('providers:keys'),
|
|
95
|
+
|
|
96
|
+
openPath: (p) => ipcRenderer.invoke('shell:openPath', p),
|
|
97
|
+
|
|
98
|
+
showItemInFolder: (p) => ipcRenderer.invoke('shell:showItem', p),
|
|
99
|
+
setCustomProviders: (list) => ipcRenderer.invoke('custom:set', list),
|
|
100
|
+
fetchModels: (opts) => ipcRenderer.invoke('custom:fetchModels', opts),
|
|
101
|
+
builtinProviders: () => ipcRenderer.invoke('providers:builtin'),
|
|
102
|
+
zenOneClick: () => ipcRenderer.invoke('zen:oneClick'),
|
|
103
|
+
waStart: () => ipcRenderer.invoke('wa:start'),
|
|
104
|
+
waStop: () => ipcRenderer.invoke('wa:stop'),
|
|
105
|
+
waReset: () => ipcRenderer.invoke('wa:reset'),
|
|
106
|
+
waStatus: () => ipcRenderer.invoke('wa:status'),
|
|
107
|
+
waGetAllow: () => ipcRenderer.invoke('wa:allow:get'),
|
|
108
|
+
waQueueGet: () => ipcRenderer.invoke('wa:queue:get'),
|
|
109
|
+
waSetAllow: (list) => ipcRenderer.invoke('wa:allow:set', list),
|
|
110
|
+
setWaLockdown: (v) => ipcRenderer.invoke('wa:lockdown:set', v),
|
|
111
|
+
waGetTts: () => ipcRenderer.invoke('wa:tts:get'),
|
|
112
|
+
waSetTts: (cfg) => ipcRenderer.invoke('wa:tts:set', cfg),
|
|
113
|
+
waGetGroups: () => ipcRenderer.invoke('wa:groups:get'),
|
|
114
|
+
waSetGroups: (cfg) => ipcRenderer.invoke('wa:groups:set', cfg),
|
|
115
|
+
getUsage: () => ipcRenderer.invoke('usage:get'),
|
|
116
|
+
resetUsage: () => ipcRenderer.invoke('usage:reset'),
|
|
117
|
+
createBackup: () => ipcRenderer.invoke('backup:create'),
|
|
118
|
+
restoreBackup: () => ipcRenderer.invoke('backup:restore'),
|
|
119
|
+
setupStatus: () => ipcRenderer.invoke('setup:status'),
|
|
120
|
+
setupSaveProvider: (p) => ipcRenderer.invoke('setup:saveProvider', p),
|
|
121
|
+
setupComplete: (o) => ipcRenderer.invoke('setup:complete', o),
|
|
122
|
+
setupSkip: () => ipcRenderer.invoke('setup:skip'),
|
|
123
|
+
whereWasIGet: () => ipcRenderer.invoke('wherewasi:get'),
|
|
124
|
+
whereWasISet: (cfg) => ipcRenderer.invoke('wherewasi:set', cfg),
|
|
125
|
+
getEmail: () => ipcRenderer.invoke('email:get'),
|
|
126
|
+
setEmail: (cfg) => ipcRenderer.invoke('email:set', cfg),
|
|
127
|
+
captureScreen: () => ipcRenderer.invoke('screen:capture'),
|
|
128
|
+
waListSessions: () => ipcRenderer.invoke('wa:sessions'),
|
|
129
|
+
botsList: () => ipcRenderer.invoke('bots:list'),
|
|
130
|
+
botsAdd: (input) => ipcRenderer.invoke('bots:add', input),
|
|
131
|
+
botsUpdate: (id, patch) => ipcRenderer.invoke('bots:update', { id, patch }),
|
|
132
|
+
botsRemove: (id) => ipcRenderer.invoke('bots:remove', id),
|
|
133
|
+
botsStats: () => ipcRenderer.invoke('bots:stats'),
|
|
134
|
+
botsActiveGet: () => ipcRenderer.invoke('bots:active:get'),
|
|
135
|
+
botsActivate: (id) => ipcRenderer.invoke('bots:activate', id),
|
|
136
|
+
botsMemGet: (id) => ipcRenderer.invoke('bots:memory:get', id),
|
|
137
|
+
botsMemSet: (id, file, content) => ipcRenderer.invoke('bots:memory:set', { id, file, content }),
|
|
138
|
+
botsLogGet: (id) => ipcRenderer.invoke('bots:log:get', id),
|
|
139
|
+
storeList: () => ipcRenderer.invoke('store:list'),
|
|
140
|
+
storeSetIdentity: (p) => ipcRenderer.invoke('store:identity:set', p),
|
|
141
|
+
storePick: () => ipcRenderer.invoke('store:pick'),
|
|
142
|
+
storeCommit: (p) => ipcRenderer.invoke('store:commit', p),
|
|
143
|
+
storeInstall: (id) => ipcRenderer.invoke('store:install', id),
|
|
144
|
+
storeLike: (id) => ipcRenderer.invoke('store:like', id),
|
|
145
|
+
storeRemove: (id) => ipcRenderer.invoke('store:remove', id),
|
|
146
|
+
storeExport: (id) => ipcRenderer.invoke('store:export', id),
|
|
147
|
+
onWaEvent: (cb) => ipcRenderer.on('wa:event', (_e, ev) => cb(ev)),
|
|
148
|
+
onEvent: (cb) => ipcRenderer.on('agent:event', (_e, ev) => cb(ev)),
|
|
149
|
+
});
|