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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agent/actions.d.ts +5 -0
  3. package/dist/agent/actions.d.ts.map +1 -0
  4. package/dist/agent/actions.js +26 -0
  5. package/dist/agent/actions.js.map +1 -0
  6. package/dist/agent/agent.d.ts +12 -0
  7. package/dist/agent/agent.d.ts.map +1 -0
  8. package/dist/agent/agent.js +147 -0
  9. package/dist/agent/agent.js.map +1 -0
  10. package/dist/agent/loop.d.ts +6 -0
  11. package/dist/agent/loop.d.ts.map +1 -0
  12. package/dist/agent/loop.js +165 -0
  13. package/dist/agent/loop.js.map +1 -0
  14. package/dist/agent/report.d.ts +3 -0
  15. package/dist/agent/report.d.ts.map +1 -0
  16. package/dist/agent/report.js +90 -0
  17. package/dist/agent/report.js.map +1 -0
  18. package/dist/browser/executor.d.ts +5 -0
  19. package/dist/browser/executor.d.ts.map +1 -0
  20. package/dist/browser/executor.js +33 -0
  21. package/dist/browser/executor.js.map +1 -0
  22. package/dist/browser/snapshot.d.ts +6 -0
  23. package/dist/browser/snapshot.d.ts.map +1 -0
  24. package/dist/browser/snapshot.js +145 -0
  25. package/dist/browser/snapshot.js.map +1 -0
  26. package/dist/config/defaults.d.ts +10 -0
  27. package/dist/config/defaults.d.ts.map +1 -0
  28. package/dist/config/defaults.js +10 -0
  29. package/dist/config/defaults.js.map +1 -0
  30. package/dist/config/schema.d.ts +59 -0
  31. package/dist/config/schema.d.ts.map +1 -0
  32. package/dist/config/schema.js +23 -0
  33. package/dist/config/schema.js.map +1 -0
  34. package/dist/index.d.ts +7 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +8 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/llm/client.d.ts +23 -0
  39. package/dist/llm/client.d.ts.map +1 -0
  40. package/dist/llm/client.js +51 -0
  41. package/dist/llm/client.js.map +1 -0
  42. package/dist/llm/prompt.d.ts +3 -0
  43. package/dist/llm/prompt.d.ts.map +1 -0
  44. package/dist/llm/prompt.js +36 -0
  45. package/dist/llm/prompt.js.map +1 -0
  46. package/dist/scraper/extractors/content.d.ts +22 -0
  47. package/dist/scraper/extractors/content.d.ts.map +1 -0
  48. package/dist/scraper/extractors/content.js +237 -0
  49. package/dist/scraper/extractors/content.js.map +1 -0
  50. package/dist/scraper/extractors/ssr.d.ts +17 -0
  51. package/dist/scraper/extractors/ssr.d.ts.map +1 -0
  52. package/dist/scraper/extractors/ssr.js +162 -0
  53. package/dist/scraper/extractors/ssr.js.map +1 -0
  54. package/dist/scraper/extractors/to-markdown.d.ts +5 -0
  55. package/dist/scraper/extractors/to-markdown.d.ts.map +1 -0
  56. package/dist/scraper/extractors/to-markdown.js +103 -0
  57. package/dist/scraper/extractors/to-markdown.js.map +1 -0
  58. package/dist/scraper/index.d.ts +27 -0
  59. package/dist/scraper/index.d.ts.map +1 -0
  60. package/dist/scraper/index.js +178 -0
  61. package/dist/scraper/index.js.map +1 -0
  62. package/dist/scraper/tiers/tier1-http.d.ts +5 -0
  63. package/dist/scraper/tiers/tier1-http.d.ts.map +1 -0
  64. package/dist/scraper/tiers/tier1-http.js +120 -0
  65. package/dist/scraper/tiers/tier1-http.js.map +1 -0
  66. package/dist/scraper/tiers/tier2-stealth.d.ts +5 -0
  67. package/dist/scraper/tiers/tier2-stealth.d.ts.map +1 -0
  68. package/dist/scraper/tiers/tier2-stealth.js +106 -0
  69. package/dist/scraper/tiers/tier2-stealth.js.map +1 -0
  70. package/dist/scraper/tiers/tier3-browser.d.ts +10 -0
  71. package/dist/scraper/tiers/tier3-browser.d.ts.map +1 -0
  72. package/dist/scraper/tiers/tier3-browser.js +504 -0
  73. package/dist/scraper/tiers/tier3-browser.js.map +1 -0
  74. package/dist/scraper/types.d.ts +130 -0
  75. package/dist/scraper/types.d.ts.map +1 -0
  76. package/dist/scraper/types.js +3 -0
  77. package/dist/scraper/types.js.map +1 -0
  78. package/dist/security/action-validator.d.ts +83 -0
  79. package/dist/security/action-validator.d.ts.map +1 -0
  80. package/dist/security/action-validator.js +36 -0
  81. package/dist/security/action-validator.js.map +1 -0
  82. package/dist/security/url-validator.d.ts +9 -0
  83. package/dist/security/url-validator.d.ts.map +1 -0
  84. package/dist/security/url-validator.js +69 -0
  85. package/dist/security/url-validator.js.map +1 -0
  86. package/dist/types.d.ts +95 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/package.json +54 -0
  91. 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,3 @@
1
+ import type { AgentResult } from "../types.js";
2
+ export declare function generateReport(result: AgentResult, url: string, prompt: string): string;
3
+ //# sourceMappingURL=report.d.ts.map
@@ -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"}