beast-agent 1.9.0 → 2.0.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/LICENSE +21 -21
- package/README.md +130 -130
- package/bin/beast-agent.js +137 -137
- package/package.json +1 -1
- package/scripts/fix-electron.js +138 -138
- package/scripts/release.js +137 -131
- package/scripts/swap-electron.js +40 -40
- package/src/agent/agentdefs.js +122 -122
- package/src/agent/bots.js +580 -580
- package/src/agent/bus.js +389 -389
- package/src/agent/computeruse.js +200 -200
- package/src/agent/config.js +284 -284
- package/src/agent/discord.js +332 -332
- package/src/agent/engine.js +75 -10
- package/src/agent/kb.js +123 -123
- package/src/agent/llm.js +430 -430
- package/src/agent/logger.js +90 -90
- package/src/agent/mcp.js +427 -427
- package/src/agent/mem0.js +605 -605
- package/src/agent/memory.js +427 -427
- package/src/agent/mqueue.js +124 -124
- package/src/agent/pdf.js +20 -20
- package/src/agent/research.js +133 -133
- package/src/agent/scripts/news.py +113 -113
- package/src/agent/scripts/stealthsearch.py +30 -30
- package/src/agent/scripts/websearch.py +225 -225
- package/src/agent/searxng.js +325 -325
- package/src/agent/seeds/brainstorming/SKILL.md +90 -90
- package/src/agent/seeds/dispatching-parallel-agents/SKILL.md +120 -120
- package/src/agent/seeds/executing-plans/SKILL.md +60 -60
- package/src/agent/seeds/subagent-driven-development/SKILL.md +167 -167
- package/src/agent/seeds/systematic-debugging/SKILL.md +131 -131
- package/src/agent/seeds/test-driven-development/SKILL.md +152 -152
- package/src/agent/seeds/verification-before-completion/SKILL.md +63 -63
- package/src/agent/seeds/writing-plans/SKILL.md +162 -162
- package/src/agent/seeds/writing-skills/SKILL.md +229 -229
- package/src/agent/skills.js +652 -652
- package/src/agent/store.js +378 -378
- package/src/agent/telegram.js +155 -155
- package/src/agent/tokens.js +39 -39
- package/src/agent/usage.js +125 -125
- package/src/agent/watchers.js +312 -312
- package/src/agent/watext.js +80 -80
- package/src/agent/whatsapp.js +555 -555
- package/src/cron.js +255 -255
- package/src/main.js +348 -6
- package/src/preload.js +9 -0
- package/src/renderer/browserPreload.js +73 -73
- package/src/renderer/i18n.js +4 -0
- package/src/renderer/index.html +448 -409
- package/src/renderer/renderer.js +824 -41
- package/src/renderer/style.css +264 -5
package/src/agent/logger.js
CHANGED
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/* Merkezî log sistemi:
|
|
4
|
-
- Günlük dosyalar: %APPDATA%\beast\logs\beast-YYYY-MM-DD.log
|
|
5
|
-
- Bellekte ring buffer (UI'da hızlı gösterim için)
|
|
6
|
-
- 14 günden eski günlük dosyaları saatlik temizlikle silinir
|
|
7
|
-
Kullanım: const log = require('./logger'); log.info('wa', 'bağlandı'); */
|
|
8
|
-
|
|
9
|
-
const fs = require('fs');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
const os = require('os');
|
|
12
|
-
|
|
13
|
-
const ROOT = process.env.APPDATA
|
|
14
|
-
? path.join(process.env.APPDATA, 'beast')
|
|
15
|
-
: path.join(os.homedir(), 'AppData', 'Roaming', 'beast');
|
|
16
|
-
const LOG_DIR = path.join(ROOT, 'logs');
|
|
17
|
-
const KEEP_DAYS = 14;
|
|
18
|
-
const RING_MAX = 1000;
|
|
19
|
-
|
|
20
|
-
const ring = [];
|
|
21
|
-
let lastCleanup = 0;
|
|
22
|
-
|
|
23
|
-
function fileFor(d) {
|
|
24
|
-
const t = d || new Date();
|
|
25
|
-
const p = (n) => String(n).padStart(2, '0');
|
|
26
|
-
return path.join(LOG_DIR, `beast-${t.getFullYear()}-${p(t.getMonth() + 1)}-${p(t.getDate())}.log`);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function cleanup() {
|
|
30
|
-
const now = Date.now();
|
|
31
|
-
if (now - lastCleanup < 60 * 60 * 1000) return;
|
|
32
|
-
lastCleanup = now;
|
|
33
|
-
try {
|
|
34
|
-
for (const f of fs.readdirSync(LOG_DIR)) {
|
|
35
|
-
const m = /^beast-(\d{4})-(\d{2})-(\d{2})\.log$/.exec(f);
|
|
36
|
-
if (!m) continue;
|
|
37
|
-
const age = (now - Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3]))) / 86400000;
|
|
38
|
-
if (age > KEEP_DAYS) { try { fs.unlinkSync(path.join(LOG_DIR, f)); } catch {} }
|
|
39
|
-
}
|
|
40
|
-
} catch {}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function write(level, tag, msg) {
|
|
44
|
-
const line =
|
|
45
|
-
`[${new Date().toISOString()}] [${String(level).toUpperCase()}] [${tag}] ` +
|
|
46
|
-
String(msg == null ? '' : msg).replace(/\r?\n/g, ' | ').slice(0, 4000);
|
|
47
|
-
ring.push(line);
|
|
48
|
-
if (ring.length > RING_MAX) ring.splice(0, ring.length - RING_MAX);
|
|
49
|
-
try {
|
|
50
|
-
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
51
|
-
cleanup();
|
|
52
|
-
fs.appendFileSync(fileFor(), line + '\n');
|
|
53
|
-
} catch {}
|
|
54
|
-
return line;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const info = (tag, msg) => write('info', tag, msg);
|
|
58
|
-
const warn = (tag, msg) => write('warn', tag, msg);
|
|
59
|
-
const error = (tag, msg) => write('error', tag, msg);
|
|
60
|
-
|
|
61
|
-
/* Bugün + dünün son n satırı (UI ve hata raporları için) */
|
|
62
|
-
function tail(n = 300) {
|
|
63
|
-
const lines = [];
|
|
64
|
-
try { lines.push(...fs.readFileSync(fileFor(new Date(Date.now() - 86400000)), 'utf8').split('\n')); } catch {}
|
|
65
|
-
try { lines.push(...fs.readFileSync(fileFor(), 'utf8').split('\n')); } catch {}
|
|
66
|
-
return lines.filter((l) => l.trim()).slice(-Math.max(1, Number(n) || 300));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function dir() {
|
|
70
|
-
try { fs.mkdirSync(LOG_DIR, { recursive: true }); } catch {}
|
|
71
|
-
return LOG_DIR;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function recent() {
|
|
75
|
-
return ring.slice(-200);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function clear() {
|
|
79
|
-
try { ring.length = 0; } catch {}
|
|
80
|
-
/* tail() bugün + dünün dosyasını okur; ikisini de boşalt ki
|
|
81
|
-
UI'daki "Logları Temizle" gerçekten temizlesin */
|
|
82
|
-
try {
|
|
83
|
-
for (const d of [new Date(), new Date(Date.now() - 86400000)]) {
|
|
84
|
-
try { fs.writeFileSync(fileFor(d), ''); } catch {}
|
|
85
|
-
}
|
|
86
|
-
} catch {}
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
module.exports = { info, warn, error, tail, dir, recent, clear, LOG_DIR };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* Merkezî log sistemi:
|
|
4
|
+
- Günlük dosyalar: %APPDATA%\beast\logs\beast-YYYY-MM-DD.log
|
|
5
|
+
- Bellekte ring buffer (UI'da hızlı gösterim için)
|
|
6
|
+
- 14 günden eski günlük dosyaları saatlik temizlikle silinir
|
|
7
|
+
Kullanım: const log = require('./logger'); log.info('wa', 'bağlandı'); */
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const os = require('os');
|
|
12
|
+
|
|
13
|
+
const ROOT = process.env.APPDATA
|
|
14
|
+
? path.join(process.env.APPDATA, 'beast')
|
|
15
|
+
: path.join(os.homedir(), 'AppData', 'Roaming', 'beast');
|
|
16
|
+
const LOG_DIR = path.join(ROOT, 'logs');
|
|
17
|
+
const KEEP_DAYS = 14;
|
|
18
|
+
const RING_MAX = 1000;
|
|
19
|
+
|
|
20
|
+
const ring = [];
|
|
21
|
+
let lastCleanup = 0;
|
|
22
|
+
|
|
23
|
+
function fileFor(d) {
|
|
24
|
+
const t = d || new Date();
|
|
25
|
+
const p = (n) => String(n).padStart(2, '0');
|
|
26
|
+
return path.join(LOG_DIR, `beast-${t.getFullYear()}-${p(t.getMonth() + 1)}-${p(t.getDate())}.log`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function cleanup() {
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
if (now - lastCleanup < 60 * 60 * 1000) return;
|
|
32
|
+
lastCleanup = now;
|
|
33
|
+
try {
|
|
34
|
+
for (const f of fs.readdirSync(LOG_DIR)) {
|
|
35
|
+
const m = /^beast-(\d{4})-(\d{2})-(\d{2})\.log$/.exec(f);
|
|
36
|
+
if (!m) continue;
|
|
37
|
+
const age = (now - Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3]))) / 86400000;
|
|
38
|
+
if (age > KEEP_DAYS) { try { fs.unlinkSync(path.join(LOG_DIR, f)); } catch {} }
|
|
39
|
+
}
|
|
40
|
+
} catch {}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function write(level, tag, msg) {
|
|
44
|
+
const line =
|
|
45
|
+
`[${new Date().toISOString()}] [${String(level).toUpperCase()}] [${tag}] ` +
|
|
46
|
+
String(msg == null ? '' : msg).replace(/\r?\n/g, ' | ').slice(0, 4000);
|
|
47
|
+
ring.push(line);
|
|
48
|
+
if (ring.length > RING_MAX) ring.splice(0, ring.length - RING_MAX);
|
|
49
|
+
try {
|
|
50
|
+
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
51
|
+
cleanup();
|
|
52
|
+
fs.appendFileSync(fileFor(), line + '\n');
|
|
53
|
+
} catch {}
|
|
54
|
+
return line;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const info = (tag, msg) => write('info', tag, msg);
|
|
58
|
+
const warn = (tag, msg) => write('warn', tag, msg);
|
|
59
|
+
const error = (tag, msg) => write('error', tag, msg);
|
|
60
|
+
|
|
61
|
+
/* Bugün + dünün son n satırı (UI ve hata raporları için) */
|
|
62
|
+
function tail(n = 300) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
try { lines.push(...fs.readFileSync(fileFor(new Date(Date.now() - 86400000)), 'utf8').split('\n')); } catch {}
|
|
65
|
+
try { lines.push(...fs.readFileSync(fileFor(), 'utf8').split('\n')); } catch {}
|
|
66
|
+
return lines.filter((l) => l.trim()).slice(-Math.max(1, Number(n) || 300));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function dir() {
|
|
70
|
+
try { fs.mkdirSync(LOG_DIR, { recursive: true }); } catch {}
|
|
71
|
+
return LOG_DIR;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function recent() {
|
|
75
|
+
return ring.slice(-200);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function clear() {
|
|
79
|
+
try { ring.length = 0; } catch {}
|
|
80
|
+
/* tail() bugün + dünün dosyasını okur; ikisini de boşalt ki
|
|
81
|
+
UI'daki "Logları Temizle" gerçekten temizlesin */
|
|
82
|
+
try {
|
|
83
|
+
for (const d of [new Date(), new Date(Date.now() - 86400000)]) {
|
|
84
|
+
try { fs.writeFileSync(fileFor(d), ''); } catch {}
|
|
85
|
+
}
|
|
86
|
+
} catch {}
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
module.exports = { info, warn, error, tail, dir, recent, clear, LOG_DIR };
|