@isoldex/sentinel 0.1.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/README.md +368 -62
- package/dist/__tests__/action-engine.test.d.ts +2 -0
- package/dist/__tests__/action-engine.test.d.ts.map +1 -0
- package/dist/__tests__/action-engine.test.js +144 -0
- package/dist/__tests__/action-engine.test.js.map +1 -0
- package/dist/__tests__/state-parser.test.d.ts +2 -0
- package/dist/__tests__/state-parser.test.d.ts.map +1 -0
- package/dist/__tests__/state-parser.test.js +176 -0
- package/dist/__tests__/state-parser.test.js.map +1 -0
- package/dist/__tests__/verifier.test.d.ts +2 -0
- package/dist/__tests__/verifier.test.d.ts.map +1 -0
- package/dist/__tests__/verifier.test.js +68 -0
- package/dist/__tests__/verifier.test.js.map +1 -0
- package/dist/__tests__/workflow-recorder.test.d.ts +2 -0
- package/dist/__tests__/workflow-recorder.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-recorder.test.js +71 -0
- package/dist/__tests__/workflow-recorder.test.js.map +1 -0
- package/dist/agent/agent-loop.d.ts +36 -0
- package/dist/agent/agent-loop.d.ts.map +1 -0
- package/dist/agent/agent-loop.js +127 -0
- package/dist/agent/agent-loop.js.map +1 -0
- package/dist/agent/memory.d.ts +24 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +34 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/planner.d.ts +18 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +68 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/api/act.d.ts +4 -2
- package/dist/api/act.d.ts.map +1 -1
- package/dist/api/act.js +174 -30
- package/dist/api/act.js.map +1 -1
- package/dist/api/extract.d.ts +2 -3
- package/dist/api/extract.d.ts.map +1 -1
- package/dist/api/extract.js +0 -1
- package/dist/api/extract.js.map +1 -1
- package/dist/api/observe.d.ts +2 -2
- package/dist/api/observe.d.ts.map +1 -1
- package/dist/api/observe.js +0 -1
- package/dist/api/observe.js.map +1 -1
- package/dist/core/driver.d.ts +21 -1
- package/dist/core/driver.d.ts.map +1 -1
- package/dist/core/driver.js +109 -19
- package/dist/core/driver.js.map +1 -1
- package/dist/core/state-parser.d.ts +1 -0
- package/dist/core/state-parser.d.ts.map +1 -1
- package/dist/core/state-parser.js +60 -0
- package/dist/core/state-parser.js.map +1 -1
- package/dist/core/vision-grounding.d.ts +36 -0
- package/dist/core/vision-grounding.d.ts.map +1 -0
- package/dist/core/vision-grounding.js +118 -0
- package/dist/core/vision-grounding.js.map +1 -0
- package/dist/index.d.ts +111 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +168 -4
- package/dist/index.js.map +1 -1
- package/dist/recorder/workflow-recorder.d.ts +30 -0
- package/dist/recorder/workflow-recorder.d.ts.map +1 -0
- package/dist/recorder/workflow-recorder.js +83 -0
- package/dist/recorder/workflow-recorder.js.map +1 -0
- package/dist/reliability/verifier.d.ts +2 -2
- package/dist/reliability/verifier.d.ts.map +1 -1
- package/dist/reliability/verifier.js +0 -1
- package/dist/reliability/verifier.js.map +1 -1
- package/dist/types/errors.d.ts +45 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +69 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/utils/gemini.d.ts +3 -6
- package/dist/utils/gemini.d.ts.map +1 -1
- package/dist/utils/gemini.js +9 -94
- package/dist/utils/gemini.js.map +1 -1
- package/dist/utils/llm-provider.d.ts +28 -0
- package/dist/utils/llm-provider.d.ts.map +1 -0
- package/dist/utils/llm-provider.js +2 -0
- package/dist/utils/llm-provider.js.map +1 -0
- package/dist/utils/providers/claude-provider.d.ts +17 -0
- package/dist/utils/providers/claude-provider.d.ts.map +1 -0
- package/dist/utils/providers/claude-provider.js +49 -0
- package/dist/utils/providers/claude-provider.js.map +1 -0
- package/dist/utils/providers/gemini-provider.d.ts +14 -0
- package/dist/utils/providers/gemini-provider.d.ts.map +1 -0
- package/dist/utils/providers/gemini-provider.js +95 -0
- package/dist/utils/providers/gemini-provider.js.map +1 -0
- package/dist/utils/providers/ollama-provider.d.ts +18 -0
- package/dist/utils/providers/ollama-provider.d.ts.map +1 -0
- package/dist/utils/providers/ollama-provider.js +62 -0
- package/dist/utils/providers/ollama-provider.js.map +1 -0
- package/dist/utils/providers/openai-provider.d.ts +18 -0
- package/dist/utils/providers/openai-provider.d.ts.map +1 -0
- package/dist/utils/providers/openai-provider.js +51 -0
- package/dist/utils/providers/openai-provider.js.map +1 -0
- package/dist/utils/token-tracker.d.ts +25 -0
- package/dist/utils/token-tracker.d.ts.map +1 -0
- package/dist/utils/token-tracker.js +45 -0
- package/dist/utils/token-tracker.js.map +1 -0
- package/dist/whatsapp-test.js +58 -17
- package/dist/whatsapp-test.js.map +1 -1
- package/package.json +10 -4
package/dist/whatsapp-test.js
CHANGED
|
@@ -1,40 +1,78 @@
|
|
|
1
1
|
import { Sentinel, z } from './index.js';
|
|
2
2
|
import dotenv from 'dotenv';
|
|
3
3
|
dotenv.config();
|
|
4
|
-
const API_KEY = process.env.GEMINI_API_KEY ||
|
|
4
|
+
const API_KEY = process.env.GEMINI_API_KEY || 'YOUR_API_KEY';
|
|
5
|
+
const SESSION_PATH = process.env.WHATSAPP_SESSION_PATH || './whatsapp-session.json';
|
|
5
6
|
async function whatsappTest() {
|
|
6
|
-
const sentinel = new Sentinel({
|
|
7
|
+
const sentinel = new Sentinel({
|
|
8
|
+
apiKey: API_KEY,
|
|
9
|
+
headless: false,
|
|
10
|
+
humanLike: true, // v2: menschliche Verzögerungen zwischen Aktionen
|
|
11
|
+
sessionPath: SESSION_PATH, // v2: Session persistieren – QR-Code nur einmal scannen
|
|
12
|
+
verbose: 1,
|
|
13
|
+
visionFallback: true, // WhatsApp Web hat keinen sauberen AOM – Vision als Fallback
|
|
14
|
+
});
|
|
15
|
+
// v2: Events für Observability
|
|
16
|
+
sentinel.on('action', (event) => {
|
|
17
|
+
console.log(`[Event] action: "${event.instruction}" → ${event.result.success ? '✅' : '❌'} ${event.result.message}`);
|
|
18
|
+
});
|
|
19
|
+
sentinel.on('navigate', (event) => {
|
|
20
|
+
console.log(`[Event] navigate: ${event.url}`);
|
|
21
|
+
});
|
|
7
22
|
try {
|
|
8
23
|
await sentinel.init();
|
|
9
24
|
const page = sentinel.page;
|
|
10
|
-
console.log(
|
|
11
|
-
await sentinel.goto(
|
|
12
|
-
console.log(
|
|
13
|
-
console.log(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
25
|
+
console.log('1. Navigating to WhatsApp Web...');
|
|
26
|
+
await sentinel.goto('https://web.whatsapp.com');
|
|
27
|
+
console.log('PLEASE SCAN THE QR CODE MANUALLY (only needed on first run – session will be saved).');
|
|
28
|
+
console.log('Waiting for WhatsApp to fully load...');
|
|
29
|
+
// Warten bis Sentinel Chat-Einträge in der Sidebar erkennt (kein Selektor nötig)
|
|
30
|
+
// Warten bis Sentinel mindestens 3 Chat-Eintraege in der Sidebar erkennt
|
|
31
|
+
// (verhindert false-positive wenn nur QR-Code-Elemente sichtbar sind)
|
|
32
|
+
let sidebarReady = false;
|
|
33
|
+
const deadline = Date.now() + 180000;
|
|
34
|
+
while (!sidebarReady && Date.now() < deadline) {
|
|
35
|
+
const elements = await sentinel.observe('Find actual chat conversation entries (contact names, group names) in the left sidebar – NOT the QR code, NOT login buttons');
|
|
36
|
+
if (elements.length >= 3) {
|
|
37
|
+
sidebarReady = true;
|
|
38
|
+
// Kurze Pause damit WhatsApp die Chat-Liste vollstaendig rendert
|
|
39
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
await new Promise(r => setTimeout(r, 3000));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!sidebarReady)
|
|
46
|
+
throw new Error('WhatsApp sidebar did not load in time');
|
|
47
|
+
// v2: Session nach erfolgreichem Login speichern
|
|
48
|
+
await sentinel.saveSession(SESSION_PATH);
|
|
49
|
+
console.log(`✅ Session saved to ${SESSION_PATH}`);
|
|
50
|
+
console.log('2. Logged in. Extracting top 2 chats...');
|
|
18
51
|
const chatListSchema = z.object({
|
|
19
52
|
chats: z.array(z.object({ name: z.string() })).min(1).max(2)
|
|
20
53
|
});
|
|
21
54
|
const { chats } = await sentinel.extract(`Look at the LEFT SIDEBAR. List the names of the first 2 conversations.
|
|
22
55
|
Only contact/group names. Skip labels like "Archiviert", dates, message previews.`, chatListSchema);
|
|
23
56
|
console.log(`Found chats: ${chats.map((c) => `"${c.name}"`).join(', ')}`);
|
|
57
|
+
// v2: observe() nutzen um verfügbare Aktionen zu prüfen
|
|
58
|
+
const observedElements = await sentinel.observe('Find chat entries in the left sidebar');
|
|
59
|
+
console.log(`\n[v2 observe] Found ${observedElements.length} interactive elements in sidebar`);
|
|
24
60
|
for (const chat of chats) {
|
|
25
61
|
console.log(`\n--- Opening chat: "${chat.name}" ---`);
|
|
26
|
-
|
|
27
|
-
|
|
62
|
+
const opened = await sentinel.act(`Click the chat entry in the left sidebar with the name "${chat.name}". ` +
|
|
63
|
+
`Do NOT click any "Archiviert" (archived) button or label. ` +
|
|
64
|
+
`Click only the actual conversation row.`);
|
|
28
65
|
if (!opened.success) {
|
|
29
66
|
console.warn(`[Skip] ${opened.message}`);
|
|
30
67
|
continue;
|
|
31
68
|
}
|
|
32
|
-
|
|
33
|
-
|
|
69
|
+
// Sentinel beobachtet selbst ob der Chat geladen ist – kein Selektor nötig
|
|
70
|
+
const chatElements = await sentinel.observe(`Find messages and conversation content in the currently open chat "${chat.name}" on the right side`);
|
|
71
|
+
console.log(`[Observe] ${chatElements.length} elements found in chat area`);
|
|
34
72
|
const msgSchema = z.object({
|
|
35
73
|
msgs: z.array(z.object({
|
|
36
74
|
text: z.string(),
|
|
37
|
-
sender: z.enum([
|
|
75
|
+
sender: z.enum(['me', 'other'])
|
|
38
76
|
}))
|
|
39
77
|
});
|
|
40
78
|
const { msgs } = await sentinel.extract(`Extract the last 5 messages from the RIGHT SIDE conversation panel.
|
|
@@ -43,12 +81,15 @@ async function whatsappTest() {
|
|
|
43
81
|
console.log(`Last ${msgs.length} messages:`);
|
|
44
82
|
msgs.forEach(m => console.log(` [${m.sender}] ${m.text}`));
|
|
45
83
|
}
|
|
84
|
+
// v2: Token-Verbrauch ausgeben
|
|
85
|
+
const usage = sentinel.getTokenUsage();
|
|
86
|
+
console.log(`\n📊 Token usage: ${usage.totalTokens} tokens (~$${usage.estimatedCostUsd.toFixed(4)})`);
|
|
46
87
|
}
|
|
47
88
|
catch (error) {
|
|
48
|
-
console.error(
|
|
89
|
+
console.error('WhatsApp Test Error:', error);
|
|
49
90
|
}
|
|
50
91
|
finally {
|
|
51
|
-
console.log(
|
|
92
|
+
console.log('\nTest finished. Closing browser...');
|
|
52
93
|
await sentinel.close();
|
|
53
94
|
}
|
|
54
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp-test.js","sourceRoot":"","sources":["../src/whatsapp-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"whatsapp-test.js","sourceRoot":"","sources":["../src/whatsapp-test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isoldex/sentinel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "AI-powered browser automation with Gemini – fast, cheap Stagehand alternative",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,7 +16,10 @@
|
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsc",
|
|
19
|
-
"prepublishOnly": "npm run build"
|
|
19
|
+
"prepublishOnly": "npm run build",
|
|
20
|
+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
21
|
+
"test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
|
|
22
|
+
"test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch"
|
|
20
23
|
},
|
|
21
24
|
"keywords": [
|
|
22
25
|
"browser-automation",
|
|
@@ -32,7 +35,7 @@
|
|
|
32
35
|
"web-scraping",
|
|
33
36
|
"llm"
|
|
34
37
|
],
|
|
35
|
-
"author": "",
|
|
38
|
+
"author": "Huseyin Aras",
|
|
36
39
|
"license": "ISC",
|
|
37
40
|
"peerDependencies": {
|
|
38
41
|
"playwright": ">=1.40.0"
|
|
@@ -45,9 +48,12 @@
|
|
|
45
48
|
},
|
|
46
49
|
"devDependencies": {
|
|
47
50
|
"@types/dotenv": "^6.1.1",
|
|
51
|
+
"@types/jest": "^30.0.0",
|
|
48
52
|
"@types/node": "^25.5.2",
|
|
53
|
+
"jest": "^30.3.0",
|
|
49
54
|
"playwright": "^1.59.1",
|
|
55
|
+
"ts-jest": "^29.4.9",
|
|
50
56
|
"ts-node": "^10.9.2",
|
|
51
57
|
"typescript": "^6.0.2"
|
|
52
58
|
}
|
|
53
|
-
}
|
|
59
|
+
}
|