beast-agent 0.27.0 → 0.29.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.
@@ -0,0 +1,124 @@
1
+ 'use strict';
2
+
3
+ /* Obscura entegrasyonu + sıralı web arama zinciri testleri (ağ çağrısı yok) */
4
+
5
+ const test = require('node:test');
6
+ const assert = require('node:assert');
7
+ const tools = require('../src/agent/tools');
8
+ const obscura = require('../src/agent/obscura');
9
+
10
+ test('varsayılan zincir: 4 motor, hepsi açık, obscura AKTİF', () => {
11
+ const c = tools.getSearchChain();
12
+ assert.deepEqual(c.map((x) => x.id), ['browser', 'obscura', 'tinyfish', 'python']);
13
+ for (const r of c) assert.strictEqual(r.on, true, r.id + ' varsayılan açık');
14
+ });
15
+
16
+ test('setSearchChain: sıra yeniden düzenlenir, eksik motorlar sona eklenir (açık)', () => {
17
+ const c = tools.setSearchChain([
18
+ { id: 'obscura', on: true },
19
+ { id: 'python', on: true },
20
+ { id: 'browser', on: false },
21
+ ]);
22
+ assert.deepEqual(c.map((x) => x.id), ['obscura', 'python', 'browser', 'tinyfish']);
23
+ assert.strictEqual(c.find((x) => x.id === 'browser').on, false);
24
+ assert.strictEqual(c.find((x) => x.id === 'tinyfish').on, true, 'listede olmayan motor varsayılan açık');
25
+ tools.setSearchChain(tools.DEFAULT_SEARCH_CHAIN); /* testler arası temizlik */
26
+ });
27
+
28
+ test('setSearchChain: hepsi kapalıysa tarayıcı zorunlu açılır (zincir boş kalmasın)', () => {
29
+ const c = tools.setSearchChain(['obscura', 'tinyfish', 'python', 'browser'].map((id) => ({ id, on: false })));
30
+ assert.strictEqual(c.find((x) => x.id === 'browser').on, true);
31
+ tools.setSearchChain(tools.DEFAULT_SEARCH_CHAIN);
32
+ });
33
+
34
+ test('setSearchChain: bilinmeyen id ve tekrar elenir', () => {
35
+ const c = tools.setSearchChain([{ id: 'exa', on: true }, { id: 'obscura' }, { id: 'obscura', on: false }, 'python']);
36
+ assert.deepEqual(c.map((x) => x.id), ['obscura', 'python', 'browser', 'tinyfish']);
37
+ tools.setSearchChain(tools.DEFAULT_SEARCH_CHAIN);
38
+ });
39
+
40
+ test('searchChainWeb: sırayı uygular, dolu motorda durur, boş tarayıcı banlanır', async () => {
41
+ tools.setSearchChain([
42
+ { id: 'browser', on: true },
43
+ { id: 'obscura', on: false },
44
+ { id: 'tinyfish', on: false },
45
+ { id: 'python', on: false },
46
+ ]);
47
+ const calls = [];
48
+ const r = await tools.searchChainWeb('test sorgu', 5, {
49
+ browser: async () => {
50
+ calls.push('browser');
51
+ return { ok: true, results: [{ title: 'T', url: 'https://x.com', snippet: 's', engine: 'browser' }] };
52
+ },
53
+ });
54
+ assert.ok(r.ok, 'sonuç geldi');
55
+ assert.strictEqual(calls.length, 1, 'zincir ilk dolu motorda durdu');
56
+ assert.ok(!tools.browserBanned(), 'başarılı tarayıcı banlanmaz');
57
+
58
+ /* tarayıcı boş dönerse 10 dk ban + zincir başarısız (diğer motorlar kapalı) */
59
+ const r2 = await tools.searchChainWeb('test 2', 5, {
60
+ browser: async () => {
61
+ calls.push('browser');
62
+ return { ok: true, results: [] };
63
+ },
64
+ });
65
+ assert.strictEqual(r2.ok, false);
66
+ assert.ok(tools.browserBanned(), 'boş sonuç tarayıcıyı banladı');
67
+ tools.banBrowser(0); /* banı temizle */
68
+ const r3 = await tools.searchChainWeb('test 3', 5, {
69
+ browser: async () => {
70
+ calls.push('browser');
71
+ return { ok: true, results: [{ title: 'T3', url: 'https://y.com' }] };
72
+ },
73
+ });
74
+ assert.ok(r3.ok && calls.length === 3, 'ban süresi dolunca tarayıcı geri döner');
75
+ tools.setSearchChain(tools.DEFAULT_SEARCH_CHAIN);
76
+ });
77
+
78
+ test('searchChainWeb: browser hook yoksa obscura/tinyfish/python sırası izlenir', async () => {
79
+ tools.setSearchChain([{ id: 'browser', on: true }, { id: 'obscura', on: false }, { id: 'tinyfish', on: false }, { id: 'python', on: false }]);
80
+ const r = await tools.searchChainWeb('test', 5, {});
81
+ /* tüm motorlar kapalı/atlanmış → normalize browser'ı zorunlu açtı ama hook yok → başarısız */
82
+ assert.strictEqual(r.ok, false);
83
+ tools.setSearchChain(tools.DEFAULT_SEARCH_CHAIN);
84
+ });
85
+
86
+ test('searchChainWeb: boş sorgu hata döner', async () => {
87
+ const r = await tools.searchChainWeb(' ', 5, {});
88
+ assert.strictEqual(r.ok, false);
89
+ assert.ok(/boş sorgu/.test(r.error));
90
+ });
91
+
92
+ test('obscura parseDdgLite: lite tablosundan sonuç çıkarır', () => {
93
+ const html =
94
+ '<table><tr><td><a rel="nofollow" class="result-link" href="//duckduckgo.com/l/?uddg=https%3A%2F%2Fornek.com%2Fa&amp;rut=1">Örnek A</a></td></tr>' +
95
+ '<tr><td><a rel="nofollow" class="result-link" href="https://ornek.com/b">Örnek B</a></td></tr></table>';
96
+ const rows = obscura.parseDdgLite(html, 5);
97
+ assert.strictEqual(rows.length, 2);
98
+ assert.strictEqual(rows[0].url, 'https://ornek.com/a');
99
+ assert.strictEqual(rows[0].title, 'Örnek A');
100
+ assert.strictEqual(rows[1].url, 'https://ornek.com/b');
101
+ });
102
+
103
+ test('obscura yolları ve kurulum durumu', () => {
104
+ assert.ok(/beast[\\/]obscura$/.test(obscura.obscuraDir()));
105
+ assert.ok(/obscura\.exe$/.test(obscura.obscuraExe()));
106
+ /* test makinesinde kurulu olabilir — sadece tipleri doğrula */
107
+ assert.strictEqual(typeof obscura.obscuraInstalled(), 'boolean');
108
+ assert.strictEqual(typeof obscura.obscuraSearch, 'function');
109
+ assert.strictEqual(typeof obscura.installObscura, 'function');
110
+ });
111
+
112
+ test('obscuraSearch: kurulu değilse null döner (zincir atlar)', async () => {
113
+ const wasInstalled = obscura.obscuraInstalled();
114
+ if (wasInstalled) return; /* kurulu makinede atla */
115
+ const r = await obscura.obscuraSearch('sorgu', {});
116
+ assert.strictEqual(r, null);
117
+ });
118
+
119
+ test('Exa sistemden tamamen kalktı', () => {
120
+ for (const k of ['setExaKey', 'exaSearch']) assert.ok(!(k in tools), k + ' export yok');
121
+ const desc = JSON.stringify(tools.definitions);
122
+ assert.ok(!/exa\.ai/i.test(desc), 'araç tanımlarında exa yok');
123
+ assert.ok(!/api\.exa\.ai/i.test(desc));
124
+ });