zan-browser 2.0.8 → 3.0.1
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/dist/agent/agent.d.ts +42 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +163 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/conversation.d.ts +22 -0
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js +47 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/prompt.d.ts +3 -0
- package/dist/agent/prompt.d.ts.map +1 -0
- package/dist/agent/prompt.js +77 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/browser.d.ts +0 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -10
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +19 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -3
- package/dist/index.js.map +1 -1
- package/dist/observer.d.ts +5 -1
- package/dist/observer.d.ts.map +1 -1
- package/dist/observer.js +23 -3
- package/dist/observer.js.map +1 -1
- package/dist/registry.d.ts +20 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +69 -0
- package/dist/registry.js.map +1 -0
- package/dist/session.d.ts +12 -27
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +74 -206
- package/dist/session.js.map +1 -1
- package/dist/tools/base.d.ts +37 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +6 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/browser/click.d.ts +8 -0
- package/dist/tools/browser/click.d.ts.map +1 -0
- package/dist/tools/browser/click.js +42 -0
- package/dist/tools/browser/click.js.map +1 -0
- package/dist/tools/browser/eval_js.d.ts +8 -0
- package/dist/tools/browser/eval_js.d.ts.map +1 -0
- package/dist/tools/browser/eval_js.js +46 -0
- package/dist/tools/browser/eval_js.js.map +1 -0
- package/dist/tools/browser/fill.d.ts +8 -0
- package/dist/tools/browser/fill.d.ts.map +1 -0
- package/dist/tools/browser/fill.js +48 -0
- package/dist/tools/browser/fill.js.map +1 -0
- package/dist/tools/browser/navigate.d.ts +8 -0
- package/dist/tools/browser/navigate.d.ts.map +1 -0
- package/dist/tools/browser/navigate.js +40 -0
- package/dist/tools/browser/navigate.js.map +1 -0
- package/dist/tools/browser/screenshot.d.ts +8 -0
- package/dist/tools/browser/screenshot.d.ts.map +1 -0
- package/dist/tools/browser/screenshot.js +27 -0
- package/dist/tools/browser/screenshot.js.map +1 -0
- package/dist/tools/browser/scroll.d.ts +8 -0
- package/dist/tools/browser/scroll.d.ts.map +1 -0
- package/dist/tools/browser/scroll.js +36 -0
- package/dist/tools/browser/scroll.js.map +1 -0
- package/dist/tools/browser/wait.d.ts +8 -0
- package/dist/tools/browser/wait.d.ts.map +1 -0
- package/dist/tools/browser/wait.js +27 -0
- package/dist/tools/browser/wait.js.map +1 -0
- package/dist/tools/network/download_file.d.ts +8 -0
- package/dist/tools/network/download_file.d.ts.map +1 -0
- package/dist/tools/network/download_file.js +68 -0
- package/dist/tools/network/download_file.js.map +1 -0
- package/dist/tools/network/fetch_url.d.ts +8 -0
- package/dist/tools/network/fetch_url.d.ts.map +1 -0
- package/dist/tools/network/fetch_url.js +68 -0
- package/dist/tools/network/fetch_url.js.map +1 -0
- package/dist/tools/network/read_network_logs.d.ts +8 -0
- package/dist/tools/network/read_network_logs.d.ts.map +1 -0
- package/dist/tools/network/read_network_logs.js +64 -0
- package/dist/tools/network/read_network_logs.js.map +1 -0
- package/dist/tools/network/web_search.d.ts +8 -0
- package/dist/tools/network/web_search.d.ts.map +1 -0
- package/dist/tools/network/web_search.js +63 -0
- package/dist/tools/network/web_search.js.map +1 -0
- package/dist/tools/page/extract_dom.d.ts +8 -0
- package/dist/tools/page/extract_dom.d.ts.map +1 -0
- package/dist/tools/page/extract_dom.js +37 -0
- package/dist/tools/page/extract_dom.js.map +1 -0
- package/dist/tools/page/observe.d.ts +8 -0
- package/dist/tools/page/observe.d.ts.map +1 -0
- package/dist/tools/page/observe.js +37 -0
- package/dist/tools/page/observe.js.map +1 -0
- package/dist/tools/page/scrape.d.ts +8 -0
- package/dist/tools/page/scrape.d.ts.map +1 -0
- package/dist/tools/page/scrape.js +75 -0
- package/dist/tools/page/scrape.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ToolRegistry } from "../registry";
|
|
2
|
+
import type { ToolContext, ToolResult } from "../tools/base";
|
|
3
|
+
import type { SeedValue, CapturedRequest } from "../types";
|
|
4
|
+
export interface AgentConfig {
|
|
5
|
+
goal: string;
|
|
6
|
+
seedValues?: SeedValue[];
|
|
7
|
+
maxSteps?: number;
|
|
8
|
+
model?: string;
|
|
9
|
+
onProgress?: (msg: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface AgentStepRecord {
|
|
12
|
+
step: number;
|
|
13
|
+
toolName: string;
|
|
14
|
+
params: Record<string, unknown>;
|
|
15
|
+
result: ToolResult;
|
|
16
|
+
reasoning: string;
|
|
17
|
+
}
|
|
18
|
+
export interface AgentResult {
|
|
19
|
+
success: boolean;
|
|
20
|
+
steps: AgentStepRecord[];
|
|
21
|
+
finalUrl: string;
|
|
22
|
+
reason: string;
|
|
23
|
+
capturedRequests: CapturedRequest[];
|
|
24
|
+
}
|
|
25
|
+
export declare class AgentLoop {
|
|
26
|
+
private client;
|
|
27
|
+
private model;
|
|
28
|
+
private registry;
|
|
29
|
+
private ctx;
|
|
30
|
+
private conversation;
|
|
31
|
+
private systemPrompt;
|
|
32
|
+
constructor(registry: ToolRegistry, ctx: ToolContext, model?: string);
|
|
33
|
+
run(config: AgentConfig): Promise<AgentResult>;
|
|
34
|
+
private askLLM;
|
|
35
|
+
private parseDecision;
|
|
36
|
+
/** Fallback: extract params from flat action object (legacy format compat) */
|
|
37
|
+
private extractLegacyParams;
|
|
38
|
+
private getCurrentUrl;
|
|
39
|
+
private hasUsefulCaptures;
|
|
40
|
+
private buildResult;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAM3D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,eAAe,EAAE,CAAC;CACrC;AAaD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,YAAY,CAAS;gBAG3B,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,WAAW,EAChB,KAAK,CAAC,EAAE,MAAM;IAUV,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YA4FtC,MAAM;IAkBpB,OAAO,CAAC,aAAa;IAyBrB,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─── Agent Loop ──────────────────────────────────────────────────────────────
|
|
3
|
+
// observe → LLM decides → registry.execute() → repeat
|
|
4
|
+
// Replaces SmartNavigator. No hardcoded strategies — the LLM decides everything.
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AgentLoop = void 0;
|
|
10
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
11
|
+
const conversation_1 = require("./conversation");
|
|
12
|
+
const prompt_1 = require("./prompt");
|
|
13
|
+
const FALLBACK_MODEL = "claude-haiku-4-5-20251001";
|
|
14
|
+
// ─── Agent ───────────────────────────────────────────────────────────────────
|
|
15
|
+
class AgentLoop {
|
|
16
|
+
client;
|
|
17
|
+
model;
|
|
18
|
+
registry;
|
|
19
|
+
ctx;
|
|
20
|
+
conversation;
|
|
21
|
+
systemPrompt;
|
|
22
|
+
constructor(registry, ctx, model) {
|
|
23
|
+
this.registry = registry;
|
|
24
|
+
this.ctx = ctx;
|
|
25
|
+
this.model = model ?? ctx.aiModel ?? FALLBACK_MODEL;
|
|
26
|
+
this.client = new sdk_1.default({ apiKey: ctx.anthropicApiKey });
|
|
27
|
+
this.conversation = new conversation_1.ConversationHistory();
|
|
28
|
+
this.systemPrompt = (0, prompt_1.buildSystemPrompt)(registry);
|
|
29
|
+
}
|
|
30
|
+
async run(config) {
|
|
31
|
+
const maxSteps = config.maxSteps ?? 15;
|
|
32
|
+
const progress = config.onProgress ?? (() => { });
|
|
33
|
+
const steps = [];
|
|
34
|
+
// Build the initial task message
|
|
35
|
+
const seedLines = config.seedValues?.length
|
|
36
|
+
? `\nSeed values:\n${config.seedValues.map((s) => ` • ${s.paramName} (${s.description}): "${s.exampleValue}"`).join("\n")}`
|
|
37
|
+
: "";
|
|
38
|
+
// Detect if we're on a blank/empty page to guide the first action
|
|
39
|
+
const currentUrl = this.getCurrentUrl();
|
|
40
|
+
const isBlank = !currentUrl || currentUrl === "about:blank" || currentUrl === "unknown";
|
|
41
|
+
const firstActionHint = isBlank
|
|
42
|
+
? "The browser is on a blank page. Use web_search to find the target URL, or navigate directly if the goal includes a URL."
|
|
43
|
+
: `The browser is on ${currentUrl}. Start by observing the page.`;
|
|
44
|
+
this.conversation.append("user", `NAVIGATION TASK\nGoal: ${config.goal}\nStep budget: ${maxSteps}${seedLines}\n\n${firstActionHint}`);
|
|
45
|
+
for (let i = 0; i < maxSteps; i++) {
|
|
46
|
+
progress(`Step ${i + 1}/${maxSteps}`);
|
|
47
|
+
// ── 1. Ask LLM what to do ──────────────────────────────────────────
|
|
48
|
+
const decision = await this.askLLM();
|
|
49
|
+
// ── 2. Terminal states ─────────────────────────────────────────────
|
|
50
|
+
if (decision.data_found && decision.tool_name !== "eval_js") {
|
|
51
|
+
progress("Agent signalled data_found — stopping");
|
|
52
|
+
return this.buildResult(true, steps, decision.reasoning);
|
|
53
|
+
}
|
|
54
|
+
if (decision.tool_name === "done") {
|
|
55
|
+
progress("Agent signalled done");
|
|
56
|
+
return this.buildResult(true, steps, decision.reasoning);
|
|
57
|
+
}
|
|
58
|
+
if (decision.tool_name === "impossible") {
|
|
59
|
+
progress(`Agent: impossible — ${decision.reasoning}`);
|
|
60
|
+
return this.buildResult(false, steps, decision.reasoning);
|
|
61
|
+
}
|
|
62
|
+
// ── 3. Execute the tool ────────────────────────────────────────────
|
|
63
|
+
const result = await this.registry.execute(decision.tool_name, decision.params, this.ctx);
|
|
64
|
+
steps.push({
|
|
65
|
+
step: i + 1,
|
|
66
|
+
toolName: decision.tool_name,
|
|
67
|
+
params: decision.params,
|
|
68
|
+
result,
|
|
69
|
+
reasoning: decision.reasoning,
|
|
70
|
+
});
|
|
71
|
+
progress(`Step ${i + 1}: ${decision.tool_name} → ${result.success ? "ok" : "error"}`);
|
|
72
|
+
// ── 4. Feed result back to conversation ────────────────────────────
|
|
73
|
+
// For screenshot tool, include the image in the message
|
|
74
|
+
if (decision.tool_name === "screenshot" && result.success && result.data) {
|
|
75
|
+
const screenshotData = result.data;
|
|
76
|
+
this.conversation.append("user", [
|
|
77
|
+
{
|
|
78
|
+
type: "image",
|
|
79
|
+
source: { type: "base64", media_type: "image/jpeg", data: screenshotData.base64 },
|
|
80
|
+
},
|
|
81
|
+
{ type: "text", text: `Screenshot captured. URL: ${this.getCurrentUrl()}\nDecide next action.` },
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const stepContext = `Tool: ${decision.tool_name}\nResult: ${result.summary}\nURL: ${this.getCurrentUrl()}`;
|
|
86
|
+
this.conversation.append("user", stepContext);
|
|
87
|
+
}
|
|
88
|
+
// ── 5. Post-execution data_found check (for eval_js) ──────────────
|
|
89
|
+
if (decision.data_found && decision.tool_name === "eval_js") {
|
|
90
|
+
progress("Agent signalled data_found via eval_js — stopping");
|
|
91
|
+
return this.buildResult(true, steps, decision.reasoning);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Max steps exhausted
|
|
95
|
+
progress(`Completed ${maxSteps} steps`);
|
|
96
|
+
return this.buildResult(this.hasUsefulCaptures(), steps, `Reached max steps (${maxSteps})`);
|
|
97
|
+
}
|
|
98
|
+
// ─── Private: Ask LLM for next decision ────────────────────────────────────
|
|
99
|
+
async askLLM() {
|
|
100
|
+
const messages = this.conversation.toMessages();
|
|
101
|
+
const response = await this.client.messages.create({
|
|
102
|
+
model: this.model,
|
|
103
|
+
max_tokens: 800,
|
|
104
|
+
system: this.systemPrompt,
|
|
105
|
+
messages,
|
|
106
|
+
});
|
|
107
|
+
const text = response.content[0].type === "text" ? response.content[0].text : "{}";
|
|
108
|
+
// Store assistant response in conversation
|
|
109
|
+
this.conversation.append("assistant", text);
|
|
110
|
+
return this.parseDecision(text);
|
|
111
|
+
}
|
|
112
|
+
parseDecision(raw) {
|
|
113
|
+
try {
|
|
114
|
+
const cleaned = raw.replace(/```json\n?/g, "").replace(/```\n?/g, "").trim();
|
|
115
|
+
const obj = JSON.parse(cleaned);
|
|
116
|
+
return {
|
|
117
|
+
memory: obj.memory ?? "",
|
|
118
|
+
next_goal: obj.next_goal ?? "",
|
|
119
|
+
reasoning: obj.reasoning ?? String(obj.reason ?? ""),
|
|
120
|
+
data_found: obj.data_found === true,
|
|
121
|
+
tool_name: obj.tool_name ?? obj.type ?? "impossible",
|
|
122
|
+
params: obj.params ?? this.extractLegacyParams(obj),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return {
|
|
127
|
+
memory: "",
|
|
128
|
+
next_goal: "",
|
|
129
|
+
reasoning: `Failed to parse LLM response: ${raw.slice(0, 100)}`,
|
|
130
|
+
data_found: false,
|
|
131
|
+
tool_name: "impossible",
|
|
132
|
+
params: {},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Fallback: extract params from flat action object (legacy format compat) */
|
|
137
|
+
extractLegacyParams(obj) {
|
|
138
|
+
const params = {};
|
|
139
|
+
for (const key of ["elementId", "value", "direction", "amount", "ms", "url", "code", "query", "selector", "prompt"]) {
|
|
140
|
+
if (obj[key] !== undefined)
|
|
141
|
+
params[key] = obj[key];
|
|
142
|
+
}
|
|
143
|
+
return params;
|
|
144
|
+
}
|
|
145
|
+
// ─── Private: Helpers ──────────────────────────────────────────────────────
|
|
146
|
+
getCurrentUrl() {
|
|
147
|
+
return this.ctx.page?.url() ?? "unknown";
|
|
148
|
+
}
|
|
149
|
+
hasUsefulCaptures() {
|
|
150
|
+
return (this.ctx.interceptor?.getUseful(5).length ?? 0) > 0;
|
|
151
|
+
}
|
|
152
|
+
buildResult(success, steps, reason) {
|
|
153
|
+
return {
|
|
154
|
+
success,
|
|
155
|
+
steps,
|
|
156
|
+
finalUrl: this.getCurrentUrl(),
|
|
157
|
+
reason,
|
|
158
|
+
capturedRequests: this.ctx.interceptor?.getUseful(3) ?? [],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.AgentLoop = AgentLoop;
|
|
163
|
+
//# 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,22 @@
|
|
|
1
|
+
import type Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
export interface ConversationMessage {
|
|
3
|
+
role: "user" | "assistant";
|
|
4
|
+
content: string | Anthropic.MessageParam["content"];
|
|
5
|
+
}
|
|
6
|
+
export declare class ConversationHistory {
|
|
7
|
+
private messages;
|
|
8
|
+
/** Append a message to the history. */
|
|
9
|
+
append(role: "user" | "assistant", content: string | Anthropic.MessageParam["content"]): void;
|
|
10
|
+
/** Return the pruned message list for the Anthropic API. */
|
|
11
|
+
toMessages(): Anthropic.MessageParam[];
|
|
12
|
+
/** Number of messages in history (before pruning). */
|
|
13
|
+
get length(): number;
|
|
14
|
+
/** Clear all history. */
|
|
15
|
+
clear(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Keep the first message (task context, always preserved) +
|
|
18
|
+
* the last MAX_HISTORY_PAIRS user+assistant pairs.
|
|
19
|
+
*/
|
|
20
|
+
private prune;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/agent/conversation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAM/C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;CACrD;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAA6B;IAE7C,uCAAuC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI;IAI7F,4DAA4D;IAC5D,UAAU,IAAI,SAAS,CAAC,YAAY,EAAE;IAQtC,sDAAsD;IACtD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,yBAAyB;IACzB,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,OAAO,CAAC,KAAK;CAQd"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─── Multi-turn conversation history with sliding-window pruning ─────────────
|
|
3
|
+
// Keeps the first message (task context) + last N pairs to stay within
|
|
4
|
+
// the LLM context window. Mirrors the Notte pattern.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConversationHistory = void 0;
|
|
7
|
+
// How many user+assistant pairs to keep beyond the first message.
|
|
8
|
+
// 6 pairs = 12 messages + 1 initial = 13 messages max.
|
|
9
|
+
const MAX_HISTORY_PAIRS = 6;
|
|
10
|
+
class ConversationHistory {
|
|
11
|
+
messages = [];
|
|
12
|
+
/** Append a message to the history. */
|
|
13
|
+
append(role, content) {
|
|
14
|
+
this.messages.push({ role, content });
|
|
15
|
+
}
|
|
16
|
+
/** Return the pruned message list for the Anthropic API. */
|
|
17
|
+
toMessages() {
|
|
18
|
+
const pruned = this.prune();
|
|
19
|
+
return pruned.map((m) => ({
|
|
20
|
+
role: m.role,
|
|
21
|
+
content: m.content,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
/** Number of messages in history (before pruning). */
|
|
25
|
+
get length() {
|
|
26
|
+
return this.messages.length;
|
|
27
|
+
}
|
|
28
|
+
/** Clear all history. */
|
|
29
|
+
clear() {
|
|
30
|
+
this.messages = [];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Keep the first message (task context, always preserved) +
|
|
34
|
+
* the last MAX_HISTORY_PAIRS user+assistant pairs.
|
|
35
|
+
*/
|
|
36
|
+
prune() {
|
|
37
|
+
const maxMessages = 1 + MAX_HISTORY_PAIRS * 2;
|
|
38
|
+
if (this.messages.length <= maxMessages)
|
|
39
|
+
return [...this.messages];
|
|
40
|
+
return [
|
|
41
|
+
this.messages[0],
|
|
42
|
+
...this.messages.slice(-(MAX_HISTORY_PAIRS * 2)),
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.ConversationHistory = ConversationHistory;
|
|
47
|
+
//# sourceMappingURL=conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/agent/conversation.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,uEAAuE;AACvE,qDAAqD;;;AAIrD,kEAAkE;AAClE,uDAAuD;AACvD,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAO5B,MAAa,mBAAmB;IACtB,QAAQ,GAA0B,EAAE,CAAC;IAE7C,uCAAuC;IACvC,MAAM,CAAC,IAA0B,EAAE,OAAmD;QACpF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,4DAA4D;IAC5D,UAAU;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAA6B,CAAC;IAClC,CAAC;IAED,sDAAsD;IACtD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACK,KAAK;QACX,MAAM,WAAW,GAAG,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,WAAW;YAAE,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnE,OAAO;YACL,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChB,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC;CACF;AAvCD,kDAuCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAoEhE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─── Dynamic system prompt generation ────────────────────────────────────────
|
|
3
|
+
// Builds the system prompt from the registered tools + the observer's own
|
|
4
|
+
// ActionSpace format description. Adding a new tool or changing the observer
|
|
5
|
+
// ID scheme automatically updates the prompt — nothing is hardcoded.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.buildSystemPrompt = buildSystemPrompt;
|
|
8
|
+
const observer_1 = require("../observer");
|
|
9
|
+
function buildSystemPrompt(registry) {
|
|
10
|
+
const toolsBlock = registry.generateToolsBlock();
|
|
11
|
+
const actionSpaceFormat = (0, observer_1.describeActionSpaceFormat)();
|
|
12
|
+
return `You are a browser navigation agent. Your mission is to discover APIs by navigating websites exactly like a real human user, triggering the network requests that return the data described in the navigation goal.
|
|
13
|
+
|
|
14
|
+
You have access to tools that let you observe the page, interact with elements, inspect network traffic, search the web, and call APIs directly.
|
|
15
|
+
|
|
16
|
+
─── ActionSpace Format ────────────────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
${actionSpaceFormat}
|
|
19
|
+
|
|
20
|
+
─── XHR Scores ────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
Use "read_network_logs" to inspect captured requests. Each is scored 0–100:
|
|
23
|
+
|
|
24
|
+
80–100 High-value data API — structured JSON, likely triggered by user action
|
|
25
|
+
50–79 Potentially useful — API-shaped URL, JSON content type
|
|
26
|
+
20–49 Low-signal — config, feature flags, initialization, analytics
|
|
27
|
+
0–19 Noise — tracking pixels, CDN assets, fonts, thumbnails
|
|
28
|
+
|
|
29
|
+
The ↑ marker means the request fired within 2 seconds of your last action.
|
|
30
|
+
|
|
31
|
+
─── ${toolsBlock} ────────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
─── Response Format ───────────────────────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
Respond ONLY with valid JSON. No markdown, no code fences, no extra text.
|
|
36
|
+
|
|
37
|
+
{
|
|
38
|
+
"memory": "What I have tried, what worked, what failed, what I have ruled out",
|
|
39
|
+
"next_goal": "What the next action is specifically intended to achieve",
|
|
40
|
+
"reasoning": "Why I chose this tool over the other available alternatives",
|
|
41
|
+
"data_found": false,
|
|
42
|
+
"tool_name": "click",
|
|
43
|
+
"params": { "elementId": "B3" }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
Special tool names for terminal states:
|
|
47
|
+
- "done" — goal achieved, terminate (params: {})
|
|
48
|
+
- "impossible" — goal cannot be achieved due to structural blocker (params: {})
|
|
49
|
+
|
|
50
|
+
Set data_found to true ONLY when high-score XHRs (≥ 60) confirm that the data
|
|
51
|
+
described in the goal has been captured. Setting data_found=true terminates the
|
|
52
|
+
session immediately — set it only when you are certain.
|
|
53
|
+
|
|
54
|
+
─── Rules ─────────────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
1. On a new page with content, always observe first before interacting.
|
|
57
|
+
Exception: if the page is about:blank or empty, skip observe and use
|
|
58
|
+
"navigate" (if you know the URL) or "web_search" (if you don't) first.
|
|
59
|
+
2. One tool call per response. Never list multiple tools.
|
|
60
|
+
3. IDs reset every observation. Never reuse an ID from a prior step.
|
|
61
|
+
4. data_found: true means immediate termination. Set it only when certain.
|
|
62
|
+
5. Dismiss popups, cookie banners, and overlays before other interactions.
|
|
63
|
+
6. If a modal is open, interact with it or close it before anything else.
|
|
64
|
+
7. Use seed values verbatim when filling inputs — do not rephrase.
|
|
65
|
+
8. If the page shows errors or "no results", return "done" to allow retry.
|
|
66
|
+
9. Prefer clicking visible elements over direct URL navigation.
|
|
67
|
+
10. If the page is still loading, use "wait" with 1500ms.
|
|
68
|
+
11. Return "impossible" only for structural blockers: CAPTCHA, mandatory login.
|
|
69
|
+
12. Use "web_search" when the target URL is unknown, the goal is vague, or
|
|
70
|
+
the page is about:blank. This should be your FIRST action when starting
|
|
71
|
+
without a loaded page — do not observe an empty page.
|
|
72
|
+
13. Use "fetch_url" to call a discovered API directly if the URL is known.
|
|
73
|
+
14. Use "read_network_logs" to check if useful data has already been captured.
|
|
74
|
+
15. Use "eval_js" to extract SSR data (window.__NEXT_DATA__, etc.).
|
|
75
|
+
16. Reason like a real user. Click what you can see. Do not invent element IDs.`;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,0EAA0E;AAC1E,6EAA6E;AAC7E,qEAAqE;;AAKrE,8CAoEC;AAtED,0CAAwD;AAExD,SAAgB,iBAAiB,CAAC,QAAsB;IACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IACjD,MAAM,iBAAiB,GAAG,IAAA,oCAAyB,GAAE,CAAC;IAEtD,OAAO;;;;;;EAMP,iBAAiB;;;;;;;;;;;;;MAab,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gFA4CgE,CAAC;AACjF,CAAC"}
|
package/dist/browser.d.ts
CHANGED
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAM3B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAkDpC,OAAO,CAAC,eAAe;CAgBxB"}
|
package/dist/browser.js
CHANGED
|
@@ -2,15 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RensanBrowser = void 0;
|
|
4
4
|
const session_1 = require("./session");
|
|
5
|
-
const ai_1 = require("./ai");
|
|
6
5
|
const puppeteer_local_1 = require("./providers/puppeteer-local");
|
|
7
6
|
const browserbase_1 = require("./providers/browserbase");
|
|
8
7
|
class RensanBrowser {
|
|
9
8
|
config;
|
|
10
|
-
ai;
|
|
11
9
|
constructor(config) {
|
|
12
10
|
this.config = config;
|
|
13
|
-
this.ai = new ai_1.AIClient(config.ai.apiKey, config.ai.model);
|
|
14
11
|
}
|
|
15
12
|
// Create a new browser session using the configured provider.
|
|
16
13
|
// Provider selection: puppeteer-local (default for dev) → browserbase (production)
|
|
@@ -39,12 +36,10 @@ class RensanBrowser {
|
|
|
39
36
|
});
|
|
40
37
|
}
|
|
41
38
|
else {
|
|
42
|
-
// ws-endpoint: use
|
|
43
|
-
// For backwards compat — wraps Playwright connectOverCDP
|
|
39
|
+
// ws-endpoint: use Puppeteer local as fallback (connect via CDP)
|
|
44
40
|
if (!this.config.session.wsEndpoint) {
|
|
45
41
|
throw new Error("BrowserConfig requires wsEndpoint when provider=ws-endpoint");
|
|
46
42
|
}
|
|
47
|
-
// Use Puppeteer local as fallback for ws-endpoint (connect via CDP)
|
|
48
43
|
const provider = new puppeteer_local_1.PuppeteerLocalProvider();
|
|
49
44
|
browserHandle = await provider.launch({
|
|
50
45
|
viewport: viewport ?? { width: 1280, height: 800 },
|
|
@@ -53,11 +48,10 @@ class RensanBrowser {
|
|
|
53
48
|
});
|
|
54
49
|
}
|
|
55
50
|
const page = await browserHandle.newPage();
|
|
56
|
-
return new session_1.Session(page, browserHandle, this.ai, timeout, browserHandle.viewerUrl);
|
|
51
|
+
return new session_1.Session(page, browserHandle, this.config.ai.apiKey, timeout, browserHandle.viewerUrl, this.config.ai.model);
|
|
57
52
|
}
|
|
58
53
|
// Determine which provider to use based on config + env
|
|
59
54
|
resolveProvider() {
|
|
60
|
-
// Explicit env override
|
|
61
55
|
const envProvider = process.env.BROWSER_PROVIDER;
|
|
62
56
|
if (envProvider) {
|
|
63
57
|
const valid = ["puppeteer-local", "browserbase", "ws-endpoint"];
|
|
@@ -68,12 +62,10 @@ class RensanBrowser {
|
|
|
68
62
|
return envProvider;
|
|
69
63
|
}
|
|
70
64
|
}
|
|
71
|
-
// Auto-detect from config
|
|
72
65
|
if (this.config.session.browserbase)
|
|
73
66
|
return "browserbase";
|
|
74
67
|
if (this.config.session.wsEndpoint)
|
|
75
68
|
return "ws-endpoint";
|
|
76
|
-
// Default: local Puppeteer
|
|
77
69
|
return "puppeteer-local";
|
|
78
70
|
}
|
|
79
71
|
}
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";;;AAEA,uCAAoC;AACpC,
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
export { RensanBrowser } from "./browser";
|
|
2
2
|
export { Session } from "./session";
|
|
3
|
-
export {
|
|
3
|
+
export { ToolRegistry } from "./registry";
|
|
4
|
+
export { AgentLoop } from "./agent/agent";
|
|
5
|
+
export type { Tool, ToolContext, ToolResult, JSONSchema } from "./tools/base";
|
|
6
|
+
export type { AgentConfig, AgentResult, AgentStepRecord } from "./agent/agent";
|
|
7
|
+
export type { ConversationMessage } from "./agent/conversation";
|
|
4
8
|
export type { ObservedElement, ObserveResult, CapturedRequest, SeedValue, AgentAction, ActResult, FindDataResult, SessionConfig, AIConfig, BrowserConfig, Screenshot, ElementType, } from "./types";
|
|
5
9
|
export type { PageHandle, BrowserHandle, BrowserProvider, ProviderType, } from "./browser-provider";
|
|
6
|
-
export type { NavigationConfig, NavigationResult, NavigationStrategy, } from "./navigator";
|
|
7
10
|
export type { Perception, StepContext, StepRecord, } from "./perception";
|
|
8
11
|
export type { DetectedForm, AutocompleteItem, } from "./observer";
|
|
9
12
|
export { isBlacklisted } from "./blacklist";
|
|
13
|
+
export { ClickTool } from "./tools/browser/click";
|
|
14
|
+
export { FillTool } from "./tools/browser/fill";
|
|
15
|
+
export { ScrollTool } from "./tools/browser/scroll";
|
|
16
|
+
export { NavigateTool } from "./tools/browser/navigate";
|
|
17
|
+
export { WaitTool } from "./tools/browser/wait";
|
|
18
|
+
export { EvalJsTool } from "./tools/browser/eval_js";
|
|
19
|
+
export { ScreenshotTool } from "./tools/browser/screenshot";
|
|
20
|
+
export { ObserveTool } from "./tools/page/observe";
|
|
21
|
+
export { ScrapeTool } from "./tools/page/scrape";
|
|
22
|
+
export { ExtractDomTool } from "./tools/page/extract_dom";
|
|
23
|
+
export { WebSearchTool } from "./tools/network/web_search";
|
|
24
|
+
export { FetchUrlTool } from "./tools/network/fetch_url";
|
|
25
|
+
export { DownloadFileTool } from "./tools/network/download_file";
|
|
26
|
+
export { ReadNetworkLogsTool } from "./tools/network/read_network_logs";
|
|
10
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG9E,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC/E,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,YAAY,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,SAAS,EACT,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isBlacklisted = exports.
|
|
4
|
+
exports.ReadNetworkLogsTool = exports.DownloadFileTool = exports.FetchUrlTool = exports.WebSearchTool = exports.ExtractDomTool = exports.ScrapeTool = exports.ObserveTool = exports.ScreenshotTool = exports.EvalJsTool = exports.WaitTool = exports.NavigateTool = exports.ScrollTool = exports.FillTool = exports.ClickTool = exports.isBlacklisted = exports.AgentLoop = exports.ToolRegistry = exports.Session = exports.RensanBrowser = void 0;
|
|
4
5
|
var browser_1 = require("./browser");
|
|
5
6
|
Object.defineProperty(exports, "RensanBrowser", { enumerable: true, get: function () { return browser_1.RensanBrowser; } });
|
|
6
7
|
var session_1 = require("./session");
|
|
7
8
|
Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return session_1.Session; } });
|
|
8
|
-
var
|
|
9
|
-
Object.defineProperty(exports, "
|
|
9
|
+
var registry_1 = require("./registry");
|
|
10
|
+
Object.defineProperty(exports, "ToolRegistry", { enumerable: true, get: function () { return registry_1.ToolRegistry; } });
|
|
11
|
+
var agent_1 = require("./agent/agent");
|
|
12
|
+
Object.defineProperty(exports, "AgentLoop", { enumerable: true, get: function () { return agent_1.AgentLoop; } });
|
|
10
13
|
var blacklist_1 = require("./blacklist");
|
|
11
14
|
Object.defineProperty(exports, "isBlacklisted", { enumerable: true, get: function () { return blacklist_1.isBlacklisted; } });
|
|
15
|
+
// ─── Individual tools (for custom registries) ───────────────────────────────
|
|
16
|
+
var click_1 = require("./tools/browser/click");
|
|
17
|
+
Object.defineProperty(exports, "ClickTool", { enumerable: true, get: function () { return click_1.ClickTool; } });
|
|
18
|
+
var fill_1 = require("./tools/browser/fill");
|
|
19
|
+
Object.defineProperty(exports, "FillTool", { enumerable: true, get: function () { return fill_1.FillTool; } });
|
|
20
|
+
var scroll_1 = require("./tools/browser/scroll");
|
|
21
|
+
Object.defineProperty(exports, "ScrollTool", { enumerable: true, get: function () { return scroll_1.ScrollTool; } });
|
|
22
|
+
var navigate_1 = require("./tools/browser/navigate");
|
|
23
|
+
Object.defineProperty(exports, "NavigateTool", { enumerable: true, get: function () { return navigate_1.NavigateTool; } });
|
|
24
|
+
var wait_1 = require("./tools/browser/wait");
|
|
25
|
+
Object.defineProperty(exports, "WaitTool", { enumerable: true, get: function () { return wait_1.WaitTool; } });
|
|
26
|
+
var eval_js_1 = require("./tools/browser/eval_js");
|
|
27
|
+
Object.defineProperty(exports, "EvalJsTool", { enumerable: true, get: function () { return eval_js_1.EvalJsTool; } });
|
|
28
|
+
var screenshot_1 = require("./tools/browser/screenshot");
|
|
29
|
+
Object.defineProperty(exports, "ScreenshotTool", { enumerable: true, get: function () { return screenshot_1.ScreenshotTool; } });
|
|
30
|
+
var observe_1 = require("./tools/page/observe");
|
|
31
|
+
Object.defineProperty(exports, "ObserveTool", { enumerable: true, get: function () { return observe_1.ObserveTool; } });
|
|
32
|
+
var scrape_1 = require("./tools/page/scrape");
|
|
33
|
+
Object.defineProperty(exports, "ScrapeTool", { enumerable: true, get: function () { return scrape_1.ScrapeTool; } });
|
|
34
|
+
var extract_dom_1 = require("./tools/page/extract_dom");
|
|
35
|
+
Object.defineProperty(exports, "ExtractDomTool", { enumerable: true, get: function () { return extract_dom_1.ExtractDomTool; } });
|
|
36
|
+
var web_search_1 = require("./tools/network/web_search");
|
|
37
|
+
Object.defineProperty(exports, "WebSearchTool", { enumerable: true, get: function () { return web_search_1.WebSearchTool; } });
|
|
38
|
+
var fetch_url_1 = require("./tools/network/fetch_url");
|
|
39
|
+
Object.defineProperty(exports, "FetchUrlTool", { enumerable: true, get: function () { return fetch_url_1.FetchUrlTool; } });
|
|
40
|
+
var download_file_1 = require("./tools/network/download_file");
|
|
41
|
+
Object.defineProperty(exports, "DownloadFileTool", { enumerable: true, get: function () { return download_file_1.DownloadFileTool; } });
|
|
42
|
+
var read_network_logs_1 = require("./tools/network/read_network_logs");
|
|
43
|
+
Object.defineProperty(exports, "ReadNetworkLogsTool", { enumerable: true, get: function () { return read_network_logs_1.ReadNetworkLogsTool; } });
|
|
12
44
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;;;AAEhF,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,uCAA0C;AAAjC,kGAAA,SAAS,OAAA;AA2ClB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,+EAA+E;AAC/E,+CAAkD;AAAzC,kGAAA,SAAS,OAAA;AAClB,6CAAgD;AAAvC,gGAAA,QAAQ,OAAA;AACjB,iDAAoD;AAA3C,oGAAA,UAAU,OAAA;AACnB,qDAAwD;AAA/C,wGAAA,YAAY,OAAA;AACrB,6CAAgD;AAAvC,gGAAA,QAAQ,OAAA;AACjB,mDAAqD;AAA5C,qGAAA,UAAU,OAAA;AACnB,yDAA4D;AAAnD,4GAAA,cAAc,OAAA;AACvB,gDAAmD;AAA1C,sGAAA,WAAW,OAAA;AACpB,8CAAiD;AAAxC,oGAAA,UAAU,OAAA;AACnB,wDAA0D;AAAjD,6GAAA,cAAc,OAAA;AACvB,yDAA2D;AAAlD,2GAAA,aAAa,OAAA;AACtB,uDAAyD;AAAhD,yGAAA,YAAY,OAAA;AACrB,+DAAiE;AAAxD,iHAAA,gBAAgB,OAAA;AACzB,uEAAwE;AAA/D,wHAAA,mBAAmB,OAAA"}
|
package/dist/observer.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { PageHandle } from "./browser-provider";
|
|
2
|
-
import type { ObserveResult } from "./types";
|
|
2
|
+
import type { ObserveResult, ElementType } from "./types";
|
|
3
|
+
export declare const PREFIX: Record<ElementType, string>;
|
|
4
|
+
/** Generates the ActionSpace format description for LLM prompts.
|
|
5
|
+
* Always in sync with how observe() actually assigns IDs and formats output. */
|
|
6
|
+
export declare function describeActionSpaceFormat(): string;
|
|
3
7
|
export interface DetectedForm {
|
|
4
8
|
mainInput: string | null;
|
|
5
9
|
submitButton: string | null;
|
package/dist/observer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAmB,aAAa,
|
|
1
|
+
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAmB,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3E,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAS9C,CAAC;AAEF;iFACiF;AACjF,wBAAgB,yBAAyB,IAAI,MAAM,CAgBlD;AAID,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,KAAK,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IACH,QAAQ,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;CAC1D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,qBAAa,QAAQ;IACnB,OAAO,CAAC,IAAI,CAAa;IAEzB,OAAO,CAAC,gBAAgB,CAAkC;gBAE9C,IAAI,EAAE,UAAU;IAKtB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAwRjE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAmC5E,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAMrC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IA8CtC,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAwCjD,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoCvC,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,uBAAuB;CAsIhC"}
|