@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.
Files changed (100) hide show
  1. package/README.md +368 -62
  2. package/dist/__tests__/action-engine.test.d.ts +2 -0
  3. package/dist/__tests__/action-engine.test.d.ts.map +1 -0
  4. package/dist/__tests__/action-engine.test.js +144 -0
  5. package/dist/__tests__/action-engine.test.js.map +1 -0
  6. package/dist/__tests__/state-parser.test.d.ts +2 -0
  7. package/dist/__tests__/state-parser.test.d.ts.map +1 -0
  8. package/dist/__tests__/state-parser.test.js +176 -0
  9. package/dist/__tests__/state-parser.test.js.map +1 -0
  10. package/dist/__tests__/verifier.test.d.ts +2 -0
  11. package/dist/__tests__/verifier.test.d.ts.map +1 -0
  12. package/dist/__tests__/verifier.test.js +68 -0
  13. package/dist/__tests__/verifier.test.js.map +1 -0
  14. package/dist/__tests__/workflow-recorder.test.d.ts +2 -0
  15. package/dist/__tests__/workflow-recorder.test.d.ts.map +1 -0
  16. package/dist/__tests__/workflow-recorder.test.js +71 -0
  17. package/dist/__tests__/workflow-recorder.test.js.map +1 -0
  18. package/dist/agent/agent-loop.d.ts +36 -0
  19. package/dist/agent/agent-loop.d.ts.map +1 -0
  20. package/dist/agent/agent-loop.js +127 -0
  21. package/dist/agent/agent-loop.js.map +1 -0
  22. package/dist/agent/memory.d.ts +24 -0
  23. package/dist/agent/memory.d.ts.map +1 -0
  24. package/dist/agent/memory.js +34 -0
  25. package/dist/agent/memory.js.map +1 -0
  26. package/dist/agent/planner.d.ts +18 -0
  27. package/dist/agent/planner.d.ts.map +1 -0
  28. package/dist/agent/planner.js +68 -0
  29. package/dist/agent/planner.js.map +1 -0
  30. package/dist/api/act.d.ts +4 -2
  31. package/dist/api/act.d.ts.map +1 -1
  32. package/dist/api/act.js +174 -30
  33. package/dist/api/act.js.map +1 -1
  34. package/dist/api/extract.d.ts +2 -3
  35. package/dist/api/extract.d.ts.map +1 -1
  36. package/dist/api/extract.js +0 -1
  37. package/dist/api/extract.js.map +1 -1
  38. package/dist/api/observe.d.ts +2 -2
  39. package/dist/api/observe.d.ts.map +1 -1
  40. package/dist/api/observe.js +0 -1
  41. package/dist/api/observe.js.map +1 -1
  42. package/dist/core/driver.d.ts +21 -1
  43. package/dist/core/driver.d.ts.map +1 -1
  44. package/dist/core/driver.js +109 -19
  45. package/dist/core/driver.js.map +1 -1
  46. package/dist/core/state-parser.d.ts +1 -0
  47. package/dist/core/state-parser.d.ts.map +1 -1
  48. package/dist/core/state-parser.js +60 -0
  49. package/dist/core/state-parser.js.map +1 -1
  50. package/dist/core/vision-grounding.d.ts +36 -0
  51. package/dist/core/vision-grounding.d.ts.map +1 -0
  52. package/dist/core/vision-grounding.js +118 -0
  53. package/dist/core/vision-grounding.js.map +1 -0
  54. package/dist/index.d.ts +111 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +168 -4
  57. package/dist/index.js.map +1 -1
  58. package/dist/recorder/workflow-recorder.d.ts +30 -0
  59. package/dist/recorder/workflow-recorder.d.ts.map +1 -0
  60. package/dist/recorder/workflow-recorder.js +83 -0
  61. package/dist/recorder/workflow-recorder.js.map +1 -0
  62. package/dist/reliability/verifier.d.ts +2 -2
  63. package/dist/reliability/verifier.d.ts.map +1 -1
  64. package/dist/reliability/verifier.js +0 -1
  65. package/dist/reliability/verifier.js.map +1 -1
  66. package/dist/types/errors.d.ts +45 -0
  67. package/dist/types/errors.d.ts.map +1 -0
  68. package/dist/types/errors.js +69 -0
  69. package/dist/types/errors.js.map +1 -0
  70. package/dist/utils/gemini.d.ts +3 -6
  71. package/dist/utils/gemini.d.ts.map +1 -1
  72. package/dist/utils/gemini.js +9 -94
  73. package/dist/utils/gemini.js.map +1 -1
  74. package/dist/utils/llm-provider.d.ts +28 -0
  75. package/dist/utils/llm-provider.d.ts.map +1 -0
  76. package/dist/utils/llm-provider.js +2 -0
  77. package/dist/utils/llm-provider.js.map +1 -0
  78. package/dist/utils/providers/claude-provider.d.ts +17 -0
  79. package/dist/utils/providers/claude-provider.d.ts.map +1 -0
  80. package/dist/utils/providers/claude-provider.js +49 -0
  81. package/dist/utils/providers/claude-provider.js.map +1 -0
  82. package/dist/utils/providers/gemini-provider.d.ts +14 -0
  83. package/dist/utils/providers/gemini-provider.d.ts.map +1 -0
  84. package/dist/utils/providers/gemini-provider.js +95 -0
  85. package/dist/utils/providers/gemini-provider.js.map +1 -0
  86. package/dist/utils/providers/ollama-provider.d.ts +18 -0
  87. package/dist/utils/providers/ollama-provider.d.ts.map +1 -0
  88. package/dist/utils/providers/ollama-provider.js +62 -0
  89. package/dist/utils/providers/ollama-provider.js.map +1 -0
  90. package/dist/utils/providers/openai-provider.d.ts +18 -0
  91. package/dist/utils/providers/openai-provider.d.ts.map +1 -0
  92. package/dist/utils/providers/openai-provider.js +51 -0
  93. package/dist/utils/providers/openai-provider.js.map +1 -0
  94. package/dist/utils/token-tracker.d.ts +25 -0
  95. package/dist/utils/token-tracker.d.ts.map +1 -0
  96. package/dist/utils/token-tracker.js +45 -0
  97. package/dist/utils/token-tracker.js.map +1 -0
  98. package/dist/whatsapp-test.js +58 -17
  99. package/dist/whatsapp-test.js.map +1 -1
  100. package/package.json +10 -4
