beast-agent 2.64.1 → 2.64.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/package.json +1 -1
- package/src/agent/computeragent.js +27 -8
- package/src/agent/engine.js +44 -1
package/package.json
CHANGED
|
@@ -25,19 +25,34 @@ match the goal; prefer specific, unique labels over generic words. Choose only a
|
|
|
25
25
|
|
|
26
26
|
const OPERATION_LABELS = {
|
|
27
27
|
CLICK: 'Click an OCR text line on the screen (button, field, link, menu item).',
|
|
28
|
-
|
|
28
|
+
DOUBLE_CLICK: 'Double-click an OCR text line (open file/folder, select word).',
|
|
29
|
+
RIGHT_CLICK: 'Right-click an OCR text line (context menu).',
|
|
30
|
+
TYPE_TEXT: 'Type text into the control focused by the most recent click. A small LLM supplies the value.',
|
|
29
31
|
DONE: 'Every requirement is visibly satisfied on screen.',
|
|
30
32
|
BLOCKED: 'No supported operation can progress.',
|
|
31
33
|
};
|
|
32
34
|
|
|
35
|
+
const LINE_OPS = new Set(['CLICK', 'DOUBLE_CLICK', 'RIGHT_CLICK']);
|
|
36
|
+
|
|
33
37
|
const KEYS = {
|
|
34
38
|
PRESS_ENTER: { label: 'Press Enter (submit / confirm)', combo: 'enter' },
|
|
35
39
|
PRESS_TAB: { label: 'Press Tab (move to next field)', combo: 'tab' },
|
|
36
40
|
PRESS_ESC: { label: 'Press Escape (close popup / cancel)', combo: 'esc' },
|
|
37
41
|
PRESS_DOWN: { label: 'Press Arrow Down (list / dropdown)', combo: 'down' },
|
|
38
42
|
PRESS_UP: { label: 'Press Arrow Up (list / dropdown)', combo: 'up' },
|
|
43
|
+
PRESS_LEFT: { label: 'Press Arrow Left', combo: 'left' },
|
|
44
|
+
PRESS_RIGHT: { label: 'Press Arrow Right', combo: 'right' },
|
|
39
45
|
PRESS_BACKSPACE: { label: 'Press Backspace (delete one character)', combo: 'backspace' },
|
|
46
|
+
PRESS_DELETE: { label: 'Press Delete', combo: 'delete' },
|
|
40
47
|
SELECT_ALL: { label: 'Select all text in the focused field (Ctrl+A)', combo: 'ctrl+a' },
|
|
48
|
+
CTRL_S: { label: 'Save (Ctrl+S)', combo: 'ctrl+s' },
|
|
49
|
+
CTRL_Z: { label: 'Undo (Ctrl+Z)', combo: 'ctrl+z' },
|
|
50
|
+
CTRL_C: { label: 'Copy (Ctrl+C)', combo: 'ctrl+c' },
|
|
51
|
+
CTRL_V: { label: 'Paste (Ctrl+V)', combo: 'ctrl+v' },
|
|
52
|
+
CTRL_X: { label: 'Cut (Ctrl+X)', combo: 'ctrl+x' },
|
|
53
|
+
CTRL_F: { label: 'Find (Ctrl+F)', combo: 'ctrl+f' },
|
|
54
|
+
ALT_TAB: { label: 'Switch window (Alt+Tab)', combo: 'alt+tab' },
|
|
55
|
+
ALT_F4: { label: 'Close window (Alt+F4)', combo: 'alt+f4' },
|
|
41
56
|
};
|
|
42
57
|
|
|
43
58
|
const SCROLLS = {
|
|
@@ -77,7 +92,11 @@ function lineTargets(lines) {
|
|
|
77
92
|
}
|
|
78
93
|
|
|
79
94
|
function operationSet(clickTargets, focusedLabel) {
|
|
80
|
-
const operations = {
|
|
95
|
+
const operations = {
|
|
96
|
+
CLICK: OPERATION_LABELS.CLICK,
|
|
97
|
+
DOUBLE_CLICK: OPERATION_LABELS.DOUBLE_CLICK,
|
|
98
|
+
RIGHT_CLICK: OPERATION_LABELS.RIGHT_CLICK,
|
|
99
|
+
};
|
|
81
100
|
if (focusedLabel) operations.TYPE_TEXT = OPERATION_LABELS.TYPE_TEXT;
|
|
82
101
|
for (const [key, value] of Object.entries(KEYS)) operations[key] = value.label;
|
|
83
102
|
for (const [key, value] of Object.entries(SCROLLS)) operations[key] = value.label + ' (screen)';
|
|
@@ -139,7 +158,7 @@ async function choose(deps, page, goal, history, focusedLabel) {
|
|
|
139
158
|
verifyAnswer && Number.isFinite(Number(verifyAnswer.noul)) ? Number(verifyAnswer.noul) : null;
|
|
140
159
|
let target = null;
|
|
141
160
|
let targetAnswer = null;
|
|
142
|
-
if (operation
|
|
161
|
+
if (LINE_OPS.has(operation)) {
|
|
143
162
|
targetAnswer = validateChoice(answers.click_target || {}, Object.keys(clickTargets));
|
|
144
163
|
target = targetAnswer.choice;
|
|
145
164
|
} else if (operation === 'TYPE_TEXT') {
|
|
@@ -149,7 +168,7 @@ async function choose(deps, page, goal, history, focusedLabel) {
|
|
|
149
168
|
return {
|
|
150
169
|
operation,
|
|
151
170
|
target,
|
|
152
|
-
line: operation
|
|
171
|
+
line: LINE_OPS.has(operation) ? clickTargets[target] : null,
|
|
153
172
|
confidence: targetAnswer ? targetAnswer.confidence : operationAnswer.confidence,
|
|
154
173
|
target_probability: target != null && targetAnswer ? targetAnswer.probabilities[target] : null,
|
|
155
174
|
verification,
|
|
@@ -222,7 +241,7 @@ async function run(deps, options) {
|
|
|
222
241
|
OCR maliyeti olmadan önbellekten okuruz (screenObserve → sig). */
|
|
223
242
|
const sig = page.sig != null ? String(page.sig) : String(page.w) + '|' + String(page.h) + '|' + String((page.lines || []).length) + '|' + String(page.text || '').length;
|
|
224
243
|
const last = history.length ? history[history.length - 1] : null;
|
|
225
|
-
if (last &&
|
|
244
|
+
if (last && ['click', 'dblclick', 'rightclick'].includes(last.kind) && !last.failed) {
|
|
226
245
|
if (last.page_changed == null) last.page_changed = prevSig != null ? sig !== prevSig : null;
|
|
227
246
|
if (last.page_changed === false) {
|
|
228
247
|
noChangeStreak++;
|
|
@@ -277,9 +296,9 @@ async function run(deps, options) {
|
|
|
277
296
|
let text = null;
|
|
278
297
|
let kind = '';
|
|
279
298
|
try {
|
|
280
|
-
if (operation
|
|
281
|
-
kind = 'click';
|
|
282
|
-
result = await deps.act(
|
|
299
|
+
if (LINE_OPS.has(operation)) {
|
|
300
|
+
kind = operation === 'CLICK' ? 'click' : operation === 'DOUBLE_CLICK' ? 'dblclick' : 'rightclick';
|
|
301
|
+
result = await deps.act(kind, { x: decision.line.x, y: decision.line.y, fast: true });
|
|
283
302
|
if (!result || result.ok !== false) focusedLabel = baseLabel(decision.line.label);
|
|
284
303
|
await deps.wait({ ms: 150 });
|
|
285
304
|
} else if (operation === 'TYPE_TEXT') {
|
package/src/agent/engine.js
CHANGED
|
@@ -206,6 +206,20 @@ const CEO_EXEC_TOOLS = new Set([
|
|
|
206
206
|
açmasın ve kendini iptal edemesin — işi bitirip rapor yazsın. */
|
|
207
207
|
const BG_HIDDEN_TOOLS = new Set(['run_background', 'tasks_list', 'task_status', 'task_cancel']);
|
|
208
208
|
|
|
209
|
+
/* T3SFAST araç politikası: TypeSafe Jev AÇIKken elle tarayıcı/masaüstü eylem
|
|
210
|
+
araçları listeden düşer — eylemler browser_agent/computer_agent'a gider
|
|
211
|
+
(okuma/doğrulama araçları açık kalır). Anahtar yoksa/kapalıysa liste aynen
|
|
212
|
+
döner; ilgili Jev aracı listede yoksa (kısıtlı izin/beyaz liste) dokunulmaz. */
|
|
213
|
+
const TS_MANUAL_BROWSER_TOOLS = ['browser_click', 'browser_type', 'browser_press', 'browser_scroll', 'browser_select'];
|
|
214
|
+
function filterTypesafeTools(tools, tsAvailable) {
|
|
215
|
+
if (!tsAvailable || !Array.isArray(tools)) return tools;
|
|
216
|
+
const has = (n) => tools.some((t) => t && t.function && t.function.name === n);
|
|
217
|
+
const forced = new Set();
|
|
218
|
+
if (has('browser_agent')) for (const n of TS_MANUAL_BROWSER_TOOLS) forced.add(n);
|
|
219
|
+
if (has('computer_agent')) forced.add('computer_act');
|
|
220
|
+
return forced.size ? tools.filter((t) => !forced.has(t.function.name)) : tools;
|
|
221
|
+
}
|
|
222
|
+
|
|
209
223
|
function uid() {
|
|
210
224
|
return Date.now().toString(36) + Math.random().toString(36).slice(2, 8);
|
|
211
225
|
}
|
|
@@ -2230,7 +2244,7 @@ class Engine {
|
|
|
2230
2244
|
' Görselleri GÖREMEMİYORSAN (metin-model) görüntüdeki metni okumak için ocr_read kullan: source:"browser" ile tarayıcı sayfasını, "screen" ile masaüstünü OCR\u2019la okursun (captcha/canvas/görsel metin dahil).' +
|
|
2231
2245
|
(this.ceoMode ? ' (CEO: bu araçları KENDİN ÇAĞIRMA — içinde tarayıcı geçen işi run_background ile paralel ajana devret.)' : ''),
|
|
2232
2246
|
'Tarayıcı eylemlerinin yanıtındaki recent günlüğünü ve navigated bilgisini takip et; eylem yanıtları zaten taze snapshot içerir — refler tutarsız görünürse yeni snapshot al.',
|
|
2233
|
-
'T3SFAST (Jev) HIZLI AJANLARI: Ayarlar → TypeSafe\'te anahtar VAR ve AÇIKSA çok adımlı tarayıcı işlerini tek tek browser_click/browser_type yerine HER ZAMAN browser_agent\'a BİR doğal-dil hedefiyle ver (arama + form + filtre + tarih seçimi + sonuç açma gibi akışlar saniyeler içinde biter; her adımı TypeSafe Jev seçer, yalnız metin girişini küçük bir LLM yazar; gerçek fare/klavye girdisi + DONE için aynı istekte noul doğrulaması yapılır). "done" durumu hâlâ KANIT DEĞİL — sonucu browser_read/browser_screenshot ile bağımsız doğrulamadan kullanıcıya başarılı deme. Masaüstü işleri için computer_agent\'ı aynı şekilde kullan — pencereyi "window" alanıyla otomatik öne getirt (ör. window:"Notepad"), sonucu computer_look ile doğrula; değişmeyen ekran karelerinde OCR önbelleği devreye girer, hedefi net ver (uygulama + alan + değer). Anahtar yoksa/kapalıysa bu araçlar hata döner — kullanıcıyı Ayarlar → TypeSafe\'e yönlendir.',
|
|
2247
|
+
'T3SFAST (Jev) HIZLI AJANLARI: Ayarlar → TypeSafe\'te anahtar VAR ve AÇIKSA çok adımlı tarayıcı işlerini tek tek browser_click/browser_type yerine HER ZAMAN browser_agent\'a BİR doğal-dil hedefiyle ver (arama + form + filtre + tarih seçimi + sonuç açma gibi akışlar saniyeler içinde biter; her adımı TypeSafe Jev seçer, yalnız metin girişini küçük bir LLM yazar; gerçek fare/klavye girdisi + DONE için aynı istekte noul doğrulaması yapılır). "done" durumu hâlâ KANIT DEĞİL — sonucu browser_read/browser_screenshot ile bağımsız doğrulamadan kullanıcıya başarılı deme. Masaüstü işleri için computer_agent\'ı aynı şekilde kullan — pencereyi "window" alanıyla otomatik öne getirt (ör. window:"Notepad"), sonucu computer_look ile doğrula; değişmeyen ekran karelerinde OCR önbelleği devreye girer, hedefi net ver (uygulama + alan + değer). Anahtar yoksa/kapalıysa bu araçlar hata döner — kullanıcıyı Ayarlar → TypeSafe\'e yönlendir. TypeSafe AÇIKKEN elle browser_click/browser_type/browser_scroll/browser_select/browser_press ve computer_act araçları araç listesinden ÇIKARILIR; tarayıcı/masaüstü eylemini YALNIZCA browser_agent/computer_agent\'a tek doğal-dil hedefi vererek yap (okuma/doğrulama için browser_open/browser_read/browser_screenshot/browser_snapshot/browser_wait/computer_look açık kalır).',
|
|
2234
2248
|
'CONUŞMA ODAĞI SENDE KALSIN: kullanıcı seninle konuşurken iş çıkmışsa — uzun da olsa UFACIK da (tek komutluk dizin listesi, tek dosya okuma, tek arama…) — run_background ile PARALEL ajana devret; ana sohbet hiçbir işi beklemez; bittiğinde özet otomatik düşer.',
|
|
2235
2249
|
'Python işleri için python_run kullan: küçük betikler inline code ile; tekrarlayan işler %APPDATA%\\beast\\scripts klasöründeki dosyalarla (ör. news.py = RSS haber toplayıcı: args ["--limit","8","--json"]). Python kurulu olmasa bile ilk çağrıda taşınabilir gömülü runtime otomatik iner.',
|
|
2236
2250
|
'PYTHON DURUMU: makinede sistem Python\'u görünmese bile ŞAŞIRMA ve "python yok" DEME — python_run aracı kendi taşınabilir runtime\'ını (%APPDATA%\\beast\\py\\python.exe) otomatik indirir/kullanır ve bu klasör run_command PATH\'inde önceliklidir; yani run_command içinde de `python` çalışır. Ham Google/Bing scrape yerine önce web_search aracını kullan (SearXNG + stealth TLS + TinyFish + Python çoklu-motor destekli), script gerektiğinde python_run yaz.',
|
|
@@ -3991,6 +4005,12 @@ class Engine {
|
|
|
3991
4005
|
if (adef && adef.prompt) {
|
|
3992
4006
|
system += `\n\n# AJAN: ${adef.name}\n${adef.prompt}`;
|
|
3993
4007
|
}
|
|
4008
|
+
/* T3SFAST DAYATMA: TypeSafe anahtarı VAR ve AÇIKken elle eylem araçları
|
|
4009
|
+
gizlenir (yalnız ilgili Jev aracı listede varsa): tarayıcı/masaüstü
|
|
4010
|
+
eylemleri browser_agent/computer_agent üzerinden yürür; okuma ve
|
|
4011
|
+
doğrulama araçları (open/read/screenshot/snapshot/wait, computer_look)
|
|
4012
|
+
açık kalır. Anahtar yoksa/kapalıysa hiçbir şey gizlenmez. */
|
|
4013
|
+
activeTools = filterTypesafeTools(activeTools, !typesafe.unavailable());
|
|
3994
4014
|
/* önek-cache disiplini (opencode request.ts:184): araç sırası oturum
|
|
3995
4015
|
boyunca sabit olmalı — alfabetik sıralama sağlayıcı önbelleğini bozmaz */
|
|
3996
4016
|
activeTools = [...activeTools].sort((a, b) =>
|
|
@@ -5906,6 +5926,17 @@ const skills = require('./skills');
|
|
|
5906
5926
|
});
|
|
5907
5927
|
}
|
|
5908
5928
|
if (name === 'computer_act') {
|
|
5929
|
+
/* T3SFAST DAYATMA: TypeSafe açıkken elle masaüstü eylemleri kapalı —
|
|
5930
|
+
eylem computer_agent'a (window alanıyla), doğrulama computer_look'a. */
|
|
5931
|
+
if (!typesafe.unavailable()) {
|
|
5932
|
+
return JSON.stringify({
|
|
5933
|
+
ok: false,
|
|
5934
|
+
redirected: 'computer_agent',
|
|
5935
|
+
error:
|
|
5936
|
+
'TypeSafe açık: elle masaüstü eylemleri kapalıdır — computer_agent {goal, window?} ile yaptır ' +
|
|
5937
|
+
'(ekranı doğrulamak için computer_look açık)',
|
|
5938
|
+
});
|
|
5939
|
+
}
|
|
5909
5940
|
if (!this.computer || typeof this.computer.act !== 'function') {
|
|
5910
5941
|
return JSON.stringify({ ok: false, error: 'fare/klavye erişimi yok' });
|
|
5911
5942
|
}
|
|
@@ -6003,6 +6034,17 @@ const skills = require('./skills');
|
|
|
6003
6034
|
return JSON.stringify(r);
|
|
6004
6035
|
}
|
|
6005
6036
|
if (name === 'browser_click' || name === 'browser_type' || name === 'browser_press' || name === 'browser_scroll' || name === 'browser_select') {
|
|
6037
|
+
/* T3SFAST DAYATMA: TypeSafe açıkken elle eylem yolu kapalı — sağlayıcı
|
|
6038
|
+
araç listesi dışından çağırırsa bile Jev'e yönlendirilir. */
|
|
6039
|
+
if (!typesafe.unavailable()) {
|
|
6040
|
+
return JSON.stringify({
|
|
6041
|
+
ok: false,
|
|
6042
|
+
redirected: 'browser_agent',
|
|
6043
|
+
error:
|
|
6044
|
+
'TypeSafe açık: elle tarayıcı eylemleri kapalıdır — hedefi browser_agent {goal, url?} ile TEK çağrıda yaptır ' +
|
|
6045
|
+
'(sayfayı okumak/doğrulamak için browser_read/browser_screenshot/browser_snapshot açık)',
|
|
6046
|
+
});
|
|
6047
|
+
}
|
|
6006
6048
|
if (!this.browser || typeof this.browser.act !== 'function') {
|
|
6007
6049
|
return JSON.stringify({ ok: false, error: 'dahili tarayıcı kullanılamıyor' });
|
|
6008
6050
|
}
|
|
@@ -7734,6 +7776,7 @@ module.exports.sanitizeTodoItems = sanitizeTodoItems;
|
|
|
7734
7776
|
module.exports.parseReflectionJson = parseReflectionJson;
|
|
7735
7777
|
module.exports.CEO_EXEC_TOOLS = CEO_EXEC_TOOLS;
|
|
7736
7778
|
module.exports.BG_HIDDEN_TOOLS = BG_HIDDEN_TOOLS;
|
|
7779
|
+
module.exports.filterTypesafeTools = filterTypesafeTools;
|
|
7737
7780
|
module.exports.PERM_TOOL_SETS = PERM_TOOL_SETS;
|
|
7738
7781
|
module.exports.PERM_LEVELS = PERM_LEVELS;
|
|
7739
7782
|
module.exports.normalizePerms = normalizePerms;
|