@isoldex/sentinel 0.1.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 (63) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +122 -0
  3. package/dist/api/act.d.ts +22 -0
  4. package/dist/api/act.d.ts.map +1 -0
  5. package/dist/api/act.js +116 -0
  6. package/dist/api/act.js.map +1 -0
  7. package/dist/api/extract.d.ts +13 -0
  8. package/dist/api/extract.d.ts.map +1 -0
  9. package/dist/api/extract.js +52 -0
  10. package/dist/api/extract.js.map +1 -0
  11. package/dist/api/observe.d.ts +17 -0
  12. package/dist/api/observe.d.ts.map +1 -0
  13. package/dist/api/observe.js +56 -0
  14. package/dist/api/observe.js.map +1 -0
  15. package/dist/complex-test.d.ts +2 -0
  16. package/dist/complex-test.d.ts.map +1 -0
  17. package/dist/complex-test.js +58 -0
  18. package/dist/complex-test.js.map +1 -0
  19. package/dist/core/driver.d.ts +23 -0
  20. package/dist/core/driver.d.ts.map +1 -0
  21. package/dist/core/driver.js +61 -0
  22. package/dist/core/driver.js.map +1 -0
  23. package/dist/core/state-parser.d.ts +38 -0
  24. package/dist/core/state-parser.d.ts.map +1 -0
  25. package/dist/core/state-parser.js +103 -0
  26. package/dist/core/state-parser.js.map +1 -0
  27. package/dist/debug-aom.d.ts +2 -0
  28. package/dist/debug-aom.d.ts.map +1 -0
  29. package/dist/debug-aom.js +22 -0
  30. package/dist/debug-aom.js.map +1 -0
  31. package/dist/demo.d.ts +2 -0
  32. package/dist/demo.d.ts.map +1 -0
  33. package/dist/demo.js +41 -0
  34. package/dist/demo.js.map +1 -0
  35. package/dist/index.d.ts +85 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +143 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/list-all.d.ts +2 -0
  40. package/dist/list-all.d.ts.map +1 -0
  41. package/dist/list-all.js +25 -0
  42. package/dist/list-all.js.map +1 -0
  43. package/dist/list-models.d.ts +2 -0
  44. package/dist/list-models.d.ts.map +1 -0
  45. package/dist/list-models.js +11 -0
  46. package/dist/list-models.js.map +1 -0
  47. package/dist/reliability/verifier.d.ts +18 -0
  48. package/dist/reliability/verifier.d.ts.map +1 -0
  49. package/dist/reliability/verifier.js +64 -0
  50. package/dist/reliability/verifier.js.map +1 -0
  51. package/dist/test-versions.d.ts +2 -0
  52. package/dist/test-versions.d.ts.map +1 -0
  53. package/dist/test-versions.js +33 -0
  54. package/dist/test-versions.js.map +1 -0
  55. package/dist/utils/gemini.d.ts +12 -0
  56. package/dist/utils/gemini.d.ts.map +1 -0
  57. package/dist/utils/gemini.js +103 -0
  58. package/dist/utils/gemini.js.map +1 -0
  59. package/dist/whatsapp-test.d.ts +2 -0
  60. package/dist/whatsapp-test.d.ts.map +1 -0
  61. package/dist/whatsapp-test.js +56 -0
  62. package/dist/whatsapp-test.js.map +1 -0
  63. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/reliability/verifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASnD,oEAAoE;AACpE,SAAS,cAAc,CAAC,KAAsB;IAC5C,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QACnC,kEAAkE;QAClE,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,QAAQ;IAET;IACA;IACA;IAHV,YACU,IAAU,EACV,WAAwB,EACxB,MAAqB;QAFrB,SAAI,GAAJ,IAAI,CAAM;QACV,gBAAW,GAAX,WAAW,CAAa;QACxB,WAAM,GAAN,MAAM,CAAe;IAC5B,CAAC;IAEJ,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,WAA4B,EAC5B,UAA2B;QAG3B,qEAAqE;QACrE,IAAI,WAAW,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,CAAC,GAAG,MAAM,UAAU,CAAC,GAAG,iBAAiB,CAAC,CAAC;YAC7F,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,qBAAqB,UAAU,CAAC,GAAG,EAAE;gBAC9C,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG;8CAC2B,MAAM;;;QAG5C,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;;;QAGpD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;KAKtD,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAChC;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC;SACnD,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAIpD,MAAM,EAAE,MAAM,CAAC,CAAC;QAEnB,OAAO;YACL,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,WAAW;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-versions.d.ts","sourceRoot":"","sources":["../src/test-versions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ async function testVersions() {
2
+ const versions = ['v1', 'v1beta', 'v1alpha'];
3
+ const model = process.env.GEMINI_VERSION || 'gemini-3-flash';
4
+ const key = process.env.GEMINI_API_KEY;
5
+ for (const v of versions) {
6
+ console.log(`Testing version ${v} with model ${model}...`);
7
+ try {
8
+ const resp = await fetch(`https://generativelanguage.googleapis.com/${v}/models/${model}:generateContent`, {
9
+ method: 'POST',
10
+ headers: {
11
+ 'Content-Type': 'application/json',
12
+ 'x-goog-api-key': key || ""
13
+ },
14
+ body: JSON.stringify({ contents: [{ parts: [{ text: 'Hi' }] }] })
15
+ });
16
+ const data = await resp.json();
17
+ if (resp.ok) {
18
+ console.log(`SUCCESS with ${v}!`);
19
+ return;
20
+ }
21
+ else {
22
+ console.log(`FAILED with ${v}: ${resp.status} ${resp.statusText}`);
23
+ console.log(JSON.stringify(data, null, 2));
24
+ }
25
+ }
26
+ catch (e) {
27
+ console.log(`ERROR with ${v}: ${e.message}`);
28
+ }
29
+ }
30
+ }
31
+ testVersions();
32
+ export {};
33
+ //# sourceMappingURL=test-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-versions.js","sourceRoot":"","sources":["../src/test-versions.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,gBAAgB,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,6CAA6C,CAAC,WAAW,KAAK,kBAAkB,EAAE;gBACzG,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB,EAAE,GAAG,IAAI,EAAE;iBAC5B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;aAClE,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ /** Accepts either a Zod schema or a raw JSON Schema object */
3
+ export type SchemaInput<T> = z.ZodType | Record<string, any>;
4
+ export declare class GeminiService {
5
+ private genAI;
6
+ private structuredModel;
7
+ private textModel;
8
+ constructor(apiKey: string);
9
+ generateStructuredData<T>(prompt: string, schema: SchemaInput<T>): Promise<T>;
10
+ generateText(prompt: string, systemInstruction?: string): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/utils/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6BxB,8DAA8D;AAC9D,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAoC7D,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,SAAS,CAAM;gBAEX,MAAM,EAAE,MAAM;IASpB,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAuB7E,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAehF"}
@@ -0,0 +1,103 @@
1
+ import { GoogleGenerativeAI } from "@google/generative-ai";
2
+ import { z } from "zod";
3
+ const MAX_RETRIES = 3;
4
+ const BASE_DELAY_MS = 1000;
5
+ async function withRetry(fn, retries = MAX_RETRIES) {
6
+ let lastError;
7
+ for (let attempt = 0; attempt < retries; attempt++) {
8
+ try {
9
+ return await fn();
10
+ }
11
+ catch (err) {
12
+ lastError = err;
13
+ const isRetryable = err?.status === 429 ||
14
+ err?.status === 503 ||
15
+ err?.message?.includes('fetch failed') ||
16
+ err?.message?.includes('ECONNRESET') ||
17
+ err?.message?.includes('rate limit');
18
+ if (!isRetryable || attempt === retries - 1)
19
+ throw err;
20
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt);
21
+ console.warn(`[Gemini] Retryable error (attempt ${attempt + 1}/${retries}). Retrying in ${delay}ms... Error: ${err?.message}`);
22
+ await new Promise(resolve => setTimeout(resolve, delay));
23
+ }
24
+ }
25
+ throw lastError;
26
+ }
27
+ function isZodSchema(schema) {
28
+ return (typeof schema === 'object' &&
29
+ schema !== null &&
30
+ '_def' in schema &&
31
+ typeof schema.parse === 'function');
32
+ }
33
+ function cleanSchemaForGemini(schema) {
34
+ if (Array.isArray(schema)) {
35
+ return schema.map(cleanSchemaForGemini);
36
+ }
37
+ else if (schema !== null && typeof schema === 'object') {
38
+ const cleaned = {};
39
+ for (const [key, value] of Object.entries(schema)) {
40
+ if (key === '$schema' || key === 'additionalProperties') {
41
+ continue;
42
+ }
43
+ cleaned[key] = cleanSchemaForGemini(value);
44
+ }
45
+ return cleaned;
46
+ }
47
+ return schema;
48
+ }
49
+ function resolveJsonSchema(schema) {
50
+ if (isZodSchema(schema)) {
51
+ // Zod v4 has a built-in toJSONSchema() method
52
+ const jsonSchema = z.toJSONSchema(schema);
53
+ return cleanSchemaForGemini(jsonSchema);
54
+ }
55
+ return cleanSchemaForGemini(schema);
56
+ }
57
+ export class GeminiService {
58
+ genAI;
59
+ structuredModel;
60
+ textModel;
61
+ constructor(apiKey) {
62
+ this.genAI = new GoogleGenerativeAI(apiKey);
63
+ const modelName = process.env.GEMINI_VERSION;
64
+ if (!modelName)
65
+ throw new Error("GEMINI_VERSION must be set in .env");
66
+ this.structuredModel = this.genAI.getGenerativeModel({ model: modelName });
67
+ this.textModel = this.genAI.getGenerativeModel({ model: modelName });
68
+ }
69
+ async generateStructuredData(prompt, schema) {
70
+ const jsonSchema = resolveJsonSchema(schema);
71
+ return withRetry(async () => {
72
+ const result = await this.structuredModel.generateContent({
73
+ contents: [{ role: "user", parts: [{ text: prompt }] }],
74
+ generationConfig: {
75
+ responseMimeType: "application/json",
76
+ responseSchema: jsonSchema,
77
+ },
78
+ });
79
+ const text = result.response.text();
80
+ const parsed = JSON.parse(text);
81
+ // If Zod schema: validate output → get runtime type safety
82
+ if (isZodSchema(schema)) {
83
+ return schema.parse(parsed);
84
+ }
85
+ return parsed;
86
+ });
87
+ }
88
+ async generateText(prompt, systemInstruction) {
89
+ return withRetry(async () => {
90
+ const params = { model: process.env.GEMINI_VERSION || "gemini-1.5-flash" };
91
+ console.log(params);
92
+ if (systemInstruction) {
93
+ params.systemInstruction = { role: "system", parts: [{ text: systemInstruction }] };
94
+ }
95
+ const model = systemInstruction
96
+ ? this.genAI.getGenerativeModel(params)
97
+ : this.textModel;
98
+ const result = await model.generateContent(prompt);
99
+ return result.response.text();
100
+ });
101
+ }
102
+ }
103
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/utils/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whatsapp-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-test.d.ts","sourceRoot":"","sources":["../src/whatsapp-test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import { Sentinel, z } from './index.js';
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+ const API_KEY = process.env.GEMINI_API_KEY || "YOUR_API_KEY";
5
+ async function whatsappTest() {
6
+ const sentinel = new Sentinel({ apiKey: API_KEY, headless: false });
7
+ try {
8
+ await sentinel.init();
9
+ 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
18
+ const chatListSchema = z.object({
19
+ chats: z.array(z.object({ name: z.string() })).min(1).max(2)
20
+ });
21
+ const { chats } = await sentinel.extract(`Look at the LEFT SIDEBAR. List the names of the first 2 conversations.
22
+ Only contact/group names. Skip labels like "Archiviert", dates, message previews.`, chatListSchema);
23
+ console.log(`Found chats: ${chats.map((c) => `"${c.name}"`).join(', ')}`);
24
+ for (const chat of chats) {
25
+ 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}".`);
28
+ if (!opened.success) {
29
+ console.warn(`[Skip] ${opened.message}`);
30
+ continue;
31
+ }
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
34
+ const msgSchema = z.object({
35
+ msgs: z.array(z.object({
36
+ text: z.string(),
37
+ sender: z.enum(["me", "other"])
38
+ }))
39
+ });
40
+ const { msgs } = await sentinel.extract(`Extract the last 5 messages from the RIGHT SIDE conversation panel.
41
+ For each: text content and sender ('me' = outgoing right, 'other' = incoming left).
42
+ Skip system messages like encryption notices or date separators.`, msgSchema);
43
+ console.log(`Last ${msgs.length} messages:`);
44
+ msgs.forEach(m => console.log(` [${m.sender}] ${m.text}`));
45
+ }
46
+ }
47
+ catch (error) {
48
+ console.error("WhatsApp Test Error:", error);
49
+ }
50
+ finally {
51
+ console.log("\nTest finished. Closing browser...");
52
+ await sentinel.close();
53
+ }
54
+ }
55
+ whatsappTest();
56
+ //# sourceMappingURL=whatsapp-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-test.js","sourceRoot":"","sources":["../src/whatsapp-test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@isoldex/sentinel",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered browser automation with Gemini – fast, cheap Stagehand alternative",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "browser-automation",
23
+ "ai",
24
+ "gemini",
25
+ "playwright",
26
+ "stagehand",
27
+ "browser-automation-library",
28
+ "browser-automation-tool",
29
+ "browseruse",
30
+ "selenium",
31
+ "testautomation",
32
+ "web-scraping",
33
+ "llm"
34
+ ],
35
+ "author": "",
36
+ "license": "ISC",
37
+ "peerDependencies": {
38
+ "playwright": ">=1.40.0"
39
+ },
40
+ "dependencies": {
41
+ "@google/generative-ai": "^0.24.1",
42
+ "dotenv": "^17.4.0",
43
+ "zod": "^4.3.6",
44
+ "zod-to-json-schema": "^3.25.2"
45
+ },
46
+ "devDependencies": {
47
+ "@types/dotenv": "^6.1.1",
48
+ "@types/node": "^25.5.2",
49
+ "playwright": "^1.59.1",
50
+ "ts-node": "^10.9.2",
51
+ "typescript": "^6.0.2"
52
+ }
53
+ }