sf-builder-agent 0.7.3 → 0.8.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/dist/ai.d.ts +47 -0
- package/dist/ai.js +119 -0
- package/dist/ai.js.map +1 -0
- package/dist/browser.d.ts +7 -1
- package/dist/browser.js +115 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/reporter.d.ts +1 -1
- package/dist/reporter.js.map +1 -1
- package/package.json +2 -1
- package/src/ai.ts +167 -0
- package/src/browser.ts +164 -1
- package/src/index.ts +15 -2
- package/src/reporter.ts +1 -1
package/dist/ai.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Vision Module — Uses Claude to analyze Salesforce screenshots and decide
|
|
3
|
+
* the next browser automation action.
|
|
4
|
+
*
|
|
5
|
+
* The agent screenshots the page, sends it to Claude with the objective context,
|
|
6
|
+
* and Claude returns a single action to execute. This loop repeats until the
|
|
7
|
+
* objective is met or the action budget is exhausted.
|
|
8
|
+
*
|
|
9
|
+
* Uses the user's own ANTHROPIC_API_KEY (set by Claude Code CLI).
|
|
10
|
+
*/
|
|
11
|
+
export interface AIDecision {
|
|
12
|
+
action: "click" | "fill" | "navigate" | "scroll" | "keyboard" | "wait" | "done" | "error";
|
|
13
|
+
reasoning: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
selector?: string;
|
|
16
|
+
coordinates?: {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
};
|
|
20
|
+
value?: string;
|
|
21
|
+
url?: string;
|
|
22
|
+
key?: string;
|
|
23
|
+
direction?: "up" | "down";
|
|
24
|
+
amount?: number;
|
|
25
|
+
stepComplete?: boolean;
|
|
26
|
+
stepNotes?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ActionEntry {
|
|
29
|
+
action: string;
|
|
30
|
+
target: string;
|
|
31
|
+
result: string;
|
|
32
|
+
}
|
|
33
|
+
/** Check if the Anthropic API key is available. */
|
|
34
|
+
export declare function hasApiKey(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Analyze a screenshot and decide the next action to accomplish the objective.
|
|
37
|
+
*
|
|
38
|
+
* @param screenshot Base64-encoded JPEG screenshot of the current page
|
|
39
|
+
* @param objective What the agent is trying to accomplish
|
|
40
|
+
* @param actionHistory Previous actions taken in this step
|
|
41
|
+
* @param pageUrl Current page URL
|
|
42
|
+
* @param pageTitle Current page title
|
|
43
|
+
* @param fieldValues Optional map of field labels to values to enter
|
|
44
|
+
* @param verifyPrompt Optional criteria for step completion
|
|
45
|
+
* @returns The AI's decision for the next action
|
|
46
|
+
*/
|
|
47
|
+
export declare function decideNextAction(screenshot: string, objective: string, actionHistory: ActionEntry[], pageUrl: string, pageTitle: string, fieldValues?: Record<string, string>, verifyPrompt?: string): Promise<AIDecision>;
|
package/dist/ai.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Vision Module — Uses Claude to analyze Salesforce screenshots and decide
|
|
3
|
+
* the next browser automation action.
|
|
4
|
+
*
|
|
5
|
+
* The agent screenshots the page, sends it to Claude with the objective context,
|
|
6
|
+
* and Claude returns a single action to execute. This loop repeats until the
|
|
7
|
+
* objective is met or the action budget is exhausted.
|
|
8
|
+
*
|
|
9
|
+
* Uses the user's own ANTHROPIC_API_KEY (set by Claude Code CLI).
|
|
10
|
+
*/
|
|
11
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
12
|
+
// ─── Client ──────────────────────────────────────────────────────────
|
|
13
|
+
let client = null;
|
|
14
|
+
function getClient() {
|
|
15
|
+
if (!client) {
|
|
16
|
+
client = new Anthropic(); // reads ANTHROPIC_API_KEY from env
|
|
17
|
+
}
|
|
18
|
+
return client;
|
|
19
|
+
}
|
|
20
|
+
/** Check if the Anthropic API key is available. */
|
|
21
|
+
export function hasApiKey() {
|
|
22
|
+
return !!process.env.ANTHROPIC_API_KEY;
|
|
23
|
+
}
|
|
24
|
+
// ─── System Prompt ───────────────────────────────────────────────────
|
|
25
|
+
const SYSTEM_PROMPT = `You are a Salesforce Lightning UI automation agent. You see screenshots of Salesforce pages and decide the single next action to accomplish a given objective.
|
|
26
|
+
|
|
27
|
+
## Actions You Can Take
|
|
28
|
+
- click: Click an element (provide visible text label OR x,y coordinates)
|
|
29
|
+
- fill: Type into a field (click it first, then fill on the next turn)
|
|
30
|
+
- navigate: Go to a URL
|
|
31
|
+
- scroll: Scroll up/down
|
|
32
|
+
- keyboard: Press a key (Enter, Tab, Escape)
|
|
33
|
+
- wait: Wait for page to render (use after actions that change the page)
|
|
34
|
+
- done: Objective is complete
|
|
35
|
+
- error: Cannot proceed (explain why)
|
|
36
|
+
|
|
37
|
+
## Response Format — JSON only, no markdown
|
|
38
|
+
{
|
|
39
|
+
"action": "click|fill|navigate|scroll|keyboard|wait|done|error",
|
|
40
|
+
"reasoning": "Brief explanation",
|
|
41
|
+
"text": "Visible button/link text to click",
|
|
42
|
+
"coordinates": { "x": 500, "y": 300 },
|
|
43
|
+
"value": "text to type",
|
|
44
|
+
"url": "https://...",
|
|
45
|
+
"key": "Enter",
|
|
46
|
+
"direction": "down",
|
|
47
|
+
"amount": 300,
|
|
48
|
+
"stepComplete": true,
|
|
49
|
+
"stepNotes": "What was accomplished"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
1. ONE action per response
|
|
54
|
+
2. Prefer clicking by visible TEXT labels (more stable than coordinates)
|
|
55
|
+
3. Click a field FIRST, then fill it on the NEXT turn
|
|
56
|
+
4. Use "wait" after clicks that trigger page loads or modals
|
|
57
|
+
5. Salesforce Lightning is slow — be patient
|
|
58
|
+
6. If you see a login page, return action: "error" — the user must log in manually
|
|
59
|
+
7. When the objective is fully met, return action: "done" with stepComplete: true
|
|
60
|
+
8. Look at the ENTIRE screenshot — SF has nested panels, modals, iframes
|
|
61
|
+
9. Toast messages (green bar at top) indicate success
|
|
62
|
+
10. The main Setup content is in the center-right area`;
|
|
63
|
+
// ─── Main Function ───────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* Analyze a screenshot and decide the next action to accomplish the objective.
|
|
66
|
+
*
|
|
67
|
+
* @param screenshot Base64-encoded JPEG screenshot of the current page
|
|
68
|
+
* @param objective What the agent is trying to accomplish
|
|
69
|
+
* @param actionHistory Previous actions taken in this step
|
|
70
|
+
* @param pageUrl Current page URL
|
|
71
|
+
* @param pageTitle Current page title
|
|
72
|
+
* @param fieldValues Optional map of field labels to values to enter
|
|
73
|
+
* @param verifyPrompt Optional criteria for step completion
|
|
74
|
+
* @returns The AI's decision for the next action
|
|
75
|
+
*/
|
|
76
|
+
export async function decideNextAction(screenshot, objective, actionHistory, pageUrl, pageTitle, fieldValues, verifyPrompt) {
|
|
77
|
+
const anthropic = getClient();
|
|
78
|
+
// Build user message with context
|
|
79
|
+
const historyText = actionHistory.length > 0
|
|
80
|
+
? `\n\nActions taken so far:\n${actionHistory.map((a, i) => `${i + 1}. ${a.action} → ${a.target} (${a.result})`).join("\n")}`
|
|
81
|
+
: "";
|
|
82
|
+
const fieldsText = fieldValues
|
|
83
|
+
? `\n\nField values to enter:\n${Object.entries(fieldValues).map(([k, v]) => `- ${k}: "${v}"`).join("\n")}`
|
|
84
|
+
: "";
|
|
85
|
+
const verifyText = verifyPrompt
|
|
86
|
+
? `\n\nCompletion criteria: ${verifyPrompt}`
|
|
87
|
+
: "";
|
|
88
|
+
const response = await anthropic.messages.create({
|
|
89
|
+
model: "claude-sonnet-4-20250514",
|
|
90
|
+
max_tokens: 1024,
|
|
91
|
+
system: SYSTEM_PROMPT,
|
|
92
|
+
messages: [
|
|
93
|
+
{
|
|
94
|
+
role: "user",
|
|
95
|
+
content: [
|
|
96
|
+
{
|
|
97
|
+
type: "image",
|
|
98
|
+
source: {
|
|
99
|
+
type: "base64",
|
|
100
|
+
media_type: "image/jpeg",
|
|
101
|
+
data: screenshot,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: "text",
|
|
106
|
+
text: `URL: ${pageUrl}\nTitle: ${pageTitle}\n\nObjective: ${objective}${fieldsText}${verifyText}${historyText}\n\nWhat is the single next action?`,
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
});
|
|
112
|
+
// Parse JSON from response
|
|
113
|
+
const text = response.content[0].type === "text" ? response.content[0].text : "";
|
|
114
|
+
return JSON.parse(text
|
|
115
|
+
.replace(/```json\n?/g, "")
|
|
116
|
+
.replace(/```/g, "")
|
|
117
|
+
.trim());
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=ai.js.map
|
package/dist/ai.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAyB1C,wEAAwE;AAExE,IAAI,MAAM,GAAqB,IAAI,CAAC;AAEpC,SAAS,SAAS;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC,mCAAmC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACzC,CAAC;AAED,wEAAwE;AAExE,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAqCiC,CAAC;AAExD,wEAAwE;AAExE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,SAAiB,EACjB,aAA4B,EAC5B,OAAe,EACf,SAAiB,EACjB,WAAoC,EACpC,YAAqB;IAErB,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAE9B,kCAAkC;IAClC,MAAM,WAAW,GACf,aAAa,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC,8BAA8B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC7H,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,UAAU,GAAG,WAAW;QAC5B,CAAC,CAAC,+BAA+B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC3G,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,UAAU,GAAG,YAAY;QAC7B,CAAC,CAAC,4BAA4B,YAAY,EAAE;QAC5C,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,KAAK,EAAE,0BAA0B;QACjC,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,aAAa;QACrB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE,YAAY;4BACxB,IAAI,EAAE,UAAU;yBACjB;qBACF;oBACD;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ,OAAO,YAAY,SAAS,kBAAkB,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,qCAAqC;qBACnJ;iBACF;aACF;SACF;KACF,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,IAAI,GACR,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO,IAAI,CAAC,KAAK,CACf,IAAI;SACD,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CACV,CAAC;AACJ,CAAC"}
|
package/dist/browser.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export declare function launchBrowser(): Promise<{
|
|
|
14
14
|
* Skips the check if the original target was itself a login page.
|
|
15
15
|
*/
|
|
16
16
|
export declare function isLoginPage(currentUrl: string, originalTarget: string): boolean;
|
|
17
|
+
/** Context passed from the main process for server communication. */
|
|
18
|
+
export interface AgentContext {
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
sessionId: string;
|
|
21
|
+
token: string;
|
|
22
|
+
}
|
|
17
23
|
export interface CommandResult {
|
|
18
24
|
success: boolean;
|
|
19
25
|
result?: unknown;
|
|
@@ -22,4 +28,4 @@ export interface CommandResult {
|
|
|
22
28
|
shutdown?: boolean;
|
|
23
29
|
waitingForLogin?: boolean;
|
|
24
30
|
}
|
|
25
|
-
export declare function executeCommand(page: Page, commandType: string, payload: Record<string, unknown
|
|
31
|
+
export declare function executeCommand(page: Page, commandType: string, payload: Record<string, unknown>, context?: AgentContext): Promise<CommandResult>;
|
package/dist/browser.js
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* label-based element lookup, and screenshot capture.
|
|
6
6
|
*/
|
|
7
7
|
import puppeteer from "puppeteer";
|
|
8
|
+
import { decideNextAction, hasApiKey } from "./ai.js";
|
|
9
|
+
import { reportResult } from "./reporter.js";
|
|
8
10
|
// ─── Launch ──────────────────────────────────────────────────────────
|
|
9
11
|
export async function launchBrowser() {
|
|
10
12
|
const browser = await puppeteer.launch({
|
|
@@ -102,7 +104,51 @@ export function isLoginPage(currentUrl, originalTarget) {
|
|
|
102
104
|
return false;
|
|
103
105
|
return LOGIN_PATTERNS.some((p) => currentUrl.includes(p));
|
|
104
106
|
}
|
|
105
|
-
|
|
107
|
+
// ─── AI Action Executor ──────────────────────────────────────────────
|
|
108
|
+
async function executeAIAction(page, decision) {
|
|
109
|
+
try {
|
|
110
|
+
switch (decision.action) {
|
|
111
|
+
case "click":
|
|
112
|
+
if (decision.text) {
|
|
113
|
+
// Click by visible text (preferred — more stable than coordinates)
|
|
114
|
+
const el = await findByText(page, decision.selector || "*", decision.text);
|
|
115
|
+
await el.click();
|
|
116
|
+
}
|
|
117
|
+
else if (decision.coordinates) {
|
|
118
|
+
await page.mouse.click(decision.coordinates.x, decision.coordinates.y);
|
|
119
|
+
}
|
|
120
|
+
return { success: true };
|
|
121
|
+
case "fill":
|
|
122
|
+
if (decision.coordinates) {
|
|
123
|
+
await page.mouse.click(decision.coordinates.x, decision.coordinates.y);
|
|
124
|
+
}
|
|
125
|
+
// Select all existing text and replace
|
|
126
|
+
await page.keyboard.down("Control");
|
|
127
|
+
await page.keyboard.press("a");
|
|
128
|
+
await page.keyboard.up("Control");
|
|
129
|
+
await page.keyboard.type(decision.value);
|
|
130
|
+
return { success: true };
|
|
131
|
+
case "navigate":
|
|
132
|
+
await page.goto(decision.url, { waitUntil: "networkidle2", timeout: 30_000 });
|
|
133
|
+
return { success: true };
|
|
134
|
+
case "scroll":
|
|
135
|
+
await page.evaluate((dir, amt) => window.scrollBy(0, dir === "down" ? amt : -amt), decision.direction || "down", decision.amount || 300);
|
|
136
|
+
return { success: true };
|
|
137
|
+
case "keyboard":
|
|
138
|
+
await page.keyboard.press(decision.key);
|
|
139
|
+
return { success: true };
|
|
140
|
+
case "wait":
|
|
141
|
+
await new Promise((r) => setTimeout(r, decision.amount || 2000));
|
|
142
|
+
return { success: true };
|
|
143
|
+
default:
|
|
144
|
+
return { success: false, error: `Unknown AI action: ${decision.action}` };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export async function executeCommand(page, commandType, payload, context) {
|
|
106
152
|
try {
|
|
107
153
|
switch (commandType) {
|
|
108
154
|
// ── navigate ──
|
|
@@ -280,6 +326,74 @@ export async function executeCommand(page, commandType, payload) {
|
|
|
280
326
|
case "shutdown": {
|
|
281
327
|
return { success: true, shutdown: true };
|
|
282
328
|
}
|
|
329
|
+
// ── ai_step — AI vision loop ──
|
|
330
|
+
case "ai_step": {
|
|
331
|
+
if (!hasApiKey()) {
|
|
332
|
+
return {
|
|
333
|
+
success: false,
|
|
334
|
+
error: "AI features require ANTHROPIC_API_KEY — install Claude Code or set the key manually",
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
const objective = payload.objective;
|
|
338
|
+
const startUrl = payload.startUrl;
|
|
339
|
+
const fieldValues = payload.fieldValues;
|
|
340
|
+
const verifyPrompt = payload.verifyPrompt;
|
|
341
|
+
const maxActions = payload.maxActions ?? 20;
|
|
342
|
+
const commandId = payload.commandId;
|
|
343
|
+
// Navigate to starting page if provided
|
|
344
|
+
if (startUrl) {
|
|
345
|
+
await page.goto(startUrl, { waitUntil: "networkidle2", timeout: 30_000 });
|
|
346
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
347
|
+
}
|
|
348
|
+
const actionHistory = [];
|
|
349
|
+
for (let i = 0; i < maxActions; i++) {
|
|
350
|
+
// Screenshot for AI analysis (JPEG for smaller payload)
|
|
351
|
+
const screenshot = await page.screenshot({
|
|
352
|
+
encoding: "base64",
|
|
353
|
+
type: "jpeg",
|
|
354
|
+
quality: 80,
|
|
355
|
+
});
|
|
356
|
+
const pageUrl = page.url();
|
|
357
|
+
const pageTitle = await page.title();
|
|
358
|
+
// Report progress to server (visible in Build Log)
|
|
359
|
+
if (context && commandId) {
|
|
360
|
+
await reportResult(context.baseUrl, context.sessionId, context.token, commandId, "in_progress", { action: i + 1, total: maxActions, screenshot });
|
|
361
|
+
}
|
|
362
|
+
const decision = await decideNextAction(screenshot, objective, actionHistory, pageUrl, pageTitle, fieldValues, verifyPrompt);
|
|
363
|
+
// Step complete
|
|
364
|
+
if (decision.action === "done" || decision.stepComplete) {
|
|
365
|
+
const finalScreenshot = await page.screenshot({ encoding: "base64" });
|
|
366
|
+
return {
|
|
367
|
+
success: true,
|
|
368
|
+
screenshot: finalScreenshot,
|
|
369
|
+
result: {
|
|
370
|
+
stepComplete: true,
|
|
371
|
+
actionsExecuted: actionHistory.length,
|
|
372
|
+
notes: decision.stepNotes,
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
// Unrecoverable error
|
|
377
|
+
if (decision.action === "error") {
|
|
378
|
+
return { success: false, error: decision.reasoning };
|
|
379
|
+
}
|
|
380
|
+
// Execute the action
|
|
381
|
+
const result = await executeAIAction(page, decision);
|
|
382
|
+
actionHistory.push({
|
|
383
|
+
action: decision.action,
|
|
384
|
+
target: decision.text || (decision.coordinates ? `(${decision.coordinates.x},${decision.coordinates.y})` : decision.url || decision.key || "page"),
|
|
385
|
+
result: result.success ? "success" : (result.error || "failed"),
|
|
386
|
+
});
|
|
387
|
+
// Console log for local visibility
|
|
388
|
+
console.log(` [${i + 1}/${maxActions}] ${decision.action}: ${decision.reasoning}`);
|
|
389
|
+
// Let page settle between actions
|
|
390
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
success: false,
|
|
394
|
+
error: `Max actions (${maxActions}) reached without completing objective`,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
283
397
|
default:
|
|
284
398
|
return { success: false, error: `Unknown command type: ${commandType}` };
|
|
285
399
|
}
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { stdin, stdout } from "node:process";
|
|
|
10
10
|
import { pair } from "./pairing.js";
|
|
11
11
|
import { connectSSE } from "./sse-client.js";
|
|
12
12
|
import { launchBrowser, executeCommand, isLoginPage } from "./browser.js";
|
|
13
|
+
import { hasApiKey } from "./ai.js";
|
|
13
14
|
import { reportResult } from "./reporter.js";
|
|
14
15
|
import { startHeartbeat } from "./heartbeat.js";
|
|
15
16
|
// ─── Arg Parsing ─────────────────────────────────────────────────────
|
|
@@ -82,6 +83,15 @@ async function main() {
|
|
|
82
83
|
console.error("\u274C Pairing failed:", err instanceof Error ? err.message : err);
|
|
83
84
|
process.exit(1);
|
|
84
85
|
}
|
|
86
|
+
// ── Check for AI capabilities ──
|
|
87
|
+
if (hasApiKey()) {
|
|
88
|
+
console.log("\u2728 AI vision enabled (ANTHROPIC_API_KEY found)");
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.log("\u26A0\uFE0F AI vision disabled — set ANTHROPIC_API_KEY to enable ai_step commands");
|
|
92
|
+
}
|
|
93
|
+
// Build context for command executor (used by ai_step for progress reporting)
|
|
94
|
+
const agentContext = { baseUrl, sessionId, token };
|
|
85
95
|
// ── Step 2: Launch Browser ──
|
|
86
96
|
console.log("\uD83C\uDF10 Launching browser...");
|
|
87
97
|
let browser;
|
|
@@ -144,7 +154,9 @@ async function main() {
|
|
|
144
154
|
? ` \u2192 ${command.payload.url}`
|
|
145
155
|
: "";
|
|
146
156
|
console.log(`\u26A1 Executing: ${label}${payloadHint}`);
|
|
147
|
-
|
|
157
|
+
// Pass command ID into payload so ai_step can report progress per-action
|
|
158
|
+
const payloadWithId = { ...command.payload, commandId: command.id };
|
|
159
|
+
const result = await executeCommand(page, command.commandType, payloadWithId, agentContext);
|
|
148
160
|
// ── Handle login detection ──
|
|
149
161
|
if (result.waitingForLogin) {
|
|
150
162
|
console.log("\uD83D\uDD10 Login page detected — waiting for user to authenticate...");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/reporter.d.ts
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Reporter — POST command results back to the web app.
|
|
3
3
|
* Uses /api/agent/result (flat route, not behind Easy Auth).
|
|
4
4
|
*/
|
|
5
|
-
export declare function reportResult(baseUrl: string, _sessionId: string, token: string, commandId: string, status: "success" | "error" | "waiting_for_login", result?: Record<string, unknown>): Promise<void>;
|
|
5
|
+
export declare function reportResult(baseUrl: string, _sessionId: string, token: string, commandId: string, status: "success" | "error" | "waiting_for_login" | "in_progress", result?: Record<string, unknown>): Promise<void>;
|
package/dist/reporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,UAAkB,EAClB,KAAa,EACb,SAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,UAAkB,EAClB,KAAa,EACb,SAAiB,EACjB,MAAiE,EACjE,MAAgC;IAEhC,MAAM,GAAG,GAAG,GAAG,OAAO,mBAAmB,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,sBAAsB,EACtB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-builder-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Desktop agent for SalesForce Agent Creator — executes browser automation commands",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"dev": "tsx src/index.ts"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
15
16
|
"puppeteer": "^23.0.0",
|
|
16
17
|
"eventsource": "^3.0.0"
|
|
17
18
|
},
|
package/src/ai.ts
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Vision Module — Uses Claude to analyze Salesforce screenshots and decide
|
|
3
|
+
* the next browser automation action.
|
|
4
|
+
*
|
|
5
|
+
* The agent screenshots the page, sends it to Claude with the objective context,
|
|
6
|
+
* and Claude returns a single action to execute. This loop repeats until the
|
|
7
|
+
* objective is met or the action budget is exhausted.
|
|
8
|
+
*
|
|
9
|
+
* Uses the user's own ANTHROPIC_API_KEY (set by Claude Code CLI).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
13
|
+
|
|
14
|
+
// ─── Types ───────────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
export interface AIDecision {
|
|
17
|
+
action: "click" | "fill" | "navigate" | "scroll" | "keyboard" | "wait" | "done" | "error";
|
|
18
|
+
reasoning: string;
|
|
19
|
+
text?: string; // Visible button/link text to click
|
|
20
|
+
selector?: string; // Optional CSS selector hint
|
|
21
|
+
coordinates?: { x: number; y: number };
|
|
22
|
+
value?: string; // Text to type (fill action)
|
|
23
|
+
url?: string; // URL to navigate to
|
|
24
|
+
key?: string; // Key to press (keyboard action)
|
|
25
|
+
direction?: "up" | "down";
|
|
26
|
+
amount?: number; // Scroll amount or wait duration
|
|
27
|
+
stepComplete?: boolean;
|
|
28
|
+
stepNotes?: string; // What was accomplished
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ActionEntry {
|
|
32
|
+
action: string;
|
|
33
|
+
target: string;
|
|
34
|
+
result: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ─── Client ──────────────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
let client: Anthropic | null = null;
|
|
40
|
+
|
|
41
|
+
function getClient(): Anthropic {
|
|
42
|
+
if (!client) {
|
|
43
|
+
client = new Anthropic(); // reads ANTHROPIC_API_KEY from env
|
|
44
|
+
}
|
|
45
|
+
return client;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Check if the Anthropic API key is available. */
|
|
49
|
+
export function hasApiKey(): boolean {
|
|
50
|
+
return !!process.env.ANTHROPIC_API_KEY;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─── System Prompt ───────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
const SYSTEM_PROMPT = `You are a Salesforce Lightning UI automation agent. You see screenshots of Salesforce pages and decide the single next action to accomplish a given objective.
|
|
56
|
+
|
|
57
|
+
## Actions You Can Take
|
|
58
|
+
- click: Click an element (provide visible text label OR x,y coordinates)
|
|
59
|
+
- fill: Type into a field (click it first, then fill on the next turn)
|
|
60
|
+
- navigate: Go to a URL
|
|
61
|
+
- scroll: Scroll up/down
|
|
62
|
+
- keyboard: Press a key (Enter, Tab, Escape)
|
|
63
|
+
- wait: Wait for page to render (use after actions that change the page)
|
|
64
|
+
- done: Objective is complete
|
|
65
|
+
- error: Cannot proceed (explain why)
|
|
66
|
+
|
|
67
|
+
## Response Format — JSON only, no markdown
|
|
68
|
+
{
|
|
69
|
+
"action": "click|fill|navigate|scroll|keyboard|wait|done|error",
|
|
70
|
+
"reasoning": "Brief explanation",
|
|
71
|
+
"text": "Visible button/link text to click",
|
|
72
|
+
"coordinates": { "x": 500, "y": 300 },
|
|
73
|
+
"value": "text to type",
|
|
74
|
+
"url": "https://...",
|
|
75
|
+
"key": "Enter",
|
|
76
|
+
"direction": "down",
|
|
77
|
+
"amount": 300,
|
|
78
|
+
"stepComplete": true,
|
|
79
|
+
"stepNotes": "What was accomplished"
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
## Rules
|
|
83
|
+
1. ONE action per response
|
|
84
|
+
2. Prefer clicking by visible TEXT labels (more stable than coordinates)
|
|
85
|
+
3. Click a field FIRST, then fill it on the NEXT turn
|
|
86
|
+
4. Use "wait" after clicks that trigger page loads or modals
|
|
87
|
+
5. Salesforce Lightning is slow — be patient
|
|
88
|
+
6. If you see a login page, return action: "error" — the user must log in manually
|
|
89
|
+
7. When the objective is fully met, return action: "done" with stepComplete: true
|
|
90
|
+
8. Look at the ENTIRE screenshot — SF has nested panels, modals, iframes
|
|
91
|
+
9. Toast messages (green bar at top) indicate success
|
|
92
|
+
10. The main Setup content is in the center-right area`;
|
|
93
|
+
|
|
94
|
+
// ─── Main Function ───────────────────────────────────────────────────
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Analyze a screenshot and decide the next action to accomplish the objective.
|
|
98
|
+
*
|
|
99
|
+
* @param screenshot Base64-encoded JPEG screenshot of the current page
|
|
100
|
+
* @param objective What the agent is trying to accomplish
|
|
101
|
+
* @param actionHistory Previous actions taken in this step
|
|
102
|
+
* @param pageUrl Current page URL
|
|
103
|
+
* @param pageTitle Current page title
|
|
104
|
+
* @param fieldValues Optional map of field labels to values to enter
|
|
105
|
+
* @param verifyPrompt Optional criteria for step completion
|
|
106
|
+
* @returns The AI's decision for the next action
|
|
107
|
+
*/
|
|
108
|
+
export async function decideNextAction(
|
|
109
|
+
screenshot: string,
|
|
110
|
+
objective: string,
|
|
111
|
+
actionHistory: ActionEntry[],
|
|
112
|
+
pageUrl: string,
|
|
113
|
+
pageTitle: string,
|
|
114
|
+
fieldValues?: Record<string, string>,
|
|
115
|
+
verifyPrompt?: string,
|
|
116
|
+
): Promise<AIDecision> {
|
|
117
|
+
const anthropic = getClient();
|
|
118
|
+
|
|
119
|
+
// Build user message with context
|
|
120
|
+
const historyText =
|
|
121
|
+
actionHistory.length > 0
|
|
122
|
+
? `\n\nActions taken so far:\n${actionHistory.map((a, i) => `${i + 1}. ${a.action} → ${a.target} (${a.result})`).join("\n")}`
|
|
123
|
+
: "";
|
|
124
|
+
|
|
125
|
+
const fieldsText = fieldValues
|
|
126
|
+
? `\n\nField values to enter:\n${Object.entries(fieldValues).map(([k, v]) => `- ${k}: "${v}"`).join("\n")}`
|
|
127
|
+
: "";
|
|
128
|
+
|
|
129
|
+
const verifyText = verifyPrompt
|
|
130
|
+
? `\n\nCompletion criteria: ${verifyPrompt}`
|
|
131
|
+
: "";
|
|
132
|
+
|
|
133
|
+
const response = await anthropic.messages.create({
|
|
134
|
+
model: "claude-sonnet-4-20250514",
|
|
135
|
+
max_tokens: 1024,
|
|
136
|
+
system: SYSTEM_PROMPT,
|
|
137
|
+
messages: [
|
|
138
|
+
{
|
|
139
|
+
role: "user",
|
|
140
|
+
content: [
|
|
141
|
+
{
|
|
142
|
+
type: "image",
|
|
143
|
+
source: {
|
|
144
|
+
type: "base64",
|
|
145
|
+
media_type: "image/jpeg",
|
|
146
|
+
data: screenshot,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: "text",
|
|
151
|
+
text: `URL: ${pageUrl}\nTitle: ${pageTitle}\n\nObjective: ${objective}${fieldsText}${verifyText}${historyText}\n\nWhat is the single next action?`,
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Parse JSON from response
|
|
159
|
+
const text =
|
|
160
|
+
response.content[0].type === "text" ? response.content[0].text : "";
|
|
161
|
+
return JSON.parse(
|
|
162
|
+
text
|
|
163
|
+
.replace(/```json\n?/g, "")
|
|
164
|
+
.replace(/```/g, "")
|
|
165
|
+
.trim(),
|
|
166
|
+
);
|
|
167
|
+
}
|
package/src/browser.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import puppeteer, { type Browser, type Page, type ElementHandle } from "puppeteer";
|
|
9
|
+
import { decideNextAction, hasApiKey, type AIDecision, type ActionEntry } from "./ai.js";
|
|
10
|
+
import { reportResult } from "./reporter.js";
|
|
9
11
|
|
|
10
12
|
// ─── Launch ──────────────────────────────────────────────────────────
|
|
11
13
|
|
|
@@ -144,8 +146,72 @@ export function isLoginPage(currentUrl: string, originalTarget: string): boolean
|
|
|
144
146
|
return LOGIN_PATTERNS.some((p) => currentUrl.includes(p));
|
|
145
147
|
}
|
|
146
148
|
|
|
149
|
+
// ─── AI Action Executor ──────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
async function executeAIAction(
|
|
152
|
+
page: Page,
|
|
153
|
+
decision: AIDecision,
|
|
154
|
+
): Promise<{ success: boolean; error?: string }> {
|
|
155
|
+
try {
|
|
156
|
+
switch (decision.action) {
|
|
157
|
+
case "click":
|
|
158
|
+
if (decision.text) {
|
|
159
|
+
// Click by visible text (preferred — more stable than coordinates)
|
|
160
|
+
const el = await findByText(page, decision.selector || "*", decision.text);
|
|
161
|
+
await el.click();
|
|
162
|
+
} else if (decision.coordinates) {
|
|
163
|
+
await page.mouse.click(decision.coordinates.x, decision.coordinates.y);
|
|
164
|
+
}
|
|
165
|
+
return { success: true };
|
|
166
|
+
|
|
167
|
+
case "fill":
|
|
168
|
+
if (decision.coordinates) {
|
|
169
|
+
await page.mouse.click(decision.coordinates.x, decision.coordinates.y);
|
|
170
|
+
}
|
|
171
|
+
// Select all existing text and replace
|
|
172
|
+
await page.keyboard.down("Control");
|
|
173
|
+
await page.keyboard.press("a");
|
|
174
|
+
await page.keyboard.up("Control");
|
|
175
|
+
await page.keyboard.type(decision.value!);
|
|
176
|
+
return { success: true };
|
|
177
|
+
|
|
178
|
+
case "navigate":
|
|
179
|
+
await page.goto(decision.url!, { waitUntil: "networkidle2", timeout: 30_000 });
|
|
180
|
+
return { success: true };
|
|
181
|
+
|
|
182
|
+
case "scroll":
|
|
183
|
+
await page.evaluate(
|
|
184
|
+
(dir: string, amt: number) => window.scrollBy(0, dir === "down" ? amt : -amt),
|
|
185
|
+
decision.direction || "down",
|
|
186
|
+
decision.amount || 300,
|
|
187
|
+
);
|
|
188
|
+
return { success: true };
|
|
189
|
+
|
|
190
|
+
case "keyboard":
|
|
191
|
+
await page.keyboard.press(decision.key! as Parameters<typeof page.keyboard.press>[0]);
|
|
192
|
+
return { success: true };
|
|
193
|
+
|
|
194
|
+
case "wait":
|
|
195
|
+
await new Promise((r) => setTimeout(r, decision.amount || 2000));
|
|
196
|
+
return { success: true };
|
|
197
|
+
|
|
198
|
+
default:
|
|
199
|
+
return { success: false, error: `Unknown AI action: ${decision.action}` };
|
|
200
|
+
}
|
|
201
|
+
} catch (err) {
|
|
202
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
147
206
|
// ─── Command Executor ────────────────────────────────────────────────
|
|
148
207
|
|
|
208
|
+
/** Context passed from the main process for server communication. */
|
|
209
|
+
export interface AgentContext {
|
|
210
|
+
baseUrl: string;
|
|
211
|
+
sessionId: string;
|
|
212
|
+
token: string;
|
|
213
|
+
}
|
|
214
|
+
|
|
149
215
|
export interface CommandResult {
|
|
150
216
|
success: boolean;
|
|
151
217
|
result?: unknown;
|
|
@@ -158,7 +224,8 @@ export interface CommandResult {
|
|
|
158
224
|
export async function executeCommand(
|
|
159
225
|
page: Page,
|
|
160
226
|
commandType: string,
|
|
161
|
-
payload: Record<string, unknown
|
|
227
|
+
payload: Record<string, unknown>,
|
|
228
|
+
context?: AgentContext,
|
|
162
229
|
): Promise<CommandResult> {
|
|
163
230
|
try {
|
|
164
231
|
switch (commandType) {
|
|
@@ -367,6 +434,102 @@ export async function executeCommand(
|
|
|
367
434
|
return { success: true, shutdown: true };
|
|
368
435
|
}
|
|
369
436
|
|
|
437
|
+
// ── ai_step — AI vision loop ──
|
|
438
|
+
case "ai_step": {
|
|
439
|
+
if (!hasApiKey()) {
|
|
440
|
+
return {
|
|
441
|
+
success: false,
|
|
442
|
+
error: "AI features require ANTHROPIC_API_KEY — install Claude Code or set the key manually",
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const objective = payload.objective as string;
|
|
447
|
+
const startUrl = payload.startUrl as string | undefined;
|
|
448
|
+
const fieldValues = payload.fieldValues as Record<string, string> | undefined;
|
|
449
|
+
const verifyPrompt = payload.verifyPrompt as string | undefined;
|
|
450
|
+
const maxActions = (payload.maxActions as number) ?? 20;
|
|
451
|
+
const commandId = payload.commandId as string | undefined;
|
|
452
|
+
|
|
453
|
+
// Navigate to starting page if provided
|
|
454
|
+
if (startUrl) {
|
|
455
|
+
await page.goto(startUrl, { waitUntil: "networkidle2", timeout: 30_000 });
|
|
456
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
const actionHistory: ActionEntry[] = [];
|
|
460
|
+
|
|
461
|
+
for (let i = 0; i < maxActions; i++) {
|
|
462
|
+
// Screenshot for AI analysis (JPEG for smaller payload)
|
|
463
|
+
const screenshot = await page.screenshot({
|
|
464
|
+
encoding: "base64",
|
|
465
|
+
type: "jpeg",
|
|
466
|
+
quality: 80,
|
|
467
|
+
}) as string;
|
|
468
|
+
const pageUrl = page.url();
|
|
469
|
+
const pageTitle = await page.title();
|
|
470
|
+
|
|
471
|
+
// Report progress to server (visible in Build Log)
|
|
472
|
+
if (context && commandId) {
|
|
473
|
+
await reportResult(
|
|
474
|
+
context.baseUrl,
|
|
475
|
+
context.sessionId,
|
|
476
|
+
context.token,
|
|
477
|
+
commandId,
|
|
478
|
+
"in_progress",
|
|
479
|
+
{ action: i + 1, total: maxActions, screenshot },
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
const decision = await decideNextAction(
|
|
484
|
+
screenshot,
|
|
485
|
+
objective,
|
|
486
|
+
actionHistory,
|
|
487
|
+
pageUrl,
|
|
488
|
+
pageTitle,
|
|
489
|
+
fieldValues,
|
|
490
|
+
verifyPrompt,
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
// Step complete
|
|
494
|
+
if (decision.action === "done" || decision.stepComplete) {
|
|
495
|
+
const finalScreenshot = await page.screenshot({ encoding: "base64" }) as string;
|
|
496
|
+
return {
|
|
497
|
+
success: true,
|
|
498
|
+
screenshot: finalScreenshot,
|
|
499
|
+
result: {
|
|
500
|
+
stepComplete: true,
|
|
501
|
+
actionsExecuted: actionHistory.length,
|
|
502
|
+
notes: decision.stepNotes,
|
|
503
|
+
},
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// Unrecoverable error
|
|
508
|
+
if (decision.action === "error") {
|
|
509
|
+
return { success: false, error: decision.reasoning };
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
// Execute the action
|
|
513
|
+
const result = await executeAIAction(page, decision);
|
|
514
|
+
actionHistory.push({
|
|
515
|
+
action: decision.action,
|
|
516
|
+
target: decision.text || (decision.coordinates ? `(${decision.coordinates.x},${decision.coordinates.y})` : decision.url || decision.key || "page"),
|
|
517
|
+
result: result.success ? "success" : (result.error || "failed"),
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
// Console log for local visibility
|
|
521
|
+
console.log(` [${i + 1}/${maxActions}] ${decision.action}: ${decision.reasoning}`);
|
|
522
|
+
|
|
523
|
+
// Let page settle between actions
|
|
524
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
return {
|
|
528
|
+
success: false,
|
|
529
|
+
error: `Max actions (${maxActions}) reached without completing objective`,
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
|
|
370
533
|
default:
|
|
371
534
|
return { success: false, error: `Unknown command type: ${commandType}` };
|
|
372
535
|
}
|
package/src/index.ts
CHANGED
|
@@ -11,7 +11,8 @@ import { createInterface } from "node:readline/promises";
|
|
|
11
11
|
import { stdin, stdout } from "node:process";
|
|
12
12
|
import { pair } from "./pairing.js";
|
|
13
13
|
import { connectSSE } from "./sse-client.js";
|
|
14
|
-
import { launchBrowser, executeCommand, isLoginPage } from "./browser.js";
|
|
14
|
+
import { launchBrowser, executeCommand, isLoginPage, type AgentContext } from "./browser.js";
|
|
15
|
+
import { hasApiKey } from "./ai.js";
|
|
15
16
|
import { reportResult } from "./reporter.js";
|
|
16
17
|
import { startHeartbeat } from "./heartbeat.js";
|
|
17
18
|
import type { Browser, Page } from "puppeteer";
|
|
@@ -98,6 +99,16 @@ async function main() {
|
|
|
98
99
|
process.exit(1);
|
|
99
100
|
}
|
|
100
101
|
|
|
102
|
+
// ── Check for AI capabilities ──
|
|
103
|
+
if (hasApiKey()) {
|
|
104
|
+
console.log("\u2728 AI vision enabled (ANTHROPIC_API_KEY found)");
|
|
105
|
+
} else {
|
|
106
|
+
console.log("\u26A0\uFE0F AI vision disabled — set ANTHROPIC_API_KEY to enable ai_step commands");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Build context for command executor (used by ai_step for progress reporting)
|
|
110
|
+
const agentContext: AgentContext = { baseUrl, sessionId, token };
|
|
111
|
+
|
|
101
112
|
// ── Step 2: Launch Browser ──
|
|
102
113
|
console.log("\uD83C\uDF10 Launching browser...");
|
|
103
114
|
let browser: Browser;
|
|
@@ -174,7 +185,9 @@ async function main() {
|
|
|
174
185
|
|
|
175
186
|
console.log(`\u26A1 Executing: ${label}${payloadHint}`);
|
|
176
187
|
|
|
177
|
-
|
|
188
|
+
// Pass command ID into payload so ai_step can report progress per-action
|
|
189
|
+
const payloadWithId = { ...command.payload, commandId: command.id };
|
|
190
|
+
const result = await executeCommand(page, command.commandType, payloadWithId, agentContext);
|
|
178
191
|
|
|
179
192
|
// ── Handle login detection ──
|
|
180
193
|
if (result.waitingForLogin) {
|
package/src/reporter.ts
CHANGED
|
@@ -8,7 +8,7 @@ export async function reportResult(
|
|
|
8
8
|
_sessionId: string,
|
|
9
9
|
token: string,
|
|
10
10
|
commandId: string,
|
|
11
|
-
status: "success" | "error" | "waiting_for_login",
|
|
11
|
+
status: "success" | "error" | "waiting_for_login" | "in_progress",
|
|
12
12
|
result?: Record<string, unknown>
|
|
13
13
|
): Promise<void> {
|
|
14
14
|
const url = `${baseUrl}/api/agent/result`;
|