@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.
- package/LICENSE +15 -0
- package/README.md +122 -0
- package/dist/api/act.d.ts +22 -0
- package/dist/api/act.d.ts.map +1 -0
- package/dist/api/act.js +116 -0
- package/dist/api/act.js.map +1 -0
- package/dist/api/extract.d.ts +13 -0
- package/dist/api/extract.d.ts.map +1 -0
- package/dist/api/extract.js +52 -0
- package/dist/api/extract.js.map +1 -0
- package/dist/api/observe.d.ts +17 -0
- package/dist/api/observe.d.ts.map +1 -0
- package/dist/api/observe.js +56 -0
- package/dist/api/observe.js.map +1 -0
- package/dist/complex-test.d.ts +2 -0
- package/dist/complex-test.d.ts.map +1 -0
- package/dist/complex-test.js +58 -0
- package/dist/complex-test.js.map +1 -0
- package/dist/core/driver.d.ts +23 -0
- package/dist/core/driver.d.ts.map +1 -0
- package/dist/core/driver.js +61 -0
- package/dist/core/driver.js.map +1 -0
- package/dist/core/state-parser.d.ts +38 -0
- package/dist/core/state-parser.d.ts.map +1 -0
- package/dist/core/state-parser.js +103 -0
- package/dist/core/state-parser.js.map +1 -0
- package/dist/debug-aom.d.ts +2 -0
- package/dist/debug-aom.d.ts.map +1 -0
- package/dist/debug-aom.js +22 -0
- package/dist/debug-aom.js.map +1 -0
- package/dist/demo.d.ts +2 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +41 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +143 -0
- package/dist/index.js.map +1 -0
- package/dist/list-all.d.ts +2 -0
- package/dist/list-all.d.ts.map +1 -0
- package/dist/list-all.js +25 -0
- package/dist/list-all.js.map +1 -0
- package/dist/list-models.d.ts +2 -0
- package/dist/list-models.d.ts.map +1 -0
- package/dist/list-models.js +11 -0
- package/dist/list-models.js.map +1 -0
- package/dist/reliability/verifier.d.ts +18 -0
- package/dist/reliability/verifier.d.ts.map +1 -0
- package/dist/reliability/verifier.js +64 -0
- package/dist/reliability/verifier.js.map +1 -0
- package/dist/test-versions.d.ts +2 -0
- package/dist/test-versions.d.ts.map +1 -0
- package/dist/test-versions.js +33 -0
- package/dist/test-versions.js.map +1 -0
- package/dist/utils/gemini.d.ts +12 -0
- package/dist/utils/gemini.d.ts.map +1 -0
- package/dist/utils/gemini.js +103 -0
- package/dist/utils/gemini.js.map +1 -0
- package/dist/whatsapp-test.d.ts +2 -0
- package/dist/whatsapp-test.d.ts.map +1 -0
- package/dist/whatsapp-test.js +56 -0
- package/dist/whatsapp-test.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|