@@ -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 || "YOUR_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({ apiKey: API_KEY, headless: false });
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("1. Navigating to WhatsApp Web...");
11
- await sentinel.goto("https://web.whatsapp.com");
12
- console.log("PLEASE SCAN THE QR CODE MANUALLY.");
13
- console.log("Waiting for WhatsApp to fully load...");
14
- await page.waitForSelector('#pane-side', { timeout: 180000 });
15
- await page.waitForFunction(() => (document.querySelector('#pane-side')?.innerText?.trim().length ?? 0) > 50, { timeout: 30000 });
16
- console.log("2. Logged in. Extracting top 2 chats...");
17
- // Define schema once – z.infer<> gives full TypeScript type inference
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
- // act() handles it listitem role is now in StateParser
27
- const opened = await sentinel.act(`Click the chat entry in the left sidebar with the name "${chat.name}".`);
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
- await page.waitForFunction(() => (document.querySelector('#main')?.innerText?.trim().length ?? 0) > 20, { timeout: 8000 }).catch(() => console.warn(`[Warn] Message area slow for "${chat.name}"`));
33
- // Define message schema
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(["me", "other"])
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("WhatsApp Test Error:", error);
89
+ console.error('WhatsApp Test Error:', error);
49
90
  }
50
91
  finally {
51
- console.log("\nTest finished. Closing browser...");
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;AAE7D,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAEhD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QAErD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,MAAM,IAAI,CAAC,eAAe,CACxB,GAAG,EAAE,CAAC,CAAE,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAwB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,EACxG,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAEvD,sEAAsE;QACtE,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SAC7D,CAAC,CAAC;QAGH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CACtC;yFACmF,EACnF,cAAc,CACf,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YAEtD,yDAAyD;YACzD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAC/B,2DAA2D,IAAI,CAAC,IAAI,IAAI,CACzE,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,MAAM,IAAI,CAAC,eAAe,CACxB,GAAG,EAAE,CAAC,CAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAwB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,EACnG,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAE3E,wBAAwB;YACxB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;gBACzB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAChB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;iBAChC,CAAC,CAAC;aACJ,CAAC,CAAC;YAGH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CACrC;;0EAEkE,EAClE,SAAS,CACV,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,YAAY,EAAE,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.1.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
+ }