auspex 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 +21 -0
- package/dist/agent/actions.d.ts +5 -0
- package/dist/agent/actions.d.ts.map +1 -0
- package/dist/agent/actions.js +26 -0
- package/dist/agent/actions.js.map +1 -0
- package/dist/agent/agent.d.ts +12 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +147 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/loop.d.ts +6 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +165 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/report.d.ts +3 -0
- package/dist/agent/report.d.ts.map +1 -0
- package/dist/agent/report.js +90 -0
- package/dist/agent/report.js.map +1 -0
- package/dist/browser/executor.d.ts +5 -0
- package/dist/browser/executor.d.ts.map +1 -0
- package/dist/browser/executor.js +33 -0
- package/dist/browser/executor.js.map +1 -0
- package/dist/browser/snapshot.d.ts +6 -0
- package/dist/browser/snapshot.d.ts.map +1 -0
- package/dist/browser/snapshot.js +145 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +10 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/schema.d.ts +59 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +23 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/client.d.ts +23 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +51 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/prompt.d.ts +3 -0
- package/dist/llm/prompt.d.ts.map +1 -0
- package/dist/llm/prompt.js +36 -0
- package/dist/llm/prompt.js.map +1 -0
- package/dist/scraper/extractors/content.d.ts +22 -0
- package/dist/scraper/extractors/content.d.ts.map +1 -0
- package/dist/scraper/extractors/content.js +237 -0
- package/dist/scraper/extractors/content.js.map +1 -0
- package/dist/scraper/extractors/ssr.d.ts +17 -0
- package/dist/scraper/extractors/ssr.d.ts.map +1 -0
- package/dist/scraper/extractors/ssr.js +162 -0
- package/dist/scraper/extractors/ssr.js.map +1 -0
- package/dist/scraper/extractors/to-markdown.d.ts +5 -0
- package/dist/scraper/extractors/to-markdown.d.ts.map +1 -0
- package/dist/scraper/extractors/to-markdown.js +103 -0
- package/dist/scraper/extractors/to-markdown.js.map +1 -0
- package/dist/scraper/index.d.ts +27 -0
- package/dist/scraper/index.d.ts.map +1 -0
- package/dist/scraper/index.js +178 -0
- package/dist/scraper/index.js.map +1 -0
- package/dist/scraper/tiers/tier1-http.d.ts +5 -0
- package/dist/scraper/tiers/tier1-http.d.ts.map +1 -0
- package/dist/scraper/tiers/tier1-http.js +120 -0
- package/dist/scraper/tiers/tier1-http.js.map +1 -0
- package/dist/scraper/tiers/tier2-stealth.d.ts +5 -0
- package/dist/scraper/tiers/tier2-stealth.d.ts.map +1 -0
- package/dist/scraper/tiers/tier2-stealth.js +106 -0
- package/dist/scraper/tiers/tier2-stealth.js.map +1 -0
- package/dist/scraper/tiers/tier3-browser.d.ts +10 -0
- package/dist/scraper/tiers/tier3-browser.d.ts.map +1 -0
- package/dist/scraper/tiers/tier3-browser.js +504 -0
- package/dist/scraper/tiers/tier3-browser.js.map +1 -0
- package/dist/scraper/types.d.ts +130 -0
- package/dist/scraper/types.d.ts.map +1 -0
- package/dist/scraper/types.js +3 -0
- package/dist/scraper/types.js.map +1 -0
- package/dist/security/action-validator.d.ts +83 -0
- package/dist/security/action-validator.d.ts.map +1 -0
- package/dist/security/action-validator.js +36 -0
- package/dist/security/action-validator.js.map +1 -0
- package/dist/security/url-validator.d.ts +9 -0
- package/dist/security/url-validator.d.ts.map +1 -0
- package/dist/security/url-validator.js +69 -0
- package/dist/security/url-validator.js.map +1 -0
- package/dist/types.d.ts +95 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
- package/readme.md +760 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gustavo Soriano
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AgentAction } from "../types.js";
|
|
2
|
+
import { type UrlValidationOptions } from "../security/url-validator.js";
|
|
3
|
+
export declare function parseAndValidateAction(raw: unknown, urlOptions: UrlValidationOptions): Promise<AgentAction>;
|
|
4
|
+
export declare function formatActionForHistory(action: AgentAction, iteration: number): string;
|
|
5
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/agent/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAe,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEtF,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,WAAW,CAAC,CAQtB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAerF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { validateAction } from "../security/action-validator.js";
|
|
2
|
+
import { validateUrl } from "../security/url-validator.js";
|
|
3
|
+
export async function parseAndValidateAction(raw, urlOptions) {
|
|
4
|
+
const action = validateAction(raw);
|
|
5
|
+
if (action.type === "goto") {
|
|
6
|
+
await validateUrl(action.url, urlOptions);
|
|
7
|
+
}
|
|
8
|
+
return action;
|
|
9
|
+
}
|
|
10
|
+
export function formatActionForHistory(action, iteration) {
|
|
11
|
+
switch (action.type) {
|
|
12
|
+
case "click":
|
|
13
|
+
return `[${iteration}] click "${action.selector}"`;
|
|
14
|
+
case "type":
|
|
15
|
+
return `[${iteration}] type "${action.text}" into "${action.selector}"`;
|
|
16
|
+
case "goto":
|
|
17
|
+
return `[${iteration}] navigate to ${action.url}`;
|
|
18
|
+
case "wait":
|
|
19
|
+
return `[${iteration}] wait ${action.ms}ms`;
|
|
20
|
+
case "scroll":
|
|
21
|
+
return `[${iteration}] scroll ${action.direction}`;
|
|
22
|
+
case "done":
|
|
23
|
+
return `[${iteration}] done: ${action.result}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/agent/actions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,WAAW,EAA6B,MAAM,8BAA8B,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAY,EACZ,UAAgC;IAEhC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAmB,EAAE,SAAiB;IAC3E,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,IAAI,SAAS,YAAY,MAAM,CAAC,QAAQ,GAAG,CAAC;QACrD,KAAK,MAAM;YACT,OAAO,IAAI,SAAS,WAAW,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,QAAQ,GAAG,CAAC;QAC1E,KAAK,MAAM;YACT,OAAO,IAAI,SAAS,iBAAiB,MAAM,CAAC,GAAG,EAAE,CAAC;QACpD,KAAK,MAAM;YACT,OAAO,IAAI,SAAS,UAAU,MAAM,CAAC,EAAE,IAAI,CAAC;QAC9C,KAAK,QAAQ;YACX,OAAO,IAAI,SAAS,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC;QACrD,KAAK,MAAM;YACT,OAAO,IAAI,SAAS,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentConfig, AgentResult, RunOptions } from "../types.js";
|
|
2
|
+
export declare class Auspex {
|
|
3
|
+
private config;
|
|
4
|
+
private browser;
|
|
5
|
+
constructor(config: AgentConfig);
|
|
6
|
+
private getChromiumPids;
|
|
7
|
+
private makeChromiumMemoryTracker;
|
|
8
|
+
private ensureBrowser;
|
|
9
|
+
run(options: RunOptions): Promise<AgentResult>;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOxE,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,MAAM,EAAE,WAAW;IAM/B,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,yBAAyB;YA4BnB,aAAa;IASrB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAmF9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { chromium } from "playwright";
|
|
3
|
+
import { gotScraping } from "got-scraping";
|
|
4
|
+
import { agentConfigSchema, runOptionsSchema } from "../config/schema.js";
|
|
5
|
+
import { validateUrl } from "../security/url-validator.js";
|
|
6
|
+
import { snapshotFromHtml } from "../browser/snapshot.js";
|
|
7
|
+
import { runStaticLoop, runAgentLoop } from "./loop.js";
|
|
8
|
+
import { generateReport } from "./report.js";
|
|
9
|
+
export class Auspex {
|
|
10
|
+
config;
|
|
11
|
+
browser = null;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = agentConfigSchema.parse(config);
|
|
14
|
+
}
|
|
15
|
+
// ββ Snapshot de PIDs do Chromium antes do launch βββββββββββββββββββββββββ
|
|
16
|
+
getChromiumPids() {
|
|
17
|
+
try {
|
|
18
|
+
const out = execSync("ps aux | grep -i chromium | grep -v grep | awk '{print $2}'", {
|
|
19
|
+
encoding: "utf-8",
|
|
20
|
+
timeout: 2_000,
|
|
21
|
+
});
|
|
22
|
+
return new Set(out.trim().split("\n").filter(Boolean));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return new Set();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ββ Soma RSS de todos os processos Chromium novos (KB) ββββββββββββββββββββ
|
|
29
|
+
makeChromiumMemoryTracker(pidsBeforeLaunch) {
|
|
30
|
+
return () => {
|
|
31
|
+
try {
|
|
32
|
+
const out = execSync("ps aux | grep -i chromium | grep -v grep | awk '{print $2}'", {
|
|
33
|
+
encoding: "utf-8",
|
|
34
|
+
timeout: 2_000,
|
|
35
|
+
});
|
|
36
|
+
const newPids = out.trim().split("\n").filter(p => p && !pidsBeforeLaunch.has(p));
|
|
37
|
+
if (newPids.length === 0)
|
|
38
|
+
return 0;
|
|
39
|
+
// Soma o RSS de todos os processos Chromium lanΓ§ados por este agente
|
|
40
|
+
const pidsArg = newPids.join(",");
|
|
41
|
+
const rssOut = execSync(`ps -o rss= -p ${pidsArg}`, {
|
|
42
|
+
encoding: "utf-8",
|
|
43
|
+
timeout: 2_000,
|
|
44
|
+
});
|
|
45
|
+
return rssOut
|
|
46
|
+
.trim()
|
|
47
|
+
.split("\n")
|
|
48
|
+
.reduce((sum, line) => sum + (parseInt(line.trim(), 10) || 0), 0);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// ββ Garante que o browser Playwright estΓ‘ rodando βββββββββββββββββββββββββ
|
|
56
|
+
async ensureBrowser() {
|
|
57
|
+
if (!this.browser || !this.browser.isConnected()) {
|
|
58
|
+
this.browser = await chromium.launch({ headless: true });
|
|
59
|
+
}
|
|
60
|
+
return this.browser;
|
|
61
|
+
}
|
|
62
|
+
// ββ ExecuΓ§Γ£o principal ββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
63
|
+
async run(options) {
|
|
64
|
+
const { url, prompt } = runOptionsSchema.parse(options);
|
|
65
|
+
const validUrl = await validateUrl(url, {
|
|
66
|
+
allowedDomains: this.config.allowedDomains,
|
|
67
|
+
blockedDomains: this.config.blockedDomains,
|
|
68
|
+
});
|
|
69
|
+
// ββ 1. Tenta HTTP/Cheerio primeiro (sem browser) ββββββββββββββββββββββ
|
|
70
|
+
//
|
|
71
|
+
// Se o HTML da pΓ‘gina jΓ‘ tiver conteΓΊdo suficiente E o LLM conseguir
|
|
72
|
+
// responder com "done" na primeira tentativa β economizamos o Playwright
|
|
73
|
+
// (zero processos externos, ~100-500ms vs ~5-30s).
|
|
74
|
+
//
|
|
75
|
+
try {
|
|
76
|
+
const response = await gotScraping({
|
|
77
|
+
url: validUrl,
|
|
78
|
+
method: "GET",
|
|
79
|
+
headerGeneratorOptions: {
|
|
80
|
+
browsers: [{ name: "chrome", minVersion: 120 }],
|
|
81
|
+
operatingSystems: ["macos", "windows"],
|
|
82
|
+
devices: ["desktop"],
|
|
83
|
+
locales: ["pt-BR", "pt", "en-US"],
|
|
84
|
+
},
|
|
85
|
+
timeout: { request: Math.min(this.config.timeoutMs, 10_000) },
|
|
86
|
+
followRedirect: true,
|
|
87
|
+
maxRedirects: 10,
|
|
88
|
+
throwHttpErrors: false,
|
|
89
|
+
decompress: true,
|
|
90
|
+
});
|
|
91
|
+
const { body: html, statusCode: status } = response;
|
|
92
|
+
if (html && status < 400) {
|
|
93
|
+
const snapshot = snapshotFromHtml(html, validUrl);
|
|
94
|
+
// SΓ³ tenta o loop estΓ‘tico se houver conteΓΊdo mΓnimo (evita SPA vazia)
|
|
95
|
+
if (snapshot.text.length > 200) {
|
|
96
|
+
const staticResult = await runStaticLoop(snapshot, validUrl, prompt, this.config);
|
|
97
|
+
if (staticResult)
|
|
98
|
+
return staticResult; // β
resolvido sem browser
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// HTTP falhou (timeout, SSL, rede) β vai direto para o Playwright
|
|
104
|
+
}
|
|
105
|
+
// ββ 2. Playwright (fallback β pΓ‘gina precisa de JS ou de interaΓ§Γ£o) βββ
|
|
106
|
+
const pidsBefore = this.getChromiumPids();
|
|
107
|
+
const browser = await this.ensureBrowser();
|
|
108
|
+
const getMemoryKb = this.makeChromiumMemoryTracker(pidsBefore);
|
|
109
|
+
let page = null;
|
|
110
|
+
try {
|
|
111
|
+
const context = await browser.newContext();
|
|
112
|
+
page = await context.newPage();
|
|
113
|
+
await page.goto(validUrl, { waitUntil: "domcontentloaded", timeout: 15_000 });
|
|
114
|
+
return await runAgentLoop(page, validUrl, prompt, this.config, getMemoryKb);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
118
|
+
const result = {
|
|
119
|
+
status: "error",
|
|
120
|
+
tier: "playwright",
|
|
121
|
+
data: null,
|
|
122
|
+
report: "",
|
|
123
|
+
durationMs: 0,
|
|
124
|
+
actions: [],
|
|
125
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, calls: 0 },
|
|
126
|
+
memory: { browserPeakRssKb: 0, nodeHeapUsedMb: 0 },
|
|
127
|
+
error: errorMsg,
|
|
128
|
+
};
|
|
129
|
+
result.report = generateReport(result, validUrl, prompt);
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
if (page) {
|
|
134
|
+
const context = page.context();
|
|
135
|
+
await page.close().catch(() => { });
|
|
136
|
+
await context.close().catch(() => { });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async close() {
|
|
141
|
+
if (this.browser) {
|
|
142
|
+
await this.browser.close().catch(() => { });
|
|
143
|
+
this.browser = null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Page } from "playwright-core";
|
|
2
|
+
import type { AgentResult, PageSnapshot } from "../types.js";
|
|
3
|
+
import type { ValidatedConfig } from "../config/schema.js";
|
|
4
|
+
export declare function runStaticLoop(snapshot: PageSnapshot, url: string, prompt: string, config: ValidatedConfig): Promise<AgentResult | null>;
|
|
5
|
+
export declare function runAgentLoop(page: Page, url: string, prompt: string, config: ValidatedConfig, getMemoryKb?: () => number): Promise<AgentResult>;
|
|
6
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAkD,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAwD3D,wBAAsB,aAAa,CACjC,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAiD7B;AASD,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,WAAW,GAAE,MAAM,MAAgB,GAClC,OAAO,CAAC,WAAW,CAAC,CAkGtB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { takeSnapshot, formatSnapshot } from "../browser/snapshot.js";
|
|
2
|
+
import { executeAction } from "../browser/executor.js";
|
|
3
|
+
import { LLMClient } from "../llm/client.js";
|
|
4
|
+
import { parseAndValidateAction, formatActionForHistory } from "./actions.js";
|
|
5
|
+
import { generateReport } from "./report.js";
|
|
6
|
+
// Janela deslizante do histΓ³rico enviado ao LLM.
|
|
7
|
+
// MantΓ©m o primeiro item (contexto inicial) + os N mais recentes.
|
|
8
|
+
// Evita que o histΓ³rico cresΓ§a indefinidamente e consuma tokens desnecessΓ‘rios.
|
|
9
|
+
const HISTORY_WINDOW = 8;
|
|
10
|
+
// DetecΓ§Γ£o de loop: janela deslizante das ΓΊltimas N action keys.
|
|
11
|
+
// Se uma mesma aΓ§Γ£o aparecer MAX_OCCURRENCES vezes dentro de RECENT_WINDOW
|
|
12
|
+
// iteraΓ§Γ΅es, o agente estΓ‘ preso (captura padrΓ΅es A,A,A e tambΓ©m A,B,A,B,A).
|
|
13
|
+
const RECENT_WINDOW = 9; // quantas aΓ§Γ΅es recentes rastrear
|
|
14
|
+
const MAX_OCCURRENCES = 3; // mΓ‘ximo de vezes que a mesma aΓ§Γ£o pode aparecer na janela
|
|
15
|
+
function windowedHistory(history) {
|
|
16
|
+
if (history.length <= HISTORY_WINDOW)
|
|
17
|
+
return history;
|
|
18
|
+
// Primeiro item = contexto de inΓcio de navegaΓ§Γ£o β sempre preservado
|
|
19
|
+
return [history[0], ...history.slice(-(HISTORY_WINDOW - 1))];
|
|
20
|
+
}
|
|
21
|
+
function buildResult(status, tier, data, actions, usage, peakRssKb, startTime, url, prompt, error) {
|
|
22
|
+
const mem = process.memoryUsage();
|
|
23
|
+
const memory = {
|
|
24
|
+
browserPeakRssKb: peakRssKb,
|
|
25
|
+
nodeHeapUsedMb: Math.round((mem.heapUsed / 1024 / 1024) * 100) / 100,
|
|
26
|
+
};
|
|
27
|
+
const durationMs = Date.now() - startTime;
|
|
28
|
+
const result = { status, tier, data, report: "", durationMs, actions, usage, memory, error };
|
|
29
|
+
result.report = generateReport(result, url, prompt);
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
// βββ Loop estΓ‘tico (sem browser) ββββββββββββββββββββββββββββββββββββββββββββββ
|
|
33
|
+
//
|
|
34
|
+
// Tenta resolver o prompt em UMA chamada LLM usando snapshot do HTML via Cheerio.
|
|
35
|
+
// Retorna AgentResult com tier="http" se o LLM conseguir responder com "done".
|
|
36
|
+
// Retorna null se o LLM precisar de interaΓ§Γ£o β sinal para lanΓ§ar o Playwright.
|
|
37
|
+
//
|
|
38
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
39
|
+
export async function runStaticLoop(snapshot, url, prompt, config) {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
const urlOptions = {
|
|
42
|
+
allowedDomains: config.allowedDomains,
|
|
43
|
+
blockedDomains: config.blockedDomains,
|
|
44
|
+
};
|
|
45
|
+
const llm = new LLMClient(config.llmApiKey, config.model, {
|
|
46
|
+
temperature: config.temperature,
|
|
47
|
+
maxTokens: config.maxTokens,
|
|
48
|
+
topP: config.topP,
|
|
49
|
+
frequencyPenalty: config.frequencyPenalty,
|
|
50
|
+
presencePenalty: config.presencePenalty,
|
|
51
|
+
}, config.llmBaseUrl);
|
|
52
|
+
const usage = { promptTokens: 0, completionTokens: 0, totalTokens: 0, calls: 0 };
|
|
53
|
+
let raw;
|
|
54
|
+
try {
|
|
55
|
+
const response = await llm.decideAction(prompt, formatSnapshot(snapshot), []);
|
|
56
|
+
raw = response.data;
|
|
57
|
+
usage.promptTokens = response.usage.promptTokens;
|
|
58
|
+
usage.completionTokens = response.usage.completionTokens;
|
|
59
|
+
usage.totalTokens = response.usage.totalTokens;
|
|
60
|
+
usage.calls = 1;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null; // Falha na chamada LLM β cai para o Playwright
|
|
64
|
+
}
|
|
65
|
+
let action;
|
|
66
|
+
try {
|
|
67
|
+
action = await parseAndValidateAction(raw, urlOptions);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null; // AΓ§Γ£o invΓ‘lida β cai para o Playwright
|
|
71
|
+
}
|
|
72
|
+
if (action.type === "done") {
|
|
73
|
+
// LLM conseguiu extrair os dados do HTML estΓ‘tico β
sem precisar de browser
|
|
74
|
+
const actions = [{ action, iteration: 0, timestamp: Date.now() }];
|
|
75
|
+
return buildResult("done", "http", action.result, actions, usage, 0, startTime, url, prompt);
|
|
76
|
+
}
|
|
77
|
+
// LLM precisa navegar ou interagir (click, goto, etc.) β Playwright necessΓ‘rio
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// βββ Loop interativo (Playwright) ββββββββββββββββββββββββββββββββββββββββββββ
|
|
81
|
+
//
|
|
82
|
+
// getMemoryKb: callback que retorna o RSS do processo do browser em KB.
|
|
83
|
+
// Passado pelo agent.ts usando o PID do processo Chromium lanΓ§ado.
|
|
84
|
+
//
|
|
85
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
86
|
+
export async function runAgentLoop(page, url, prompt, config, getMemoryKb = () => 0) {
|
|
87
|
+
const llm = new LLMClient(config.llmApiKey, config.model, {
|
|
88
|
+
temperature: config.temperature,
|
|
89
|
+
maxTokens: config.maxTokens,
|
|
90
|
+
topP: config.topP,
|
|
91
|
+
frequencyPenalty: config.frequencyPenalty,
|
|
92
|
+
presencePenalty: config.presencePenalty,
|
|
93
|
+
}, config.llmBaseUrl);
|
|
94
|
+
const urlOptions = {
|
|
95
|
+
allowedDomains: config.allowedDomains,
|
|
96
|
+
blockedDomains: config.blockedDomains,
|
|
97
|
+
};
|
|
98
|
+
// Auto-dismiss any dialogs (alert, confirm, prompt) to prevent browser from hanging
|
|
99
|
+
page.on("dialog", (dialog) => dialog.dismiss().catch(() => { }));
|
|
100
|
+
const actions = [];
|
|
101
|
+
const history = [];
|
|
102
|
+
const usage = { promptTokens: 0, completionTokens: 0, totalTokens: 0, calls: 0 };
|
|
103
|
+
let peakRssKb = 0;
|
|
104
|
+
const recentActionKeys = []; // janela deslizante para detecΓ§Γ£o de loop
|
|
105
|
+
const startTime = Date.now();
|
|
106
|
+
for (let i = 0; i < config.maxIterations; i++) {
|
|
107
|
+
const currentRss = getMemoryKb();
|
|
108
|
+
if (currentRss > peakRssKb)
|
|
109
|
+
peakRssKb = currentRss;
|
|
110
|
+
if (Date.now() - startTime > config.timeoutMs) {
|
|
111
|
+
return buildResult("timeout", "playwright", null, actions, usage, peakRssKb, startTime, url, prompt, `Timeout after ${config.timeoutMs}ms`);
|
|
112
|
+
}
|
|
113
|
+
const snapshot = await takeSnapshot(page);
|
|
114
|
+
const formatted = formatSnapshot(snapshot);
|
|
115
|
+
let raw;
|
|
116
|
+
try {
|
|
117
|
+
const response = await llm.decideAction(prompt, formatted, windowedHistory(history));
|
|
118
|
+
raw = response.data;
|
|
119
|
+
usage.promptTokens += response.usage.promptTokens;
|
|
120
|
+
usage.completionTokens += response.usage.completionTokens;
|
|
121
|
+
usage.totalTokens += response.usage.totalTokens;
|
|
122
|
+
usage.calls++;
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
return buildResult("error", "playwright", null, actions, usage, peakRssKb, startTime, url, prompt, `LLM error: ${err instanceof Error ? err.message : String(err)}`);
|
|
126
|
+
}
|
|
127
|
+
let action;
|
|
128
|
+
try {
|
|
129
|
+
action = await parseAndValidateAction(raw, urlOptions);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
return buildResult("error", "playwright", null, actions, usage, peakRssKb, startTime, url, prompt, `Action validation error: ${err instanceof Error ? err.message : String(err)}`);
|
|
133
|
+
}
|
|
134
|
+
// ββ DetecΓ§Γ£o de loop (padrΓ£o A,A,A e tambΓ©m alternados A,B,A,B,A) βββββ
|
|
135
|
+
// Conta quantas vezes esta aΓ§Γ£o aparece nas ΓΊltimas RECENT_WINDOW iteraΓ§Γ΅es.
|
|
136
|
+
// Se atingir MAX_OCCURRENCES, o agente estΓ‘ preso e precisa tentar outra abordagem.
|
|
137
|
+
const actionKey = JSON.stringify(action);
|
|
138
|
+
const occurrencesInWindow = recentActionKeys.filter(k => k === actionKey).length;
|
|
139
|
+
if (occurrencesInWindow >= MAX_OCCURRENCES) {
|
|
140
|
+
history.push(`[${i}] STUCK: action repeated ${MAX_OCCURRENCES} times in the last ${RECENT_WINDOW} steps. ` +
|
|
141
|
+
"You MUST try a completely different approach.");
|
|
142
|
+
recentActionKeys.length = 0; // reseta a janela para permitir nova tentativa
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
recentActionKeys.push(actionKey);
|
|
146
|
+
if (recentActionKeys.length > RECENT_WINDOW)
|
|
147
|
+
recentActionKeys.shift();
|
|
148
|
+
actions.push({ action, iteration: i, timestamp: Date.now() });
|
|
149
|
+
history.push(formatActionForHistory(action, i));
|
|
150
|
+
if (action.type === "done") {
|
|
151
|
+
return buildResult("done", "playwright", action.result, actions, usage, peakRssKb, startTime, url, prompt);
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
await executeAction(page, action, urlOptions);
|
|
155
|
+
history.push(formatActionForHistory(action, i) + " -> OK");
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
159
|
+
history.push(`[${i}] ERROR executing ${action.type}: ${msg}. Try a different approach.`);
|
|
160
|
+
}
|
|
161
|
+
await page.waitForTimeout(1_000);
|
|
162
|
+
}
|
|
163
|
+
return buildResult("max_iterations", "playwright", null, actions, usage, peakRssKb, startTime, url, prompt, `Reached max iterations (${config.maxIterations})`);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/agent/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAuD1E,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgDvF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
function describeAction(record) {
|
|
2
|
+
const { action } = record;
|
|
3
|
+
switch (action.type) {
|
|
4
|
+
case "click":
|
|
5
|
+
return `Clicou no elemento "${action.selector}"`;
|
|
6
|
+
case "type":
|
|
7
|
+
return `Digitou "${action.text}" no campo "${action.selector}"`;
|
|
8
|
+
case "goto":
|
|
9
|
+
return `Navegou para ${action.url}`;
|
|
10
|
+
case "wait":
|
|
11
|
+
return `Aguardou ${action.ms}ms`;
|
|
12
|
+
case "scroll":
|
|
13
|
+
return `Fez scroll ${action.direction === "down" ? "para baixo" : "para cima"}`;
|
|
14
|
+
case "done":
|
|
15
|
+
return `Finalizou com resultado`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function describeStatus(result) {
|
|
19
|
+
switch (result.status) {
|
|
20
|
+
case "done":
|
|
21
|
+
return "Tarefa concluΓda com sucesso.";
|
|
22
|
+
case "max_iterations":
|
|
23
|
+
return `Tarefa interrompida: atingiu o limite de ${result.actions.length} iteraΓ§Γ΅es sem concluir.`;
|
|
24
|
+
case "timeout":
|
|
25
|
+
return "Tarefa interrompida: tempo limite excedido.";
|
|
26
|
+
case "error":
|
|
27
|
+
return `Tarefa interrompida por erro: ${result.error}`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function describeTier(result) {
|
|
31
|
+
if (result.tier === "http") {
|
|
32
|
+
return "π’ HTTP/Cheerio (sem browser β pΓ‘gina estΓ‘tica)";
|
|
33
|
+
}
|
|
34
|
+
return "π‘ Playwright Chromium (browser completo β JS necessΓ‘rio)";
|
|
35
|
+
}
|
|
36
|
+
function describeMemory(result) {
|
|
37
|
+
const node = `Node.js heap ${result.memory.nodeHeapUsedMb} MB`;
|
|
38
|
+
if (result.tier === "http") {
|
|
39
|
+
return `${node} | Browser: nΓ£o utilizado`;
|
|
40
|
+
}
|
|
41
|
+
if (result.memory.browserPeakRssKb > 0) {
|
|
42
|
+
const browserMb = (result.memory.browserPeakRssKb / 1024).toFixed(1);
|
|
43
|
+
return `${node} | Chromium pico ${browserMb} MB`;
|
|
44
|
+
}
|
|
45
|
+
return `${node} | Chromium: RSS nΓ£o disponΓvel`;
|
|
46
|
+
}
|
|
47
|
+
export function generateReport(result, url, prompt) {
|
|
48
|
+
const lines = [];
|
|
49
|
+
const duration = (result.durationMs / 1000).toFixed(1);
|
|
50
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
51
|
+
lines.push(" RELATΓRIO DE EXECUΓΓO");
|
|
52
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
53
|
+
lines.push("");
|
|
54
|
+
lines.push(` URL : ${url}`);
|
|
55
|
+
lines.push(` Prompt : ${prompt}`);
|
|
56
|
+
lines.push(` Status : ${describeStatus(result)}`);
|
|
57
|
+
lines.push(` MΓ©todo : ${describeTier(result)}`);
|
|
58
|
+
lines.push(` DuraΓ§Γ£o: ${duration}s`);
|
|
59
|
+
lines.push("");
|
|
60
|
+
if (result.actions.length > 0) {
|
|
61
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
62
|
+
lines.push(" PASSO A PASSO");
|
|
63
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
64
|
+
lines.push("");
|
|
65
|
+
for (const record of result.actions) {
|
|
66
|
+
const step = record.iteration + 1;
|
|
67
|
+
lines.push(` ${step}. ${describeAction(record)}`);
|
|
68
|
+
}
|
|
69
|
+
lines.push("");
|
|
70
|
+
}
|
|
71
|
+
if (result.data) {
|
|
72
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
73
|
+
lines.push(" RESULTADO");
|
|
74
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
75
|
+
lines.push("");
|
|
76
|
+
lines.push(` ${result.data}`);
|
|
77
|
+
lines.push("");
|
|
78
|
+
}
|
|
79
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
80
|
+
lines.push(" CONSUMO DE RECURSOS");
|
|
81
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
82
|
+
lines.push("");
|
|
83
|
+
lines.push(` LLM : ${result.usage.calls} chamada(s) | ${result.usage.totalTokens} tokens`);
|
|
84
|
+
lines.push(` β³ ${result.usage.promptTokens} prompt + ${result.usage.completionTokens} completion`);
|
|
85
|
+
lines.push(` RAM : ${describeMemory(result)}`);
|
|
86
|
+
lines.push("");
|
|
87
|
+
lines.push("βββββββββββββββββββββββββββββββββββββββββββ");
|
|
88
|
+
return lines.join("\n");
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/agent/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Page } from "playwright-core";
|
|
2
|
+
import type { AgentAction } from "../types.js";
|
|
3
|
+
import { type UrlValidationOptions } from "../security/url-validator.js";
|
|
4
|
+
export declare function executeAction(page: Page, action: AgentAction, urlOptions: UrlValidationOptions): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/browser/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAe,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEtF,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { validateUrl } from "../security/url-validator.js";
|
|
2
|
+
export async function executeAction(page, action, urlOptions) {
|
|
3
|
+
switch (action.type) {
|
|
4
|
+
case "click": {
|
|
5
|
+
const urlBefore = page.url();
|
|
6
|
+
await page.click(action.selector, { timeout: 10_000 });
|
|
7
|
+
// If click triggered navigation, wait for it to settle
|
|
8
|
+
if (page.url() !== urlBefore) {
|
|
9
|
+
await page.waitForLoadState("domcontentloaded", { timeout: 15_000 }).catch(() => { });
|
|
10
|
+
}
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
case "type":
|
|
14
|
+
await page.fill(action.selector, action.text, { timeout: 5_000 });
|
|
15
|
+
break;
|
|
16
|
+
case "goto": {
|
|
17
|
+
const validUrl = await validateUrl(action.url, urlOptions);
|
|
18
|
+
await page.goto(validUrl, { waitUntil: "domcontentloaded", timeout: 30_000 });
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
case "wait":
|
|
22
|
+
await page.waitForTimeout(action.ms);
|
|
23
|
+
break;
|
|
24
|
+
case "scroll":
|
|
25
|
+
await page.evaluate((dir) => {
|
|
26
|
+
window.scrollBy(0, dir === "down" ? 500 : -500);
|
|
27
|
+
}, action.direction);
|
|
28
|
+
break;
|
|
29
|
+
case "done":
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/browser/executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAA6B,MAAM,8BAA8B,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAU,EACV,MAAmB,EACnB,UAAgC;IAEhC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACvD,uDAAuD;YACvD,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,MAAM;YACT,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,MAAM;QAER,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC3D,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9E,MAAM;QACR,CAAC;QAED,KAAK,MAAM;YACT,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAW,EAAE,EAAE;gBAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAClD,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACrB,MAAM;QAER,KAAK,MAAM;YACT,MAAM;IACV,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Page } from "playwright-core";
|
|
2
|
+
import type { PageSnapshot } from "../types.js";
|
|
3
|
+
export declare function takeSnapshot(page: Page): Promise<PageSnapshot>;
|
|
4
|
+
export declare function snapshotFromHtml(html: string, url: string): PageSnapshot;
|
|
5
|
+
export declare function formatSnapshot(snapshot: PageSnapshot): string;
|
|
6
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/browser/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAA6C,MAAM,aAAa,CAAC;AAqC3F,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAwCpE;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CA0CxE;AAID,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CA8B7D"}
|